Commit Graph
565 Commits
Author SHA1 Message Date
nathaninline 02d4830a17 UI: aide clavier 'Entree pour envoyer' de retour sur desktop, cachee seulement <720px (menu replie) 2026-07-21 21:34:31 +02:00
nathaninline f9165fb204 UI: bouton send/stop ne flotte plus au refresh (etat applique une fois au caught_up) 2026-07-21 21:29:18 +02:00
nathaninline 7192931ddc UI: fin du clignotement au refresh (chat masque pendant le replay, revele en bas au caught_up) 2026-07-21 21:25:30 +02:00
nathaninline a898f32e1a historique partage entre jean web (local) et jean link (tunnel)
Le process jean-link sert desormais AUSSI l'UI locale sur :8090 avec le MEME mux
que le tunnel -> une seule conversation en memoire, partagee entre jean.n27.fr et
app.ajean.link. Fini les deux process avec des historiques divergents qui
s'ecrasaient sur le meme fichier. Le 'jean web' autonome n'est plus necessaire.
2026-07-21 21:17:21 +02:00
nathaninline bddb5a1888 UI: fusion 'Mise a jour' dans 'Actions' + suppression du hint 'Entree pour envoyer' (gain de place, surtout mobile) 2026-07-21 21:12:35 +02:00
nathaninline 2f56d99d04 perf + robustesse: replay coalesce + envoi resilient
- Subscribe rejoue le journal COALESCE (deltas texte consecutifs fusionnes en un
  evenement, avec toks + bornes ts) : chargement rapide meme sur longue conv, fini
  le rendu markdown quadratique token par token
- send() resilient : retry, 409/generating traite comme succes -> plus de 'network
  error' alarmiste alors que l'IA repond quand meme ; reconnexion du flux plus rapide
2026-07-21 20:40:08 +02:00
nathaninline e28bc45557 UI: pas d'animation de repli au refresh + reorg reglages
- serveur emet {caught_up} quand le replay est draine ; le client cree alors les
  bulles raisonnement/outil DEJA repliees (collapseInstant, sans animation) tant
  qu'on rejoue le journal -> au refresh elles apparaissent fermees direct
- 'Mise a jour' passe au-dessus de 'Actions'
- le toggle compactage rejoint la section Parametres (sous le mode agent)
2026-07-21 20:28:10 +02:00
nathaninline 54e14c7935 vitesse des bulles calculee depuis les horodatages serveur (ts par evenement)
Le calcul cote client (performance.now) donnait une vitesse presente ou non selon
que le tour etait live ou rejoue. On horodate chaque LogEvent cote serveur (TS) et
le client derive tok/s de firstTs->lastTs : correct en direct ET au replay. Hack
replayTarget supprime.
2026-07-21 17:38:28 +02:00
nathaninline 3748d3a25f UI: restaure le comptage tokens + vitesse en direct sur les bulles (raisonnement et reponse)
La refonte serveur avait supprime le compteur live par bulle. On le recalcule
cote client au fil des deltas ; en replay (refresh) on n'affiche que le nombre de
tokens (pas de vitesse absurde car tout arrive d'un bloc), via replayTarget.
2026-07-21 17:29:02 +02:00
nathaninline 4514a96585 conversation persistee cote serveur + generation autonome (multi-appareils)
L'historique et la generation vivent desormais sur le serveur jean, plus dans le
localStorage du navigateur :
- conversation.go : store unique (Messages vue modele + Log d'evenements rejouable),
  persistance disque JeanHome/conversation.json, generation dans une goroutine
  detachee (context.Background) -> fermer le navigateur ne coupe plus la reponse
- runChatStream devient un pur abonne (rejoue Log[from:] puis suit le direct) ;
  nouveaux endpoints /api/chat/send|stop|reset|state
- UI : flux d'abonnement permanent + replay du journal (outils/vitesses/raisonnement
  reviennent apres refresh), synchro live inter-appareils, reconnexion auto
- compactage manuel neutralise (auto cote serveur), vitesses rendues depuis les
  stats persistees
2026-07-21 17:20:27 +02:00
nathaninline 2daea32ade compaction: decider sur le VRAI decompte de tokens (ctx_used du client) au lieu de l'estimation
L'heuristique ~4 char/token sous-estimait le contexte (elle ne voit ni le prompt
systeme injecte ni le gabarit de chat), donc le seuil 75% n'etait jamais franchi.
Le client envoie desormais ctx_used (prompt_tokens_total deja affiche) ; repli sur
l'estimation quand inconnu (terminal).
2026-07-21 16:18:50 +02:00
nathaninline e6c0bbe3b7 compaction du contexte facon Hermes : conversations quasi illimitees sans clear
- nouveau compact.go : split head/torso/tail, elagage des vieux tool outputs
  sans IA + resume du torse par le modele local (un appel non-streame)
- proactif au seuil (75% de CTX) dans runChatStream + chat terminal, et filet
  reactif dans runChat si llama-server refuse un prompt trop long
- resume injecte en tour user->assistant (jamais un system au milieu : garde Qwen)
- toggle COMPACT (defaut on) : endpoint /api/agent/compact + case UI, event
  history_replace pour que le client remplace son historique, toast
- tests unitaires des frontieres head/tail et de la non-separation des paires outil
2026-07-21 15:49:18 +02:00
Claude e7797b1b09 Plan réservé aux nouvelles constructions, pas aux corrections
Un plan « from scratch » (architecture, création des fichiers…) était
régénéré à CHAQUE tâche de code, y compris pour corriger un bug sur une
appli existante — hors-sujet et perturbant (« je n'arrive pas à déplacer
les pièces » → plan de re-création complète).

- want_plan ne se déclenche plus que pour une NOUVELLE construction :
  pas de code antérieur dans la session ET workspace vide. Une
  modification / correction / suite de travail n'affiche plus de plan.
- Plan de code : l'étape ARCHITECTURE privilégie un seul fichier
  autonome (cohérent avec les contraintes appli web), au lieu de
  proposer index.html + style.css + app.js.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
2026-07-21 10:00:22 +00:00
Claude 920f575507 Applis web fiables : fichier autonome, zéro dépendance externe, pas de bluff
Les modèles promettaient des libs qui ne se chargent jamais hors-ligne
(Stockfish, CDN…), éclataient le code en fichiers incohérents, puis
déclaraient « ça marche » sans rien vérifier.

- Contraintes « appli web » injectées pour toute tâche web (agent +
  moteur code) : UN seul index.html autonome (CSS/JS inline), AUCUNE
  ressource externe (implémenter en JS natif à la place), rendu réel au
  chargement, interdiction de « simuler » une lib en la disant réelle.
- check_html signale désormais les scripts/styles externes (CDN/WASM)
  qui ne se chargeront pas dans le sandbox hors-ligne, en plus des
  références locales cassées.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
2026-07-21 08:57:09 +00:00
nathaninline c50ebdb6d1 v0.3.4 : gestion des mises à jour depuis l'interface web (section « Mise à jour » : vérifier + installer, endpoints /api/update et /api/update/apply) 2026-07-20 17:38:24 +02:00
nathaninline cd58382d73 v0.3.3 : mode application Windows (double-clic → UI + icône de notification + splash, icône sur l'exe), catalogue de modèles servi par ajean.link (/api/catalog + détection RAM), correctif des fenêtres de console qui clignotaient sous Windows, version affichée dans l'UI 2026-07-20 17:20:50 +02:00
Claude 41f07b0ba8 Validation shell : la carte reste jusqu'à décision de l'utilisateur
L'agent termine son tour pour attendre la validation, donc le streaming
s'arrête aussitôt — or la carte de confirmation n'était affichée que
pendant le streaming, elle disparaissait avant qu'on puisse cliquer.

- La carte de validation shell s'affiche tant que `pendingShell` existe,
  indépendamment de l'état de streaming (approbation/refus déjà gérés
  hors flux).
- Changer de session efface une validation en attente (elle appartenait
  à la session quittée).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
2026-07-20 13:30:38 +00:00
Claude 43d3c79eda Intègre Ponytail : méthode « code minimal » pour les tâches de code
Adapte github.com/DietrichGebert/ponytail (philosophie anti
sur-ingénierie) en méthode transverse de Loki, remède direct aux rendus
trop ambitieux qui cassent (ex. « moteur IA » dans un jeu d'échecs).

- Échelle de décision injectée pour toute tâche de code (YAGNI ->
  réutiliser -> natif -> minimum de code), sur les DEUX chemins : dans
  le contexte de l'agent ET dans la consigne du moteur code (Aider ne
  voit pas convo).
- Nouvel interrupteur « Ponytail (code minimal) » dans Réglages >
  Intelligence, activé par défaut (fusionne sans migration).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
2026-07-20 13:10:20 +00:00
Claude 2563e4c679 Plan d'architecture pour le code + garde-fou shell tolérant aux URLs
- make_plan(code=True) : pour une tâche d'application, produit un plan
  d'IMPLÉMENTATION concret (étape 1 = architecture/fichiers, puis une
  fonctionnalité testable à la fois), réaliste et sans dépendance
  externe — au lieu d'une liste d'objectifs produit (« moteur IA »…)
  que les petits modèles n'arrivent pas à livrer.
- run_shell : le garde-fou de confinement ne bloque plus les URLs
  (http://localhost:8080 était rejeté à cause du « // »), et autorise
  la base du workspace même quand la session cible un projet (ls
  /workspace). Les évasions réelles (/etc, /config, ~, ../..) restent
  bloquées.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
2026-07-20 12:57:54 +00:00
Claude 54921053c4 Plan : validation des étapes en direct (point par point)
Le plan s'affichait mais restait figé — on ne voyait pas le modèle
avancer. Désormais :

- Le modèle annonce chaque étape accomplie (« ✅ Étape N terminée »),
  demandé dans la consigne de plan.
- L'agent détecte ces annonces dans le flux et émet des événements
  plan_step, sans jamais recompter deux fois la même étape.
- Le panneau PLAN coche les étapes en temps réel : ✓ vert + barré pour
  les faites, sablier sur l'étape en cours, compteur « n/N validées ».

Chemin agent uniquement (le moteur code tourne de bout en bout). Les
messages passés restent affichés tels quels.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
2026-07-20 12:45:32 +00:00
Claude de4ec1d919 Isole la mémoire par discussion : RAG inter-sessions désactivé par défaut
La mémoire long-terme rappelait des échanges d'AUTRES sessions dans la
discussion en cours : demander « un jeu d'échecs » ressortait une « appli
sport » demandée ailleurs, et déroutait les petits modèles.

- rag_enabled désactivé par défaut : chaque discussion ne se souvient que
  d'elle-même (résumé + messages récents, déjà en place).
- Migration v7 : désactive le RAG une fois sur les installs existantes
  (la valeur persiste en base /data) ; réactivable dans Réglages.
- Rappel plus strict quand le RAG est activé : seuil de similarité 0.45 -> 0.6.
- Réglages : libellé clarifié (« Mémoire entre sessions »).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
2026-07-20 11:47:58 +00:00
Claude c36db0b862 Édition fiable, suppression de workspace et confinement strict
- edit_file : correspondance tolérante (indentation/espaces ignorés,
  repli ligne à ligne + réindentation) pour que les petits modèles
  éditent sans devoir tout réécrire ; message d'erreur plus utile.
- Prompt système : privilégier edit_file pour modifier, write_file
  seulement pour créer ; rappel de rester dans le workspace.
- Suppression de fichiers/dossiers du workspace : route DELETE
  /api/files + boutons × dans l'arborescence (fichiers et dossiers).
- Confinement renforcé : garde-fou run_shell (refus des chemins absolus
  hors workspace, ~ et remontées ../) et code_task/Aider (fnames
  résolus et confinés au workspace).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
2026-07-19 14:37:44 +00:00
MichaelandClaude Opus 4.8 b0018e8313 feat(ui): sélecteur de modèle dans le composer, retiré du TopBar
Le chip modèle du composer était décoratif (pastille orange fixe) alors
que le TopBar montrait le vrai état de chargement. Le sélecteur complet
(liste + pastille GPU/CPU/à charger/préchargement) vit maintenant dans
la carte du chat, menu vers le haut.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 11:31:59 +02:00
MichaelandClaude Opus 4.8 bb8e87b612 fix(agent): coupe-circuit de réflexion en cours de flux
La relance après « pensée seule » n'agissait qu'à la fin de la
génération : un modèle thinking pouvait ruminer des minutes (jusqu'à
épuiser num_predict) avant qu'elle n'intervienne — vécu comme « aucune
réponse » en mode plan.

Pensée > 12 000 caractères sans aucun contenu ni appel d'outil : la
génération est interrompue immédiatement et la relance repart.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 11:28:51 +02:00
MichaelandClaude Opus 4.8 9f56989cc2 fix(mcp): noms d'outils à tirets (Context7) + read_file sur dossier
Les noms MCP à tirets (resolve-library-id) cassaient le tool-calling :
modèles et grammaires mélangent tirets et underscores -> « Tool not
found ». Les noms exposés sont assainis en underscores avec table de
correspondance vers le vrai nom, et l'appel tolère les deux formes.

read_file sur un dossier disait « fichier introuvable » : message
explicite « c'est un dossier — utilise list_dir ».

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 11:26:27 +02:00
MichaelandClaude Opus 4.8 7d1fa8913d fix(web): servir le favicon en production
Le fallback SPA renvoyait index.html pour /favicon.svg : l'icône
n'apparaissait jamais. Les fichiers statiques racine existants sont
maintenant servis tels quels, le reste retombe sur index.html.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 11:01:43 +02:00
MichaelandClaude Opus 4.8 a85341da32 docs: projets par session
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 11:00:46 +02:00
MichaelandClaude Opus 4.8 abb7d2ea1f feat(ui): chip projet dans le composer + aperçu réductible
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:58:58 +02:00
MichaelandClaude Opus 4.8 5e7461096b feat(projets): client API + store re-racinés par projet
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:57:34 +02:00
MichaelandClaude Opus 4.8 0291831479 feat(projets): chat, aides de contexte et Aider suivent le projet de la session
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:48:43 +02:00
MichaelandClaude Opus 4.8 b781b92631 feat(projets): routes /api/projects + files et git re-racinés
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:47:04 +02:00
MichaelandClaude Opus 4.8 8d0b57ad0d feat(projets): racine active par contextvar + projet par session
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:32:37 +02:00
MichaelandClaude Opus 4.8 25a88dd879 docs: plan d'implémentation projets + aperçu réductible
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:18:13 +02:00
MichaelandClaude Opus 4.8 ba10a4396e docs: spec projets (répertoires de travail par session) + aperçu réductible
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:06:04 +02:00
MichaelandClaude Opus 4.8 a1380d0bf8 fix(chat): heartbeat SSE pendant la préparation + think=False sur les appels auxiliaires
Le déplacement de la préparation (plan, recall RAG) dans le flux SSE
laissait un silence total pendant le chargement d'un gros modèle : le
reverse proxy coupait la connexion (« Connexion interrompue pendant le
chargement du modèle »). Avec la réflexion active, l'appel de plan
laissait en plus le modèle penser — silence encore plus long.

- ping SSE toutes les 10 s pendant la préparation du contexte
- plan / auto-critique / résumé : think=False (repli automatique si le
  modèle refuse le paramètre) — un appel utilitaire ne réfléchit jamais

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 01:01:49 +02:00
MichaelandClaude Opus 4.8 da76b8192d fix(agent): mode réflexion — relance sur pensée pure + pensée hors historique
Avec la réflexion activée sur les longues tâches, le modèle brûlait tout
son budget de génération à penser : done sans contenu ni appel d'outil,
la boucle s'arrêtait et la tâche restait inachevée.

- itération « réflexion seule » : relance avec consigne d'agir ; si ça
  recommence, think est coupé pour la fin du tour (+ notice)
- marge num_predict >= 6144 quand la réflexion est active
- la pensée reste affichée dans l'UI mais n'est plus renvoyée au modèle
  (elle regonflait le contexte à chaque itération)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 00:48:23 +02:00
MichaelandClaude Opus 4.8 f87ac32f88 perf(tools): filtrage signal/bruit des sorties d'outils (façon rtk)
Les résultats d'outils dévoraient le contexte du modèle : sortie shell
tronquée aveuglément à 4000 c. (bruit gardé, erreur parfois coupée),
gros fichiers lus en entier.

- run_shell : succès = 12 dernières lignes ; échec = lignes d'erreur
  + fin de sortie, répétitions dédupliquées (« ligne ×N »)
- read_file : fenêtres de 200 lignes avec marche à suivre
  (start_line=N pour la suite, grep_search pour cibler)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 00:46:33 +02:00
MichaelandClaude Opus 4.8 bddab1c619 feat(agent): mémoire de travail code — récap session + état workspace
« Corrige les bugs » partait à Aider sans contexte (quel fichier ? quel
projet ?) et le chemin agent ignorait quels fichiers existaient — le
modèle collait alors le code en chat au lieu de modifier le fichier.

- moteur code : récap de session (demande initiale + dernières demandes
  + fichiers touchés) préfixé à l'instruction ; fichiers de la session
  passés à Aider quand aucun n'est cité
- chemin agent : liste des fichiers du workspace + fichiers de la tâche
  injectée chaque tour en système
- directive renforcée : « ne colle JAMAIS le code corrigé dans ta
  réponse sans l'avoir écrit dans le fichier »

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 00:43:39 +02:00
MichaelandClaude Opus 4.8 584d28a9d0 fix(router): reprise de code — routage contextuel + directive d'action
Sur une reprise (« ajoute un bouton », « continue »), le routeur ne voyait
que le message courant : score trop bas, jamais le moteur code, et le
modèle décrivait les changements sans les appliquer.

- routage contextuel : si le tour précédent était du code (engine ou
  outils write_file/edit_file/code_task), les suites courtes partent au
  moteur code (is_code_followup)
- chemin agent sur session code : directive système « AGIS avec les
  outils, ne décris jamais sans appliquer »
- fichiers cités dans le message et présents au workspace transmis à
  Aider (travail direct, sans deviner via la repo map)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 00:42:06 +02:00
MichaelandClaude Opus 4.8 99747d96e0 fix(mcp): timeout connexion 90s (premier npx) + message d'erreur explicite
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 22:58:41 +02:00
MichaelandClaude Opus 4.8 a34f997950 fix(agent): tâches longues — élagage contexte + ctx 16k + garde SEARXNG_URL
Sur un long tour, les gros résultats d'outils (MCP 8 Ko, shell 4 Ko)
saturaient num_ctx et Ollama tronquait silencieusement le DÉBUT de la
conversation : le modèle perdait la consigne et « oubliait » sa tâche.

- élagage : les résultats d'outils des itérations passées sont compactés
  (350 c. + marqueur), le dernier lot reste intact
- num_ctx 16384 par défaut (migration v6 : les profils restés sur les
  anciens défauts 4096/8192 sont montés, les valeurs perso respectées)
- serveur MCP avec paramètre requis manquant (SEARXNG_URL) : refus clair
  au démarrage au lieu d'un échec cryptique à chaque appel

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 22:08:59 +02:00
MichaelandClaude Opus 4.8 71f8ba0d03 feat: toggle skills UI + Node.js dans l'image + docs MCP/skills
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 17:15:02 +02:00
MichaelandClaude Opus 4.8 d19624b46b refactor(agent): vérification JS via _verify_written (déjà auto après écriture)
L'auto-check séparé dans la boucle agent doublonnait _verify_written et
signalait à tort les fichiers écrits par morceaux (mode append).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 17:04:47 +02:00
MichaelandClaude Opus 4.8 c92e4d4a13 feat(agent): run_check statique + vérification auto après écriture
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 17:03:58 +02:00
MichaelandClaude Opus 4.8 31dce6036b feat(skills): 5 méthodes expertes auto-injectées (routeur lexical)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 17:02:40 +02:00
MichaelandClaude Opus 4.8 afe0a837d4 feat(mcp): onglet Configuration — catalogue, toggles, test de connexion
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 17:00:55 +02:00
MichaelandClaude Opus 4.8 91e0a9f0b2 feat(mcp): outils MCP dans la boucle agent (dispatch async + notices)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 17:00:02 +02:00
MichaelandClaude Opus 4.8 e09af9c9bb feat(mcp): routes GET/PUT/test du catalogue de serveurs
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 16:59:30 +02:00
MichaelandClaude Opus 4.8 6ae0d5cbd1 feat(mcp): gestionnaire de sessions lazy + conversion schémas + appels
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 16:58:34 +02:00
MichaelandClaude Opus 4.8 76677637a1 feat(mcp): catalogue préconfiguré + état persisté + infra pytest
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 16:44:59 +02:00