@nac3/forge-cli 1.24.1 → 1.26.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/dist/chat/agent_session.d.ts.map +1 -1
- package/dist/chat/agent_session.js +132 -12
- package/dist/chat/agent_session.js.map +1 -1
- package/dist/chat/cache_ttl.d.ts +143 -0
- package/dist/chat/cache_ttl.d.ts.map +1 -0
- package/dist/chat/cache_ttl.js +165 -0
- package/dist/chat/cache_ttl.js.map +1 -0
- package/dist/chat/claude.d.ts +1 -0
- package/dist/chat/claude.d.ts.map +1 -1
- package/dist/chat/claude.js +47 -5
- package/dist/chat/claude.js.map +1 -1
- package/dist/chat/claude_cli.d.ts +24 -0
- package/dist/chat/claude_cli.d.ts.map +1 -1
- package/dist/chat/claude_cli.js +76 -10
- package/dist/chat/claude_cli.js.map +1 -1
- package/dist/chat/panel.d.ts.map +1 -1
- package/dist/chat/panel.js +133 -21
- package/dist/chat/panel.js.map +1 -1
- package/dist/chat/server.d.ts.map +1 -1
- package/dist/chat/server.js +32 -3
- package/dist/chat/server.js.map +1 -1
- package/dist/chat/tools/evidence.d.ts +15 -0
- package/dist/chat/tools/evidence.d.ts.map +1 -1
- package/dist/chat/tools/evidence.js +16 -0
- package/dist/chat/tools/evidence.js.map +1 -1
- package/dist/chat/tools/keys.d.ts.map +1 -1
- package/dist/chat/tools/keys.js +22 -2
- package/dist/chat/tools/keys.js.map +1 -1
- package/dist/chat/tools/pending.d.ts +3 -0
- package/dist/chat/tools/pending.d.ts.map +1 -1
- package/dist/chat/tools/pending.js +40 -3
- package/dist/chat/tools/pending.js.map +1 -1
- package/dist/chat/tools/session_verbs.d.ts +83 -0
- package/dist/chat/tools/session_verbs.d.ts.map +1 -1
- package/dist/chat/tools/session_verbs.js +251 -18
- package/dist/chat/tools/session_verbs.js.map +1 -1
- package/dist/chat/tools/shell.d.ts +11 -0
- package/dist/chat/tools/shell.d.ts.map +1 -1
- package/dist/chat/tools/shell.js +68 -1
- package/dist/chat/tools/shell.js.map +1 -1
- package/dist/commands/chat.d.ts +6 -0
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +25 -0
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/limits.d.ts.map +1 -1
- package/dist/commands/limits.js +85 -6
- package/dist/commands/limits.js.map +1 -1
- package/dist/commands/pending.d.ts.map +1 -1
- package/dist/commands/pending.js +26 -1
- package/dist/commands/pending.js.map +1 -1
- package/dist/commands/urazuke.d.ts.map +1 -1
- package/dist/commands/urazuke.js +82 -0
- package/dist/commands/urazuke.js.map +1 -1
- package/dist/core/brain_pin.d.ts +74 -0
- package/dist/core/brain_pin.d.ts.map +1 -0
- package/dist/core/brain_pin.js +113 -0
- package/dist/core/brain_pin.js.map +1 -0
- package/dist/core/cost_router.d.ts.map +1 -1
- package/dist/core/cost_router.js +56 -0
- package/dist/core/cost_router.js.map +1 -1
- package/dist/core/limits_config.d.ts +61 -0
- package/dist/core/limits_config.d.ts.map +1 -1
- package/dist/core/limits_config.js +78 -0
- package/dist/core/limits_config.js.map +1 -1
- package/dist/core/provider_keys.d.ts +33 -0
- package/dist/core/provider_keys.d.ts.map +1 -1
- package/dist/core/provider_keys.js +40 -3
- package/dist/core/provider_keys.js.map +1 -1
- package/dist/docs/doctrine/session-orchestration.md +109 -86
- package/dist/llm/sse_stream.d.ts +5 -0
- package/dist/llm/sse_stream.d.ts.map +1 -1
- package/dist/llm/sse_stream.js +26 -3
- package/dist/llm/sse_stream.js.map +1 -1
- package/dist/mcp/bridge_registry.d.ts +1 -1
- package/dist/nac3/internal_manifest.d.ts.map +1 -1
- package/dist/nac3/internal_manifest.js +2 -0
- package/dist/nac3/internal_manifest.js.map +1 -1
- package/dist/pending/store.d.ts +12 -0
- package/dist/pending/store.d.ts.map +1 -1
- package/dist/pending/store.js +20 -0
- package/dist/pending/store.js.map +1 -1
- package/dist/pending/types.d.ts +11 -0
- package/dist/pending/types.d.ts.map +1 -1
- package/dist/pending/types.js.map +1 -1
- package/dist/tasks/supervisor.d.ts +31 -0
- package/dist/tasks/supervisor.d.ts.map +1 -1
- package/dist/tasks/supervisor.js +61 -5
- package/dist/tasks/supervisor.js.map +1 -1
- package/dist/telemetry/usage.d.ts +107 -0
- package/dist/telemetry/usage.d.ts.map +1 -1
- package/dist/telemetry/usage.js +186 -13
- package/dist/telemetry/usage.js.map +1 -1
- package/dist/urazuke/close_gate.d.ts +47 -3
- package/dist/urazuke/close_gate.d.ts.map +1 -1
- package/dist/urazuke/close_gate.js +57 -3
- package/dist/urazuke/close_gate.js.map +1 -1
- package/dist/urazuke/evidence.d.ts +10 -0
- package/dist/urazuke/evidence.d.ts.map +1 -1
- package/dist/urazuke/evidence.js +63 -3
- package/dist/urazuke/evidence.js.map +1 -1
- package/dist/urazuke/external_audit.d.ts +89 -0
- package/dist/urazuke/external_audit.d.ts.map +1 -0
- package/dist/urazuke/external_audit.js +309 -0
- package/dist/urazuke/external_audit.js.map +1 -0
- package/dist/urazuke/receipts.d.ts +28 -1
- package/dist/urazuke/receipts.d.ts.map +1 -1
- package/dist/urazuke/receipts.js +59 -6
- package/dist/urazuke/receipts.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/doctrine/session-orchestration.md +109 -86
- package/package.json +1 -1
- package/src/i18n/catalogs/ar.json +570 -568
- package/src/i18n/catalogs/de.json +570 -568
- package/src/i18n/catalogs/en.json +570 -568
- package/src/i18n/catalogs/es.json +570 -568
- package/src/i18n/catalogs/fr.json +570 -568
- package/src/i18n/catalogs/hi.json +570 -568
- package/src/i18n/catalogs/it.json +570 -568
- package/src/i18n/catalogs/ja.json +570 -568
- package/src/i18n/catalogs/pt.json +570 -568
- package/src/i18n/catalogs/zh.json +570 -568
package/dist/telemetry/usage.js
CHANGED
|
@@ -29,11 +29,20 @@
|
|
|
29
29
|
*/
|
|
30
30
|
import { promises as fs } from 'node:fs';
|
|
31
31
|
import path from 'node:path';
|
|
32
|
+
import os from 'node:os';
|
|
32
33
|
import { configDir } from '../license/index.js';
|
|
33
34
|
/* Defaults reflect early-2026 Anthropic + Google Cloud pricing.
|
|
34
35
|
* Users can override via ~/.yujin-forge/pricing.json. */
|
|
35
36
|
export const DEFAULT_PRICING = {
|
|
36
37
|
models: {
|
|
38
|
+
/* Linea vigente al 2026-11-03. Faltaba entera, y sin fila el evento se
|
|
39
|
+
* valuaba en CERO: el reporte decia que una sesion de Opus 5 no habia
|
|
40
|
+
* costado nada (PND-273). */
|
|
41
|
+
'claude-fable-5-1': { in_per_mtok: 10, out_per_mtok: 50 },
|
|
42
|
+
'claude-fable-5': { in_per_mtok: 10, out_per_mtok: 50 },
|
|
43
|
+
'claude-opus-5': { in_per_mtok: 5, out_per_mtok: 25 },
|
|
44
|
+
'claude-opus-4-8': { in_per_mtok: 5, out_per_mtok: 25 },
|
|
45
|
+
'claude-sonnet-5': { in_per_mtok: 2, out_per_mtok: 10 },
|
|
37
46
|
'claude-opus-4-7': { in_per_mtok: 15, out_per_mtok: 75 },
|
|
38
47
|
'claude-opus-4': { in_per_mtok: 15, out_per_mtok: 75 },
|
|
39
48
|
'claude-sonnet-4-6': { in_per_mtok: 3, out_per_mtok: 15 },
|
|
@@ -47,27 +56,150 @@ export const DEFAULT_PRICING = {
|
|
|
47
56
|
tts_per_million_chars: 16, /* Google Cloud TTS Neural2 */
|
|
48
57
|
stt_per_minute: 0.006, /* Google Cloud STT enhanced */
|
|
49
58
|
},
|
|
59
|
+
cache: {
|
|
60
|
+
read_multiplier: 0.10,
|
|
61
|
+
write_5m_multiplier: 1.25,
|
|
62
|
+
write_1h_multiplier: 2.00,
|
|
63
|
+
},
|
|
50
64
|
};
|
|
51
|
-
|
|
52
|
-
|
|
65
|
+
/** Normalizar el id de modelo para buscarlo en la tabla de precios.
|
|
66
|
+
*
|
|
67
|
+
* POR QUE (PND-273): el camino CLI informa el id con la fecha pegada
|
|
68
|
+
* ("claude-haiku-4-5-20251001"), y la busqueda era exacta, asi que NINGUN
|
|
69
|
+
* turno del camino CLI encontraba su fila y todos se valuaban en cero. La
|
|
70
|
+
* fecha no cambia el precio: se saca antes de buscar. */
|
|
71
|
+
export function normaliseModelId(model) {
|
|
72
|
+
return String(model || '').replace(/-20\d{6}$/, '');
|
|
53
73
|
}
|
|
54
|
-
function
|
|
55
|
-
|
|
74
|
+
function priceFor(pricing, model) {
|
|
75
|
+
const m = pricing.models ?? {};
|
|
76
|
+
return m[model] ?? m[normaliseModelId(model)];
|
|
56
77
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
78
|
+
/** Valuar la ENTRADA de un evento en dolares.
|
|
79
|
+
*
|
|
80
|
+
* Con desglose: cada componente a su multiplicador. Sin desglose (eventos
|
|
81
|
+
* viejos): `tokens_in` a precio base, que es lo unico que se sabe de ellos
|
|
82
|
+
* -- y se declara como tal en el reporte para que nadie compare peras con
|
|
83
|
+
* manzanas. */
|
|
84
|
+
export function inputUsd(ev, base_per_mtok, cache) {
|
|
85
|
+
const tieneDesglose = typeof ev.tokens_fresh === 'number'
|
|
86
|
+
|| typeof ev.tokens_cache_write === 'number'
|
|
87
|
+
|| typeof ev.tokens_cache_read === 'number';
|
|
88
|
+
if (!tieneDesglose) {
|
|
89
|
+
return ((ev.tokens_in ?? 0) / 1_000_000) * base_per_mtok;
|
|
90
|
+
}
|
|
91
|
+
const mulLectura = cache?.read_multiplier ?? 0.10;
|
|
92
|
+
const mulEscritura = ev.cache_ttl === '1h'
|
|
93
|
+
? (cache?.write_1h_multiplier ?? 2.00)
|
|
94
|
+
: (cache?.write_5m_multiplier ?? 1.25);
|
|
95
|
+
const porMtok = base_per_mtok / 1_000_000;
|
|
96
|
+
return (ev.tokens_fresh ?? 0) * porMtok
|
|
97
|
+
+ (ev.tokens_cache_write ?? 0) * porMtok * mulEscritura
|
|
98
|
+
+ (ev.tokens_cache_read ?? 0) * porMtok * mulLectura;
|
|
99
|
+
}
|
|
100
|
+
/** La bateria NO escribe en la telemetria del dueno.
|
|
101
|
+
*
|
|
102
|
+
* MEDIDO AL CABLEAR EL DESGLOSE (2026-11-03, PND-273): de los 9.062
|
|
103
|
+
* eventos de la ventana de 30 dias en el usage.jsonl de la maquina, 2.347
|
|
104
|
+
* -- el 26% -- tenian modelo "claude", "m" o "claude-test", con marca de
|
|
105
|
+
* tiempo exacta de las corridas de la bateria de hoy. Son los tests que
|
|
106
|
+
* ejercitan ClaudeClient con un fetch falso y no aislan YF_CONFIG_DIR:
|
|
107
|
+
* recordUsage les escribe en el archivo real.
|
|
108
|
+
*
|
|
109
|
+
* Por que importa y no es cosmetico: este archivo es la unica fuente del
|
|
110
|
+
* reporte de costos, y el reporte es lo que acaba de volverse exacto. Una
|
|
111
|
+
* bateria que le mete un cuarto de los eventos lo vuelve inexacto de
|
|
112
|
+
* nuevo, por otra puerta -- y los eventos de test valen cero dolares, asi
|
|
113
|
+
* que bajan el promedio y hacen parecer mas barato de lo que es.
|
|
114
|
+
*
|
|
115
|
+
* Por que se frena ACA y no moviendo YF_CONFIG_DIR para toda la bateria:
|
|
116
|
+
* mover la config entera es un override ANCHO, y este repositorio ya tiene
|
|
117
|
+
* la cicatriz de uno (src/chat/instance_lock.ts: "un override angosto es
|
|
118
|
+
* el arreglo; uno ancho era el bug"). Hay tests que SI necesitan la config
|
|
119
|
+
* real. La telemetria, en cambio, no es nunca lo que un test afirma: el
|
|
120
|
+
* que mide costos se arma su propio YF_CONFIG_DIR, y ahi esta funcion no
|
|
121
|
+
* se niega -- solo se niega al archivo de la MAQUINA.
|
|
122
|
+
*
|
|
123
|
+
* Un test que quiera verificar el recibo pone su YF_CONFIG_DIR y sigue
|
|
124
|
+
* andando, que es como esta escrito tests/cache-ttl-y-desglose.test.ts. */
|
|
125
|
+
export function telemetryWritesAllowed(env = process.env) {
|
|
126
|
+
return usageDestination(env).allowed;
|
|
127
|
+
}
|
|
128
|
+
/** La carpeta de configuracion de la MAQUINA: la del dueno, la que ningun
|
|
129
|
+
* test puede tocar. Se calcula aparte de configDir() a proposito -- hace
|
|
130
|
+
* falta poder comparar el destino CONTRA ella. */
|
|
131
|
+
function carpetaDeLaMaquina(env = process.env) {
|
|
132
|
+
const home = env['USERPROFILE'] || env['HOME'] || os.homedir();
|
|
133
|
+
return path.join(home, '.yujin-forge');
|
|
134
|
+
}
|
|
135
|
+
function mismaCarpeta(a, b) {
|
|
136
|
+
const n = (x) => path.resolve(x).replace(/[\\/]+$/, '').toLowerCase();
|
|
137
|
+
return n(a) === n(b);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* EL DESTINO DEL RECIBO, DECIDIDO DE UNA SOLA VEZ Y SIN AWAITS EN EL MEDIO.
|
|
141
|
+
*
|
|
142
|
+
* MEDIDO EL 2026-11-03, DESPUES DE DECLARAR ESTO ARREGLADO (y por eso esta
|
|
143
|
+
* escrito aca y no solo en un commit). La guarda de arriba, sola, NO
|
|
144
|
+
* alcanzaba: la bateria completa de 5.777 pruebas siguio escribiendo CUATRO
|
|
145
|
+
* eventos en el usage.jsonl del dueno. La causa es una carrera, no un
|
|
146
|
+
* permiso:
|
|
147
|
+
*
|
|
148
|
+
* 1. el test pone YF_CONFIG_DIR y llama al cliente;
|
|
149
|
+
* 2. el cliente hace `void recordUsage(...)` -- no lo espera;
|
|
150
|
+
* 3. recordUsage pasa la guarda (YF_CONFIG_DIR esta puesto) y se duerme
|
|
151
|
+
* en el primer await;
|
|
152
|
+
* 4. el test termina, su afterEach BORRA YF_CONFIG_DIR y borra el tmp;
|
|
153
|
+
* 5. recien ahi recordUsage despierta, llama usageFile() -> configDir()
|
|
154
|
+
* -- que lee el entorno DE NUEVO, y ya no esta -- y appendea en
|
|
155
|
+
* ~/.yujin-forge/usage.jsonl.
|
|
156
|
+
*
|
|
157
|
+
* La guarda miraba el entorno en el momento correcto; el PATH se resolvia
|
|
158
|
+
* en otro. Dos lecturas del mismo entorno en dos instantes distintos es la
|
|
159
|
+
* forma general del defecto, y por eso el arreglo no es mover la guarda:
|
|
160
|
+
* es resolver el destino COMPLETO antes del primer await y no volver a
|
|
161
|
+
* mirar el entorno en esa llamada.
|
|
162
|
+
*
|
|
163
|
+
* Y fail-closed: dentro de la bateria se niega TAMBIEN cuando el
|
|
164
|
+
* YF_CONFIG_DIR declarado apunta a la carpeta de la maquina. Si alguien
|
|
165
|
+
* vuelve a introducir una lectura tardia del entorno, el peor caso es que
|
|
166
|
+
* un recibo se pierda en un test, no que contamine la unica medicion de
|
|
167
|
+
* costo honesta que hay.
|
|
168
|
+
*/
|
|
169
|
+
export function usageDestination(env = process.env) {
|
|
170
|
+
const override = env['YF_CONFIG_DIR'];
|
|
171
|
+
const tiene = typeof override === 'string' && override.trim() !== '';
|
|
172
|
+
const dir = tiene ? override.trim() : carpetaDeLaMaquina(env);
|
|
173
|
+
const enBateria = env['VITEST'] === 'true' || env['VITEST'] === '1';
|
|
174
|
+
if (enBateria) {
|
|
175
|
+
if (!tiene) {
|
|
176
|
+
return { allowed: false, why: 'bateria sin YF_CONFIG_DIR: el recibo iria al archivo del dueno' };
|
|
177
|
+
}
|
|
178
|
+
if (mismaCarpeta(dir, carpetaDeLaMaquina(env))) {
|
|
179
|
+
return { allowed: false, why: 'bateria con YF_CONFIG_DIR apuntando a la carpeta de la maquina (' + dir + ')' };
|
|
180
|
+
}
|
|
60
181
|
}
|
|
61
|
-
|
|
182
|
+
return { allowed: true, dir, file: path.join(dir, 'usage.jsonl') };
|
|
183
|
+
}
|
|
184
|
+
function pricingFile() {
|
|
185
|
+
return path.join(configDir(), 'pricing.json');
|
|
62
186
|
}
|
|
63
187
|
/**
|
|
64
188
|
* Append a usage event. Never throws -- failures swallowed.
|
|
65
189
|
*/
|
|
66
190
|
export async function recordUsage(ev) {
|
|
67
191
|
try {
|
|
68
|
-
|
|
192
|
+
/* Primero el destino, y de aca en adelante NO se vuelve a leer el
|
|
193
|
+
* entorno: ver usageDestination(). */
|
|
194
|
+
const destino = usageDestination();
|
|
195
|
+
if (!destino.allowed || !destino.file || !destino.dir)
|
|
196
|
+
return;
|
|
69
197
|
const line = { ts: ev.ts ?? new Date().toISOString(), ...ev };
|
|
70
|
-
|
|
198
|
+
try {
|
|
199
|
+
await fs.mkdir(destino.dir, { recursive: true });
|
|
200
|
+
}
|
|
201
|
+
catch { /* best effort */ }
|
|
202
|
+
await fs.appendFile(destino.file, JSON.stringify(line) + '\n', 'utf-8');
|
|
71
203
|
}
|
|
72
204
|
catch {
|
|
73
205
|
/* swallow -- telemetry must never break user flow */
|
|
@@ -83,6 +215,7 @@ export async function loadPricing() {
|
|
|
83
215
|
return {
|
|
84
216
|
models: { ...(DEFAULT_PRICING.models ?? {}), ...(override.models ?? {}) },
|
|
85
217
|
voice: { ...(DEFAULT_PRICING.voice ?? {}), ...(override.voice ?? {}) },
|
|
218
|
+
cache: { ...(DEFAULT_PRICING.cache ?? {}), ...(override.cache ?? {}) },
|
|
86
219
|
};
|
|
87
220
|
}
|
|
88
221
|
catch {
|
|
@@ -94,7 +227,9 @@ export async function loadPricing() {
|
|
|
94
227
|
*/
|
|
95
228
|
export async function readUsage() {
|
|
96
229
|
try {
|
|
97
|
-
|
|
230
|
+
/* La LECTURA no pasa por usageDestination(): leer el archivo del dueno
|
|
231
|
+
* no lo contamina, y un reporte de costos tiene que poder leerlo. */
|
|
232
|
+
const raw = await fs.readFile(path.join(configDir(), 'usage.jsonl'), 'utf-8');
|
|
98
233
|
return raw.split('\n')
|
|
99
234
|
.filter((l) => l.trim().length > 0)
|
|
100
235
|
.map((l) => {
|
|
@@ -129,6 +264,7 @@ export async function computeCosts(sinceDays = 30) {
|
|
|
129
264
|
events_total: events.length,
|
|
130
265
|
events_window: inWindow.length,
|
|
131
266
|
window_label: sinceDays === 0 ? 'all-time' : 'last ' + sinceDays + ' days',
|
|
267
|
+
input: { fresh: 0, cache_write: 0, cache_read: 0, cache_write_1h: 0, events_sin_desglose: 0 },
|
|
132
268
|
subscription: { events: 0, tokens_in: 0, tokens_out: 0 },
|
|
133
269
|
};
|
|
134
270
|
for (const ev of inWindow) {
|
|
@@ -143,9 +279,25 @@ export async function computeCosts(sinceDays = 30) {
|
|
|
143
279
|
}
|
|
144
280
|
if (ev.kind.startsWith('claude.')) {
|
|
145
281
|
const m = ev.model ?? 'unknown';
|
|
146
|
-
const p = pricing
|
|
282
|
+
const p = priceFor(pricing, m);
|
|
283
|
+
/* El desglose se acumula para TODOS los eventos de modelo, incluidos
|
|
284
|
+
* los de suscripcion: ahi no hay dolares pero si hay consumo del plan,
|
|
285
|
+
* y la re-escritura de cache lo quema igual. */
|
|
286
|
+
const tieneDesglose = typeof ev.tokens_fresh === 'number'
|
|
287
|
+
|| typeof ev.tokens_cache_write === 'number'
|
|
288
|
+
|| typeof ev.tokens_cache_read === 'number';
|
|
289
|
+
if (tieneDesglose) {
|
|
290
|
+
breakdown.input.fresh += ev.tokens_fresh ?? 0;
|
|
291
|
+
breakdown.input.cache_write += ev.tokens_cache_write ?? 0;
|
|
292
|
+
breakdown.input.cache_read += ev.tokens_cache_read ?? 0;
|
|
293
|
+
if (ev.cache_ttl === '1h')
|
|
294
|
+
breakdown.input.cache_write_1h += ev.tokens_cache_write ?? 0;
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
breakdown.input.events_sin_desglose += 1;
|
|
298
|
+
}
|
|
147
299
|
if (p && !bySubscription) {
|
|
148
|
-
usd = (
|
|
300
|
+
usd = inputUsd(ev, p.in_per_mtok, pricing.cache)
|
|
149
301
|
+ ((ev.tokens_out ?? 0) / 1_000_000) * p.out_per_mtok;
|
|
150
302
|
}
|
|
151
303
|
if (!breakdown.by_model[m]) {
|
|
@@ -186,6 +338,27 @@ export function formatCosts(b) {
|
|
|
186
338
|
lines.push('Events total: ' + b.events_total);
|
|
187
339
|
lines.push('Events in window:' + b.events_window);
|
|
188
340
|
lines.push('Total USD: $' + b.total_usd.toFixed(4));
|
|
341
|
+
/* El desglose de la entrada, que es lo que hace comparable el numero de
|
|
342
|
+
* arriba: tres componentes con precios que difieren doce veces. */
|
|
343
|
+
const inTot = b.input.fresh + b.input.cache_write + b.input.cache_read;
|
|
344
|
+
if (inTot > 0) {
|
|
345
|
+
const pct = (n) => (inTot > 0 ? (100 * n / inTot).toFixed(0) : '0') + '%';
|
|
346
|
+
lines.push('Entrada: ' + inTot + ' tokens'
|
|
347
|
+
+ ' frescos=' + b.input.fresh + ' (' + pct(b.input.fresh) + ', 1x)'
|
|
348
|
+
+ ' cache escrita=' + b.input.cache_write + ' (' + pct(b.input.cache_write) + ', '
|
|
349
|
+
+ (b.input.cache_write_1h > 0 ? '1,25x/2x' : '1,25x') + ')'
|
|
350
|
+
+ ' cache leida=' + b.input.cache_read + ' (' + pct(b.input.cache_read) + ', 0,10x)');
|
|
351
|
+
if (b.input.cache_write > b.input.cache_read && b.input.cache_read > 0) {
|
|
352
|
+
lines.push(' AVISO: se escribio a la cache MAS de lo que se leyo. '
|
|
353
|
+
+ 'Un prefijo que se re-escribe en vez de leerse paga hasta 20 veces de mas; '
|
|
354
|
+
+ 'ver src/chat/cache_ttl.ts.');
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
if (b.input.events_sin_desglose > 0) {
|
|
358
|
+
lines.push(' ' + b.input.events_sin_desglose
|
|
359
|
+
+ ' evento(s) sin desglose (anteriores al cambio): valuados a precio base '
|
|
360
|
+
+ 'sobre el total de entrada, asi que su costo es un PISO, no el exacto.');
|
|
361
|
+
}
|
|
189
362
|
if (b.subscription.events > 0) {
|
|
190
363
|
/* Lo que se consumio del plan, dicho aparte: no es dinero, es cuota. */
|
|
191
364
|
lines.push('Suscripcion: ' + b.subscription.events + ' turnos, '
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/telemetry/usage.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/telemetry/usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,9 +51,53 @@ export declare function evidenceForClose(slug: string, pending_id: string, opts?
|
|
|
51
51
|
* resolverla falla) rige la compilada: una compuerta que no puede leer su
|
|
52
52
|
* regla no se queda sin regla. */
|
|
53
53
|
export declare function closeRuleInForce(projectRoot?: string): Promise<UrazukeCloseRule>;
|
|
54
|
-
/**
|
|
55
|
-
*
|
|
56
|
-
*
|
|
54
|
+
/**
|
|
55
|
+
* PND-260 -- LA TERNA DE RECIBOS SE EXIGE EN TODO CIERRE CON `shipped`,
|
|
56
|
+
* NO SOLO DENTRO DE UN PROYECTO URAZUKE.
|
|
57
|
+
*
|
|
58
|
+
* Lo que habia: `evidenceGateApplies` (abajo) limitaba la exigencia a un
|
|
59
|
+
* proyecto con instancia Urazuke abierta. Fuera de eso, `pending.close` con
|
|
60
|
+
* `shipped` exigia `functional` y `use_cases`, y PEDIA POR DESCRIPCION
|
|
61
|
+
* `tests_status` y `commit` -- en el texto del error. El resultado medido
|
|
62
|
+
* (experimento A/B, peldano 13): un item cerrado con `shipped`, un
|
|
63
|
+
* `functional` largo, un caso de uso y CERO recibos, y el verbo no dijo nada.
|
|
64
|
+
* El propio comentario de esa funcion enuncia el principio que no se estaba
|
|
65
|
+
* aplicando a los recibos: "Si el dato importa, el verbo tiene que negarse
|
|
66
|
+
* sin el".
|
|
67
|
+
*
|
|
68
|
+
* Asi que la exigencia es universal, y la escapatoria es declarada: cuando la
|
|
69
|
+
* terna no esta, quien cierra escribe `sin_recibos_porque` EN EL MOMENTO. La
|
|
70
|
+
* excepcion legitima existe (un peldano sin bateria todavia, un cambio que no
|
|
71
|
+
* es de codigo) y lo que se gana es que quede escrita por quien sabia, en vez
|
|
72
|
+
* de reconstruida por un auditor cuatro semanas despues.
|
|
73
|
+
*
|
|
74
|
+
* NO aplica a las tareas canonicas de la escalera: esas tienen la compuerta
|
|
75
|
+
* de artefactos (evaluateStep), que es otra y mas fuerte.
|
|
76
|
+
*/
|
|
77
|
+
export declare function receiptsRequiredForShipped(item: {
|
|
78
|
+
workflow?: {
|
|
79
|
+
urazuke?: unknown;
|
|
80
|
+
ad_hoc?: boolean;
|
|
81
|
+
};
|
|
82
|
+
}, reason: string): boolean;
|
|
83
|
+
/** El minimo del motivo escrito. Mismo criterio que FUNCTIONAL_MIN: lo
|
|
84
|
+
* bastante para que no pase un "no hay", lo bastante poco para que una
|
|
85
|
+
* linea honesta alcance. */
|
|
86
|
+
export declare const SIN_RECIBOS_MIN = 25;
|
|
87
|
+
/** Valida la escapatoria. Devuelve el problema, o null si sirve. */
|
|
88
|
+
export declare function evidenceEscapeProblem(reason: unknown): string | null;
|
|
89
|
+
/** Does the STRICT evidence gate apply to this item? Only inside an open
|
|
90
|
+
* Urazuke workflow, only for plan items (not the ladder's own canonical
|
|
91
|
+
* tasks, which have the artifact gate instead), only for reason=shipped.
|
|
92
|
+
*
|
|
93
|
+
* LA DIFERENCIA CON `receiptsRequiredForShipped` ES LA ESCAPATORIA, Y ES
|
|
94
|
+
* DELIBERADA (PND-260, 2026-11-02). Donde este gate estricto rige, la unica
|
|
95
|
+
* salida sigue siendo `force_reason` + `force_kind`, que son DEL DUENO y
|
|
96
|
+
* quedan contables en el reporte. `sin_recibos_porque` la escribe el agente,
|
|
97
|
+
* asi que aceptarla aca seria regalarle al agente un bypass de una compuerta
|
|
98
|
+
* disenada precisamente para negarselo. Fuera del gate estricto no habia
|
|
99
|
+
* NINGUNA exigencia, asi que ahi la escapatoria del agente es una mejora
|
|
100
|
+
* estricta sobre el silencio. */
|
|
57
101
|
export declare function evidenceGateApplies(slug: string, item: {
|
|
58
102
|
workflow?: {
|
|
59
103
|
urazuke?: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"close_gate.d.ts","sourceRoot":"","sources":["../../src/urazuke/close_gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAG5E,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE;QACJ,UAAU,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAChG;;0EAEkE;QAClE,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;kDAiBkD;AAClD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAChC,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,gBAAgB,CAAA;CAAO,GAC3D,OAAO,CAAC,kBAAkB,CAAC,CAqC7B;AAED;;mCAEmC;AACnC,wBAAsB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAQtF;AAED;;
|
|
1
|
+
{"version":3,"file":"close_gate.d.ts","sourceRoot":"","sources":["../../src/urazuke/close_gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAG5E,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE;QACJ,UAAU,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAChG;;0EAEkE;QAClE,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;kDAiBkD;AAClD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAChC,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,gBAAgB,CAAA;CAAO,GAC3D,OAAO,CAAC,kBAAkB,CAAC,CAqC7B;AAED;;mCAEmC;AACnC,wBAAsB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAQtF;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE;IAAE,QAAQ,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,EAAE,MAAM,EAAE,MAAM,GAC3E,OAAO,CAIT;AAED;;6BAE6B;AAC7B,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC,oEAAoE;AACpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQpE;AAED;;;;;;;;;;;kCAWkC;AAClC,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,QAAQ,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUtJ"}
|
|
@@ -84,9 +84,63 @@ export async function closeRuleInForce(projectRoot) {
|
|
|
84
84
|
return COMPILED_CLOSE_RULE;
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
|
-
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
87
|
+
/**
|
|
88
|
+
* PND-260 -- LA TERNA DE RECIBOS SE EXIGE EN TODO CIERRE CON `shipped`,
|
|
89
|
+
* NO SOLO DENTRO DE UN PROYECTO URAZUKE.
|
|
90
|
+
*
|
|
91
|
+
* Lo que habia: `evidenceGateApplies` (abajo) limitaba la exigencia a un
|
|
92
|
+
* proyecto con instancia Urazuke abierta. Fuera de eso, `pending.close` con
|
|
93
|
+
* `shipped` exigia `functional` y `use_cases`, y PEDIA POR DESCRIPCION
|
|
94
|
+
* `tests_status` y `commit` -- en el texto del error. El resultado medido
|
|
95
|
+
* (experimento A/B, peldano 13): un item cerrado con `shipped`, un
|
|
96
|
+
* `functional` largo, un caso de uso y CERO recibos, y el verbo no dijo nada.
|
|
97
|
+
* El propio comentario de esa funcion enuncia el principio que no se estaba
|
|
98
|
+
* aplicando a los recibos: "Si el dato importa, el verbo tiene que negarse
|
|
99
|
+
* sin el".
|
|
100
|
+
*
|
|
101
|
+
* Asi que la exigencia es universal, y la escapatoria es declarada: cuando la
|
|
102
|
+
* terna no esta, quien cierra escribe `sin_recibos_porque` EN EL MOMENTO. La
|
|
103
|
+
* excepcion legitima existe (un peldano sin bateria todavia, un cambio que no
|
|
104
|
+
* es de codigo) y lo que se gana es que quede escrita por quien sabia, en vez
|
|
105
|
+
* de reconstruida por un auditor cuatro semanas despues.
|
|
106
|
+
*
|
|
107
|
+
* NO aplica a las tareas canonicas de la escalera: esas tienen la compuerta
|
|
108
|
+
* de artefactos (evaluateStep), que es otra y mas fuerte.
|
|
109
|
+
*/
|
|
110
|
+
export function receiptsRequiredForShipped(item, reason) {
|
|
111
|
+
if (reason !== 'shipped')
|
|
112
|
+
return false;
|
|
113
|
+
if (item.workflow?.urazuke && !item.workflow.ad_hoc)
|
|
114
|
+
return false;
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
/** El minimo del motivo escrito. Mismo criterio que FUNCTIONAL_MIN: lo
|
|
118
|
+
* bastante para que no pase un "no hay", lo bastante poco para que una
|
|
119
|
+
* linea honesta alcance. */
|
|
120
|
+
export const SIN_RECIBOS_MIN = 25;
|
|
121
|
+
/** Valida la escapatoria. Devuelve el problema, o null si sirve. */
|
|
122
|
+
export function evidenceEscapeProblem(reason) {
|
|
123
|
+
const t = typeof reason === 'string' ? reason.trim() : '';
|
|
124
|
+
if (!t)
|
|
125
|
+
return 'falta `sin_recibos_porque`';
|
|
126
|
+
if (t.length < SIN_RECIBOS_MIN) {
|
|
127
|
+
return '`sin_recibos_porque` tiene ' + t.length + ' caracteres y el minimo es ' + SIN_RECIBOS_MIN
|
|
128
|
+
+ ': hace falta el motivo, no una palabra';
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
/** Does the STRICT evidence gate apply to this item? Only inside an open
|
|
133
|
+
* Urazuke workflow, only for plan items (not the ladder's own canonical
|
|
134
|
+
* tasks, which have the artifact gate instead), only for reason=shipped.
|
|
135
|
+
*
|
|
136
|
+
* LA DIFERENCIA CON `receiptsRequiredForShipped` ES LA ESCAPATORIA, Y ES
|
|
137
|
+
* DELIBERADA (PND-260, 2026-11-02). Donde este gate estricto rige, la unica
|
|
138
|
+
* salida sigue siendo `force_reason` + `force_kind`, que son DEL DUENO y
|
|
139
|
+
* quedan contables en el reporte. `sin_recibos_porque` la escribe el agente,
|
|
140
|
+
* asi que aceptarla aca seria regalarle al agente un bypass de una compuerta
|
|
141
|
+
* disenada precisamente para negarselo. Fuera del gate estricto no habia
|
|
142
|
+
* NINGUNA exigencia, asi que ahi la escapatoria del agente es una mejora
|
|
143
|
+
* estricta sobre el silencio. */
|
|
90
144
|
export async function evidenceGateApplies(slug, item, reason) {
|
|
91
145
|
if (reason !== 'shipped')
|
|
92
146
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"close_gate.js","sourceRoot":"","sources":["../../src/urazuke/close_gate.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"close_gate.js","sourceRoot":"","sources":["../../src/urazuke/close_gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,mBAAmB,EAAyB,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAc3D;;;;;;;;;;;;;;;;;kDAiBkD;AAClD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY,EAAE,UAAkB,EAChC,OAA0D,EAAE;IAE5D,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAC1E,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnE;;;gCAG4B;IAC5B,MAAM,OAAO,GAA2B;QACtC,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,WAAW;QACnE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ;KACrD,CAAC;IACF,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,uEAAuE;kBAC3F,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;YACvE,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACrD;8EACsE;QACtE,IAAI,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,iBAAiB,KAAK,CAAC,EAAE,CAAC;YAChF;;;;qEAIyD;YACzD,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,GAAG,CAAC;gBACpC,CAAC,CAAC,IAAI,GAAG,MAAM,GAAG,sBAAsB,CAAC,CAAC,CAAC,mBAAmB,CAAC;gBAC/D,CAAC,CAAC,IAAI,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC,CAAC,mBAAmB,EAAE,EAAE,CAAC;AACjO,CAAC;AAED;;mCAEmC;AACnC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAoB;IACzD,IAAI,CAAC,WAAW;QAAE,OAAO,mBAAmB,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACzD,OAAO,CAAC,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,mBAAmB,CAAC;IAC7B,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,0BAA0B,CACxC,IAA4D,EAAE,MAAc;IAE5E,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,IAAI,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAClE,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;6BAE6B;AAC7B,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAElC,oEAAoE;AACpE,MAAM,UAAU,qBAAqB,CAAC,MAAe;IACnD,MAAM,CAAC,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1D,IAAI,CAAC,CAAC;QAAE,OAAO,4BAA4B,CAAC;IAC5C,IAAI,CAAC,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QAC/B,OAAO,6BAA6B,GAAG,CAAC,CAAC,MAAM,GAAG,6BAA6B,GAAG,eAAe;cAC7F,wCAAwC,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;kCAWkC;AAClC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY,EAAE,IAA4D,EAAE,MAAc;IAClI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,IAAI,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAClE,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3E,IAAI,CAAC;QACH,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QAC7D,OAAO,CAAC,CAAC,CAAC,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -21,6 +21,11 @@ export interface RunEvidenceInput {
|
|
|
21
21
|
* the receipt. For the first block of a new project, where the previous
|
|
22
22
|
* version does not even have the module. */
|
|
23
23
|
mutation_diff?: string;
|
|
24
|
+
/** PND-127 -- 'exit_code' declara que el comando NO es un runner de
|
|
25
|
+
* tests (un escaneo, un verificador) y que su exit code es toda la
|
|
26
|
+
* evidencia. Viaja tal cual al recibo: es una declaracion del autor y
|
|
27
|
+
* tiene que quedar auditable ahi, no inferirse al leer. */
|
|
28
|
+
evidence?: 'tests' | 'exit_code';
|
|
24
29
|
note?: string;
|
|
25
30
|
}
|
|
26
31
|
export interface RunEvidenceResult {
|
|
@@ -28,6 +33,11 @@ export interface RunEvidenceResult {
|
|
|
28
33
|
/** For red_proof: the worktree was created at this path (already removed). */
|
|
29
34
|
worktree?: string;
|
|
30
35
|
}
|
|
36
|
+
/** Lo que un mutation_diff puede medir para entrar entero al recibo. Un
|
|
37
|
+
* mutante planta UN defecto: los 15 del proyecto medido miden entre 280 y
|
|
38
|
+
* 1900 caracteres. Por arriba de esto el verbo se niega con el numero
|
|
39
|
+
* (PND-261); lo que NO hace mas es recortar en silencio. */
|
|
40
|
+
export declare const MUTATION_DIFF_MAX = 20000;
|
|
31
41
|
export declare const EVIDENCE_DEFAULT_TIMEOUT_MS: number;
|
|
32
42
|
export declare const EVIDENCE_MAX_TIMEOUT_MS: number;
|
|
33
43
|
/** El tope que de verdad se va a aplicar a una corrida.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../src/urazuke/evidence.ts"],"names":[],"mappings":"AAsBA,OAAO,EAA8B,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAS3F,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;+CAE2C;IAC3C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;;;;iDAK6C;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../src/urazuke/evidence.ts"],"names":[],"mappings":"AAsBA,OAAO,EAA8B,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAS3F,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;+CAE2C;IAC3C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;;;;iDAK6C;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;gEAG4D;IAC5D,QAAQ,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;6DAG6D;AAC7D,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AAGvC,eAAO,MAAM,2BAA2B,QAAiB,CAAC;AAC1D,eAAO,MAAM,uBAAuB,QAAiB,CAAC;AAEtD;;;;;mEAKmE;AACnE,wBAAgB,0BAA0B,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtE;AAiBD;;;;;;;;;;;;;wEAawE;AACxE,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAsCpK;AAED;;;;;uCAKuC;AACvC,MAAM,WAAW,aAAa;IAC5B,wDAAwD;IACxD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB;6BACyB;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;mDAC+C;IAC/C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,mEAAmE;IACnE,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAOD;;;;;;;;;;;;;;;;;;;;yDAoByD;AACzD,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA2E/F;AAED;;uCAEuC;AACvC,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAI1D;AAOD;;wBAEwB;AACxB,wBAAsB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxD;AAMD;kDACkD;AAClD,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqNrF;AAuBD;;0DAE0D;AAC1D,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACpD,4EAA4E;IAC5E,IAAI,EAAE,CAAC,CAAC;CACT;AAED,yDAAyD;AACzD,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAOhF;AAED;;sCAEsC;AACtC,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAYtF"}
|
package/dist/urazuke/evidence.js
CHANGED
|
@@ -24,6 +24,11 @@ import { appendReceipt, parseCounts } from './receipts.js';
|
|
|
24
24
|
import { carryEvidenceEnv, describeEvidenceEnv, readEvidenceEnvDeclaration, } from './evidence_env.js';
|
|
25
25
|
import { describeWindowsCommandProblem, windowsCommandProblem } from '../chat/tools/shell.js';
|
|
26
26
|
const execFileP = promisify(execFile);
|
|
27
|
+
/** Lo que un mutation_diff puede medir para entrar entero al recibo. Un
|
|
28
|
+
* mutante planta UN defecto: los 15 del proyecto medido miden entre 280 y
|
|
29
|
+
* 1900 caracteres. Por arriba de esto el verbo se niega con el numero
|
|
30
|
+
* (PND-261); lo que NO hace mas es recortar en silencio. */
|
|
31
|
+
export const MUTATION_DIFF_MAX = 20000;
|
|
27
32
|
const TAIL_CHARS = 4000;
|
|
28
33
|
export const EVIDENCE_DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;
|
|
29
34
|
export const EVIDENCE_MAX_TIMEOUT_MS = 30 * 60 * 1000;
|
|
@@ -300,11 +305,38 @@ export async function runEvidence(input) {
|
|
|
300
305
|
const started = Date.now();
|
|
301
306
|
if (input.kind === 'red_proof') {
|
|
302
307
|
const files = (input.test_files ?? []).map((f) => f.trim()).filter(Boolean);
|
|
303
|
-
|
|
308
|
+
/* PND-261 -- EL SALTO DE LINEA FINAL ES PARTE DEL DIFF.
|
|
309
|
+
*
|
|
310
|
+
* Aca habia un `.trim()`, y el valor trimado era el que se archivaba.
|
|
311
|
+
* Un diff unificado sin salto de linea final no pasa `git apply`:
|
|
312
|
+
* "corrupt patch at line N". Medido sobre el registro del proyecto c1,
|
|
313
|
+
* fueron 15 recibos de mutacion de 15 -- todos legibles, ninguno
|
|
314
|
+
* reproducible. Y tres quedaron archivados como `not_ok` por esta misma
|
|
315
|
+
* falla, con la culpa atribuida al parche en vez de al guardado.
|
|
316
|
+
*
|
|
317
|
+
* El trim se queda SOLO para decidir si vino vacio; lo que se usa para
|
|
318
|
+
* plantar el mutante y lo que se archiva es el MISMO texto, terminado en
|
|
319
|
+
* salto de linea. Un caracter. */
|
|
320
|
+
const mutationRaw = input.mutation_diff ?? '';
|
|
321
|
+
const mutation = mutationRaw.trim()
|
|
322
|
+
? (mutationRaw.endsWith('\n') ? mutationRaw : mutationRaw + '\n')
|
|
323
|
+
: '';
|
|
304
324
|
if (!files.length && !mutation)
|
|
305
325
|
throw new Error('red_proof needs test_files (the new test(s) to carry into the base worktree) or mutation_diff (a defect planted in the new code, D-037)');
|
|
306
326
|
if (mutation && !/^(diff --git|--- |\+\+\+ |@@ )/m.test(mutation))
|
|
307
327
|
throw new Error('mutation_diff must be a unified diff (diff --git / --- / +++ / @@ hunks)');
|
|
328
|
+
/* PND-261 (segunda mitad) -- EL TOPE SE AVISA, NO SE RECORTA.
|
|
329
|
+
*
|
|
330
|
+
* El guardado recortaba a 6000 caracteres y le pegaba '...[truncated]'.
|
|
331
|
+
* Un diff recortado tampoco aplica, y ademas no lo dice donde se mira:
|
|
332
|
+
* el recibo se ve completo. Un mutante planta UN defecto, asi que el
|
|
333
|
+
* tope sobra por lejos -- y cuando no sobre, el que pidio la corrida se
|
|
334
|
+
* entera con el numero en la mano en vez de recibir un documento mudo. */
|
|
335
|
+
if (mutation.length > MUTATION_DIFF_MAX) {
|
|
336
|
+
throw new Error('mutation_diff mide ' + mutation.length + ' caracteres y el tope del recibo es '
|
|
337
|
+
+ MUTATION_DIFF_MAX + '. No lo recorto: un diff recortado no aplica y el recibo no lo dice '
|
|
338
|
+
+ '(PND-261). Un mutante planta UN defecto -- acota la mutacion.');
|
|
339
|
+
}
|
|
308
340
|
const baseRef = mutation ? 'HEAD' : (input.base_ref ?? 'HEAD').trim();
|
|
309
341
|
const wt = await fs.mkdtemp(path.join(os.tmpdir(), 'yf-redproof-'));
|
|
310
342
|
const link = path.join(wt, 'node_modules');
|
|
@@ -337,7 +369,10 @@ export async function runEvidence(input) {
|
|
|
337
369
|
+ overlay.errors.slice(0, 5).join('; ');
|
|
338
370
|
}
|
|
339
371
|
const patch = path.join(wt, '.yf-mutant.diff');
|
|
340
|
-
|
|
372
|
+
/* El MISMO texto que se archiva, byte por byte: si lo que se aplica y
|
|
373
|
+
* lo que se guarda pueden diferir, la verificacion de abajo no prueba
|
|
374
|
+
* nada sobre el recibo. */
|
|
375
|
+
await fs.writeFile(patch, mutation, 'utf8');
|
|
341
376
|
try {
|
|
342
377
|
/* No point applying a mutant onto the wrong code, and the
|
|
343
378
|
* message has to name the REAL cause: an apply error reported
|
|
@@ -383,6 +418,29 @@ export async function runEvidence(input) {
|
|
|
383
418
|
linked = true;
|
|
384
419
|
}
|
|
385
420
|
catch { /* no node_modules or cannot link: the command may still work */ }
|
|
421
|
+
/* PND-261 -- UN RECIBO QUE NO SE PUEDE REPRODUCIR NO NACE.
|
|
422
|
+
*
|
|
423
|
+
* applyError y overlayError no son la misma clase de falla y no se
|
|
424
|
+
* tratan igual:
|
|
425
|
+
*
|
|
426
|
+
* - overlayError dice "el worktree NO es el codigo actual". El recibo
|
|
427
|
+
* se escribe igual, marcado, porque eso es lo que PND-240 pedia:
|
|
428
|
+
* que un rojo contaminado deje rastro en vez de desaparecer.
|
|
429
|
+
* - applyError dice "el diff archivado no se puede volver a aplicar".
|
|
430
|
+
* Ahi no hay nada que marcar: el recibo entero existe para que otro
|
|
431
|
+
* plante el mismo defecto, y si el diff no aplica, el documento es
|
|
432
|
+
* ilegible como evidencia. Eso falla CERRADO, sin escribir, y el que
|
|
433
|
+
* pidio la corrida se entera ahora -- no cuatro semanas despues,
|
|
434
|
+
* leyendo un `not_ok` que le echa la culpa al parche.
|
|
435
|
+
*
|
|
436
|
+
* El error se tira ACA y no antes porque la unica forma honesta de
|
|
437
|
+
* saber si un diff aplica es que git lo intente, y git lo intenta sobre
|
|
438
|
+
* el worktree que este bloque arma. */
|
|
439
|
+
if (applyError && !overlayError) {
|
|
440
|
+
throw new Error('evidencia: no escribi recibo porque el mutation_diff no se puede volver a '
|
|
441
|
+
+ 'aplicar sobre el codigo actual, y un recibo de mutacion que no se puede reproducir no '
|
|
442
|
+
+ 'es evidencia de nada (PND-261). ' + applyError);
|
|
443
|
+
}
|
|
386
444
|
const setupError = overlayError || applyError;
|
|
387
445
|
r = setupError
|
|
388
446
|
? { exit_code: 0, output: '[forge] ' + setupError, duration_ms: 0, timed_out: false }
|
|
@@ -414,9 +472,10 @@ export async function runEvidence(input) {
|
|
|
414
472
|
kind: 'red_proof', command: input.command, cwd: input.projectRoot,
|
|
415
473
|
ref: head.ref, dirty: head.dirty, base_ref: baseShort,
|
|
416
474
|
mode: mutation ? 'mutation' : 'base',
|
|
417
|
-
...(mutation ? { mutation_diff: mutation
|
|
475
|
+
...(mutation ? { mutation_diff: mutation } : {}),
|
|
418
476
|
exit_code: r.exit_code, started_at: started, duration_ms: r.duration_ms,
|
|
419
477
|
counts, output_tail: tail(r.output),
|
|
478
|
+
...(input.evidence ? { evidence: input.evidence } : {}),
|
|
420
479
|
...(input.pending_id ? { pending_id: input.pending_id } : {}),
|
|
421
480
|
...(input.step != null ? { step: input.step } : {}),
|
|
422
481
|
/* F-13 -- el entorno va al RECIBO y no solo a la nota: isStrongRed lo
|
|
@@ -448,6 +507,7 @@ export async function runEvidence(input) {
|
|
|
448
507
|
ref: head.ref, dirty: head.dirty,
|
|
449
508
|
exit_code: r.exit_code, started_at: started, duration_ms: r.duration_ms,
|
|
450
509
|
counts, output_tail: tail(r.output),
|
|
510
|
+
...(input.evidence ? { evidence: input.evidence } : {}),
|
|
451
511
|
...(input.pending_id ? { pending_id: input.pending_id } : {}),
|
|
452
512
|
...(input.step != null ? { step: input.step } : {}),
|
|
453
513
|
...(input.note ? { note: input.note } : {}),
|