hacksh 0.16.0 → 0.18.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.
@@ -1,11 +1,17 @@
1
1
  import { inspect, stripVTControlCharacters, styleText } from "node:util";
2
2
  import { spawn } from "node:child_process";
3
3
  //#region src/errors.ts
4
- var HackshUsageError = class extends Error {
4
+ /** An expected CLI failure that runMain reports; application errors can extend this class. */
5
+ var HackshError = class extends Error {
6
+ constructor(message, options) {
7
+ super(message, options);
8
+ this.name = new.target.name;
9
+ }
10
+ };
11
+ var HackshUsageError = class extends HackshError {
5
12
  command;
6
13
  constructor(message, command, options) {
7
14
  super(message, options);
8
- this.name = "HackshUsageError";
9
15
  this.command = command;
10
16
  }
11
17
  };
@@ -13,27 +19,24 @@ var HackshValidationError = class extends HackshUsageError {
13
19
  issues;
14
20
  constructor(command, issues) {
15
21
  super(`Invalid arguments:\n${issues.map(({ arg, message }) => ` ${arg}: ${message}`).join("\n")}`, command);
16
- this.name = "HackshValidationError";
17
22
  this.issues = issues;
18
23
  }
19
24
  };
20
25
  /** An input request that could not be completed safely. */
21
- var HackshPromptError = class extends Error {
26
+ var HackshPromptError = class extends HackshError {
22
27
  reason;
23
28
  prompt;
24
29
  constructor(reason, prompt, message, options) {
25
30
  super(message, options);
26
- this.name = "HackshPromptError";
27
31
  this.reason = reason;
28
32
  this.prompt = prompt;
29
33
  }
30
34
  };
31
35
  /** An external command that did not succeed; `result` is not enumerable so error summaries omit child output. */
32
- var HackshExecError = class extends Error {
36
+ var HackshExecError = class extends HackshError {
33
37
  #result;
34
38
  constructor(message, result, options) {
35
39
  super(message, options);
36
- this.name = "HackshExecError";
37
40
  this.#result = result;
38
41
  }
39
42
  get result() {
@@ -41,12 +44,11 @@ var HackshExecError = class extends Error {
41
44
  }
42
45
  };
43
46
  /** A requested process exit status; `runMain` exits with it and reports only a non-empty message. */
44
- var HackshExitError = class extends Error {
47
+ var HackshExitError = class extends HackshError {
45
48
  exitCode;
46
49
  constructor(exitCode, message, options) {
47
50
  if (!Number.isInteger(exitCode) || exitCode < 0 || exitCode > 255) throw new TypeError("Exit code must be an integer from 0 to 255");
48
51
  super(message, options);
49
- this.name = "HackshExitError";
50
52
  this.exitCode = exitCode;
51
53
  }
52
54
  };
@@ -914,7 +916,7 @@ function eventLines(event) {
914
916
  case "prompt": {
915
917
  const { prompt } = event;
916
918
  if (prompt.status === "submitted") {
917
- const result = prompt.kind === "select" ? prompt.choices.find(({ value }) => value === prompt.value)?.label ?? prompt.value : prompt.kind === "confirm" ? prompt.value ? "Yes" : "No" : prompt.value;
919
+ const result = prompt.kind === "select" || prompt.kind === "autocomplete" ? prompt.choices.find(({ value }) => value === prompt.value)?.label ?? prompt.value : prompt.kind === "confirm" ? prompt.value ? "Yes" : "No" : prompt.value;
918
920
  return [`${prompt.message}: ${result}`];
919
921
  }
920
922
  const lines = [prompt.message];
@@ -935,37 +937,49 @@ function colorize(enabled, style, text) {
935
937
  return enabled ? styleText(style, text, { validateStream: false }) : text;
936
938
  }
937
939
  const graphemeSegmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
938
- const combiningMark = /\p{Mark}/u;
939
- const pictograph = /\p{Extended_Pictographic}/u;
940
+ const invisibleGrapheme = /^[\p{Mark}\p{Cf}]+$/u;
941
+ const combiningMark = /[\p{Mark}\p{Cf}]/u;
942
+ const emoji = /\p{Extended_Pictographic}|\p{Regional_Indicator}|\u20e3/u;
940
943
  function isWideCodePoint(codePoint) {
941
944
  return codePoint >= 4352 && (codePoint <= 4447 || codePoint === 9001 || codePoint === 9002 || codePoint >= 11904 && codePoint <= 42191 && codePoint !== 12351 || codePoint >= 44032 && codePoint <= 55203 || codePoint >= 63744 && codePoint <= 64255 || codePoint >= 65040 && codePoint <= 65049 || codePoint >= 65072 && codePoint <= 65135 || codePoint >= 65280 && codePoint <= 65376 || codePoint >= 65504 && codePoint <= 65510 || codePoint >= 131072 && codePoint <= 262141);
942
945
  }
943
- function displayWidth(text) {
944
- let width = 0;
946
+ function terminalPosition(text, columns) {
947
+ const width = Number.isInteger(columns) && columns !== void 0 && columns > 0 ? columns : void 0;
948
+ let row = 0;
949
+ let column = 0;
945
950
  for (const { segment } of graphemeSegmenter.segment(stripVTControlCharacters(text))) {
946
- if (segment === " ") {
947
- width += 8 - width % 8;
951
+ if (segment === "\n" || segment === "\r\n") {
952
+ row += 1;
953
+ column = 0;
948
954
  continue;
949
955
  }
950
- if (pictograph.test(segment) || Array.from(segment).some((value) => isWideCodePoint(value.codePointAt(0)))) {
951
- width += 2;
956
+ if (segment === "\r") {
957
+ column = 0;
952
958
  continue;
953
959
  }
954
- for (const value of segment) {
955
- const codePoint = value.codePointAt(0);
956
- if (codePoint < 32 || codePoint >= 127 && codePoint < 160) continue;
957
- if (codePoint === 8205 || codePoint >= 65024 && codePoint <= 65039) continue;
958
- if (!combiningMark.test(value)) width += 1;
960
+ if (invisibleGrapheme.test(segment)) continue;
961
+ let cells = 0;
962
+ if (segment === " ") cells = 8 - column % 8;
963
+ else if (emoji.test(segment) || isWideCodePoint(segment.codePointAt(0))) cells = 2;
964
+ else for (const value of segment) {
965
+ const point = value.codePointAt(0);
966
+ if (point < 32 || point >= 127 && point < 160) continue;
967
+ if (!combiningMark.test(value)) cells += 1;
959
968
  }
969
+ if (cells === 0) continue;
970
+ if (width && column + cells > width) {
971
+ row += 1;
972
+ column = 0;
973
+ }
974
+ column += width ? Math.min(cells, width) : cells;
960
975
  }
961
- return width;
976
+ return {
977
+ row,
978
+ column
979
+ };
962
980
  }
963
981
  function renderedRows(rendered, columns) {
964
- const width = Number.isInteger(columns) && columns !== void 0 && columns > 0 ? columns : void 0;
965
- return rendered.split("\n").reduce((rows, line) => {
966
- if (!width) return rows + 1;
967
- return rows + Math.max(1, Math.ceil(displayWidth(line) / width));
968
- }, 0);
982
+ return terminalPosition(rendered, columns).row + 1;
969
983
  }
970
984
  /** Create the fixed human-readable renderer used for pretty output. */
971
985
  function createPrettyPrinter(options) {
@@ -977,8 +991,26 @@ function createPrettyPrinter(options) {
977
991
  stderr: options.color
978
992
  } : options.color;
979
993
  let activePrompt;
994
+ function renderAutocomplete(prompt, color) {
995
+ const bar = colorize(color, "gray", symbols.bar);
996
+ const accent = (text) => colorize(color, "cyan", text);
997
+ const muted = (text) => colorize(color, "gray", text);
998
+ const input = prompt.phase === "input";
999
+ const lines = [
1000
+ `${accent(symbols.marks.prompt)} ${prompt.message}`,
1001
+ `${bar} ${input ? accent(">") : " "} ${prompt.query || muted(prompt.placeholder ?? "")} `,
1002
+ bar
1003
+ ];
1004
+ for (const choice of prompt.choices) lines.push(`${bar} ${choice.selected ? accent(">") : " "} ${choice.selected ? accent(choice.label) : choice.label}${choice.hint ? ` ${muted(`— ${choice.hint}`)}` : ""}`);
1005
+ if (prompt.choices.length === 0) lines.push(`${bar} ${muted("No matches. Keep typing or backspace.")}`);
1006
+ lines.push(bar);
1007
+ lines.push(`${bar} ${muted(input ? "INPUT · type to filter · ↓ select · Esc cancel" : "SELECT · ↑/↓ move · Enter choose · Esc edit")}`);
1008
+ if (prompt.error) lines.push(`${bar} ${prompt.error}`);
1009
+ return lines.join("\n");
1010
+ }
980
1011
  function render(event) {
981
1012
  const color = colors[eventStream(event)];
1013
+ if (event.type === "prompt" && event.prompt.kind === "autocomplete" && event.prompt.status !== "submitted") return renderAutocomplete(event.prompt, color);
982
1014
  const mark = eventMark(event);
983
1015
  const lines = eventLines(event);
984
1016
  const firstPrefix = colorize(color, markStyles[mark], symbols.marks[mark]);
@@ -986,29 +1018,64 @@ function createPrettyPrinter(options) {
986
1018
  return lines.map((line, index) => `${index === 0 ? firstPrefix : barPrefix}${line ? ` ${line}` : ""}`).join("\n");
987
1019
  }
988
1020
  function eraseActivePrompt() {
989
- return activePrompt ? "\x1B[1A\x1B[2K".repeat(activePrompt.lines) : "";
1021
+ if (!activePrompt) return "";
1022
+ if (activePrompt.cursor) return `\u001b[?25l${activePrompt.cursor.row > 0 ? `\u001b[${activePrompt.cursor.row}A` : ""}\r\u001b[0J`;
1023
+ return "\x1B[1A\x1B[2K".repeat(activePrompt.lines);
1024
+ }
1025
+ function drawActivePrompt() {
1026
+ if (!activePrompt) return "";
1027
+ const { rendered, lines, cursor } = activePrompt;
1028
+ if (!cursor) return `${rendered}\n`;
1029
+ const up = lines - cursor.row;
1030
+ return `${rendered}\n${up > 0 ? `\u001b[${up}A` : ""}\u001b[${cursor.column + 1}G\u001b[?25${cursor.visible ? "h" : "l"}`;
1031
+ }
1032
+ function finishActivePrompt() {
1033
+ const restore = activePrompt?.cursor ? "\x1B[?25h" : "";
1034
+ activePrompt = void 0;
1035
+ return restore;
990
1036
  }
991
1037
  return { print(event) {
992
1038
  if (event.type === "output") {
993
1039
  const erase = eraseActivePrompt();
994
- stdout.write(`${erase}${outputText(event)}`);
995
- if (activePrompt) stdout.write(`${activePrompt.rendered}\n`);
1040
+ const text = outputText(event);
1041
+ stdout.write(`${erase}${text}`);
1042
+ if (activePrompt) {
1043
+ const separator = activePrompt.cursor && text && !text.endsWith("\n") ? "\n" : "";
1044
+ stdout.write(`${separator}${drawActivePrompt()}`);
1045
+ }
996
1046
  return;
997
1047
  }
998
1048
  const rendered = render(event);
999
1049
  if (event.type === "prompt") {
1000
1050
  const erase = eraseActivePrompt();
1001
1051
  if (event.prompt.status === "closed") {
1002
- activePrompt = void 0;
1003
- if (erase) stdout.write(erase);
1052
+ const restore = finishActivePrompt();
1053
+ if (erase || restore) stdout.write(`${erase}${restore}`);
1004
1054
  return;
1005
1055
  }
1006
- if (event.prompt.status === "submitted") activePrompt = void 0;
1007
- else activePrompt = {
1056
+ if (event.prompt.status === "submitted") {
1057
+ const restore = finishActivePrompt();
1058
+ stdout.write(`${erase}${restore}${rendered}\n`);
1059
+ return;
1060
+ }
1061
+ const restore = activePrompt?.cursor && event.prompt.kind !== "autocomplete" ? "\x1B[?25h" : "";
1062
+ activePrompt = {
1008
1063
  rendered,
1009
1064
  lines: renderedRows(rendered, stdout.columns)
1010
1065
  };
1011
- stdout.write(`${erase}${rendered}\n`);
1066
+ if (event.prompt.kind === "autocomplete") {
1067
+ const { prompt } = event;
1068
+ const cursor = terminalPosition(`${symbols.marks.prompt} ${prompt.message}\n${symbols.bar} > ${prompt.query}`, stdout.columns);
1069
+ if (cursor.column === stdout.columns) {
1070
+ cursor.row += 1;
1071
+ cursor.column = 0;
1072
+ }
1073
+ activePrompt.cursor = {
1074
+ ...cursor,
1075
+ visible: prompt.phase === "input"
1076
+ };
1077
+ }
1078
+ stdout.write(`${erase}${restore}${drawActivePrompt()}`);
1012
1079
  return;
1013
1080
  }
1014
1081
  const erase = eraseActivePrompt();
@@ -1016,13 +1083,13 @@ function createPrettyPrinter(options) {
1016
1083
  (eventStream(event) === "stdout" ? stdout : stderr).write(`${rendered}\n`);
1017
1084
  return;
1018
1085
  }
1019
- stdout.write(erase);
1020
- if (event.type === "error") activePrompt = void 0;
1086
+ const restore = event.type === "error" ? finishActivePrompt() : "";
1087
+ stdout.write(`${erase}${restore}`);
1021
1088
  (eventStream(event) === "stdout" ? stdout : stderr).write(`${rendered}\n`);
1022
- if (activePrompt) stdout.write(`${activePrompt.rendered}\n`);
1089
+ if (activePrompt) stdout.write(drawActivePrompt());
1023
1090
  } };
1024
1091
  }
1025
1092
  //#endregion
1026
- export { createExec as a, HackshPromptError as c, summarizeError as d, summarizeErrors as f, resolveOutputMode as i, HackshUsageError as l, createJsonPrinter as n, HackshExecError as o, createPrintQueue as r, HackshExitError as s, createPrettyPrinter as t, HackshValidationError as u };
1093
+ export { createExec as a, HackshExitError as c, HackshValidationError as d, summarizeError as f, resolveOutputMode as i, HackshPromptError as l, createJsonPrinter as n, HackshError as o, summarizeErrors as p, createPrintQueue as r, HackshExecError as s, createPrettyPrinter as t, HackshUsageError as u };
1027
1094
 
1028
- //# sourceMappingURL=pretty-DJ2CE6TU.js.map
1095
+ //# sourceMappingURL=pretty-BjzGnVLM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pretty-BjzGnVLM.js","names":["#result","safeString"],"sources":["../src/errors.ts","../src/exec.ts","../src/serialization.ts","../src/printer.ts","../src/pretty.ts"],"sourcesContent":["import type { $ZodIssue } from \"zod/v4/core\";\nimport type { AnyCommandDef } from \"./command.ts\";\nimport type { ExecFailure } from \"./exec.ts\";\n\nexport interface HackshIssue {\n arg: string;\n message: string;\n issue?: $ZodIssue;\n}\n\n/** An expected CLI failure that runMain reports; application errors can extend this class. */\nexport class HackshError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n }\n}\n\nexport class HackshUsageError extends HackshError {\n readonly command: AnyCommandDef;\n\n constructor(message: string, command: AnyCommandDef, options?: ErrorOptions) {\n super(message, options);\n this.command = command;\n }\n}\n\nexport class HackshValidationError extends HackshUsageError {\n readonly issues: ReadonlyArray<HackshIssue>;\n\n constructor(command: AnyCommandDef, issues: ReadonlyArray<HackshIssue>) {\n super(\n `Invalid arguments:\\n${issues.map(({ arg, message }) => ` ${arg}: ${message}`).join(\"\\n\")}`,\n command,\n );\n this.issues = issues;\n }\n}\n\nexport type PromptKind = \"select\" | \"autocomplete\" | \"confirm\" | \"text\";\n\nexport type HackshPromptErrorReason =\n | \"non-interactive\"\n | \"cancelled\"\n | \"aborted\"\n | \"eof\"\n | \"overlapping\"\n | \"invalid-options\"\n | \"input-error\"\n | \"printer-error\";\n\nexport interface PromptErrorDetails {\n kind: PromptKind;\n message: string;\n choices?: readonly string[];\n}\n\n/** An input request that could not be completed safely. */\nexport class HackshPromptError extends HackshError {\n readonly reason: HackshPromptErrorReason;\n readonly prompt: PromptErrorDetails;\n\n constructor(\n reason: HackshPromptErrorReason,\n prompt: PromptErrorDetails,\n message: string,\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.reason = reason;\n this.prompt = prompt;\n }\n}\n\n/** An external command that did not succeed; `result` is not enumerable so error summaries omit child output. */\nexport class HackshExecError extends HackshError {\n readonly #result: ExecFailure;\n\n constructor(message: string, result: ExecFailure, options?: ErrorOptions) {\n super(message, options);\n this.#result = result;\n }\n\n get result(): ExecFailure {\n return this.#result;\n }\n}\n\n/** A requested process exit status; `runMain` exits with it and reports only a non-empty message. */\nexport class HackshExitError extends HackshError {\n readonly exitCode: number;\n\n constructor(exitCode: number, message?: string, options?: ErrorOptions) {\n if (!Number.isInteger(exitCode) || exitCode < 0 || exitCode > 255) {\n throw new TypeError(\"Exit code must be an integer from 0 to 255\");\n }\n super(message, options);\n this.exitCode = exitCode;\n }\n}\n\nexport type HackshErrorKind = \"error\" | \"prompt\" | \"usage\" | \"validation\" | \"thrown\";\n\nexport interface ValidationIssueSummary {\n arg: string;\n message: string;\n code?: string;\n path?: readonly PropertyKey[];\n details?: Readonly<Record<string, unknown>>;\n}\n\nexport interface HackshErrorSummary {\n kind: HackshErrorKind;\n name: string;\n message: string;\n stack?: string;\n cause?: unknown;\n issues?: readonly ValidationIssueSummary[];\n properties?: Readonly<Record<string, unknown>>;\n value?: unknown;\n}\n\nfunction safeString(value: unknown, fallback: string): string {\n try {\n return String(value);\n } catch {\n return fallback;\n }\n}\n\nfunction readProperty(value: object, key: PropertyKey): unknown {\n try {\n return Reflect.get(value, key);\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction enumerableKeys(value: object): string[] {\n try {\n return Object.keys(value);\n } catch {\n return [];\n }\n}\n\nfunction hasToJSON(value: object): boolean {\n try {\n return typeof Reflect.get(value, \"toJSON\") === \"function\";\n } catch {\n return false;\n }\n}\n\nfunction isPlainObject(value: object): boolean {\n try {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n } catch {\n return false;\n }\n}\n\nfunction summarizeIssue(\n { arg, message, issue }: HackshIssue,\n seen: WeakMap<object, unknown>,\n): ValidationIssueSummary {\n if (!issue) return { arg, message };\n const details: Record<string, unknown> = {};\n for (const key of enumerableKeys(issue)) {\n if ([\"code\", \"path\", \"message\", \"inst\"].includes(key)) continue;\n details[key] = summarizeErrors(readProperty(issue, key), seen);\n }\n const code = readProperty(issue, \"code\");\n const path = readProperty(issue, \"path\");\n return {\n arg,\n message,\n ...(typeof code === \"string\" ? { code } : {}),\n ...(Array.isArray(path) ? { path } : {}),\n ...(Object.keys(details).length === 0 ? {} : { details }),\n };\n}\n\nfunction errorKind(error: Error): HackshErrorKind {\n if (error instanceof HackshPromptError) return \"prompt\";\n if (error instanceof HackshValidationError) return \"validation\";\n if (error instanceof HackshUsageError) return \"usage\";\n return \"error\";\n}\n\nfunction summarizeErrorWithSeen(error: Error, seen: WeakMap<object, unknown>): HackshErrorSummary {\n const summary: HackshErrorSummary = {\n kind: errorKind(error),\n name: safeString(readProperty(error, \"name\"), \"Error\"),\n message: safeString(readProperty(error, \"message\"), \"[Unserializable error message]\"),\n };\n seen.set(error, summary);\n\n const stack = readProperty(error, \"stack\");\n const cause = readProperty(error, \"cause\");\n if (typeof stack === \"string\") summary.stack = stack;\n if (cause !== undefined) summary.cause = summarizeErrors(cause, seen);\n if (error instanceof HackshValidationError) {\n summary.issues = error.issues.map((issue) => summarizeIssue(issue, seen));\n }\n\n const reserved = new Set([\"name\", \"message\", \"stack\", \"cause\", \"command\", \"issues\"]);\n const properties: Record<string, unknown> = {};\n for (const key of enumerableKeys(error)) {\n if (reserved.has(key)) continue;\n properties[key] = summarizeErrors(readProperty(error, key), seen);\n }\n if (Object.keys(properties).length > 0) summary.properties = properties;\n return summary;\n}\n\n/** Recursively replace Error values with command- and schema-free summaries. */\nexport function summarizeErrors(\n value: unknown,\n seen: WeakMap<object, unknown> = new WeakMap(),\n): unknown {\n if (typeof value !== \"object\" || value === null) return value;\n const existing = seen.get(value);\n if (existing !== undefined) return existing;\n if (value instanceof Error) return summarizeErrorWithSeen(value, seen);\n\n if (Array.isArray(value)) {\n const result: unknown[] = [];\n seen.set(value, result);\n let changed = false;\n for (const item of value) {\n const summarized = summarizeErrors(item, seen);\n result.push(summarized);\n changed ||= summarized !== item;\n }\n if (changed) return result;\n seen.set(value, value);\n return value;\n }\n if (value instanceof Map) {\n const result = new Map<unknown, unknown>();\n seen.set(value, result);\n let changed = false;\n for (const [key, item] of value) {\n const summarizedKey = summarizeErrors(key, seen);\n const summarizedItem = summarizeErrors(item, seen);\n result.set(summarizedKey, summarizedItem);\n changed ||= summarizedKey !== key || summarizedItem !== item;\n }\n if (changed) return result;\n seen.set(value, value);\n return value;\n }\n if (value instanceof Set) {\n const result = new Set<unknown>();\n seen.set(value, result);\n let changed = false;\n for (const item of value) {\n const summarized = summarizeErrors(item, seen);\n result.add(summarized);\n changed ||= summarized !== item;\n }\n if (changed) return result;\n seen.set(value, value);\n return value;\n }\n if (ArrayBuffer.isView(value) || hasToJSON(value) || !isPlainObject(value)) return value;\n\n const result: Record<string, unknown> = {};\n seen.set(value, result);\n let changed = false;\n for (const key of enumerableKeys(value)) {\n const original = readProperty(value, key);\n const summarized = summarizeErrors(original, seen);\n result[key] = summarized;\n changed ||= summarized !== original;\n }\n if (changed) return result;\n seen.set(value, value);\n return value;\n}\n\n/** Convert any thrown value into a canonical error description. */\nexport function summarizeError(error: unknown): HackshErrorSummary {\n if (error instanceof Error) return summarizeErrorWithSeen(error, new WeakMap());\n return {\n kind: \"thrown\",\n name: \"NonErrorThrown\",\n message: safeString(error, \"[Unserializable thrown value]\"),\n value: summarizeErrors(error),\n };\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport type { Readable } from \"node:stream\";\nimport { HackshExecError } from \"./errors.ts\";\nimport type { ExecPrintEvent, OutputFormat } from \"./printer.ts\";\nimport { TerminalLock } from \"./terminal.ts\";\n\ntype Environment = Readonly<Record<string, string | undefined>>;\n\nexport interface ExecOptions {\n cwd?: string;\n env?: Environment;\n input?: string;\n reject?: boolean;\n timeout?: number;\n signal?: AbortSignal;\n maxBuffer?: number;\n forceKillAfterDelay?: number;\n stdin?: \"pipe\" | \"inherit\";\n stdout?: \"pipe\" | \"inherit\";\n stderr?: \"pipe\" | \"inherit\";\n interactive?: boolean;\n display?: boolean;\n redact?: readonly string[];\n dryRun?: boolean;\n}\n\nexport interface ExecCommand {\n file: string;\n args: readonly string[];\n cwd: string | undefined;\n}\n\nexport interface ExecSuccess {\n status: \"succeeded\";\n command: ExecCommand;\n stdout: string;\n stderr: string;\n exitCode: 0;\n}\n\nexport type ExecFailure = {\n status: \"failed\";\n command: ExecCommand;\n stdout: string;\n stderr: string;\n} & (\n | { reason: \"exit-code\"; exitCode: number }\n | { reason: \"signal\"; signal: string }\n | { reason: \"spawn\"; error: Error }\n | { reason: \"timeout\" | \"aborted\" | \"output-limit\" }\n | { reason: \"json-output\" | \"non-interactive\" | \"overlapping\" }\n);\n\nexport type ExecFailureReason = ExecFailure[\"reason\"];\n\nexport type ExecResult = ExecSuccess | ExecFailure;\n\nexport interface ExecSkipped {\n status: \"skipped\";\n command: ExecCommand;\n}\n\ntype ExecOutcome<O extends ExecOptions> = \"reject\" extends keyof O\n ? false extends O[\"reject\"]\n ? ExecResult\n : ExecSuccess\n : ExecSuccess;\n\ntype SpecifiedDryRun<O> = \"dryRun\" extends keyof O ? O[\"dryRun\"] : false;\n\ntype ReturnsFailure<O extends ExecOptions> = \"reject\" extends keyof O\n ? false extends O[\"reject\"]\n ? true\n : false\n : false;\n\ntype AbortedFailure = {\n status: \"failed\";\n command: ExecCommand;\n stdout: string;\n stderr: string;\n reason: \"aborted\";\n};\n\ntype DefiniteSkip<O extends ExecOptions> =\n ReturnsFailure<O> extends true ? ExecSkipped | AbortedFailure : ExecSkipped;\n\nexport type ExecReturn<O extends ExecOptions> =\n true extends SpecifiedDryRun<O>\n ? false extends SpecifiedDryRun<O>\n ? ExecSkipped | ExecOutcome<O>\n : undefined extends SpecifiedDryRun<O>\n ? ExecSkipped | ExecOutcome<O>\n : DefiniteSkip<O>\n : ExecOutcome<O>;\n\ntype RejectInheritedInput<O> = O extends { input: string; stdin: \"inherit\" } ? never : unknown;\n\nexport type Exec = <const O extends ExecOptions = {}>(\n file: string,\n args?: readonly string[],\n options?: O & { [K in Exclude<keyof O, keyof ExecOptions>]: never } & RejectInheritedInput<O>,\n) => Promise<ExecReturn<O>>;\n\nexport interface ExecContext {\n env: Environment | undefined;\n mode: { format: OutputFormat; interactive: boolean };\n print(event: ExecPrintEvent): void | Promise<void>;\n terminal: TerminalLock;\n signal: AbortSignal;\n}\n\nconst OPTION_KEYS: ReadonlySet<string> = new Set([\n \"cwd\",\n \"env\",\n \"input\",\n \"reject\",\n \"timeout\",\n \"signal\",\n \"maxBuffer\",\n \"forceKillAfterDelay\",\n \"stdin\",\n \"stdout\",\n \"stderr\",\n \"interactive\",\n \"display\",\n \"redact\",\n \"dryRun\",\n] satisfies (keyof ExecOptions)[]);\n\ntype TerminationCause = \"timeout\" | \"aborted\" | \"output-limit\";\ntype StreamMode = \"pipe\" | \"inherit\";\ntype ExecStdio = ExecPrintEvent[\"stdio\"];\ntype RefusalReason = \"aborted\" | \"json-output\" | \"non-interactive\" | \"overlapping\";\n\ninterface SpawnError extends NodeJS.ErrnoException {\n spawnargs?: readonly string[];\n}\n\ninterface ExecPlan {\n command: ExecCommand;\n reported: ExecCommand;\n env: NodeJS.ProcessEnv | undefined;\n input: string | undefined;\n reject: boolean;\n timeout: number | undefined;\n signal: AbortSignal;\n maxBuffer: number;\n forceKillAfterDelay: number;\n stdin: StreamMode;\n stdout: StreamMode;\n stderr: StreamMode;\n interactive: boolean;\n display: boolean;\n redact: readonly string[];\n dryRun: boolean;\n}\n\ninterface Outcome {\n cause: TerminationCause | undefined;\n spawnError: Error | undefined;\n exit: { code: number | null; signal: string | null } | undefined;\n}\n\nconst MAX_DELAY = 2_147_483_647;\nconst REFUSAL_MESSAGE = {\n \"json-output\": \"Command cannot use the terminal in JSON output mode\",\n \"non-interactive\": \"Command requires an interactive terminal\",\n overlapping: \"Command cannot use the terminal while it is in use\",\n} as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction assertNoNul(value: string, label: string): void {\n if (value.includes(\"\\0\")) throw new TypeError(`${label} must not contain NUL characters`);\n}\n\nfunction readInteger(value: unknown, label: string, minimum: number, maximum: number): number {\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < minimum || value > maximum) {\n throw new TypeError(`${label} must be an integer from ${minimum} to ${maximum}`);\n }\n return value;\n}\n\nfunction readEnum<const T extends string>(value: unknown, label: string, allowed: readonly T[]): T {\n if (typeof value === \"string\" && (allowed as readonly string[]).includes(value))\n return value as T;\n throw new TypeError(\n `Exec option \\`${label}\\` must be ${allowed.map((item) => JSON.stringify(item)).join(\" or \")}`,\n );\n}\n\nfunction readBoolean(value: unknown, label: string): boolean {\n if (typeof value !== \"boolean\") throw new TypeError(`Exec option \\`${label}\\` must be a boolean`);\n return value;\n}\n\nfunction readRedact(value: unknown): readonly string[] {\n if (!Array.isArray(value)) throw new TypeError(\"Exec option `redact` must be an array\");\n for (const item of value) {\n if (typeof item !== \"string\" || item === \"\") {\n throw new TypeError(\"Exec option `redact` must contain only non-empty strings\");\n }\n assertNoNul(item, \"Exec option `redact`\");\n }\n return value as readonly string[];\n}\n\nfunction mergeEnvironment(\n base: Environment | undefined,\n overrides: unknown,\n): NodeJS.ProcessEnv | undefined {\n if (overrides === undefined && base === undefined) return undefined;\n if (overrides !== undefined && !isRecord(overrides)) {\n throw new TypeError(\"Exec option `env` must be an object\");\n }\n const merged: NodeJS.ProcessEnv = {};\n for (const [key, value] of Object.entries(base ?? process.env)) {\n if (value !== undefined) merged[key] = value;\n }\n for (const [key, value] of Object.entries(overrides ?? {})) {\n if (key === \"\" || key.includes(\"=\") || key.includes(\"\\0\")) {\n throw new TypeError(`Invalid environment variable name ${JSON.stringify(key)}`);\n }\n if (value === undefined) {\n delete merged[key];\n continue;\n }\n if (typeof value !== \"string\") {\n throw new TypeError(`Environment variable ${key} must be a string or undefined`);\n }\n assertNoNul(value, `Environment variable ${key}`);\n merged[key] = value;\n }\n return merged;\n}\n\nfunction redactValue(value: string, secrets: readonly string[]): string {\n let redacted = value;\n for (const secret of [...secrets].sort((left, right) => right.length - left.length)) {\n redacted = redacted.split(secret).join(\"***\");\n }\n return redacted;\n}\n\nfunction redactCommand(command: ExecCommand, secrets: readonly string[]): ExecCommand {\n if (secrets.length === 0) return command;\n return {\n file: redactValue(command.file, secrets),\n args: command.args.map((arg) => redactValue(arg, secrets)),\n cwd: command.cwd === undefined ? undefined : redactValue(command.cwd, secrets),\n };\n}\n\nfunction redactError(error: Error, secrets: readonly string[]): Error {\n const source = error as SpawnError;\n const redacted = new Error(redactValue(error.message, secrets)) as SpawnError;\n if (typeof error.stack === \"string\") redacted.stack = redactValue(error.stack, secrets);\n if (source.code !== undefined) redacted.code = source.code;\n if (source.errno !== undefined) redacted.errno = source.errno;\n if (typeof source.syscall === \"string\") redacted.syscall = redactValue(source.syscall, secrets);\n if (typeof source.path === \"string\") redacted.path = redactValue(source.path, secrets);\n if (Array.isArray(source.spawnargs)) {\n redacted.spawnargs = source.spawnargs.map((arg) =>\n typeof arg === \"string\" ? redactValue(arg, secrets) : arg,\n );\n }\n return redacted;\n}\n\nfunction observedError(plan: ExecPlan, error: Error): Error {\n return plan.redact.length === 0 ? error : redactError(error, plan.redact);\n}\n\nfunction parsePlan(file: unknown, args: unknown, options: unknown, context: ExecContext): ExecPlan {\n if (typeof file !== \"string\" || file === \"\") {\n throw new TypeError(\"Exec file must be a non-empty string\");\n }\n assertNoNul(file, \"Exec file\");\n const argv = args === undefined ? [] : args;\n if (!Array.isArray(argv) || !argv.every((arg) => typeof arg === \"string\")) {\n throw new TypeError(\"Exec args must be an array of strings\");\n }\n for (const arg of argv) assertNoNul(arg, \"Exec args\");\n const raw = options === undefined ? {} : options;\n if (!isRecord(raw)) throw new TypeError(\"Exec options must be an object\");\n for (const key of Object.keys(raw)) {\n if (!OPTION_KEYS.has(key)) throw new TypeError(`Unknown exec option \\`${key}\\``);\n }\n\n const { cwd, input, reject, timeout, signal, maxBuffer, forceKillAfterDelay } = raw;\n if (cwd !== undefined) {\n if (typeof cwd !== \"string\" || cwd === \"\") {\n throw new TypeError(\"Exec option `cwd` must be a non-empty string\");\n }\n assertNoNul(cwd, \"Exec option `cwd`\");\n }\n if (input !== undefined && typeof input !== \"string\") {\n throw new TypeError(\"Exec option `input` must be a string\");\n }\n if (reject !== undefined && typeof reject !== \"boolean\") {\n throw new TypeError(\"Exec option `reject` must be a boolean\");\n }\n if (signal !== undefined && !(signal instanceof AbortSignal)) {\n throw new TypeError(\"Exec option `signal` must be an AbortSignal\");\n }\n const stdin =\n raw.stdin === undefined ? \"pipe\" : readEnum(raw.stdin, \"stdin\", [\"pipe\", \"inherit\"]);\n const stdout =\n raw.stdout === undefined ? \"pipe\" : readEnum(raw.stdout, \"stdout\", [\"pipe\", \"inherit\"]);\n const stderr =\n raw.stderr === undefined ? \"pipe\" : readEnum(raw.stderr, \"stderr\", [\"pipe\", \"inherit\"]);\n if (input !== undefined && stdin === \"inherit\") {\n throw new TypeError(\"Exec option `input` cannot be combined with stdin inherit\");\n }\n const command = { file, args: [...argv], cwd };\n const redact = raw.redact === undefined ? [] : readRedact(raw.redact);\n return {\n command,\n reported: redactCommand(command, redact),\n env: mergeEnvironment(context.env, raw.env),\n input,\n reject: reject ?? true,\n timeout:\n timeout === undefined\n ? undefined\n : readInteger(timeout, \"Exec option `timeout`\", 1, MAX_DELAY),\n signal: signal === undefined ? context.signal : AbortSignal.any([context.signal, signal]),\n maxBuffer:\n maxBuffer === undefined\n ? 100_000_000\n : readInteger(maxBuffer, \"Exec option `maxBuffer`\", 1, Number.MAX_SAFE_INTEGER),\n forceKillAfterDelay:\n forceKillAfterDelay === undefined\n ? 5_000\n : readInteger(forceKillAfterDelay, \"Exec option `forceKillAfterDelay`\", 0, MAX_DELAY),\n stdin,\n stdout,\n stderr,\n interactive:\n raw.interactive === undefined ? false : readBoolean(raw.interactive, \"interactive\"),\n display: raw.display === undefined ? true : readBoolean(raw.display, \"display\"),\n redact,\n dryRun: raw.dryRun === undefined ? false : readBoolean(raw.dryRun, \"dryRun\"),\n };\n}\n\nfunction stripFinalNewline(text: string): string {\n if (text.endsWith(\"\\r\\n\")) return text.slice(0, -2);\n if (text.endsWith(\"\\n\")) return text.slice(0, -1);\n return text;\n}\n\nfunction collect(stream: Readable, limit: number, onLimit: () => void): () => string {\n const chunks: Buffer[] = [];\n let length = 0;\n let exceeded = false;\n stream.on(\"data\", (chunk: Buffer) => {\n if (exceeded) return;\n const remaining = limit - length;\n if (chunk.length <= remaining) {\n chunks.push(chunk);\n length += chunk.length;\n return;\n }\n chunks.push(chunk.subarray(0, remaining));\n length = limit;\n exceeded = true;\n onLimit();\n });\n return () => stripFinalNewline(Buffer.concat(chunks).toString(\"utf8\"));\n}\n\nfunction toResult(\n command: ExecCommand,\n outcome: Outcome,\n stdout: string,\n stderr: string,\n): ExecResult {\n const failed = { status: \"failed\", command, stdout, stderr } as const;\n if (outcome.cause) return { ...failed, reason: outcome.cause };\n if (outcome.spawnError) return { ...failed, reason: \"spawn\", error: outcome.spawnError };\n const { code, signal } = outcome.exit ?? { code: null, signal: null };\n if (signal !== null) return { ...failed, reason: \"signal\", signal };\n if (code !== 0) return { ...failed, reason: \"exit-code\", exitCode: code ?? 1 };\n return { status: \"succeeded\", command, stdout, stderr, exitCode: 0 };\n}\n\nfunction isSpawnErrno(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"syscall\" in error;\n}\n\nfunction execEvent(plan: ExecPlan, phase: \"start\" | \"skip\"): ExecPrintEvent {\n const { file, args, cwd } = plan.reported;\n return {\n type: \"exec\",\n phase,\n command: cwd === undefined ? { file, args } : { file, args, cwd },\n stdio: commandStdio(plan),\n interactive: plan.interactive,\n };\n}\n\nfunction commandStdio(plan: ExecPlan): ExecStdio {\n return {\n stdin: plan.stdin === \"inherit\" ? \"inherit\" : plan.input === undefined ? \"ignore\" : \"input\",\n stdout: plan.stdout,\n stderr: plan.stderr,\n };\n}\n\nfunction usesTerminal(plan: ExecPlan, stdio: ExecStdio): boolean {\n return (\n plan.interactive ||\n stdio.stdin === \"inherit\" ||\n stdio.stdout === \"inherit\" ||\n stdio.stderr === \"inherit\"\n );\n}\n\nfunction startChild(plan: ExecPlan): ChildProcess | Error {\n const stdio = commandStdio(plan);\n try {\n return spawn(plan.command.file, plan.command.args, {\n cwd: plan.command.cwd,\n env: plan.env,\n shell: false,\n windowsHide: true,\n stdio: [\n stdio.stdin === \"inherit\" ? \"inherit\" : stdio.stdin === \"input\" ? \"pipe\" : \"ignore\",\n stdio.stdout,\n stdio.stderr,\n ],\n });\n } catch (error) {\n if (isSpawnErrno(error)) return error;\n throw error;\n }\n}\n\nfunction runPlan(plan: ExecPlan): Promise<ExecResult> {\n const outcome: Outcome = { cause: undefined, spawnError: undefined, exit: undefined };\n if (plan.signal.aborted) {\n outcome.cause = \"aborted\";\n return Promise.resolve(toResult(plan.reported, outcome, \"\", \"\"));\n }\n const child = startChild(plan);\n if (child instanceof Error) {\n outcome.spawnError = observedError(plan, child);\n return Promise.resolve(toResult(plan.reported, outcome, \"\", \"\"));\n }\n\n return new Promise((resolve) => {\n const stdout = child.stdout;\n const stderr = child.stderr;\n let settled = false;\n let killTimer: NodeJS.Timeout | undefined;\n\n const settle = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timeoutTimer);\n clearTimeout(killTimer);\n plan.signal.removeEventListener(\"abort\", onAbort);\n resolve(toResult(plan.reported, outcome, readStdout(), readStderr()));\n };\n const release = () => {\n stdout?.destroy();\n stderr?.destroy();\n settle();\n };\n const terminate = (cause: TerminationCause) => {\n if (settled || outcome.cause) return;\n outcome.cause = cause;\n if (outcome.exit) {\n release();\n return;\n }\n child.kill(\"SIGTERM\");\n killTimer = setTimeout(() => child.kill(\"SIGKILL\"), plan.forceKillAfterDelay);\n };\n const onAbort = () => terminate(\"aborted\");\n\n const readStdout = stdout\n ? collect(stdout, plan.maxBuffer, () => terminate(\"output-limit\"))\n : () => \"\";\n const readStderr = stderr\n ? collect(stderr, plan.maxBuffer, () => terminate(\"output-limit\"))\n : () => \"\";\n const timeoutTimer =\n plan.timeout === undefined ? undefined : setTimeout(() => terminate(\"timeout\"), plan.timeout);\n plan.signal.addEventListener(\"abort\", onAbort, { once: true });\n\n child.on(\"error\", (error) => {\n if (child.pid !== undefined) return;\n outcome.spawnError = observedError(plan, error);\n release();\n });\n child.on(\"exit\", (code, signal) => {\n outcome.exit = { code, signal };\n clearTimeout(killTimer);\n // A grandchild may keep the pipes open after hacksh terminates the direct child.\n if (outcome.cause) release();\n });\n child.on(\"close\", settle);\n\n if (child.stdin) {\n child.stdin.on(\"error\", () => undefined);\n child.stdin.end(plan.input);\n }\n });\n}\n\nfunction formatArgument(value: string): string {\n return value === \"\" || /[\\s\"'\\\\$`;|&<>*?()[\\]{}~#!]/.test(value) ? JSON.stringify(value) : value;\n}\n\nexport function formatExecCommand(command: Pick<ExecCommand, \"file\" | \"args\">): string {\n return [command.file, ...command.args].map(formatArgument).join(\" \");\n}\n\nfunction failureMessage(plan: ExecPlan, result: ExecFailure): string {\n const display = formatExecCommand(plan.reported);\n switch (result.reason) {\n case \"exit-code\":\n return `Command failed with exit code ${result.exitCode}: ${display}`;\n case \"signal\":\n return `Command was terminated by ${result.signal}: ${display}`;\n case \"spawn\": {\n const code = (result.error as NodeJS.ErrnoException).code;\n return `Command could not be started (${code ?? result.error.message}): ${display}`;\n }\n case \"timeout\":\n return `Command timed out after ${plan.timeout} ms: ${display}`;\n case \"aborted\":\n return `Command was aborted: ${display}`;\n case \"output-limit\":\n return `Command output exceeded ${plan.maxBuffer} bytes: ${display}`;\n case \"json-output\":\n case \"non-interactive\":\n case \"overlapping\":\n return `${REFUSAL_MESSAGE[result.reason]}: ${display}`;\n }\n}\n\nfunction emptyFailure(plan: ExecPlan, reason: RefusalReason): ExecFailure {\n return { status: \"failed\", command: plan.reported, stdout: \"\", stderr: \"\", reason };\n}\n\nfunction complete(plan: ExecPlan, result: ExecResult): ExecResult {\n if (result.status === \"failed\" && plan.reject) {\n throw new HackshExecError(\n failureMessage(plan, result),\n result,\n result.reason === \"spawn\" ? { cause: result.error } : undefined,\n );\n }\n return result;\n}\n\nfunction blockedReason(\n plan: ExecPlan,\n context: ExecContext,\n stdio: ExecStdio,\n): \"json-output\" | \"non-interactive\" | undefined {\n const inherited =\n stdio.stdin === \"inherit\" || stdio.stdout === \"inherit\" || stdio.stderr === \"inherit\";\n if (context.mode.format === \"json\" && inherited) return \"json-output\";\n if (plan.interactive && !context.mode.interactive) return \"non-interactive\";\n return undefined;\n}\n\nasync function execute(\n file: unknown,\n args: unknown,\n options: unknown,\n context: ExecContext,\n): Promise<ExecResult | ExecSkipped> {\n const plan = parsePlan(file, args, options, context);\n if (plan.signal.aborted) return complete(plan, emptyFailure(plan, \"aborted\"));\n if (plan.dryRun) {\n if (plan.display) await context.print(execEvent(plan, \"skip\"));\n return { status: \"skipped\", command: plan.reported };\n }\n\n const stdio = commandStdio(plan);\n const blocked = blockedReason(plan, context, stdio);\n if (blocked) return complete(plan, emptyFailure(plan, blocked));\n\n const holdTerminal = usesTerminal(plan, stdio);\n if (holdTerminal && !context.terminal.acquire(\"exec\")) {\n return complete(plan, emptyFailure(plan, \"overlapping\"));\n }\n try {\n if (plan.display) await context.print(execEvent(plan, \"start\"));\n return complete(plan, await runPlan(plan));\n } finally {\n if (holdTerminal) context.terminal.release();\n }\n}\n\nexport function createExec(context: ExecContext): Exec {\n return ((file, args, options) => execute(file, args, options, context)) as Exec;\n}\n","import { stripVTControlCharacters } from \"node:util\";\nimport { summarizeError } from \"./errors.ts\";\n\nfunction safeString(value: unknown): string {\n try {\n return String(value);\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction normalizeProperty(value: object, key: PropertyKey, ancestors: Set<object>): unknown {\n try {\n return normalizeJson(Reflect.get(value, key), ancestors);\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction normalizedKeys(value: object): string[] | undefined {\n try {\n return Object.keys(value);\n } catch {\n return undefined;\n }\n}\n\nconst noToJson = Symbol(\"noToJson\");\n\nfunction normalizedToJson(value: object, ancestors: Set<object>): unknown {\n let toJSON: unknown;\n try {\n toJSON = Reflect.get(value, \"toJSON\");\n } catch {\n return noToJson;\n }\n if (typeof toJSON !== \"function\") return noToJson;\n try {\n const result = Reflect.apply(toJSON, value, []);\n return result === value ? noToJson : normalizeJson(result, ancestors);\n } catch {\n return noToJson;\n }\n}\n\nfunction isArrayBufferView(value: object): value is ArrayBufferView {\n try {\n return ArrayBuffer.isView(value);\n } catch {\n return false;\n }\n}\n\n/** Normalize arbitrary event data into values accepted by JSON.stringify. */\nexport function normalizeJson(value: unknown, ancestors = new Set<object>()): unknown {\n switch (typeof value) {\n case \"string\":\n return stripVTControlCharacters(value);\n case \"boolean\":\n return value;\n case \"number\":\n return Number.isFinite(value) ? value : null;\n case \"bigint\":\n return value.toString();\n case \"undefined\":\n return \"[undefined]\";\n case \"symbol\":\n return `[symbol:${stripVTControlCharacters(value.description ?? \"\")}]`;\n case \"function\":\n return `[function:${stripVTControlCharacters(value.name || \"anonymous\")}]`;\n case \"object\":\n break;\n }\n if (value === null) return null;\n if (ancestors.has(value)) return \"[Circular]\";\n\n const nextAncestors = new Set(ancestors).add(value);\n if (value instanceof Error) return normalizeJson(summarizeError(value), nextAncestors);\n\n const jsonValue = normalizedToJson(value, nextAncestors);\n if (jsonValue !== noToJson) return jsonValue;\n\n if (isArrayBufferView(value)) {\n if (value instanceof DataView) {\n return Array.from(new Uint8Array(value.buffer, value.byteOffset, value.byteLength));\n }\n try {\n return Array.from(value as unknown as Iterable<unknown>, (item) =>\n normalizeJson(item, nextAncestors),\n );\n } catch {\n return \"[Unserializable]\";\n }\n }\n if (value instanceof ArrayBuffer) return Array.from(new Uint8Array(value));\n if (Array.isArray(value)) {\n return Array.from({ length: value.length }, (_, index) =>\n normalizeProperty(value, index, nextAncestors),\n );\n }\n if (value instanceof Map) {\n try {\n return [...value].map(([key, item]) => [\n normalizeJson(key, nextAncestors),\n normalizeJson(item, nextAncestors),\n ]);\n } catch {\n return \"[Unserializable]\";\n }\n }\n if (value instanceof Set) {\n try {\n return [...value].map((item) => normalizeJson(item, nextAncestors));\n } catch {\n return \"[Unserializable]\";\n }\n }\n\n const keys = normalizedKeys(value);\n if (!keys) return safeString(value);\n const result: Record<string, unknown> = {};\n for (const key of keys) {\n result[stripVTControlCharacters(key)] = normalizeProperty(value, key, nextAncestors);\n }\n return result;\n}\n","import type { HackshErrorSummary } from \"./errors.ts\";\nimport type { ExecCommand } from \"./exec.ts\";\nimport type { LogRecord } from \"./logger.ts\";\nimport { normalizeJson } from \"./serialization.ts\";\nimport type { UsageSummary } from \"./usage.ts\";\n\nexport type PrintStream = \"stdout\" | \"stderr\";\nexport type OutputPreference = \"auto\" | \"pretty\" | \"json\";\nexport type OutputFormat = Exclude<OutputPreference, \"auto\">;\n\nexport interface StreamColors {\n stdout: boolean;\n stderr: boolean;\n}\n\nexport interface OutputMode {\n format: OutputFormat;\n interactive: boolean;\n color: StreamColors;\n}\n\nexport interface ResolveOutputModeOptions {\n output?: OutputPreference;\n env?: Readonly<Record<string, string | undefined>>;\n inputIsTTY?: boolean;\n outputIsTTY?: boolean;\n errorOutputIsTTY?: boolean;\n}\n\nfunction fallbackValue(value: unknown): string {\n try {\n return String(value);\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction validatePreference(value: unknown, source: string): OutputPreference | undefined {\n if (value === undefined) return undefined;\n if (value === \"auto\" || value === \"pretty\" || value === \"json\") return value;\n throw new TypeError(\n `Invalid ${source} value ${fallbackValue(value)}; expected auto, pretty, or json`,\n );\n}\n\nfunction readEnvironment(\n env: Readonly<Record<string, string | undefined>>,\n key: string,\n): string | undefined {\n try {\n return env[key];\n } catch {\n return undefined;\n }\n}\n\n/** Resolve output behavior once, before command routing or argument parsing. */\nexport function resolveOutputMode(options: ResolveOutputModeOptions = {}): OutputMode {\n const env = options.env ?? process.env;\n const configured = validatePreference(options.output, \"output\");\n const overridden = validatePreference(readEnvironment(env, \"HACKSH_OUTPUT\"), \"HACKSH_OUTPUT\");\n const requested = overridden ?? configured ?? \"auto\";\n const ci = Boolean(readEnvironment(env, \"CI\"));\n const format = requested === \"auto\" ? (ci ? \"json\" : \"pretty\") : requested;\n const inputIsTTY = options.inputIsTTY ?? process.stdin.isTTY === true;\n const outputIsTTY = options.outputIsTTY ?? process.stdout.isTTY === true;\n const errorOutputIsTTY = options.errorOutputIsTTY ?? process.stderr.isTTY === true;\n const colorable = format === \"pretty\" && !readEnvironment(env, \"NO_COLOR\");\n return {\n format,\n interactive: format === \"pretty\" && !ci && inputIsTTY && outputIsTTY,\n color: { stdout: colorable && outputIsTTY, stderr: colorable && errorOutputIsTTY },\n };\n}\n\nexport interface UsagePrintEvent {\n type: \"usage\";\n usage: UsageSummary;\n text: string;\n stream: PrintStream;\n}\n\nexport interface VersionPrintEvent {\n type: \"version\";\n version: string;\n}\n\nexport interface ErrorPrintEvent {\n type: \"error\";\n error: HackshErrorSummary;\n}\n\nexport interface LogPrintEvent {\n type: \"log\";\n record: LogRecord;\n}\n\nexport interface PromptChoiceState {\n value: string;\n label: string;\n hint?: string;\n selected: boolean;\n}\n\nexport type PromptStatus = \"active\" | \"error\" | \"submitted\" | \"closed\";\n\ninterface PromptStateBase {\n message: string;\n status: PromptStatus;\n error?: string;\n}\n\nexport interface SelectPromptState extends PromptStateBase {\n kind: \"select\";\n choices: readonly PromptChoiceState[];\n value: string;\n}\n\nexport interface ConfirmPromptState extends PromptStateBase {\n kind: \"confirm\";\n value: boolean;\n defaultValue?: boolean;\n}\n\nexport interface TextPromptState extends PromptStateBase {\n kind: \"text\";\n value: string;\n placeholder?: string;\n}\n\nexport interface AutocompletePromptState extends PromptStateBase {\n kind: \"autocomplete\";\n query: string;\n placeholder?: string;\n phase: \"input\" | \"select\";\n choices: readonly PromptChoiceState[];\n value?: string;\n}\n\nexport type PromptState =\n | SelectPromptState\n | ConfirmPromptState\n | TextPromptState\n | AutocompletePromptState;\n\nexport interface PromptPrintEvent {\n type: \"prompt\";\n prompt: PromptState;\n}\n\n/** Command output: exact text written to stdout, or a JSON value. */\nexport type OutputPrintEvent =\n | { type: \"output\"; kind: \"text\"; text: string }\n | { type: \"output\"; kind: \"json\"; data: unknown };\n\nexport interface ExecPrintEvent {\n type: \"exec\";\n phase: \"start\" | \"skip\";\n command: Omit<ExecCommand, \"cwd\"> & { cwd?: string };\n stdio: {\n stdin: \"ignore\" | \"input\" | \"inherit\";\n stdout: \"pipe\" | \"inherit\";\n stderr: \"pipe\" | \"inherit\";\n };\n interactive: boolean;\n}\n\n/** A semantic, command- and schema-free output value emitted by hacksh. */\nexport type PrintEvent =\n | UsagePrintEvent\n | VersionPrintEvent\n | ErrorPrintEvent\n | LogPrintEvent\n | PromptPrintEvent\n | OutputPrintEvent\n | ExecPrintEvent;\n\n/** Receives every output event produced by one command invocation. */\nexport interface Printer {\n print(event: PrintEvent): void | Promise<void>;\n}\n\nexport function eventStream(event: PrintEvent): PrintStream {\n if (event.type === \"error\" || event.type === \"exec\" || event.type === \"log\") return \"stderr\";\n if (event.type === \"usage\") return event.stream;\n return \"stdout\";\n}\n\nexport interface OutputWriter {\n write(text: string): unknown;\n}\n\nexport interface TerminalInput {\n readonly isTTY?: boolean;\n readonly isRaw?: boolean;\n readonly readableFlowing?: boolean | null;\n setRawMode?(mode: boolean): unknown;\n resume(): unknown;\n pause(): unknown;\n on(event: string, listener: (...args: never[]) => void): unknown;\n removeListener(event: string, listener: (...args: never[]) => void): unknown;\n}\n\nexport interface TerminalOutput extends OutputWriter {\n readonly isTTY?: boolean;\n readonly columns?: number;\n}\n\nexport interface JsonPrinterOptions {\n stdout?: OutputWriter;\n stderr?: OutputWriter;\n}\n\n/** Create a one-semantic-event-per-line JSON printer. */\nexport function createJsonPrinter(options: JsonPrinterOptions = {}): Printer {\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n return {\n print(event) {\n let serialized: string;\n try {\n serialized = JSON.stringify(normalizeJson(event));\n } catch {\n serialized = JSON.stringify({\n type: event.type,\n serializationError: \"Event data could not be serialized\",\n });\n }\n const line = `${serialized}\\n`;\n (eventStream(event) === \"stdout\" ? stdout : stderr).write(line);\n },\n };\n}\n\nexport interface PrintQueue {\n printer: Printer;\n printChecked(event: PrintEvent): Promise<void>;\n drain(): Promise<void>;\n}\n\n/** Serialize printer calls and retain failures until the invocation drains its output. */\nexport function createPrintQueue(target: Printer): PrintQueue {\n let pending: Promise<void> | undefined;\n let failure: unknown;\n let failed = false;\n\n function recordFailure(error: unknown): void {\n if (!failed) failure = error;\n failed = true;\n }\n\n function track(execution: Promise<void>, retainFailure: boolean): Promise<void> {\n const barrier = execution.catch((error: unknown) => {\n if (retainFailure) recordFailure(error);\n });\n pending = barrier;\n void barrier.then(() => {\n if (pending === barrier) pending = undefined;\n });\n return retainFailure ? barrier : execution;\n }\n\n function enqueue(event: PrintEvent, retainFailure: boolean): void | Promise<void> {\n if (pending)\n return track(\n pending.then(() => target.print(event)),\n retainFailure,\n );\n try {\n const result = target.print(event);\n if (result) return track(Promise.resolve(result), retainFailure);\n } catch (error) {\n if (retainFailure) recordFailure(error);\n else return Promise.reject(error);\n }\n }\n\n const printer: Printer = {\n print(event) {\n return enqueue(event, true);\n },\n };\n\n return {\n printer,\n async printChecked(event) {\n await enqueue(event, false);\n },\n async drain() {\n await pending;\n if (failed) throw failure;\n },\n };\n}\n","import { inspect, stripVTControlCharacters, styleText } from \"node:util\";\nimport type { HackshErrorSummary } from \"./errors.ts\";\nimport { formatExecCommand } from \"./exec.ts\";\nimport type { LogLevel, LogRecord } from \"./logger.ts\";\nimport {\n eventStream,\n type AutocompletePromptState,\n type OutputPrintEvent,\n type OutputWriter,\n type Printer,\n type PrintEvent,\n type StreamColors,\n type TerminalOutput,\n} from \"./printer.ts\";\nimport { normalizeJson } from \"./serialization.ts\";\n\ntype DecoratedEvent = Exclude<PrintEvent, OutputPrintEvent>;\n\ntype PrettyMark =\n | LogLevel\n | \"step\"\n | \"success\"\n | \"usage\"\n | \"version\"\n | \"errorEvent\"\n | \"prompt\"\n | \"exec\"\n | \"execSkip\";\ntype TextStyle = Parameters<typeof styleText>[0];\n\ninterface PrettySymbols {\n bar: string;\n marks: Record<PrettyMark, string>;\n}\n\nconst unicodeSymbols: PrettySymbols = {\n bar: \"│\",\n marks: {\n trace: \"·\",\n debug: \"◆\",\n info: \"●\",\n warning: \"▲\",\n error: \"■\",\n fatal: \"✖\",\n step: \"◇\",\n success: \"✔\",\n usage: \"◆\",\n version: \"●\",\n errorEvent: \"■\",\n prompt: \"?\",\n exec: \"$\",\n execSkip: \"#\",\n },\n};\n\nconst asciiSymbols: PrettySymbols = {\n bar: \"|\",\n marks: {\n trace: \".\",\n debug: \":\",\n info: \"i\",\n warning: \"!\",\n error: \"x\",\n fatal: \"X\",\n step: \">\",\n success: \"+\",\n usage: \"?\",\n version: \"i\",\n errorEvent: \"x\",\n prompt: \"?\",\n exec: \"$\",\n execSkip: \"#\",\n },\n};\n\nconst markStyles: Record<PrettyMark, TextStyle> = {\n trace: \"gray\",\n debug: \"magenta\",\n info: \"blue\",\n warning: \"yellow\",\n error: \"red\",\n fatal: [\"bgRed\", \"white\", \"bold\"],\n step: \"cyan\",\n success: \"green\",\n usage: \"cyan\",\n version: \"blue\",\n errorEvent: \"red\",\n prompt: \"cyan\",\n exec: \"gray\",\n execSkip: \"gray\",\n};\n\nexport interface PrettyPrinterOptions {\n /** One flag for both streams, or a flag per stream. */\n color: boolean | StreamColors;\n unicode: boolean;\n stdout?: TerminalOutput;\n stderr?: OutputWriter;\n}\n\nfunction safelyInspect(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return inspect(value, {\n breakLength: 80,\n colors: false,\n compact: false,\n depth: null,\n sorted: true,\n });\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction propertyLines(properties: Readonly<Record<string, unknown>>): string[] {\n const lines: string[] = [];\n for (const key of Object.keys(properties).sort()) {\n const rendered = ` ${key}: ${safelyInspect(properties[key])}`.split(\"\\n\");\n lines.push(rendered[0] ?? \"\");\n for (const continuation of rendered.slice(1)) lines.push(` ${continuation}`);\n }\n return lines;\n}\n\nfunction logLines(record: LogRecord): string[] {\n const category = record.category.length > 0 ? `[${record.category.join(\":\")}] ` : \"\";\n const message = record.message.split(\"\\n\");\n return [\n `${category}${message[0] ?? \"\"}`,\n ...message.slice(1),\n ...propertyLines(record.properties),\n ];\n}\n\nfunction errorLines(error: HackshErrorSummary): string[] {\n const lines = error.message.split(\"\\n\");\n const details: Record<string, unknown> = {};\n if (error.cause !== undefined) details.cause = error.cause;\n if (error.properties !== undefined) Object.assign(details, error.properties);\n if (error.value !== undefined) details.value = error.value;\n return [...lines, ...propertyLines(details)];\n}\n\nfunction outputText(event: OutputPrintEvent): string {\n if (event.kind === \"text\") return event.text;\n return `${JSON.stringify(normalizeJson(event.data), null, 2)}\\n`;\n}\n\nfunction eventMark(event: DecoratedEvent): PrettyMark {\n if (event.type === \"usage\") return \"usage\";\n if (event.type === \"version\") return \"version\";\n if (event.type === \"error\") return \"errorEvent\";\n if (event.type === \"prompt\") return event.prompt.status === \"submitted\" ? \"success\" : \"prompt\";\n if (event.type === \"exec\") return event.phase === \"skip\" ? \"execSkip\" : \"exec\";\n return event.record.kind === \"message\" ? event.record.level : event.record.kind;\n}\n\nfunction eventLines(event: DecoratedEvent): string[] {\n switch (event.type) {\n case \"usage\":\n return event.text.split(\"\\n\");\n case \"version\":\n return event.version.split(\"\\n\");\n case \"error\":\n return errorLines(event.error);\n case \"log\":\n return logLines(event.record);\n case \"prompt\": {\n const { prompt } = event;\n if (prompt.status === \"submitted\") {\n const result =\n prompt.kind === \"select\" || prompt.kind === \"autocomplete\"\n ? (prompt.choices.find(({ value }) => value === prompt.value)?.label ?? prompt.value)\n : prompt.kind === \"confirm\"\n ? prompt.value\n ? \"Yes\"\n : \"No\"\n : prompt.value;\n return [`${prompt.message}: ${result}`];\n }\n const lines = [prompt.message];\n if (prompt.kind === \"select\") {\n for (const choice of prompt.choices) {\n lines.push(\n `${choice.selected ? \">\" : \" \"} ${choice.label}${choice.hint ? ` — ${choice.hint}` : \"\"}`,\n );\n }\n } else if (prompt.kind === \"confirm\") {\n lines.push(\n `${prompt.value ? \"Yes\" : \"No\"}${prompt.defaultValue === undefined ? \"\" : ` (default: ${prompt.defaultValue ? \"yes\" : \"no\"})`}`,\n );\n } else {\n lines.push(prompt.value || (prompt.placeholder ? `(${prompt.placeholder})` : \"\"));\n }\n if (prompt.error) lines.push(prompt.error);\n return lines;\n }\n case \"exec\": {\n const lines = [formatExecCommand(event.command)];\n if (event.command.cwd !== undefined) lines.push(...propertyLines({ cwd: event.command.cwd }));\n return lines;\n }\n }\n}\n\nfunction colorize(enabled: boolean, style: TextStyle, text: string): string {\n return enabled ? styleText(style, text, { validateStream: false }) : text;\n}\n\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\nconst invisibleGrapheme = /^[\\p{Mark}\\p{Cf}]+$/u;\nconst combiningMark = /[\\p{Mark}\\p{Cf}]/u;\nconst emoji = /\\p{Extended_Pictographic}|\\p{Regional_Indicator}|\\u20e3/u;\n\nfunction isWideCodePoint(codePoint: number): boolean {\n return (\n codePoint >= 0x1100 &&\n (codePoint <= 0x115f ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0xa4cf && codePoint !== 0x303f) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd))\n );\n}\n\ninterface TerminalPosition {\n row: number;\n column: number;\n}\n\nfunction terminalPosition(text: string, columns: number | undefined): TerminalPosition {\n const width =\n Number.isInteger(columns) && columns !== undefined && columns > 0 ? columns : undefined;\n let row = 0;\n let column = 0;\n for (const { segment } of graphemeSegmenter.segment(stripVTControlCharacters(text))) {\n if (segment === \"\\n\" || segment === \"\\r\\n\") {\n row += 1;\n column = 0;\n continue;\n }\n if (segment === \"\\r\") {\n column = 0;\n continue;\n }\n if (invisibleGrapheme.test(segment)) continue;\n let cells = 0;\n if (segment === \"\\t\") {\n cells = 8 - (column % 8);\n } else if (emoji.test(segment) || isWideCodePoint(segment.codePointAt(0)!)) {\n cells = 2;\n } else {\n for (const value of segment) {\n const point = value.codePointAt(0)!;\n if (point < 0x20 || (point >= 0x7f && point < 0xa0)) continue;\n if (!combiningMark.test(value)) cells += 1;\n }\n }\n if (cells === 0) continue;\n if (width && column + cells > width) {\n row += 1;\n column = 0;\n }\n column += width ? Math.min(cells, width) : cells;\n }\n return { row, column };\n}\n\nfunction renderedRows(rendered: string, columns: number | undefined): number {\n return terminalPosition(rendered, columns).row + 1;\n}\n\ninterface ActivePrompt {\n rendered: string;\n lines: number;\n cursor?: TerminalPosition & { visible: boolean };\n}\n\n/** Create the fixed human-readable renderer used for pretty output. */\nexport function createPrettyPrinter(options: PrettyPrinterOptions): Printer {\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n const symbols = options.unicode ? unicodeSymbols : asciiSymbols;\n const colors =\n typeof options.color === \"boolean\"\n ? { stdout: options.color, stderr: options.color }\n : options.color;\n let activePrompt: ActivePrompt | undefined;\n\n function renderAutocomplete(prompt: AutocompletePromptState, color: boolean): string {\n const bar = colorize(color, \"gray\", symbols.bar);\n const accent = (text: string): string => colorize(color, \"cyan\", text);\n const muted = (text: string): string => colorize(color, \"gray\", text);\n const input = prompt.phase === \"input\";\n const lines = [\n `${accent(symbols.marks.prompt)} ${prompt.message}`,\n `${bar} ${input ? accent(\">\") : \" \"} ${prompt.query || muted(prompt.placeholder ?? \"\")} `,\n bar,\n ];\n for (const choice of prompt.choices) {\n lines.push(\n `${bar} ${choice.selected ? accent(\">\") : \" \"} ${choice.selected ? accent(choice.label) : choice.label}${choice.hint ? ` ${muted(`— ${choice.hint}`)}` : \"\"}`,\n );\n }\n if (prompt.choices.length === 0) {\n lines.push(`${bar} ${muted(\"No matches. Keep typing or backspace.\")}`);\n }\n lines.push(bar);\n lines.push(\n `${bar} ${muted(input ? \"INPUT · type to filter · ↓ select · Esc cancel\" : \"SELECT · ↑/↓ move · Enter choose · Esc edit\")}`,\n );\n if (prompt.error) lines.push(`${bar} ${prompt.error}`);\n return lines.join(\"\\n\");\n }\n\n function render(event: DecoratedEvent): string {\n const color = colors[eventStream(event)];\n if (\n event.type === \"prompt\" &&\n event.prompt.kind === \"autocomplete\" &&\n event.prompt.status !== \"submitted\"\n ) {\n return renderAutocomplete(event.prompt, color);\n }\n const mark = eventMark(event);\n const lines = eventLines(event);\n const firstPrefix = colorize(color, markStyles[mark], symbols.marks[mark]);\n const barPrefix = colorize(color, \"gray\", symbols.bar);\n return lines\n .map((line, index) => `${index === 0 ? firstPrefix : barPrefix}${line ? ` ${line}` : \"\"}`)\n .join(\"\\n\");\n }\n\n function eraseActivePrompt(): string {\n if (!activePrompt) return \"\";\n if (activePrompt.cursor) {\n const up = activePrompt.cursor.row > 0 ? `\\u001b[${activePrompt.cursor.row}A` : \"\";\n return `\\u001b[?25l${up}\\r\\u001b[0J`;\n }\n return \"\\u001b[1A\\u001b[2K\".repeat(activePrompt.lines);\n }\n\n function drawActivePrompt(): string {\n if (!activePrompt) return \"\";\n const { rendered, lines, cursor } = activePrompt;\n if (!cursor) return `${rendered}\\n`;\n const up = lines - cursor.row;\n return `${rendered}\\n${up > 0 ? `\\u001b[${up}A` : \"\"}\\u001b[${cursor.column + 1}G\\u001b[?25${cursor.visible ? \"h\" : \"l\"}`;\n }\n\n function finishActivePrompt(): string {\n const restore = activePrompt?.cursor ? \"\\u001b[?25h\" : \"\";\n activePrompt = undefined;\n return restore;\n }\n\n return {\n print(event) {\n if (event.type === \"output\") {\n const erase = eraseActivePrompt();\n const text = outputText(event);\n stdout.write(`${erase}${text}`);\n if (activePrompt) {\n // Keep a partial output line outside the frame that the next redraw erases.\n const separator = activePrompt.cursor && text && !text.endsWith(\"\\n\") ? \"\\n\" : \"\";\n stdout.write(`${separator}${drawActivePrompt()}`);\n }\n return;\n }\n const rendered = render(event);\n if (event.type === \"prompt\") {\n const erase = eraseActivePrompt();\n if (event.prompt.status === \"closed\") {\n const restore = finishActivePrompt();\n if (erase || restore) stdout.write(`${erase}${restore}`);\n return;\n }\n if (event.prompt.status === \"submitted\") {\n const restore = finishActivePrompt();\n stdout.write(`${erase}${restore}${rendered}\\n`);\n return;\n }\n const restore =\n activePrompt?.cursor && event.prompt.kind !== \"autocomplete\" ? \"\\u001b[?25h\" : \"\";\n activePrompt = { rendered, lines: renderedRows(rendered, stdout.columns) };\n if (event.prompt.kind === \"autocomplete\") {\n const { prompt } = event;\n const cursor = terminalPosition(\n `${symbols.marks.prompt} ${prompt.message}\\n${symbols.bar} > ${prompt.query}`,\n stdout.columns,\n );\n // The input's trailing space resolves pending wrap at an exact right edge.\n if (cursor.column === stdout.columns) {\n cursor.row += 1;\n cursor.column = 0;\n }\n activePrompt.cursor = { ...cursor, visible: prompt.phase === \"input\" };\n }\n stdout.write(`${erase}${restore}${drawActivePrompt()}`);\n return;\n }\n\n const erase = eraseActivePrompt();\n if (!activePrompt) {\n (eventStream(event) === \"stdout\" ? stdout : stderr).write(`${rendered}\\n`);\n return;\n }\n\n const restore = event.type === \"error\" ? finishActivePrompt() : \"\";\n stdout.write(`${erase}${restore}`);\n (eventStream(event) === \"stdout\" ? stdout : stderr).write(`${rendered}\\n`);\n if (activePrompt) stdout.write(drawActivePrompt());\n },\n };\n}\n"],"mappings":";;;;AAWA,IAAa,cAAb,cAAiC,MAAM;CACrC,YAAY,SAAkB,SAAwB;EACpD,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO,WAAW;CACzB;AACF;AAEA,IAAa,mBAAb,cAAsC,YAAY;CAChD;CAEA,YAAY,SAAiB,SAAwB,SAAwB;EAC3E,MAAM,SAAS,OAAO;EACtB,KAAK,UAAU;CACjB;AACF;AAEA,IAAa,wBAAb,cAA2C,iBAAiB;CAC1D;CAEA,YAAY,SAAwB,QAAoC;EACtE,MACE,uBAAuB,OAAO,KAAK,EAAE,KAAK,cAAc,KAAK,IAAI,IAAI,SAAS,CAAC,CAAC,KAAK,IAAI,KACzF,OACF;EACA,KAAK,SAAS;CAChB;AACF;;AAqBA,IAAa,oBAAb,cAAuC,YAAY;CACjD;CACA;CAEA,YACE,QACA,QACA,SACA,SACA;EACA,MAAM,SAAS,OAAO;EACtB,KAAK,SAAS;EACd,KAAK,SAAS;CAChB;AACF;;AAGA,IAAa,kBAAb,cAAqC,YAAY;CAC/C;CAEA,YAAY,SAAiB,QAAqB,SAAwB;EACxE,MAAM,SAAS,OAAO;EACtB,KAAKA,UAAU;CACjB;CAEA,IAAI,SAAsB;EACxB,OAAO,KAAKA;CACd;AACF;;AAGA,IAAa,kBAAb,cAAqC,YAAY;CAC/C;CAEA,YAAY,UAAkB,SAAkB,SAAwB;EACtE,IAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,WAAW,KAAK,WAAW,KAC5D,MAAM,IAAI,UAAU,4CAA4C;EAElE,MAAM,SAAS,OAAO;EACtB,KAAK,WAAW;CAClB;AACF;AAuBA,SAASC,aAAW,OAAgB,UAA0B;CAC5D,IAAI;EACF,OAAO,OAAO,KAAK;CACrB,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,aAAa,OAAe,KAA2B;CAC9D,IAAI;EACF,OAAO,QAAQ,IAAI,OAAO,GAAG;CAC/B,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,eAAe,OAAyB;CAC/C,IAAI;EACF,OAAO,OAAO,KAAK,KAAK;CAC1B,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,SAAS,UAAU,OAAwB;CACzC,IAAI;EACF,OAAO,OAAO,QAAQ,IAAI,OAAO,QAAQ,MAAM;CACjD,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,cAAc,OAAwB;CAC7C,IAAI;EACF,MAAM,YAAY,OAAO,eAAe,KAAK;EAC7C,OAAO,cAAc,OAAO,aAAa,cAAc;CACzD,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,eACP,EAAE,KAAK,SAAS,SAChB,MACwB;CACxB,IAAI,CAAC,OAAO,OAAO;EAAE;EAAK;CAAQ;CAClC,MAAM,UAAmC,CAAC;CAC1C,KAAK,MAAM,OAAO,eAAe,KAAK,GAAG;EACvC,IAAI;GAAC;GAAQ;GAAQ;GAAW;EAAM,CAAC,CAAC,SAAS,GAAG,GAAG;EACvD,QAAQ,OAAO,gBAAgB,aAAa,OAAO,GAAG,GAAG,IAAI;CAC/D;CACA,MAAM,OAAO,aAAa,OAAO,MAAM;CACvC,MAAM,OAAO,aAAa,OAAO,MAAM;CACvC,OAAO;EACL;EACA;EACA,GAAI,OAAO,SAAS,WAAW,EAAE,KAAK,IAAI,CAAC;EAC3C,GAAI,MAAM,QAAQ,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC;EACtC,GAAI,OAAO,KAAK,OAAO,CAAC,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,QAAQ;CACzD;AACF;AAEA,SAAS,UAAU,OAA+B;CAChD,IAAI,iBAAiB,mBAAmB,OAAO;CAC/C,IAAI,iBAAiB,uBAAuB,OAAO;CACnD,IAAI,iBAAiB,kBAAkB,OAAO;CAC9C,OAAO;AACT;AAEA,SAAS,uBAAuB,OAAc,MAAoD;CAChG,MAAM,UAA8B;EAClC,MAAM,UAAU,KAAK;EACrB,MAAMA,aAAW,aAAa,OAAO,MAAM,GAAG,OAAO;EACrD,SAASA,aAAW,aAAa,OAAO,SAAS,GAAG,gCAAgC;CACtF;CACA,KAAK,IAAI,OAAO,OAAO;CAEvB,MAAM,QAAQ,aAAa,OAAO,OAAO;CACzC,MAAM,QAAQ,aAAa,OAAO,OAAO;CACzC,IAAI,OAAO,UAAU,UAAU,QAAQ,QAAQ;CAC/C,IAAI,UAAU,KAAA,GAAW,QAAQ,QAAQ,gBAAgB,OAAO,IAAI;CACpE,IAAI,iBAAiB,uBACnB,QAAQ,SAAS,MAAM,OAAO,KAAK,UAAU,eAAe,OAAO,IAAI,CAAC;CAG1E,MAAM,2BAAW,IAAI,IAAI;EAAC;EAAQ;EAAW;EAAS;EAAS;EAAW;CAAQ,CAAC;CACnF,MAAM,aAAsC,CAAC;CAC7C,KAAK,MAAM,OAAO,eAAe,KAAK,GAAG;EACvC,IAAI,SAAS,IAAI,GAAG,GAAG;EACvB,WAAW,OAAO,gBAAgB,aAAa,OAAO,GAAG,GAAG,IAAI;CAClE;CACA,IAAI,OAAO,KAAK,UAAU,CAAC,CAAC,SAAS,GAAG,QAAQ,aAAa;CAC7D,OAAO;AACT;;AAGA,SAAgB,gBACd,OACA,uBAAiC,IAAI,QAAQ,GACpC;CACT,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO;CACxD,MAAM,WAAW,KAAK,IAAI,KAAK;CAC/B,IAAI,aAAa,KAAA,GAAW,OAAO;CACnC,IAAI,iBAAiB,OAAO,OAAO,uBAAuB,OAAO,IAAI;CAErE,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxB,MAAM,SAAoB,CAAC;EAC3B,KAAK,IAAI,OAAO,MAAM;EACtB,IAAI,UAAU;EACd,KAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,aAAa,gBAAgB,MAAM,IAAI;GAC7C,OAAO,KAAK,UAAU;GACtB,YAAY,eAAe;EAC7B;EACA,IAAI,SAAS,OAAO;EACpB,KAAK,IAAI,OAAO,KAAK;EACrB,OAAO;CACT;CACA,IAAI,iBAAiB,KAAK;EACxB,MAAM,yBAAS,IAAI,IAAsB;EACzC,KAAK,IAAI,OAAO,MAAM;EACtB,IAAI,UAAU;EACd,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO;GAC/B,MAAM,gBAAgB,gBAAgB,KAAK,IAAI;GAC/C,MAAM,iBAAiB,gBAAgB,MAAM,IAAI;GACjD,OAAO,IAAI,eAAe,cAAc;GACxC,YAAY,kBAAkB,OAAO,mBAAmB;EAC1D;EACA,IAAI,SAAS,OAAO;EACpB,KAAK,IAAI,OAAO,KAAK;EACrB,OAAO;CACT;CACA,IAAI,iBAAiB,KAAK;EACxB,MAAM,yBAAS,IAAI,IAAa;EAChC,KAAK,IAAI,OAAO,MAAM;EACtB,IAAI,UAAU;EACd,KAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,aAAa,gBAAgB,MAAM,IAAI;GAC7C,OAAO,IAAI,UAAU;GACrB,YAAY,eAAe;EAC7B;EACA,IAAI,SAAS,OAAO;EACpB,KAAK,IAAI,OAAO,KAAK;EACrB,OAAO;CACT;CACA,IAAI,YAAY,OAAO,KAAK,KAAK,UAAU,KAAK,KAAK,CAAC,cAAc,KAAK,GAAG,OAAO;CAEnF,MAAM,SAAkC,CAAC;CACzC,KAAK,IAAI,OAAO,MAAM;CACtB,IAAI,UAAU;CACd,KAAK,MAAM,OAAO,eAAe,KAAK,GAAG;EACvC,MAAM,WAAW,aAAa,OAAO,GAAG;EACxC,MAAM,aAAa,gBAAgB,UAAU,IAAI;EACjD,OAAO,OAAO;EACd,YAAY,eAAe;CAC7B;CACA,IAAI,SAAS,OAAO;CACpB,KAAK,IAAI,OAAO,KAAK;CACrB,OAAO;AACT;;AAGA,SAAgB,eAAe,OAAoC;CACjE,IAAI,iBAAiB,OAAO,OAAO,uBAAuB,uBAAO,IAAI,QAAQ,CAAC;CAC9E,OAAO;EACL,MAAM;EACN,MAAM;EACN,SAASA,aAAW,OAAO,+BAA+B;EAC1D,OAAO,gBAAgB,KAAK;CAC9B;AACF;;;ACpLA,MAAM,8BAAmC,IAAI,IAAI;CAC/C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAiC;AAoCjC,MAAM,YAAY;AAClB,MAAM,kBAAkB;CACtB,eAAe;CACf,mBAAmB;CACnB,aAAa;AACf;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,YAAY,OAAe,OAAqB;CACvD,IAAI,MAAM,SAAS,IAAI,GAAG,MAAM,IAAI,UAAU,GAAG,MAAM,iCAAiC;AAC1F;AAEA,SAAS,YAAY,OAAgB,OAAe,SAAiB,SAAyB;CAC5F,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,WAAW,QAAQ,SACtF,MAAM,IAAI,UAAU,GAAG,MAAM,2BAA2B,QAAQ,MAAM,SAAS;CAEjF,OAAO;AACT;AAEA,SAAS,SAAiC,OAAgB,OAAe,SAA0B;CACjG,IAAI,OAAO,UAAU,YAAa,QAA8B,SAAS,KAAK,GAC5E,OAAO;CACT,MAAM,IAAI,UACR,iBAAiB,MAAM,aAAa,QAAQ,KAAK,SAAS,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,GAC7F;AACF;AAEA,SAAS,YAAY,OAAgB,OAAwB;CAC3D,IAAI,OAAO,UAAU,WAAW,MAAM,IAAI,UAAU,iBAAiB,MAAM,qBAAqB;CAChG,OAAO;AACT;AAEA,SAAS,WAAW,OAAmC;CACrD,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,MAAM,IAAI,UAAU,uCAAuC;CACtF,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,OAAO,SAAS,YAAY,SAAS,IACvC,MAAM,IAAI,UAAU,0DAA0D;EAEhF,YAAY,MAAM,sBAAsB;CAC1C;CACA,OAAO;AACT;AAEA,SAAS,iBACP,MACA,WAC+B;CAC/B,IAAI,cAAc,KAAA,KAAa,SAAS,KAAA,GAAW,OAAO,KAAA;CAC1D,IAAI,cAAc,KAAA,KAAa,CAAC,SAAS,SAAS,GAChD,MAAM,IAAI,UAAU,qCAAqC;CAE3D,MAAM,SAA4B,CAAC;CACnC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,QAAQ,GAAG,GAC3D,IAAI,UAAU,KAAA,GAAW,OAAO,OAAO;CAEzC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,aAAa,CAAC,CAAC,GAAG;EAC1D,IAAI,QAAQ,MAAM,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,IAAI,GACtD,MAAM,IAAI,UAAU,qCAAqC,KAAK,UAAU,GAAG,GAAG;EAEhF,IAAI,UAAU,KAAA,GAAW;GACvB,OAAO,OAAO;GACd;EACF;EACA,IAAI,OAAO,UAAU,UACnB,MAAM,IAAI,UAAU,wBAAwB,IAAI,+BAA+B;EAEjF,YAAY,OAAO,wBAAwB,KAAK;EAChD,OAAO,OAAO;CAChB;CACA,OAAO;AACT;AAEA,SAAS,YAAY,OAAe,SAAoC;CACtE,IAAI,WAAW;CACf,KAAK,MAAM,UAAU,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,MAAM,UAAU,MAAM,SAAS,KAAK,MAAM,GAChF,WAAW,SAAS,MAAM,MAAM,CAAC,CAAC,KAAK,KAAK;CAE9C,OAAO;AACT;AAEA,SAAS,cAAc,SAAsB,SAAyC;CACpF,IAAI,QAAQ,WAAW,GAAG,OAAO;CACjC,OAAO;EACL,MAAM,YAAY,QAAQ,MAAM,OAAO;EACvC,MAAM,QAAQ,KAAK,KAAK,QAAQ,YAAY,KAAK,OAAO,CAAC;EACzD,KAAK,QAAQ,QAAQ,KAAA,IAAY,KAAA,IAAY,YAAY,QAAQ,KAAK,OAAO;CAC/E;AACF;AAEA,SAAS,YAAY,OAAc,SAAmC;CACpE,MAAM,SAAS;CACf,MAAM,WAAW,IAAI,MAAM,YAAY,MAAM,SAAS,OAAO,CAAC;CAC9D,IAAI,OAAO,MAAM,UAAU,UAAU,SAAS,QAAQ,YAAY,MAAM,OAAO,OAAO;CACtF,IAAI,OAAO,SAAS,KAAA,GAAW,SAAS,OAAO,OAAO;CACtD,IAAI,OAAO,UAAU,KAAA,GAAW,SAAS,QAAQ,OAAO;CACxD,IAAI,OAAO,OAAO,YAAY,UAAU,SAAS,UAAU,YAAY,OAAO,SAAS,OAAO;CAC9F,IAAI,OAAO,OAAO,SAAS,UAAU,SAAS,OAAO,YAAY,OAAO,MAAM,OAAO;CACrF,IAAI,MAAM,QAAQ,OAAO,SAAS,GAChC,SAAS,YAAY,OAAO,UAAU,KAAK,QACzC,OAAO,QAAQ,WAAW,YAAY,KAAK,OAAO,IAAI,GACxD;CAEF,OAAO;AACT;AAEA,SAAS,cAAc,MAAgB,OAAqB;CAC1D,OAAO,KAAK,OAAO,WAAW,IAAI,QAAQ,YAAY,OAAO,KAAK,MAAM;AAC1E;AAEA,SAAS,UAAU,MAAe,MAAe,SAAkB,SAAgC;CACjG,IAAI,OAAO,SAAS,YAAY,SAAS,IACvC,MAAM,IAAI,UAAU,sCAAsC;CAE5D,YAAY,MAAM,WAAW;CAC7B,MAAM,OAAO,SAAS,KAAA,IAAY,CAAC,IAAI;CACvC,IAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,CAAC,KAAK,OAAO,QAAQ,OAAO,QAAQ,QAAQ,GACtE,MAAM,IAAI,UAAU,uCAAuC;CAE7D,KAAK,MAAM,OAAO,MAAM,YAAY,KAAK,WAAW;CACpD,MAAM,MAAM,YAAY,KAAA,IAAY,CAAC,IAAI;CACzC,IAAI,CAAC,SAAS,GAAG,GAAG,MAAM,IAAI,UAAU,gCAAgC;CACxE,KAAK,MAAM,OAAO,OAAO,KAAK,GAAG,GAC/B,IAAI,CAAC,YAAY,IAAI,GAAG,GAAG,MAAM,IAAI,UAAU,yBAAyB,IAAI,GAAG;CAGjF,MAAM,EAAE,KAAK,OAAO,QAAQ,SAAS,QAAQ,WAAW,wBAAwB;CAChF,IAAI,QAAQ,KAAA,GAAW;EACrB,IAAI,OAAO,QAAQ,YAAY,QAAQ,IACrC,MAAM,IAAI,UAAU,8CAA8C;EAEpE,YAAY,KAAK,mBAAmB;CACtC;CACA,IAAI,UAAU,KAAA,KAAa,OAAO,UAAU,UAC1C,MAAM,IAAI,UAAU,sCAAsC;CAE5D,IAAI,WAAW,KAAA,KAAa,OAAO,WAAW,WAC5C,MAAM,IAAI,UAAU,wCAAwC;CAE9D,IAAI,WAAW,KAAA,KAAa,EAAE,kBAAkB,cAC9C,MAAM,IAAI,UAAU,6CAA6C;CAEnE,MAAM,QACJ,IAAI,UAAU,KAAA,IAAY,SAAS,SAAS,IAAI,OAAO,SAAS,CAAC,QAAQ,SAAS,CAAC;CACrF,MAAM,SACJ,IAAI,WAAW,KAAA,IAAY,SAAS,SAAS,IAAI,QAAQ,UAAU,CAAC,QAAQ,SAAS,CAAC;CACxF,MAAM,SACJ,IAAI,WAAW,KAAA,IAAY,SAAS,SAAS,IAAI,QAAQ,UAAU,CAAC,QAAQ,SAAS,CAAC;CACxF,IAAI,UAAU,KAAA,KAAa,UAAU,WACnC,MAAM,IAAI,UAAU,2DAA2D;CAEjF,MAAM,UAAU;EAAE;EAAM,MAAM,CAAC,GAAG,IAAI;EAAG;CAAI;CAC7C,MAAM,SAAS,IAAI,WAAW,KAAA,IAAY,CAAC,IAAI,WAAW,IAAI,MAAM;CACpE,OAAO;EACL;EACA,UAAU,cAAc,SAAS,MAAM;EACvC,KAAK,iBAAiB,QAAQ,KAAK,IAAI,GAAG;EAC1C;EACA,QAAQ,UAAU;EAClB,SACE,YAAY,KAAA,IACR,KAAA,IACA,YAAY,SAAS,yBAAyB,GAAG,SAAS;EAChE,QAAQ,WAAW,KAAA,IAAY,QAAQ,SAAS,YAAY,IAAI,CAAC,QAAQ,QAAQ,MAAM,CAAC;EACxF,WACE,cAAc,KAAA,IACV,MACA,YAAY,WAAW,2BAA2B,GAAG,OAAO,gBAAgB;EAClF,qBACE,wBAAwB,KAAA,IACpB,MACA,YAAY,qBAAqB,qCAAqC,GAAG,SAAS;EACxF;EACA;EACA;EACA,aACE,IAAI,gBAAgB,KAAA,IAAY,QAAQ,YAAY,IAAI,aAAa,aAAa;EACpF,SAAS,IAAI,YAAY,KAAA,IAAY,OAAO,YAAY,IAAI,SAAS,SAAS;EAC9E;EACA,QAAQ,IAAI,WAAW,KAAA,IAAY,QAAQ,YAAY,IAAI,QAAQ,QAAQ;CAC7E;AACF;AAEA,SAAS,kBAAkB,MAAsB;CAC/C,IAAI,KAAK,SAAS,MAAM,GAAG,OAAO,KAAK,MAAM,GAAG,EAAE;CAClD,IAAI,KAAK,SAAS,IAAI,GAAG,OAAO,KAAK,MAAM,GAAG,EAAE;CAChD,OAAO;AACT;AAEA,SAAS,QAAQ,QAAkB,OAAe,SAAmC;CACnF,MAAM,SAAmB,CAAC;CAC1B,IAAI,SAAS;CACb,IAAI,WAAW;CACf,OAAO,GAAG,SAAS,UAAkB;EACnC,IAAI,UAAU;EACd,MAAM,YAAY,QAAQ;EAC1B,IAAI,MAAM,UAAU,WAAW;GAC7B,OAAO,KAAK,KAAK;GACjB,UAAU,MAAM;GAChB;EACF;EACA,OAAO,KAAK,MAAM,SAAS,GAAG,SAAS,CAAC;EACxC,SAAS;EACT,WAAW;EACX,QAAQ;CACV,CAAC;CACD,aAAa,kBAAkB,OAAO,OAAO,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC;AACvE;AAEA,SAAS,SACP,SACA,SACA,QACA,QACY;CACZ,MAAM,SAAS;EAAE,QAAQ;EAAU;EAAS;EAAQ;CAAO;CAC3D,IAAI,QAAQ,OAAO,OAAO;EAAE,GAAG;EAAQ,QAAQ,QAAQ;CAAM;CAC7D,IAAI,QAAQ,YAAY,OAAO;EAAE,GAAG;EAAQ,QAAQ;EAAS,OAAO,QAAQ;CAAW;CACvF,MAAM,EAAE,MAAM,WAAW,QAAQ,QAAQ;EAAE,MAAM;EAAM,QAAQ;CAAK;CACpE,IAAI,WAAW,MAAM,OAAO;EAAE,GAAG;EAAQ,QAAQ;EAAU;CAAO;CAClE,IAAI,SAAS,GAAG,OAAO;EAAE,GAAG;EAAQ,QAAQ;EAAa,UAAU,QAAQ;CAAE;CAC7E,OAAO;EAAE,QAAQ;EAAa;EAAS;EAAQ;EAAQ,UAAU;CAAE;AACrE;AAEA,SAAS,aAAa,OAAgD;CACpE,OAAO,iBAAiB,SAAS,aAAa;AAChD;AAEA,SAAS,UAAU,MAAgB,OAAyC;CAC1E,MAAM,EAAE,MAAM,MAAM,QAAQ,KAAK;CACjC,OAAO;EACL,MAAM;EACN;EACA,SAAS,QAAQ,KAAA,IAAY;GAAE;GAAM;EAAK,IAAI;GAAE;GAAM;GAAM;EAAI;EAChE,OAAO,aAAa,IAAI;EACxB,aAAa,KAAK;CACpB;AACF;AAEA,SAAS,aAAa,MAA2B;CAC/C,OAAO;EACL,OAAO,KAAK,UAAU,YAAY,YAAY,KAAK,UAAU,KAAA,IAAY,WAAW;EACpF,QAAQ,KAAK;EACb,QAAQ,KAAK;CACf;AACF;AAEA,SAAS,aAAa,MAAgB,OAA2B;CAC/D,OACE,KAAK,eACL,MAAM,UAAU,aAChB,MAAM,WAAW,aACjB,MAAM,WAAW;AAErB;AAEA,SAAS,WAAW,MAAsC;CACxD,MAAM,QAAQ,aAAa,IAAI;CAC/B,IAAI;EACF,OAAO,MAAM,KAAK,QAAQ,MAAM,KAAK,QAAQ,MAAM;GACjD,KAAK,KAAK,QAAQ;GAClB,KAAK,KAAK;GACV,OAAO;GACP,aAAa;GACb,OAAO;IACL,MAAM,UAAU,YAAY,YAAY,MAAM,UAAU,UAAU,SAAS;IAC3E,MAAM;IACN,MAAM;GACR;EACF,CAAC;CACH,SAAS,OAAO;EACd,IAAI,aAAa,KAAK,GAAG,OAAO;EAChC,MAAM;CACR;AACF;AAEA,SAAS,QAAQ,MAAqC;CACpD,MAAM,UAAmB;EAAE,OAAO,KAAA;EAAW,YAAY,KAAA;EAAW,MAAM,KAAA;CAAU;CACpF,IAAI,KAAK,OAAO,SAAS;EACvB,QAAQ,QAAQ;EAChB,OAAO,QAAQ,QAAQ,SAAS,KAAK,UAAU,SAAS,IAAI,EAAE,CAAC;CACjE;CACA,MAAM,QAAQ,WAAW,IAAI;CAC7B,IAAI,iBAAiB,OAAO;EAC1B,QAAQ,aAAa,cAAc,MAAM,KAAK;EAC9C,OAAO,QAAQ,QAAQ,SAAS,KAAK,UAAU,SAAS,IAAI,EAAE,CAAC;CACjE;CAEA,OAAO,IAAI,SAAS,YAAY;EAC9B,MAAM,SAAS,MAAM;EACrB,MAAM,SAAS,MAAM;EACrB,IAAI,UAAU;EACd,IAAI;EAEJ,MAAM,eAAe;GACnB,IAAI,SAAS;GACb,UAAU;GACV,aAAa,YAAY;GACzB,aAAa,SAAS;GACtB,KAAK,OAAO,oBAAoB,SAAS,OAAO;GAChD,QAAQ,SAAS,KAAK,UAAU,SAAS,WAAW,GAAG,WAAW,CAAC,CAAC;EACtE;EACA,MAAM,gBAAgB;GACpB,QAAQ,QAAQ;GAChB,QAAQ,QAAQ;GAChB,OAAO;EACT;EACA,MAAM,aAAa,UAA4B;GAC7C,IAAI,WAAW,QAAQ,OAAO;GAC9B,QAAQ,QAAQ;GAChB,IAAI,QAAQ,MAAM;IAChB,QAAQ;IACR;GACF;GACA,MAAM,KAAK,SAAS;GACpB,YAAY,iBAAiB,MAAM,KAAK,SAAS,GAAG,KAAK,mBAAmB;EAC9E;EACA,MAAM,gBAAgB,UAAU,SAAS;EAEzC,MAAM,aAAa,SACf,QAAQ,QAAQ,KAAK,iBAAiB,UAAU,cAAc,CAAC,UACzD;EACV,MAAM,aAAa,SACf,QAAQ,QAAQ,KAAK,iBAAiB,UAAU,cAAc,CAAC,UACzD;EACV,MAAM,eACJ,KAAK,YAAY,KAAA,IAAY,KAAA,IAAY,iBAAiB,UAAU,SAAS,GAAG,KAAK,OAAO;EAC9F,KAAK,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;EAE7D,MAAM,GAAG,UAAU,UAAU;GAC3B,IAAI,MAAM,QAAQ,KAAA,GAAW;GAC7B,QAAQ,aAAa,cAAc,MAAM,KAAK;GAC9C,QAAQ;EACV,CAAC;EACD,MAAM,GAAG,SAAS,MAAM,WAAW;GACjC,QAAQ,OAAO;IAAE;IAAM;GAAO;GAC9B,aAAa,SAAS;GAEtB,IAAI,QAAQ,OAAO,QAAQ;EAC7B,CAAC;EACD,MAAM,GAAG,SAAS,MAAM;EAExB,IAAI,MAAM,OAAO;GACf,MAAM,MAAM,GAAG,eAAe,KAAA,CAAS;GACvC,MAAM,MAAM,IAAI,KAAK,KAAK;EAC5B;CACF,CAAC;AACH;AAEA,SAAS,eAAe,OAAuB;CAC7C,OAAO,UAAU,MAAM,8BAA8B,KAAK,KAAK,IAAI,KAAK,UAAU,KAAK,IAAI;AAC7F;AAEA,SAAgB,kBAAkB,SAAqD;CACrF,OAAO,CAAC,QAAQ,MAAM,GAAG,QAAQ,IAAI,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,KAAK,GAAG;AACrE;AAEA,SAAS,eAAe,MAAgB,QAA6B;CACnE,MAAM,UAAU,kBAAkB,KAAK,QAAQ;CAC/C,QAAQ,OAAO,QAAf;EACE,KAAK,aACH,OAAO,iCAAiC,OAAO,SAAS,IAAI;EAC9D,KAAK,UACH,OAAO,6BAA6B,OAAO,OAAO,IAAI;EACxD,KAAK,SAEH,OAAO,iCADO,OAAO,MAAgC,QACL,OAAO,MAAM,QAAQ,KAAK;EAE5E,KAAK,WACH,OAAO,2BAA2B,KAAK,QAAQ,OAAO;EACxD,KAAK,WACH,OAAO,wBAAwB;EACjC,KAAK,gBACH,OAAO,2BAA2B,KAAK,UAAU,UAAU;EAC7D,KAAK;EACL,KAAK;EACL,KAAK,eACH,OAAO,GAAG,gBAAgB,OAAO,QAAQ,IAAI;CACjD;AACF;AAEA,SAAS,aAAa,MAAgB,QAAoC;CACxE,OAAO;EAAE,QAAQ;EAAU,SAAS,KAAK;EAAU,QAAQ;EAAI,QAAQ;EAAI;CAAO;AACpF;AAEA,SAAS,SAAS,MAAgB,QAAgC;CAChE,IAAI,OAAO,WAAW,YAAY,KAAK,QACrC,MAAM,IAAI,gBACR,eAAe,MAAM,MAAM,GAC3B,QACA,OAAO,WAAW,UAAU,EAAE,OAAO,OAAO,MAAM,IAAI,KAAA,CACxD;CAEF,OAAO;AACT;AAEA,SAAS,cACP,MACA,SACA,OAC+C;CAC/C,MAAM,YACJ,MAAM,UAAU,aAAa,MAAM,WAAW,aAAa,MAAM,WAAW;CAC9E,IAAI,QAAQ,KAAK,WAAW,UAAU,WAAW,OAAO;CACxD,IAAI,KAAK,eAAe,CAAC,QAAQ,KAAK,aAAa,OAAO;AAE5D;AAEA,eAAe,QACb,MACA,MACA,SACA,SACmC;CACnC,MAAM,OAAO,UAAU,MAAM,MAAM,SAAS,OAAO;CACnD,IAAI,KAAK,OAAO,SAAS,OAAO,SAAS,MAAM,aAAa,MAAM,SAAS,CAAC;CAC5E,IAAI,KAAK,QAAQ;EACf,IAAI,KAAK,SAAS,MAAM,QAAQ,MAAM,UAAU,MAAM,MAAM,CAAC;EAC7D,OAAO;GAAE,QAAQ;GAAW,SAAS,KAAK;EAAS;CACrD;CAEA,MAAM,QAAQ,aAAa,IAAI;CAC/B,MAAM,UAAU,cAAc,MAAM,SAAS,KAAK;CAClD,IAAI,SAAS,OAAO,SAAS,MAAM,aAAa,MAAM,OAAO,CAAC;CAE9D,MAAM,eAAe,aAAa,MAAM,KAAK;CAC7C,IAAI,gBAAgB,CAAC,QAAQ,SAAS,QAAQ,MAAM,GAClD,OAAO,SAAS,MAAM,aAAa,MAAM,aAAa,CAAC;CAEzD,IAAI;EACF,IAAI,KAAK,SAAS,MAAM,QAAQ,MAAM,UAAU,MAAM,OAAO,CAAC;EAC9D,OAAO,SAAS,MAAM,MAAM,QAAQ,IAAI,CAAC;CAC3C,UAAU;EACR,IAAI,cAAc,QAAQ,SAAS,QAAQ;CAC7C;AACF;AAEA,SAAgB,WAAW,SAA4B;CACrD,SAAS,MAAM,MAAM,YAAY,QAAQ,MAAM,MAAM,SAAS,OAAO;AACvE;;;AC1lBA,SAAS,WAAW,OAAwB;CAC1C,IAAI;EACF,OAAO,OAAO,KAAK;CACrB,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,kBAAkB,OAAe,KAAkB,WAAiC;CAC3F,IAAI;EACF,OAAO,cAAc,QAAQ,IAAI,OAAO,GAAG,GAAG,SAAS;CACzD,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,eAAe,OAAqC;CAC3D,IAAI;EACF,OAAO,OAAO,KAAK,KAAK;CAC1B,QAAQ;EACN;CACF;AACF;AAEA,MAAM,WAAW,OAAO,UAAU;AAElC,SAAS,iBAAiB,OAAe,WAAiC;CACxE,IAAI;CACJ,IAAI;EACF,SAAS,QAAQ,IAAI,OAAO,QAAQ;CACtC,QAAQ;EACN,OAAO;CACT;CACA,IAAI,OAAO,WAAW,YAAY,OAAO;CACzC,IAAI;EACF,MAAM,SAAS,QAAQ,MAAM,QAAQ,OAAO,CAAC,CAAC;EAC9C,OAAO,WAAW,QAAQ,WAAW,cAAc,QAAQ,SAAS;CACtE,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,kBAAkB,OAAyC;CAClE,IAAI;EACF,OAAO,YAAY,OAAO,KAAK;CACjC,QAAQ;EACN,OAAO;CACT;AACF;;AAGA,SAAgB,cAAc,OAAgB,4BAAY,IAAI,IAAY,GAAY;CACpF,QAAQ,OAAO,OAAf;EACE,KAAK,UACH,OAAO,yBAAyB,KAAK;EACvC,KAAK,WACH,OAAO;EACT,KAAK,UACH,OAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;EAC1C,KAAK,UACH,OAAO,MAAM,SAAS;EACxB,KAAK,aACH,OAAO;EACT,KAAK,UACH,OAAO,WAAW,yBAAyB,MAAM,eAAe,EAAE,EAAE;EACtE,KAAK,YACH,OAAO,aAAa,yBAAyB,MAAM,QAAQ,WAAW,EAAE;CAG5E;CACA,IAAI,UAAU,MAAM,OAAO;CAC3B,IAAI,UAAU,IAAI,KAAK,GAAG,OAAO;CAEjC,MAAM,gBAAgB,IAAI,IAAI,SAAS,CAAC,CAAC,IAAI,KAAK;CAClD,IAAI,iBAAiB,OAAO,OAAO,cAAc,eAAe,KAAK,GAAG,aAAa;CAErF,MAAM,YAAY,iBAAiB,OAAO,aAAa;CACvD,IAAI,cAAc,UAAU,OAAO;CAEnC,IAAI,kBAAkB,KAAK,GAAG;EAC5B,IAAI,iBAAiB,UACnB,OAAO,MAAM,KAAK,IAAI,WAAW,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU,CAAC;EAEpF,IAAI;GACF,OAAO,MAAM,KAAK,QAAwC,SACxD,cAAc,MAAM,aAAa,CACnC;EACF,QAAQ;GACN,OAAO;EACT;CACF;CACA,IAAI,iBAAiB,aAAa,OAAO,MAAM,KAAK,IAAI,WAAW,KAAK,CAAC;CACzE,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,OAAO,IAAI,GAAG,UAC9C,kBAAkB,OAAO,OAAO,aAAa,CAC/C;CAEF,IAAI,iBAAiB,KACnB,IAAI;EACF,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,UAAU,CACrC,cAAc,KAAK,aAAa,GAChC,cAAc,MAAM,aAAa,CACnC,CAAC;CACH,QAAQ;EACN,OAAO;CACT;CAEF,IAAI,iBAAiB,KACnB,IAAI;EACF,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,SAAS,cAAc,MAAM,aAAa,CAAC;CACpE,QAAQ;EACN,OAAO;CACT;CAGF,MAAM,OAAO,eAAe,KAAK;CACjC,IAAI,CAAC,MAAM,OAAO,WAAW,KAAK;CAClC,MAAM,SAAkC,CAAC;CACzC,KAAK,MAAM,OAAO,MAChB,OAAO,yBAAyB,GAAG,KAAK,kBAAkB,OAAO,KAAK,aAAa;CAErF,OAAO;AACT;;;AChGA,SAAS,cAAc,OAAwB;CAC7C,IAAI;EACF,OAAO,OAAO,KAAK;CACrB,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,mBAAmB,OAAgB,QAA8C;CACxF,IAAI,UAAU,KAAA,GAAW,OAAO,KAAA;CAChC,IAAI,UAAU,UAAU,UAAU,YAAY,UAAU,QAAQ,OAAO;CACvE,MAAM,IAAI,UACR,WAAW,OAAO,SAAS,cAAc,KAAK,EAAE,iCAClD;AACF;AAEA,SAAS,gBACP,KACA,KACoB;CACpB,IAAI;EACF,OAAO,IAAI;CACb,QAAQ;EACN;CACF;AACF;;AAGA,SAAgB,kBAAkB,UAAoC,CAAC,GAAe;CACpF,MAAM,MAAM,QAAQ,OAAO,QAAQ;CACnC,MAAM,aAAa,mBAAmB,QAAQ,QAAQ,QAAQ;CAE9D,MAAM,YADa,mBAAmB,gBAAgB,KAAK,eAAe,GAAG,eAClD,KAAK,cAAc;CAC9C,MAAM,KAAK,QAAQ,gBAAgB,KAAK,IAAI,CAAC;CAC7C,MAAM,SAAS,cAAc,SAAU,KAAK,SAAS,WAAY;CACjE,MAAM,aAAa,QAAQ,cAAc,QAAQ,MAAM,UAAU;CACjE,MAAM,cAAc,QAAQ,eAAe,QAAQ,OAAO,UAAU;CACpE,MAAM,mBAAmB,QAAQ,oBAAoB,QAAQ,OAAO,UAAU;CAC9E,MAAM,YAAY,WAAW,YAAY,CAAC,gBAAgB,KAAK,UAAU;CACzE,OAAO;EACL;EACA,aAAa,WAAW,YAAY,CAAC,MAAM,cAAc;EACzD,OAAO;GAAE,QAAQ,aAAa;GAAa,QAAQ,aAAa;EAAiB;CACnF;AACF;AA6GA,SAAgB,YAAY,OAAgC;CAC1D,IAAI,MAAM,SAAS,WAAW,MAAM,SAAS,UAAU,MAAM,SAAS,OAAO,OAAO;CACpF,IAAI,MAAM,SAAS,SAAS,OAAO,MAAM;CACzC,OAAO;AACT;;AA4BA,SAAgB,kBAAkB,UAA8B,CAAC,GAAY;CAC3E,MAAM,SAAS,QAAQ,UAAU,QAAQ;CACzC,MAAM,SAAS,QAAQ,UAAU,QAAQ;CACzC,OAAO,EACL,MAAM,OAAO;EACX,IAAI;EACJ,IAAI;GACF,aAAa,KAAK,UAAU,cAAc,KAAK,CAAC;EAClD,QAAQ;GACN,aAAa,KAAK,UAAU;IAC1B,MAAM,MAAM;IACZ,oBAAoB;GACtB,CAAC;EACH;EACA,MAAM,OAAO,GAAG,WAAW;EAC3B,CAAC,YAAY,KAAK,MAAM,WAAW,SAAS,OAAA,CAAQ,MAAM,IAAI;CAChE,EACF;AACF;;AASA,SAAgB,iBAAiB,QAA6B;CAC5D,IAAI;CACJ,IAAI;CACJ,IAAI,SAAS;CAEb,SAAS,cAAc,OAAsB;EAC3C,IAAI,CAAC,QAAQ,UAAU;EACvB,SAAS;CACX;CAEA,SAAS,MAAM,WAA0B,eAAuC;EAC9E,MAAM,UAAU,UAAU,OAAO,UAAmB;GAClD,IAAI,eAAe,cAAc,KAAK;EACxC,CAAC;EACD,UAAU;EACV,QAAa,WAAW;GACtB,IAAI,YAAY,SAAS,UAAU,KAAA;EACrC,CAAC;EACD,OAAO,gBAAgB,UAAU;CACnC;CAEA,SAAS,QAAQ,OAAmB,eAA8C;EAChF,IAAI,SACF,OAAO,MACL,QAAQ,WAAW,OAAO,MAAM,KAAK,CAAC,GACtC,aACF;EACF,IAAI;GACF,MAAM,SAAS,OAAO,MAAM,KAAK;GACjC,IAAI,QAAQ,OAAO,MAAM,QAAQ,QAAQ,MAAM,GAAG,aAAa;EACjE,SAAS,OAAO;GACd,IAAI,eAAe,cAAc,KAAK;QACjC,OAAO,QAAQ,OAAO,KAAK;EAClC;CACF;CAQA,OAAO;EACL,SAAA,EANA,MAAM,OAAO;GACX,OAAO,QAAQ,OAAO,IAAI;EAC5B,EAIM;EACN,MAAM,aAAa,OAAO;GACxB,MAAM,QAAQ,OAAO,KAAK;EAC5B;EACA,MAAM,QAAQ;GACZ,MAAM;GACN,IAAI,QAAQ,MAAM;EACpB;CACF;AACF;;;AClQA,MAAM,iBAAgC;CACpC,KAAK;CACL,OAAO;EACL,OAAO;EACP,OAAO;EACP,MAAM;EACN,SAAS;EACT,OAAO;EACP,OAAO;EACP,MAAM;EACN,SAAS;EACT,OAAO;EACP,SAAS;EACT,YAAY;EACZ,QAAQ;EACR,MAAM;EACN,UAAU;CACZ;AACF;AAEA,MAAM,eAA8B;CAClC,KAAK;CACL,OAAO;EACL,OAAO;EACP,OAAO;EACP,MAAM;EACN,SAAS;EACT,OAAO;EACP,OAAO;EACP,MAAM;EACN,SAAS;EACT,OAAO;EACP,SAAS;EACT,YAAY;EACZ,QAAQ;EACR,MAAM;EACN,UAAU;CACZ;AACF;AAEA,MAAM,aAA4C;CAChD,OAAO;CACP,OAAO;CACP,MAAM;CACN,SAAS;CACT,OAAO;CACP,OAAO;EAAC;EAAS;EAAS;CAAM;CAChC,MAAM;CACN,SAAS;CACT,OAAO;CACP,SAAS;CACT,YAAY;CACZ,QAAQ;CACR,MAAM;CACN,UAAU;AACZ;AAUA,SAAS,cAAc,OAAwB;CAC7C,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI;EACF,OAAO,QAAQ,OAAO;GACpB,aAAa;GACb,QAAQ;GACR,SAAS;GACT,OAAO;GACP,QAAQ;EACV,CAAC;CACH,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,cAAc,YAAyD;CAC9E,MAAM,QAAkB,CAAC;CACzB,KAAK,MAAM,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,KAAK,GAAG;EAChD,MAAM,WAAW,KAAK,IAAI,IAAI,cAAc,WAAW,IAAI,IAAI,MAAM,IAAI;EACzE,MAAM,KAAK,SAAS,MAAM,EAAE;EAC5B,KAAK,MAAM,gBAAgB,SAAS,MAAM,CAAC,GAAG,MAAM,KAAK,OAAO,cAAc;CAChF;CACA,OAAO;AACT;AAEA,SAAS,SAAS,QAA6B;CAC7C,MAAM,WAAW,OAAO,SAAS,SAAS,IAAI,IAAI,OAAO,SAAS,KAAK,GAAG,EAAE,MAAM;CAClF,MAAM,UAAU,OAAO,QAAQ,MAAM,IAAI;CACzC,OAAO;EACL,GAAG,WAAW,QAAQ,MAAM;EAC5B,GAAG,QAAQ,MAAM,CAAC;EAClB,GAAG,cAAc,OAAO,UAAU;CACpC;AACF;AAEA,SAAS,WAAW,OAAqC;CACvD,MAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI;CACtC,MAAM,UAAmC,CAAC;CAC1C,IAAI,MAAM,UAAU,KAAA,GAAW,QAAQ,QAAQ,MAAM;CACrD,IAAI,MAAM,eAAe,KAAA,GAAW,OAAO,OAAO,SAAS,MAAM,UAAU;CAC3E,IAAI,MAAM,UAAU,KAAA,GAAW,QAAQ,QAAQ,MAAM;CACrD,OAAO,CAAC,GAAG,OAAO,GAAG,cAAc,OAAO,CAAC;AAC7C;AAEA,SAAS,WAAW,OAAiC;CACnD,IAAI,MAAM,SAAS,QAAQ,OAAO,MAAM;CACxC,OAAO,GAAG,KAAK,UAAU,cAAc,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE;AAC/D;AAEA,SAAS,UAAU,OAAmC;CACpD,IAAI,MAAM,SAAS,SAAS,OAAO;CACnC,IAAI,MAAM,SAAS,WAAW,OAAO;CACrC,IAAI,MAAM,SAAS,SAAS,OAAO;CACnC,IAAI,MAAM,SAAS,UAAU,OAAO,MAAM,OAAO,WAAW,cAAc,YAAY;CACtF,IAAI,MAAM,SAAS,QAAQ,OAAO,MAAM,UAAU,SAAS,aAAa;CACxE,OAAO,MAAM,OAAO,SAAS,YAAY,MAAM,OAAO,QAAQ,MAAM,OAAO;AAC7E;AAEA,SAAS,WAAW,OAAiC;CACnD,QAAQ,MAAM,MAAd;EACE,KAAK,SACH,OAAO,MAAM,KAAK,MAAM,IAAI;EAC9B,KAAK,WACH,OAAO,MAAM,QAAQ,MAAM,IAAI;EACjC,KAAK,SACH,OAAO,WAAW,MAAM,KAAK;EAC/B,KAAK,OACH,OAAO,SAAS,MAAM,MAAM;EAC9B,KAAK,UAAU;GACb,MAAM,EAAE,WAAW;GACnB,IAAI,OAAO,WAAW,aAAa;IACjC,MAAM,SACJ,OAAO,SAAS,YAAY,OAAO,SAAS,iBACvC,OAAO,QAAQ,MAAM,EAAE,YAAY,UAAU,OAAO,KAAK,CAAC,EAAE,SAAS,OAAO,QAC7E,OAAO,SAAS,YACd,OAAO,QACL,QACA,OACF,OAAO;IACf,OAAO,CAAC,GAAG,OAAO,QAAQ,IAAI,QAAQ;GACxC;GACA,MAAM,QAAQ,CAAC,OAAO,OAAO;GAC7B,IAAI,OAAO,SAAS,UAClB,KAAK,MAAM,UAAU,OAAO,SAC1B,MAAM,KACJ,GAAG,OAAO,WAAW,MAAM,IAAI,GAAG,OAAO,QAAQ,OAAO,OAAO,MAAM,OAAO,SAAS,IACvF;QAEG,IAAI,OAAO,SAAS,WACzB,MAAM,KACJ,GAAG,OAAO,QAAQ,QAAQ,OAAO,OAAO,iBAAiB,KAAA,IAAY,KAAK,cAAc,OAAO,eAAe,QAAQ,KAAK,IAC7H;QAEA,MAAM,KAAK,OAAO,UAAU,OAAO,cAAc,IAAI,OAAO,YAAY,KAAK,GAAG;GAElF,IAAI,OAAO,OAAO,MAAM,KAAK,OAAO,KAAK;GACzC,OAAO;EACT;EACA,KAAK,QAAQ;GACX,MAAM,QAAQ,CAAC,kBAAkB,MAAM,OAAO,CAAC;GAC/C,IAAI,MAAM,QAAQ,QAAQ,KAAA,GAAW,MAAM,KAAK,GAAG,cAAc,EAAE,KAAK,MAAM,QAAQ,IAAI,CAAC,CAAC;GAC5F,OAAO;EACT;CACF;AACF;AAEA,SAAS,SAAS,SAAkB,OAAkB,MAAsB;CAC1E,OAAO,UAAU,UAAU,OAAO,MAAM,EAAE,gBAAgB,MAAM,CAAC,IAAI;AACvE;AAEA,MAAM,oBAAoB,IAAI,KAAK,UAAU,KAAA,GAAW,EAAE,aAAa,WAAW,CAAC;AACnF,MAAM,oBAAoB;AAC1B,MAAM,gBAAgB;AACtB,MAAM,QAAQ;AAEd,SAAS,gBAAgB,WAA4B;CACnD,OACE,aAAa,SACZ,aAAa,QACZ,cAAc,QACd,cAAc,QACb,aAAa,SAAU,aAAa,SAAU,cAAc,SAC5D,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,UAAW,aAAa;AAE5C;AAOA,SAAS,iBAAiB,MAAc,SAA+C;CACrF,MAAM,QACJ,OAAO,UAAU,OAAO,KAAK,YAAY,KAAA,KAAa,UAAU,IAAI,UAAU,KAAA;CAChF,IAAI,MAAM;CACV,IAAI,SAAS;CACb,KAAK,MAAM,EAAE,aAAa,kBAAkB,QAAQ,yBAAyB,IAAI,CAAC,GAAG;EACnF,IAAI,YAAY,QAAQ,YAAY,QAAQ;GAC1C,OAAO;GACP,SAAS;GACT;EACF;EACA,IAAI,YAAY,MAAM;GACpB,SAAS;GACT;EACF;EACA,IAAI,kBAAkB,KAAK,OAAO,GAAG;EACrC,IAAI,QAAQ;EACZ,IAAI,YAAY,KACd,QAAQ,IAAK,SAAS;OACjB,IAAI,MAAM,KAAK,OAAO,KAAK,gBAAgB,QAAQ,YAAY,CAAC,CAAE,GACvE,QAAQ;OAER,KAAK,MAAM,SAAS,SAAS;GAC3B,MAAM,QAAQ,MAAM,YAAY,CAAC;GACjC,IAAI,QAAQ,MAAS,SAAS,OAAQ,QAAQ,KAAO;GACrD,IAAI,CAAC,cAAc,KAAK,KAAK,GAAG,SAAS;EAC3C;EAEF,IAAI,UAAU,GAAG;EACjB,IAAI,SAAS,SAAS,QAAQ,OAAO;GACnC,OAAO;GACP,SAAS;EACX;EACA,UAAU,QAAQ,KAAK,IAAI,OAAO,KAAK,IAAI;CAC7C;CACA,OAAO;EAAE;EAAK;CAAO;AACvB;AAEA,SAAS,aAAa,UAAkB,SAAqC;CAC3E,OAAO,iBAAiB,UAAU,OAAO,CAAC,CAAC,MAAM;AACnD;;AASA,SAAgB,oBAAoB,SAAwC;CAC1E,MAAM,SAAS,QAAQ,UAAU,QAAQ;CACzC,MAAM,SAAS,QAAQ,UAAU,QAAQ;CACzC,MAAM,UAAU,QAAQ,UAAU,iBAAiB;CACnD,MAAM,SACJ,OAAO,QAAQ,UAAU,YACrB;EAAE,QAAQ,QAAQ;EAAO,QAAQ,QAAQ;CAAM,IAC/C,QAAQ;CACd,IAAI;CAEJ,SAAS,mBAAmB,QAAiC,OAAwB;EACnF,MAAM,MAAM,SAAS,OAAO,QAAQ,QAAQ,GAAG;EAC/C,MAAM,UAAU,SAAyB,SAAS,OAAO,QAAQ,IAAI;EACrE,MAAM,SAAS,SAAyB,SAAS,OAAO,QAAQ,IAAI;EACpE,MAAM,QAAQ,OAAO,UAAU;EAC/B,MAAM,QAAQ;GACZ,GAAG,OAAO,QAAQ,MAAM,MAAM,EAAE,IAAI,OAAO;GAC3C,GAAG,IAAI,IAAI,QAAQ,OAAO,GAAG,IAAI,IAAI,GAAG,OAAO,SAAS,MAAM,OAAO,eAAe,EAAE,EAAE;GACxF;EACF;EACA,KAAK,MAAM,UAAU,OAAO,SAC1B,MAAM,KACJ,GAAG,IAAI,IAAI,OAAO,WAAW,OAAO,GAAG,IAAI,IAAI,GAAG,OAAO,WAAW,OAAO,OAAO,KAAK,IAAI,OAAO,QAAQ,OAAO,OAAO,IAAI,MAAM,KAAK,OAAO,MAAM,MAAM,IAC5J;EAEF,IAAI,OAAO,QAAQ,WAAW,GAC5B,MAAM,KAAK,GAAG,IAAI,MAAM,MAAM,uCAAuC,GAAG;EAE1E,MAAM,KAAK,GAAG;EACd,MAAM,KACJ,GAAG,IAAI,IAAI,MAAM,QAAQ,mDAAmD,6CAA6C,GAC3H;EACA,IAAI,OAAO,OAAO,MAAM,KAAK,GAAG,IAAI,IAAI,OAAO,OAAO;EACtD,OAAO,MAAM,KAAK,IAAI;CACxB;CAEA,SAAS,OAAO,OAA+B;EAC7C,MAAM,QAAQ,OAAO,YAAY,KAAK;EACtC,IACE,MAAM,SAAS,YACf,MAAM,OAAO,SAAS,kBACtB,MAAM,OAAO,WAAW,aAExB,OAAO,mBAAmB,MAAM,QAAQ,KAAK;EAE/C,MAAM,OAAO,UAAU,KAAK;EAC5B,MAAM,QAAQ,WAAW,KAAK;EAC9B,MAAM,cAAc,SAAS,OAAO,WAAW,OAAO,QAAQ,MAAM,KAAK;EACzE,MAAM,YAAY,SAAS,OAAO,QAAQ,QAAQ,GAAG;EACrD,OAAO,MACJ,KAAK,MAAM,UAAU,GAAG,UAAU,IAAI,cAAc,YAAY,OAAO,KAAK,SAAS,IAAI,CAAC,CAC1F,KAAK,IAAI;CACd;CAEA,SAAS,oBAA4B;EACnC,IAAI,CAAC,cAAc,OAAO;EAC1B,IAAI,aAAa,QAEf,OAAO,cADI,aAAa,OAAO,MAAM,IAAI,UAAU,aAAa,OAAO,IAAI,KAAK,GACxD;EAE1B,OAAO,iBAAqB,OAAO,aAAa,KAAK;CACvD;CAEA,SAAS,mBAA2B;EAClC,IAAI,CAAC,cAAc,OAAO;EAC1B,MAAM,EAAE,UAAU,OAAO,WAAW;EACpC,IAAI,CAAC,QAAQ,OAAO,GAAG,SAAS;EAChC,MAAM,KAAK,QAAQ,OAAO;EAC1B,OAAO,GAAG,SAAS,IAAI,KAAK,IAAI,UAAU,GAAG,KAAK,GAAG,SAAS,OAAO,SAAS,EAAE,aAAa,OAAO,UAAU,MAAM;CACtH;CAEA,SAAS,qBAA6B;EACpC,MAAM,UAAU,cAAc,SAAS,cAAgB;EACvD,eAAe,KAAA;EACf,OAAO;CACT;CAEA,OAAO,EACL,MAAM,OAAO;EACX,IAAI,MAAM,SAAS,UAAU;GAC3B,MAAM,QAAQ,kBAAkB;GAChC,MAAM,OAAO,WAAW,KAAK;GAC7B,OAAO,MAAM,GAAG,QAAQ,MAAM;GAC9B,IAAI,cAAc;IAEhB,MAAM,YAAY,aAAa,UAAU,QAAQ,CAAC,KAAK,SAAS,IAAI,IAAI,OAAO;IAC/E,OAAO,MAAM,GAAG,YAAY,iBAAiB,GAAG;GAClD;GACA;EACF;EACA,MAAM,WAAW,OAAO,KAAK;EAC7B,IAAI,MAAM,SAAS,UAAU;GAC3B,MAAM,QAAQ,kBAAkB;GAChC,IAAI,MAAM,OAAO,WAAW,UAAU;IACpC,MAAM,UAAU,mBAAmB;IACnC,IAAI,SAAS,SAAS,OAAO,MAAM,GAAG,QAAQ,SAAS;IACvD;GACF;GACA,IAAI,MAAM,OAAO,WAAW,aAAa;IACvC,MAAM,UAAU,mBAAmB;IACnC,OAAO,MAAM,GAAG,QAAQ,UAAU,SAAS,GAAG;IAC9C;GACF;GACA,MAAM,UACJ,cAAc,UAAU,MAAM,OAAO,SAAS,iBAAiB,cAAgB;GACjF,eAAe;IAAE;IAAU,OAAO,aAAa,UAAU,OAAO,OAAO;GAAE;GACzE,IAAI,MAAM,OAAO,SAAS,gBAAgB;IACxC,MAAM,EAAE,WAAW;IACnB,MAAM,SAAS,iBACb,GAAG,QAAQ,MAAM,OAAO,IAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI,MAAM,OAAO,SACxE,OAAO,OACT;IAEA,IAAI,OAAO,WAAW,OAAO,SAAS;KACpC,OAAO,OAAO;KACd,OAAO,SAAS;IAClB;IACA,aAAa,SAAS;KAAE,GAAG;KAAQ,SAAS,OAAO,UAAU;IAAQ;GACvE;GACA,OAAO,MAAM,GAAG,QAAQ,UAAU,iBAAiB,GAAG;GACtD;EACF;EAEA,MAAM,QAAQ,kBAAkB;EAChC,IAAI,CAAC,cAAc;GACjB,CAAC,YAAY,KAAK,MAAM,WAAW,SAAS,OAAA,CAAQ,MAAM,GAAG,SAAS,GAAG;GACzE;EACF;EAEA,MAAM,UAAU,MAAM,SAAS,UAAU,mBAAmB,IAAI;EAChE,OAAO,MAAM,GAAG,QAAQ,SAAS;EACjC,CAAC,YAAY,KAAK,MAAM,WAAW,SAAS,OAAA,CAAQ,MAAM,GAAG,SAAS,GAAG;EACzE,IAAI,cAAc,OAAO,MAAM,iBAAiB,CAAC;CACnD,EACF;AACF"}
@@ -1,4 +1,4 @@
1
- import { $ as HackshErrorSummary, A as SelectPromptState, B as UsageArgumentSummary, C as PrintStream, D as PromptState, E as PromptPrintEvent, F as UsagePrintEvent, H as UsageOptionSummary, I as VersionPrintEvent, J as LogLevel, L as createJsonPrinter, M as TerminalInput, N as TerminalOutput, O as PromptStatus, P as TextPromptState, Q as HackshErrorKind, R as resolveOutputMode, S as PrintEvent, T as PromptChoiceState, U as UsageSummary, V as UsageCommandSummary, X as LogRecord, Y as LogProperties, _ as OutputFormat, b as OutputPrintEvent, f as ConfirmPromptState, g as LogPrintEvent, h as JsonPrinterOptions, j as StreamColors, k as ResolveOutputModeOptions, lt as ValidationIssueSummary, m as ExecPrintEvent, p as ErrorPrintEvent, q as LogKind, v as OutputMode, w as Printer, x as OutputWriter, y as OutputPreference } from "./command-B-Ok_6KW.js";
1
+ import { A as PromptStatus, B as resolveOutputMode, C as OutputWriter, D as PromptChoiceState, E as Printer, F as TerminalOutput, G as UsageSummary, H as UsageArgumentSummary, I as TextPromptState, L as UsagePrintEvent, M as SelectPromptState, N as StreamColors, O as PromptPrintEvent, P as TerminalInput, Q as LogRecord, R as VersionPrintEvent, S as OutputPrintEvent, T as PrintStream, U as UsageCommandSummary, W as UsageOptionSummary, X as LogLevel, Y as LogKind, Z as LogProperties, _ as JsonPrinterOptions, b as OutputMode, ft as ValidationIssueSummary, g as ExecPrintEvent, h as ErrorPrintEvent, j as ResolveOutputModeOptions, k as PromptState, m as ConfirmPromptState, nt as HackshErrorSummary, p as AutocompletePromptState, tt as HackshErrorKind, v as LogPrintEvent, w as PrintEvent, x as OutputPreference, y as OutputFormat, z as createJsonPrinter } from "./command-Czf4qXhe.js";
2
2
  //#region src/pretty.d.ts
3
3
  interface PrettyPrinterOptions {
4
4
  /** One flag for both streams, or a flag per stream. */
@@ -10,5 +10,5 @@ interface PrettyPrinterOptions {
10
10
  /** Create the fixed human-readable renderer used for pretty output. */
11
11
  declare function createPrettyPrinter(options: PrettyPrinterOptions): Printer;
12
12
  //#endregion
13
- export { type ConfirmPromptState, type ErrorPrintEvent, type ExecPrintEvent, type HackshErrorKind, type HackshErrorSummary, type JsonPrinterOptions, type LogKind, type LogLevel, type LogPrintEvent, type LogProperties, type LogRecord, type OutputFormat, type OutputMode, type OutputPreference, type OutputPrintEvent, type OutputWriter, type PrettyPrinterOptions, type PrintEvent, type PrintStream, type Printer, type PromptChoiceState, type PromptPrintEvent, type PromptState, type PromptStatus, type ResolveOutputModeOptions, type SelectPromptState, type StreamColors, type TerminalInput, type TerminalOutput, type TextPromptState, type UsageArgumentSummary, type UsageCommandSummary, type UsageOptionSummary, type UsagePrintEvent, type UsageSummary, type ValidationIssueSummary, type VersionPrintEvent, createJsonPrinter, createPrettyPrinter, resolveOutputMode };
13
+ export { type AutocompletePromptState, type ConfirmPromptState, type ErrorPrintEvent, type ExecPrintEvent, type HackshErrorKind, type HackshErrorSummary, type JsonPrinterOptions, type LogKind, type LogLevel, type LogPrintEvent, type LogProperties, type LogRecord, type OutputFormat, type OutputMode, type OutputPreference, type OutputPrintEvent, type OutputWriter, type PrettyPrinterOptions, type PrintEvent, type PrintStream, type Printer, type PromptChoiceState, type PromptPrintEvent, type PromptState, type PromptStatus, type ResolveOutputModeOptions, type SelectPromptState, type StreamColors, type TerminalInput, type TerminalOutput, type TextPromptState, type UsageArgumentSummary, type UsageCommandSummary, type UsageOptionSummary, type UsagePrintEvent, type UsageSummary, type ValidationIssueSummary, type VersionPrintEvent, createJsonPrinter, createPrettyPrinter, resolveOutputMode };
14
14
  //# sourceMappingURL=printer-api.d.ts.map
@@ -1,2 +1,2 @@
1
- import { i as resolveOutputMode, n as createJsonPrinter, t as createPrettyPrinter } from "./pretty-DJ2CE6TU.js";
1
+ import { i as resolveOutputMode, n as createJsonPrinter, t as createPrettyPrinter } from "./pretty-BjzGnVLM.js";
2
2
  export { createJsonPrinter, createPrettyPrinter, resolveOutputMode };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hacksh",
3
- "version": "0.16.0",
3
+ "version": "0.18.0",
4
4
  "description": "Type-safe command-line interfaces powered by Zod 4 schemas.",
5
5
  "keywords": [
6
6
  "cli",
@@ -36,6 +36,8 @@
36
36
  "devDependencies": {
37
37
  "@types/node": "^24",
38
38
  "@vitest/coverage-v8": "4.1.10",
39
+ "@xterm/headless": "^6.0.0",
40
+ "node-pty": "1.0.0",
39
41
  "typescript": "^7.0.2",
40
42
  "vite": "npm:@voidzero-dev/vite-plus-core@0.2.8",
41
43
  "vite-plus": "0.2.8",