Files
IdeaSDK/.ideai/tickets/94/issue.md

2.5 KiB

id, number, title, status, priority, sprint, links, agentRefs, createdBy, updatedBy, createdAt, updatedAt, version
id number title status priority sprint links agentRefs createdBy updatedBy createdAt updatedAt version
33a844e0-6a06-46c7-b800-d3497a7f45f4 94 Permissions OpenCode ignorées : opencode.json code en dur bash/edit=ask au lieu de projeter EffectivePermissions closed high null
kind agent_id
agent a6ced819-b893-4213-b003-9e9dc79b9641
kind agent_id
agent a6ced819-b893-4213-b003-9e9dc79b9641
1784821271815 1784823278030 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.