Files
Loki/internal/loki/tool_schema_order.go
T
MichaelandClaude Opus 5.5 b955181bb9 Mode Code : une écriture interdite est refusée dès son chemin, pas après le fichier
Repris du pré-vol d'OpenFox (tool-preflight, 2.0.154).

Un write sur un fichier existant jamais lu était refusé par le tracker…
une fois tout le fichier généré. builder.md demande des fichiers écrits en
entier : un refus pouvait coûter des minutes de décodage pour rien.

- Les schémas write, edit, mem_add et mem_edit annoncent le chemin AVANT
  le contenu. Une map Go sort ses clés par ordre alphabétique : le modèle,
  qui suit l'ordre du schéma, déroulait tout le contenu avant le chemin.
  L'interface nomme aussi le fichier dès le début de la frappe.
- Dès que le chemin d'un write/edit est complet dans le flux, les gardes du
  mode Code (fichier lu, chemin permis) sont vérifiées. Refus : la
  génération est coupée, l'appel réduit à son chemin entre dans
  l'historique avec le refus pour résultat, et le modèle repart (lire le
  fichier d'abord). Rien n'est écrit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 23:40:38 +02:00

51 lines
1.3 KiB
Go

package loki
import (
"bytes"
"encoding/json"
)
// orderedProps : propriétés d'un schéma d'outil sérialisées DANS L'ORDRE donné.
//
// Une map Go sort ses clés par ordre alphabétique : write annonçait content
// AVANT file, edit new avant old. Le modèle écrit ses arguments dans l'ordre
// du schéma — il déroulait donc tout le contenu d'un fichier avant d'en donner
// le chemin. Le chemin d'abord permet de refuser en plein flux une écriture
// interdite (fichier non lu) au lieu d'attendre la fin, et à l'interface de
// nommer le fichier dès le début de la frappe (repris d'OpenFox, 2.0.154).
type orderedProps []propEntry
type propEntry struct {
Key string
Schema map[string]any
}
func (o orderedProps) MarshalJSON() ([]byte, error) {
var b bytes.Buffer
b.WriteByte('{')
for i, p := range o {
if i > 0 {
b.WriteByte(',')
}
k, err := json.Marshal(p.Key)
if err != nil {
return nil, err
}
v, err := json.Marshal(p.Schema)
if err != nil {
return nil, err
}
b.Write(k)
b.WriteByte(':')
b.Write(v)
}
b.WriteByte('}')
return b.Bytes(), nil
}
// preflightRefusal : write/edit refusé pendant le flux, dès que son chemin est
// connu (voir runChat). msg vide = chemin vérifié et accepté.
type preflightRefusal struct {
name, id, file, msg string
}