48 lines
2.5 KiB
Markdown
48 lines
2.5 KiB
Markdown
---
|
|
id: "33a844e0-6a06-46c7-b800-d3497a7f45f4"
|
|
number: 94
|
|
title: "Permissions OpenCode ignorées : opencode.json code en dur bash/edit=ask au lieu de projeter EffectivePermissions"
|
|
status: "closed"
|
|
priority: "high"
|
|
sprint: null
|
|
links: []
|
|
agentRefs: []
|
|
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
|
createdAt: 1784821271815
|
|
updatedAt: 1784823278030
|
|
version: 2
|
|
---
|
|
## Bug
|
|
|
|
Les permissions configurées dans IdeA pour un agent sous profil OpenCode ne sont PAS appliquées dans le `opencode.json` généré. Le bloc `permission` est codé en dur à `{"bash":"ask","edit":"ask"}` quel que soit le réglage IdeA.
|
|
|
|
## Repro
|
|
|
|
Config IdeA (agent OpenCode) : Read=Allow, Write=Deny, Delete=Allow, bash=Allow.
|
|
`opencode.json` généré (run dir) : `"permission":{"bash":"ask","edit":"ask"}`.
|
|
Attendu : `bash` reflète la posture bash (Allow→"allow"), `edit` reflète la posture Write (Deny→"deny").
|
|
|
|
Claude et Codex appliquent correctement les permissions ; seul OpenCode est touché.
|
|
|
|
## Cause racine
|
|
|
|
Le pattern de projection des permissions (`PermissionProjector` + `ProjectorKey::{Claude,Codex}` dans `crates/infrastructure/src/permission/`) est bypassé pour OpenCode. Les générateurs `opencode.json` codent `permission` en dur à 4 endroits :
|
|
|
|
- `crates/application/src/agent/lifecycle.rs:2728-2734` (`opencode_config_json`, variante llamacpp)
|
|
- `crates/application/src/agent/lifecycle.rs:2814-2820` (`opencode_provider_config_json`, variante cloud)
|
|
- `crates/infrastructure/src/assistant/mod.rs:406-412` (`opencode_config_json`, doublon)
|
|
- `crates/infrastructure/src/assistant/mod.rs:494-500` (`opencode_provider_config_json`, doublon)
|
|
|
|
Les call sites (`lifecycle.rs:2361-2378` branche `OpenCodeConfig`, et `assistant/mod.rs:247-256`) ne passent pas les `EffectivePermissions` résolues aux générateurs.
|
|
|
|
## Mapping attendu (à confirmer par Architect)
|
|
|
|
OpenCode `permission` = map tool→"allow"|"ask"|"deny". IdéA → OpenCode :
|
|
- `bash` ← posture bash effective
|
|
- `edit` ← posture Write effective
|
|
- Read/Delete ne sont pas exprimables dans opencode (pas de clé read/delete) — déjà enforcees par le sandbox Landlock (mémoire `permissions-sandbox-system-state`).
|
|
|
|
## Périmètre
|
|
|
|
Backend Rust pur. Validation possible par tests unitaires sur les générateurs (`opencode_provider_config_json` est déjà testé à lifecycle.rs:4413 et assistant/mod.rs:639) sans rebuild AppImage. Validation live = rebuild AppImage + relance IdeA. |