pi-jev-guard 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -49
- package/config/jev-config.example.json +1 -13
- package/extensions/index.ts +82 -421
- package/package.json +1 -1
- package/src/automatic/overlay.ts +256 -206
- package/src/commands.ts +36 -273
- package/src/config.ts +18 -97
- package/src/store-models.ts +0 -47
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ Verifica le risposte con [TypeSafe Jev](https://docs.typesafe.ai) dentro [pi](ht
|
|
|
4
4
|
|
|
5
5
|
- **A richiesta** (default): tool `jev_validate`, comando `/jev check`, skill `jev-review`. Zero verifiche implicite, zero costi se non lo usi.
|
|
6
6
|
- **Domande tipate**: tool `jev_ask` per giudizi calibrati definiti dal modello (noul/choice/score) invece di prosa.
|
|
7
|
-
- **Automatica**:
|
|
7
|
+
- **Automatica**: in `automatic` il gate copre **il modello selezionato e ogni cambio modello**, senza alias o registrazioni extra: trattiene la risposta, la verifica con Jev e pubblica solo l'output approvato (con rigenerazione privata su `block`). Stessa auth del provider: nessun login extra, funziona anche con Codex/OAuth.
|
|
8
8
|
- **Giudice output** (solo `automatic`, fail-open): dopo ogni `bash` cerca secret nel testo e classifica i fallimenti, allegando un consiglio al risultato.
|
|
9
9
|
- **Verifica progetto** (opt-in): footer deterministico da `edit`/`write` osservati e check autorizzati da override locale, manifest globale utente o profilo comune integrato; il modello può eseguire soltanto quegli id, mai shell arbitraria.
|
|
10
10
|
|
|
@@ -30,7 +30,7 @@ export TYPESAFE_API_KEY="..." # backend typesafe diretto
|
|
|
30
30
|
Le nuove sessioni partono in `on-demand`: i modelli normali restano selezionabili e nessuna verifica parte da sola.
|
|
31
31
|
`/jev mode automatic|on-demand` salva la scelta **nella sessione**, non nella config globale.
|
|
32
32
|
La scelta sopravvive a `/reload`, riavvio e `/resume`; fork e `/tree` seguono lo stato del ramo.
|
|
33
|
-
Credenziali
|
|
33
|
+
Credenziali e policy restano condivise.
|
|
34
34
|
|
|
35
35
|
Migrazione: il vecchio `mode` in `jev-config.json` non controlla più l'estensione
|
|
36
36
|
(resta compatibile con i consumer standalone). Nelle sessioni senza uno stato salvato,
|
|
@@ -48,13 +48,16 @@ In chat, l'LLM può chiamare `jev_validate` per controlli mirati.
|
|
|
48
48
|
## Uso protetto
|
|
49
49
|
|
|
50
50
|
```text
|
|
51
|
-
/
|
|
52
|
-
/jev
|
|
53
|
-
/jev
|
|
54
|
-
/jev untwin openai-codex gpt-5.6-terra # rimuove uno solo
|
|
55
|
-
/jev mode automatic # seleziona il primario + attiva enforcement
|
|
51
|
+
/model # scegli qualunque modello (o più modelli in sessioni diverse)
|
|
52
|
+
/jev mode automatic # ogni risposta passa dal gate Jev
|
|
53
|
+
/jev off # gate disattivato, provider ripristinati
|
|
56
54
|
```
|
|
57
55
|
|
|
56
|
+
Nessun alias `__jev`, nessuna registrazione: il gate lavora sullo stesso
|
|
57
|
+
oggetto provider e riusa la credenziale già configurata (env, stored,
|
|
58
|
+
OAuth/SSO come Codex business plan). I vecchi alias delle versioni ≤ 0.6.x
|
|
59
|
+
vengono normalizzati automaticamente ai modelli originali.
|
|
60
|
+
|
|
58
61
|
### Backend e chiavi
|
|
59
62
|
|
|
60
63
|
Due backend, stessa policy e stesse regole:
|
|
@@ -78,41 +81,17 @@ config), quindi i due backend possono coesistere. Precedenza: variabile
|
|
|
78
81
|
d'ambiente → file del backend → file generico `jev.apiKeyFile` → percorso
|
|
79
82
|
canonico. Vedi `config/jev-config.example.json`.
|
|
80
83
|
|
|
81
|
-
**
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
Il **primario** salvato è il target di auto-selezione e revert; un twin già selezionato
|
|
85
|
-
nella sessione viene mantenuto al reload, anche se non è il primario.
|
|
86
|
-
|
|
87
|
-
Nessun login extra: i twin vivono nello stesso provider e riusano la credenziale già configurata (env, stored, OAuth/SSO come Codex business plan). I modelli originali restano intatti e selezionabili.
|
|
88
|
-
|
|
89
|
-
I twin salvati vengono registrati prima del ripristino del modello anche in
|
|
90
|
-
`on-demand`: registrazione e attivazione del gate sono indipendenti. Il suffisso
|
|
91
|
-
`__jev` è locale e non viene inviato al provider; anche la cronologia viene
|
|
92
|
-
normalizzata sull'identità originale senza perdere firme o metadati di continuazione.
|
|
93
|
-
|
|
94
|
-
Torna normale con `/jev mode on-demand`, che seleziona anche il modello originale.
|
|
95
|
-
In `automatic`, selezionare un modello non protetto lo fa ritornare
|
|
96
|
-
subito al twin (enforcement a livello selezione).
|
|
97
|
-
`/jev upstream` senza argomenti ripristina tutti i twin salvati, `/jev untwin P M`
|
|
98
|
-
ne rimuove uno solo, `/jev off` li rimuove tutti
|
|
99
|
-
(e salva on-demand nella sessione, selezionando l'originale prima di rimuovere il routing).
|
|
100
|
-
`/jev off` conserva il catalogo salvato: al reload gli alias tornano disponibili,
|
|
101
|
-
ma il gate rimane disattivato.
|
|
84
|
+
**Qualunque modello**: in `automatic` il gate segue la selezione — cambi
|
|
85
|
+
modello con `/model` e ogni risposta resta coperta, senza passaggi di setup.
|
|
86
|
+
Il catalogo resta quello di pi: nessun alias, nessun modulo extra nel picker.
|
|
102
87
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
```json
|
|
107
|
-
"enabledModels": ["openai-codex/*__jev", "deepseek/*__jev", "...altri pattern..."]
|
|
108
|
-
```
|
|
88
|
+
Torna normale con `/jev mode on-demand` (o `/jev off`, che ripristina anche i
|
|
89
|
+
metodi originali dei provider). Entrambe le scelte vivono nella sessione e
|
|
90
|
+
sopravvivono a `/reload` e `/resume`.
|
|
109
91
|
|
|
110
|
-
Dopo aver aggiunto un twin serve `/reload` (lo scope è risolto all'avvio della sessione).
|
|
111
|
-
`/jev upstream` avvisa subito quando il twin appena creato è fuori dal picker.
|
|
112
92
|
L'installazione punta alla cartella: dopo un aggiornamento del codice basta `/reload`.
|
|
113
93
|
|
|
114
|
-
Headless/CI: `JEV_MODE=automatic
|
|
115
|
-
il guarded nelle sessioni senza uno stato Jev salvato.
|
|
94
|
+
Headless/CI: `JEV_MODE=automatic` parte già col gate attivo sul modello usato.
|
|
116
95
|
|
|
117
96
|
Un hold `[JEV — OUTPUT NON PUBBLICATO]` interrompe intenzionalmente il turno:
|
|
118
97
|
controlla `/jev last`. Non viene aggirato con un proseguimento automatico.
|
|
@@ -130,10 +109,9 @@ del proprietario). Così i controlli di ownership altrui non vedono mai una
|
|
|
130
109
|
aborted` istantaneo). Quando il proprietario sostituisce l'oggetto, il nuovo
|
|
131
110
|
viene patchato ex-novo agli hook (`input`, `before_agent_start`, `turn_start`,
|
|
132
111
|
`model_select`, `message_end`); `/jev off` ripristina i metodi originali senza
|
|
133
|
-
`unregister
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
gate toglie il suffisso registrando `jev-gate-bypass` e avvisando in TUI,
|
|
112
|
+
`unregister` (`jev-overlay-reassert` solo quando un oggetto nuovo viene patchato).
|
|
113
|
+
Rete di sicurezza legacy: se un id `__jev` delle vecchie versioni sfugge nel
|
|
114
|
+
payload, viene normalizzato al modello originale registrando `jev-gate-bypass`,
|
|
137
115
|
perché quel turno non è passato dalla verifica.
|
|
138
116
|
Le conferme per comandi di rete sospetti attendono invece una decisione esplicita;
|
|
139
117
|
la normale sequenza tool → risposta successiva continua senza un nuovo prompt.
|
|
@@ -191,7 +169,7 @@ diventare “test passati”.
|
|
|
191
169
|
|
|
192
170
|
#### Nuovi progetti: zero manifest locale
|
|
193
171
|
|
|
194
|
-
Una volta, in una sessione
|
|
172
|
+
Una volta, in una sessione pi, abilita la modalità scelta:
|
|
195
173
|
|
|
196
174
|
```text
|
|
197
175
|
/jev verification repair
|
|
@@ -229,8 +207,8 @@ Dopo un edit il modello può scegliere solo id già acquisiti:
|
|
|
229
207
|
```
|
|
230
208
|
|
|
231
209
|
Il tool LLM `jev_verify` ha lo stesso vincolo, richiede un progetto trusted e
|
|
232
|
-
non accetta shell arbitraria. Footer/repair/hold operano
|
|
233
|
-
|
|
210
|
+
non accetta shell arbitraria. Footer/repair/hold operano in `automatic`;
|
|
211
|
+
`/jev verify` è utilizzabile manualmente anche senza footer.
|
|
234
212
|
|
|
235
213
|
#### Override per progetti speciali
|
|
236
214
|
|
|
@@ -282,7 +260,7 @@ quelle di `edit`/`write`: una modifica shell non viene attribuita al modello.
|
|
|
282
260
|
## Configurazione
|
|
283
261
|
|
|
284
262
|
`~/.pi/agent/jev-config.json` (o `$JEV_CONFIG`). Env: `JEV_MODE`, `JEV_BACKEND`
|
|
285
|
-
(`openrouter`|`typesafe`|`auto`), `JEV_MODEL
|
|
263
|
+
(`openrouter`|`typesafe`|`auto`), `JEV_MODEL`.
|
|
286
264
|
Vedi `config/jev-config.example.json` per tutti i campi.
|
|
287
265
|
|
|
288
266
|
Chiave Jev (ordine: env vince sul file): `OPENROUTER_API_KEY` o
|
|
@@ -324,9 +302,9 @@ echo '{"requirements":"...","candidate":"..."}' | npm run jev-check
|
|
|
324
302
|
## Limiti onesti
|
|
325
303
|
|
|
326
304
|
- `pass` = "supera i controlli configurati", non "corretto". Compilazione e test restano necessari.
|
|
327
|
-
- Il gate copre
|
|
328
|
-
|
|
329
|
-
|
|
305
|
+
- Il gate copre i turni che passano dal provider patchato in `automatic`;
|
|
306
|
+
se un provider non è patchato (raro: sostituzione concorrente) il turno
|
|
307
|
+
passa con una nota `jev-guarded`/diagnostica dichiarata.
|
|
330
308
|
- Soglie calibrate su 20 casi (`docs/calibration-2026-09-19.md`): buone per
|
|
331
309
|
iniziare, da rivalutare con corpus più ampio.
|
|
332
310
|
- Jev è un giudice probabilistico, non un verificatore formale.
|
|
@@ -24,19 +24,7 @@
|
|
|
24
24
|
"automatic": {
|
|
25
25
|
"transport": "provider-gate",
|
|
26
26
|
"maxRegenerations": 2,
|
|
27
|
-
"
|
|
28
|
-
"twins": [
|
|
29
|
-
{
|
|
30
|
-
"provider": "deepseek",
|
|
31
|
-
"model": "deepseek-flash"
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"provider": "openai-codex",
|
|
35
|
-
"model": "gpt-5.6-terra"
|
|
36
|
-
}
|
|
37
|
-
],
|
|
38
|
-
"upstreamProvider": "deepseek",
|
|
39
|
-
"upstreamModel": "deepseek-flash"
|
|
27
|
+
"repairOnReview": true
|
|
40
28
|
},
|
|
41
29
|
"limits": {
|
|
42
30
|
"maxPayloadBytes": 120000,
|