brass-runtime 1.16.0 → 1.16.1

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.
Files changed (210) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +283 -18
  3. package/dist/agent/cli/main.cjs +38 -38
  4. package/dist/agent/cli/main.js +6 -6
  5. package/dist/agent/cli/main.mjs +6 -6
  6. package/dist/agent/index.cjs +7 -7
  7. package/dist/agent/index.d.ts +1 -1
  8. package/dist/agent/index.js +6 -6
  9. package/dist/agent/index.mjs +6 -6
  10. package/dist/chunk-2HQTDLHF.mjs +683 -0
  11. package/dist/chunk-36I3M4UC.mjs +370 -0
  12. package/dist/{chunk-QY5FKYEQ.js → chunk-3AYM6WPJ.js} +570 -51
  13. package/dist/chunk-3LOYJFRR.cjs +300 -0
  14. package/dist/chunk-3Y2RIUMM.js +300 -0
  15. package/dist/{chunk-N6VHMOWB.cjs → chunk-4ROBZFL6.cjs} +128 -128
  16. package/dist/{chunk-NC5SDRYE.js → chunk-52OB2ROS.js} +4 -4
  17. package/dist/{chunk-JX3LZQJH.cjs → chunk-52PPNNI4.cjs} +82 -20
  18. package/dist/{chunk-5YOQOXEQ.cjs → chunk-5EC274J5.cjs} +676 -293
  19. package/dist/chunk-5QC7LRZ3.js +229 -0
  20. package/dist/{chunk-7TL2LHQJ.js → chunk-5VRJNBLZ.mjs} +524 -141
  21. package/dist/chunk-62AZW6UT.cjs +313 -0
  22. package/dist/chunk-6IXXWIUM.js +683 -0
  23. package/dist/chunk-74ZTY6CP.js +2871 -0
  24. package/dist/chunk-76YMRMH2.cjs +777 -0
  25. package/dist/chunk-7CMJS3QE.mjs +2871 -0
  26. package/dist/{chunk-2WC63LJK.mjs → chunk-7JIJOVCT.js} +20 -10
  27. package/dist/{chunk-FM4W4QPL.js → chunk-A2OM6NEH.mjs} +5 -4
  28. package/dist/chunk-AGR5B2BC.cjs +683 -0
  29. package/dist/chunk-AVNQLJ5V.js +777 -0
  30. package/dist/chunk-B33ICAKP.js +313 -0
  31. package/dist/{chunk-J3H54ZRV.mjs → chunk-B5JD23U7.mjs} +1 -1
  32. package/dist/chunk-BABBZK4Y.js +2024 -0
  33. package/dist/{chunk-U5KWK3PX.mjs → chunk-C3MDXTRZ.js} +11 -0
  34. package/dist/{chunk-F5EUMJL7.mjs → chunk-CIZFIMK5.js} +55 -5
  35. package/dist/{chunk-SPUEME2B.cjs → chunk-CZIVE6NT.cjs} +12 -1
  36. package/dist/{chunk-TDVMADDN.js → chunk-DNFJLJMW.mjs} +11 -0
  37. package/dist/chunk-DNFO2EIZ.mjs +777 -0
  38. package/dist/{chunk-XDZOO4L5.js → chunk-EJ6BPYVR.mjs} +79 -17
  39. package/dist/{chunk-JNFRRJYH.cjs → chunk-ENKODRU3.cjs} +242 -192
  40. package/dist/chunk-EOC4UHBS.mjs +229 -0
  41. package/dist/{chunk-7LVI2GIN.js → chunk-FH2X7BVP.js} +507 -72
  42. package/dist/{chunk-OOGJ73B6.js → chunk-FHQGHPMO.mjs} +20 -10
  43. package/dist/{chunk-WQ5QNU5R.cjs → chunk-GLE2WY7Z.cjs} +652 -217
  44. package/dist/{chunk-G6IQOE4P.mjs → chunk-GYM3LLGS.mjs} +507 -72
  45. package/dist/chunk-HLWLMW2F.mjs +2024 -0
  46. package/dist/{chunk-TVN5I4U6.cjs → chunk-JF5WGYJJ.cjs} +25 -24
  47. package/dist/{chunk-CY33PGEX.mjs → chunk-KH4SYAOS.mjs} +570 -51
  48. package/dist/chunk-KN32XNTH.mjs +313 -0
  49. package/dist/chunk-KQLYONSE.cjs +2871 -0
  50. package/dist/{chunk-7HUOJA4W.cjs → chunk-KZJQ723N.cjs} +90 -80
  51. package/dist/{chunk-CCKHV5BT.mjs → chunk-L2SYFEBS.js} +5 -4
  52. package/dist/{chunk-IJT6RRQ5.cjs → chunk-L6VB5N7Q.cjs} +20 -9
  53. package/dist/{chunk-ZGLD4TVZ.mjs → chunk-MBEJI5HF.mjs} +4 -4
  54. package/dist/{chunk-PRWCB3QL.mjs → chunk-MIIYDLGM.js} +524 -141
  55. package/dist/{chunk-H55LI6WY.js → chunk-MOO4L7F4.mjs} +15 -4
  56. package/dist/{chunk-7XOPAB5Q.js → chunk-MT3OWDPC.mjs} +55 -5
  57. package/dist/chunk-MVGUEJ5Z.cjs +370 -0
  58. package/dist/chunk-PD4EJTQC.cjs +229 -0
  59. package/dist/chunk-PWC3RBQE.mjs +300 -0
  60. package/dist/{chunk-MWXMNYJS.cjs → chunk-Q2I37RP3.cjs} +643 -124
  61. package/dist/{chunk-VFIUZG7J.mjs → chunk-RKGKFN2A.js} +79 -17
  62. package/dist/{chunk-NYL4D7SK.cjs → chunk-SA6HUJVI.cjs} +5 -5
  63. package/dist/{chunk-K2T3DV26.mjs → chunk-TRM4JUZQ.js} +15 -4
  64. package/dist/chunk-UB4B6OFY.js +370 -0
  65. package/dist/{chunk-G3XGCZDQ.js → chunk-UCUBNWM2.js} +1 -1
  66. package/dist/chunk-VN44DYYT.cjs +2024 -0
  67. package/dist/{client-CtFmoDvM.d.ts → client-CZHU674n.d.ts} +211 -36
  68. package/dist/core/index.cjs +135 -9
  69. package/dist/core/index.d.ts +238 -33
  70. package/dist/core/index.js +155 -29
  71. package/dist/core/index.mjs +155 -29
  72. package/dist/{effect-CGNl5Rqp.d.ts → effect-DIUHZ9IN.d.ts} +89 -1
  73. package/dist/effectRunner-CFLC32IK.cjs +8 -0
  74. package/dist/{effectRunner-A4CHJXJI.js → effectRunner-L4S7IPT3.js} +2 -2
  75. package/dist/{effectRunner-OPUF6QRN.mjs → effectRunner-NNGG75QA.mjs} +2 -2
  76. package/dist/http/index.cjs +324 -2986
  77. package/dist/http/index.d.ts +54 -68
  78. package/dist/http/index.js +238 -2900
  79. package/dist/http/index.mjs +238 -2900
  80. package/dist/http/testing.cjs +14 -12
  81. package/dist/http/testing.d.ts +5 -4
  82. package/dist/http/testing.js +10 -8
  83. package/dist/http/testing.mjs +10 -8
  84. package/dist/index.cjs +423 -255
  85. package/dist/index.d.ts +87 -69
  86. package/dist/index.js +301 -133
  87. package/dist/index.mjs +301 -133
  88. package/dist/observability/index.cjs +16 -531
  89. package/dist/observability/index.d.ts +81 -8
  90. package/dist/observability/index.js +23 -538
  91. package/dist/observability/index.mjs +23 -538
  92. package/dist/perf/cli.cjs +401 -0
  93. package/dist/perf/cli.d.ts +1 -0
  94. package/dist/perf/cli.js +401 -0
  95. package/dist/perf/cli.mjs +401 -0
  96. package/dist/perf/index.cjs +141 -0
  97. package/dist/perf/index.d.ts +483 -0
  98. package/dist/perf/index.js +141 -0
  99. package/dist/perf/index.mjs +141 -0
  100. package/dist/schedule-CK3Ml_7p.d.ts +259 -0
  101. package/dist/schema/index.cjs +6 -2
  102. package/dist/schema/index.d.ts +3 -1
  103. package/dist/schema/index.js +5 -1
  104. package/dist/schema/index.mjs +5 -1
  105. package/dist/{server-C8hDXA74.d.ts → server-GJPg8ZSG.d.ts} +4 -3
  106. package/dist/{stream-dvSs0QS5.d.ts → stream-B4oK9JFP.d.ts} +1 -1
  107. package/dist/{tracer-B5tRH9H7.d.ts → tracer-Hwt1cl7h.d.ts} +13 -54
  108. package/dist/{tracing-Dt9S_6V8.d.ts → tracing-DqbTKGcf.d.ts} +1 -1
  109. package/docs/ARCHITECTURE.md +292 -0
  110. package/docs/README.md +63 -0
  111. package/docs/adr/0001-ai-context-pack.md +32 -0
  112. package/docs/agent-apply-mode.md +104 -0
  113. package/docs/agent-approvals.md +110 -0
  114. package/docs/agent-batch.md +185 -0
  115. package/docs/agent-boundaries.md +112 -0
  116. package/docs/agent-chat-sessions.md +160 -0
  117. package/docs/agent-ci.md +17 -0
  118. package/docs/agent-cli.md +405 -0
  119. package/docs/agent-config.md +480 -0
  120. package/docs/agent-context-discovery.md +159 -0
  121. package/docs/agent-copilot-like-dx.md +126 -0
  122. package/docs/agent-declarative-optimized-planning.md +138 -0
  123. package/docs/agent-dx.md +224 -0
  124. package/docs/agent-env-files.md +126 -0
  125. package/docs/agent-follow-up-context.md +43 -0
  126. package/docs/agent-global-usage.md +180 -0
  127. package/docs/agent-init.md +109 -0
  128. package/docs/agent-install-and-configure.md +516 -0
  129. package/docs/agent-language-workspace-ux.md +99 -0
  130. package/docs/agent-llm-adapters.md +123 -0
  131. package/docs/agent-local-install.md +190 -0
  132. package/docs/agent-local-tests.md +51 -0
  133. package/docs/agent-observability.md +155 -0
  134. package/docs/agent-patch-quality-loop.md +162 -0
  135. package/docs/agent-presets.md +22 -0
  136. package/docs/agent-project-commands.md +237 -0
  137. package/docs/agent-project-intelligence.md +156 -0
  138. package/docs/agent-redaction.md +18 -0
  139. package/docs/agent-release-readiness.md +76 -0
  140. package/docs/agent-rollback-safety.md +162 -0
  141. package/docs/agent-rollback.md +23 -0
  142. package/docs/agent-run-artifacts.md +16 -0
  143. package/docs/agent-vscode-auto-discovery.md +137 -0
  144. package/docs/agent-vscode-batch-runner.md +100 -0
  145. package/docs/agent-vscode-chat-layout.md +90 -0
  146. package/docs/agent-vscode-clean-install.md +147 -0
  147. package/docs/agent-vscode-code-actions.md +70 -0
  148. package/docs/agent-vscode-diff-preview.md +45 -0
  149. package/docs/agent-vscode-inline-assist.md +56 -0
  150. package/docs/agent-vscode-install.md +186 -0
  151. package/docs/agent-vscode-model-setup.md +97 -0
  152. package/docs/agent-vscode-patch-preview.md +92 -0
  153. package/docs/agent-vscode-problems.md +79 -0
  154. package/docs/agent-vscode-project-dashboard.md +106 -0
  155. package/docs/agent-vscode-run-history.md +92 -0
  156. package/docs/agent-vscode-ux.md +73 -0
  157. package/docs/ai/INVARIANTS.md +84 -0
  158. package/docs/ai/PROJECT_MAP.md +338 -0
  159. package/docs/ai/PUBLIC_API.md +336 -0
  160. package/docs/ai/VALIDATION_MATRIX.md +67 -0
  161. package/docs/api-polish.md +37 -0
  162. package/docs/cancellation.md +162 -0
  163. package/docs/coverage.md +46 -0
  164. package/docs/getting-started.md +159 -0
  165. package/docs/guides/README.md +40 -0
  166. package/docs/guides/circuit-breaker.md +89 -0
  167. package/docs/guides/error-handling.md +91 -0
  168. package/docs/guides/getting-started.md +107 -0
  169. package/docs/guides/layers.md +189 -0
  170. package/docs/guides/metrics.md +101 -0
  171. package/docs/guides/resource-management.md +141 -0
  172. package/docs/guides/retry.md +215 -0
  173. package/docs/guides/semaphore.md +66 -0
  174. package/docs/guides/streams.md +117 -0
  175. package/docs/guides/supervisors.md +98 -0
  176. package/docs/guides/testing.md +162 -0
  177. package/docs/guides/tracing.md +71 -0
  178. package/docs/http-recipes.md +399 -0
  179. package/docs/http.md +749 -0
  180. package/docs/modules.md +285 -0
  181. package/docs/observability-collector-smoke.md +31 -0
  182. package/docs/observability-framework-examples.md +98 -0
  183. package/docs/observability.md +542 -0
  184. package/docs/otel-collector-smoke.yaml +27 -0
  185. package/docs/performance-profiler.md +199 -0
  186. package/docs/production-readiness.md +73 -0
  187. package/docs/recipes/README.md +12 -0
  188. package/docs/recipes/http-server.md +45 -0
  189. package/docs/recipes/layers.md +44 -0
  190. package/docs/recipes/performance.md +47 -0
  191. package/docs/recipes/runtime.md +41 -0
  192. package/docs/recipes/testing.md +41 -0
  193. package/docs/release.md +53 -0
  194. package/docs/wasm-bounded-queues.md +44 -0
  195. package/docs/wasm-engine-observability-benchmarks.md +85 -0
  196. package/docs/wasm-fiber-engine.md +117 -0
  197. package/docs/wasm-scheduler-state-machine.md +122 -0
  198. package/docs/wasm-stream-chunks.md +54 -0
  199. package/package.json +22 -2
  200. package/dist/chunk-45F7OKGT.cjs +0 -104
  201. package/dist/chunk-7V4KY4RL.mjs +0 -104
  202. package/dist/chunk-DJQ7OMMB.cjs +0 -144
  203. package/dist/chunk-GOV47PPB.mjs +0 -552
  204. package/dist/chunk-JF4XXPZ5.cjs +0 -552
  205. package/dist/chunk-KCPT2D6G.js +0 -552
  206. package/dist/chunk-NOYZIMUJ.mjs +0 -144
  207. package/dist/chunk-PNVFW245.js +0 -144
  208. package/dist/chunk-ROJC3NBJ.js +0 -104
  209. package/dist/effectRunner-3ZHAD3LE.cjs +0 -8
  210. package/dist/schedule-Fque9Abz.d.ts +0 -70
@@ -18,6 +18,15 @@ var ConfigValidationError = class extends Error {
18
18
  this.issues = issues;
19
19
  }
20
20
  };
21
+ function isConfigValidationError(error) {
22
+ return error instanceof ConfigValidationError || typeof error === "object" && error !== null && error._tag === "ConfigValidationError" && typeof error.configName === "string" && Array.isArray(error.issues);
23
+ }
24
+ function formatConfigError(error) {
25
+ if (!isConfigValidationError(error)) {
26
+ return error instanceof Error ? error.message : String(error);
27
+ }
28
+ return `${error.configName} failed validation: ${formatIssues(error.issues)}`;
29
+ }
21
30
  var ok = (data) => ({ success: true, data });
22
31
  var fail = (issues) => ({ success: false, issues });
23
32
  var receivedKind = (value) => {
@@ -332,6 +341,8 @@ function parseConfig(configName, validator, value) {
332
341
  export {
333
342
  SchemaValidationException,
334
343
  ConfigValidationError,
344
+ isConfigValidationError,
345
+ formatConfigError,
335
346
  makeSchemaIssue,
336
347
  formatIssues,
337
348
  schema,
@@ -2,25 +2,25 @@ import {
2
2
  EventBus,
3
3
  InMemoryTracer,
4
4
  makeMetrics
5
- } from "./chunk-VFIUZG7J.mjs";
5
+ } from "./chunk-RKGKFN2A.js";
6
6
  import {
7
7
  Runtime,
8
8
  ctxExtend,
9
9
  ctxToObject,
10
10
  emptyContext,
11
11
  getCurrentFiber
12
- } from "./chunk-G6IQOE4P.mjs";
12
+ } from "./chunk-FH2X7BVP.js";
13
13
  import {
14
14
  asyncFail,
15
15
  asyncFlatMap,
16
16
  asyncFold,
17
17
  asyncSucceed,
18
18
  asyncSync
19
- } from "./chunk-NOYZIMUJ.mjs";
19
+ } from "./chunk-UB4B6OFY.js";
20
20
  import {
21
21
  Schema,
22
22
  parseConfig
23
- } from "./chunk-U5KWK3PX.mjs";
23
+ } from "./chunk-C3MDXTRZ.js";
24
24
 
25
25
  // src/observability/health.ts
26
26
  function snapshotRuntimeHealth(options = {}) {
@@ -1462,6 +1462,7 @@ var object = Schema.custom(
1462
1462
  );
1463
1463
  var falseOrObject = Schema.union([Schema.literal(false), object]);
1464
1464
  var ratio = Schema.number({ min: 0, max: 1 });
1465
+ var logLevel = Schema.enum(["debug", "info", "warn", "error"]);
1465
1466
  var retryOptions = Schema.object({
1466
1467
  attempts: Schema.number({ min: 0, int: true }).optional(),
1467
1468
  initialDelayMs: Schema.number({ min: 0, int: true }).optional(),
@@ -1523,9 +1524,49 @@ var observabilityOptions = Schema.object({
1523
1524
  childName: fn.optional(),
1524
1525
  onFlushError: fn.optional()
1525
1526
  }, { unknownKeys: "passthrough" });
1527
+ var httpObservabilityOptions = Schema.object({
1528
+ metrics: falseOrObject.optional(),
1529
+ logs: Schema.union([
1530
+ Schema.literal(false),
1531
+ Schema.object({
1532
+ requestLevel: Schema.union([logLevel, Schema.literal(false)]).optional(),
1533
+ responseLevel: Schema.union([logLevel, Schema.literal(false)]).optional(),
1534
+ errorLevel: Schema.union([logLevel, Schema.literal(false)]).optional()
1535
+ }, { unknownKeys: "passthrough" })
1536
+ ]).optional(),
1537
+ spans: Schema.union([
1538
+ Schema.literal(false),
1539
+ Schema.object({
1540
+ name: Schema.union([Schema.string({ minLength: 1 }), fn]).optional(),
1541
+ attributes: Schema.union([object, fn]).optional()
1542
+ }, { unknownKeys: "passthrough" })
1543
+ ]).optional(),
1544
+ adaptiveLimiter: Schema.union([
1545
+ Schema.boolean(),
1546
+ Schema.object({
1547
+ enabled: Schema.boolean().optional(),
1548
+ includeKeyLabel: Schema.boolean().optional()
1549
+ }, { unknownKeys: "passthrough" })
1550
+ ]).optional(),
1551
+ policy: Schema.union([
1552
+ Schema.boolean(),
1553
+ Schema.object({
1554
+ enabled: Schema.boolean().optional(),
1555
+ labelKeys: Schema.array(Schema.enum(["preset", "lane", "poolKey", "dedupKey", "priority", "retry"])).optional()
1556
+ }, { unknownKeys: "passthrough" })
1557
+ ]).optional(),
1558
+ injectTraceHeaders: Schema.boolean().optional(),
1559
+ includeHostLabel: Schema.boolean().optional(),
1560
+ route: Schema.union([Schema.string({ minLength: 1 }), fn]).optional(),
1561
+ clock: fn.optional(),
1562
+ durationBuckets: Schema.array(Schema.number({ min: 0 }).refine((n) => n > 0, "duration bucket must be > 0")).optional()
1563
+ }, { unknownKeys: "passthrough" });
1526
1564
  function validateObservabilityOptions(options) {
1527
1565
  parseConfig("ObservabilityOptions", observabilityOptions, options);
1528
1566
  }
1567
+ function validateHttpObservabilityOptions(options) {
1568
+ parseConfig("HttpObservabilityOptions", httpObservabilityOptions, options);
1569
+ }
1529
1570
 
1530
1571
  // src/observability/setup.ts
1531
1572
  function makeObservability(options = {}) {
@@ -1861,12 +1902,13 @@ function makeRuntimeTraceIdGenerator() {
1861
1902
  newSpanId: () => randomHexId(16)
1862
1903
  };
1863
1904
  }
1905
+ var HEX_BYTE = Array.from({ length: 256 }, (_, byte) => byte.toString(16).padStart(2, "0"));
1864
1906
  function randomHexId(length) {
1865
1907
  const cryptoLike = globalThis.crypto;
1866
1908
  if (typeof cryptoLike?.getRandomValues === "function") {
1867
1909
  const bytes = new Uint8Array(Math.ceil(length / 2));
1868
1910
  cryptoLike.getRandomValues(bytes);
1869
- return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("").slice(0, length);
1911
+ return bytesToHex(bytes, length);
1870
1912
  }
1871
1913
  if (typeof cryptoLike?.randomUUID === "function") {
1872
1914
  const hex = cryptoLike.randomUUID().replace(/-/g, "");
@@ -1878,6 +1920,13 @@ function randomHexId(length) {
1878
1920
  }
1879
1921
  return out.slice(0, length);
1880
1922
  }
1923
+ function bytesToHex(bytes, length) {
1924
+ let out = "";
1925
+ for (let i = 0; i < bytes.length; i++) {
1926
+ out += HEX_BYTE[bytes[i]];
1927
+ }
1928
+ return out.length === length ? out : out.slice(0, length);
1929
+ }
1881
1930
 
1882
1931
  // src/observability/request.ts
1883
1932
  function makeRequestObservabilityContext(observability, input = {}) {
@@ -2134,6 +2183,7 @@ export {
2134
2183
  makeCardinalityLimitedMetrics,
2135
2184
  normalizeHttpRoute,
2136
2185
  sanitizeHttpTarget,
2186
+ validateHttpObservabilityOptions,
2137
2187
  makeObservability,
2138
2188
  resolveRequestTraceSeed,
2139
2189
  resolveRequestBaggage,
@@ -18,6 +18,15 @@ var ConfigValidationError = (_class = class extends Error {
18
18
  this.issues = issues;
19
19
  }
20
20
  }, _class);
21
+ function isConfigValidationError(error) {
22
+ return error instanceof ConfigValidationError || typeof error === "object" && error !== null && error._tag === "ConfigValidationError" && typeof error.configName === "string" && Array.isArray(error.issues);
23
+ }
24
+ function formatConfigError(error) {
25
+ if (!isConfigValidationError(error)) {
26
+ return error instanceof Error ? error.message : String(error);
27
+ }
28
+ return `${error.configName} failed validation: ${formatIssues(error.issues)}`;
29
+ }
21
30
  var ok = (data) => ({ success: true, data });
22
31
  var fail = (issues) => ({ success: false, issues });
23
32
  var receivedKind = (value) => {
@@ -340,4 +349,6 @@ function parseConfig(configName, validator, value) {
340
349
 
341
350
 
342
351
 
343
- exports.SchemaValidationException = SchemaValidationException; exports.ConfigValidationError = ConfigValidationError; exports.makeSchemaIssue = makeSchemaIssue; exports.formatIssues = formatIssues; exports.schema = schema; exports.s = s; exports.Schema = Schema; exports.isSchema = isSchema; exports.validateValue = validateValue; exports.parseConfig = parseConfig;
352
+
353
+
354
+ exports.SchemaValidationException = SchemaValidationException; exports.ConfigValidationError = ConfigValidationError; exports.isConfigValidationError = isConfigValidationError; exports.formatConfigError = formatConfigError; exports.makeSchemaIssue = makeSchemaIssue; exports.formatIssues = formatIssues; exports.schema = schema; exports.s = s; exports.Schema = Schema; exports.isSchema = isSchema; exports.validateValue = validateValue; exports.parseConfig = parseConfig;
@@ -18,6 +18,15 @@ var ConfigValidationError = class extends Error {
18
18
  this.issues = issues;
19
19
  }
20
20
  };
21
+ function isConfigValidationError(error) {
22
+ return error instanceof ConfigValidationError || typeof error === "object" && error !== null && error._tag === "ConfigValidationError" && typeof error.configName === "string" && Array.isArray(error.issues);
23
+ }
24
+ function formatConfigError(error) {
25
+ if (!isConfigValidationError(error)) {
26
+ return error instanceof Error ? error.message : String(error);
27
+ }
28
+ return `${error.configName} failed validation: ${formatIssues(error.issues)}`;
29
+ }
21
30
  var ok = (data) => ({ success: true, data });
22
31
  var fail = (issues) => ({ success: false, issues });
23
32
  var receivedKind = (value) => {
@@ -332,6 +341,8 @@ function parseConfig(configName, validator, value) {
332
341
  export {
333
342
  SchemaValidationException,
334
343
  ConfigValidationError,
344
+ isConfigValidationError,
345
+ formatConfigError,
335
346
  makeSchemaIssue,
336
347
  formatIssues,
337
348
  schema,