@nac3/forge-cli 1.27.0 → 1.28.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/graph_snapshot.d.ts +24 -0
- package/dist/chat/graph_snapshot.d.ts.map +1 -1
- package/dist/chat/graph_snapshot.js +28 -3
- package/dist/chat/graph_snapshot.js.map +1 -1
- package/dist/chat/history_budget.d.ts +114 -0
- package/dist/chat/history_budget.d.ts.map +1 -0
- package/dist/chat/history_budget.js +98 -0
- package/dist/chat/history_budget.js.map +1 -0
- package/dist/chat/server.d.ts.map +1 -1
- package/dist/chat/server.js +49 -0
- package/dist/chat/server.js.map +1 -1
- package/dist/chat/tools/pending.d.ts.map +1 -1
- package/dist/chat/tools/pending.js +25 -10
- package/dist/chat/tools/pending.js.map +1 -1
- package/dist/chat/tools/pending_ack.d.ts +82 -0
- package/dist/chat/tools/pending_ack.d.ts.map +1 -0
- package/dist/chat/tools/pending_ack.js +55 -0
- package/dist/chat/tools/pending_ack.js.map +1 -0
- package/dist/core/instructions_budget.d.ts +113 -0
- package/dist/core/instructions_budget.d.ts.map +1 -0
- package/dist/core/instructions_budget.js +165 -0
- package/dist/core/instructions_budget.js.map +1 -0
- package/dist/core/limits_config.d.ts +15 -0
- package/dist/core/limits_config.d.ts.map +1 -1
- package/dist/core/limits_config.js +17 -0
- package/dist/core/limits_config.js.map +1 -1
- package/dist/nac3/manifest_lazy.d.ts +15 -0
- package/dist/nac3/manifest_lazy.d.ts.map +1 -1
- package/dist/nac3/manifest_lazy.js +17 -1
- package/dist/nac3/manifest_lazy.js.map +1 -1
- package/dist/urazuke/evidence.d.ts.map +1 -1
- package/dist/urazuke/evidence.js +14 -2
- package/dist/urazuke/evidence.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -3
|
@@ -37,6 +37,30 @@ export declare function kindLabel(kind: string): string;
|
|
|
37
37
|
* cualquier kind nuevo, alfabetico. */
|
|
38
38
|
export declare function orderKinds(kinds: Iterable<string>): string[];
|
|
39
39
|
export declare function _resetSnapshotCacheForTests(): void;
|
|
40
|
+
/** Caracteres por token del contenido DENSO -- el de esta seccion.
|
|
41
|
+
*
|
|
42
|
+
* POR QUE NO ES 4 (PND-282, medido 2026-11-03)
|
|
43
|
+
*
|
|
44
|
+
* Esta funcion asumia 4 chars/token, y con eso la seccion declaraba un
|
|
45
|
+
* presupuesto de 2.400 tokens y entregaba 4.693: se pasaba por 1,9x. El
|
|
46
|
+
* 4 no es el numero de ningun contenido real; es la costumbre.
|
|
47
|
+
*
|
|
48
|
+
* Lo que esta seccion emite es una lista de identificadores
|
|
49
|
+
* (`comp.src-workflow-multi_view-ts-computeworkflowsview`,
|
|
50
|
+
* `module.evidence-mutation-crlf-test`), que el tokenizador parte en
|
|
51
|
+
* muchas piezas cortas. Calibrado contra `output_tokens`, que viene
|
|
52
|
+
* exacto en el `usage`, el contenido denso mide 1,96 caracteres por
|
|
53
|
+
* token (`measure_prompt_sections.mjs --mode calib`).
|
|
54
|
+
*
|
|
55
|
+
* Un presupuesto declarado en tokens y convertido con el divisor
|
|
56
|
+
* equivocado no es un presupuesto: es una etiqueta. Lo verifica
|
|
57
|
+
* `tests/prompt-sin-duplicar.test.ts`, que compara los tokens REALES de
|
|
58
|
+
* la seccion contra `max_tokens` en vez de confiar en la conversion. */
|
|
59
|
+
export declare const CHARS_PER_TOKEN_DENSE = 1.96;
|
|
60
|
+
/** Convertir un presupuesto en tokens a su presupuesto en caracteres.
|
|
61
|
+
* Un presupuesto no positivo (o no numerico) es cero, no infinito: el
|
|
62
|
+
* llamador que pide "nada" tiene que recibir nada. */
|
|
63
|
+
export declare function tokenBudgetToChars(tokens: number): number;
|
|
40
64
|
/**
|
|
41
65
|
* Build the snapshot section for a project, with per-slug hash cache.
|
|
42
66
|
* Failure mode: graceful -- never throws.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph_snapshot.d.ts","sourceRoot":"","sources":["../../src/chat/graph_snapshot.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAM,MAAM,CAAC;IACf,IAAI,EAAI,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;6DAEyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAK,OAAO,CAAC;IACf,KAAK,EAAE,iBAAiB,EAAE,CAAC;CAC5B;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAE/E,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAO,eAAe,CAAC;IAC9B;gEAC4D;IAC5D,UAAU,CAAC,EAAG,MAAM,CAAC;IACrB,wDAAwD;IACxD,MAAM,CAAC,EAAO,MAAM,CAAC;IACrB,iDAAiD;IACjD,KAAK,CAAC,EAAQ,MAAM,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC;sEACkE;IAClE,EAAE,EAAM,OAAO,CAAC;IAChB,IAAI,EAAI,MAAM,CAAC;IACf,IAAI,EAAI,MAAM,CAAC;IACf,KAAK,EAAG,iBAAiB,EAAE,CAAC;IAC5B,MAAM,EAAE,OAAO,CAAC;CACjB;AAqCD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;wCACwC;AACxC,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAS5D;AAwBD,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;
|
|
1
|
+
{"version":3,"file":"graph_snapshot.d.ts","sourceRoot":"","sources":["../../src/chat/graph_snapshot.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAM,MAAM,CAAC;IACf,IAAI,EAAI,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;6DAEyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAK,OAAO,CAAC;IACf,KAAK,EAAE,iBAAiB,EAAE,CAAC;CAC5B;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAE/E,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAO,eAAe,CAAC;IAC9B;gEAC4D;IAC5D,UAAU,CAAC,EAAG,MAAM,CAAC;IACrB,wDAAwD;IACxD,MAAM,CAAC,EAAO,MAAM,CAAC;IACrB,iDAAiD;IACjD,KAAK,CAAC,EAAQ,MAAM,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC;sEACkE;IAClE,EAAE,EAAM,OAAO,CAAC;IAChB,IAAI,EAAI,MAAM,CAAC;IACf,IAAI,EAAI,MAAM,CAAC;IACf,KAAK,EAAG,iBAAiB,EAAE,CAAC;IAC5B,MAAM,EAAE,OAAO,CAAC;CACjB;AAqCD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;wCACwC;AACxC,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAS5D;AAwBD,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAED;;;;;;;;;;;;;;;;;;yEAkByE;AACzE,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C;;uDAEuD;AACvD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIzD;AAwGD;;;GAGG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAoC7F;AAcD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBzF"}
|
|
@@ -87,9 +87,34 @@ const CACHE = new Map();
|
|
|
87
87
|
export function _resetSnapshotCacheForTests() {
|
|
88
88
|
CACHE.clear();
|
|
89
89
|
}
|
|
90
|
-
/**
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
/** Caracteres por token del contenido DENSO -- el de esta seccion.
|
|
91
|
+
*
|
|
92
|
+
* POR QUE NO ES 4 (PND-282, medido 2026-11-03)
|
|
93
|
+
*
|
|
94
|
+
* Esta funcion asumia 4 chars/token, y con eso la seccion declaraba un
|
|
95
|
+
* presupuesto de 2.400 tokens y entregaba 4.693: se pasaba por 1,9x. El
|
|
96
|
+
* 4 no es el numero de ningun contenido real; es la costumbre.
|
|
97
|
+
*
|
|
98
|
+
* Lo que esta seccion emite es una lista de identificadores
|
|
99
|
+
* (`comp.src-workflow-multi_view-ts-computeworkflowsview`,
|
|
100
|
+
* `module.evidence-mutation-crlf-test`), que el tokenizador parte en
|
|
101
|
+
* muchas piezas cortas. Calibrado contra `output_tokens`, que viene
|
|
102
|
+
* exacto en el `usage`, el contenido denso mide 1,96 caracteres por
|
|
103
|
+
* token (`measure_prompt_sections.mjs --mode calib`).
|
|
104
|
+
*
|
|
105
|
+
* Un presupuesto declarado en tokens y convertido con el divisor
|
|
106
|
+
* equivocado no es un presupuesto: es una etiqueta. Lo verifica
|
|
107
|
+
* `tests/prompt-sin-duplicar.test.ts`, que compara los tokens REALES de
|
|
108
|
+
* la seccion contra `max_tokens` en vez de confiar en la conversion. */
|
|
109
|
+
export const CHARS_PER_TOKEN_DENSE = 1.96;
|
|
110
|
+
/** Convertir un presupuesto en tokens a su presupuesto en caracteres.
|
|
111
|
+
* Un presupuesto no positivo (o no numerico) es cero, no infinito: el
|
|
112
|
+
* llamador que pide "nada" tiene que recibir nada. */
|
|
113
|
+
export function tokenBudgetToChars(tokens) {
|
|
114
|
+
const n = Number(tokens);
|
|
115
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
116
|
+
return 0;
|
|
117
|
+
return Math.floor(n * CHARS_PER_TOKEN_DENSE);
|
|
93
118
|
}
|
|
94
119
|
function renderSnapshot(nodes, maxTokens, hash, fetchedAt) {
|
|
95
120
|
if (nodes.length === 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph_snapshot.js","sourceRoot":"","sources":["../../src/chat/graph_snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,MAAM,MAAM,aAAa,CAAC;AAyCjC;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,GAA2B;IAC1C,IAAI,EAAQ,MAAM;IAClB,MAAM,EAAM,SAAS;IACrB,SAAS,EAAG,aAAa;IACzB,OAAO,EAAK,SAAS;IACrB,OAAO,EAAK,WAAW;IACvB,MAAM,EAAM,UAAU;IACtB,QAAQ,EAAI,WAAW;IACvB,SAAS,EAAG,YAAY;IACxB,OAAO,EAAK,WAAW;IACvB,KAAK,EAAO,QAAQ;IACpB,QAAQ,EAAI,WAAW;IACvB,QAAQ,EAAI,WAAW;IACvB,QAAQ,EAAI,WAAW;CACxB,CAAC;AACF,MAAM,aAAa,GAAsB;IACvC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW;IAChE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU;CAC7E,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AACnC,CAAC;AAED;wCACwC;AACxC,MAAM,UAAU,UAAU,CAAC,KAAuB;IAChD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvC,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAC3C,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;QACzB,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;iBAIiB;AACjB,MAAM,MAAM,GAAG;IACb,EAAE;IACF,0EAA0E;IAC1E,uEAAuE;IACvE,8DAA8D;IAC9D,sEAAsE;CACvE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AASb,MAAM,KAAK,GAA4B,IAAI,GAAG,EAAE,CAAC;AAEjD,MAAM,UAAU,2BAA2B;IACzC,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"graph_snapshot.js","sourceRoot":"","sources":["../../src/chat/graph_snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Yujin Forge -- QUE se arrastra de la conversacion, y que se desprende
|
|
3
|
+
* (P0, PND-281).
|
|
4
|
+
*
|
|
5
|
+
* EL PROBLEMA, MEDIDO
|
|
6
|
+
*
|
|
7
|
+
* Cada turno vuelve a mandar la conversacion entera. En el camino CLI eso
|
|
8
|
+
* esta escrito en la cabecera de `claude_cli.ts` ("Multi-turn conversation
|
|
9
|
+
* history is concatenated into a single prompt") y en el camino HTTP es el
|
|
10
|
+
* `messages[]` completo. Peor: ese prefijo lo relee CADA llamada de la rueda
|
|
11
|
+
* de herramientas del turno -- 159 de mediana en el brazo C1. Un token que
|
|
12
|
+
* entra en la llamada 1 se paga 159 veces.
|
|
13
|
+
*
|
|
14
|
+
* Medido sobre los 47 turnos del brazo: la historia arrastrada llego a
|
|
15
|
+
* 110.060 tokens y cuesta USD 181,25 (15,38% del corpus), y la regresion
|
|
16
|
+
* dice que NO compra lo que cuesta -- pendiente -0,103 llamadas de
|
|
17
|
+
* re-orientacion por cada 1.000 tokens de historia, R2 = 0,0727, t = 1,88
|
|
18
|
+
* (no significativo). Tomada como si fuera real: compra USD 0,0176 y cuesta
|
|
19
|
+
* USD 0,0890. 5,1x en contra.
|
|
20
|
+
*
|
|
21
|
+
* QUE SE DESPRENDE, Y UNA CORRECCION A LA PREMISA
|
|
22
|
+
*
|
|
23
|
+
* La decision del dueno nombro tres clases: los `tool_use` con sus salidas,
|
|
24
|
+
* el `thinking`, y el detalle de los comandos de los turnos anteriores.
|
|
25
|
+
* NINGUNA DE LAS TRES VIAJA: `flattenMessages` concatena solo
|
|
26
|
+
* {role, content} y el `content` del turno del asistente es `reply.text`
|
|
27
|
+
* -- el texto final. Medido sobre el corpus entero: cero `tool_use`, cero
|
|
28
|
+
* `tool_result`, cero `<thinking>`.
|
|
29
|
+
*
|
|
30
|
+
* Lo que se arrastra es conversacion entera, y su unico reparto real es por
|
|
31
|
+
* ROL: 41,12% lo escribio el dueno, 58,88% el agente
|
|
32
|
+
* (`splitHistoryByRole`, scripts/measure_base_payers.mjs).
|
|
33
|
+
*
|
|
34
|
+
* Asi que el principio que el dueno fijo para el CLAUDE.md es el que aplica,
|
|
35
|
+
* y aplica a la mitad que de verdad esta ahi:
|
|
36
|
+
*
|
|
37
|
+
* lo que el agente DEBE OBEDECER se queda;
|
|
38
|
+
* lo que puede necesitar CONSULTAR se desprende, y queda una linea
|
|
39
|
+
* que dice donde esta.
|
|
40
|
+
*
|
|
41
|
+
* - Los mensajes del DUENO son la obligacion: viajan ENTEROS y en orden.
|
|
42
|
+
* Es un invariante, no una preferencia -- `tests/history-budget.test.ts`
|
|
43
|
+
* lo defiende y cae si una version futura los recorta para ahorrar mas.
|
|
44
|
+
* - Las respuestas del AGENTE son consultables: las recientes son la
|
|
45
|
+
* conversacion en curso y viajan enteras; las viejas se desprenden y
|
|
46
|
+
* dejan un puntero. El propio dueno escribio el fundamento: "si el
|
|
47
|
+
* agente necesita el detalle de un turno pasado, lo pide: esta en
|
|
48
|
+
* disco". Y esta: el `sessionStore` persiste el transcripto completo.
|
|
49
|
+
*
|
|
50
|
+
* EL AHORRO, CON LA REGLA PUESTA
|
|
51
|
+
*
|
|
52
|
+
* El contrafactico publicado (USD 183) capaba el TOTAL de la historia, o
|
|
53
|
+
* sea media un mundo donde los mensajes del dueno tambien se recortan --
|
|
54
|
+
* que la decision prohibe. Con su mitad protegida, lo alcanzable es
|
|
55
|
+
* USD 117,26 desprendiendo todo lo del agente y USD 102,94 con el
|
|
56
|
+
* presupuesto de 4.000 tokens que entra por default
|
|
57
|
+
* (`dragCounterfactualOwnerWhole`). La diferencia contra los 183 son sus
|
|
58
|
+
* propios mensajes, y no se tocan.
|
|
59
|
+
*
|
|
60
|
+
* ASCII-only.
|
|
61
|
+
*/
|
|
62
|
+
import type { ChatMessage } from './claude.js';
|
|
63
|
+
/** Caracteres por token de la conversacion arrastrada.
|
|
64
|
+
*
|
|
65
|
+
* NO es 4 (el numero que se repite por costumbre) ni 3,3 (el de
|
|
66
|
+
* `measure_turn_weight.mjs`, calibrado sobre la SALIDA del modelo). Son
|
|
67
|
+
* 2,36, medidos por minimos cuadrados sobre los 47 turnos del brazo
|
|
68
|
+
* contra el `usage` real -- R2 = 0,9915. El contenido es prosa tecnica en
|
|
69
|
+
* castellano, que mide mas denso que el ingles.
|
|
70
|
+
*
|
|
71
|
+
* Asumir 4 fue exactamente el defecto de `graph_snapshot.ts:140`: un
|
|
72
|
+
* presupuesto declarado en tokens, convertido con el divisor equivocado,
|
|
73
|
+
* que entrega el doble de lo que dice. No se repite aca: el caso
|
|
74
|
+
* "respeta el presupuesto que declara" lo verifica contra este divisor. */
|
|
75
|
+
export declare const HISTORY_CHARS_PER_TOKEN = 2.36;
|
|
76
|
+
/** Presupuesto por default para lo que el AGENTE dijo en turnos anteriores.
|
|
77
|
+
* 4.000 tokens = el paquete que el contrafactico midio (USD 102,94 de
|
|
78
|
+
* ahorro, 6,55% del corpus). Alcanza para que las ultimas conclusiones
|
|
79
|
+
* viajen enteras; lo de mas atras queda en disco. */
|
|
80
|
+
export declare const DEFAULT_AGENT_HISTORY_BUDGET_TOKENS = 4000;
|
|
81
|
+
export interface BudgetHistoryOptions {
|
|
82
|
+
/** Tope en tokens para las respuestas del agente de turnos ANTERIORES.
|
|
83
|
+
* <= 0, NaN o ausente desactivan el recorte (una config a mano no puede
|
|
84
|
+
* terminar mandando la conversacion vacia). */
|
|
85
|
+
agentBudgetTokens?: number;
|
|
86
|
+
/** Solo para el puntero: de donde se pide el detalle. */
|
|
87
|
+
transcriptHint?: string;
|
|
88
|
+
}
|
|
89
|
+
export interface BudgetHistoryResult {
|
|
90
|
+
messages: ChatMessage[];
|
|
91
|
+
/** Cuantas respuestas del agente quedaron reemplazadas por un puntero. */
|
|
92
|
+
detached: number;
|
|
93
|
+
/** Caracteres que se dejaron de mandar. */
|
|
94
|
+
saved_chars: number;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Aplicar el presupuesto a la conversacion que va al modelo.
|
|
98
|
+
*
|
|
99
|
+
* Invariantes (los defiende la bateria):
|
|
100
|
+
* 1. Ningun mensaje del dueno se toca. Nunca. Ni con presupuesto cero.
|
|
101
|
+
* 2. El orden y la cantidad de mensajes no cambian (el par
|
|
102
|
+
* usuario/asistente sigue alineado para cualquier consumidor).
|
|
103
|
+
* 3. El ultimo mensaje -- el pedido activo de este turno -- no se toca.
|
|
104
|
+
* 4. La respuesta mas reciente del agente viaja entera aunque pase el
|
|
105
|
+
* presupuesto por si sola: es lo que acaba de decir, y sin eso el
|
|
106
|
+
* turno siguiente no sabe de donde viene.
|
|
107
|
+
* 5. Por debajo del presupuesto la conversacion sale byte a byte igual.
|
|
108
|
+
* 6. Nunca encarece: si el puntero fuera mas largo que lo que reemplaza,
|
|
109
|
+
* se deja el original.
|
|
110
|
+
* 7. Los metadatos del turno (`hidden`, `brain_tier`, `doc_loaded`)
|
|
111
|
+
* sobreviven: los consumen `flattenMessages` y el router pegajoso.
|
|
112
|
+
*/
|
|
113
|
+
export declare function budgetHistory(messages: ChatMessage[], opts?: BudgetHistoryOptions): BudgetHistoryResult;
|
|
114
|
+
//# sourceMappingURL=history_budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history_budget.d.ts","sourceRoot":"","sources":["../../src/chat/history_budget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;;4EAW4E;AAC5E,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAE5C;;;sDAGsD;AACtD,eAAO,MAAM,mCAAmC,OAAO,CAAC;AAExD,MAAM,WAAW,oBAAoB;IACnC;;oDAEgD;IAChD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yDAAyD;IACzD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;CACrB;AAgBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,WAAW,EAAE,EACvB,IAAI,GAAE,oBAAyB,GAC9B,mBAAmB,CAqCrB"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/** Caracteres por token de la conversacion arrastrada.
|
|
2
|
+
*
|
|
3
|
+
* NO es 4 (el numero que se repite por costumbre) ni 3,3 (el de
|
|
4
|
+
* `measure_turn_weight.mjs`, calibrado sobre la SALIDA del modelo). Son
|
|
5
|
+
* 2,36, medidos por minimos cuadrados sobre los 47 turnos del brazo
|
|
6
|
+
* contra el `usage` real -- R2 = 0,9915. El contenido es prosa tecnica en
|
|
7
|
+
* castellano, que mide mas denso que el ingles.
|
|
8
|
+
*
|
|
9
|
+
* Asumir 4 fue exactamente el defecto de `graph_snapshot.ts:140`: un
|
|
10
|
+
* presupuesto declarado en tokens, convertido con el divisor equivocado,
|
|
11
|
+
* que entrega el doble de lo que dice. No se repite aca: el caso
|
|
12
|
+
* "respeta el presupuesto que declara" lo verifica contra este divisor. */
|
|
13
|
+
export const HISTORY_CHARS_PER_TOKEN = 2.36;
|
|
14
|
+
/** Presupuesto por default para lo que el AGENTE dijo en turnos anteriores.
|
|
15
|
+
* 4.000 tokens = el paquete que el contrafactico midio (USD 102,94 de
|
|
16
|
+
* ahorro, 6,55% del corpus). Alcanza para que las ultimas conclusiones
|
|
17
|
+
* viajen enteras; lo de mas atras queda en disco. */
|
|
18
|
+
export const DEFAULT_AGENT_HISTORY_BUDGET_TOKENS = 4000;
|
|
19
|
+
/** El puntero que reemplaza una respuesta desprendida.
|
|
20
|
+
*
|
|
21
|
+
* Tiene que ser ACCIONABLE, no un "[recortado]": si el agente lee que no
|
|
22
|
+
* dijo nada en ese turno, vuelve a hacer el trabajo. Dice las tres cosas
|
|
23
|
+
* que necesita -- que hubo una respuesta, de que tamano, y que el detalle
|
|
24
|
+
* se pide. Y arranca con las primeras palabras de lo que dijo, que es lo
|
|
25
|
+
* que le permite saber si le hace falta pedirlo. */
|
|
26
|
+
function punteroDe(content, hint) {
|
|
27
|
+
const cabeza = content.replace(/\s+/g, ' ').trim().slice(0, 120);
|
|
28
|
+
return '[Forge: respuesta desprendida de un turno anterior -- '
|
|
29
|
+
+ String(content.length) + ' caracteres. Arrancaba: "' + cabeza + '...". '
|
|
30
|
+
+ 'El texto completo esta en ' + hint + '; pedilo si lo necesitas.]';
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Aplicar el presupuesto a la conversacion que va al modelo.
|
|
34
|
+
*
|
|
35
|
+
* Invariantes (los defiende la bateria):
|
|
36
|
+
* 1. Ningun mensaje del dueno se toca. Nunca. Ni con presupuesto cero.
|
|
37
|
+
* 2. El orden y la cantidad de mensajes no cambian (el par
|
|
38
|
+
* usuario/asistente sigue alineado para cualquier consumidor).
|
|
39
|
+
* 3. El ultimo mensaje -- el pedido activo de este turno -- no se toca.
|
|
40
|
+
* 4. La respuesta mas reciente del agente viaja entera aunque pase el
|
|
41
|
+
* presupuesto por si sola: es lo que acaba de decir, y sin eso el
|
|
42
|
+
* turno siguiente no sabe de donde viene.
|
|
43
|
+
* 5. Por debajo del presupuesto la conversacion sale byte a byte igual.
|
|
44
|
+
* 6. Nunca encarece: si el puntero fuera mas largo que lo que reemplaza,
|
|
45
|
+
* se deja el original.
|
|
46
|
+
* 7. Los metadatos del turno (`hidden`, `brain_tier`, `doc_loaded`)
|
|
47
|
+
* sobreviven: los consumen `flattenMessages` y el router pegajoso.
|
|
48
|
+
*/
|
|
49
|
+
export function budgetHistory(messages, opts = {}) {
|
|
50
|
+
const budget = Number(opts.agentBudgetTokens);
|
|
51
|
+
const sinRecorte = { messages, detached: 0, saved_chars: 0 };
|
|
52
|
+
if (!Number.isFinite(budget) || budget <= 0)
|
|
53
|
+
return sinRecorte;
|
|
54
|
+
if (!Array.isArray(messages) || messages.length === 0)
|
|
55
|
+
return sinRecorte;
|
|
56
|
+
const hint = opts.transcriptHint || 'el transcripto de la sesion en disco';
|
|
57
|
+
const capChars = budget * HISTORY_CHARS_PER_TOKEN;
|
|
58
|
+
const ultimo = messages.length - 1;
|
|
59
|
+
/* De lo mas nuevo a lo mas viejo: lo reciente es conversacion en curso.
|
|
60
|
+
* La primera respuesta del agente que se encuentra entra entera (nota 4)
|
|
61
|
+
* y DESPUES se empieza a cobrar contra el presupuesto, que es lo que hace
|
|
62
|
+
* que el tope se mida sobre los turnos anteriores. */
|
|
63
|
+
let gastado = 0;
|
|
64
|
+
let masReciente = true;
|
|
65
|
+
const out = messages.slice();
|
|
66
|
+
let detached = 0;
|
|
67
|
+
let saved = 0;
|
|
68
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
69
|
+
const m = messages[i];
|
|
70
|
+
if (!m)
|
|
71
|
+
continue;
|
|
72
|
+
if (m.role !== 'assistant')
|
|
73
|
+
continue; /* invariante 1 */
|
|
74
|
+
if (i === ultimo)
|
|
75
|
+
continue; /* invariante 3 */
|
|
76
|
+
const len = m.content.length;
|
|
77
|
+
if (masReciente) {
|
|
78
|
+
masReciente = false;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (gastado + len <= capChars) {
|
|
82
|
+
gastado += len;
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const puntero = punteroDe(m.content, hint);
|
|
86
|
+
if (puntero.length >= len) {
|
|
87
|
+
gastado += len;
|
|
88
|
+
continue;
|
|
89
|
+
} /* invariante 6 */
|
|
90
|
+
out[i] = { ...m, content: puntero }; /* invariante 7 */
|
|
91
|
+
detached++;
|
|
92
|
+
saved += len - puntero.length;
|
|
93
|
+
}
|
|
94
|
+
if (detached === 0)
|
|
95
|
+
return sinRecorte; /* invariante 5 */
|
|
96
|
+
return { messages: out, detached, saved_chars: saved };
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=history_budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history_budget.js","sourceRoot":"","sources":["../../src/chat/history_budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/chat/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAA2D,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAKjG,OAAO,EAAoD,KAAK,aAAa,EAAoB,MAAM,aAAa,CAAC;AAErH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAInD,OAAO,EAEL,KAAK,SAAS,EACf,MAAM,iBAAiB,CAAC;AAczB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAsBjD,OAAO,EAAyD,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/chat/server.ts"],"names":[],"mappings":"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"}
|
package/dist/chat/server.js
CHANGED
|
@@ -66,6 +66,7 @@ import { getSessionProject, setSessionProject } from './session_projects.js';
|
|
|
66
66
|
import { beginTurn, endTurn, interruptActiveTurn, interruptAllTurns, isTurnActive, activeTurnId, activeTurns, } from './turn_control.js';
|
|
67
67
|
import { openSteering, closeSteering, drainSteers, formatSteer, queueSteer, pendingSteers, } from './turn_steering.js';
|
|
68
68
|
import { manifest as nac3Manifest } from '../nac3/internal_manifest.js';
|
|
69
|
+
import { buildToolDefs } from '../mcp/forge_verbs_server.js';
|
|
69
70
|
import { buildManifestForPrompt } from '../nac3/manifest_lazy.js';
|
|
70
71
|
import { popPending, logApproval } from '../nac3/approval_queue.js';
|
|
71
72
|
/**
|
|
@@ -6901,6 +6902,29 @@ async function handleChat(req, res, ctx) {
|
|
|
6901
6902
|
* user turn; fall back to the client view if not. */
|
|
6902
6903
|
turnMessages = normalized;
|
|
6903
6904
|
}
|
|
6905
|
+
/* P0 (PND-281) -- el presupuesto de lo que se arrastra. Va ACA y no en
|
|
6906
|
+
* `flattenMessages` a proposito: aca lo cobran TODOS los cerebros (el
|
|
6907
|
+
* camino CLI aplana, los de HTTP mandan el `messages[]`), y los dos
|
|
6908
|
+
* pagan el prefijo en cada llamada de la rueda de herramientas.
|
|
6909
|
+
*
|
|
6910
|
+
* Los mensajes del dueno NO se tocan. Lo que se acota son las
|
|
6911
|
+
* respuestas viejas del agente, que quedan en el `sessionStore` y se
|
|
6912
|
+
* piden si hacen falta. El detalle de por que, y los numeros, estan en
|
|
6913
|
+
* la cabecera de history_budget.ts. */
|
|
6914
|
+
let historyBudgetApplied = { detached: 0, saved_chars: 0 };
|
|
6915
|
+
try {
|
|
6916
|
+
const { budgetHistory } = await import('./history_budget.js');
|
|
6917
|
+
const { readLimitsConfig: _readLimForHist } = await import('../core/limits_config.js');
|
|
6918
|
+
const _limHist = await _readLimForHist();
|
|
6919
|
+
const recortado = budgetHistory(turnMessages, {
|
|
6920
|
+
agentBudgetTokens: _limHist.agent_history_budget_tokens,
|
|
6921
|
+
transcriptHint: sessionStore.filePath,
|
|
6922
|
+
});
|
|
6923
|
+
turnMessages = recortado.messages;
|
|
6924
|
+
historyBudgetApplied = { detached: recortado.detached, saved_chars: recortado.saved_chars };
|
|
6925
|
+
}
|
|
6926
|
+
catch { /* nunca bloquear el turno por el recorte */ }
|
|
6927
|
+
void historyBudgetApplied;
|
|
6904
6928
|
/* Register THIS turn as the active one right before the model
|
|
6905
6929
|
* call. beginTurn returns the AbortSignal the callers honor
|
|
6906
6930
|
* (claude.ts at round boundary, claude_cli kills the subprocess).
|
|
@@ -7747,6 +7771,21 @@ async function handleChat(req, res, ctx) {
|
|
|
7747
7771
|
}
|
|
7748
7772
|
}
|
|
7749
7773
|
}
|
|
7774
|
+
/** Los verb_id que ya viajan como tool MCP individual con su esquema
|
|
7775
|
+
* completo (server `forge_verbs`). Se calcula de la MISMA fuente que
|
|
7776
|
+
* `claude_cli.ts` usa para registrarlas -- `buildToolDefs` sobre el
|
|
7777
|
+
* manifest -- para que agregar un prefijo a `EXPOSE_PREFIXES` no deje las
|
|
7778
|
+
* dos listas desincronizadas (par productor/consumidor, SQ 14).
|
|
7779
|
+
*
|
|
7780
|
+
* Se memoiza porque el manifest no cambia en caliente y esto corre en cada
|
|
7781
|
+
* turno. */
|
|
7782
|
+
let _verbosExpuestosCache;
|
|
7783
|
+
function verbosYaExpuestosComoTool() {
|
|
7784
|
+
if (!_verbosExpuestosCache) {
|
|
7785
|
+
_verbosExpuestosCache = [...buildToolDefs(nac3Manifest().verbs).nameToVerb.values()];
|
|
7786
|
+
}
|
|
7787
|
+
return _verbosExpuestosCache;
|
|
7788
|
+
}
|
|
7750
7789
|
export function buildSystemPrompt(ctx, mode = 'didactico', pilotState = {
|
|
7751
7790
|
pilot_completed: true, target_pending: false, mode_pending: false,
|
|
7752
7791
|
},
|
|
@@ -8105,6 +8144,16 @@ multiagentEnabled = false) {
|
|
|
8105
8144
|
/* operate mode (Pablo 2026-10-10): the config/orchestrator verbs only
|
|
8106
8145
|
* exist in the prompt when the deployment profile authorises them. */
|
|
8107
8146
|
includeOperateVerbs: operateEnabled(),
|
|
8147
|
+
/* 1a (PND-282) -- no describir dos veces el mismo verbo. Solo cuando
|
|
8148
|
+
* el camino de esta request LLEVA las tools individuales: `panelMode
|
|
8149
|
+
* === 'mcp-bridge'` es exactamente el caso claude-code-cli con el
|
|
8150
|
+
* bridge vivo, que es cuando `claude_cli.ts` registra el server
|
|
8151
|
+
* `forge_verbs` con su `buildToolDefs`. En el camino HTTP (BYOK /
|
|
8152
|
+
* Console / managed) NO hay tools individuales y el stub es la unica
|
|
8153
|
+
* puerta: ahi no se recorta nada. */
|
|
8154
|
+
alreadyExposedVerbIds: panelMode === 'mcp-bridge'
|
|
8155
|
+
? verbosYaExpuestosComoTool()
|
|
8156
|
+
: undefined,
|
|
8108
8157
|
}).text,
|
|
8109
8158
|
/* alpha.59z.37 NAC-3 v3.x backend tools (task #23 slice 1):
|
|
8110
8159
|
* splice the pre-built app.* verbs section. Empty string ->
|