@nac3/forge-cli 1.25.0 → 1.27.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.
Files changed (121) hide show
  1. package/dist/chat/cache_ttl.d.ts +143 -0
  2. package/dist/chat/cache_ttl.d.ts.map +1 -0
  3. package/dist/chat/cache_ttl.js +165 -0
  4. package/dist/chat/cache_ttl.js.map +1 -0
  5. package/dist/chat/claude.d.ts +1 -0
  6. package/dist/chat/claude.d.ts.map +1 -1
  7. package/dist/chat/claude.js +47 -5
  8. package/dist/chat/claude.js.map +1 -1
  9. package/dist/chat/claude_cli.d.ts +24 -0
  10. package/dist/chat/claude_cli.d.ts.map +1 -1
  11. package/dist/chat/claude_cli.js +76 -10
  12. package/dist/chat/claude_cli.js.map +1 -1
  13. package/dist/chat/panel.d.ts.map +1 -1
  14. package/dist/chat/panel.js +128 -17
  15. package/dist/chat/panel.js.map +1 -1
  16. package/dist/chat/server.d.ts.map +1 -1
  17. package/dist/chat/server.js +13 -1
  18. package/dist/chat/server.js.map +1 -1
  19. package/dist/chat/tools/evidence.d.ts +15 -0
  20. package/dist/chat/tools/evidence.d.ts.map +1 -1
  21. package/dist/chat/tools/evidence.js +16 -0
  22. package/dist/chat/tools/evidence.js.map +1 -1
  23. package/dist/chat/tools/reader.d.ts.map +1 -1
  24. package/dist/chat/tools/reader.js +24 -4
  25. package/dist/chat/tools/reader.js.map +1 -1
  26. package/dist/chat/tools/session_verbs.d.ts +3 -1
  27. package/dist/chat/tools/session_verbs.d.ts.map +1 -1
  28. package/dist/chat/tools/session_verbs.js +65 -2
  29. package/dist/chat/tools/session_verbs.js.map +1 -1
  30. package/dist/chat/tools/shell.d.ts +11 -0
  31. package/dist/chat/tools/shell.d.ts.map +1 -1
  32. package/dist/chat/tools/shell.js +46 -1
  33. package/dist/chat/tools/shell.js.map +1 -1
  34. package/dist/commands/chat.d.ts +6 -0
  35. package/dist/commands/chat.d.ts.map +1 -1
  36. package/dist/commands/chat.js +25 -0
  37. package/dist/commands/chat.js.map +1 -1
  38. package/dist/commands/limits.d.ts.map +1 -1
  39. package/dist/commands/limits.js +77 -6
  40. package/dist/commands/limits.js.map +1 -1
  41. package/dist/commands/operate.d.ts.map +1 -1
  42. package/dist/commands/operate.js +42 -0
  43. package/dist/commands/operate.js.map +1 -1
  44. package/dist/commands/urazuke.d.ts.map +1 -1
  45. package/dist/commands/urazuke.js +189 -9
  46. package/dist/commands/urazuke.js.map +1 -1
  47. package/dist/core/brain_pin.d.ts +74 -0
  48. package/dist/core/brain_pin.d.ts.map +1 -0
  49. package/dist/core/brain_pin.js +113 -0
  50. package/dist/core/brain_pin.js.map +1 -0
  51. package/dist/core/cost_router.d.ts.map +1 -1
  52. package/dist/core/cost_router.js +56 -0
  53. package/dist/core/cost_router.js.map +1 -1
  54. package/dist/core/limits_config.d.ts +19 -0
  55. package/dist/core/limits_config.d.ts.map +1 -1
  56. package/dist/core/limits_config.js +38 -0
  57. package/dist/core/limits_config.js.map +1 -1
  58. package/dist/core/machine_files.d.ts +27 -0
  59. package/dist/core/machine_files.d.ts.map +1 -0
  60. package/dist/core/machine_files.js +97 -0
  61. package/dist/core/machine_files.js.map +1 -0
  62. package/dist/docs/doctrine/session-orchestration.md +109 -91
  63. package/dist/docs/doctrine/urazuke.md +221 -221
  64. package/dist/llm/sse_stream.d.ts +2 -0
  65. package/dist/llm/sse_stream.d.ts.map +1 -1
  66. package/dist/llm/sse_stream.js +10 -1
  67. package/dist/llm/sse_stream.js.map +1 -1
  68. package/dist/nac3/dispatch_log.d.ts +16 -1
  69. package/dist/nac3/dispatch_log.d.ts.map +1 -1
  70. package/dist/nac3/dispatch_log.js +29 -10
  71. package/dist/nac3/dispatch_log.js.map +1 -1
  72. package/dist/nac3/internal_manifest.d.ts.map +1 -1
  73. package/dist/nac3/internal_manifest.js +2 -0
  74. package/dist/nac3/internal_manifest.js.map +1 -1
  75. package/dist/telemetry/battery_events.d.ts +91 -0
  76. package/dist/telemetry/battery_events.d.ts.map +1 -0
  77. package/dist/telemetry/battery_events.js +84 -0
  78. package/dist/telemetry/battery_events.js.map +1 -0
  79. package/dist/telemetry/usage.d.ts +107 -0
  80. package/dist/telemetry/usage.d.ts.map +1 -1
  81. package/dist/telemetry/usage.js +172 -13
  82. package/dist/telemetry/usage.js.map +1 -1
  83. package/dist/urazuke/evidence.d.ts +5 -0
  84. package/dist/urazuke/evidence.d.ts.map +1 -1
  85. package/dist/urazuke/evidence.js +2 -0
  86. package/dist/urazuke/evidence.js.map +1 -1
  87. package/dist/urazuke/freeze.d.ts.map +1 -1
  88. package/dist/urazuke/freeze.js +82 -16
  89. package/dist/urazuke/freeze.js.map +1 -1
  90. package/dist/urazuke/gates_data.d.ts +4 -1
  91. package/dist/urazuke/gates_data.d.ts.map +1 -1
  92. package/dist/urazuke/gates_data.js +7 -1
  93. package/dist/urazuke/gates_data.js.map +1 -1
  94. package/dist/urazuke/gates_ledger.d.ts +25 -1
  95. package/dist/urazuke/gates_ledger.d.ts.map +1 -1
  96. package/dist/urazuke/gates_ledger.js +30 -6
  97. package/dist/urazuke/gates_ledger.js.map +1 -1
  98. package/dist/urazuke/method_config.d.ts +116 -0
  99. package/dist/urazuke/method_config.d.ts.map +1 -0
  100. package/dist/urazuke/method_config.js +328 -0
  101. package/dist/urazuke/method_config.js.map +1 -0
  102. package/dist/urazuke/prompts_client.d.ts +42 -12
  103. package/dist/urazuke/prompts_client.d.ts.map +1 -1
  104. package/dist/urazuke/prompts_client.js +120 -16
  105. package/dist/urazuke/prompts_client.js.map +1 -1
  106. package/dist/urazuke/prompts_freeze.d.ts +186 -0
  107. package/dist/urazuke/prompts_freeze.d.ts.map +1 -0
  108. package/dist/urazuke/prompts_freeze.js +498 -0
  109. package/dist/urazuke/prompts_freeze.js.map +1 -0
  110. package/dist/urazuke/receipts.d.ts +28 -1
  111. package/dist/urazuke/receipts.d.ts.map +1 -1
  112. package/dist/urazuke/receipts.js +59 -6
  113. package/dist/urazuke/receipts.js.map +1 -1
  114. package/dist/urazuke/start.d.ts.map +1 -1
  115. package/dist/urazuke/start.js +42 -2
  116. package/dist/urazuke/start.js.map +1 -1
  117. package/dist/version.d.ts +1 -1
  118. package/dist/version.js +1 -1
  119. package/docs/doctrine/session-orchestration.md +109 -91
  120. package/docs/doctrine/urazuke.md +221 -221
  121. package/package.json +124 -124
@@ -0,0 +1,84 @@
1
+ /** Por debajo de esto, en entrada Y en salida, no es un turno de chat. El
2
+ * piso medido para un turno real en la maquina del dueno es 120 tokens de
3
+ * entrada; 1000 deja margen de casi un orden de magnitud. */
4
+ export const UMBRAL_TOKENS = 1000;
5
+ /** Modelos que solo existen en la bateria. Es una PISTA (se informa), no
6
+ * el criterio: el criterio es el tamano. */
7
+ export const MODELOS_DE_PRUEBA = ['m', 'claude', 'claude-test', 'claude-code-cli', 'sonnet', 'test'];
8
+ export function claseDeEvento(ev) {
9
+ const ent = ev.tokens_in ?? 0;
10
+ const sal = ev.tokens_out ?? 0;
11
+ return (ent < UMBRAL_TOKENS && sal < UMBRAL_TOKENS) ? 'bateria' : 'real';
12
+ }
13
+ /**
14
+ * Clasificar una ventana de eventos. `desde_ms` es el borde inferior (0 =
15
+ * todo el archivo). No lee ni escribe nada: recibe los eventos.
16
+ */
17
+ export function auditarUso(eventos, desde_ms = 0) {
18
+ const ventana = eventos.filter((e) => {
19
+ const t = Date.parse(e.ts ?? '');
20
+ return Number.isFinite(t) ? t >= desde_ms : desde_ms === 0;
21
+ });
22
+ const porModelo = new Map();
23
+ let bateria = 0;
24
+ let real = 0;
25
+ let desde;
26
+ let hasta;
27
+ for (const e of ventana) {
28
+ const clase = claseDeEvento(e);
29
+ if (clase === 'bateria')
30
+ bateria++;
31
+ else
32
+ real++;
33
+ const key = e.model || '(sin modelo)';
34
+ const row = porModelo.get(key) ?? {
35
+ model: key, bateria: 0, real: 0,
36
+ nombre_de_prueba: MODELOS_DE_PRUEBA.includes(key),
37
+ tokens_in_real: 0,
38
+ };
39
+ if (clase === 'bateria')
40
+ row.bateria++;
41
+ else {
42
+ row.real++;
43
+ row.tokens_in_real += e.tokens_in ?? 0;
44
+ }
45
+ porModelo.set(key, row);
46
+ if (e.ts) {
47
+ if (!desde || e.ts < desde)
48
+ desde = e.ts;
49
+ if (!hasta || e.ts > hasta)
50
+ hasta = e.ts;
51
+ }
52
+ }
53
+ return {
54
+ total: ventana.length,
55
+ bateria, real,
56
+ pct_bateria: ventana.length ? Math.round((1000 * bateria) / ventana.length) / 10 : 0,
57
+ ...(desde ? { desde } : {}),
58
+ ...(hasta ? { hasta } : {}),
59
+ por_modelo: [...porModelo.values()].sort((a, b) => (b.bateria + b.real) - (a.bateria + a.real)),
60
+ criterio: 'con forma de prueba = tokens_in < ' + UMBRAL_TOKENS + ' Y tokens_out < ' + UMBRAL_TOKENS
61
+ + '. El criterio es el TAMANO, no el nombre del modelo: el nombre cambia cada vez que alguien'
62
+ + ' escribe un test y el tamano es una propiedad del hecho. Nada se purga: esto clasifica,'
63
+ + ' el archivo queda intacto.',
64
+ };
65
+ }
66
+ /** El informe en lineas, para el CLI. */
67
+ export function renderAuditoriaDeUso(a) {
68
+ const L = [];
69
+ L.push('eventos mirados: ' + a.total
70
+ + (a.desde ? ' (' + a.desde.slice(0, 16) + ' -> ' + (a.hasta ?? '').slice(0, 16) + ')' : ''));
71
+ L.push('con forma de prueba: ' + a.bateria + ' (' + a.pct_bateria + '%) | turnos reales: ' + a.real);
72
+ L.push('criterio: ' + a.criterio);
73
+ if (a.por_modelo.length) {
74
+ L.push('por modelo:');
75
+ for (const m of a.por_modelo) {
76
+ L.push(' ' + m.model.padEnd(22) + ' prueba ' + String(m.bateria).padStart(6)
77
+ + ' | real ' + String(m.real).padStart(5)
78
+ + (m.real ? ' (' + m.tokens_in_real + ' tokens de entrada)' : '')
79
+ + (m.nombre_de_prueba ? ' [nombre que solo aparece en la bateria]' : ''));
80
+ }
81
+ }
82
+ return L;
83
+ }
84
+ //# sourceMappingURL=battery_events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"battery_events.js","sourceRoot":"","sources":["../../src/telemetry/battery_events.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,15 @@ export interface UsageEvent {
18
18
  * proveedor); 'subscription' = consumo de un plan de tarifa plana.
19
19
  * Ausente en los eventos viejos, que son todos de API. */
20
20
  billing?: 'api' | 'subscription';
21
+ /** input_tokens: entrada que se proceso a precio pleno (1x). */
22
+ tokens_fresh?: number;
23
+ /** cache_creation_input_tokens: lo que se escribio a la cache este evento. */
24
+ tokens_cache_write?: number;
25
+ /** cache_read_input_tokens: lo que se sirvio de la cache (0,10x). */
26
+ tokens_cache_read?: number;
27
+ /** La ventana con la que se escribio: decide si la escritura costo 1,25x
28
+ * (5m) o 2x (1h). Ver src/chat/cache_ttl.ts. */
29
+ cache_ttl?: '5m' | '1h';
21
30
  }
22
31
  export interface PricingTable {
23
32
  models?: Record<string, {
@@ -28,8 +37,95 @@ export interface PricingTable {
28
37
  tts_per_million_chars?: number;
29
38
  stt_per_minute?: number;
30
39
  };
40
+ /** Multiplicadores de cache sobre el precio base de ENTRADA del modelo
41
+ * (PND-273). Son los de Anthropic; viven en la tabla para que un cambio
42
+ * de precios sea un override en pricing.json y no un release. */
43
+ cache?: {
44
+ read_multiplier?: number;
45
+ write_5m_multiplier?: number;
46
+ write_1h_multiplier?: number;
47
+ };
31
48
  }
32
49
  export declare const DEFAULT_PRICING: PricingTable;
50
+ /** Normalizar el id de modelo para buscarlo en la tabla de precios.
51
+ *
52
+ * POR QUE (PND-273): el camino CLI informa el id con la fecha pegada
53
+ * ("claude-haiku-4-5-20251001"), y la busqueda era exacta, asi que NINGUN
54
+ * turno del camino CLI encontraba su fila y todos se valuaban en cero. La
55
+ * fecha no cambia el precio: se saca antes de buscar. */
56
+ export declare function normaliseModelId(model: string): string;
57
+ /** Valuar la ENTRADA de un evento en dolares.
58
+ *
59
+ * Con desglose: cada componente a su multiplicador. Sin desglose (eventos
60
+ * viejos): `tokens_in` a precio base, que es lo unico que se sabe de ellos
61
+ * -- y se declara como tal en el reporte para que nadie compare peras con
62
+ * manzanas. */
63
+ export declare function inputUsd(ev: Pick<UsageEvent, 'tokens_in' | 'tokens_fresh' | 'tokens_cache_write' | 'tokens_cache_read' | 'cache_ttl'>, base_per_mtok: number, cache: PricingTable['cache']): number;
64
+ /** La bateria NO escribe en la telemetria del dueno.
65
+ *
66
+ * MEDIDO AL CABLEAR EL DESGLOSE (2026-11-03, PND-273): de los 9.062
67
+ * eventos de la ventana de 30 dias en el usage.jsonl de la maquina, 2.347
68
+ * -- el 26% -- tenian modelo "claude", "m" o "claude-test", con marca de
69
+ * tiempo exacta de las corridas de la bateria de hoy. Son los tests que
70
+ * ejercitan ClaudeClient con un fetch falso y no aislan YF_CONFIG_DIR:
71
+ * recordUsage les escribe en el archivo real.
72
+ *
73
+ * Por que importa y no es cosmetico: este archivo es la unica fuente del
74
+ * reporte de costos, y el reporte es lo que acaba de volverse exacto. Una
75
+ * bateria que le mete un cuarto de los eventos lo vuelve inexacto de
76
+ * nuevo, por otra puerta -- y los eventos de test valen cero dolares, asi
77
+ * que bajan el promedio y hacen parecer mas barato de lo que es.
78
+ *
79
+ * Por que se frena ACA y no moviendo YF_CONFIG_DIR para toda la bateria:
80
+ * mover la config entera es un override ANCHO, y este repositorio ya tiene
81
+ * la cicatriz de uno (src/chat/instance_lock.ts: "un override angosto es
82
+ * el arreglo; uno ancho era el bug"). Hay tests que SI necesitan la config
83
+ * real. La telemetria, en cambio, no es nunca lo que un test afirma: el
84
+ * que mide costos se arma su propio YF_CONFIG_DIR, y ahi esta funcion no
85
+ * se niega -- solo se niega al archivo de la MAQUINA.
86
+ *
87
+ * Un test que quiera verificar el recibo pone su YF_CONFIG_DIR y sigue
88
+ * andando, que es como esta escrito tests/cache-ttl-y-desglose.test.ts. */
89
+ export declare function telemetryWritesAllowed(env?: Record<string, string | undefined>): boolean;
90
+ export interface UsageDestination {
91
+ allowed: boolean;
92
+ /** El archivo exacto, resuelto AHORA. Solo cuando allowed. */
93
+ file?: string;
94
+ dir?: string;
95
+ /** Por que se nego, para el test y para quien lea el motivo. */
96
+ why?: string;
97
+ }
98
+ /**
99
+ * EL DESTINO DEL RECIBO, DECIDIDO DE UNA SOLA VEZ Y SIN AWAITS EN EL MEDIO.
100
+ *
101
+ * MEDIDO EL 2026-11-03, DESPUES DE DECLARAR ESTO ARREGLADO (y por eso esta
102
+ * escrito aca y no solo en un commit). La guarda de arriba, sola, NO
103
+ * alcanzaba: la bateria completa de 5.777 pruebas siguio escribiendo CUATRO
104
+ * eventos en el usage.jsonl del dueno. La causa es una carrera, no un
105
+ * permiso:
106
+ *
107
+ * 1. el test pone YF_CONFIG_DIR y llama al cliente;
108
+ * 2. el cliente hace `void recordUsage(...)` -- no lo espera;
109
+ * 3. recordUsage pasa la guarda (YF_CONFIG_DIR esta puesto) y se duerme
110
+ * en el primer await;
111
+ * 4. el test termina, su afterEach BORRA YF_CONFIG_DIR y borra el tmp;
112
+ * 5. recien ahi recordUsage despierta, llama usageFile() -> configDir()
113
+ * -- que lee el entorno DE NUEVO, y ya no esta -- y appendea en
114
+ * ~/.yujin-forge/usage.jsonl.
115
+ *
116
+ * La guarda miraba el entorno en el momento correcto; el PATH se resolvia
117
+ * en otro. Dos lecturas del mismo entorno en dos instantes distintos es la
118
+ * forma general del defecto, y por eso el arreglo no es mover la guarda:
119
+ * es resolver el destino COMPLETO antes del primer await y no volver a
120
+ * mirar el entorno en esa llamada.
121
+ *
122
+ * Y fail-closed: dentro de la bateria se niega TAMBIEN cuando el
123
+ * YF_CONFIG_DIR declarado apunta a la carpeta de la maquina. Si alguien
124
+ * vuelve a introducir una lectura tardia del entorno, el peor caso es que
125
+ * un recibo se pierda en un test, no que contamine la unica medicion de
126
+ * costo honesta que hay.
127
+ */
128
+ export declare function usageDestination(env?: Record<string, string | undefined>): UsageDestination;
33
129
  /**
34
130
  * Append a usage event. Never throws -- failures swallowed.
35
131
  */
@@ -63,6 +159,17 @@ export interface CostBreakdown {
63
159
  events_total: number;
64
160
  events_window: number;
65
161
  window_label: string;
162
+ /** El desglose de la entrada (PND-273). `events_sin_desglose` son los
163
+ * eventos viejos, valuados a precio base sobre el total porque es lo
164
+ * unico que se sabe de ellos: se informa el numero para que el lector
165
+ * sepa que parte del reporte es exacta y que parte es un piso. */
166
+ input: {
167
+ fresh: number;
168
+ cache_write: number;
169
+ cache_read: number;
170
+ cache_write_1h: number;
171
+ events_sin_desglose: number;
172
+ };
66
173
  /** El consumo que NO se valua en dinero: los turnos de un plan de tarifa
67
174
  * plana. Va aparte del total en USD a proposito -- sumarlo a cero
68
175
  * haria parecer que no se consumio nada (F-04). */
@@ -1 +1 @@
1
- {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/telemetry/usage.ts"],"names":[],"mappings":"AAiCA,MAAM,MAAM,SAAS,GACjB,aAAa,GACb,aAAa,GACb,gBAAgB,GAChB,eAAe,GACf,WAAW,GACX,WAAW,GACX,MAAM,CAAC;AAEX,MAAM,WAAW,UAAU;IACzB,EAAE,EAAY,MAAM,CAAC;IACrB,IAAI,EAAU,SAAS,CAAC;IACxB,KAAK,CAAC,EAAQ,MAAM,CAAC;IACrB,SAAS,CAAC,EAAI,MAAM,CAAC;IACrB,UAAU,CAAC,EAAG,MAAM,CAAC;IACrB,KAAK,CAAC,EAAQ,MAAM,CAAC;IACrB,KAAK,CAAC,EAAQ,MAAM,CAAC;IACrB,YAAY,CAAC,EAAC,MAAM,CAAC;IACrB;;;;;;;;+DAQ2D;IAC3D,OAAO,CAAC,EAAM,KAAK,GAAG,cAAc,CAAC;CACtC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,KAAK,CAAC,EAAG;QACP,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,cAAc,CAAC,EAAS,MAAM,CAAC;KAChC,CAAC;CACH;AAID,eAAO,MAAM,eAAe,EAAE,YAe7B,CAAC;AAaF;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ7F;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,YAAY,CAAC,CAWzD;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAYvD;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAO,MAAM,CAAC;IACvB,OAAO,EAAS,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,QAAQ,EAAQ,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtG,MAAM,EAAU,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,YAAY,EAAI,MAAM,CAAC;IACvB,aAAa,EAAG,MAAM,CAAC;IACvB,YAAY,EAAI,MAAM,CAAC;IACvB;;wDAEoD;IACpD,YAAY,EAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3E;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,SAAS,SAAK,GAAG,OAAO,CAAC,aAAa,CAAC,CA+DzE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,EAAE,CAuCtD"}
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/telemetry/usage.ts"],"names":[],"mappings":"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"}
@@ -29,11 +29,20 @@
29
29
  */
30
30
  import { promises as fs } from 'node:fs';
31
31
  import path from 'node:path';
32
+ import { machineFileDestination } from '../core/machine_files.js';
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,136 @@ 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
- function usageFile() {
52
- return path.join(configDir(), 'usage.jsonl');
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 pricingFile() {
55
- return path.join(configDir(), 'pricing.json');
74
+ function priceFor(pricing, model) {
75
+ const m = pricing.models ?? {};
76
+ return m[model] ?? m[normaliseModelId(model)];
56
77
  }
57
- async function ensureDir() {
58
- try {
59
- await fs.mkdir(configDir(), { recursive: true });
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;
60
90
  }
61
- catch { /* best effort */ }
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
+ /**
129
+ * EL DESTINO DEL RECIBO, DECIDIDO DE UNA SOLA VEZ Y SIN AWAITS EN EL MEDIO.
130
+ *
131
+ * MEDIDO EL 2026-11-03, DESPUES DE DECLARAR ESTO ARREGLADO (y por eso esta
132
+ * escrito aca y no solo en un commit). La guarda de arriba, sola, NO
133
+ * alcanzaba: la bateria completa de 5.777 pruebas siguio escribiendo CUATRO
134
+ * eventos en el usage.jsonl del dueno. La causa es una carrera, no un
135
+ * permiso:
136
+ *
137
+ * 1. el test pone YF_CONFIG_DIR y llama al cliente;
138
+ * 2. el cliente hace `void recordUsage(...)` -- no lo espera;
139
+ * 3. recordUsage pasa la guarda (YF_CONFIG_DIR esta puesto) y se duerme
140
+ * en el primer await;
141
+ * 4. el test termina, su afterEach BORRA YF_CONFIG_DIR y borra el tmp;
142
+ * 5. recien ahi recordUsage despierta, llama usageFile() -> configDir()
143
+ * -- que lee el entorno DE NUEVO, y ya no esta -- y appendea en
144
+ * ~/.yujin-forge/usage.jsonl.
145
+ *
146
+ * La guarda miraba el entorno en el momento correcto; el PATH se resolvia
147
+ * en otro. Dos lecturas del mismo entorno en dos instantes distintos es la
148
+ * forma general del defecto, y por eso el arreglo no es mover la guarda:
149
+ * es resolver el destino COMPLETO antes del primer await y no volver a
150
+ * mirar el entorno en esa llamada.
151
+ *
152
+ * Y fail-closed: dentro de la bateria se niega TAMBIEN cuando el
153
+ * YF_CONFIG_DIR declarado apunta a la carpeta de la maquina. Si alguien
154
+ * vuelve a introducir una lectura tardia del entorno, el peor caso es que
155
+ * un recibo se pierda en un test, no que contamine la unica medicion de
156
+ * costo honesta que hay.
157
+ */
158
+ export function usageDestination(env = process.env) {
159
+ /* La puerta es una sola y esta en src/core/machine_files.ts. Vivia aca
160
+ * primero porque el usage.jsonl fue el primero que se midio; cuando la
161
+ * misma pregunta ("escribe en algun otro archivo mio?") devolvio DOS
162
+ * archivos mas, tener tres copias de la misma guarda pasaba a ser el
163
+ * proximo defecto: la cuarta copia es la que alguien escribe sin la
164
+ * parte de la carrera. */
165
+ const d = machineFileDestination('usage.jsonl', env);
166
+ if (!d.allowed)
167
+ return { allowed: false, ...(d.why ? { why: d.why } : {}) };
168
+ return { allowed: true, ...(d.dir ? { dir: d.dir } : {}), ...(d.file ? { file: d.file } : {}) };
169
+ }
170
+ function pricingFile() {
171
+ return path.join(configDir(), 'pricing.json');
62
172
  }
63
173
  /**
64
174
  * Append a usage event. Never throws -- failures swallowed.
65
175
  */
66
176
  export async function recordUsage(ev) {
67
177
  try {
68
- await ensureDir();
178
+ /* Primero el destino, y de aca en adelante NO se vuelve a leer el
179
+ * entorno: ver usageDestination(). */
180
+ const destino = usageDestination();
181
+ if (!destino.allowed || !destino.file || !destino.dir)
182
+ return;
69
183
  const line = { ts: ev.ts ?? new Date().toISOString(), ...ev };
70
- await fs.appendFile(usageFile(), JSON.stringify(line) + '\n', 'utf-8');
184
+ try {
185
+ await fs.mkdir(destino.dir, { recursive: true });
186
+ }
187
+ catch { /* best effort */ }
188
+ await fs.appendFile(destino.file, JSON.stringify(line) + '\n', 'utf-8');
71
189
  }
72
190
  catch {
73
191
  /* swallow -- telemetry must never break user flow */
@@ -83,6 +201,7 @@ export async function loadPricing() {
83
201
  return {
84
202
  models: { ...(DEFAULT_PRICING.models ?? {}), ...(override.models ?? {}) },
85
203
  voice: { ...(DEFAULT_PRICING.voice ?? {}), ...(override.voice ?? {}) },
204
+ cache: { ...(DEFAULT_PRICING.cache ?? {}), ...(override.cache ?? {}) },
86
205
  };
87
206
  }
88
207
  catch {
@@ -94,7 +213,9 @@ export async function loadPricing() {
94
213
  */
95
214
  export async function readUsage() {
96
215
  try {
97
- const raw = await fs.readFile(usageFile(), 'utf-8');
216
+ /* La LECTURA no pasa por usageDestination(): leer el archivo del dueno
217
+ * no lo contamina, y un reporte de costos tiene que poder leerlo. */
218
+ const raw = await fs.readFile(path.join(configDir(), 'usage.jsonl'), 'utf-8');
98
219
  return raw.split('\n')
99
220
  .filter((l) => l.trim().length > 0)
100
221
  .map((l) => {
@@ -129,6 +250,7 @@ export async function computeCosts(sinceDays = 30) {
129
250
  events_total: events.length,
130
251
  events_window: inWindow.length,
131
252
  window_label: sinceDays === 0 ? 'all-time' : 'last ' + sinceDays + ' days',
253
+ input: { fresh: 0, cache_write: 0, cache_read: 0, cache_write_1h: 0, events_sin_desglose: 0 },
132
254
  subscription: { events: 0, tokens_in: 0, tokens_out: 0 },
133
255
  };
134
256
  for (const ev of inWindow) {
@@ -143,9 +265,25 @@ export async function computeCosts(sinceDays = 30) {
143
265
  }
144
266
  if (ev.kind.startsWith('claude.')) {
145
267
  const m = ev.model ?? 'unknown';
146
- const p = pricing.models?.[m];
268
+ const p = priceFor(pricing, m);
269
+ /* El desglose se acumula para TODOS los eventos de modelo, incluidos
270
+ * los de suscripcion: ahi no hay dolares pero si hay consumo del plan,
271
+ * y la re-escritura de cache lo quema igual. */
272
+ const tieneDesglose = typeof ev.tokens_fresh === 'number'
273
+ || typeof ev.tokens_cache_write === 'number'
274
+ || typeof ev.tokens_cache_read === 'number';
275
+ if (tieneDesglose) {
276
+ breakdown.input.fresh += ev.tokens_fresh ?? 0;
277
+ breakdown.input.cache_write += ev.tokens_cache_write ?? 0;
278
+ breakdown.input.cache_read += ev.tokens_cache_read ?? 0;
279
+ if (ev.cache_ttl === '1h')
280
+ breakdown.input.cache_write_1h += ev.tokens_cache_write ?? 0;
281
+ }
282
+ else {
283
+ breakdown.input.events_sin_desglose += 1;
284
+ }
147
285
  if (p && !bySubscription) {
148
- usd = ((ev.tokens_in ?? 0) / 1_000_000) * p.in_per_mtok
286
+ usd = inputUsd(ev, p.in_per_mtok, pricing.cache)
149
287
  + ((ev.tokens_out ?? 0) / 1_000_000) * p.out_per_mtok;
150
288
  }
151
289
  if (!breakdown.by_model[m]) {
@@ -186,6 +324,27 @@ export function formatCosts(b) {
186
324
  lines.push('Events total: ' + b.events_total);
187
325
  lines.push('Events in window:' + b.events_window);
188
326
  lines.push('Total USD: $' + b.total_usd.toFixed(4));
327
+ /* El desglose de la entrada, que es lo que hace comparable el numero de
328
+ * arriba: tres componentes con precios que difieren doce veces. */
329
+ const inTot = b.input.fresh + b.input.cache_write + b.input.cache_read;
330
+ if (inTot > 0) {
331
+ const pct = (n) => (inTot > 0 ? (100 * n / inTot).toFixed(0) : '0') + '%';
332
+ lines.push('Entrada: ' + inTot + ' tokens'
333
+ + ' frescos=' + b.input.fresh + ' (' + pct(b.input.fresh) + ', 1x)'
334
+ + ' cache escrita=' + b.input.cache_write + ' (' + pct(b.input.cache_write) + ', '
335
+ + (b.input.cache_write_1h > 0 ? '1,25x/2x' : '1,25x') + ')'
336
+ + ' cache leida=' + b.input.cache_read + ' (' + pct(b.input.cache_read) + ', 0,10x)');
337
+ if (b.input.cache_write > b.input.cache_read && b.input.cache_read > 0) {
338
+ lines.push(' AVISO: se escribio a la cache MAS de lo que se leyo. '
339
+ + 'Un prefijo que se re-escribe en vez de leerse paga hasta 20 veces de mas; '
340
+ + 'ver src/chat/cache_ttl.ts.');
341
+ }
342
+ }
343
+ if (b.input.events_sin_desglose > 0) {
344
+ lines.push(' ' + b.input.events_sin_desglose
345
+ + ' evento(s) sin desglose (anteriores al cambio): valuados a precio base '
346
+ + 'sobre el total de entrada, asi que su costo es un PISO, no el exacto.');
347
+ }
189
348
  if (b.subscription.events > 0) {
190
349
  /* Lo que se consumio del plan, dicho aparte: no es dinero, es cuota. */
191
350
  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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"}
@@ -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 {
@@ -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;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,CAmNrF;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"}
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"}
@@ -475,6 +475,7 @@ export async function runEvidence(input) {
475
475
  ...(mutation ? { mutation_diff: mutation } : {}),
476
476
  exit_code: r.exit_code, started_at: started, duration_ms: r.duration_ms,
477
477
  counts, output_tail: tail(r.output),
478
+ ...(input.evidence ? { evidence: input.evidence } : {}),
478
479
  ...(input.pending_id ? { pending_id: input.pending_id } : {}),
479
480
  ...(input.step != null ? { step: input.step } : {}),
480
481
  /* F-13 -- el entorno va al RECIBO y no solo a la nota: isStrongRed lo
@@ -506,6 +507,7 @@ export async function runEvidence(input) {
506
507
  ref: head.ref, dirty: head.dirty,
507
508
  exit_code: r.exit_code, started_at: started, duration_ms: r.duration_ms,
508
509
  counts, output_tail: tail(r.output),
510
+ ...(input.evidence ? { evidence: input.evidence } : {}),
509
511
  ...(input.pending_id ? { pending_id: input.pending_id } : {}),
510
512
  ...(input.step != null ? { step: input.step } : {}),
511
513
  ...(input.note ? { note: input.note } : {}),