Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
0d885e7
feat(sidebar): fiabilise et hiérarchise les titres de la sidebar
Alex375 Jul 2, 2026
f2401c5
fix(markdown): corrige la répartition des largeurs de colonnes de tab…
Alex375 Jul 2, 2026
11c3b91
Merge branch 'feat/md-table-column-widths' into dev
Alex375 Jul 2, 2026
5a53b3b
feat(conversation): chip dédié pour les invocations de skill par le m…
Alex375 Jul 2, 2026
2ba63a1
Merge branch 'feat/skill-invocation-render' into dev
Alex375 Jul 2, 2026
0411259
feat(plan): rendu dédié du mode plan (ExitPlanMode) + décision + anno…
Alex375 Jul 2, 2026
0951b67
Merge branch 'feat/plan-mode-view' into dev
Alex375 Jul 2, 2026
73c8820
chore(release): v0.23.0
Alex375 Jul 2, 2026
49e165b
Merge branch 'main' into dev
Alex375 Jul 2, 2026
f998eda
fix(plan): traite les findings de review de la PR #29
Alex375 Jul 2, 2026
95db856
Merge branch 'fix/plan-review-findings' into dev
Alex375 Jul 2, 2026
5a4ac43
fix(conversation): drop le body de skill fantôme en live (isMeta abse…
Alex375 Jul 2, 2026
4449140
feat(shortcuts): nouveaux raccourcis, page Réglages récap, fix Échap/…
Alex375 Jul 2, 2026
bf5465e
Merge branch 'feat/keyboard-shortcuts' into dev
Alex375 Jul 2, 2026
0c43c85
feat(lifecycle): garde-fous suppression conv en cours + refonte page …
Alex375 Jul 2, 2026
9b257a1
Merge branch 'feat/lifecycle-guardrails' into dev
Alex375 Jul 2, 2026
f41d601
feat(flightdeck): cartes cliquables + pop-ups (conversation, dernier …
Alex375 Jul 2, 2026
847a6b5
Merge branch 'feat/flightdeck-card-popups' into dev
Alex375 Jul 2, 2026
1a60c45
feat(composer): branche le bouton « + » — joindre fichiers/images à u…
Alex375 Jul 2, 2026
75225ec
Merge branch 'feat/composer-attach-button' into dev
Alex375 Jul 2, 2026
73c6669
feat(fleet+settings): fleet readout, alerte terminé+tâche de fond, ma…
Alex375 Jul 3, 2026
3285e27
chore(release): v0.24.0
Alex375 Jul 3, 2026
7bf89e6
Merge branch 'main' into dev (reconcile squash-merged v0.23.0 release)
Alex375 Jul 3, 2026
2e4f1fb
docs(release): interdit squash/rebase merge + étape re-sync main→dev
Alex375 Jul 3, 2026
453bd5d
fix(review): corrige les 5 findings de la review de la PR #30
Alex375 Jul 3, 2026
119bde2
Merge branch 'main' into dev (post-release v0.24.0 resync)
Alex375 Jul 3, 2026
bd6d483
chore(skills): /land purge l'identité Library isolée du /build-app
Alex375 Jul 3, 2026
ab0eecd
feat(conversation): pin flottant "dernier message envoyé" en haut du fil
Alex375 Jul 3, 2026
7cd1d46
fix(conversation): préserve les retours à la ligne des messages user
Alex375 Jul 3, 2026
29e1d67
Merge branch 'feat/last-message-pin' into dev
Alex375 Jul 3, 2026
9f10114
feat(brand): renomme l'app en « Flight Deck » + nouveau logo
Alex375 Jul 3, 2026
7363401
Merge branch 'feat/rename-flight-deck' into dev
Alex375 Jul 3, 2026
ea26946
fix(usage): un token de fichier périmé ne masque plus le Keychain
Alex375 Jul 3, 2026
66534b2
feat(conversation): contrôles au survol des messages — rewind + fork
Alex375 Jul 3, 2026
25faf7a
Merge branch 'feat/message-controls-rewind' into dev
Alex375 Jul 3, 2026
3cf726f
fix(conversation): l'aperçu du dernier message ignore les <task-notif…
Alex375 Jul 4, 2026
2084c39
chore(brand): renomme les builds de dev/test en « Flight Deck » (iden…
Alex375 Jul 4, 2026
d2e2431
chore(release): v0.25.0
Alex375 Jul 4, 2026
bc85ced
Merge remote-tracking branch 'origin/main' into dev
Alex375 Jul 4, 2026
4b0ffed
feat(brand): auto-renomme le bundle « Tosse Code.app » → « Flight Dec…
Alex375 Jul 4, 2026
56b325a
fix(notif): recrée un AudioContext frais à chaque son (fiabilité WKWe…
Alex375 Jul 6, 2026
0d6106f
chore(release): v0.26.0
Alex375 Jul 6, 2026
c435808
fix(review): relaunch avec open -n + éviction son plus sûre
Alex375 Jul 6, 2026
e1c4a78
Merge remote-tracking branch 'origin/main' into dev
Alex375 Jul 7, 2026
912e1f4
fix(status): tour fini + tâche de fond en cours → état vert (backgrou…
clousty8 Jul 7, 2026
4f2ac46
Merge branch 'feat/backgrounding-green' into dev
clousty8 Jul 7, 2026
4f1770b
docs(claude): sync le changement d'état backgrounding (vert) dans le …
clousty8 Jul 7, 2026
f9eaeb3
feat(extensions): recharger plugins + slash-commands des convs vivant…
Alex375 Jul 7, 2026
b72c9c2
feat(conversation): affiche la durée des tours (footer + compteur live)
Alex375 Jul 7, 2026
c330d49
Merge branch 'feat/turn-timing' into dev
Alex375 Jul 7, 2026
5fd0d80
feat(flightdeck): cartes interactives (task list, contexte, effort, p…
Alex375 Jul 7, 2026
664440e
docs(claude): sync le contexte repo (cartes Flight Deck interactives …
Alex375 Jul 7, 2026
1b37475
feat(conversation): temps détaillés (modèle, réflexion, outils) + rég…
Alex375 Jul 7, 2026
96161eb
Merge branch 'feat/turn-timing-fix' into dev
Alex375 Jul 7, 2026
7107007
chore(release): v0.27.0
Alex375 Jul 7, 2026
fc40a4f
fix(conversation): ne plus afficher les prompts de sous-agents comme …
Alex375 Jul 7, 2026
7cd6481
docs(changelog): note le fix des prompts de sous-agents pour v0.27.0
Alex375 Jul 7, 2026
6d7870c
docs(claude): sync le contexte repo (fuite prompts sous-agents en bul…
Alex375 Jul 7, 2026
4714393
fix(conversation): pas de durée d'outil bidon « 0ms » sur conversatio…
Alex375 Jul 7, 2026
eca3693
Merge remote-tracking branch 'origin/main' into dev
Alex375 Jul 7, 2026
92e718f
feat(status): réglage « alerter pour les commandes Bash de fond »
Alex375 Jul 8, 2026
d2bc6c7
feat(conversation): aperçu image dans les tool_result (Read d'une cap…
Alex375 Jul 8, 2026
d70de42
feat(flightdeck): liens web + markdown cliquables dans l'aperçu (+ fi…
Alex375 Jul 8, 2026
44c8dd8
feat(editor): visualiseur PDF (pdf.js lazy, zoom, ajuste a la largeur…
Alex375 Jul 8, 2026
a52917f
feat(settings): reglage « chemins de fichiers cliquables » (defaut ON)
Alex375 Jul 8, 2026
d8e169b
refactor(settings): déplace le réglage « tâches de fond » dans l'ongl…
Alex375 Jul 8, 2026
4b8d808
chore(release): v0.28.0
Alex375 Jul 8, 2026
07aa366
fix(review): traite les 2 findings de la review de la PR #34
Alex375 Jul 8, 2026
519a64c
Merge remote-tracking branch 'origin/main' into dev
Alex375 Jul 8, 2026
d2e486b
wip(codex): socle backend Codex (4.0→4.4) + phase 4.3 (flotte/statut/…
Alex375 Jul 8, 2026
34a425b
wip(codex): historique à froid (rollout parser) + reprise de thread (…
Alex375 Jul 9, 2026
6648335
wip(codex): Extensions v2 actionnable + connexion comptes Claude & Co…
Alex375 Jul 9, 2026
fb9e589
fix(codex): le reload MCP du toggle vise le serveur PARTAGÉ (sessions…
Alex375 Jul 9, 2026
d7dddda
feat(comptes): avertissement backend déconnecté + fix des 2 HIGH de l…
Alex375 Jul 9, 2026
3189b02
fix(review): applique les 26 correctifs restants de la revue adversar…
Alex375 Jul 9, 2026
02a2546
feat(comptes): redesign graphique de la page Comptes + badges déconne…
Alex375 Jul 9, 2026
df5a1d9
fix(codex): retire « on-failure » de CodexApproval (supprimé en 0.144.1)
Alex375 Jul 10, 2026
98abc57
feat(codex): affiche la durée de tour Codex au footer (parité Claude)
Alex375 Jul 10, 2026
977ef00
feat(codex): effort ultra/max gpt-5.6 + notice réglages + rewind/fork…
Alex375 Jul 10, 2026
af941ab
chore(models): prolonge la fenêtre de preview Fable 5 au 12 juil.
Alex375 Jul 10, 2026
c8c1e2f
Merge branch 'feat/codex-backend-socle' into dev
Alex375 Jul 10, 2026
1117900
feat(codex): conversations Codex dans le panneau Historique (liste + …
Alex375 Jul 12, 2026
315697f
feat(codex): rends les items non affichés + carte sous-agents lisible
Alex375 Jul 12, 2026
05cc162
Merge branch 'feat/codex-unmapped-items' into dev
Alex375 Jul 12, 2026
3228030
feat(codex): surface sessionBudgetExceeded + raison d'échec de démarr…
Alex375 Jul 12, 2026
66e0746
feat(codex): mode « Rapide » (service tier) — chip vitesse par tour
Alex375 Jul 12, 2026
25250ea
feat(codex): tâches de fond Codex (Phase 4.5) — sous-agents dans la f…
Alex375 Jul 13, 2026
65ce265
Merge branch 'feat/codex-background-tasks' into dev
Alex375 Jul 13, 2026
32e9c69
feat(cli): détection proactive de l'absence du binaire CLI (Claude & …
Alex375 Jul 13, 2026
87fb5c7
feat(flightdeck): suppression carte + contrôles stream modale + rampe…
Alex375 Jul 13, 2026
2adaf6b
Merge branch 'feat/flightdeck-conv-controls' into dev
Alex375 Jul 13, 2026
ae06922
docs: réécriture complète du README (GitHub-style, anglais)
Alex375 Jul 13, 2026
ab7afd5
docs(readme): ajoute la section Install (depuis la release GitHub)
Alex375 Jul 13, 2026
78c7250
i18n: traduire toute l'app en anglais (FR → EN)
Alex375 Jul 13, 2026
d887cc7
Merge branch 'feat/app-english-i18n' into dev
Alex375 Jul 13, 2026
a042826
chore(release): v1.0.0
Alex375 Jul 13, 2026
37a2e9a
fix(review): traite les findings de la revue de la PR #35
Alex375 Jul 13, 2026
7c919f2
docs(changelog): affine la note de release v1.0.0
Alex375 Jul 13, 2026
80ef61f
Merge remote-tracking branch 'origin/main' into dev
Alex375 Jul 13, 2026
f8d1755
fix(usage): masque la fenêtre 5h désactivée dans l'usage Claude
Alex375 Jul 15, 2026
52bfef5
fix(conversation): rend cliquables les liens Markdown de fichiers (Co…
Alex375 Jul 15, 2026
fe0fba1
Merge branch 'feat/codex-file-links-clickable' into dev
Alex375 Jul 15, 2026
59e8ad2
feat(power): gestion Caffeinate (anti-veille macOS) — bouton toolbar …
Alex375 Jul 15, 2026
f28e624
Merge branch 'feat/caffeinate-anti-sleep' into dev
Alex375 Jul 15, 2026
a800062
fix(editor): rafraîchit les fichiers ouverts au retour sur une conver…
Alex375 Jul 15, 2026
d2491c9
feat(flightdeck): escalating playful "Thinking…" words by cumulative …
Alex375 Jul 15, 2026
ed289e3
Merge branch 'feat/funny-thinking-words' into dev
Alex375 Jul 15, 2026
7c02016
chore: remove stray review screenshot accidentally committed
Alex375 Jul 15, 2026
5de170b
chore(release): v1.1.0
Alex375 Jul 16, 2026
7ed538d
fix: post-review polish on v1.1.0 (Caffeinate self-heal, English edit…
Alex375 Jul 16, 2026
54d8a1e
Merge remote-tracking branch 'origin/main' into dev
Alex375 Jul 16, 2026
58a771f
fix(conversation): Codex file links clickable, decoupled from the cli…
Alex375 Jul 16, 2026
d49fe86
chore(release): v1.1.1
Alex375 Jul 16, 2026
90236fc
Merge branch 'main' into dev (release v1.1.1 resync)
Alex375 Jul 16, 2026
850725c
fix(usage): affiche chaque fenêtre d'usage sur présence, pas sur is_a…
Alex375 Jul 20, 2026
47d657e
chore(release): v1.1.2
Alex375 Jul 20, 2026
352685b
Merge remote-tracking branch 'origin/main' into dev
Alex375 Jul 21, 2026
93dd5d8
feat(artifacts): gestion des artefacts Claude par conversation
Alex375 Jul 22, 2026
daae195
feat(goal): affiche le goal actif (Flight Deck + conversation)
Alex375 Jul 22, 2026
eda0221
Merge branch 'feat/goal-active-display' into dev
Alex375 Jul 22, 2026
c7992c7
chore(release): v1.2.0
Alex375 Jul 22, 2026
f0e2450
fix(goal,artifacts): correctifs issus de la revue de la PR #39
Alex375 Jul 22, 2026
e6c68db
feat(usage): plafonds d'usage scopés par modèle (Fable)
Alex375 Jul 22, 2026
c58dd60
chore(usage): cible le libellé d'usage par classe + ignore les dumps …
Alex375 Jul 22, 2026
5fc8b4d
docs(changelog): note les plafonds d'usage scopés par modèle dans v1.2.0
Alex375 Jul 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ src-tauri/gen/
.playwright-mcp/
*.local.png
screenshots/
# Console/network dumps captured while verifying a behaviour in the browser
# (e.g. proving the artifact CSP blocks an external request). Throwaway by nature.
*.log

# === IDE / OS ===
.DS_Store
Expand Down
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ that section and uses it as the GitHub release description, which the app displa
as-is. The install instructions block (after the `<!-- gh-only -->` marker) is added
by `release.yml` and stays **only** on the GitHub page — it does not appear in the app.

## v1.2.0

- New: the active goal (`/goal`) is now displayed — on Flight Deck cards and at the top of the conversation — so you always see what an agent is working toward.
- New: artifacts published by Claude are collected per conversation — an "Artifacts" chip in the composer lists them, and each one shows up inline in the thread.
- New: usage limits that apply to a single model (such as Fable's weekly allowance) now appear in the usage popover, next to the 5-hour and weekly limits.

## v1.1.2

- Fixed: Claude usage now shows both the 5-hour and weekly limits whenever they exist, instead of only one at a time.
Expand Down
12 changes: 12 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ Réimplémentation clean-room en Rust du client de l'extension VS Code officiell
- **Remote control** : `control_request{subtype:"remote_control", enabled:bool, name?}` → `control_response{response:{session_url, connect_url}}` (doublement niché `response.response`). Bridge santé : `system/bridge_state{state:"disconnected"|"error"}` — **dégrade seulement**, "connected" ne vient QUE de la réponse au control_request. Spawn avec **`--replay-user-messages` inconditionnel** (sans lui le binaire n'émet aucune ligne `user` sur stdout) ; on estampille chaque message envoyé d'un uuid et on supprime l'écho de NOS propres tours (`assembler.sent_user_uuids`, one-shot — l'uuid est consommé quel que soit le contenu du tour, texte comme image-seule) ; tour distant (uuid inconnu) surfacé. **Distinguer live vs historique est OBLIGATOIRE** : `history.rs` n'émet pas de `turn_result` → splicer l'historique regrouperait tous les tours user en haut (régression).
- **Prompts de sous-agents ré-émis en `user`** : un prompt que Claude envoie à un sous-agent (`Task`/`Agent`) arrive en live comme une ligne `user` avec un **uuid FRAIS** (donc pas dans `sent_user_uuids`) + **`parent_tool_use_id` = le tool_use qui l'a spawné** ; `isReplay`/`isSidechain`/`isMeta` sont ABSENTS sur le wire live (champs disque-only, comme `sourceToolUseID` — la leçon du skill-body). VÉRIFIÉ contre claude 2.1.203 (probe pilotant le binaire avec les flags de prod + spawn forcé d'un sous-agent). Sans garde, il FUIT en bulle user dans la conversation principale (« comme si je l'avais envoyé ») → `assembler.ingest_user` ne surface la bulle QUE si `parent_tool_use_id.is_none()`. Contrairement à `isMeta`/`sourceToolUseID`, `parent_tool_use_id` est un champ TOP-LEVEL qui survit au stream → discriminant fiable. Les blocs `tool_result` (résultats internes du sous-agent, même parent) restent traités. Miroir de `history.rs` (skip `isSidechain:true` sur disque) + du guard context-meter de `ingest_stream_event`. Test `subagent_prompt_with_parent_is_not_surfaced_as_user_message`. [fix mergé dev — commit `fc40a4f`]
- **`reload_plugins`** (`control_request{subtype:"reload_plugins"}`) : hot-reload des plugins d'une session VIVANTE. **VÉRIFIÉ live (2.1.187)** : prend bien en compte un enable/disable écrit dans `~/.claude/settings.json` EN COURS de session (re-scanne AUSSI les SKILLS du plugin) — contredit l'ancien « prend effet au prochain (re)démarrage » : ce message rend le toggle live. Sa réponse de contrôle porte déjà la liste `commands` fraîche (même forme que `initialize` : `response.response.{commands,agents,plugins,mcpServers}`) + le CLI émet un `system/commands_changed` en push. ⚠️ Les skills fournis par un plugin y apparaissent en noms NUS (`brand-guidelines`), PAS `plugin:skill`.
- **`/goal` (feature native Claude Code, v2.1.139+)** : objectif de session — Claude enchaîne les tours jusqu'à ce qu'un petit modèle valide la condition, puis auto-clear. Son état vit dans le **transcript** en lignes `attachment.type:"goal_status"` (`sentinel`+`met` distinguent set / unmet-check / achieved / clear ; un `/goal clear` écrit aussi un `<local-command-stdout>` `Goal cleared:` / `No goal set`). **DISK-ONLY — JAMAIS sur le stdout live** (seul l'echo `<command-name>/goal</command-name>` remonte live via `--replay-user-messages` ; PAS de voie control-channel, vérifié). Interception = scan FILTRÉ du transcript ENTIER, en avant (`history.rs::load_active_goal` → IPC `load_session_goal`) : pas un tail-scan (un goal posé tôt et jamais terminé reste actif en fin de fichier), mais un pré-filtre par sous-chaîne brute (`goal_status` / `local-command-stdout`) AVANT tout parse JSON — sinon une flotte de cartes Flight Deck paierait un parse complet de plusieurs Mo chacune. Rafraîchi au load/reload, par carte Flight Deck (`seedActiveGoalOnce`, survit au quit/relaunch) et aux fronts de tour (gaté sur `goalSeen` pour ne rien coûter aux convs sans goal). Le bruit `/goal` (echo commande + stdout `Goal set/cleared`/`No goal set`) est masqué du fil (`is_goal_command_noise`, live+reload) ; les `/goal` du composer partent en **envoi silencieux** (live == reload). DISPLAY-ONLY via `goalStore` (mémoire, keyé convId) : chip du composer + icône target Flight Deck, popover partagée `GoalPopover` (condition + dernière raison + clear ; garde de clear pilotée par le cycle de vie de la mutation). Cf. mémoire `goal-feature-wire`.

## Backend Codex (app-server) — 2ᵉ producteur

Expand Down Expand Up @@ -301,6 +302,17 @@ SemVer `MAJEUR.MINEUR.CORRECTIF`. En `0.y.z` : MINEUR pour toute nouveauté, COR
- `repository_id` : `8c509e62-30cb-4f58-9074-086bac72528d`
- `project_id` (Tosse Code) : `ef02be22-fe30-4463-9450-ec3b20746a35`


## Artefacts (gestion + aperçu) — LIVRÉ

Gestion des artefacts produits par l'outil **`Artifact`** de Claude (pages HTML/MD hébergées `claude.ai/code/artifact/<uuid>`, privées par défaut). Contrat wire : `tool_use{name:"Artifact"}` porte `file_path` (dir TEMP éphémère `/private/tmp/claude-<uid>/…/scratchpad/*.html`), `description`, `favicon` (emoji), `label` (= nom de version) ; le `tool_result` est du **texte** dont on parse l'URL canonique (`Published … at https://claude.ai/code/artifact/<uuid>`) ; republier le même `file_path` dans la même conversation garde la même URL et ajoute une version. Disponibilité dépendante de la version du binaire (absent en 2.1.178, présent depuis ~2.1.201).

**Dérivation FRONT pure (zéro Rust/IPC/SQLite)** : `src/features/conversation/artifacts.ts` — `selectArtifacts`/`useArtifacts` scanne les tours de `conversationStore` (blocs `tool_use` name==="Artifact" joints à `toolResults[id]`), **main-thread only** (`parentToolUseId===null` → parité live/reload, miroir du skip_sidechain de `history.rs`), **groupé par `file_path`** (jamais par label — ils se répètent entre fichiers — ni par URL seule, connue seulement au tool_result), header **last-known-good** (un republish qui omet un champ ne blanchit pas l'en-tête), **exclut** les publications entièrement en échec, **strictement read-only** vers claude.ai (jamais de publish/`list` déclenché par l'UI = effet de bord réel sur le compte). Survit au reload gratuitement (tool_use+tool_result rejoués par `history.rs`), contrairement aux tâches de fond live-only.

**Surfaces** : carte inline `ArtifactCard` à chaque publication (états pending/failed/degraded — un `is_error` affiche la raison, zéro-erreur-silencieuse) ; chip composer « Artefacts (N) » + popover portal groupé par version (`ArtifactsChip`, pattern `BackgroundTaskBadge`) ; **carte-lien `ArtifactRefCard`** (une URL d'artefact écrite par Claude dans sa prose → pilule cliquable, câblée dans `MentionLink` APRÈS le `useMemo` pour garder l'ordre des hooks stable). Segment `artifact` dédié dans `toolGroup.ts` (garde `field(input,"file_path")` → un `action:"list"`/url-update retombe en run normal ; peel hors du pli clean-output, comme un `plan`). Icône `artifact` (WF_PATHS) distincte du `globe` de Remote Control.

**Aperçu in-app `ArtifactViewer`** (panneau latéral droit) : lit le fichier local via `commands.readFile` et rend l'**HTML dans un `<iframe srcDoc sandbox="allow-scripts allow-popups">`** (origine nulle → isolé de l'app), le **Markdown via `StreamMarkdown`** ; fallback « Open on claude.ai » si le fichier temp a disparu (post-reload, le fichier local étant éphémère). ⚠️ **Le rendu iframe est possible car la CSP de l'app est `null`** (`tauri.conf.json` `security.csp` = null) — fait technique réutilisable pour tout futur besoin de rendu de contenu web embarqué. Région **`artifactView` EN MÉMOIRE** dans `editorStore` (NON persistée — le fichier temp est éphémère) + `openArtifact`/`closeArtifact` ; prend la place du panneau latéral tant qu'active (exclusive avec Git ; ouvrir éditeur/terminal/Git la referme), câblée dans `MainArea` (`ConductorConversation.tsx`). Helper partagé `openArtifactView` (`artifactOpen.ts`) : fichier local → viewer, sinon navigateur. Détails wire/impl en mémoire locale (`artifact-tool-wire-contract`, `artifacts-panel-audit`).

## [GENERATED] Associated Project Contexts

---
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "tosse-code",
"version": "1.1.2",
"version": "1.2.0",
"private": true,
"type": "module",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "tosse-code"
version = "1.1.2"
version = "1.2.0"
description = "Flight Deck — desktop app to pilot Claude Code"
authors = ["Tosse"]
edition = "2021"
Expand Down
21 changes: 20 additions & 1 deletion src-tauri/src/ipc/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ use crate::supervisor::codex::{self, CodexServer};
use crate::supervisor::control::{self, PermissionDecision, PermissionMode};
use crate::supervisor::history::{self, DiskConversation, IndexedConversation, SearchHit};
use crate::supervisor::model::{
ContextFill, ConversationItem, SlashCommand, WorkflowJournal, WorkflowPhase, WorkflowRun,
ContextFill, ConversationItem, GoalState, SlashCommand, WorkflowJournal, WorkflowPhase,
WorkflowRun,
};
use crate::supervisor::session::{self, InitialControls, SessionHandle};
use crate::supervisor::transport::{ImageAttachment, SpawnConfig};
Expand Down Expand Up @@ -529,6 +530,24 @@ pub async fn load_session_context(session_id: String) -> Result<ContextFill, Str
.map_err(|e| e.to_string())
}

/// Read a conversation's active `/goal` (Claude Code's native goal feature) from its on-disk
/// transcript. The CLI writes goal state as `attachment` lines that are DISK-ONLY (never on the
/// live stream), so the UI polls this at conversation load and on each turn edge to know whether a
/// goal is active and show its condition. `None` when no goal is active.
///
/// Reads the transcript in FULL, forward (a goal set early and never terminated is still active
/// at the end of the file, so no tail slice would do) — but a raw-substring pre-filter rejects
/// every line that can't carry goal state before it reaches the JSON parser, which is what keeps
/// a whole Flight Deck fleet seeding its goals affordable. Pure file IO, off the async runtime
/// via `spawn_blocking`.
#[tauri::command]
#[specta::specta]
pub async fn load_session_goal(session_id: String) -> Result<Option<GoalState>, String> {
tokio::task::spawn_blocking(move || crate::supervisor::history::load_active_goal(&session_id))
.await
.map_err(|e| e.to_string())
}

/// Rewind a conversation IN PLACE by truncating its on-disk transcript at `target_id`,
/// dropping that message (USER target) or everything after its response (ASSISTANT
/// target). Destructive by design ("resume from here"): the removed turns are
Expand Down
4 changes: 3 additions & 1 deletion src-tauri/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ use ipc::commands::{
git_commit_files, git_diff, git_fetch, git_log, git_pull, git_push, git_status,
interrupt_session, list_disk_conversations, list_extensions, list_marketplaces,
list_plugin_contents,
list_worktrees, load_persisted_state, load_session_context, load_session_history,
list_worktrees, load_persisted_state, load_session_context, load_session_goal,
load_session_history,
load_subagent_transcript, load_workflow_journal, load_workflow_phases, load_workflow_run,
mcp_authenticate, mcp_clear_auth, mcp_reconnect, mcp_status, mcp_toggle, open_in_terminal,
account_claude_login_cancel, account_claude_login_code, account_claude_login_start,
Expand Down Expand Up @@ -88,6 +89,7 @@ fn ipc_builder() -> Builder<tauri::Wry> {
fetch_slash_commands,
load_session_history,
load_session_context,
load_session_goal,
rewind_conversation,
fork_conversation,
load_subagent_transcript,
Expand Down
9 changes: 8 additions & 1 deletion src-tauri/src/supervisor/assembler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -912,7 +912,14 @@ impl Assembler {
// the context-meter guard in `ingest_stream_event`. The `tool_result` blocks above
// are still surfaced (a sub-agent's internal results carry the same parent and are
// routed to its own card downstream).
if !was_ours && !text.trim().is_empty() && u.parent_tool_use_id.is_none() {
// `/goal` plumbing is represented by the dedicated goal UI now, so never surface it as
// a bubble: the command echo is already dropped as `was_ours`, but the CLI-generated
// `<local-command-stdout>` reply ("Goal set/cleared", "No goal set") carries a FRESH
// uuid — without this guard, clearing a goal from the chip would leave that stdout in
// the thread. Mirrors `history.rs` `push_user_text` on reload.
if !was_ours && !text.trim().is_empty() && u.parent_tool_use_id.is_none()
&& !super::history::is_goal_command_noise(&text)
{
out.push(SessionEvent::Item(ConversationItem::UserMessage {
id: uuid,
text,
Expand Down
3 changes: 3 additions & 0 deletions src-tauri/src/supervisor/codex/session.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2151,6 +2151,9 @@ fn rate_limits_to_plan_usage(snap: &RateLimitSnapshot) -> Option<crate::usage::P
Some(crate::usage::PlanUsage {
five_hour,
seven_day,
// Codex has no per-model allowance: its snapshot carries exactly two windows
// (`primary`/`secondary`), so there is nothing scoped to report.
scoped: Vec::new(),
})
}

Expand Down
Loading
Loading