@nac3/forge-cli 1.23.3 → 1.23.5
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/bin/yf.js +0 -0
- package/dist/chat/doctrine_digest.d.ts.map +1 -1
- package/dist/chat/doctrine_digest.js +4 -1
- package/dist/chat/doctrine_digest.js.map +1 -1
- package/dist/chat/server.d.ts.map +1 -1
- package/dist/chat/server.js +72 -19
- package/dist/chat/server.js.map +1 -1
- package/dist/chat/tools/evidence.d.ts +34 -2
- package/dist/chat/tools/evidence.d.ts.map +1 -1
- package/dist/chat/tools/evidence.js +90 -12
- package/dist/chat/tools/evidence.js.map +1 -1
- package/dist/commands/urazuke.d.ts.map +1 -1
- package/dist/commands/urazuke.js +27 -0
- package/dist/commands/urazuke.js.map +1 -1
- package/dist/core/error_catalog.d.ts +4 -0
- package/dist/core/error_catalog.d.ts.map +1 -1
- package/dist/core/error_catalog.js +16 -0
- package/dist/core/error_catalog.js.map +1 -1
- package/dist/core/loopback_post.d.ts +101 -0
- package/dist/core/loopback_post.d.ts.map +1 -0
- package/dist/core/loopback_post.js +156 -0
- package/dist/core/loopback_post.js.map +1 -0
- package/dist/docs/doctrine/urazuke.md +50 -38
- package/dist/mcp/forge_panel_server.d.ts +1 -26
- package/dist/mcp/forge_panel_server.d.ts.map +1 -1
- package/dist/mcp/forge_panel_server.js +5 -26
- package/dist/mcp/forge_panel_server.js.map +1 -1
- package/dist/mcp/forge_verbs_server.d.ts +1 -11
- package/dist/mcp/forge_verbs_server.d.ts.map +1 -1
- package/dist/mcp/forge_verbs_server.js +7 -23
- package/dist/mcp/forge_verbs_server.js.map +1 -1
- package/dist/mcp/panel_invoke.d.ts +51 -0
- package/dist/mcp/panel_invoke.d.ts.map +1 -0
- package/dist/mcp/panel_invoke.js +102 -0
- package/dist/mcp/panel_invoke.js.map +1 -0
- package/dist/nac3/internal_manifest.d.ts +2 -0
- package/dist/nac3/internal_manifest.d.ts.map +1 -1
- package/dist/nac3/internal_manifest.js +18 -3
- package/dist/nac3/internal_manifest.js.map +1 -1
- package/dist/nac3/verb_budget.d.ts +110 -0
- package/dist/nac3/verb_budget.d.ts.map +1 -0
- package/dist/nac3/verb_budget.js +142 -0
- package/dist/nac3/verb_budget.js.map +1 -0
- package/dist/relay/in_flight_turn.d.ts +52 -11
- package/dist/relay/in_flight_turn.d.ts.map +1 -1
- package/dist/relay/in_flight_turn.js +98 -30
- package/dist/relay/in_flight_turn.js.map +1 -1
- package/dist/relay/loopback_turn.d.ts +15 -42
- package/dist/relay/loopback_turn.d.ts.map +1 -1
- package/dist/relay/loopback_turn.js +27 -115
- package/dist/relay/loopback_turn.js.map +1 -1
- package/dist/urazuke/evidence.d.ts +22 -0
- package/dist/urazuke/evidence.d.ts.map +1 -1
- package/dist/urazuke/evidence.js +42 -3
- package/dist/urazuke/evidence.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/doctrine/urazuke.md +50 -38
- package/package.json +20 -18
- package/src/i18n/catalogs/ar.json +3 -0
- package/src/i18n/catalogs/de.json +3 -0
- package/src/i18n/catalogs/en.json +3 -0
- package/src/i18n/catalogs/es.json +3 -0
- package/src/i18n/catalogs/fr.json +3 -0
- package/src/i18n/catalogs/hi.json +3 -0
- package/src/i18n/catalogs/it.json +3 -0
- package/src/i18n/catalogs/ja.json +3 -0
- package/src/i18n/catalogs/pt.json +3 -0
- package/src/i18n/catalogs/zh.json +3 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El POST por loopback que dura lo que dura el trabajo.
|
|
3
|
+
*
|
|
4
|
+
* Forge habla consigo mismo por HTTP en 127.0.0.1 en dos lugares distintos y
|
|
5
|
+
* por el mismo motivo: el que pide no comparte memoria con el que ejecuta.
|
|
6
|
+
*
|
|
7
|
+
* - El consumidor de pedidos del telefono POSTea a su propio /api/chat
|
|
8
|
+
* (relay/loopback_turn.ts).
|
|
9
|
+
* - Los dos servers MCP -- nietos de Forge, lanzados por `claude -p` --
|
|
10
|
+
* POSTean cada invocacion de verbo a /api/forge/panel-invoke
|
|
11
|
+
* (mcp/forge_verbs_server.ts, mcp/forge_panel_server.ts).
|
|
12
|
+
*
|
|
13
|
+
* Las dos respuestas son un JSON que recien se arma cuando el trabajo entero
|
|
14
|
+
* termino, asi que sus CABECERAS no salen antes. Con `fetch` sin opciones ese
|
|
15
|
+
* POST hereda el headersTimeout de undici, un limite pensado para una llamada
|
|
16
|
+
* corta, y pasado ese punto muere el fetch -- no el trabajo. El servidor sigue
|
|
17
|
+
* trabajando y termina; el que esperaba ya recibio "fetch failed".
|
|
18
|
+
*
|
|
19
|
+
* EL LIMITE ESTA MEDIDO, NO ESTIMADO: contra un servidor que acepta la
|
|
20
|
+
* conexion y nunca responde, el fetch global de Node 22.16 murio a los
|
|
21
|
+
* 305.677 ms con name=TypeError, message="fetch failed" y
|
|
22
|
+
* cause.code=UND_ERR_HEADERS_TIMEOUT.
|
|
23
|
+
*
|
|
24
|
+
* El defecto se arreglo primero en el camino del telefono (PND-234) y volvio a
|
|
25
|
+
* aparecer, identico, en el camino de los verbos (PND-235): el mismo techo de
|
|
26
|
+
* cinco minutos sobre `yujin.evidence.run`, que es justo el verbo que acredita
|
|
27
|
+
* una bateria de siete minutos. Un arreglo que no se comparte se vuelve a
|
|
28
|
+
* pagar, asi que el transporte vive aca y los dos lo usan.
|
|
29
|
+
*
|
|
30
|
+
* POR QUE node:http Y NO fetch. Es la unica forma de mandar los tiempos sin
|
|
31
|
+
* depender de undici: Node lo trae adentro pero no lo expone como paquete, y
|
|
32
|
+
* construir un Agent con otro headersTimeout exigiria declarar una dependencia
|
|
33
|
+
* nueva para algo que el stdlib ya hace. La conexion es loopback y en claro,
|
|
34
|
+
* asi que no se pierde nada por bajar de capa.
|
|
35
|
+
*
|
|
36
|
+
* EL PRESUPUESTO NO DESAPARECE, cambia de escala -- y lo fija el LLAMADOR,
|
|
37
|
+
* porque el unico que sabe cuanto puede durar legitimamente el trabajo es el
|
|
38
|
+
* que lo pidio. Lo que no se usa es `req.setTimeout`, que mide INACTIVIDAD del
|
|
39
|
+
* socket: un trabajo que piensa diez minutos no manda un byte, y ese
|
|
40
|
+
* temporizador lo mataria sin motivo, que es la forma exacta del bug que esto
|
|
41
|
+
* cierra. Lo que se mide es el tiempo TOTAL.
|
|
42
|
+
*
|
|
43
|
+
* ASCII puro.
|
|
44
|
+
*/
|
|
45
|
+
/** Piso del presupuesto: ningun POST por loopback se corta antes de esto. */
|
|
46
|
+
export declare const LOOPBACK_MIN_BUDGET_MS = 30000;
|
|
47
|
+
/**
|
|
48
|
+
* Como se corto la espera, y es una distincion de verdad, no un matiz.
|
|
49
|
+
*
|
|
50
|
+
* 'undelivered' -- hay PRUEBA POSITIVA de que el trabajo no corrio: el
|
|
51
|
+
* saludo TCP no existio, no hay nadie escuchando ahi.
|
|
52
|
+
* 'unanswered' -- la espera fracaso; el trabajo puede estar hecho.
|
|
53
|
+
*
|
|
54
|
+
* En la duda se dice 'unanswered'. Afirmar que no se hizo nada cuando si se
|
|
55
|
+
* hizo es el error del que venimos: el usuario descarta trabajo terminado.
|
|
56
|
+
*/
|
|
57
|
+
export type LoopbackCutKind = 'undelivered' | 'unanswered';
|
|
58
|
+
export interface LoopbackResponse {
|
|
59
|
+
status: number;
|
|
60
|
+
body: string;
|
|
61
|
+
}
|
|
62
|
+
/** El corte, con lo que el llamador necesita para redactar su propio mensaje
|
|
63
|
+
* (cada camino tiene su catalogo de errores y su idioma). */
|
|
64
|
+
export declare class LoopbackCut extends Error {
|
|
65
|
+
readonly kind: LoopbackCutKind;
|
|
66
|
+
/** Se vencio el presupuesto (y no: el socket se cayo por su cuenta). */
|
|
67
|
+
readonly expired: boolean;
|
|
68
|
+
readonly budget_ms: number;
|
|
69
|
+
readonly elapsed_ms: number;
|
|
70
|
+
constructor(kind: LoopbackCutKind, args: {
|
|
71
|
+
expired: boolean;
|
|
72
|
+
budgetMs: number;
|
|
73
|
+
elapsedMs: number;
|
|
74
|
+
cause?: unknown;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* El socket nunca llego a conectar: no hay servidor escuchando ahi.
|
|
79
|
+
*
|
|
80
|
+
* Es la unica evidencia de que el trabajo NO corrio. Se mira el errno y no el
|
|
81
|
+
* texto porque el texto cambia entre versiones de Node y entre sistemas.
|
|
82
|
+
*/
|
|
83
|
+
export declare function isConnectionRefusal(e: unknown): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* POST de un JSON al loopback, esperando lo que tarde.
|
|
86
|
+
*
|
|
87
|
+
* Devuelve el status y el cuerpo crudo; parsear es del llamador, que es el
|
|
88
|
+
* unico que conoce la forma de la respuesta. Un status que no es 200 NO es una
|
|
89
|
+
* excepcion: esconderlo seria esconder el dato que permite diagnosticarlo.
|
|
90
|
+
*/
|
|
91
|
+
export declare function postLoopbackJson(args: {
|
|
92
|
+
port: number;
|
|
93
|
+
path: string;
|
|
94
|
+
payload: unknown;
|
|
95
|
+
/** Techo de tiempo TOTAL. Lo decide el llamador: ver nac3/verb_budget.ts y
|
|
96
|
+
* relay/loopback_turn.ts. Un valor no positivo cae al piso, no se obedece. */
|
|
97
|
+
budgetMs: number;
|
|
98
|
+
host?: string;
|
|
99
|
+
headers?: Record<string, string>;
|
|
100
|
+
}): Promise<LoopbackResponse>;
|
|
101
|
+
//# sourceMappingURL=loopback_post.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loopback_post.d.ts","sourceRoot":"","sources":["../../src/core/loopback_post.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAIH,6EAA6E;AAC7E,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAE7C;;;;;;;;;GASG;AACH,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG,YAAY,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED;8DAC8D;AAC9D,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CASpH;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAKvD;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB;mFAC+E;IAC/E,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAyE5B"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El POST por loopback que dura lo que dura el trabajo.
|
|
3
|
+
*
|
|
4
|
+
* Forge habla consigo mismo por HTTP en 127.0.0.1 en dos lugares distintos y
|
|
5
|
+
* por el mismo motivo: el que pide no comparte memoria con el que ejecuta.
|
|
6
|
+
*
|
|
7
|
+
* - El consumidor de pedidos del telefono POSTea a su propio /api/chat
|
|
8
|
+
* (relay/loopback_turn.ts).
|
|
9
|
+
* - Los dos servers MCP -- nietos de Forge, lanzados por `claude -p` --
|
|
10
|
+
* POSTean cada invocacion de verbo a /api/forge/panel-invoke
|
|
11
|
+
* (mcp/forge_verbs_server.ts, mcp/forge_panel_server.ts).
|
|
12
|
+
*
|
|
13
|
+
* Las dos respuestas son un JSON que recien se arma cuando el trabajo entero
|
|
14
|
+
* termino, asi que sus CABECERAS no salen antes. Con `fetch` sin opciones ese
|
|
15
|
+
* POST hereda el headersTimeout de undici, un limite pensado para una llamada
|
|
16
|
+
* corta, y pasado ese punto muere el fetch -- no el trabajo. El servidor sigue
|
|
17
|
+
* trabajando y termina; el que esperaba ya recibio "fetch failed".
|
|
18
|
+
*
|
|
19
|
+
* EL LIMITE ESTA MEDIDO, NO ESTIMADO: contra un servidor que acepta la
|
|
20
|
+
* conexion y nunca responde, el fetch global de Node 22.16 murio a los
|
|
21
|
+
* 305.677 ms con name=TypeError, message="fetch failed" y
|
|
22
|
+
* cause.code=UND_ERR_HEADERS_TIMEOUT.
|
|
23
|
+
*
|
|
24
|
+
* El defecto se arreglo primero en el camino del telefono (PND-234) y volvio a
|
|
25
|
+
* aparecer, identico, en el camino de los verbos (PND-235): el mismo techo de
|
|
26
|
+
* cinco minutos sobre `yujin.evidence.run`, que es justo el verbo que acredita
|
|
27
|
+
* una bateria de siete minutos. Un arreglo que no se comparte se vuelve a
|
|
28
|
+
* pagar, asi que el transporte vive aca y los dos lo usan.
|
|
29
|
+
*
|
|
30
|
+
* POR QUE node:http Y NO fetch. Es la unica forma de mandar los tiempos sin
|
|
31
|
+
* depender de undici: Node lo trae adentro pero no lo expone como paquete, y
|
|
32
|
+
* construir un Agent con otro headersTimeout exigiria declarar una dependencia
|
|
33
|
+
* nueva para algo que el stdlib ya hace. La conexion es loopback y en claro,
|
|
34
|
+
* asi que no se pierde nada por bajar de capa.
|
|
35
|
+
*
|
|
36
|
+
* EL PRESUPUESTO NO DESAPARECE, cambia de escala -- y lo fija el LLAMADOR,
|
|
37
|
+
* porque el unico que sabe cuanto puede durar legitimamente el trabajo es el
|
|
38
|
+
* que lo pidio. Lo que no se usa es `req.setTimeout`, que mide INACTIVIDAD del
|
|
39
|
+
* socket: un trabajo que piensa diez minutos no manda un byte, y ese
|
|
40
|
+
* temporizador lo mataria sin motivo, que es la forma exacta del bug que esto
|
|
41
|
+
* cierra. Lo que se mide es el tiempo TOTAL.
|
|
42
|
+
*
|
|
43
|
+
* ASCII puro.
|
|
44
|
+
*/
|
|
45
|
+
import http from 'node:http';
|
|
46
|
+
/** Piso del presupuesto: ningun POST por loopback se corta antes de esto. */
|
|
47
|
+
export const LOOPBACK_MIN_BUDGET_MS = 30_000;
|
|
48
|
+
/** El corte, con lo que el llamador necesita para redactar su propio mensaje
|
|
49
|
+
* (cada camino tiene su catalogo de errores y su idioma). */
|
|
50
|
+
export class LoopbackCut extends Error {
|
|
51
|
+
kind;
|
|
52
|
+
/** Se vencio el presupuesto (y no: el socket se cayo por su cuenta). */
|
|
53
|
+
expired;
|
|
54
|
+
budget_ms;
|
|
55
|
+
elapsed_ms;
|
|
56
|
+
constructor(kind, args) {
|
|
57
|
+
super('loopback ' + kind + (args.expired ? ' (presupuesto de ' + args.budgetMs + ' ms vencido)' : ''), args.cause === undefined ? undefined : { cause: args.cause });
|
|
58
|
+
this.name = 'LoopbackCut';
|
|
59
|
+
this.kind = kind;
|
|
60
|
+
this.expired = args.expired;
|
|
61
|
+
this.budget_ms = args.budgetMs;
|
|
62
|
+
this.elapsed_ms = args.elapsedMs;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* El socket nunca llego a conectar: no hay servidor escuchando ahi.
|
|
67
|
+
*
|
|
68
|
+
* Es la unica evidencia de que el trabajo NO corrio. Se mira el errno y no el
|
|
69
|
+
* texto porque el texto cambia entre versiones de Node y entre sistemas.
|
|
70
|
+
*/
|
|
71
|
+
export function isConnectionRefusal(e) {
|
|
72
|
+
const code = e?.code;
|
|
73
|
+
if (!code)
|
|
74
|
+
return false;
|
|
75
|
+
return code === 'ECONNREFUSED' || code === 'ENOTFOUND'
|
|
76
|
+
|| code === 'EADDRNOTAVAIL' || code === 'EHOSTUNREACH';
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* POST de un JSON al loopback, esperando lo que tarde.
|
|
80
|
+
*
|
|
81
|
+
* Devuelve el status y el cuerpo crudo; parsear es del llamador, que es el
|
|
82
|
+
* unico que conoce la forma de la respuesta. Un status que no es 200 NO es una
|
|
83
|
+
* excepcion: esconderlo seria esconder el dato que permite diagnosticarlo.
|
|
84
|
+
*/
|
|
85
|
+
export async function postLoopbackJson(args) {
|
|
86
|
+
const body = Buffer.from(JSON.stringify(args.payload), 'utf8');
|
|
87
|
+
const arranco = Date.now();
|
|
88
|
+
/* Un presupuesto en cero, negativo o no numerico NO se obedece: se cae al
|
|
89
|
+
* piso. Obedecerlo seria matar la conexion antes de abrirla -- cada
|
|
90
|
+
* invocacion fallaria al instante y el sintoma (todo falla, siempre) no se
|
|
91
|
+
* parece en nada a la causa (un numero mal calculado un modulo mas arriba).
|
|
92
|
+
* Es la misma decision que `mobileTurnBudgetMs` toma con su variable de
|
|
93
|
+
* entorno: un cero en un numero de configuracion es casi siempre un
|
|
94
|
+
* descuido. */
|
|
95
|
+
const budget = Number.isFinite(args.budgetMs) && args.budgetMs > 0
|
|
96
|
+
? args.budgetMs : LOOPBACK_MIN_BUDGET_MS;
|
|
97
|
+
return new Promise((resolve, reject) => {
|
|
98
|
+
let settled = false;
|
|
99
|
+
/* Que se vencio el presupuesto se recuerda aparte del error del socket:
|
|
100
|
+
* `req.destroy()` llega al handler de error como un ECONNRESET cualquiera,
|
|
101
|
+
* y sin esta marca el vencimiento se clasificaria como "no se entrego" --
|
|
102
|
+
* el caso que afirma que no corrio nada -- justamente cuando si corrio. */
|
|
103
|
+
let vencido = false;
|
|
104
|
+
const req = http.request({
|
|
105
|
+
host: args.host ?? '127.0.0.1',
|
|
106
|
+
port: args.port,
|
|
107
|
+
path: args.path,
|
|
108
|
+
method: 'POST',
|
|
109
|
+
headers: {
|
|
110
|
+
'content-type': 'application/json',
|
|
111
|
+
'content-length': String(body.byteLength),
|
|
112
|
+
...(args.headers ?? {}),
|
|
113
|
+
},
|
|
114
|
+
}, (res) => {
|
|
115
|
+
const chunks = [];
|
|
116
|
+
res.on('data', (c) => chunks.push(c));
|
|
117
|
+
res.on('end', () => {
|
|
118
|
+
if (settled)
|
|
119
|
+
return;
|
|
120
|
+
settled = true;
|
|
121
|
+
clearTimeout(timer);
|
|
122
|
+
resolve({
|
|
123
|
+
status: res.statusCode ?? 0,
|
|
124
|
+
body: Buffer.concat(chunks).toString('utf8'),
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
/* Un corte MIENTRAS baja el cuerpo tampoco es "no se entrego": el
|
|
128
|
+
* trabajo ya corrio y el servidor ya estaba contestando. */
|
|
129
|
+
res.on('error', (e) => fail(e, true));
|
|
130
|
+
});
|
|
131
|
+
const timer = setTimeout(() => {
|
|
132
|
+
vencido = true;
|
|
133
|
+
req.destroy(new Error('presupuesto de loopback vencido'));
|
|
134
|
+
}, budget);
|
|
135
|
+
/* Que este temporizador no sea lo que mantiene vivo al proceso. */
|
|
136
|
+
if (typeof timer.unref === 'function') {
|
|
137
|
+
timer.unref();
|
|
138
|
+
}
|
|
139
|
+
const fail = (cause, yaCorrio) => {
|
|
140
|
+
if (settled)
|
|
141
|
+
return;
|
|
142
|
+
settled = true;
|
|
143
|
+
clearTimeout(timer);
|
|
144
|
+
const noEntrego = !vencido && !yaCorrio && isConnectionRefusal(cause);
|
|
145
|
+
reject(new LoopbackCut(noEntrego ? 'undelivered' : 'unanswered', {
|
|
146
|
+
expired: vencido,
|
|
147
|
+
budgetMs: budget,
|
|
148
|
+
elapsedMs: Date.now() - arranco,
|
|
149
|
+
cause,
|
|
150
|
+
}));
|
|
151
|
+
};
|
|
152
|
+
req.on('error', (e) => fail(e, false));
|
|
153
|
+
req.end(body);
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=loopback_post.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loopback_post.js","sourceRoot":"","sources":["../../src/core/loopback_post.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +1,50 @@
|
|
|
1
|
-
# Urazuke -- the evidence method, as Forge runs it
|
|
2
|
-
|
|
3
|
-
Urazuke (github.com/pkuschnirof/urazuke) is the method behind every project
|
|
4
|
-
Forge builds or maintains: 24 ordered steps in four stretches, each with an
|
|
5
|
-
exact prompt, the inputs the owner prepares, the artifacts the agent leaves
|
|
6
|
-
in the repository, and a completion check the owner does WITHOUT reading
|
|
7
|
-
code. An existing system built without it goes through eight normalisation
|
|
8
|
-
stations (N0..N7) first and enters the loop at step 5.
|
|
9
|
-
|
|
10
|
-
## What is mechanical (not prose)
|
|
11
|
-
|
|
12
|
-
- The project's workflow is `urazuke` (no code) or `urazuke-legacy` (code
|
|
13
|
-
without the method's artifacts). Every canonical task carries its step.
|
|
14
|
-
- The CURRENT step's prompt is injected into your system prompt every turn,
|
|
15
|
-
with the state of its checks (section "URAZUKE -- peldano NN"). Act on
|
|
16
|
-
that prompt as if the owner had pasted it. Do not skip ahead.
|
|
17
|
-
- A canonical task closes ONLY when `evaluateStep()` is GREEN: the files
|
|
18
|
-
the step names exist, are not stubs, say what they must; the sizing
|
|
19
|
-
record is admissible (G9); the plan items carry a spec; the evidence
|
|
20
|
-
receipts exist. `yujin.pending.close` refuses a red step. An override
|
|
21
|
-
needs the OWNER's written `force_reason` (kept in history); never pass
|
|
22
|
-
one on your own initiative.
|
|
23
|
-
- Evidence is a RECEIPT Forge records (command, ref, exit code, counts),
|
|
24
|
-
never your summary. "Tests pass" without a receipt is a claim.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
1
|
+
# Urazuke -- the evidence method, as Forge runs it
|
|
2
|
+
|
|
3
|
+
Urazuke (github.com/pkuschnirof/urazuke) is the method behind every project
|
|
4
|
+
Forge builds or maintains: 24 ordered steps in four stretches, each with an
|
|
5
|
+
exact prompt, the inputs the owner prepares, the artifacts the agent leaves
|
|
6
|
+
in the repository, and a completion check the owner does WITHOUT reading
|
|
7
|
+
code. An existing system built without it goes through eight normalisation
|
|
8
|
+
stations (N0..N7) first and enters the loop at step 5.
|
|
9
|
+
|
|
10
|
+
## What is mechanical (not prose)
|
|
11
|
+
|
|
12
|
+
- The project's workflow is `urazuke` (no code) or `urazuke-legacy` (code
|
|
13
|
+
without the method's artifacts). Every canonical task carries its step.
|
|
14
|
+
- The CURRENT step's prompt is injected into your system prompt every turn,
|
|
15
|
+
with the state of its checks (section "URAZUKE -- peldano NN"). Act on
|
|
16
|
+
that prompt as if the owner had pasted it. Do not skip ahead.
|
|
17
|
+
- A canonical task closes ONLY when `evaluateStep()` is GREEN: the files
|
|
18
|
+
the step names exist, are not stubs, say what they must; the sizing
|
|
19
|
+
record is admissible (G9); the plan items carry a spec; the evidence
|
|
20
|
+
receipts exist. `yujin.pending.close` refuses a red step. An override
|
|
21
|
+
needs the OWNER's written `force_reason` (kept in history); never pass
|
|
22
|
+
one on your own initiative.
|
|
23
|
+
- Evidence is a RECEIPT Forge records (command, ref, exit code, counts),
|
|
24
|
+
never your summary. "Tests pass" without a receipt is a claim.
|
|
25
|
+
- A LONG run leaves its receipt the same way. `yujin.evidence.run` blocks
|
|
26
|
+
the turn only while the run fits the blocking window (10 min, lowered with
|
|
27
|
+
`limits.claude_cli_silence_ms`); over that, or with `background: true`, it
|
|
28
|
+
is launched detached and returns a HANDLE. That is not a degraded mode:
|
|
29
|
+
the receipt is written by whoever runs, not by whoever waits. Read it with
|
|
30
|
+
`yujin.evidence.list` when the task finishes (`yujin.task.status({id})`
|
|
31
|
+
for the progress). Do NOT relaunch a run that already has a handle.
|
|
32
|
+
- And the corollary for any invocation that dies waiting: a verb call that
|
|
33
|
+
comes back UNANSWERED (E_VERB_CALL_UNANSWERED) did not necessarily fail.
|
|
34
|
+
Before redoing the work, LOOK FOR THE TRACE -- `yujin.evidence.list` for a
|
|
35
|
+
receipt, `yujin.task.list` for a task. Two closes were reported as
|
|
36
|
+
"believed" over a receipt that existed on disk the whole time.
|
|
37
|
+
|
|
38
|
+
## How to work inside it
|
|
39
|
+
|
|
40
|
+
1. Read the URAZUKE section: red checks are what is missing. Produce the
|
|
41
|
+
artifact at the path named, with real content, or ask the owner for the
|
|
42
|
+
input that is theirs (`antes de enviar`). Never invent an owner input.
|
|
43
|
+
2. When the section says GREEN, close the task with `yujin.pending.close`
|
|
44
|
+
(full expediente) and the next step's prompt arrives on the next turn.
|
|
45
|
+
3. `yujin.urazuke.status` shows the whole ladder; `yujin.urazuke.step`
|
|
46
|
+
shows any step in full (prompts, inputs, artifacts, checklist).
|
|
47
|
+
4. The plan is the pendings: each item needs `spec` (acceptance "given /
|
|
48
|
+
when / then" + `how_verified`) before it is implemented (step 5).
|
|
49
|
+
5. No deadlines, ever: the method fixes the order and the gates, not the
|
|
50
|
+
calendar. Speed is a consequence, not the objective.
|
|
@@ -17,30 +17,5 @@
|
|
|
17
17
|
* Hand-rolled JSON-RPC 2.0 sobre stdio (estilo zero-dep del repo,
|
|
18
18
|
* espejo del cliente en protocol_client.ts). ASCII-only.
|
|
19
19
|
*/
|
|
20
|
-
|
|
21
|
-
jsonrpc: '2.0';
|
|
22
|
-
id?: number | string;
|
|
23
|
-
method: string;
|
|
24
|
-
params?: {
|
|
25
|
-
name?: string;
|
|
26
|
-
arguments?: Record<string, unknown>;
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
interface ToolDef {
|
|
30
|
-
name: string;
|
|
31
|
-
description: string;
|
|
32
|
-
inputSchema: Record<string, unknown>;
|
|
33
|
-
}
|
|
34
|
-
declare const TOOLS: ToolDef[];
|
|
35
|
-
declare function send(msg: unknown): void;
|
|
36
|
-
declare function logErr(msg: string): void;
|
|
37
|
-
/** Reenvia un nac3_invoke al chat server (que corre el dispatcher
|
|
38
|
-
* real) y devuelve el texto del resultado. */
|
|
39
|
-
declare function forwardInvoke(verbId: string, args: Record<string, unknown>): Promise<{
|
|
40
|
-
ok: boolean;
|
|
41
|
-
text: string;
|
|
42
|
-
}>;
|
|
43
|
-
declare function toolResult(id: number | string | undefined, text: string, isError?: boolean): void;
|
|
44
|
-
declare function handle(req: JsonRpcReq): Promise<void>;
|
|
45
|
-
declare function main(): void;
|
|
20
|
+
export {};
|
|
46
21
|
//# sourceMappingURL=forge_panel_server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forge_panel_server.d.ts","sourceRoot":"","sources":["../../src/mcp/forge_panel_server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG
|
|
1
|
+
{"version":3,"file":"forge_panel_server.d.ts","sourceRoot":"","sources":["../../src/mcp/forge_panel_server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* forge_panel_server.ts -- PND-064 slice B.
|
|
4
3
|
*
|
|
@@ -18,6 +17,7 @@
|
|
|
18
17
|
* Hand-rolled JSON-RPC 2.0 sobre stdio (estilo zero-dep del repo,
|
|
19
18
|
* espejo del cliente en protocol_client.ts). ASCII-only.
|
|
20
19
|
*/
|
|
20
|
+
import { forwardInvoke } from './panel_invoke.js';
|
|
21
21
|
/* PND-064 -- una sola tool `nac3_invoke` que proxea el catalogo
|
|
22
22
|
* COMPLETO de verbos yujin (igual que el modo API). El subproceso
|
|
23
23
|
* ya tiene el manifest de verbos en su system prompt; esta tool es
|
|
@@ -55,31 +55,10 @@ function logErr(msg) {
|
|
|
55
55
|
}
|
|
56
56
|
catch { /* ignore */ }
|
|
57
57
|
}
|
|
58
|
-
|
|
59
|
-
*
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const token = process.env['FORGE_PANEL_TOKEN'];
|
|
63
|
-
if (!port || !token) {
|
|
64
|
-
return { ok: false, text: 'El canal de Forge no esta configurado (sin puerto/token).' };
|
|
65
|
-
}
|
|
66
|
-
try {
|
|
67
|
-
const r = await fetch('http://127.0.0.1:' + port + '/api/forge/panel-invoke', {
|
|
68
|
-
method: 'POST',
|
|
69
|
-
headers: { 'content-type': 'application/json' },
|
|
70
|
-
body: JSON.stringify({ token, verb_id: verbId, args }),
|
|
71
|
-
});
|
|
72
|
-
if (!r.ok) {
|
|
73
|
-
return { ok: false, text: 'Forge rechazo la invocacion (HTTP ' + r.status + ').' };
|
|
74
|
-
}
|
|
75
|
-
const j = await r.json();
|
|
76
|
-
return { ok: j.ok !== false, text: j.text || 'Listo.' };
|
|
77
|
-
}
|
|
78
|
-
catch (err) {
|
|
79
|
-
const m = err instanceof Error ? err.message : String(err);
|
|
80
|
-
return { ok: false, text: 'No pude contactar a Forge: ' + m };
|
|
81
|
-
}
|
|
82
|
-
}
|
|
58
|
+
/* El reenvio al chat server vive en panel_invoke.ts (PND-235). Estaba
|
|
59
|
+
* duplicado aca y en forge_verbs_server, y las dos copias esperaban la
|
|
60
|
+
* respuesta con `fetch`, heredando el techo de cinco minutos de undici: el
|
|
61
|
+
* mismo defecto, dos veces, y arreglado una sola. */
|
|
83
62
|
function toolResult(id, text, isError = false) {
|
|
84
63
|
send({
|
|
85
64
|
jsonrpc: '2.0',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forge_panel_server.js","sourceRoot":"","sources":["../../src/mcp/forge_panel_server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"forge_panel_server.js","sourceRoot":"","sources":["../../src/mcp/forge_panel_server.ts"],"names":[],"mappings":"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"}
|
|
@@ -68,16 +68,7 @@ export interface BuiltTools {
|
|
|
68
68
|
* Ante colision de nombre saneado, la primera gana y la segunda cae al
|
|
69
69
|
* proxy (no se pierde: sigue invocable por id). */
|
|
70
70
|
export declare function buildToolDefs(verbs: Nac3Verb[]): BuiltTools;
|
|
71
|
-
|
|
72
|
-
* el texto del resultado. Espejo de forge_panel_server.forwardInvoke.
|
|
73
|
-
* fetchImpl inyectable para test. */
|
|
74
|
-
export declare function forwardInvoke(verbId: string, args: Record<string, unknown>, env?: {
|
|
75
|
-
port?: string;
|
|
76
|
-
token?: string;
|
|
77
|
-
}, fetchImpl?: typeof fetch): Promise<{
|
|
78
|
-
ok: boolean;
|
|
79
|
-
text: string;
|
|
80
|
-
}>;
|
|
71
|
+
export { forwardInvoke, type PanelChannel, type LoopbackPost } from './panel_invoke.js';
|
|
81
72
|
export interface RpcDeps {
|
|
82
73
|
send: (msg: unknown) => void;
|
|
83
74
|
forward: (verbId: string, args: Record<string, unknown>) => Promise<{
|
|
@@ -89,5 +80,4 @@ export interface RpcDeps {
|
|
|
89
80
|
/** Nucleo testeable: procesa un request JSON-RPC contra deps
|
|
90
81
|
* inyectables. main() lo cablea a stdio + fetch reales. */
|
|
91
82
|
export declare function handleRpc(req: JsonRpcReq, deps: RpcDeps): Promise<void>;
|
|
92
|
-
export {};
|
|
93
83
|
//# sourceMappingURL=forge_verbs_server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forge_verbs_server.d.ts","sourceRoot":"","sources":["../../src/mcp/forge_verbs_server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"forge_verbs_server.d.ts","sourceRoot":"","sources":["../../src/mcp/forge_verbs_server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAGvE,UAAU,UAAU;IAClB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CACjE;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED;;;uEAGuE;AACvE,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAQ5C,CAAC;AAEF;;yBAEyB;AACzB,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;yCAEyC;AACzC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;+DAC+D;AAC/D,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAQ5D;AAED,wEAAwE;AACxE,eAAO,MAAM,UAAU,EAAE,OAgBxB,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,oEAAoE;IACpE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED;;oDAEoD;AACpD,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,UAAU,CAe3D;AAMD,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAExF,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnG,KAAK,EAAE,UAAU,CAAC;CACnB;AAMD;4DAC4D;AAC5D,wBAAsB,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA4C7E"}
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
* zero-dep del repo. ASCII-only.
|
|
28
28
|
*/
|
|
29
29
|
import { manifest } from '../nac3/internal_manifest.js';
|
|
30
|
+
import { forwardInvoke as forwardInvokeImpl } from './panel_invoke.js';
|
|
30
31
|
/** Prefijos de verbos DEV que se exponen como tools individuales.
|
|
31
32
|
* Son los que deben SUPERAR a las tools nativas del brain
|
|
32
33
|
* (Bash/Write/Read/...). Los UI/panel/voz (pizarron, panel, voice)
|
|
@@ -100,28 +101,11 @@ export function buildToolDefs(verbs) {
|
|
|
100
101
|
tools.push(PROXY_TOOL);
|
|
101
102
|
return { tools, nameToVerb };
|
|
102
103
|
}
|
|
103
|
-
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
return { ok: false, text: 'El canal de Forge no esta configurado (sin puerto/token).' };
|
|
109
|
-
}
|
|
110
|
-
try {
|
|
111
|
-
const r = await fetchImpl('http://127.0.0.1:' + env.port + '/api/forge/panel-invoke', {
|
|
112
|
-
method: 'POST',
|
|
113
|
-
headers: { 'content-type': 'application/json' },
|
|
114
|
-
body: JSON.stringify({ token: env.token, verb_id: verbId, args }),
|
|
115
|
-
});
|
|
116
|
-
if (!r.ok)
|
|
117
|
-
return { ok: false, text: 'Forge rechazo la invocacion (HTTP ' + r.status + ').' };
|
|
118
|
-
const j = await r.json();
|
|
119
|
-
return { ok: j.ok !== false, text: j.text || 'Listo.' };
|
|
120
|
-
}
|
|
121
|
-
catch (err) {
|
|
122
|
-
return { ok: false, text: 'No pude contactar a Forge: ' + (err instanceof Error ? err.message : String(err)) };
|
|
123
|
-
}
|
|
124
|
-
}
|
|
104
|
+
/* El reenvio al chat server vive en panel_invoke.ts, compartido con
|
|
105
|
+
* forge_panel_server: estaba duplicado y las dos copias heredaban el mismo
|
|
106
|
+
* techo de cinco minutos (PND-235). Se re-exporta para no mover el punto de
|
|
107
|
+
* entrada de los llamadores ni de los tests. */
|
|
108
|
+
export { forwardInvoke } from './panel_invoke.js';
|
|
125
109
|
function toolResult(send, id, text, isError = false) {
|
|
126
110
|
send({ jsonrpc: '2.0', id, result: { content: [{ type: 'text', text }], ...(isError ? { isError: true } : {}) } });
|
|
127
111
|
}
|
|
@@ -189,7 +173,7 @@ function main() {
|
|
|
189
173
|
const built = buildToolDefs(manifest().verbs);
|
|
190
174
|
const deps = {
|
|
191
175
|
send: (msg) => process.stdout.write(JSON.stringify(msg) + '\n'),
|
|
192
|
-
forward: (verbId, args) =>
|
|
176
|
+
forward: (verbId, args) => forwardInvokeImpl(verbId, args),
|
|
193
177
|
built,
|
|
194
178
|
};
|
|
195
179
|
let buf = '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forge_verbs_server.js","sourceRoot":"","sources":["../../src/mcp/forge_verbs_server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EAAE,QAAQ,EAAiB,MAAM,8BAA8B,CAAC;AAevE;;;uEAGuE;AACvE,MAAM,CAAC,MAAM,eAAe,GAAsB;IAChD,WAAW;IACX,YAAY;IACZ,cAAc;IACd,aAAa;IACb,gBAAgB;IAChB,eAAe;IACf,cAAc;CACf,CAAC;AAEF;;yBAEyB;AACzB,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC;;yCAEyC;AACzC,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACvE,CAAC;AAED;+DAC+D;AAC/D,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC9C,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAAE,SAAS;QAC/D,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACZ,IAAI,GAAG,CAAC,MAAM,IAAI,oBAAoB;YAAE,MAAM;IAChD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,wEAAwE;AACxE,MAAM,CAAC,MAAM,UAAU,GAAY;IACjC,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,qEAAqE;UACnE,uEAAuE;UACvE,uEAAuE;UACvE,4DAA4D;UAC5D,kEAAkE;IACtE,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yCAAyC,EAAE;YACnF,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iDAAiD,EAAE;SACzF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;CACF,CAAC;AAQF;;oDAEoD;AACpD,MAAM,UAAU,aAAa,CAAC,KAAiB;IAC7C,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS,CAAC,qCAAqC;QAClF,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC;YACT,IAAI;YACJ,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC,EAAE,GAAG,YAAY,GAAG,CAAC,CAAC,MAAM,GAAG,GAAG;YAC5F,WAAW,EAAE,CAAC,CAAC,MAA4C;SAC5D,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAC/B,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"forge_verbs_server.js","sourceRoot":"","sources":["../../src/mcp/forge_verbs_server.ts"],"names":[],"mappings":"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"}
|