@nac3/forge-cli 1.23.2 → 1.23.3
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/server.d.ts.map +1 -1
- package/dist/chat/server.js +36 -8
- package/dist/chat/server.js.map +1 -1
- package/dist/core/error_catalog.d.ts +27 -0
- package/dist/core/error_catalog.d.ts.map +1 -1
- package/dist/core/error_catalog.js +55 -0
- package/dist/core/error_catalog.js.map +1 -1
- package/dist/core/error_formatter.d.ts +12 -0
- package/dist/core/error_formatter.d.ts.map +1 -1
- package/dist/core/error_formatter.js +19 -0
- package/dist/core/error_formatter.js.map +1 -1
- package/dist/relay/command_consumer.d.ts +10 -0
- package/dist/relay/command_consumer.d.ts.map +1 -1
- package/dist/relay/command_consumer.js +10 -1
- package/dist/relay/command_consumer.js.map +1 -1
- package/dist/relay/loopback_turn.d.ts +82 -0
- package/dist/relay/loopback_turn.d.ts.map +1 -0
- package/dist/relay/loopback_turn.js +171 -0
- package/dist/relay/loopback_turn.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +18 -20
- package/src/i18n/catalogs/ar.json +7 -0
- package/src/i18n/catalogs/de.json +7 -0
- package/src/i18n/catalogs/en.json +7 -0
- package/src/i18n/catalogs/es.json +7 -0
- package/src/i18n/catalogs/fr.json +7 -0
- package/src/i18n/catalogs/hi.json +7 -0
- package/src/i18n/catalogs/it.json +7 -0
- package/src/i18n/catalogs/ja.json +7 -0
- package/src/i18n/catalogs/pt.json +7 -0
- package/src/i18n/catalogs/zh.json +7 -0
|
@@ -57,6 +57,13 @@ export declare const E_VAULT_DECRYPT_FAILED = "E_VAULT_DECRYPT_FAILED";
|
|
|
57
57
|
export declare const E_SHELL_EXEC_REJECTED = "E_SHELL_EXEC_REJECTED";
|
|
58
58
|
/** No active project registered + the verb requires a project root. */
|
|
59
59
|
export declare const E_PROJECT_NOT_REGISTERED = "E_PROJECT_NOT_REGISTERED";
|
|
60
|
+
/** El escritorio no devolvio la respuesta dentro del presupuesto. El turno
|
|
61
|
+
* puede seguir vivo: el trabajo probablemente se este haciendo o ya este
|
|
62
|
+
* hecho, y el resultado aparece en el chat del escritorio. */
|
|
63
|
+
export declare const E_MOBILE_TURN_UNANSWERED = "E_MOBILE_TURN_UNANSWERED";
|
|
64
|
+
/** El pedido no llego a entrar al escritorio (su servidor de chat no estaba
|
|
65
|
+
* escuchando). Aca no se hizo NADA, y hay que reintentar. */
|
|
66
|
+
export declare const E_MOBILE_TURN_UNDELIVERED = "E_MOBILE_TURN_UNDELIVERED";
|
|
60
67
|
/** Build a ForgeError from a code + context.
|
|
61
68
|
*
|
|
62
69
|
* @param code Stable error code (E_*).
|
|
@@ -70,6 +77,26 @@ export declare function renderForgeError(code: string, context?: Record<string,
|
|
|
70
77
|
export declare function listErrorCodes(): string[];
|
|
71
78
|
/** Type guard. */
|
|
72
79
|
export declare function isForgeError(x: unknown): x is ForgeError;
|
|
80
|
+
/**
|
|
81
|
+
* Un Error de JavaScript que LLEVA su ForgeError adentro.
|
|
82
|
+
*
|
|
83
|
+
* Existe porque los dos mundos no se tocaban: el catalogo produce objetos y
|
|
84
|
+
* el codigo que falla lanza excepciones, asi que todo `catch` terminaba
|
|
85
|
+
* reducido a `e.message` -- una linea sin codigo, sin causa y sin que hacer.
|
|
86
|
+
* De ahi salia el "fetch failed" que vio el usuario. Un `catch` que recibe
|
|
87
|
+
* esto puede recuperar el error del catalogo entero con `forgeErrorOf`.
|
|
88
|
+
*
|
|
89
|
+
* El `message` se arma con el `what` para que un `catch` que NO sepa de esto
|
|
90
|
+
* siga mostrando algo legible, nunca un texto de libreria.
|
|
91
|
+
*/
|
|
92
|
+
export declare class ForgeFailure extends Error {
|
|
93
|
+
readonly forge: ForgeError;
|
|
94
|
+
constructor(forge: ForgeError, cause?: unknown);
|
|
95
|
+
}
|
|
96
|
+
/** El ForgeError que lleva una excepcion, o null si no lleva ninguno. Es lo
|
|
97
|
+
* que deja a un `catch` generico elegir el mensaje accionable cuando existe
|
|
98
|
+
* y su texto de siempre cuando no. */
|
|
99
|
+
export declare function forgeErrorOf(e: unknown): ForgeError | null;
|
|
73
100
|
/** Get the catalog entry metadata for a code (severity, docs path, etc).
|
|
74
101
|
* Returns null if the code is unknown. */
|
|
75
102
|
export declare function getCatalogEntry(code: string): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error_catalog.d.ts","sourceRoot":"","sources":["../../src/core/error_catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAY,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEpE,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAExE,MAAM,WAAW,UAAU;IACzB,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,GAAG,EAAE,MAAM,CAAC;IACZ,qCAAqC;IACrC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,qEAAqE;IACrE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;CACrD;AAMD,oEAAoE;AACpE,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AACnE,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AACzD,sDAAsD;AACtD,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAC3D,iEAAiE;AACjE,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AACzD,oDAAoD;AACpD,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAC3D,qEAAqE;AACrE,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAC/D,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAC7D,uEAAuE;AACvE,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"error_catalog.d.ts","sourceRoot":"","sources":["../../src/core/error_catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAY,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEpE,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAExE,MAAM,WAAW,UAAU;IACzB,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,GAAG,EAAE,MAAM,CAAC;IACZ,qCAAqC;IACrC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,qEAAqE;IACrE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;CACrD;AAMD,oEAAoE;AACpE,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AACnE,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AACzD,sDAAsD;AACtD,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAC3D,iEAAiE;AACjE,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AACzD,oDAAoD;AACpD,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAC3D,qEAAqE;AACrE,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAC/D,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAC7D,uEAAuE;AACvE,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AAKnE;;+DAE+D;AAC/D,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AACnE;8DAC8D;AAC9D,eAAO,MAAM,yBAAyB,8BAA8B,CAAC;AAwFrE;;;;;;;4DAO4D;AAC5D,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAM,EACvD,IAAI,CAAC,EAAE,iBAAiB,GACvB,UAAU,CA4BZ;AAcD,wEAAwE;AACxE,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAEzC;AAED,kBAAkB;AAClB,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,UAAU,CAOxD;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;gBACf,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,OAAO;CAM/C;AAED;;uCAEuC;AACvC,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAI1D;AAED;2CAC2C;AAC3C,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,kBAAkB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAI1H"}
|
|
@@ -39,6 +39,17 @@ export const E_VAULT_DECRYPT_FAILED = 'E_VAULT_DECRYPT_FAILED';
|
|
|
39
39
|
export const E_SHELL_EXEC_REJECTED = 'E_SHELL_EXEC_REJECTED';
|
|
40
40
|
/** No active project registered + the verb requires a project root. */
|
|
41
41
|
export const E_PROJECT_NOT_REGISTERED = 'E_PROJECT_NOT_REGISTERED';
|
|
42
|
+
/* Un turno que PIDIO el telefono. Los dos casos se separan a proposito
|
|
43
|
+
* porque el consejo es OPUESTO: uno de los dos significa que el trabajo
|
|
44
|
+
* probablemente SI se hizo, y decirle al usuario que no se hizo es mentirle
|
|
45
|
+
* sobre el resultado. Ver src/relay/loopback_turn.ts. */
|
|
46
|
+
/** El escritorio no devolvio la respuesta dentro del presupuesto. El turno
|
|
47
|
+
* puede seguir vivo: el trabajo probablemente se este haciendo o ya este
|
|
48
|
+
* hecho, y el resultado aparece en el chat del escritorio. */
|
|
49
|
+
export const E_MOBILE_TURN_UNANSWERED = 'E_MOBILE_TURN_UNANSWERED';
|
|
50
|
+
/** El pedido no llego a entrar al escritorio (su servidor de chat no estaba
|
|
51
|
+
* escuchando). Aca no se hizo NADA, y hay que reintentar. */
|
|
52
|
+
export const E_MOBILE_TURN_UNDELIVERED = 'E_MOBILE_TURN_UNDELIVERED';
|
|
42
53
|
const CATALOG = {
|
|
43
54
|
[E_CAP_FRONTIER_EXHAUSTED]: {
|
|
44
55
|
key_prefix: 'error.cap_frontier_exhausted',
|
|
@@ -90,6 +101,19 @@ const CATALOG = {
|
|
|
90
101
|
has_cmd: true, severity: 'error',
|
|
91
102
|
docs_path: 'docs/errors/E_PROJECT_NOT_REGISTERED.html',
|
|
92
103
|
},
|
|
104
|
+
/* severity 'warning' y no 'error': el pedido no fracaso, lo que fracaso es
|
|
105
|
+
* la espera. Pintarlo como error haria que el usuario descarte un trabajo
|
|
106
|
+
* que probablemente este hecho. */
|
|
107
|
+
[E_MOBILE_TURN_UNANSWERED]: {
|
|
108
|
+
key_prefix: 'error.mobile_turn_unanswered',
|
|
109
|
+
has_cmd: false, severity: 'warning',
|
|
110
|
+
docs_path: 'docs/errors/E_MOBILE_TURN_UNANSWERED.html',
|
|
111
|
+
},
|
|
112
|
+
[E_MOBILE_TURN_UNDELIVERED]: {
|
|
113
|
+
key_prefix: 'error.mobile_turn_undelivered',
|
|
114
|
+
has_cmd: true, severity: 'error',
|
|
115
|
+
docs_path: 'docs/errors/E_MOBILE_TURN_UNDELIVERED.html',
|
|
116
|
+
},
|
|
93
117
|
};
|
|
94
118
|
/* ===================================================================
|
|
95
119
|
* Public API
|
|
@@ -157,6 +181,37 @@ export function isForgeError(x) {
|
|
|
157
181
|
&& typeof e.why === 'string'
|
|
158
182
|
&& typeof e.fix === 'string';
|
|
159
183
|
}
|
|
184
|
+
/**
|
|
185
|
+
* Un Error de JavaScript que LLEVA su ForgeError adentro.
|
|
186
|
+
*
|
|
187
|
+
* Existe porque los dos mundos no se tocaban: el catalogo produce objetos y
|
|
188
|
+
* el codigo que falla lanza excepciones, asi que todo `catch` terminaba
|
|
189
|
+
* reducido a `e.message` -- una linea sin codigo, sin causa y sin que hacer.
|
|
190
|
+
* De ahi salia el "fetch failed" que vio el usuario. Un `catch` que recibe
|
|
191
|
+
* esto puede recuperar el error del catalogo entero con `forgeErrorOf`.
|
|
192
|
+
*
|
|
193
|
+
* El `message` se arma con el `what` para que un `catch` que NO sepa de esto
|
|
194
|
+
* siga mostrando algo legible, nunca un texto de libreria.
|
|
195
|
+
*/
|
|
196
|
+
export class ForgeFailure extends Error {
|
|
197
|
+
forge;
|
|
198
|
+
constructor(forge, cause) {
|
|
199
|
+
super(forge.what);
|
|
200
|
+
this.name = 'ForgeFailure';
|
|
201
|
+
this.forge = forge;
|
|
202
|
+
if (cause !== undefined)
|
|
203
|
+
this.cause = cause;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/** El ForgeError que lleva una excepcion, o null si no lleva ninguno. Es lo
|
|
207
|
+
* que deja a un `catch` generico elegir el mensaje accionable cuando existe
|
|
208
|
+
* y su texto de siempre cuando no. */
|
|
209
|
+
export function forgeErrorOf(e) {
|
|
210
|
+
if (e instanceof ForgeFailure)
|
|
211
|
+
return e.forge;
|
|
212
|
+
const f = e?.forge;
|
|
213
|
+
return isForgeError(f) ? f : null;
|
|
214
|
+
}
|
|
160
215
|
/** Get the catalog entry metadata for a code (severity, docs path, etc).
|
|
161
216
|
* Returns null if the code is unknown. */
|
|
162
217
|
export function getCatalogEntry(code) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error_catalog.js","sourceRoot":"","sources":["../../src/core/error_catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,EAA0B,MAAM,kBAAkB,CAAC;AAyBpE;;sEAEsE;AAEtE,oEAAoE;AACpE,MAAM,CAAC,MAAM,wBAAwB,GAAG,0BAA0B,CAAC;AACnE,+DAA+D;AAC/D,MAAM,CAAC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AACzD,sDAAsD;AACtD,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AACvD,4EAA4E;AAC5E,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAC3D,iEAAiE;AACjE,MAAM,CAAC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AACzD,oDAAoD;AACpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AACvD,iEAAiE;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAC3D,qEAAqE;AACrE,MAAM,CAAC,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAC/D,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AAC7D,uEAAuE;AACvE,MAAM,CAAC,MAAM,wBAAwB,GAAG,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"error_catalog.js","sourceRoot":"","sources":["../../src/core/error_catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,18 @@ import { type SupportedLanguage } from '../i18n/index.js';
|
|
|
16
16
|
* @param err The error.
|
|
17
17
|
* @param lang Optional UI language for the labels. Default 'es'. */
|
|
18
18
|
export declare function formatForgeErrorCli(err: ForgeError, lang?: SupportedLanguage): string;
|
|
19
|
+
/**
|
|
20
|
+
* Format a ForgeError as PLAIN text, for a surface that renders neither
|
|
21
|
+
* ANSI nor HTML -- today that is the chat reply the phone receives over the
|
|
22
|
+
* relay (src/relay/command_consumer.ts).
|
|
23
|
+
*
|
|
24
|
+
* No colours, no rules, no severity banner: a phone bubble is narrow and a
|
|
25
|
+
* row of dashes costs a whole line. What survives is the only part that is
|
|
26
|
+
* load-bearing -- what happened, why, and what to do -- with the labels
|
|
27
|
+
* coming from the same i18n keys the other two renderers use, so a new
|
|
28
|
+
* language lands on all three at once.
|
|
29
|
+
*/
|
|
30
|
+
export declare function formatForgeErrorText(err: ForgeError, lang?: SupportedLanguage): string;
|
|
19
31
|
/** Format a ForgeError as safe HTML for the chat panel. The panel
|
|
20
32
|
* is expected to have CSS for .forge-err / .forge-err--{severity}
|
|
21
33
|
* / .forge-err__copy-btn etc; this returns ONLY the markup.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error_formatter.d.ts","sourceRoot":"","sources":["../../src/core/error_formatter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAsB,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAY,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AA+BpE;;sEAEsE;AACtE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,GAAE,iBAAwB,GAAG,MAAM,CA4B3F;AAwBD;;;;sEAIsE;AACtE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,GAAE,iBAAwB,GAAG,MAAM,CA4B5F;AAMD,yDAAyD;AACzD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAa7E;AAMD;6DAC6D;AAC7D,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAG5D"}
|
|
1
|
+
{"version":3,"file":"error_formatter.d.ts","sourceRoot":"","sources":["../../src/core/error_formatter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAsB,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAY,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AA+BpE;;sEAEsE;AACtE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,GAAE,iBAAwB,GAAG,MAAM,CA4B3F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,GAAE,iBAAwB,GAAG,MAAM,CAM5F;AAwBD;;;;sEAIsE;AACtE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,GAAE,iBAAwB,GAAG,MAAM,CA4B5F;AAMD,yDAAyD;AACzD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAa7E;AAMD;6DAC6D;AAC7D,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAG5D"}
|
|
@@ -68,6 +68,25 @@ export function formatForgeErrorCli(err, lang = 'es') {
|
|
|
68
68
|
parts.push('');
|
|
69
69
|
return parts.join('\n');
|
|
70
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Format a ForgeError as PLAIN text, for a surface that renders neither
|
|
73
|
+
* ANSI nor HTML -- today that is the chat reply the phone receives over the
|
|
74
|
+
* relay (src/relay/command_consumer.ts).
|
|
75
|
+
*
|
|
76
|
+
* No colours, no rules, no severity banner: a phone bubble is narrow and a
|
|
77
|
+
* row of dashes costs a whole line. What survives is the only part that is
|
|
78
|
+
* load-bearing -- what happened, why, and what to do -- with the labels
|
|
79
|
+
* coming from the same i18n keys the other two renderers use, so a new
|
|
80
|
+
* language lands on all three at once.
|
|
81
|
+
*/
|
|
82
|
+
export function formatForgeErrorText(err, lang = 'es') {
|
|
83
|
+
const parts = [err.what];
|
|
84
|
+
parts.push(tForLang(lang, 'error_ui.label.why') + ': ' + err.why);
|
|
85
|
+
parts.push(tForLang(lang, 'error_ui.label.fix') + ': ' + err.fix);
|
|
86
|
+
if (err.cmd)
|
|
87
|
+
parts.push(tForLang(lang, 'error_ui.label.cmd') + ': ' + err.cmd);
|
|
88
|
+
return parts.join('\n');
|
|
89
|
+
}
|
|
71
90
|
/* ===================================================================
|
|
72
91
|
* HTML formatter (chat panel, safe)
|
|
73
92
|
* ================================================================ */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error_formatter.js","sourceRoot":"","sources":["../../src/core/error_formatter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"error_formatter.js","sourceRoot":"","sources":["../../src/core/error_formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -63,6 +63,16 @@ export interface CommandConsumerDeps {
|
|
|
63
63
|
* resolve the reply text. `projectSlug` binds the turn to the project the
|
|
64
64
|
* phone composed it against (Pablo 2026-06-23). */
|
|
65
65
|
runTurn: (text: string, sessionId?: string, projectSlug?: string) => Promise<string>;
|
|
66
|
+
/** Como contar al usuario un turno que fallo. Devuelve el texto accionable
|
|
67
|
+
* cuando el error trae uno (un ForgeError del catalogo: que paso, por que
|
|
68
|
+
* y que hacer) y null cuando no, para que el loop caiga a su texto de
|
|
69
|
+
* siempre.
|
|
70
|
+
*
|
|
71
|
+
* Se INYECTA en vez de importar el catalogo aca porque este modulo no toca
|
|
72
|
+
* el disco a proposito -- es lo que deja probar el loop entero sin red y
|
|
73
|
+
* sin servidor -- y el catalogo de i18n lee sus diez archivos al cargarse.
|
|
74
|
+
* El que lo arma es el servidor, que ya los tiene cargados. */
|
|
75
|
+
describeError?: (e: unknown) => string | null;
|
|
66
76
|
/** Handle a control command (switch_project, interrupt, ...) and
|
|
67
77
|
* resolve a short status string to send back. Optional: when absent,
|
|
68
78
|
* control commands are reported as unsupported. (tasks #33, #29) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command_consumer.d.ts","sourceRoot":"","sources":["../../src/relay/command_consumer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;4DACwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;wEAEoE;IACpE,OAAO,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAC5D;;2EAEuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;4DAGwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC;iEAC6D;IAC7D,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;QACvC,EAAE,EAAE,OAAO,CAAC;QACZ,MAAM,EAAE,KAAK,CAAC;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAAC,EAAE,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC9E,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH;;wDAEoD;IACpD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrF;;yEAEqE;IACrE,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/E,oDAAoD;IACpD,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAChE;;;;8CAI0C;IAC1C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,OAAO,CAAC;IACvB;;;+EAG2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;+CAI2C;IAC3C,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC;IAC3C,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;2CAKuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2EAA2E;IAC3E,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,yCAAyC;IACzC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,IAAI,IAAI,CAAC;IACb,uDAAuD;IACvD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAMD,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,GAAG,IAAI,CAwBrF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,qBAAqB,
|
|
1
|
+
{"version":3,"file":"command_consumer.d.ts","sourceRoot":"","sources":["../../src/relay/command_consumer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;4DACwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;wEAEoE;IACpE,OAAO,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAC5D;;2EAEuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;4DAGwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC;iEAC6D;IAC7D,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;QACvC,EAAE,EAAE,OAAO,CAAC;QACZ,MAAM,EAAE,KAAK,CAAC;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAAC,EAAE,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC9E,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH;;wDAEoD;IACpD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrF;;;;;;;;oEAQgE;IAChE,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;IAC9C;;yEAEqE;IACrE,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/E,oDAAoD;IACpD,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAChE;;;;8CAI0C;IAC1C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,OAAO,CAAC;IACvB;;;+EAG2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;+CAI2C;IAC3C,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC;IAC3C,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;2CAKuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2EAA2E;IAC3E,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,yCAAyC;IACzC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,IAAI,IAAI,CAAC;IACb,uDAAuD;IACvD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAMD,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,GAAG,IAAI,CAwBrF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,qBAAqB,CAyFrF"}
|
|
@@ -112,7 +112,16 @@ export function startCommandConsumer(deps) {
|
|
|
112
112
|
}
|
|
113
113
|
catch (e) {
|
|
114
114
|
deps.onError?.(e);
|
|
115
|
-
|
|
115
|
+
/* Un error que llega con su ForgeError adentro se reporta CON lo
|
|
116
|
+
* que trae: que paso, por que y que hacer. Antes todo terminaba
|
|
117
|
+
* reducido a `e.message`, y de ahi salia el "No pude completar tu
|
|
118
|
+
* pedido: fetch failed" que vio el usuario -- un texto de libreria
|
|
119
|
+
* que no dice nada y que ademas MENTIA, porque el caso comun era
|
|
120
|
+
* un turno que si se completo y cuya respuesta el telefono nunca
|
|
121
|
+
* recibio (PND-234). El texto de siempre queda para los errores
|
|
122
|
+
* que todavia no pasan por el catalogo. */
|
|
123
|
+
const descrito = deps.describeError ? deps.describeError(e) : null;
|
|
124
|
+
deps.reply(cmd.id, descrito || ('No pude completar tu pedido: ' + errMsg(e)), true);
|
|
116
125
|
}
|
|
117
126
|
}
|
|
118
127
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command_consumer.js","sourceRoot":"","sources":["../../src/relay/command_consumer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;
|
|
1
|
+
{"version":3,"file":"command_consumer.js","sourceRoot":"","sources":["../../src/relay/command_consumer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Como el escritorio ejecuta un turno que PIDIO el telefono.
|
|
3
|
+
*
|
|
4
|
+
* El relay no corre nada: deja el pedido en su log y el escritorio lo levanta
|
|
5
|
+
* (command_consumer.ts). Para correrlo, el escritorio hace un POST por
|
|
6
|
+
* loopback a su PROPIO servidor de chat -- el mismo /api/chat que usa el
|
|
7
|
+
* panel -- y espera la respuesta. Esa indireccion es deliberada: un turno que
|
|
8
|
+
* viene del telefono recorre exactamente el mismo camino que uno del panel,
|
|
9
|
+
* sin una segunda implementacion que se desincronice.
|
|
10
|
+
*
|
|
11
|
+
* EL DEFECTO QUE ESTE MODULO CIERRA (PND-234. Pablo, 29-oct-2026, desde el
|
|
12
|
+
* telefono: "No pude completar tu pedido: fetch failed").
|
|
13
|
+
*
|
|
14
|
+
* La respuesta de /api/chat es un JSON, no un stream, asi que sus CABECERAS
|
|
15
|
+
* recien salen cuando el turno entero termino. Con `fetch` sin opciones ese
|
|
16
|
+
* POST hereda el headersTimeout de undici, que es un limite pensado para una
|
|
17
|
+
* llamada corta, y pasado ese punto muere el fetch -- no el turno. El
|
|
18
|
+
* escritorio seguia trabajando y terminaba el trabajo, pero el telefono ya
|
|
19
|
+
* habia recibido "fetch failed" y el usuario quedaba creyendo que no se hizo
|
|
20
|
+
* nada.
|
|
21
|
+
*
|
|
22
|
+
* El limite esta MEDIDO, no estimado: contra un servidor que acepta la
|
|
23
|
+
* conexion y nunca responde, el fetch global de Node 22.16 murio a los
|
|
24
|
+
* 305.677 ms con name=TypeError, message="fetch failed" y
|
|
25
|
+
* cause.code=UND_ERR_HEADERS_TIMEOUT. El turno del reporte habia durado 22
|
|
26
|
+
* minutos (turn_routing.jsonl 13:36:33Z; los archivos que escribio tienen
|
|
27
|
+
* mtime hasta 10:58 local). O sea: cinco minutos de techo para turnos que
|
|
28
|
+
* duran veinte. El defecto es determinista y crece con la utilidad del
|
|
29
|
+
* pedido -- cuanto mas trabajo pide el usuario desde el telefono, mas seguro
|
|
30
|
+
* es que no vea el resultado.
|
|
31
|
+
*
|
|
32
|
+
* POR QUE node:http Y NO fetch. Es la unica forma de mandar los tiempos sin
|
|
33
|
+
* depender de undici: Node lo trae adentro pero no lo expone como paquete, y
|
|
34
|
+
* construir un Agent con otro headersTimeout exigiria declarar una
|
|
35
|
+
* dependencia nueva para algo que el stdlib ya hace. La conexion es loopback
|
|
36
|
+
* y en claro, asi que no se pierde nada por bajar de capa.
|
|
37
|
+
*
|
|
38
|
+
* EL PRESUPUESTO NO DESAPARECE, cambia de escala. Sin ningun limite, un
|
|
39
|
+
* servidor de chat colgado dejaria al consumidor esperando para siempre -- y
|
|
40
|
+
* como atiende un pedido a la vez, ningun pedido POSTERIOR del telefono se
|
|
41
|
+
* correria nunca. Lo que no se usa es `req.setTimeout`, que mide INACTIVIDAD
|
|
42
|
+
* del socket: un turno que piensa diez minutos no manda un byte, y ese
|
|
43
|
+
* temporizador lo mataria sin motivo, que es la forma exacta del bug que esto
|
|
44
|
+
* cierra. Lo que se mide es el tiempo TOTAL, con un techo mas alto que
|
|
45
|
+
* cualquier turno legitimo.
|
|
46
|
+
*
|
|
47
|
+
* Y al vencerse, el usuario recibe algo accionable y VERDADERO: que el
|
|
48
|
+
* escritorio puede seguir trabajando y donde ver el resultado. El mensaje
|
|
49
|
+
* anterior ("no pude completar tu pedido") era falso en el caso mas comun.
|
|
50
|
+
*
|
|
51
|
+
* ASCII puro.
|
|
52
|
+
*/
|
|
53
|
+
/**
|
|
54
|
+
* Techo de tiempo total para un turno pedido desde el telefono.
|
|
55
|
+
*
|
|
56
|
+
* Una hora. El numero no sale de la nada: el turno que destapo el defecto
|
|
57
|
+
* duro 22 minutos y termino bien, asi que el techo tiene que estar bastante
|
|
58
|
+
* arriba de eso. Y tiene que seguir siendo finito porque el consumidor
|
|
59
|
+
* atiende de a uno: con el escritorio colgado, este es el tiempo que el
|
|
60
|
+
* telefono queda sin poder pedir nada. Una hora deja pasar cualquier turno
|
|
61
|
+
* real y acota el peor caso a algo que el dueno nota en el dia.
|
|
62
|
+
*/
|
|
63
|
+
export declare const MOBILE_TURN_BUDGET_MS: number;
|
|
64
|
+
/** El techo efectivo, con el override de operacion. */
|
|
65
|
+
export declare function mobileTurnBudgetMs(env?: NodeJS.ProcessEnv): number;
|
|
66
|
+
export interface LoopbackResponse {
|
|
67
|
+
status: number;
|
|
68
|
+
body: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* POST al /api/chat local, esperando lo que tarde el turno.
|
|
72
|
+
*
|
|
73
|
+
* Devuelve el status y el cuerpo crudo; parsear es del llamador, que es el
|
|
74
|
+
* que conoce la forma de la respuesta.
|
|
75
|
+
*/
|
|
76
|
+
export declare function postChatTurn(args: {
|
|
77
|
+
port: number;
|
|
78
|
+
payload: Record<string, unknown>;
|
|
79
|
+
budgetMs?: number;
|
|
80
|
+
path?: string;
|
|
81
|
+
}): Promise<LoopbackResponse>;
|
|
82
|
+
//# sourceMappingURL=loopback_turn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loopback_turn.d.ts","sourceRoot":"","sources":["../../src/relay/loopback_turn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AAQH;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,QAAc,CAAC;AAEjD,uDAAuD;AACvD,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAU/E;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6E5B"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Como el escritorio ejecuta un turno que PIDIO el telefono.
|
|
3
|
+
*
|
|
4
|
+
* El relay no corre nada: deja el pedido en su log y el escritorio lo levanta
|
|
5
|
+
* (command_consumer.ts). Para correrlo, el escritorio hace un POST por
|
|
6
|
+
* loopback a su PROPIO servidor de chat -- el mismo /api/chat que usa el
|
|
7
|
+
* panel -- y espera la respuesta. Esa indireccion es deliberada: un turno que
|
|
8
|
+
* viene del telefono recorre exactamente el mismo camino que uno del panel,
|
|
9
|
+
* sin una segunda implementacion que se desincronice.
|
|
10
|
+
*
|
|
11
|
+
* EL DEFECTO QUE ESTE MODULO CIERRA (PND-234. Pablo, 29-oct-2026, desde el
|
|
12
|
+
* telefono: "No pude completar tu pedido: fetch failed").
|
|
13
|
+
*
|
|
14
|
+
* La respuesta de /api/chat es un JSON, no un stream, asi que sus CABECERAS
|
|
15
|
+
* recien salen cuando el turno entero termino. Con `fetch` sin opciones ese
|
|
16
|
+
* POST hereda el headersTimeout de undici, que es un limite pensado para una
|
|
17
|
+
* llamada corta, y pasado ese punto muere el fetch -- no el turno. El
|
|
18
|
+
* escritorio seguia trabajando y terminaba el trabajo, pero el telefono ya
|
|
19
|
+
* habia recibido "fetch failed" y el usuario quedaba creyendo que no se hizo
|
|
20
|
+
* nada.
|
|
21
|
+
*
|
|
22
|
+
* El limite esta MEDIDO, no estimado: contra un servidor que acepta la
|
|
23
|
+
* conexion y nunca responde, el fetch global de Node 22.16 murio a los
|
|
24
|
+
* 305.677 ms con name=TypeError, message="fetch failed" y
|
|
25
|
+
* cause.code=UND_ERR_HEADERS_TIMEOUT. El turno del reporte habia durado 22
|
|
26
|
+
* minutos (turn_routing.jsonl 13:36:33Z; los archivos que escribio tienen
|
|
27
|
+
* mtime hasta 10:58 local). O sea: cinco minutos de techo para turnos que
|
|
28
|
+
* duran veinte. El defecto es determinista y crece con la utilidad del
|
|
29
|
+
* pedido -- cuanto mas trabajo pide el usuario desde el telefono, mas seguro
|
|
30
|
+
* es que no vea el resultado.
|
|
31
|
+
*
|
|
32
|
+
* POR QUE node:http Y NO fetch. Es la unica forma de mandar los tiempos sin
|
|
33
|
+
* depender de undici: Node lo trae adentro pero no lo expone como paquete, y
|
|
34
|
+
* construir un Agent con otro headersTimeout exigiria declarar una
|
|
35
|
+
* dependencia nueva para algo que el stdlib ya hace. La conexion es loopback
|
|
36
|
+
* y en claro, asi que no se pierde nada por bajar de capa.
|
|
37
|
+
*
|
|
38
|
+
* EL PRESUPUESTO NO DESAPARECE, cambia de escala. Sin ningun limite, un
|
|
39
|
+
* servidor de chat colgado dejaria al consumidor esperando para siempre -- y
|
|
40
|
+
* como atiende un pedido a la vez, ningun pedido POSTERIOR del telefono se
|
|
41
|
+
* correria nunca. Lo que no se usa es `req.setTimeout`, que mide INACTIVIDAD
|
|
42
|
+
* del socket: un turno que piensa diez minutos no manda un byte, y ese
|
|
43
|
+
* temporizador lo mataria sin motivo, que es la forma exacta del bug que esto
|
|
44
|
+
* cierra. Lo que se mide es el tiempo TOTAL, con un techo mas alto que
|
|
45
|
+
* cualquier turno legitimo.
|
|
46
|
+
*
|
|
47
|
+
* Y al vencerse, el usuario recibe algo accionable y VERDADERO: que el
|
|
48
|
+
* escritorio puede seguir trabajando y donde ver el resultado. El mensaje
|
|
49
|
+
* anterior ("no pude completar tu pedido") era falso en el caso mas comun.
|
|
50
|
+
*
|
|
51
|
+
* ASCII puro.
|
|
52
|
+
*/
|
|
53
|
+
import http from 'node:http';
|
|
54
|
+
import { renderForgeError, ForgeFailure } from '../core/error_catalog.js';
|
|
55
|
+
import { E_MOBILE_TURN_UNANSWERED, E_MOBILE_TURN_UNDELIVERED, } from '../core/error_catalog.js';
|
|
56
|
+
/**
|
|
57
|
+
* Techo de tiempo total para un turno pedido desde el telefono.
|
|
58
|
+
*
|
|
59
|
+
* Una hora. El numero no sale de la nada: el turno que destapo el defecto
|
|
60
|
+
* duro 22 minutos y termino bien, asi que el techo tiene que estar bastante
|
|
61
|
+
* arriba de eso. Y tiene que seguir siendo finito porque el consumidor
|
|
62
|
+
* atiende de a uno: con el escritorio colgado, este es el tiempo que el
|
|
63
|
+
* telefono queda sin poder pedir nada. Una hora deja pasar cualquier turno
|
|
64
|
+
* real y acota el peor caso a algo que el dueno nota en el dia.
|
|
65
|
+
*/
|
|
66
|
+
export const MOBILE_TURN_BUDGET_MS = 60 * 60_000;
|
|
67
|
+
/** El techo efectivo, con el override de operacion. */
|
|
68
|
+
export function mobileTurnBudgetMs(env = process.env) {
|
|
69
|
+
const raw = env['YF_MOBILE_TURN_BUDGET_MS'];
|
|
70
|
+
if (raw === undefined || raw === '')
|
|
71
|
+
return MOBILE_TURN_BUDGET_MS;
|
|
72
|
+
const n = Number(raw);
|
|
73
|
+
/* Un valor invalido o no positivo NO apaga la guarda ni la pone en cero:
|
|
74
|
+
* cae al default. Un "0" en una variable de entorno es casi siempre un
|
|
75
|
+
* descuido, y leerlo como "sin limite" convertiria un typo en un
|
|
76
|
+
* consumidor trabado para siempre. */
|
|
77
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
78
|
+
return MOBILE_TURN_BUDGET_MS;
|
|
79
|
+
return n;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* POST al /api/chat local, esperando lo que tarde el turno.
|
|
83
|
+
*
|
|
84
|
+
* Devuelve el status y el cuerpo crudo; parsear es del llamador, que es el
|
|
85
|
+
* que conoce la forma de la respuesta.
|
|
86
|
+
*/
|
|
87
|
+
export async function postChatTurn(args) {
|
|
88
|
+
const budget = args.budgetMs ?? mobileTurnBudgetMs();
|
|
89
|
+
const body = Buffer.from(JSON.stringify(args.payload), 'utf8');
|
|
90
|
+
const minutes = Math.max(1, Math.round(budget / 60_000));
|
|
91
|
+
return new Promise((resolve, reject) => {
|
|
92
|
+
let settled = false;
|
|
93
|
+
/* Que se vencio el presupuesto se recuerda aparte del error del socket:
|
|
94
|
+
* `req.destroy()` llega al handler de error como un ECONNRESET cualquiera,
|
|
95
|
+
* y sin esta marca el usuario recibiria el mensaje de "no se entrego" --
|
|
96
|
+
* el que dice que no se ejecuto nada -- justamente en el caso en que si se
|
|
97
|
+
* ejecuto. Era el error del que venimos. */
|
|
98
|
+
let vencido = false;
|
|
99
|
+
const req = http.request({
|
|
100
|
+
host: '127.0.0.1',
|
|
101
|
+
port: args.port,
|
|
102
|
+
path: args.path ?? '/api/chat',
|
|
103
|
+
method: 'POST',
|
|
104
|
+
headers: {
|
|
105
|
+
'content-type': 'application/json',
|
|
106
|
+
'content-length': String(body.byteLength),
|
|
107
|
+
},
|
|
108
|
+
}, (res) => {
|
|
109
|
+
const chunks = [];
|
|
110
|
+
res.on('data', (c) => chunks.push(c));
|
|
111
|
+
res.on('end', () => {
|
|
112
|
+
if (settled)
|
|
113
|
+
return;
|
|
114
|
+
settled = true;
|
|
115
|
+
clearTimeout(timer);
|
|
116
|
+
resolve({
|
|
117
|
+
status: res.statusCode ?? 0,
|
|
118
|
+
body: Buffer.concat(chunks).toString('utf8'),
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
/* Un corte MIENTRAS baja el cuerpo tampoco es "no se entrego": el turno
|
|
122
|
+
* ya corrio y el servidor ya estaba contestando. */
|
|
123
|
+
res.on('error', (e) => fail(e, true));
|
|
124
|
+
});
|
|
125
|
+
const timer = setTimeout(() => {
|
|
126
|
+
vencido = true;
|
|
127
|
+
req.destroy(new Error('presupuesto de turno vencido'));
|
|
128
|
+
}, budget);
|
|
129
|
+
/* Que este temporizador no sea lo que mantiene vivo al proceso. */
|
|
130
|
+
if (typeof timer.unref === 'function') {
|
|
131
|
+
timer.unref();
|
|
132
|
+
}
|
|
133
|
+
const fail = (cause, yaCorrio) => {
|
|
134
|
+
if (settled)
|
|
135
|
+
return;
|
|
136
|
+
settled = true;
|
|
137
|
+
clearTimeout(timer);
|
|
138
|
+
/* "No se entrego" se dice SOLO con prueba positiva de que nada corrio,
|
|
139
|
+
* y la unica prueba positiva es que la conexion no se llego a
|
|
140
|
+
* establecer. Cualquier otro corte -- el socket se cayo despues del
|
|
141
|
+
* saludo, el servidor murio a mitad del turno -- deja abierta la
|
|
142
|
+
* posibilidad de que el turno si haya corrido, y en la duda no se le
|
|
143
|
+
* dice al usuario que no se hizo nada: se le dice que no hubo respuesta
|
|
144
|
+
* y donde mirar. Es la misma doctrina que decidePick e
|
|
145
|
+
* liveBelongsToProject en el lado del telefono: descartar solo con
|
|
146
|
+
* prueba de lo contrario. */
|
|
147
|
+
const noEntrego = !vencido && !yaCorrio && esRechazoDeConexion(cause);
|
|
148
|
+
if (noEntrego) {
|
|
149
|
+
reject(new ForgeFailure(renderForgeError(E_MOBILE_TURN_UNDELIVERED, { port: args.port }), cause));
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
reject(new ForgeFailure(renderForgeError(E_MOBILE_TURN_UNANSWERED, { minutes }), cause));
|
|
153
|
+
};
|
|
154
|
+
req.on('error', (e) => fail(e, false));
|
|
155
|
+
req.end(body);
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* El socket nunca llego a conectar: no hay servidor escuchando ahi.
|
|
160
|
+
*
|
|
161
|
+
* Es la unica evidencia de que el turno NO corrio. Se mira el errno y no el
|
|
162
|
+
* texto porque el texto cambia entre versiones de Node y entre sistemas.
|
|
163
|
+
*/
|
|
164
|
+
function esRechazoDeConexion(e) {
|
|
165
|
+
const code = e?.code;
|
|
166
|
+
if (!code)
|
|
167
|
+
return false;
|
|
168
|
+
return code === 'ECONNREFUSED' || code === 'ENOTFOUND'
|
|
169
|
+
|| code === 'EADDRNOTAVAIL' || code === 'EHOSTUNREACH';
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=loopback_turn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loopback_turn.js","sourceRoot":"","sources":["../../src/relay/loopback_turn.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* Yujin Forge CLI version. Kept in sync with package.json by the npm
|
|
3
3
|
* "version" lifecycle (scripts/sync_version.mjs) so the two never drift.
|
|
4
4
|
*/
|
|
5
|
-
export declare const VERSION = "1.23.
|
|
5
|
+
export declare const VERSION = "1.23.3";
|
|
6
6
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED