runspec-node 0.19.0 → 0.21.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/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { parse, loadSpec } from './parser';
2
2
  export { registerType, listTypes } from './types';
3
+ export { tsTypeOf } from './inference';
3
4
  export { RunSpecError, MissingRequiredArg, InvalidChoice, OutOfRange, UnknownArg, GroupViolation, AutonomyViolation } from './errors';
4
5
  export { findConfig } from './finder';
5
6
  export { loadRaw } from './loader';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACtI,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACtI,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
package/dist/index.js CHANGED
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getLogger = exports.loadRaw = exports.findConfig = exports.AutonomyViolation = exports.GroupViolation = exports.UnknownArg = exports.OutOfRange = exports.InvalidChoice = exports.MissingRequiredArg = exports.RunSpecError = exports.listTypes = exports.registerType = exports.loadSpec = exports.parse = void 0;
3
+ exports.getLogger = exports.loadRaw = exports.findConfig = exports.AutonomyViolation = exports.GroupViolation = exports.UnknownArg = exports.OutOfRange = exports.InvalidChoice = exports.MissingRequiredArg = exports.RunSpecError = exports.tsTypeOf = exports.listTypes = exports.registerType = exports.loadSpec = exports.parse = void 0;
4
4
  var parser_1 = require("./parser");
5
5
  Object.defineProperty(exports, "parse", { enumerable: true, get: function () { return parser_1.parse; } });
6
6
  Object.defineProperty(exports, "loadSpec", { enumerable: true, get: function () { return parser_1.loadSpec; } });
7
7
  var types_1 = require("./types");
8
8
  Object.defineProperty(exports, "registerType", { enumerable: true, get: function () { return types_1.registerType; } });
9
9
  Object.defineProperty(exports, "listTypes", { enumerable: true, get: function () { return types_1.listTypes; } });
10
+ var inference_1 = require("./inference");
11
+ Object.defineProperty(exports, "tsTypeOf", { enumerable: true, get: function () { return inference_1.tsTypeOf; } });
10
12
  var errors_1 = require("./errors");
11
13
  Object.defineProperty(exports, "RunSpecError", { enumerable: true, get: function () { return errors_1.RunSpecError; } });
12
14
  Object.defineProperty(exports, "MissingRequiredArg", { enumerable: true, get: function () { return errors_1.MissingRequiredArg; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAA2C;AAAlC,+FAAA,KAAK,OAAA;AAAE,kGAAA,QAAQ,OAAA;AACxB,iCAAkD;AAAzC,qGAAA,YAAY,OAAA;AAAE,kGAAA,SAAS,OAAA;AAChC,mCAAsI;AAA7H,sGAAA,YAAY,OAAA;AAAE,4GAAA,kBAAkB,OAAA;AAAE,uGAAA,aAAa,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AACnH,mCAAsC;AAA7B,oGAAA,UAAU,OAAA;AACnB,mCAAmC;AAA1B,iGAAA,OAAO,OAAA;AAChB,iDAA4C;AAAnC,0GAAA,SAAS,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAA2C;AAAlC,+FAAA,KAAK,OAAA;AAAE,kGAAA,QAAQ,OAAA;AACxB,iCAAkD;AAAzC,qGAAA,YAAY,OAAA;AAAE,kGAAA,SAAS,OAAA;AAChC,yCAAuC;AAA9B,qGAAA,QAAQ,OAAA;AACjB,mCAAsI;AAA7H,sGAAA,YAAY,OAAA;AAAE,4GAAA,kBAAkB,OAAA;AAAE,uGAAA,aAAa,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AACnH,mCAAsC;AAA7B,oGAAA,UAAU,OAAA;AACnB,mCAAmC;AAA1B,iGAAA,OAAO,OAAA;AAChB,iDAA4C;AAAnC,0GAAA,SAAS,OAAA"}
@@ -3,6 +3,12 @@ export declare const AUTONOMY_LEVELS: readonly ["autonomous", "confirm", "superv
3
3
  export declare const AUTONOMY_RANK: {
4
4
  [k: string]: number;
5
5
  };
6
+ /** The TypeScript type of an arg's parsed value: the item type, suffixed `[]`
7
+ * when the arg is `multiple` (`rest` is always `string[]`). `arg.type` itself
8
+ * stays the item type — it drives per-item coercion. Pure helper, computed on
9
+ * demand from a (typically inferred) ArgSpec; custom registered types fall
10
+ * back to `"unknown"`. e.g. `tsTypeOf({type:"str", multiple:true})` → `"string[]"`. */
11
+ export declare function tsTypeOf(arg: ArgSpec): string;
6
12
  export declare function inferArg(raw: ArgSpec): ArgSpec;
7
13
  export declare function inferScript(raw: ScriptSpec, configAutonomy: string): ScriptSpec;
8
14
  export declare function effectiveAutonomy(scriptAutonomy: string, providedArgs: Record<string, unknown>, argSpecs: Record<string, ArgSpec>): string;
@@ -1 +1 @@
1
- {"version":3,"file":"inference.d.ts","sourceRoot":"","sources":["../src/inference.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGpD,eAAO,MAAM,eAAe,4DAA6D,CAAC;AAC1F,eAAO,MAAM,aAAa;;CAA4D,CAAC;AAEvF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAkC9C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,GAAG,UAAU,CAc/E;AAED,wBAAgB,iBAAiB,CAC/B,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,MAAM,CAaR;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAE7E"}
1
+ {"version":3,"file":"inference.d.ts","sourceRoot":"","sources":["../src/inference.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGpD,eAAO,MAAM,eAAe,4DAA6D,CAAC;AAC1F,eAAO,MAAM,aAAa;;CAA4D,CAAC;AAevF;;;;wFAIwF;AACxF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAK7C;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAkC9C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,GAAG,UAAU,CAc/E;AAED,wBAAgB,iBAAiB,CAC/B,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,MAAM,CAaR;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAE7E"}
package/dist/inference.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AUTONOMY_RANK = exports.AUTONOMY_LEVELS = void 0;
4
+ exports.tsTypeOf = tsTypeOf;
4
5
  exports.inferArg = inferArg;
5
6
  exports.inferScript = inferScript;
6
7
  exports.effectiveAutonomy = effectiveAutonomy;
@@ -8,6 +9,30 @@ exports.isMoreRestrictive = isMoreRestrictive;
8
9
  const errors_1 = require("./errors");
9
10
  exports.AUTONOMY_LEVELS = ['autonomous', 'confirm', 'supervised', 'manual'];
10
11
  exports.AUTONOMY_RANK = Object.fromEntries(exports.AUTONOMY_LEVELS.map((l, i) => [l, i]));
12
+ // Item-type name → its TypeScript type. Mirrors the JSON-Schema type map used
13
+ // by emit; custom (register_type) names fall back to `unknown`.
14
+ const TS_TYPE_NAMES = {
15
+ str: 'string',
16
+ int: 'number',
17
+ float: 'number',
18
+ bool: 'boolean',
19
+ flag: 'boolean',
20
+ path: 'string',
21
+ choice: 'string',
22
+ rest: 'string[]',
23
+ };
24
+ /** The TypeScript type of an arg's parsed value: the item type, suffixed `[]`
25
+ * when the arg is `multiple` (`rest` is always `string[]`). `arg.type` itself
26
+ * stays the item type — it drives per-item coercion. Pure helper, computed on
27
+ * demand from a (typically inferred) ArgSpec; custom registered types fall
28
+ * back to `"unknown"`. e.g. `tsTypeOf({type:"str", multiple:true})` → `"string[]"`. */
29
+ function tsTypeOf(arg) {
30
+ const type = arg.type ?? 'str';
31
+ if (type === 'rest')
32
+ return 'string[]';
33
+ const base = TS_TYPE_NAMES[type] ?? 'unknown';
34
+ return arg.multiple ? `${base}[]` : base;
35
+ }
11
36
  function inferArg(raw) {
12
37
  const result = { ...raw };
13
38
  const def = result.default;
@@ -1 +1 @@
1
- {"version":3,"file":"inference.js","sourceRoot":"","sources":["../src/inference.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inference.js","sourceRoot":"","sources":["../src/inference.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,19 @@
5
5
  */
6
6
  import type { LoggingConfig } from './models';
7
7
  declare const RUN_SUMMARY_LOGGER = "runspec.runsummary";
8
+ declare const EXCEPTION_LOGGER = "runspec.exception";
9
+ interface ExcFrame {
10
+ func: string;
11
+ file: string;
12
+ line: number | null;
13
+ code: string | null;
14
+ }
15
+ interface ExcStructured {
16
+ type: string;
17
+ message: string;
18
+ module: string | null;
19
+ frames: ExcFrame[];
20
+ }
8
21
  export declare class Logger {
9
22
  private readonly name;
10
23
  constructor(name: string);
@@ -24,6 +37,21 @@ declare function _periodForDate(d: Date, when: 'daily' | 'midnight' | 'weekly'):
24
37
  * formatted line directly to stderr. Idempotent — safe to call repeatedly.
25
38
  */
26
39
  export declare function emitRunSummary(): void;
40
+ /** Clean, machine-readable form of an error for the JSON audit / UI tables. */
41
+ declare function buildExcStructured(err: Error): ExcStructured;
42
+ /**
43
+ * Neat, aligned, stdlib-only trace for --debug console output. Internal
44
+ * runspec frames are dropped from the *display* (full trace still hits the
45
+ * file). Falls back to the full list if filtering empties it.
46
+ */
47
+ declare function formatCompactTrace(err: Error, frames: ExcFrame[]): string;
48
+ /**
49
+ * Uniform handling for an uncaught error: always write a structured record to
50
+ * the audit file, feed the run summary (when on), and show a neat compact
51
+ * trace on the console only with --debug (otherwise a single concise line).
52
+ * Exported for tests so they can exercise it without triggering process.exit.
53
+ */
54
+ export declare function _handleUncaught(err: Error): void;
27
55
  export interface ConfigureLoggingOptions {
28
56
  logCfg: LoggingConfig | undefined;
29
57
  runnableName: string;
@@ -63,5 +91,5 @@ export interface ConfigureLoggingOptions {
63
91
  */
64
92
  export declare function configureLogging(opts: ConfigureLoggingOptions): void;
65
93
  export declare function _resetForTest(): void;
66
- export { _periodForDate, RUN_SUMMARY_LOGGER };
94
+ export { _periodForDate, RUN_SUMMARY_LOGGER, EXCEPTION_LOGGER, buildExcStructured, formatCompactTrace };
67
95
  //# sourceMappingURL=logging_setup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logging_setup.d.ts","sourceRoot":"","sources":["../src/logging_setup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAQ9C,QAAA,MAAM,kBAAkB,uBAAuB,CAAC;AA6EhD,qBAAa,MAAM;IACL,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,MAAM;IAEzC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAC1D,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IACzD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAC5D,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IACzD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAC1D,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAE7D,OAAO,CAAC,KAAK;CASd;AAeD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO9C;AA+ID,iBAAS,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAU9E;AAwID;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAiCrC;AAoDD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,CA2CpE;AAID,wBAAgB,aAAa,IAAI,IAAI,CAOpC;AAED,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"logging_setup.d.ts","sourceRoot":"","sources":["../src/logging_setup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAQ9C,QAAA,MAAM,kBAAkB,uBAAuB,CAAC;AAIhD,QAAA,MAAM,gBAAgB,sBAAsB,CAAC;AAc7C,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,QAAQ,EAAE,CAAC;CACpB;AAwED,qBAAa,MAAM;IACL,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,MAAM;IAEzC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAC1D,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IACzD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAC5D,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IACzD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAC1D,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAE7D,OAAO,CAAC,KAAK;CASd;AAeD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO9C;AAgJD,iBAAS,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAU9E;AAwID;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAiCrC;AAqBD,+EAA+E;AAC/E,iBAAS,kBAAkB,CAAC,GAAG,EAAE,KAAK,GAAG,aAAa,CAKrD;AAED;;;;GAIG;AACH,iBAAS,kBAAkB,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAUlE;AAsBD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,CAqBhD;AAkCD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAgDpE;AAID,wBAAgB,aAAa,IAAI,IAAI,CAQpC;AAED,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAC"}
@@ -38,12 +38,15 @@ var __importStar = (this && this.__importStar) || (function () {
38
38
  };
39
39
  })();
40
40
  Object.defineProperty(exports, "__esModule", { value: true });
41
- exports.RUN_SUMMARY_LOGGER = exports.Logger = void 0;
41
+ exports.EXCEPTION_LOGGER = exports.RUN_SUMMARY_LOGGER = exports.Logger = void 0;
42
42
  exports.getLogger = getLogger;
43
43
  exports.emitRunSummary = emitRunSummary;
44
+ exports._handleUncaught = _handleUncaught;
44
45
  exports.configureLogging = configureLogging;
45
46
  exports._resetForTest = _resetForTest;
46
47
  exports._periodForDate = _periodForDate;
48
+ exports.buildExcStructured = buildExcStructured;
49
+ exports.formatCompactTrace = formatCompactTrace;
47
50
  const fs = __importStar(require("fs"));
48
51
  const path = __importStar(require("path"));
49
52
  const os = __importStar(require("os"));
@@ -53,6 +56,15 @@ const _loggers = new Map();
53
56
  const _handlers = [];
54
57
  const RUN_SUMMARY_LOGGER = 'runspec.runsummary';
55
58
  exports.RUN_SUMMARY_LOGGER = RUN_SUMMARY_LOGGER;
59
+ // Uncaught exceptions are emitted on this dedicated logger so the file handler
60
+ // records them while the console handlers drop them by name — console display is
61
+ // handled explicitly in _handleUncaught (debug-gated).
62
+ const EXCEPTION_LOGGER = 'runspec.exception';
63
+ exports.EXCEPTION_LOGGER = EXCEPTION_LOGGER;
64
+ // Directory of the installed runspec-node package — used to filter internal
65
+ // library frames out of the *displayed* compact trace (full trace still hits the file).
66
+ const RUNSPEC_PKG_DIR = __dirname;
67
+ let _debug = false; // mirrors the --debug flag; read by _handleUncaught for console rendering
56
68
  let _summaryState = null;
57
69
  let _exitHooksInstalled = false;
58
70
  // ── level map ─────────────────────────────────────────────────────────────────
@@ -140,6 +152,8 @@ function formatJson(record) {
140
152
  };
141
153
  if (record.error)
142
154
  obj['exc'] = record.error.stack ?? record.error.message;
155
+ if (record.excStructured)
156
+ obj['exc_structured'] = record.excStructured;
143
157
  if (record.extra)
144
158
  obj['extra'] = record.extra;
145
159
  return JSON.stringify(obj);
@@ -184,7 +198,7 @@ class StdoutHandler {
184
198
  emit(record) {
185
199
  if (record.levelNum >= 30)
186
200
  return; // WARNING+ belongs on stderr
187
- if (record.loggerName === RUN_SUMMARY_LOGGER)
201
+ if (record.loggerName === RUN_SUMMARY_LOGGER || record.loggerName === EXCEPTION_LOGGER)
188
202
  return;
189
203
  try {
190
204
  process.stdout.write(formatConsole(record, this.showTracebacks) + '\n');
@@ -208,7 +222,7 @@ class StderrHandler {
208
222
  emit(record) {
209
223
  if (record.levelNum < 30)
210
224
  return;
211
- if (record.loggerName === RUN_SUMMARY_LOGGER)
225
+ if (record.loggerName === RUN_SUMMARY_LOGGER || record.loggerName === EXCEPTION_LOGGER)
212
226
  return;
213
227
  try {
214
228
  process.stderr.write(formatConsole(record, this.showTracebacks) + '\n');
@@ -229,8 +243,8 @@ class RunSummaryCounter {
229
243
  DEBUG: 0, INFO: 0, WARNING: 0, ERROR: 0, CRITICAL: 0,
230
244
  };
231
245
  emit(record) {
232
- // Don't count the summary record itself.
233
- if (record.loggerName === RUN_SUMMARY_LOGGER)
246
+ // Don't count runspec's own bookkeeping records (summary + uncaught-exception).
247
+ if (record.loggerName === RUN_SUMMARY_LOGGER || record.loggerName === EXCEPTION_LOGGER)
234
248
  return;
235
249
  const label = LEVEL_LABEL[record.levelNum];
236
250
  if (label && label in this.counts) {
@@ -471,6 +485,95 @@ function emitRunSummary() {
471
485
  // never disrupt shutdown
472
486
  }
473
487
  }
488
+ // ── uncaught exceptions ────────────────────────────────────────────────────────
489
+ const STACK_FRAME_RE = /^\s*at (?:(.+?) \()?(.+?):(\d+):(\d+)\)?$/;
490
+ /**
491
+ * Parse a V8 stack string into frames, innermost LAST (mirroring Python's
492
+ * traceback.extract_tb order). `code` is unavailable from a stack string.
493
+ */
494
+ function parseStackFrames(stack) {
495
+ const frames = [];
496
+ for (const lineStr of stack.split('\n')) {
497
+ const m = STACK_FRAME_RE.exec(lineStr);
498
+ if (!m)
499
+ continue;
500
+ frames.push({ func: m[1] ?? '<anonymous>', file: m[2], line: parseInt(m[3], 10), code: null });
501
+ }
502
+ frames.reverse();
503
+ return frames;
504
+ }
505
+ /** Clean, machine-readable form of an error for the JSON audit / UI tables. */
506
+ function buildExcStructured(err) {
507
+ const frames = parseStackFrames(err.stack ?? '');
508
+ const last = frames.length ? frames[frames.length - 1] : null;
509
+ const module = last ? path.basename(last.file).replace(/\.[^.]+$/, '') : null;
510
+ return { type: err.name || 'Error', message: err.message || String(err), module, frames };
511
+ }
512
+ /**
513
+ * Neat, aligned, stdlib-only trace for --debug console output. Internal
514
+ * runspec frames are dropped from the *display* (full trace still hits the
515
+ * file). Falls back to the full list if filtering empties it.
516
+ */
517
+ function formatCompactTrace(err, frames) {
518
+ const shown = frames.filter((f) => !f.file.includes(RUNSPEC_PKG_DIR));
519
+ const use = shown.length ? shown : frames;
520
+ const locs = use.map((f) => `${path.basename(f.file)}:${f.line}`);
521
+ const width = Math.max(0, ...locs.map((l) => l.length));
522
+ const lines = [`${err.name || 'Error'}: ${err.message}`, ''];
523
+ use.forEach((f, i) => {
524
+ lines.push(` ${locs[i].padEnd(width)} ${f.func}`.trimEnd());
525
+ });
526
+ return lines.join('\n');
527
+ }
528
+ /** Emit the structured exception record straight to the handlers (file keeps it). */
529
+ function emitExceptionRecord(err, structured) {
530
+ if (_handlers.length === 0)
531
+ return;
532
+ const record = {
533
+ ts: new Date(),
534
+ levelNum: 50,
535
+ loggerName: EXCEPTION_LOGGER,
536
+ message: 'uncaught exception',
537
+ error: err,
538
+ excStructured: structured,
539
+ };
540
+ for (const h of _handlers) {
541
+ try {
542
+ if (record.levelNum >= h.level)
543
+ h.emit(record);
544
+ }
545
+ catch {
546
+ // never disrupt
547
+ }
548
+ }
549
+ }
550
+ /**
551
+ * Uniform handling for an uncaught error: always write a structured record to
552
+ * the audit file, feed the run summary (when on), and show a neat compact
553
+ * trace on the console only with --debug (otherwise a single concise line).
554
+ * Exported for tests so they can exercise it without triggering process.exit.
555
+ */
556
+ function _handleUncaught(err) {
557
+ const structured = buildExcStructured(err);
558
+ // Always to the audit file (independent of --debug and of the summary toggle).
559
+ emitExceptionRecord(err, structured);
560
+ if (_summaryState) {
561
+ _summaryState.exception = { type: structured.type, message: structured.message, traceback: err.stack ?? '' };
562
+ _summaryState.exitCode = 1;
563
+ }
564
+ // Console: full compact trace only with --debug, else a one-liner.
565
+ try {
566
+ if (_debug) {
567
+ process.stderr.write(formatCompactTrace(err, structured.frames) + '\n');
568
+ }
569
+ else {
570
+ process.stderr.write(`ERROR: ${structured.type}: ${structured.message} (run with --debug for traceback)\n`);
571
+ }
572
+ }
573
+ catch {
574
+ process.stderr.write((err.stack ?? String(err)) + '\n'); // safety fallback
575
+ }
576
+ }
474
577
  function installExitHooks() {
475
578
  if (_exitHooksInstalled)
476
579
  return;
@@ -478,42 +581,24 @@ function installExitHooks() {
478
581
  process.on('exit', (code) => {
479
582
  if (_summaryState && !_summaryState.emitted) {
480
583
  // process.exitCode wins over the explicit exception capture only if
481
- // it's non-zero — uncaughtException already set state.exitCode=1.
584
+ // it's non-zero — _handleUncaught already set state.exitCode=1.
482
585
  if (code !== 0 && _summaryState.exitCode === 0)
483
586
  _summaryState.exitCode = code;
484
587
  emitRunSummary();
485
588
  }
486
589
  });
487
590
  // Skip the crash-handlers under jest — they call process.exit(1), which
488
- // would tear down the test runner if any test ever produced an unhandled
489
- // rejection. The 'exit' hook above is harmless and still runs.
591
+ // would tear down the test runner. _handleUncaught is unit-tested directly.
592
+ // The 'exit' hook above is harmless and still runs.
490
593
  if (process.env['JEST_WORKER_ID'] !== undefined)
491
594
  return;
492
595
  process.on('uncaughtException', (err) => {
493
- if (_summaryState) {
494
- _summaryState.exception = {
495
- type: err.name || 'Error',
496
- message: err.message || String(err),
497
- traceback: err.stack ?? '',
498
- };
499
- _summaryState.exitCode = 1;
500
- }
501
- // Preserve default Node behaviour: print and exit non-zero. The 'exit'
502
- // hook above will fire and run emitRunSummary().
503
- process.stderr.write((err.stack ?? String(err)) + '\n');
596
+ _handleUncaught(err);
504
597
  process.exit(1);
505
598
  });
506
599
  process.on('unhandledRejection', (reason) => {
507
- if (_summaryState) {
508
- const err = reason instanceof Error ? reason : new Error(String(reason));
509
- _summaryState.exception = {
510
- type: err.name || 'Error',
511
- message: err.message || String(reason),
512
- traceback: err.stack ?? '',
513
- };
514
- _summaryState.exitCode = 1;
515
- }
516
- process.stderr.write(`Unhandled rejection: ${reason instanceof Error ? (reason.stack ?? reason.message) : String(reason)}\n`);
600
+ const err = reason instanceof Error ? reason : new Error(String(reason));
601
+ _handleUncaught(err);
517
602
  process.exit(1);
518
603
  });
519
604
  }
@@ -548,6 +633,7 @@ function configureLogging(opts) {
548
633
  if (!opts.logCfg || _configured)
549
634
  return;
550
635
  const debug = opts.debug ?? false;
636
+ _debug = debug;
551
637
  const floor = debug ? LEVEL_NUM['debug'] : LEVEL_NUM['info'];
552
638
  _handlers.push(new StdoutHandler(floor, debug));
553
639
  _handlers.push(new StderrHandler(debug));
@@ -577,13 +663,17 @@ function configureLogging(opts) {
577
663
  user,
578
664
  userTarget,
579
665
  };
580
- installExitHooks();
581
666
  }
667
+ // Uncaught-exception handling is always installed (independent of the summary
668
+ // toggle) so the structured exception record reaches the audit file even when
669
+ // summary is off. The exit hook only flushes a summary when _summaryState is set.
670
+ installExitHooks();
582
671
  _configured = true;
583
672
  }
584
673
  // ── test helper ───────────────────────────────────────────────────────────────
585
674
  function _resetForTest() {
586
675
  _configured = false;
676
+ _debug = false;
587
677
  _loggers.clear();
588
678
  _handlers.length = 0;
589
679
  _summaryState = null;
@@ -1 +1 @@
1
- {"version":3,"file":"logging_setup.js","sourceRoot":"","sources":["../src/logging_setup.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4HH,8BAOC;AAsSD,wCAiCC;AA0FD,4CA2CC;AAID,sCAOC;AAEQ,wCAAc;AA1lBvB,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAGzB,iFAAiF;AAEjF,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;AAC3C,MAAM,SAAS,GAAc,EAAE,CAAC;AAEhC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AA+kBvB,gDAAkB;AAzjB3C,IAAI,aAAa,GAAwB,IAAI,CAAC;AAC9C,IAAI,mBAAmB,GAAG,KAAK,CAAC;AAEhC,iFAAiF;AAEjF,MAAM,SAAS,GAA2B;IACxC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE;CAC1D,CAAC;AAEF,MAAM,WAAW,GAA2B;IAC1C,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU;CACpE,CAAC;AAEF,iFAAiF;AAEjF,MAAM,gBAAgB,GAAG,mDAAmD,CAAC;AAE7E,MAAM,SAAS,GAA4B;IACzC,CAAC,sCAAsC,EAAE,eAAe,CAAC;IACzD,CAAC,2CAA2C,EAAE,eAAe,CAAC;IAC9D,CAAC,yCAAyC,EAAE,8BAA8B,CAAC;IAC3E,CAAC,+BAA+B,EAAE,qBAAqB,CAAC;IACxD,CAAC,mDAAmD,EAAE,oBAAoB,CAAC;IAC3E,CAAC,sCAAsC,EAAE,eAAe,CAAC;CAC1D,CAAC;AAEF,SAAS,MAAM,CAAC,GAAW;IACzB,IAAI,CAAC;QACH,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,SAAS,EAAE,CAAC;YAC/C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;IAC9C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAkBD,iFAAiF;AAEjF,MAAa,MAAM;IACY;IAA7B,YAA6B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAE7C,KAAK,CAAC,GAAW,EAAE,MAAgC,IAAU,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3F,IAAI,CAAC,GAAW,EAAE,MAAgC,IAAU,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1F,OAAO,CAAC,GAAW,EAAE,MAAgC,IAAU,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7F,IAAI,CAAC,GAAW,EAAE,MAAgC,IAAU,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1F,KAAK,CAAC,GAAW,EAAE,MAAgC,IAAU,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3F,QAAQ,CAAC,GAAW,EAAE,MAAgC,IAAU,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAEtF,KAAK,CAAC,QAAgB,EAAE,OAAe,EAAE,MAAgC;QAC/E,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACnC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,KAAK,CAAC,CAAC,CAAE,MAAM,CAAC,OAAO,CAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1F,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACzD,MAAM,MAAM,GAAc,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACtH,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,IAAI,QAAQ,IAAI,CAAC,CAAC,KAAK;gBAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;CACF;AAnBD,wBAmBC;AAED,SAAS,aAAa,CAAC,MAA+B;IACpD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,KAAK,OAAO;YAAE,SAAS;QAC5B,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC;AAED,SAAgB,SAAS,CAAC,IAAY;IACpC,IAAI,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,iFAAiF;AAEjF,SAAS,UAAU,CAAC,MAAiB;IACnC,MAAM,GAAG,GAA4B;QACnC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE;QAC3B,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC9D,MAAM,EAAE,MAAM,CAAC,UAAU;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;IACF,IAAI,MAAM,CAAC,KAAK;QAAE,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;IAC1E,IAAI,MAAM,CAAC,KAAK;QAAE,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;IAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,aAAa,CAAC,MAAiB,EAAE,cAAuB;IAC/D,qEAAqE;IACrE,6EAA6E;IAC7E,IAAI,IAAY,CAAC;IACjB,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QAC1B,IAAI,GAAG,SAAS,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;IACzD,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QACjC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;IACzF,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClF,IAAI,IAAI,MAAM,KAAK,GAAG,CAAC;IACzB,CAAC;IACD,IAAI,cAAc,IAAI,MAAM,CAAC,KAAK;QAAE,IAAI,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAC9F,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iFAAiF;AAEjF;;;;;;;GAOG;AACH,MAAM,aAAa;IACW;IAAgC;IAA5D,YAA4B,KAAa,EAAmB,cAAuB;QAAvD,UAAK,GAAL,KAAK,CAAQ;QAAmB,mBAAc,GAAd,cAAc,CAAS;IAAG,CAAC;IAEvF,IAAI,CAAC,MAAiB;QACpB,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE;YAAE,OAAO,CAAC,6BAA6B;QAChE,IAAI,MAAM,CAAC,UAAU,KAAK,kBAAkB;YAAE,OAAO;QACrD,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,aAAa;IAGY;IAFpB,KAAK,GAAG,EAAE,CAAC,CAAC,UAAU;IAE/B,YAA6B,cAAuB;QAAvB,mBAAc,GAAd,cAAc,CAAS;IAAG,CAAC;IAExD,IAAI,CAAC,MAAiB;QACpB,IAAI,MAAM,CAAC,QAAQ,GAAG,EAAE;YAAE,OAAO;QACjC,IAAI,MAAM,CAAC,UAAU,KAAK,kBAAkB;YAAE,OAAO;QACrD,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;CACF;AAED,iFAAiF;AAEjF;;;GAGG;AACH,MAAM,iBAAiB;IACZ,KAAK,GAAG,EAAE,CAAC;IACX,MAAM,GAA2B;QACxC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;KACrD,CAAC;IAEF,IAAI,CAAC,MAAiB;QACpB,yCAAyC;QACzC,IAAI,MAAM,CAAC,UAAU,KAAK,kBAAkB;YAAE,OAAO;QACrD,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;CACF;AAED,iFAAiF;AAEjF,SAAS,QAAQ,CAAC,OAAe,EAAE,IAAY;IAC7C,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACf,IAAI,CAAC;gBAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,OAAO,IAAI,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,uBAAuB;IAER;IACA;IACA;IACR;IAJX,YACmB,OAAe,EACf,QAAgB,EAChB,IAAY,EACpB,KAAa;QAHL,YAAO,GAAP,OAAO,CAAQ;QACf,aAAQ,GAAR,QAAQ,CAAQ;QAChB,SAAI,GAAJ,IAAI,CAAQ;QACpB,UAAK,GAAL,KAAK,CAAQ;IACrB,CAAC;IAEJ,IAAI,CAAC,MAAiB;QACpB,IAAI,CAAC;YACH,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ;gBAAE,OAAO;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,yBAAyB;QACnC,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;CACF;AAED,SAAS,cAAc,CAAC,CAAO,EAAE,IAAqC;IACpE,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3E,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACjC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACnF,OAAO,GAAG,GAAG,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACnH,CAAC;AAED,MAAM,wBAAwB;IAET;IACA;IACA;IACR;IAJX,YACmB,OAAe,EACf,IAAqC,EACrC,IAAY,EACpB,KAAa;QAHL,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAiC;QACrC,SAAI,GAAJ,IAAI,CAAQ;QACpB,UAAK,GAAL,KAAK,CAAQ;IACrB,CAAC;IAEJ,IAAI,CAAC,MAAiB;QACpB,IAAI,CAAC;YACH,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,IAAI,UAAkB,CAAC;QACvB,IAAI,CAAC;YACH,UAAU,GAAG,cAAc,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,yBAAyB;QACnC,CAAC;QACD,IAAI,UAAU,KAAK,cAAc,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO;QACjE,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;CACF;AAED,iFAAiF;AAEjF,MAAM,OAAO,GAAG,iCAAiC,CAAC;AAClD,MAAM,SAAS,GAA2B,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;AACrF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE5D,SAAS,eAAe,CAAC,OAAe,EAAE,MAAc,EAAE,IAAY,EAAE,KAAa;IACnF,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC9F,OAAO,IAAI,uBAAuB,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,wBAAwB,CAAC,OAAO,EAAE,IAAuC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACrG,CAAC;IACD,MAAM,IAAI,KAAK,CACb,8BAA8B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,oBAAoB;QACxE,oEAAoE,CACrE,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAClD,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;gBAAE,OAAO,GAAG,CAAC;QAChE,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC,CAAC,sBAAsB;QACvD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,aAAa,CAAC,UAAkB;IACvC,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAC9D,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC7C,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5B,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;IACjD,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,gFAAgF;AAEhF,SAAS,WAAW;IAClB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC;QACvE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC;IACnG,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAmB,EAAE,UAAkB,EAAE,QAAgB;IAClF,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;IACpC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;IAC9H,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAChC,MAAM,OAAO,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU;QAC/B,CAAC,CAAC,YAAY,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,UAAU,SAAS;QACvD,CAAC,CAAC,YAAY,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,KAAK,CAAC,SAAS,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,OAAO,YAAY,QAAQ,cAAc,IAAI,YAAY,QAAQ,GAAG,OAAO,MAAM,KAAK,YAAY,QAAQ,WAAW,OAAO,KAAK,MAAM,SAAS,OAAO,IAAI,QAAQ,EAAE,CAAC;IACxK,CAAC;IACD,OAAO,YAAY,QAAQ,iBAAiB,IAAI,OAAO,KAAK,YAAY,QAAQ,WAAW,OAAO,KAAK,MAAM,SAAS,OAAO,IAAI,QAAQ,EAAE,CAAC;AAC9I,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc;IAC5B,MAAM,KAAK,GAAG,aAAa,CAAC;IAC5B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO;IAC5C,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IAErB,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,QAAU,CAAC,CAAC;IAChF,iEAAiE;IACjE,sDAAsD;IACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnF,IAAI,CAAC;QACH,SAAS,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE;YAClD,KAAK,EAAE,aAAa;YACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,YAAY,EAAE,KAAK,CAAC,WAAW;YAC/B,WAAW,EAAE,UAAU;YACvB,SAAS,EAAE,QAAQ;YACnB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE;YACnC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI;SACtC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB;IACvB,IAAI,mBAAmB;QAAE,OAAO;IAChC,mBAAmB,GAAG,IAAI,CAAC;IAE3B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QAC1B,IAAI,aAAa,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAC5C,oEAAoE;YACpE,kEAAkE;YAClE,IAAI,IAAI,KAAK,CAAC,IAAI,aAAa,CAAC,QAAQ,KAAK,CAAC;gBAAE,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC;YAC9E,cAAc,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,wEAAwE;IACxE,yEAAyE;IACzE,+DAA+D;IAC/D,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,SAAS;QAAE,OAAO;IAExD,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAU,EAAE,EAAE;QAC7C,IAAI,aAAa,EAAE,CAAC;YAClB,aAAa,CAAC,SAAS,GAAG;gBACxB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,OAAO;gBACzB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC;gBACnC,SAAS,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;aAC3B,CAAC;YACF,aAAa,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC7B,CAAC;QACD,uEAAuE;QACvE,iDAAiD;QACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAe,EAAE,EAAE;QACnD,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACzE,aAAa,CAAC,SAAS,GAAG;gBACxB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,OAAO;gBACzB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC;gBACtC,SAAS,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;aAC3B,CAAC;YACF,aAAa,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9H,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAeD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,SAAgB,gBAAgB,CAAC,IAA6B;IAC5D,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,WAAW;QAAE,OAAO;IAExC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;IAClC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAE7D,SAAS,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAChD,SAAS,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,MAAM,CAAC,CAAC;IAC9D,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IAEtF,uEAAuE;IACvE,yEAAyE;IACzE,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACxC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAExB,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC1E,MAAM,cAAc,GAClB,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,KAAK;QAC7B,CAAC,IAAI,CAAC,SAAS;QACf,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,cAAc,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAEhH,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,WAAW,EAAE,CAAC;QACzC,aAAa,GAAG;YACd,OAAO;YACP,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE;YAC9B,QAAQ,EAAE,IAAI,CAAC,YAAY;YAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK;YAC1B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YACnC,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,KAAK;YACd,IAAI;YACJ,UAAU;SACX,CAAC;QACF,gBAAgB,EAAE,CAAC;IACrB,CAAC;IAED,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,iFAAiF;AAEjF,SAAgB,aAAa;IAC3B,WAAW,GAAG,KAAK,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACrB,aAAa,GAAG,IAAI,CAAC;IACrB,uEAAuE;IACvE,uEAAuE;AACzE,CAAC"}
1
+ {"version":3,"file":"logging_setup.js","sourceRoot":"","sources":["../src/logging_setup.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "runspec-node",
3
- "version": "0.19.0",
3
+ "version": "0.21.0",
4
4
  "description": "Node/TypeScript language pack for runspec",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/index.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { parse, loadSpec } from './parser';
2
2
  export { registerType, listTypes } from './types';
3
+ export { tsTypeOf } from './inference';
3
4
  export { RunSpecError, MissingRequiredArg, InvalidChoice, OutOfRange, UnknownArg, GroupViolation, AutonomyViolation } from './errors';
4
5
  export { findConfig } from './finder';
5
6
  export { loadRaw } from './loader';
package/src/inference.ts CHANGED
@@ -4,6 +4,31 @@ import { RunSpecError } from './errors';
4
4
  export const AUTONOMY_LEVELS = ['autonomous', 'confirm', 'supervised', 'manual'] as const;
5
5
  export const AUTONOMY_RANK = Object.fromEntries(AUTONOMY_LEVELS.map((l, i) => [l, i]));
6
6
 
7
+ // Item-type name → its TypeScript type. Mirrors the JSON-Schema type map used
8
+ // by emit; custom (register_type) names fall back to `unknown`.
9
+ const TS_TYPE_NAMES: Record<string, string> = {
10
+ str: 'string',
11
+ int: 'number',
12
+ float: 'number',
13
+ bool: 'boolean',
14
+ flag: 'boolean',
15
+ path: 'string',
16
+ choice: 'string',
17
+ rest: 'string[]',
18
+ };
19
+
20
+ /** The TypeScript type of an arg's parsed value: the item type, suffixed `[]`
21
+ * when the arg is `multiple` (`rest` is always `string[]`). `arg.type` itself
22
+ * stays the item type — it drives per-item coercion. Pure helper, computed on
23
+ * demand from a (typically inferred) ArgSpec; custom registered types fall
24
+ * back to `"unknown"`. e.g. `tsTypeOf({type:"str", multiple:true})` → `"string[]"`. */
25
+ export function tsTypeOf(arg: ArgSpec): string {
26
+ const type = arg.type ?? 'str';
27
+ if (type === 'rest') return 'string[]';
28
+ const base = TS_TYPE_NAMES[type] ?? 'unknown';
29
+ return arg.multiple ? `${base}[]` : base;
30
+ }
31
+
7
32
  export function inferArg(raw: ArgSpec): ArgSpec {
8
33
  const result = { ...raw };
9
34
  const def = result.default;
@@ -16,6 +16,16 @@ const _loggers = new Map<string, Logger>();
16
16
  const _handlers: Handler[] = [];
17
17
 
18
18
  const RUN_SUMMARY_LOGGER = 'runspec.runsummary';
19
+ // Uncaught exceptions are emitted on this dedicated logger so the file handler
20
+ // records them while the console handlers drop them by name — console display is
21
+ // handled explicitly in _handleUncaught (debug-gated).
22
+ const EXCEPTION_LOGGER = 'runspec.exception';
23
+
24
+ // Directory of the installed runspec-node package — used to filter internal
25
+ // library frames out of the *displayed* compact trace (full trace still hits the file).
26
+ const RUNSPEC_PKG_DIR = __dirname;
27
+
28
+ let _debug = false; // mirrors the --debug flag; read by _handleUncaught for console rendering
19
29
 
20
30
  interface CapturedException {
21
31
  type: string;
@@ -23,6 +33,20 @@ interface CapturedException {
23
33
  traceback: string;
24
34
  }
25
35
 
36
+ interface ExcFrame {
37
+ func: string;
38
+ file: string;
39
+ line: number | null;
40
+ code: string | null;
41
+ }
42
+
43
+ interface ExcStructured {
44
+ type: string;
45
+ message: string;
46
+ module: string | null;
47
+ frames: ExcFrame[];
48
+ }
49
+
26
50
  interface SummaryState {
27
51
  counter: RunSummaryCounter;
28
52
  start: bigint;
@@ -83,6 +107,7 @@ interface LogRecord {
83
107
  message: string;
84
108
  error?: Error;
85
109
  extra?: Record<string, unknown>;
110
+ excStructured?: Record<string, unknown>;
86
111
  }
87
112
 
88
113
  interface Handler {
@@ -145,6 +170,7 @@ function formatJson(record: LogRecord): string {
145
170
  message: record.message,
146
171
  };
147
172
  if (record.error) obj['exc'] = record.error.stack ?? record.error.message;
173
+ if (record.excStructured) obj['exc_structured'] = record.excStructured;
148
174
  if (record.extra) obj['extra'] = record.extra;
149
175
  return JSON.stringify(obj);
150
176
  }
@@ -183,7 +209,7 @@ class StdoutHandler implements Handler {
183
209
 
184
210
  emit(record: LogRecord): void {
185
211
  if (record.levelNum >= 30) return; // WARNING+ belongs on stderr
186
- if (record.loggerName === RUN_SUMMARY_LOGGER) return;
212
+ if (record.loggerName === RUN_SUMMARY_LOGGER || record.loggerName === EXCEPTION_LOGGER) return;
187
213
  try {
188
214
  process.stdout.write(formatConsole(record, this.showTracebacks) + '\n');
189
215
  } catch {
@@ -204,7 +230,7 @@ class StderrHandler implements Handler {
204
230
 
205
231
  emit(record: LogRecord): void {
206
232
  if (record.levelNum < 30) return;
207
- if (record.loggerName === RUN_SUMMARY_LOGGER) return;
233
+ if (record.loggerName === RUN_SUMMARY_LOGGER || record.loggerName === EXCEPTION_LOGGER) return;
208
234
  try {
209
235
  process.stderr.write(formatConsole(record, this.showTracebacks) + '\n');
210
236
  } catch {
@@ -226,8 +252,8 @@ class RunSummaryCounter implements Handler {
226
252
  };
227
253
 
228
254
  emit(record: LogRecord): void {
229
- // Don't count the summary record itself.
230
- if (record.loggerName === RUN_SUMMARY_LOGGER) return;
255
+ // Don't count runspec's own bookkeeping records (summary + uncaught-exception).
256
+ if (record.loggerName === RUN_SUMMARY_LOGGER || record.loggerName === EXCEPTION_LOGGER) return;
231
257
  const label = LEVEL_LABEL[record.levelNum];
232
258
  if (label && label in this.counts) {
233
259
  this.counts[label]++;
@@ -462,6 +488,99 @@ export function emitRunSummary(): void {
462
488
  }
463
489
  }
464
490
 
491
+ // ── uncaught exceptions ────────────────────────────────────────────────────────
492
+
493
+ const STACK_FRAME_RE = /^\s*at (?:(.+?) \()?(.+?):(\d+):(\d+)\)?$/;
494
+
495
+ /**
496
+ * Parse a V8 stack string into frames, innermost LAST (mirroring Python's
497
+ * traceback.extract_tb order). `code` is unavailable from a stack string.
498
+ */
499
+ function parseStackFrames(stack: string): ExcFrame[] {
500
+ const frames: ExcFrame[] = [];
501
+ for (const lineStr of stack.split('\n')) {
502
+ const m = STACK_FRAME_RE.exec(lineStr);
503
+ if (!m) continue;
504
+ frames.push({ func: m[1] ?? '<anonymous>', file: m[2], line: parseInt(m[3], 10), code: null });
505
+ }
506
+ frames.reverse();
507
+ return frames;
508
+ }
509
+
510
+ /** Clean, machine-readable form of an error for the JSON audit / UI tables. */
511
+ function buildExcStructured(err: Error): ExcStructured {
512
+ const frames = parseStackFrames(err.stack ?? '');
513
+ const last = frames.length ? frames[frames.length - 1] : null;
514
+ const module = last ? path.basename(last.file).replace(/\.[^.]+$/, '') : null;
515
+ return { type: err.name || 'Error', message: err.message || String(err), module, frames };
516
+ }
517
+
518
+ /**
519
+ * Neat, aligned, stdlib-only trace for --debug console output. Internal
520
+ * runspec frames are dropped from the *display* (full trace still hits the
521
+ * file). Falls back to the full list if filtering empties it.
522
+ */
523
+ function formatCompactTrace(err: Error, frames: ExcFrame[]): string {
524
+ const shown = frames.filter((f) => !f.file.includes(RUNSPEC_PKG_DIR));
525
+ const use = shown.length ? shown : frames;
526
+ const locs = use.map((f) => `${path.basename(f.file)}:${f.line}`);
527
+ const width = Math.max(0, ...locs.map((l) => l.length));
528
+ const lines = [`${err.name || 'Error'}: ${err.message}`, ''];
529
+ use.forEach((f, i) => {
530
+ lines.push(` ${locs[i].padEnd(width)} ${f.func}`.trimEnd());
531
+ });
532
+ return lines.join('\n');
533
+ }
534
+
535
+ /** Emit the structured exception record straight to the handlers (file keeps it). */
536
+ function emitExceptionRecord(err: Error, structured: ExcStructured): void {
537
+ if (_handlers.length === 0) return;
538
+ const record: LogRecord = {
539
+ ts: new Date(),
540
+ levelNum: 50,
541
+ loggerName: EXCEPTION_LOGGER,
542
+ message: 'uncaught exception',
543
+ error: err,
544
+ excStructured: structured as unknown as Record<string, unknown>,
545
+ };
546
+ for (const h of _handlers) {
547
+ try {
548
+ if (record.levelNum >= h.level) h.emit(record);
549
+ } catch {
550
+ // never disrupt
551
+ }
552
+ }
553
+ }
554
+
555
+ /**
556
+ * Uniform handling for an uncaught error: always write a structured record to
557
+ * the audit file, feed the run summary (when on), and show a neat compact
558
+ * trace on the console only with --debug (otherwise a single concise line).
559
+ * Exported for tests so they can exercise it without triggering process.exit.
560
+ */
561
+ export function _handleUncaught(err: Error): void {
562
+ const structured = buildExcStructured(err);
563
+
564
+ // Always to the audit file (independent of --debug and of the summary toggle).
565
+ emitExceptionRecord(err, structured);
566
+
567
+ if (_summaryState) {
568
+ _summaryState.exception = { type: structured.type, message: structured.message, traceback: err.stack ?? '' };
569
+ _summaryState.exitCode = 1;
570
+ }
571
+
572
+ // Console: full compact trace only with --debug, else a one-liner.
573
+ try {
574
+ if (_debug) {
575
+ process.stderr.write(formatCompactTrace(err, structured.frames) + '\n');
576
+ } else {
577
+ process.stderr.write(`ERROR: ${structured.type}: ${structured.message} (run with --debug for traceback)\n`);
578
+ }
579
+ } catch {
580
+ process.stderr.write((err.stack ?? String(err)) + '\n'); // safety fallback
581
+ }
582
+ }
583
+
465
584
  function installExitHooks(): void {
466
585
  if (_exitHooksInstalled) return;
467
586
  _exitHooksInstalled = true;
@@ -469,43 +588,25 @@ function installExitHooks(): void {
469
588
  process.on('exit', (code) => {
470
589
  if (_summaryState && !_summaryState.emitted) {
471
590
  // process.exitCode wins over the explicit exception capture only if
472
- // it's non-zero — uncaughtException already set state.exitCode=1.
591
+ // it's non-zero — _handleUncaught already set state.exitCode=1.
473
592
  if (code !== 0 && _summaryState.exitCode === 0) _summaryState.exitCode = code;
474
593
  emitRunSummary();
475
594
  }
476
595
  });
477
596
 
478
597
  // Skip the crash-handlers under jest — they call process.exit(1), which
479
- // would tear down the test runner if any test ever produced an unhandled
480
- // rejection. The 'exit' hook above is harmless and still runs.
598
+ // would tear down the test runner. _handleUncaught is unit-tested directly.
599
+ // The 'exit' hook above is harmless and still runs.
481
600
  if (process.env['JEST_WORKER_ID'] !== undefined) return;
482
601
 
483
602
  process.on('uncaughtException', (err: Error) => {
484
- if (_summaryState) {
485
- _summaryState.exception = {
486
- type: err.name || 'Error',
487
- message: err.message || String(err),
488
- traceback: err.stack ?? '',
489
- };
490
- _summaryState.exitCode = 1;
491
- }
492
- // Preserve default Node behaviour: print and exit non-zero. The 'exit'
493
- // hook above will fire and run emitRunSummary().
494
- process.stderr.write((err.stack ?? String(err)) + '\n');
603
+ _handleUncaught(err);
495
604
  process.exit(1);
496
605
  });
497
606
 
498
607
  process.on('unhandledRejection', (reason: unknown) => {
499
- if (_summaryState) {
500
- const err = reason instanceof Error ? reason : new Error(String(reason));
501
- _summaryState.exception = {
502
- type: err.name || 'Error',
503
- message: err.message || String(reason),
504
- traceback: err.stack ?? '',
505
- };
506
- _summaryState.exitCode = 1;
507
- }
508
- process.stderr.write(`Unhandled rejection: ${reason instanceof Error ? (reason.stack ?? reason.message) : String(reason)}\n`);
608
+ const err = reason instanceof Error ? reason : new Error(String(reason));
609
+ _handleUncaught(err);
509
610
  process.exit(1);
510
611
  });
511
612
  }
@@ -554,6 +655,7 @@ export function configureLogging(opts: ConfigureLoggingOptions): void {
554
655
  if (!opts.logCfg || _configured) return;
555
656
 
556
657
  const debug = opts.debug ?? false;
658
+ _debug = debug;
557
659
  const floor = debug ? LEVEL_NUM['debug'] : LEVEL_NUM['info'];
558
660
 
559
661
  _handlers.push(new StdoutHandler(floor, debug));
@@ -589,9 +691,13 @@ export function configureLogging(opts: ConfigureLoggingOptions): void {
589
691
  user,
590
692
  userTarget,
591
693
  };
592
- installExitHooks();
593
694
  }
594
695
 
696
+ // Uncaught-exception handling is always installed (independent of the summary
697
+ // toggle) so the structured exception record reaches the audit file even when
698
+ // summary is off. The exit hook only flushes a summary when _summaryState is set.
699
+ installExitHooks();
700
+
595
701
  _configured = true;
596
702
  }
597
703
 
@@ -599,6 +705,7 @@ export function configureLogging(opts: ConfigureLoggingOptions): void {
599
705
 
600
706
  export function _resetForTest(): void {
601
707
  _configured = false;
708
+ _debug = false;
602
709
  _loggers.clear();
603
710
  _handlers.length = 0;
604
711
  _summaryState = null;
@@ -606,4 +713,4 @@ export function _resetForTest(): void {
606
713
  // they no-op when _summaryState is null, which is the test-time state.
607
714
  }
608
715
 
609
- export { _periodForDate, RUN_SUMMARY_LOGGER };
716
+ export { _periodForDate, RUN_SUMMARY_LOGGER, EXCEPTION_LOGGER, buildExcStructured, formatCompactTrace };
@@ -30,3 +30,19 @@ slug = {type = "str", pattern = "[a-z]+-[0-9]+", min-length = 3, max-length = 10
30
30
  expect(slug['minLength']).toBe(3);
31
31
  expect(slug['maxLength']).toBe(10);
32
32
  });
33
+
34
+ test('multiple arg emits array with per-item constraints inside items', () => {
35
+ const schema = schemaFor(
36
+ `
37
+ [deploy]
38
+ [deploy.args]
39
+ ticket = {type = "str", multiple = true, pattern = "[A-Z]+-[0-9]+"}
40
+ `,
41
+ 'deploy',
42
+ );
43
+ const props = (schema['inputSchema'] as Record<string, Record<string, unknown>>)['properties'];
44
+ const ticket = (props as Record<string, Record<string, unknown>>)['ticket'];
45
+ expect(ticket['type']).toBe('array');
46
+ // The per-item constraint validates each element, so it belongs in items.
47
+ expect(ticket['items']).toEqual({ type: 'string', pattern: '[A-Z]+-[0-9]+' });
48
+ });
@@ -1,4 +1,4 @@
1
- import { inferArg, inferScript, effectiveAutonomy, isMoreRestrictive } from '../src/inference';
1
+ import { inferArg, inferScript, effectiveAutonomy, isMoreRestrictive, tsTypeOf } from '../src/inference';
2
2
  import { RunSpecError } from '../src/errors';
3
3
  import type { ArgSpec, ScriptSpec } from '../src/models';
4
4
 
@@ -151,3 +151,31 @@ test('manual is more restrictive than confirm', () => {
151
151
  test('autonomous is not more restrictive than confirm', () => {
152
152
  expect(isMoreRestrictive('autonomous', 'confirm')).toBe(false);
153
153
  });
154
+
155
+ // ── tsTypeOf (derived value type, computed on demand) ──────────────────────────
156
+
157
+ test('tsTypeOf: scalar types', () => {
158
+ expect(tsTypeOf(makeArg({ type: 'str' }))).toBe('string');
159
+ expect(tsTypeOf(makeArg({ type: 'int' }))).toBe('number');
160
+ expect(tsTypeOf(makeArg({ type: 'flag' }))).toBe('boolean');
161
+ expect(tsTypeOf(makeArg({ type: 'path' }))).toBe('string');
162
+ });
163
+
164
+ test('tsTypeOf: multiple suffixes []', () => {
165
+ expect(tsTypeOf(makeArg({ type: 'str', multiple: true }))).toBe('string[]');
166
+ expect(tsTypeOf(makeArg({ type: 'int', multiple: true }))).toBe('number[]');
167
+ });
168
+
169
+ test('tsTypeOf: rest is string[]', () => {
170
+ expect(tsTypeOf(makeArg({ type: 'rest' }))).toBe('string[]');
171
+ });
172
+
173
+ test('tsTypeOf: custom type falls back to unknown', () => {
174
+ expect(tsTypeOf(makeArg({ type: 'json-file', multiple: true }))).toBe('unknown[]');
175
+ });
176
+
177
+ test('tsTypeOf works on an inferred ArgSpec; type stays the item type', () => {
178
+ const arg = inferArg(makeArg({ type: 'str', multiple: true }));
179
+ expect(arg.type).toBe('str');
180
+ expect(tsTypeOf(arg)).toBe('string[]');
181
+ });
@@ -6,7 +6,11 @@ import {
6
6
  getLogger,
7
7
  emitRunSummary,
8
8
  _resetForTest,
9
+ _handleUncaught,
10
+ buildExcStructured,
11
+ formatCompactTrace,
9
12
  RUN_SUMMARY_LOGGER,
13
+ EXCEPTION_LOGGER,
10
14
  } from '../src/logging_setup';
11
15
 
12
16
  function tmpDir(): string {
@@ -260,3 +264,98 @@ test('sudo user_target written to audit record', () => {
260
264
  expect(summary.extra.user).toBe('alice');
261
265
  expect(summary.extra.user_target).toBe('root');
262
266
  });
267
+
268
+ // ── uncaught exceptions ────────────────────────────────────────────────────────
269
+
270
+ function readExcRecord(dir: string): Record<string, any> | undefined {
271
+ const content = fs.readFileSync(path.join(dir, 'logs', 'myscript.log'), 'utf-8');
272
+ return content.trim().split('\n').map(l => JSON.parse(l)).find(o => o.logger === EXCEPTION_LOGGER);
273
+ }
274
+
275
+ test('uncaught exception writes a structured record even with summary off', () => {
276
+ const dir = tmpDir();
277
+ configureLogging(makeCfg(dir, { summary: false }));
278
+ const cap = captureStderr();
279
+ _handleUncaught(new TypeError('invalid quality 200'));
280
+ cap.restore();
281
+ const rec = readExcRecord(dir);
282
+ expect(rec).toBeDefined();
283
+ expect(rec!.level).toBe('CRITICAL');
284
+ expect(rec!.exc_structured.type).toBe('TypeError');
285
+ expect(rec!.exc_structured.message).toBe('invalid quality 200');
286
+ expect(Array.isArray(rec!.exc_structured.frames)).toBe(true);
287
+ expect(rec!.exc).toBeDefined(); // full stack string also present
288
+ });
289
+
290
+ test('without --debug the console shows a one-liner, not a traceback', () => {
291
+ const dir = tmpDir();
292
+ configureLogging(makeCfg(dir, { debug: false }));
293
+ const cap = captureStderr();
294
+ _handleUncaught(new Error('boom'));
295
+ cap.restore();
296
+ const joined = cap.lines.join('');
297
+ expect(joined).toContain('ERROR: Error: boom');
298
+ expect(joined).toContain('run with --debug');
299
+ expect(joined).not.toContain('\n at '); // no raw V8 stack dump
300
+ expect(readExcRecord(dir)).toBeDefined();
301
+ });
302
+
303
+ test('with --debug the console shows a compact aligned trace', () => {
304
+ const dir = tmpDir();
305
+ configureLogging(makeCfg(dir, { debug: true }));
306
+ const cap = captureStderr();
307
+ _handleUncaught(new Error('boom'));
308
+ cap.restore();
309
+ const joined = cap.lines.join('');
310
+ expect(joined).toContain('Error: boom');
311
+ expect(joined).not.toContain('run with --debug'); // hint only in quiet mode
312
+ });
313
+
314
+ test('the exception record is not echoed to the console handlers', () => {
315
+ const dir = tmpDir();
316
+ const stdoutLines: string[] = [];
317
+ const stderrLines: string[] = [];
318
+ const o = jest.spyOn(process.stdout, 'write').mockImplementation((c) => { stdoutLines.push(String(c)); return true; });
319
+ const e = jest.spyOn(process.stderr, 'write').mockImplementation((c) => { stderrLines.push(String(c)); return true; });
320
+ configureLogging(makeCfg(dir, { debug: false }));
321
+ _handleUncaught(new Error('boom'));
322
+ o.mockRestore();
323
+ e.mockRestore();
324
+ // The structured JSON record is file-only; only our one-liner hits stderr.
325
+ expect(stdoutLines.join('')).not.toContain('uncaught exception');
326
+ expect(stderrLines.join('')).not.toContain('"logger":"runspec.exception"');
327
+ });
328
+
329
+ test('buildExcStructured parses frames innermost-last with module', () => {
330
+ const err = new Error('x');
331
+ err.stack = [
332
+ 'Error: x',
333
+ ' at inner (/app/deep.js:5:10)',
334
+ ' at outer (/app/main.js:20:3)',
335
+ ].join('\n');
336
+ const es = buildExcStructured(err);
337
+ expect(es.type).toBe('Error');
338
+ expect(es.frames.map(f => f.func)).toEqual(['outer', 'inner']); // innermost last
339
+ expect(es.module).toBe('deep');
340
+ expect(es.frames[0]).toEqual({ func: 'outer', file: '/app/main.js', line: 20, code: null });
341
+ });
342
+
343
+ test('formatCompactTrace drops internal runspec frames but keeps user frames', () => {
344
+ const err = new Error('x');
345
+ // RUNSPEC_PKG_DIR is the dir of the logging_setup module (the package source).
346
+ const pkgDir = path.resolve(__dirname, '..', 'src');
347
+ const frames = [
348
+ { func: 'parse', file: path.join(pkgDir, 'parser.ts'), line: 10, code: null },
349
+ { func: 'main', file: '/app/deploy.js', line: 42, code: null },
350
+ ];
351
+ const out = formatCompactTrace(err, frames);
352
+ expect(out).toContain('deploy.js:42');
353
+ expect(out).not.toContain('parser.ts:10');
354
+ });
355
+
356
+ test('formatCompactTrace falls back to full list when every frame is internal', () => {
357
+ const err = new Error('x');
358
+ const pkgDir = path.resolve(__dirname, '..', 'src');
359
+ const frames = [{ func: 'parse', file: path.join(pkgDir, 'parser.ts'), line: 10, code: null }];
360
+ expect(formatCompactTrace(err, frames)).toContain('parser.ts:10');
361
+ });