diff --git a/.ideai/idea-android-plugin.json b/.ideai/idea-android-plugin.json index 198931c..1cce818 100644 --- a/.ideai/idea-android-plugin.json +++ b/.ideai/idea-android-plugin.json @@ -5,7 +5,7 @@ "probableAppModule": null, "projectId": "97b49ac2-8376-4aa3-8ea9-bf3ac81d0023", "projectRoot": "/home/anthony/Documents/Projects/IdeA", - "updatedAt": "2026-08-05T13:21:17.735Z" + "updatedAt": "2026-08-06T09:47:45.004Z" }, "ownerAgentId": null, "ownerAgentMapping": {}, diff --git a/.ideai/memory/MEMORY.md b/.ideai/memory/MEMORY.md index e414774..0633546 100644 --- a/.ideai/memory/MEMORY.md +++ b/.ideai/memory/MEMORY.md @@ -78,3 +78,4 @@ - [ticket120-hello-plugin-recurrence-investigation-angle](ticket120-hello-plugin-recurrence-investigation-angle.md) — memory note ticket120-hello-plugin-recurrence-investigation-angle - [ticket120-hello-plugin-blackscreen-recurrence](ticket120-hello-plugin-blackscreen-recurrence.md) — memory note ticket120-hello-plugin-blackscreen-recurrence - [plugin-asset-serving-and-owned-storage-contracts](plugin-asset-serving-and-owned-storage-contracts.md) — memory note plugin-asset-serving-and-owned-storage-contracts +- [ticket156-reply-progress-foundation](ticket156-reply-progress-foundation.md) — memory note ticket156-reply-progress-foundation diff --git a/.ideai/memory/ticket156-reply-progress-foundation.md b/.ideai/memory/ticket156-reply-progress-foundation.md new file mode 100644 index 0000000..6f6684d --- /dev/null +++ b/.ideai/memory/ticket156-reply-progress-foundation.md @@ -0,0 +1,20 @@ +--- +name: ticket156-reply-progress-foundation +description: memory note ticket156-reply-progress-foundation +metadata: + type: project +--- +# Ticket #156 — foundation canonique ReplyProgress + +Type: reference + +Phase 2 du cycle CLI custom a pose le contrat backend canonique des evenements intermediaires avant `Final`. + +Decisions livrees : +- Domaine : `ReplyProgress` + `ReplyProgressSource` (`ProviderNative` vs `IdeaLocal`) + `ReplyProgressKind` (`Turn`, `Message`, `Tool`, `Mcp`, `Other`) + `ReplyProgressStage` (`Started`, `Delta`, `Completed`, `Info`) dans `domain::ports`. +- `ReplyEvent::Progress { progress }` est explicitement non terminal ; `ReadinessPolicy` et les drains applicatifs continuent de donner autorite uniquement a `ReplyEvent::Final` pour la fin de tour. `RateLimited` reste orthogonal/non terminal. +- DTO transport : `ReplyChunk::Progress { progress }` avec shape JSON camelCase, additive par rapport aux anciens chunks. +- `agent_send` utilise maintenant `AgentSession::send_with_tap` pour projeter best-effort les progress pendant que `send` tourne ; le `ReplyStream` retourne par l'adapter reste le chemin autoritaire draine jusqu'au `Final`. +- Mapping adapters : Claude/Codex/OpenCode emettent des progress `ProviderNative` pour les evenements natifs observables (turn/system/step/tool item). OpenAI-compatible emet des progress `IdeaLocal`/`Mcp` autour des appels d'outils orchestries par IdeA. + +Garde-fous : ne pas promettre le streaming du raisonnement interne ; ne jamais parser les metadonnees provider comme autorite metier ; #157 doit consommer `ReplyChunk::Progress` cote UI pour affichage distinct et degrade proprement si absent. \ No newline at end of file diff --git a/.ideai/tickets/150/carnet.md b/.ideai/tickets/150/carnet.md new file mode 100644 index 0000000..48b2157 --- /dev/null +++ b/.ideai/tickets/150/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#150" +version: 2 +updatedBy: {"kind":"user"} +updatedAt: 1785964248745 +--- diff --git a/.ideai/tickets/150/issue.md b/.ideai/tickets/150/issue.md new file mode 100644 index 0000000..8db431f --- /dev/null +++ b/.ideai/tickets/150/issue.md @@ -0,0 +1,17 @@ +--- +id: "ebb59f0b-fb54-40f9-a4bc-d873f9716255" +number: 150 +title: "CLI UI: messages utilisateur affichés en double dans la conversation agent" +status: "closed" +priority: "high" +sprint: null +links: [] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"user"} +createdAt: 1785945386638 +updatedAt: 1785964248745 +version: 2 +--- +Depuis la CLI intégrée IdeA, les messages utilisateur apparaissent deux fois dans la conversation avec un agent. La capture fournie montre deux occurrences successives de "Qui es tu ?" dans la colonne de conversation. Attendu: un seul rendu par message utilisateur envoyé. Surface concernée: frontend UI conversation CLI. \ No newline at end of file diff --git a/.ideai/tickets/151/carnet.md b/.ideai/tickets/151/carnet.md new file mode 100644 index 0000000..693b902 --- /dev/null +++ b/.ideai/tickets/151/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#151" +version: 5 +updatedBy: {"kind":"agent","agent_id":"1ff94b51-3e17-4a39-8543-7715d1ff0f80"} +updatedAt: 1786014830849 +--- diff --git a/.ideai/tickets/151/issue.md b/.ideai/tickets/151/issue.md new file mode 100644 index 0000000..f7de40a --- /dev/null +++ b/.ideai/tickets/151/issue.md @@ -0,0 +1,17 @@ +--- +id: "c9aaa2e5-b17c-42ec-aa4c-2802a2863a1d" +number: 151 +title: "CLI UI: chevauchement des boutons dans la barre supérieure pendant une conversation agent" +status: "closed" +priority: "medium" +sprint: null +links: [] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"1ff94b51-3e17-4a39-8543-7715d1ff0f80"} +createdAt: 1785945386695 +updatedAt: 1786014830849 +version: 5 +--- +Pendant une conversation avec un agent, les contrôles en haut à droite de la cellule CLI se chevauchent. La capture montre le bouton rouge Cancel qui overlap les switches de rendu/skin CLI. Attendu: layout stable sans overlap pendant l'état busy/conversation. Surface concernée: frontend UI cellule/toolbar CLI. \ No newline at end of file diff --git a/.ideai/tickets/152/carnet.md b/.ideai/tickets/152/carnet.md new file mode 100644 index 0000000..e06a6ce --- /dev/null +++ b/.ideai/tickets/152/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#152" +version: 3 +updatedBy: {"kind":"user"} +updatedAt: 1786010223872 +--- diff --git a/.ideai/tickets/152/issue.md b/.ideai/tickets/152/issue.md new file mode 100644 index 0000000..7d8d269 --- /dev/null +++ b/.ideai/tickets/152/issue.md @@ -0,0 +1,17 @@ +--- +id: "3a501b32-7b71-43c5-838c-bfc7e772e860" +number: 152 +title: "CLI UI: mauvaise mise à l’échelle sur conversation longue, barre de chat hors écran" +status: "closed" +priority: "high" +sprint: null +links: [] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"user"} +createdAt: 1785945386711 +updatedAt: 1786010223872 +version: 3 +--- +Quand la conversation CLI devient longue, le layout/scaling se dégrade et la barre de saisie sort de l'écran par le bas. Attendu: zone de messages scrollable, footer/input toujours visible dans le viewport de la cellule. Surface concernée: frontend UI layout CLI conversation. \ No newline at end of file diff --git a/.ideai/tickets/154/carnet.md b/.ideai/tickets/154/carnet.md new file mode 100644 index 0000000..be50209 --- /dev/null +++ b/.ideai/tickets/154/carnet.md @@ -0,0 +1,87 @@ +--- +issueRef: "#154" +version: 3 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786007117802 +--- +## Objective +Build a first-class attachment pipeline for agent-facing chat flows so files provided by the user are persisted, referenced, and made readable by agents without relying on prompt-text hacks. + +## Why this exists +Current custom agent chat can only append a picked local path into the prompt text. That is not a robust attachment model and it does not guarantee that the target agent sandbox can read the file. Clipboard-paste support should not be built on top of this weak contract. + +## Product target +Match as closely as reasonable the ergonomics of Codex / Claude Code style attachments while staying aligned with IdeA architecture: +- attachments are first-class entities, not just a string in the prompt; +- files are persisted in a stable host-controlled location; +- agents receive attachment context through an explicit contract; +- sandbox readability is guaranteed by construction for attached files; +- the model can support images first, then general files, without redesign. + +## Non-goals +- No one-off frontend-only workaround that stores a browser blob URL or injects base64 into the prompt. +- No attachment flow that depends on the source file remaining at an arbitrary user path outside IdeA-managed storage. +- No design that works only for one provider/profile while breaking the abstraction for others. + +## Expected architecture +A solid outcome should include the following, subject to Architect arbitration: +1. A durable attachment store owned by IdeA for agent/chat inputs. +2. A stable attachment identity and metadata contract (id, filename, mime, size, source kind, storage path, createdAt). +3. A transport contract from frontend to backend that sends structured attachment intent rather than only prompt text. +4. A backend/application path that materializes attachments into the attachment store and exposes them to the launched agent session. +5. A sandbox policy/story that makes attached files readable by the target agent without broadening access to arbitrary user filesystem paths. + +## Storage / sandbox direction +Preferred direction: +- store agent-chat attachments under a project-owned IdeA path, for example `.ideai/attachments/agent-chat/...` or equivalent durable app-owned location that is intentionally mounted/readable for agent runs; +- if temporary staging is needed, staging must still end in a durable managed location before send; +- the chosen location must be easy to add to sandbox readable roots with minimal blast radius. + +Important constraint: +- attached files should be readable even when the original source came from clipboard paste or from a user path outside the project root. + +## UX contract this foundation should unlock +- picker-selected files become first-class attachments; +- clipboard-pasted images can use the exact same downstream attachment pipeline; +- future drag-and-drop can reuse the same contract; +- chat UI can display attachment chips/previews based on metadata instead of raw path strings. + +## Suggested work split +### Architecture +- define ownership and location of the attachment store; +- decide whether the store is project-local vs app-data with projection into sandbox roots; +- define DTO/port contract for structured chat attachments; +- define lifecycle rules (persist until manually removed? per conversation? per turn?). + +### Backend / app-tauri / application +- add write path for attachment creation/import; +- add any read-model or DTO needed by the custom chat flow; +- ensure structured launch / send path can pass attachment references to the session layer; +- ensure sandbox roots include the managed attachment location with least privilege. + +### Frontend +- stop treating chat attachments as prompt suffix text; +- represent selected attachments as typed UI state; +- render chips/previews from metadata; +- call the new attachment APIs. + +### QA +- verify picked file outside project root becomes readable by the agent through managed import; +- verify attachment survives send and session restart expectations defined by architecture; +- verify sandbox does not gain broad arbitrary read access. + +## Acceptance criteria +- There is a first-class attachment contract for custom/structured agent chat. +- A user-selected file is imported into IdeA-managed storage before send. +- The target agent can read the attachment from within its sandbox without extra manual permission tweaking. +- The prompt path no longer relies on a brittle plain-text `[Fichier joint: ...]` suffix as the only attachment mechanism. +- The contract is reusable by clipboard image paste and future drag/drop. + +## Risks to watch +- sandbox over-broadening to all of `$HOME` or arbitrary original source paths; +- provider-specific coupling that leaks one CLI's attachment semantics into the generic product contract; +- retention bloat if attachments are never garbage-collected; +- hidden duplication / large binary churn if images are copied repeatedly without lifecycle policy. + +## Deliverable quality bar +This ticket is explicitly meant to prevent bricolage. If a proposed implementation cannot explain how attachment persistence, identity, routing, and sandbox readability work end-to-end, it is not sufficient. \ No newline at end of file diff --git a/.ideai/tickets/154/issue.md b/.ideai/tickets/154/issue.md new file mode 100644 index 0000000..d3361ba --- /dev/null +++ b/.ideai/tickets/154/issue.md @@ -0,0 +1,17 @@ +--- +id: "551a6639-315d-4ff3-8a01-7ecc077b0e30" +number: 154 +title: "Foundation: durable agent/chat attachments pipeline with sandbox-safe file access" +status: "closed" +priority: "high" +sprint: null +links: [] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1785964740314 +updatedAt: 1786007117802 +version: 3 +--- +Build a first-class attachment pipeline for agent/custom-chat flows so user-supplied files are persisted, referenced, and readable by agents without prompt-string bricolage. Scope includes durable storage location, DTO/contracts, routing through structured chat flows, and sandbox/readability guarantees for attached files. \ No newline at end of file diff --git a/.ideai/tickets/155/carnet.md b/.ideai/tickets/155/carnet.md new file mode 100644 index 0000000..0740a74 --- /dev/null +++ b/.ideai/tickets/155/carnet.md @@ -0,0 +1,88 @@ +--- +issueRef: "#155" +version: 4 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786007117827 +--- +## Objective +Allow the user to paste an image directly from the clipboard into the custom agent chat composer (for example after a screenshot) and send it as a proper attachment. + +## Dependency +This ticket depends on #154 because clipboard image paste must reuse the durable agent/chat attachment pipeline rather than reintroduce a local-only workaround. + +## User expectation +The experience should feel close to Codex / Claude Code: +- user focuses the custom chat composer; +- presses paste after taking a screenshot or copying an image; +- sees an attachment chip and, if practical, a lightweight preview; +- sends the message normally; +- the target agent can actually access the attached image in its sandbox. + +## Product constraints +- This is for the custom structured chat UI, not the raw PTY/TUI path. +- The feature must ride on first-class attachments, not on embedding base64 in the prompt or on temporary browser-only objects. +- If the message text is empty but an image attachment is present, product behavior should be explicitly decided: either allow send with attachment-only or require text. Recommendation: allow attachment-only send. + +## UX scope +Recommended MVP: +- intercept paste on the custom chat composer textarea; +- detect image MIME types from clipboard data (`image/png`, `image/jpeg`, potentially `image/webp` if stable); +- materialize the image through the foundation pipeline from #154; +- show an attachment chip with filename, MIME, and size if available; +- show a thumbnail preview when cheap and reliable; +- allow removing the pasted attachment before send; +- send through the same structured attachment contract as picked files. + +Possible follow-ups, not required in this ticket unless cheap: +- multiple pasted images in one operation; +- drag-and-drop onto the composer; +- richer preview lightbox; +- file progress UI for large payloads. + +## Edge cases +- clipboard contains both text and image; +- clipboard contains unsupported binary data; +- paste permission / browser-webview limitations; +- pasted image too large; +- rapid repeated pastes; +- session recovery / resend after structured session NOT_FOUND; +- removing/replacing an attachment before send. + +## Expected technical direction +### Frontend +- handle `onPaste` on the composer; +- inspect clipboard items and prefer image payloads when present; +- route pasted binary data through the attachment creation/import API from #154; +- keep attachment state typed and separate from message text; +- render attachment chip/preview in the composer area; +- keep keyboard behavior intact: Enter sends, Shift+Enter newline. + +### Backend +- no bespoke clipboard-only path; use the generic attachment pipeline from #154; +- if a dedicated import endpoint is needed for raw bytes from the frontend, it should still create the same attachment entity/store record as picked files. + +### Sandbox / runtime +- the agent must read the resulting stored image through the managed attachment location; +- no dependence on the clipboard source continuing to exist after paste. + +## Acceptance criteria +- Pasting an image into the custom chat composer creates a real attachment entry. +- The composer shows the attachment before send and lets the user remove it. +- Sending the turn makes the attachment available to the target agent through the first-class attachment pipeline. +- The feature works for a typical screenshot flow on supported desktop targets. +- Failure states are explicit and recoverable (unsupported clipboard content, too large, import failed). + +## QA expectations +- verify screenshot paste on the supported desktop platform(s); +- verify pasted image is readable by the agent in practice, not just visible in UI; +- verify send with attachment-only if product accepts it; +- verify no regression on plain text send, picked-file attach, and session recovery. + +## Quality bar +No workaround such as: +- adding a fake path string to the prompt without importing the file; +- storing only a browser blob URL; +- embedding the whole image inline in prompt text; +- relying on arbitrary external paths that the sandbox may or may not read. + +This ticket is considered done only if the UX is good and the underlying file-access model is solid. \ No newline at end of file diff --git a/.ideai/tickets/155/issue.md b/.ideai/tickets/155/issue.md new file mode 100644 index 0000000..e9a5568 --- /dev/null +++ b/.ideai/tickets/155/issue.md @@ -0,0 +1,17 @@ +--- +id: "620bc08f-835c-483c-a9f1-59690ebf8ab5" +number: 155 +title: "Custom chat: paste image from clipboard into composer" +status: "closed" +priority: "medium" +sprint: null +links: [{"target":"#154","kind":"dependsOn"}] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1785964740363 +updatedAt: 1786007117827 +version: 4 +--- +Allow pasting an image from the clipboard (for example a screenshot) directly into the custom agent chat composer, with preview/attachment behavior comparable to Codex and Claude Code. This ticket should rely on a proper attachment foundation rather than a prompt-only hack. \ No newline at end of file diff --git a/.ideai/tickets/156/carnet.md b/.ideai/tickets/156/carnet.md new file mode 100644 index 0000000..908595f --- /dev/null +++ b/.ideai/tickets/156/carnet.md @@ -0,0 +1,50 @@ +--- +issueRef: "#156" +version: 7 +updatedBy: {"kind":"agent","agent_id":"1ff94b51-3e17-4a39-8543-7715d1ff0f80"} +updatedAt: 1786014830849 +--- +# Objectif + +Fournir une fondation canonique permettant d'exposer **tous les progress/events non terminaux réellement mis à disposition** par les profils IA, avant `Final`, sans coupler le produit au format d'un provider particulier. + +# Pourquoi + +Le comportement observé sur la CLI custom montre que certains profils, notamment Codex, donnent aujourd'hui une impression de silence jusqu'au `Final`, puis affichent certains appels/outils après coup. Même si une partie du "thinking" interne reste potentiellement indisponible, IdeA doit au moins projeter de manière cohérente tout ce qui est effectivement observable. + +# Portée attendue + +- Définir une taxonomie canonique d'événements intermédiaires utilisable par le chat agent et l'inter-agent. +- Couvrir un maximum de profils IA : Codex, Claude, profils structured/OpenAI-like, et futurs profils. +- Prévoir une dégradation propre quand un profil n'expose que `turn.started`/`Final`, ou seulement quelques items/outils. +- Séparer clairement : + - événements natifs du provider (text deltas, item started/completed, progress, etc.) + - observabilité locale IdeA (ex. calls MCP/tooling orchestrés par IdeA) +- Préserver la robustesse : aucun affichage temps réel ne doit devenir autorité de fin de tour. + +# Contraintes / garde-fous + +- Ne jamais promettre le streaming du raisonnement interne si le provider ne l'expose pas explicitement. +- Les événements intermédiaires sont "best effort" ; `Final` reste l'unique sortie terminale métier. +- Le contrat doit être provider-agnostic côté domaine/application ; les adapters font le mapping. +- Les appels MCP/outils orchestrés par IdeA doivent être projetables même si le provider reste silencieux. + +# Livrables attendus + +- Contrat d'événements canonique + mapping par famille de profils. +- Stratégie de transport/projection live jusqu'au frontend. +- Inventaire des événements accessibles par profil et des trous assumés. +- Tests de non-régression sur l'absence de blocage/buffering terminal. + +# Questions à arbitrer + +- Quels événements deviennent de première classe dans le contrat canonique ? +- Quelle granularité conserver pour les tool/MCP calls (start/end seulement, ou payload résumé) ? +- Quelle source de vérité pour les événements locaux IdeA vs les événements natifs provider ? +- Quelle stratégie de batching/throttling pour éviter le bruit tout en gardant du temps réel utile ? + +# Définition de done + +- IdeA sait exposer, au fil de l'eau, le maximum d'événements disponibles sans attendre systématiquement `Final`. +- L'absence d'événements d'un provider est traitée comme une limite du provider, pas comme un bug UI. +- Le comportement est documenté profil par profil. \ No newline at end of file diff --git a/.ideai/tickets/156/issue.md b/.ideai/tickets/156/issue.md new file mode 100644 index 0000000..8226e4d --- /dev/null +++ b/.ideai/tickets/156/issue.md @@ -0,0 +1,17 @@ +--- +id: "8ba27857-773a-4303-a7b5-ae7d688b3442" +number: 156 +title: "Foundation: unified streaming progress/event model across AI profiles" +status: "closed" +priority: "high" +sprint: null +links: [] +agentRefs: [{"agentId":"fe887179-933f-47d4-960f-c3b06827f86c","role":"assigned"}] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"1ff94b51-3e17-4a39-8543-7715d1ff0f80"} +createdAt: 1785965383888 +updatedAt: 1786014830849 +version: 7 +--- +Define and implement a provider-agnostic progress/event pipeline so IdeA can expose as much non-terminal activity as each AI profile makes available before Final. Scope includes a canonical event taxonomy for chat/delegation flows, mapping from profile-specific adapters (Codex, Claude, OpenAI-style structured, and future profiles), and transport/projection rules that preserve robustness when some profiles expose little or no intermediate output. \ No newline at end of file diff --git a/.ideai/tickets/157/carnet.md b/.ideai/tickets/157/carnet.md new file mode 100644 index 0000000..9a7f496 --- /dev/null +++ b/.ideai/tickets/157/carnet.md @@ -0,0 +1,71 @@ +--- +issueRef: "#157" +version: 9 +updatedBy: {"kind":"agent","agent_id":"1ff94b51-3e17-4a39-8543-7715d1ff0f80"} +updatedAt: 1786014830849 +--- +# Objectif + +Améliorer la CLI custom / chat agent pour afficher **un maximum de progress intermédiaires réellement disponibles** au lieu d'un silence jusqu'au `Final`, avec une UX différenciée pour : + +- les messages/progress agent généraux +- les appels MCP / outils +- les délégations inter-agent + +# Dépendance + +- Dépend explicitement de #156, qui doit fournir le contrat d'événements canonique multi-profils. + +# Attentes produit + +- Afficher les événements intermédiaires au fil de l'eau quand ils existent. +- Montrer clairement quel agent parle à quel agent. +- Afficher un extrait court de la demande déléguée. +- Rendre les appels MCP/outils visuellement distincts du reste du flux. +- Fonctionner avec un maximum de profils IA, avec dégradation élégante quand un profil n'expose pas grand-chose. + +# Périmètre UI/UX attendu + +## Types visuels + +- `AgentMessage` : message/progress principal d'un agent. +- `Delegation` : carte dédiée `Agent A -> Agent B` avec extrait court de la demande. +- `ToolCall` : carte secondaire/indentée pour les appels d'outil. +- `MCPEvent` : variante spécifique pour les appels MCP/méthodes MCP, distincte visuellement. + +## États + +- `started` +- `running` +- `done` +- `error` + +## Hiérarchie visuelle + +- Les délégations et appels MCP ne doivent pas se confondre avec un simple texte agent. +- Les appels MCP/outils doivent être lisibles mais plus discrets que le message principal. +- Prévoir la lecture d'une conversation longue sans transformer l'écran en log brut. + +# Recommandations UX initiales (retour UX intégré) + +- `Delegation` : carte avec flèche `From -> To`, extrait de demande tronqué (~80 chars), accès au détail sur expansion/hover. +- `ToolCall` : carte indentée avec badge outil, état spinner/check/error, args résumés/tronqués. +- `MCPEvent` : bordure latérale/coloration dédiée par serveur ou type de méthode. +- Timeline verticale légère pour relier visuellement les sous-événements au message/agent source. +- Les événements très courts doivent être lissés/batchés pour éviter le clignotement. + +# Anti-bruit / garde-fous + +- Ne pas afficher comme texte brut tous les micro-événements sans hiérarchie. +- Seuil temporel ou batching pour les événements trop fugitifs. +- Possibilité de collapse/groupement pour tool calls répétitifs. +- Limitation du nombre d'événements visibles avant expansion. +- Si un profil n'expose aucun delta ni événement intermédiaire, afficher au minimum l'état occupé/vivant sans simuler un faux stream. + +# Critères d'acceptation + +- Sur les profils riches, l'utilisateur voit les progress/events apparaître avant le `Final`. +- Sur les profils pauvres, l'UI reste honnête et utile (busy/progression minimale) sans faux "thinking". +- Les appels MCP apparaissent au fil de l'eau, pas seulement après le `Final`, si l'information est disponible côté IdeA. +- Les délégations inter-agent sont lisibles : on comprend qui parle à qui et à propos de quoi. +- La vue reste stable et lisible sur conversation longue. \ No newline at end of file diff --git a/.ideai/tickets/157/issue.md b/.ideai/tickets/157/issue.md new file mode 100644 index 0000000..3f19840 --- /dev/null +++ b/.ideai/tickets/157/issue.md @@ -0,0 +1,17 @@ +--- +id: "d49aaae5-0d03-43fe-a51c-2ab5e921045c" +number: 157 +title: "CLI custom: surface all available agent progress, MCP activity, and inter-agent delegation flow" +status: "closed" +priority: "high" +sprint: null +links: [{"target":"#156","kind":"dependsOn"}] +agentRefs: [{"agentId":"8f7da528-58df-4315-97e9-0562230ecc19","role":"assigned"}] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"1ff94b51-3e17-4a39-8543-7715d1ff0f80"} +createdAt: 1785965383914 +updatedAt: 1786014830849 +version: 9 +--- +User-facing feature for the custom CLI/chat surface: expose as much intermediate agent progress as available, distinguish MCP/tool activity visually from regular progress, show which agent is talking to which agent, and display a short excerpt of delegated requests. Must work across as many AI profiles as possible and degrade gracefully when a profile exposes only limited intermediate events. \ No newline at end of file diff --git a/.ideai/tickets/158/carnet.md b/.ideai/tickets/158/carnet.md new file mode 100644 index 0000000..3b04e2b --- /dev/null +++ b/.ideai/tickets/158/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#158" +version: 4 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786007117845 +--- diff --git a/.ideai/tickets/158/issue.md b/.ideai/tickets/158/issue.md new file mode 100644 index 0000000..75272d3 --- /dev/null +++ b/.ideai/tickets/158/issue.md @@ -0,0 +1,17 @@ +--- +id: "67825d87-57d0-47c3-a44f-2916a342c542" +number: 158 +title: "[Bug] popup reprise de conversation intempestive" +status: "closed" +priority: "medium" +sprint: null +links: [] +agentRefs: [{"agentId":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d","role":"assigned"}] +attachments: [] +createdBy: {"kind":"user"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1785965398697 +updatedAt: 1786007117845 +version: 4 +--- +J'ai la popup "Reprise de conversation" qui s'affiche de façon intempestive. Quand j'ajoute une cellule a mon layout, quand je change de layout, quand je change de projet etc. Elle n'a pas a as'afficher, la conversation doit continuer la ou on l'a laissé sans etre perturbée si une tache avant était en cours \ No newline at end of file diff --git a/.ideai/tickets/159/carnet.md b/.ideai/tickets/159/carnet.md new file mode 100644 index 0000000..72788d3 --- /dev/null +++ b/.ideai/tickets/159/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#159" +version: 4 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786007117864 +--- diff --git a/.ideai/tickets/159/issue.md b/.ideai/tickets/159/issue.md new file mode 100644 index 0000000..4d677bb --- /dev/null +++ b/.ideai/tickets/159/issue.md @@ -0,0 +1,19 @@ +--- +id: "dfcbcdbf-2b1d-433a-a168-601c234cefaf" +number: 159 +title: "[UI] Pastille d'activité de projet" +status: "closed" +priority: "medium" +sprint: null +links: [] +agentRefs: [] +attachments: [] +createdBy: {"kind":"user"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1785965966515 +updatedAt: 1786007117864 +version: 4 +--- +J'iamerais ajouter des pastiles d'activités qui se base sur les CLI custom. Quand je bosse sur plusieurs projets a la fois, j'aiemrais pouvoir voir quand un projet a fini de livré une demande. Pour faire simple je veux trois pastilles. Quand aucune custom cli du projet n'a de conversation en cours, je veux une pastille grise a gauche du nom du projet. Quand au moins une custom cli possède uine conversation mais ne travail pas, je veux une pastille fixe verte. Quand au moins une custom cli a une conversation et qu'elle travaille, je veux une pastille orange qui clignote. + +Une cli custom qui travail est une cli custom a qui on a demandé une tache, et qui est en train de la faire (est en reflexion, ecrit du code, est en train d'utiliser un tool mcp, est en attente d'un tool mcp, par exemple en aillant délégué a un agent etc) \ No newline at end of file diff --git a/.ideai/tickets/160/carnet.md b/.ideai/tickets/160/carnet.md new file mode 100644 index 0000000..35a89de --- /dev/null +++ b/.ideai/tickets/160/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#160" +version: 3 +updatedBy: {"kind":"agent","agent_id":"1ff94b51-3e17-4a39-8543-7715d1ff0f80"} +updatedAt: 1786014830849 +--- diff --git a/.ideai/tickets/160/issue.md b/.ideai/tickets/160/issue.md new file mode 100644 index 0000000..d414a14 --- /dev/null +++ b/.ideai/tickets/160/issue.md @@ -0,0 +1,17 @@ +--- +id: "6d8084ea-6b8d-482e-9d6b-0d9bf5edec2b" +number: 160 +title: "CLI UI: remove History button from custom chat toolbar" +status: "closed" +priority: "medium" +sprint: null +links: [] +agentRefs: [{"agentId":"8f7da528-58df-4315-97e9-0562230ecc19","role":"assigned"}] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"1ff94b51-3e17-4a39-8543-7715d1ff0f80"} +createdAt: 1786010666209 +updatedAt: 1786014830849 +version: 3 +--- +Remove the History button from the custom CLI/chat toolbar. User feedback is that it is not useful in this surface and it currently adds clutter around busy-state actions like Cancel. Scope: frontend toolbar only; no conversation persistence redesign. \ No newline at end of file diff --git a/.ideai/tickets/counter.json b/.ideai/tickets/counter.json index 72b66a1..60939aa 100644 --- a/.ideai/tickets/counter.json +++ b/.ideai/tickets/counter.json @@ -1,3 +1,3 @@ { - "nextNumber": 160 + "nextNumber": 161 } \ No newline at end of file diff --git a/.ideai/tickets/index.json b/.ideai/tickets/index.json index 027bda1..4dd85bf 100644 --- a/.ideai/tickets/index.json +++ b/.ideai/tickets/index.json @@ -1981,7 +1981,7 @@ "issueRef": "#151", "path": "151", "title": "CLI UI: chevauchement des boutons dans la barre supérieure pendant une conversation agent", - "status": "open", + "status": "closed", "priority": "medium", "sprint": null, "assignedAgentIds": [], @@ -1989,13 +1989,13 @@ "kind": "agent", "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" }, - "updatedAt": 1785945386695 + "updatedAt": 1786014830849 }, { "issueRef": "#152", "path": "152", "title": "CLI UI: mauvaise mise à l’échelle sur conversation longue, barre de chat hors écran", - "status": "qa", + "status": "closed", "priority": "high", "sprint": null, "assignedAgentIds": [], @@ -2003,13 +2003,13 @@ "kind": "agent", "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" }, - "updatedAt": 1785964233590 + "updatedAt": 1786010223872 }, { "issueRef": "#154", "path": "154", "title": "Foundation: durable agent/chat attachments pipeline with sandbox-safe file access", - "status": "open", + "status": "closed", "priority": "high", "sprint": null, "assignedAgentIds": [], @@ -2017,13 +2017,13 @@ "kind": "agent", "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" }, - "updatedAt": 1785964785338 + "updatedAt": 1786007117802 }, { "issueRef": "#155", "path": "155", "title": "Custom chat: paste image from clipboard into composer", - "status": "open", + "status": "closed", "priority": "medium", "sprint": null, "assignedAgentIds": [], @@ -2031,41 +2031,45 @@ "kind": "agent", "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" }, - "updatedAt": 1785964785374 + "updatedAt": 1786007117827 }, { "issueRef": "#156", "path": "156", "title": "Foundation: unified streaming progress/event model across AI profiles", - "status": "open", + "status": "closed", "priority": "high", "sprint": null, - "assignedAgentIds": [], + "assignedAgentIds": [ + "fe887179-933f-47d4-960f-c3b06827f86c" + ], "createdBy": { "kind": "agent", "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" }, - "updatedAt": 1785965415569 + "updatedAt": 1786014830849 }, { "issueRef": "#157", "path": "157", "title": "CLI custom: surface all available agent progress, MCP activity, and inter-agent delegation flow", - "status": "open", + "status": "closed", "priority": "high", "sprint": null, - "assignedAgentIds": [], + "assignedAgentIds": [ + "8f7da528-58df-4315-97e9-0562230ecc19" + ], "createdBy": { "kind": "agent", "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" }, - "updatedAt": 1785965415603 + "updatedAt": 1786014830849 }, { "issueRef": "#158", "path": "158", "title": "[Bug] popup reprise de conversation intempestive", - "status": "open", + "status": "closed", "priority": "medium", "sprint": null, "assignedAgentIds": [ @@ -2074,20 +2078,36 @@ "createdBy": { "kind": "user" }, - "updatedAt": 1785965476823 + "updatedAt": 1786007117845 }, { "issueRef": "#159", "path": "159", "title": "[UI] Pastille d'activité de projet", - "status": "open", + "status": "closed", "priority": "medium", "sprint": null, "assignedAgentIds": [], "createdBy": { "kind": "user" }, - "updatedAt": 1785966283965 + "updatedAt": 1786007117864 + }, + { + "issueRef": "#160", + "path": "160", + "title": "CLI UI: remove History button from custom chat toolbar", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [ + "8f7da528-58df-4315-97e9-0562230ecc19" + ], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786014830849 } ] } \ No newline at end of file