fix(desktop): agrandir la fenêtre agent + boutons copier ; bloquer l'URL du serveur (T-113, T-114) #102

Merged
ahitosly merged 2 commits from fix/T-113-T-114-agent-window-server-url into main 2026-09-05 23:43:56 +02:00
Owner

Tâche

T-xxx — (titre dans docs/STATUS.md)

Changements

Contrat modifié ?

  • Non
  • Oui : packages/contract / supabase/migrations — docs/API.md / docs/DATA.md mis à jour, label contract, approbation humaine requise

Tests

  • scripts/check.sh vert
  • Test manuel (OS, scénario) :

Impacts cross-domaine

Fichiers hors périmètre de l'agent (et pourquoi) :

Suivi

  • docs/STATUS.md mis à jour (ligne de la tâche)
  • docs/CHANGELOG.md : entrée ajoutée sous Unreleased
  • docs/DECISIONS.md / docs/ECARTS.md mis à jour si décision ou écart
## Tâche T-xxx — (titre dans docs/STATUS.md) ## Changements - ## Contrat modifié ? - [ ] Non - [ ] Oui : `packages/contract` / `supabase/migrations` — `docs/API.md` / `docs/DATA.md` mis à jour, label `contract`, approbation humaine requise ## Tests - [ ] `scripts/check.sh` vert - [ ] Test manuel (OS, scénario) : ## Impacts cross-domaine Fichiers hors périmètre de l'agent (et pourquoi) : ## Suivi - [ ] `docs/STATUS.md` mis à jour (ligne de la tâche) - [ ] `docs/CHANGELOG.md` : entrée ajoutée sous Unreleased - [ ] `docs/DECISIONS.md` / `docs/ECARTS.md` mis à jour si décision ou écart
fix(desktop): agrandir la fenêtre agent + boutons copier ; bloquer l'URL du serveur (T-113, T-114)
All checks were successful
ci / server (pull_request) Successful in 14s
ci / desktop-ts (pull_request) Successful in 27s
ci / desktop-rust (pull_request) Successful in 2m42s
16aec56388
Deux tickets Forgejo traités ensemble (même domaine app-front, diffs petits) :

- #100 : fenêtre agent élargie (480×560 → 720×620) ; boutons « Copier »
  sur les blocs de code et les tableaux markdown de AgentWindow.tsx
  (T-113).
- #101 : l'URL du serveur est retirée d'AriaConfig/ConfigPatch, figée
  à la compilation (config::SERVER_URL) — invisible et non modifiable
  depuis le client. Champ retiré de Settings › Général. ADR-014,
  docs/SPEC.md mis à jour (T-114).

scripts/check.sh vert (254 serveur, 132 desktop rust, tsc/eslint).
Aucun changement de contrat/schéma.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nro89gGrdgwHjawTYCLurX
Author
Owner

Review qa-regression — PR #102 (T-113/T-114, issues #100/#101)

Verdict : APPROVE

Vérifications effectuées (checkout local de la branche dans un worktree isolé, pas seulement lecture du diff) :

  1. Correctness (server_url) — aucune référence orpheline : grep -rn "server_url" sur tout apps//docs/packages ne remonte plus que le nom du test server_url_is_not_a_config_field (config.rs:182) et une mention dans un commentaire de build.rs (pré-existant, non touché par cette PR, cf. nit ci-dessous). src/lib/tauri.ts::AriaConfig cohérent avec config.rs::AriaConfig (champ retiré des deux côtés). crate::config::SERVER_URL bien utilisé aux 3 sites api_client.rs (dictée/agent send() L207, /v1/prompts/base L291, /v1/agent/stream L379), même fallback par défaut qu'avant (http://localhost:8787) — pas de régression de comportement en dev sans VITE_ARIA_SERVER_URL.

  2. Sécurité — vérifié qu'aucun #[serde(deny_unknown_fields)] n'existe sur ConfigPatch/AriaConfig : un appel direct à set_config avec un JSON contenant server_url désérialise sans erreur (champ inconnu silencieusement ignoré par serde), aucun effet, cohérent avec l'objectif du ticket #101. Un ancien aria.config.json sur disque contenant encore server_url (config persistée avant cette PR) se désérialise aussi sans problème (même mécanisme). Le champ est bien absent structurellement d'AriaConfig/ConfigPatch, pas juste masqué en UI.

  3. CopyButton / textFromChildren — relu en détail : gère string/number/Array/élément React ("props" in children)/null/undefined sans crash (le cas null/undefined est filtré par le children && avant le test typeof, retombe sur return ""). Cas non couverts explicitement (booléens, symboles) retombent aussi sur return "" sans throw — comportement sûr. table : le ref DOM n'est lu que dans le handler onClick, jamais pendant le rendu — pas de risque de contenu obsolète puisque le clic implique que l'élément est déjà monté ; RAS.

  4. Non-régression — revérifié moi-même, pas seulement pris la parole de l'auteur :

    • cargo test (workspace src-tauri) : 132/132 verts, y compris les 14 tests de config::tests (server_url_is_not_a_config_field inclus).
    • cargo clippy --quiet -- -D warnings (commande exacte de scripts/check.sh et de .forgejo/workflows/ci.yml) : clean.
    • pnpm tsc --noEmit et pnpm eslint . : clean.
    • Nit non-bloquant trouvé : avec cargo clippy --all-targets -- -D warnings (donc en compilant aussi le code #[cfg(test)]), le nouveau test server_url_is_not_a_config_field (config.rs) déclenche clippy::bool_assert_comparison sur assert_eq!(SERVER_URL.is_empty(), false) → à remplacer par assert!(!SERVER_URL.is_empty()). N'affecte ni CI ni check.sh (aucun des deux n'utilise --all-targets), donc non bloquant, mais autant le corriger à l'occasion.
    • Test patch_without_microphone_field_leaves_existing_choice_untouched correctement adapté (hotkey à la place de server_url dans le patch de test) — vérifie toujours ce qu'il prétend.
  5. Docs — docs/SPEC.md (§4.3 tableau config, §4.6 page Général) et ADR-014 cohérents avec le code livré : le champ est bien retiré des deux endroits documentés, l'ADR décrit fidèlement le mécanisme (option_env!/build.rs, 3 call sites, alternatives écartées). STATUS.md/CHANGELOG.md à jour (T-113/T-114 done, nouvelle table « Tickets Forgejo »).

Nits non bloquants (à traiter à l'occasion, pas dans cette PR) :

  • config.rs L1 : le doc-comment de module dit encore "Configuration locale (tauri-plugin-store) : URL serveur, hotkey, micro, langue." — contredit maintenant le fait que l'URL serveur n'est justement plus gérée par tauri-plugin-store. Pas modifié par cette PR mais devenu trompeur suite à son changement.
  • build.rs L4-5 : commentaire pré-existant (non touché ici) qui dit encore "server_url par défaut" en référence à config.rs — même staleness, pré-date cette PR.
  • clippy bool_assert_comparison mentionné au point 4.

Aucun de ces points n'est bloquant. Périmètre respecté (app-front uniquement), pas de contrat/migration touché, fenêtre agent élargie et boutons copier fonctionnellement sains d'après la relecture de code (rendu visuel réel correctement listé en vérification manuelle en attente dans STATUS.md, pas testable depuis cet environnement).

Review qa-regression — PR #102 (T-113/T-114, issues #100/#101) **Verdict : APPROVE** Vérifications effectuées (checkout local de la branche dans un worktree isolé, pas seulement lecture du diff) : 1. **Correctness (server_url)** — aucune référence orpheline : `grep -rn "server_url"` sur tout `apps/`/`docs`/`packages` ne remonte plus que le nom du test `server_url_is_not_a_config_field` (config.rs:182) et une mention dans un commentaire de `build.rs` (pré-existant, non touché par cette PR, cf. nit ci-dessous). `src/lib/tauri.ts::AriaConfig` cohérent avec `config.rs::AriaConfig` (champ retiré des deux côtés). `crate::config::SERVER_URL` bien utilisé aux 3 sites `api_client.rs` (dictée/agent `send()` L207, `/v1/prompts/base` L291, `/v1/agent/stream` L379), même fallback par défaut qu'avant (`http://localhost:8787`) — pas de régression de comportement en dev sans `VITE_ARIA_SERVER_URL`. 2. **Sécurité** — vérifié qu'aucun `#[serde(deny_unknown_fields)]` n'existe sur `ConfigPatch`/`AriaConfig` : un appel direct à `set_config` avec un JSON contenant `server_url` désérialise sans erreur (champ inconnu silencieusement ignoré par serde), aucun effet, cohérent avec l'objectif du ticket #101. Un ancien `aria.config.json` sur disque contenant encore `server_url` (config persistée avant cette PR) se désérialise aussi sans problème (même mécanisme). Le champ est bien absent structurellement d'`AriaConfig`/`ConfigPatch`, pas juste masqué en UI. 3. **CopyButton / textFromChildren** — relu en détail : gère `string`/`number`/`Array`/élément React (`"props" in children`)/`null`/`undefined` sans crash (le cas `null`/`undefined` est filtré par le `children &&` avant le test `typeof`, retombe sur `return ""`). Cas non couverts explicitement (booléens, symboles) retombent aussi sur `return ""` sans throw — comportement sûr. `table` : le `ref` DOM n'est lu que dans le handler `onClick`, jamais pendant le rendu — pas de risque de contenu obsolète puisque le clic implique que l'élément est déjà monté ; RAS. 4. **Non-régression** — revérifié moi-même, pas seulement pris la parole de l'auteur : - `cargo test` (workspace `src-tauri`) : 132/132 verts, y compris les 14 tests de `config::tests` (`server_url_is_not_a_config_field` inclus). - `cargo clippy --quiet -- -D warnings` (commande exacte de `scripts/check.sh` et de `.forgejo/workflows/ci.yml`) : clean. - `pnpm tsc --noEmit` et `pnpm eslint .` : clean. - Nit non-bloquant trouvé : avec `cargo clippy --all-targets -- -D warnings` (donc en compilant aussi le code `#[cfg(test)]`), le nouveau test `server_url_is_not_a_config_field` (config.rs) déclenche `clippy::bool_assert_comparison` sur `assert_eq!(SERVER_URL.is_empty(), false)` → à remplacer par `assert!(!SERVER_URL.is_empty())`. N'affecte ni CI ni `check.sh` (aucun des deux n'utilise `--all-targets`), donc non bloquant, mais autant le corriger à l'occasion. - Test `patch_without_microphone_field_leaves_existing_choice_untouched` correctement adapté (`hotkey` à la place de `server_url` dans le patch de test) — vérifie toujours ce qu'il prétend. 5. **Docs** — `docs/SPEC.md` (§4.3 tableau `config`, §4.6 page Général) et ADR-014 cohérents avec le code livré : le champ est bien retiré des deux endroits documentés, l'ADR décrit fidèlement le mécanisme (`option_env!`/`build.rs`, 3 call sites, alternatives écartées). `STATUS.md`/`CHANGELOG.md` à jour (T-113/T-114 done, nouvelle table « Tickets Forgejo »). Nits non bloquants (à traiter à l'occasion, pas dans cette PR) : - `config.rs` L1 : le doc-comment de module dit encore "Configuration locale (tauri-plugin-store) : **URL serveur**, hotkey, micro, langue." — contredit maintenant le fait que l'URL serveur n'est justement plus gérée par `tauri-plugin-store`. Pas modifié par cette PR mais devenu trompeur suite à son changement. - `build.rs` L4-5 : commentaire pré-existant (non touché ici) qui dit encore "`server_url` par défaut" en référence à `config.rs` — même staleness, pré-date cette PR. - clippy `bool_assert_comparison` mentionné au point 4. Aucun de ces points n'est bloquant. Périmètre respecté (app-front uniquement), pas de contrat/migration touché, fenêtre agent élargie et boutons copier fonctionnellement sains d'après la relecture de code (rendu visuel réel correctement listé en vérification manuelle en attente dans STATUS.md, pas testable depuis cet environnement).
fix(desktop): corrige les nits relevés par la review qa-regression (T-114)
Some checks failed
ci / server (pull_request) Successful in 13s
ci / desktop-ts (pull_request) Successful in 26s
ci / desktop-rust (pull_request) Failing after 3m1s
cfcee82700
- config.rs/build.rs : commentaires de doc mentionnant encore « URL
  serveur » gérée par tauri-plugin-store, obsolètes depuis le retrait
  de server_url d'AriaConfig (ADR-014).
- config.rs test : assert_eq!(x, false) -> assert!(!x), évite
  clippy::bool_assert_comparison sous cargo clippy --all-targets.

Signalé par la review qa-regression de la PR #102, non bloquant.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nro89gGrdgwHjawTYCLurX
ahitosly scheduled this pull request to auto merge when all checks succeed 2026-09-05 23:43:43 +02:00
ahitosly deleted branch fix/T-113-T-114-agent-window-server-url 2026-09-05 23:43:56 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
cloud-rennais/aria!102
No description provided.