Skip to content

Release v1.3.0 - #40

Merged
Alex375 merged 8 commits into
mainfrom
dev
Jul 24, 2026
Merged

Release v1.3.0#40
Alex375 merged 8 commits into
mainfrom
dev

Conversation

@Alex375

@Alex375 Alex375 commented Jul 24, 2026

Copy link
Copy Markdown
Owner

Release v1.3.0 — embarque tout l'état courant de dev depuis v1.2.0.

Nouveautés / correctifs (user-facing) :

  • Ordre manuel des conversations/repos par glisser-déposer (sidebar + Flight Deck), onglet Réglages « Reordering » pour figer le tri auto.
  • clickableFileMentions resserré au nom de fichier des lignes Read/Write ; chemins en prose/liens/entêtes toujours cliquables.
  • Onglets ouverts (texte/image/PDF) tenus à jour avec le disque.
  • Contenu injecté par le CLI n'apparaît plus comme un message envoyé par l'utilisateur.

Détail : commits de dev depuis v1.2.0.

🤖 Generated with Claude Code

Alex375 and others added 8 commits July 23, 2026 17:45
…mme un message de l'utilisateur

Cause racine : le binaire renomme `isMeta` en `isSynthetic` sur le wire live
(vérifié 2.1.217, probe + lecture du binaire : les trois émetteurs `case"user"`
yieldent `isSynthetic: o.isMeta || o.isVisibleInTranscriptOnly`, le schéma zod
public ne déclare que `isSynthetic`). `UserMsg` ne désérialisait pas ce champ →
le garde `is_meta` de `ingest_user` était du code mort en production, et TOUTE
ligne injectée par le CLI fuyait en bulle utilisateur. Live uniquement : au
reload le jumeau disque `isMeta:true` était bien filtré, d'où le « c'est là en
live, plus là quand je reviens ».

Cœur (indissociables) :
- `protocol.rs` : `UserMsg.is_synthetic`.
- `assembler.rs` : garde sur la branche BULLE, jamais un `return` anticipé — une
  ligne synthétique peut porter des `tool_result` qu'un drop global avalerait.
- `assembler.rs` : flag skill armé aussi depuis `content_block_start` (4 cas
  disque où la ligne assistant arrive APRÈS le corps injecté).
- `history.rs` : le reload honore le sur-ensemble `isVisibleInTranscriptOnly` /
  `isCompactSummary` (le résumé de /compact, 14-20 Ko, n'a pas d'`isMeta`).

Formes sans aucun drapeau, classées par texte dans un corps partagé par les deux
surfaces (`classify_injected_text`, pattern `is_goal_command_noise`) et rendues
en `Notice` — jamais droppées en silence : `[Request interrupted by user]` (136
occ.), le `<local-command-stdout>` des autres commandes (33 occ.), la bannière
`<ide_opened_file>` (strippée du prompt qu'elle précède).

Aussi :
- parité du chip de commande (une commande tapée s'affichait en texte brut en
  live, en chip au reload) ;
- rewind : `check_rewind_target` valide la cible AVANT de tuer la session ;
- parité des images (un tour image-only distant était invisible en live) ;
- sous-agent : le prompt d'ouverture est attribué à Claude, pas à l'utilisateur ;
- Historique : `first_user_text` applique enfin les mêmes filtres que le fil
  (134 excerpts en XML brut, dont certains servaient de titre) ;
- Codex : `local_images` lu, tours distants surfacés via `clientId`, threads
  internes d'auto-titre marqués et exclus, `thread_rolled_back` honoré.

Garde-fou structurel : table de parité live↔disque (`mod parity_tests`). Les deux
chemins sont du code séparé keyé sur des champs DIFFÉRENTS, donc chaque moitié
pouvait régresser au vert seule — c'est précisément ce qui s'est produit. Vérifié
par mutation : retirer le garde fait tomber 3 tests.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… soit son type

Un PDF ou une image ouvert(e) dans le panneau pouvait rester sur une version
périmée après une écriture de l'agent — silencieusement, comme si c'était la
version courante. Quatre trous distincts :

- resyncOpenBuffers sautait volontairement les onglets image/PDF (coût d'une
  relecture complète des octets à chaque switch de conversation) : un fichier
  réécrit pendant qu'on était sur une AUTRE conversation restait périmé ;
- le watcher filtre build/, dist/, target/, .next/, .cache/ : un PDF généré
  dans build/ n'émet aucun événement, même sur la conversation active ;
- le watch fs n'existe que si le panneau éditeur est monté, et il est unique
  pour toute l'app (un fichier hors du cwd surveillé, ou un watcher mort,
  n'a plus aucune voie de rafraîchissement) ;
- PdfViewer repassait par « Loading PDF… » et perdait la position de scroll à
  chaque nouvelle version.

L'empreinte disque (taille + mtime) est désormais posée sur chaque buffer, et
resyncOpenBuffers couvre TOUS les types : un stat batché décide qui relire, si
bien qu'un PDF de 15 Mio non modifié coûte un syscall au lieu d'un aller-retour
base64. Le même passage tourne aussi sur un tick périodique — la seule voie
possible pour les écritures qu'aucun événement ne rapporte. Le PdfViewer échange
ses pages en place (docRev force le repaint quand le nombre de pages ne bouge
pas), et l'aperçu d'artefact se recharge quand sa page est republiée.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…bar + Flight Deck)

Ajoute un onglet Réglages « Reordering » avec 4 toggles (conversations/repos ×
sidebar/Flight Deck) pour désactiver le tri automatique par récence/statut, plus
un toggle « ordre partagé » entre les deux vues. En mode manuel, l'ordre est figé
(rien ne remonte, même une conv en attention) ; les nouveaux éléments arrivent en
tête (tri par createdAt/addedAt immuables). Drag-and-drop via @dnd-kit : toute la
carte/ligne est saisissable (pas de poignée), clic vs glissé distingué au seuil de
6px, clic post-drag avalé. Persistance localStorage (tosse:manualorder, slots
shared/sidebar/flightdeck) — aucun changement Rust ni de bindings. Drag en mode
récence = éphémère (re-trié au prochain event).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…u step-row des tools

Le toggle ne gate plus QUE le nom de fichier de la ligne de step d'un tool
(Read/Write/Edit) — celui dont le clic dispute avec le dépliage de la carte — via
`stepRowInert`. Les chemins en prose, les liens Markdown fichier et le nom en tête
d'un encadré diff/snippet restent cliquables partout, pref OFF comprise. Corrige la
régression où le flag `inert` du FileMentionProvider éteignait TOUS les chemins
cliquables de l'app (conversation ET Flight Deck).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ment

The Flight Deck drag ghost rendered <Ico name="grip">, but no `grip` path
existed in WF_PATHS, so it silently fell back to the `dots` glyph. Add a
proper six-dot drag-handle path. Also fix RepoLane's doc-comment, which
still said "drag the grip" though the whole header is the drag surface.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@Alex375
Alex375 merged commit e2fd36e into main Jul 24, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant