@openclaw/voice-call 2026.8.1-beta.3 → 2026.9.1-beta.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 (137) hide show
  1. package/dist/doctor-contract-api.js +4 -1
  2. package/dist/{guarded-json-api-j4OEG0fR.js → guarded-json-api-BmMfqKzQ.js} +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/{plivo-BbVnahnQ.js → plivo-CNPyQgvw.js} +2 -2
  5. package/dist/{realtime-handler-BaMEKbmJ.js → realtime-handler-DYTBiNVr.js} +1 -1
  6. package/dist/{response-generator-tjyX4tDq.js → response-generator-BCm6S1G6.js} +1 -1
  7. package/dist/{runtime-entry-DK8kPCGC.js → runtime-entry-ptAKgGER.js} +17 -38
  8. package/dist/runtime-entry.js +1 -1
  9. package/dist/{telnyx-DO8dFQcb.js → telnyx-DWpKHVeV.js} +1 -1
  10. package/dist/{twilio-JDt_1nlz.js → twilio-DUIVX0Eb.js} +2 -2
  11. package/node_modules/typebox/build/format/date.d.mts +1 -1
  12. package/node_modules/typebox/build/format/date.mjs +1 -1
  13. package/node_modules/typebox/build/format/date_time.d.mts +2 -2
  14. package/node_modules/typebox/build/format/date_time.mjs +3 -3
  15. package/node_modules/typebox/build/format/email.d.mts +1 -1
  16. package/node_modules/typebox/build/format/email.mjs +2 -2
  17. package/node_modules/typebox/build/format/hostname.mjs +2 -10
  18. package/node_modules/typebox/build/format/idn_email.d.mts +1 -1
  19. package/node_modules/typebox/build/format/idn_email.mjs +3 -3
  20. package/node_modules/typebox/build/format/idn_hostname.d.mts +1 -0
  21. package/node_modules/typebox/build/format/idn_hostname.mjs +3 -11
  22. package/node_modules/typebox/build/format/idna/format/bidi.d.mts +3 -0
  23. package/node_modules/typebox/build/format/idna/format/bidi.mjs +98 -0
  24. package/node_modules/typebox/build/format/idna/format/puny.d.mts +3 -0
  25. package/node_modules/typebox/build/format/idna/format/puny.mjs +144 -0
  26. package/node_modules/typebox/build/format/idna/hostname.d.mts +1 -0
  27. package/node_modules/typebox/build/format/idna/hostname.mjs +16 -0
  28. package/node_modules/typebox/build/format/idna/idn-hostname.d.mts +1 -0
  29. package/node_modules/typebox/build/format/idna/idn-hostname.mjs +23 -0
  30. package/node_modules/typebox/build/format/idna/index.d.mts +2 -0
  31. package/node_modules/typebox/build/format/idna/index.mjs +2 -0
  32. package/node_modules/typebox/build/format/idna/label/ascii.d.mts +1 -0
  33. package/node_modules/typebox/build/format/idna/label/ascii.mjs +9 -0
  34. package/node_modules/typebox/build/format/idna/label/puny.d.mts +1 -0
  35. package/node_modules/typebox/build/format/idna/label/puny.mjs +28 -0
  36. package/node_modules/typebox/build/format/idna/label/unicode.d.mts +1 -0
  37. package/node_modules/typebox/build/format/idna/label/unicode.mjs +106 -0
  38. package/node_modules/typebox/build/format/idna/pattern/pattern.d.mts +30 -0
  39. package/node_modules/typebox/build/format/idna/pattern/pattern.mjs +70 -0
  40. package/node_modules/typebox/build/format/ipv4.d.mts +0 -1
  41. package/node_modules/typebox/build/format/ipv4.mjs +2 -32
  42. package/node_modules/typebox/build/format/ipv6.mjs +2 -61
  43. package/node_modules/typebox/build/format/iri.d.mts +2 -2
  44. package/node_modules/typebox/build/format/iri.mjs +26 -8
  45. package/node_modules/typebox/build/format/iri_reference.d.mts +2 -2
  46. package/node_modules/typebox/build/format/iri_reference.mjs +9 -55
  47. package/node_modules/typebox/build/format/regex.d.mts +1 -2
  48. package/node_modules/typebox/build/format/regex.mjs +2 -6
  49. package/node_modules/typebox/build/format/time.d.mts +2 -2
  50. package/node_modules/typebox/build/format/time.mjs +19 -14
  51. package/node_modules/typebox/build/format/uri.d.mts +1 -1
  52. package/node_modules/typebox/build/format/uri.mjs +3 -130
  53. package/node_modules/typebox/build/format/uri_reference.d.mts +1 -1
  54. package/node_modules/typebox/build/format/uri_reference.mjs +2 -3
  55. package/node_modules/typebox/build/format/uri_template.d.mts +2 -3
  56. package/node_modules/typebox/build/format/uri_template.mjs +4 -5
  57. package/node_modules/typebox/build/format/url.d.mts +3 -3
  58. package/node_modules/typebox/build/format/url.mjs +4 -5
  59. package/node_modules/typebox/build/guard/emit.d.mts +3 -1
  60. package/node_modules/typebox/build/guard/emit.mjs +12 -5
  61. package/node_modules/typebox/build/guard/guard.d.mts +8 -2
  62. package/node_modules/typebox/build/guard/guard.mjs +25 -4
  63. package/node_modules/typebox/build/guard/string.d.mts +2 -2
  64. package/node_modules/typebox/build/guard/string.mjs +7 -7
  65. package/node_modules/typebox/build/schema/engine/_context.mjs +3 -3
  66. package/node_modules/typebox/build/schema/engine/_functions.mjs +1 -2
  67. package/node_modules/typebox/build/schema/engine/_regexp.d.mts +2 -0
  68. package/node_modules/typebox/build/schema/engine/_regexp.mjs +4 -0
  69. package/node_modules/typebox/build/schema/engine/_stack.mjs +12 -13
  70. package/node_modules/typebox/build/schema/engine/additionalItems.mjs +17 -7
  71. package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +4 -3
  72. package/node_modules/typebox/build/schema/engine/contains.mjs +18 -6
  73. package/node_modules/typebox/build/schema/engine/enum.mjs +1 -1
  74. package/node_modules/typebox/build/schema/engine/items.mjs +26 -6
  75. package/node_modules/typebox/build/schema/engine/maxContains.mjs +3 -3
  76. package/node_modules/typebox/build/schema/engine/minContains.mjs +14 -4
  77. package/node_modules/typebox/build/schema/engine/not.mjs +4 -2
  78. package/node_modules/typebox/build/schema/engine/oneOf.mjs +7 -6
  79. package/node_modules/typebox/build/schema/engine/pattern.mjs +3 -2
  80. package/node_modules/typebox/build/schema/engine/patternProperties.mjs +4 -3
  81. package/node_modules/typebox/build/schema/engine/ref.mjs +1 -7
  82. package/node_modules/typebox/build/schema/engine/schema.mjs +13 -4
  83. package/node_modules/typebox/build/schema/engine/type.mjs +1 -1
  84. package/node_modules/typebox/build/schema/resolve/resolve.d.mts +4 -1
  85. package/node_modules/typebox/build/schema/resolve/resolve.mjs +202 -1
  86. package/node_modules/typebox/build/schema/static/propertyNames.d.mts +5 -0
  87. package/node_modules/typebox/build/schema/static/propertyNames.mjs +3 -0
  88. package/node_modules/typebox/build/schema/static/schema.d.mts +3 -0
  89. package/node_modules/typebox/build/schema/types/index.d.mts +0 -2
  90. package/node_modules/typebox/build/schema/types/index.mjs +0 -2
  91. package/node_modules/typebox/build/system/memory/clone.mjs +14 -11
  92. package/node_modules/typebox/build/system/memory/discard.mjs +6 -5
  93. package/node_modules/typebox/build/system/settings/settings.d.mts +9 -0
  94. package/node_modules/typebox/build/system/settings/settings.mjs +2 -0
  95. package/node_modules/typebox/build/type/engine/call/distribute_arguments.d.mts +6 -1
  96. package/node_modules/typebox/build/type/engine/call/distribute_arguments.mjs +16 -3
  97. package/node_modules/typebox/build/type/engine/call/instantiate.mjs +34 -4
  98. package/node_modules/typebox/build/type/engine/evaluate/broaden.d.mts +5 -5
  99. package/node_modules/typebox/build/type/engine/evaluate/broaden.mjs +20 -26
  100. package/node_modules/typebox/build/type/engine/evaluate/compare.d.mts +6 -10
  101. package/node_modules/typebox/build/type/engine/evaluate/compare.mjs +9 -13
  102. package/node_modules/typebox/build/type/engine/evaluate/composite.d.mts +7 -4
  103. package/node_modules/typebox/build/type/engine/evaluate/composite.mjs +12 -19
  104. package/node_modules/typebox/build/type/engine/evaluate/distribute.d.mts +4 -20
  105. package/node_modules/typebox/build/type/engine/evaluate/distribute.mjs +8 -20
  106. package/node_modules/typebox/build/type/engine/evaluate/evaluate.d.mts +4 -4
  107. package/node_modules/typebox/build/type/engine/evaluate/evaluate.mjs +11 -8
  108. package/node_modules/typebox/build/type/engine/evaluate/flatten.d.mts +1 -1
  109. package/node_modules/typebox/build/type/engine/evaluate/flatten.mjs +3 -4
  110. package/node_modules/typebox/build/type/engine/evaluate/narrow.d.mts +17 -2
  111. package/node_modules/typebox/build/type/engine/evaluate/narrow.mjs +26 -6
  112. package/node_modules/typebox/build/type/engine/exclude/operation.mjs +3 -4
  113. package/node_modules/typebox/build/type/engine/extract/operation.d.mts +1 -1
  114. package/node_modules/typebox/build/type/engine/extract/operation.mjs +3 -4
  115. package/node_modules/typebox/build/type/engine/priority/priority.d.mts +2 -2
  116. package/node_modules/typebox/build/type/engine/priority/priority.mjs +3 -4
  117. package/node_modules/typebox/build/type/script/mapping.d.mts +32 -29
  118. package/node_modules/typebox/build/type/script/mapping.mjs +18 -25
  119. package/node_modules/typebox/build/type/script/parser.d.mts +19 -25
  120. package/node_modules/typebox/build/type/script/parser.mjs +27 -23
  121. package/node_modules/typebox/build/value/errors/errors.d.mts +2 -2
  122. package/node_modules/typebox/build/value/errors/errors.mjs +1 -1
  123. package/node_modules/typebox/package.json +27 -27
  124. package/node_modules/typebox/readme.md +79 -82
  125. package/node_modules/ws/lib/permessage-deflate.js +3 -1
  126. package/node_modules/ws/package.json +1 -1
  127. package/package.json +6 -6
  128. package/node_modules/typebox/build/format/_idna.d.mts +0 -2
  129. package/node_modules/typebox/build/format/_idna.mjs +0 -246
  130. package/node_modules/typebox/build/format/_puny.d.mts +0 -1
  131. package/node_modules/typebox/build/format/_puny.mjs +0 -77
  132. package/node_modules/typebox/build/schema/resolve/ref.d.mts +0 -3
  133. package/node_modules/typebox/build/schema/resolve/ref.mjs +0 -146
  134. package/node_modules/typebox/build/schema/types/contentEncoding.d.mts +0 -9
  135. package/node_modules/typebox/build/schema/types/contentEncoding.mjs +0 -13
  136. package/node_modules/typebox/build/schema/types/contentMediaType.d.mts +0 -9
  137. package/node_modules/typebox/build/schema/types/contentMediaType.mjs +0 -13
@@ -14,7 +14,7 @@ function resolveHome(env) {
14
14
  function resolveUserPath(input, env) {
15
15
  const trimmed = input.trim();
16
16
  if (!trimmed) return trimmed;
17
- if (trimmed.startsWith("~")) return path.resolve(trimmed.replace(/^~(?=$|[\\/])/, resolveHome(env)));
17
+ if (trimmed.startsWith("~")) return path.resolve(trimmed.replace(/^~(?=$|[\\/])/, () => resolveHome(env)));
18
18
  return path.resolve(trimmed);
19
19
  }
20
20
  /** Read the configured voice-call store path from either package id. */
@@ -62,6 +62,9 @@ function describeVoiceCallSchemaMigration(migration) {
62
62
  case "agent-databases-relative-paths-v9": return "agent database registry paths -> state-relative paths";
63
63
  case "audit-events-v2": return "audit event ledger -> versioned message lifecycle schema";
64
64
  case "commitments-retirement-v7": return "retired commitments storage -> removed table and indexes";
65
+ case "state-table-retirement-v10": return "retired shared-state tables -> removed tables and indexes";
66
+ case "state-table-retirement-v11": return "retired skill curator tables -> removed tables and indexes";
67
+ case "singleton-state-foldin-v12": return "singleton state tables -> shared configuration state";
65
68
  case "worker-placement-execution-mode-v8": return "cloud worker placements -> execution-mode claims";
66
69
  case "operator-approvals-system-agent": return "operator approvals -> OpenClaw system changes";
67
70
  case "session-watch-cursor-provenance-v4": return "session watch cursors -> provenance column";
@@ -1,6 +1,6 @@
1
1
  import { fetchWithSsrFGuard } from "./runtime-api.js";
2
2
  import "./api.js";
3
- import { n as normalizeProxyIp, s as getHeader } from "./runtime-entry-DK8kPCGC.js";
3
+ import { n as normalizeProxyIp, s as getHeader } from "./runtime-entry-ptAKgGER.js";
4
4
  import { n as reserveWebhookReplay, t as createWebhookReplayCache } from "./webhook-replay-FQrEGVSM.js";
5
5
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
6
6
  import { isLoopbackHost } from "openclaw/plugin-sdk/gateway-runtime";
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { definePluginEntry, sleep } from "./runtime-api.js";
2
2
  import "./api.js";
3
3
  import { VOICE_CALL_CLI_DESCRIPTOR } from "./cli-output-mode.js";
4
- import { C as resolveVoiceCallStreamExposurePaths, b as resolveVoiceCallConfig, c as resolveWebhookExposureStatus, d as setupTailscaleExposureRoutes, g as resolveUserPath, l as cleanupTailscaleExposureRoute, t as createVoiceCallRuntime, u as getTailscaleSelfInfo, w as validateProviderConfig, y as VoiceCallConfigSchema } from "./runtime-entry-DK8kPCGC.js";
4
+ import { C as resolveVoiceCallStreamExposurePaths, b as resolveVoiceCallConfig, c as resolveWebhookExposureStatus, d as setupTailscaleExposureRoutes, g as resolveUserPath, l as cleanupTailscaleExposureRoute, t as createVoiceCallRuntime, u as getTailscaleSelfInfo, w as validateProviderConfig, y as VoiceCallConfigSchema } from "./runtime-entry-ptAKgGER.js";
5
5
  import { b as setVoiceCallStateRuntime, d as loadActiveCallsFromStore, l as findCallMatchesInStore, t as resolveDefaultVoiceCallStoreDir, u as getCallHistoryFromStore } from "./store-path-51_oC_xn.js";
6
6
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
7
7
  import { ErrorCodes, callGatewayFromCli, errorShape, isGatewayClientRequestError, isGatewayTransportError, redactSensitiveUrlLikeString } from "openclaw/plugin-sdk/gateway-runtime";
@@ -1,5 +1,5 @@
1
- import { _ as escapeXml, s as getHeader } from "./runtime-entry-DK8kPCGC.js";
2
- import { a as reconstructWebhookUrl, o as verifyPlivoWebhook, t as guardedJsonApiRequest } from "./guarded-json-api-j4OEG0fR.js";
1
+ import { _ as escapeXml, s as getHeader } from "./runtime-entry-ptAKgGER.js";
2
+ import { a as reconstructWebhookUrl, o as verifyPlivoWebhook, t as guardedJsonApiRequest } from "./guarded-json-api-BmMfqKzQ.js";
3
3
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
4
4
  import crypto from "node:crypto";
5
5
  //#region extensions/voice-call/src/providers/plivo.ts
@@ -1,4 +1,4 @@
1
- import { T as REALTIME_VOICE_END_CALL_TOOL_NAME, o as canonicalizeVoiceCallMediaBase64, x as resolveVoiceCallPublicPathPrefix } from "./runtime-entry-DK8kPCGC.js";
1
+ import { T as REALTIME_VOICE_END_CALL_TOOL_NAME, o as canonicalizeVoiceCallMediaBase64, x as resolveVoiceCallPublicPathPrefix } from "./runtime-entry-ptAKgGER.js";
2
2
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
3
3
  import { asNullableRecord, asOptionalObjectRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
4
4
  import { createSubsystemLogger } from "openclaw/plugin-sdk/runtime-env";
@@ -1,4 +1,4 @@
1
- import { S as resolveVoiceCallSessionKey, h as resolveCallAgentId, m as resolveVoiceResponseModel } from "./runtime-entry-DK8kPCGC.js";
1
+ import { S as resolveVoiceCallSessionKey, h as resolveCallAgentId, m as resolveVoiceResponseModel } from "./runtime-entry-ptAKgGER.js";
2
2
  import { filterStringEntries, isRecord, normalizeLowercaseStringOrEmpty, normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
3
3
  import { resolveAgentConfig } from "openclaw/plugin-sdk/agent-scope-runtime";
4
4
  import crypto from "node:crypto";
@@ -1646,7 +1646,7 @@ function resolveUserPath(input) {
1646
1646
  const trimmed = input.trim();
1647
1647
  if (!trimmed) return trimmed;
1648
1648
  if (trimmed.startsWith("~")) {
1649
- const expanded = trimmed.replace(/^~(?=$|[\\/])/, os.homedir());
1649
+ const expanded = trimmed.replace(/^~(?=$|[\\/])/, () => os.homedir());
1650
1650
  return path.resolve(expanded);
1651
1651
  }
1652
1652
  return path.resolve(trimmed);
@@ -2240,7 +2240,6 @@ async function cleanupTailscaleExposure(config) {
2240
2240
  //#region extensions/voice-call/src/tunnel.ts
2241
2241
  const NGROK_LOG_BUFFER_MAX_CHARS = 16384;
2242
2242
  const NGROK_ERROR_MARKER = "ERR_NGROK";
2243
- const TUNNEL_COMMAND_OUTPUT_MAX_BYTES = 16384;
2244
2243
  const NGROK_STOP_GRACE_MS = 2e3;
2245
2244
  const NGROK_FORCE_KILL_WAIT_MS = 1e3;
2246
2245
  async function terminateNgrokProcess(proc, isClosed) {
@@ -2280,11 +2279,6 @@ function listenForChildStreamErrors(proc, onError) {
2280
2279
  * // Later: await tunnel.stop();
2281
2280
  */
2282
2281
  async function startNgrokTunnel(config) {
2283
- if (config.authToken) await runNgrokCommand([
2284
- "config",
2285
- "add-authtoken",
2286
- config.authToken
2287
- ]);
2288
2282
  const args = [
2289
2283
  "http",
2290
2284
  String(config.port),
@@ -2295,11 +2289,17 @@ async function startNgrokTunnel(config) {
2295
2289
  ];
2296
2290
  if (config.domain) args.push("--domain", config.domain);
2297
2291
  return new Promise((resolve, reject) => {
2298
- const proc = spawn("ngrok", args, { stdio: [
2299
- "ignore",
2300
- "pipe",
2301
- "pipe"
2302
- ] });
2292
+ const proc = spawn("ngrok", args, {
2293
+ stdio: [
2294
+ "ignore",
2295
+ "pipe",
2296
+ "pipe"
2297
+ ],
2298
+ ...config.authToken ? { env: {
2299
+ ...process.env,
2300
+ NGROK_AUTHTOKEN: config.authToken
2301
+ } } : {}
2302
+ });
2303
2303
  let startupSettled = false;
2304
2304
  let childClosed = false;
2305
2305
  let publicUrl = null;
@@ -2372,27 +2372,6 @@ async function startNgrokTunnel(config) {
2372
2372
  });
2373
2373
  }
2374
2374
  /**
2375
- * Run an ngrok command and wait for completion.
2376
- */
2377
- async function runNgrokCommand(args) {
2378
- const result = await runCommandWithTimeout(["ngrok", ...args], {
2379
- killProcessTree: true,
2380
- maxOutputBytes: TUNNEL_COMMAND_OUTPUT_MAX_BYTES,
2381
- outputCapture: "tail",
2382
- timeoutMs: 3e4
2383
- });
2384
- if (result.termination === "timeout") throw new Error("ngrok command timed out");
2385
- if (result.code === 0) return result.stdout;
2386
- const output = result.stderr ? {
2387
- text: result.stderr,
2388
- truncated: Boolean(result.stderrTruncatedBytes)
2389
- } : {
2390
- text: result.stdout,
2391
- truncated: Boolean(result.stdoutTruncatedBytes)
2392
- };
2393
- throw new Error(`ngrok command failed: ${formatBoundedChildOutput(output)}`);
2394
- }
2395
- /**
2396
2375
  * Start a Tailscale serve/funnel tunnel.
2397
2376
  */
2398
2377
  async function startTailscaleTunnel(config) {
@@ -3362,7 +3341,7 @@ const MAX_WEBHOOK_BODY_BYTES = WEBHOOK_BODY_READ_DEFAULTS.preAuth.maxBytes;
3362
3341
  const WEBHOOK_BODY_TIMEOUT_MS = WEBHOOK_BODY_READ_DEFAULTS.preAuth.timeoutMs;
3363
3342
  const MISSING_REMOTE_ADDRESS_IN_FLIGHT_KEY = "__voice_call_no_remote__";
3364
3343
  const loadRealtimeTranscriptionRuntime = createLazyRuntimeModule(() => import("./realtime-transcription.runtime-CbJAs5t_.js"));
3365
- const loadResponseGeneratorModule = createLazyRuntimeModule(() => import("./response-generator-tjyX4tDq.js"));
3344
+ const loadResponseGeneratorModule = createLazyRuntimeModule(() => import("./response-generator-BCm6S1G6.js"));
3366
3345
  function appendRecentTalkEventMetadata(call, event) {
3367
3346
  const metadata = call.metadata ?? {};
3368
3347
  const recent = Array.isArray(metadata.recentTalkEvents) ? metadata.recentTalkEvents.filter((entry) => Boolean(entry) && typeof entry === "object" && !Array.isArray(entry)) : [];
@@ -4061,12 +4040,12 @@ const REALTIME_VOICE_CONSULT_SYSTEM_PROMPT = [
4061
4040
  "Do not print secret values or dump environment variables; only check whether required configuration is present.",
4062
4041
  "Be accurate, brief, and speakable."
4063
4042
  ].join(" ");
4064
- const loadTelnyxProvider = createLazyRuntimeModule(() => import("./telnyx-DO8dFQcb.js"));
4065
- const loadTwilioProvider = createLazyRuntimeModule(() => import("./twilio-JDt_1nlz.js"));
4066
- const loadPlivoProvider = createLazyRuntimeModule(() => import("./plivo-BbVnahnQ.js"));
4043
+ const loadTelnyxProvider = createLazyRuntimeModule(() => import("./telnyx-DWpKHVeV.js"));
4044
+ const loadTwilioProvider = createLazyRuntimeModule(() => import("./twilio-DUIVX0Eb.js"));
4045
+ const loadPlivoProvider = createLazyRuntimeModule(() => import("./plivo-CNPyQgvw.js"));
4067
4046
  const loadMockProvider = createLazyRuntimeModule(() => import("./mock-Dv7KxYGt.js"));
4068
4047
  const loadRealtimeVoiceRuntime = createLazyRuntimeModule(() => import("./realtime-voice.runtime-vtdCOWg-.js"));
4069
- const loadRealtimeHandler = createLazyRuntimeModule(() => import("./realtime-handler-BaMEKbmJ.js"));
4048
+ const loadRealtimeHandler = createLazyRuntimeModule(() => import("./realtime-handler-DYTBiNVr.js"));
4070
4049
  function resolveVoiceCallConsultSessionKey(call) {
4071
4050
  return resolveVoiceCallSessionKey({
4072
4051
  config: call.config,
@@ -1,2 +1,2 @@
1
- import { t as createVoiceCallRuntime } from "./runtime-entry-DK8kPCGC.js";
1
+ import { t as createVoiceCallRuntime } from "./runtime-entry-ptAKgGER.js";
2
2
  export { createVoiceCallRuntime };
@@ -1,4 +1,4 @@
1
- import { s as verifyTelnyxWebhook, t as guardedJsonApiRequest } from "./guarded-json-api-j4OEG0fR.js";
1
+ import { s as verifyTelnyxWebhook, t as guardedJsonApiRequest } from "./guarded-json-api-BmMfqKzQ.js";
2
2
  import crypto from "node:crypto";
3
3
  //#region extensions/voice-call/src/providers/telnyx.ts
4
4
  function normalizeTelnyxDirection(direction) {
@@ -1,8 +1,8 @@
1
1
  import { fetchWithSsrFGuard } from "./runtime-api.js";
2
2
  import "./api.js";
3
3
  import { n as requireSupportedTwilioApiHostname, r as resolveTwilioApiBaseUrl } from "./twilio-region-4fkgz3UG.js";
4
- import { _ as escapeXml, a as normalizeProviderStatus, i as mapProviderStatusToEndReason, p as chunkAudio, r as isProviderStatusTerminal, s as getHeader, v as mapVoiceToPolly } from "./runtime-entry-DK8kPCGC.js";
5
- import { c as verifyTwilioWebhook, i as readVoiceCallProviderJsonResponse, n as cancelProviderResponseBody, r as readProviderErrorResponseSnippet, t as guardedJsonApiRequest } from "./guarded-json-api-j4OEG0fR.js";
4
+ import { _ as escapeXml, a as normalizeProviderStatus, i as mapProviderStatusToEndReason, p as chunkAudio, r as isProviderStatusTerminal, s as getHeader, v as mapVoiceToPolly } from "./runtime-entry-ptAKgGER.js";
5
+ import { c as verifyTwilioWebhook, i as readVoiceCallProviderJsonResponse, n as cancelProviderResponseBody, r as readProviderErrorResponseSnippet, t as guardedJsonApiRequest } from "./guarded-json-api-BmMfqKzQ.js";
6
6
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
7
7
  import { sleepWithAbort } from "openclaw/plugin-sdk/runtime-env";
8
8
  import crypto from "node:crypto";
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Returns true if the value is a ISO8601 Date component string
3
- * @source ajv-formats
3
+ * @description https://datatracker.ietf.org/doc/html/rfc3339
4
4
  * @example `2020-12-12`
5
5
  */
6
6
  export declare function IsDate(value: string): boolean;
@@ -5,7 +5,7 @@ function IsLeapYear(year) {
5
5
  }
6
6
  /**
7
7
  * Returns true if the value is a ISO8601 Date component string
8
- * @source ajv-formats
8
+ * @description https://datatracker.ietf.org/doc/html/rfc3339
9
9
  * @example `2020-12-12`
10
10
  */
11
11
  export function IsDate(value) {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Returns true if the value is a ISO8601 DateTime string
3
- * @source ajv-formats
3
+ * @specification https://datatracker.ietf.org/doc/html/rfc3339
4
4
  * @example `2020-12-12T20:20:40+00:00`
5
5
  */
6
- export declare function IsDateTime(value: string, strictTimeZone?: boolean): boolean;
6
+ export declare function IsDateTime(value: string): boolean;
@@ -2,10 +2,10 @@ import { IsDate } from './date.mjs';
2
2
  import { IsTime } from './time.mjs';
3
3
  /**
4
4
  * Returns true if the value is a ISO8601 DateTime string
5
- * @source ajv-formats
5
+ * @specification https://datatracker.ietf.org/doc/html/rfc3339
6
6
  * @example `2020-12-12T20:20:40+00:00`
7
7
  */
8
- export function IsDateTime(value, strictTimeZone = true) {
8
+ export function IsDateTime(value) {
9
9
  const dateTime = value.split(/T/i);
10
- return dateTime.length === 2 && IsDate(dateTime[0]) && IsTime(dateTime[1], strictTimeZone);
10
+ return dateTime.length === 2 && IsDate(dateTime[0]) && IsTime(dateTime[1]);
11
11
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * Returns true if the value is an Email
3
- * @specification ajv-formats
3
+ * @specification https://datatracker.ietf.org/doc/html/rfc5322
4
4
  */
5
5
  export declare function IsEmail(value: string): boolean;
@@ -1,7 +1,7 @@
1
- const Email = /^(?!.*\.\.)[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i;
1
+ const Email = /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[^"\\]|\\.)*")@(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*|\[(?:IPv6:[a-f0-9:]+|(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?:\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})\])$/i;
2
2
  /**
3
3
  * Returns true if the value is an Email
4
- * @specification ajv-formats
4
+ * @specification https://datatracker.ietf.org/doc/html/rfc5322
5
5
  */
6
6
  export function IsEmail(value) {
7
7
  return Email.test(value);
@@ -1,4 +1,4 @@
1
- import * as Idna from './_idna.mjs';
1
+ import * as Idna from './idna/index.mjs';
2
2
  /**
3
3
  * Returns true if the value is a valid hostname.
4
4
  * @specification https://tools.ietf.org/html/rfc1123
@@ -6,13 +6,5 @@ import * as Idna from './_idna.mjs';
6
6
  * @specification https://tools.ietf.org/html/rfc5892
7
7
  */
8
8
  export function IsHostname(value) {
9
- if (value.length === 0 || value.length > 253)
10
- return false;
11
- if (value.charCodeAt(value.length - 1) === 46)
12
- return false;
13
- for (const label of value.split('.')) {
14
- if (!Idna.IsLabel(label))
15
- return false;
16
- }
17
- return true;
9
+ return Idna.IsHostname(value);
18
10
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * Returns true if the value is an IdnEmail
3
- * @specification ajv-formats (unicode-extension)
3
+ * @specification https://datatracker.ietf.org/doc/html/rfc4952
4
4
  */
5
5
  export declare function IsIdnEmail(value: string): boolean;
@@ -1,8 +1,8 @@
1
- const IdnEmail = /^(?!.*\.\.)[\p{L}\p{N}!#$%&'*+/=?^_`{|}~-]+(?:\.[\p{L}\p{N}!#$%&'*+/=?^_`{|}~-]+)*@[\p{L}\p{N}](?:[\p{L}\p{N}-]{0,61}[\p{L}\p{N}])?(?:\.[\p{L}\p{N}](?:[\p{L}\p{N}-]{0,61}[\p{L}\p{N}])?)*$/iu;
1
+ const IdnEmail = /^(?:[A-Za-z0-9!#$%&'*+\/=?^_`{|}~\u{0080}-\u{10FFFF}-]+(?:\.[A-Za-z0-9!#$%&'*+\/=?^_`{|}~\u{0080}-\u{10FFFF}-]+)*|"(?:[^"\\]|\\.)*")@[\p{L}\p{N}](?:[\p{L}\p{N}-]{0,62})(?<!-)(?:\.[\p{L}\p{N}](?:[\p{L}\p{N}-]{0,62})(?<!-))*$/iu;
2
2
  /**
3
3
  * Returns true if the value is an IdnEmail
4
- * @specification ajv-formats (unicode-extension)
4
+ * @specification https://datatracker.ietf.org/doc/html/rfc4952
5
5
  */
6
6
  export function IsIdnEmail(value) {
7
- return IdnEmail.test(value);
7
+ return IdnEmail.test(value.normalize('NFC'));
8
8
  }
@@ -3,5 +3,6 @@
3
3
  * @specification https://tools.ietf.org/html/rfc3490
4
4
  * @specification https://tools.ietf.org/html/rfc5891
5
5
  * @specification https://tools.ietf.org/html/rfc5892
6
+ * @specification https://tools.ietf.org/html/rfc5893
6
7
  */
7
8
  export declare function IsIdnHostname(value: string): boolean;
@@ -1,19 +1,11 @@
1
- import { IsIdnLabel } from './_idna.mjs';
1
+ import * as Idna from './idna/index.mjs';
2
2
  /**
3
3
  * Returns true if the value is a valid internationalized (IDN) hostname.
4
4
  * @specification https://tools.ietf.org/html/rfc3490
5
5
  * @specification https://tools.ietf.org/html/rfc5891
6
6
  * @specification https://tools.ietf.org/html/rfc5892
7
+ * @specification https://tools.ietf.org/html/rfc5893
7
8
  */
8
9
  export function IsIdnHostname(value) {
9
- if (value.length === 0 || value.includes(' '))
10
- return false;
11
- const canonical = value.normalize('NFC').replace(/[\u002E\u3002\uFF0E\uFF61]/g, '.');
12
- if (canonical.length > 253)
13
- return false;
14
- for (const label of canonical.split('.')) {
15
- if (!IsIdnLabel(label))
16
- return false;
17
- }
18
- return true;
10
+ return Idna.IsIdnHostname(value);
19
11
  }
@@ -0,0 +1,3 @@
1
+ export declare function HasBidiChars(value: string): boolean;
2
+ export declare function HasRightToLeftCharacters(value: string): boolean;
3
+ export declare function SatisfiesBidiRule(value: string): boolean;
@@ -0,0 +1,98 @@
1
+ // deno-fmt-ignore-file
2
+ import * as FormatPuny from './puny.mjs';
3
+ import * as Pattern from '../pattern/pattern.mjs';
4
+ // ------------------------------------------------------------------
5
+ // LOCAL REGEX: Allowed Bidi classes per direction (RFC 5893)
6
+ // ------------------------------------------------------------------
7
+ const RE_RTL_ALLOWED = /^(?:R|AL|AN|EN|ES|CS|ET|ON|BN|NSM)$/;
8
+ const RE_LTR_ALLOWED = /^(?:L|EN|ES|CS|ET|ON|BN|NSM)$/;
9
+ const RE_RTL_CLASSES = /^(?:R|AL|AN)$/;
10
+ // ------------------------------------------------------------------
11
+ // HasBidiChars
12
+ //
13
+ // Decodes a punycode label to its Unicode form (if it is one) and
14
+ // checks whether the result is an RTL label per RFC 5893 §1.4.
15
+ // ------------------------------------------------------------------
16
+ export function HasBidiChars(value) {
17
+ if (FormatPuny.IsAcePrefixed(value)) {
18
+ try {
19
+ return HasRightToLeftCharacters(FormatPuny.Decode(value.slice(4).toLowerCase()));
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ return HasRightToLeftCharacters(value);
26
+ }
27
+ // ------------------------------------------------------------------
28
+ // GetBidiClass
29
+ // ------------------------------------------------------------------
30
+ function GetBidiClass(codePoint) {
31
+ const char = String.fromCodePoint(codePoint);
32
+ return (Pattern.RE_EUROPEAN_NUMBER.test(char) ? 'EN' :
33
+ Pattern.RE_ARABIC_INDIC_DIGIT.test(char) ? 'AN' :
34
+ // Pattern.RE_EUROPEAN_SEPARATOR.test(char) ? 'ES' : // (no-spec-coverage)
35
+ // Pattern.RE_COMMON_SEPARATOR.test(char) ? 'CS' : // (no-spec-coverage)
36
+ Pattern.RE_MARK_NONSPACING.test(char) ? 'NSM' :
37
+ Pattern.RE_SCRIPT_HEBREW.test(char) ? 'R' :
38
+ Pattern.RE_SCRIPT_ARABIC_LETTER.test(char) ? 'AL' :
39
+ Pattern.RE_LETTER.test(char) ? 'L' :
40
+ 'ON');
41
+ }
42
+ // ------------------------------------------------------------------
43
+ // HasRightToLeftCharacters
44
+ //
45
+ // Per RFC 5893 §1.4: "An RTL label is a label that contains at least
46
+ // one character of type R, AL, or AN." Used to determine whether a
47
+ // domain name is a "Bidi domain name" (RFC 5893 §1.4), in which case
48
+ // the Bidi Rule applies to every label in the domain.
49
+ // ------------------------------------------------------------------
50
+ export function HasRightToLeftCharacters(value) {
51
+ for (const ch of value)
52
+ if (RE_RTL_CLASSES.test(GetBidiClass(ch.codePointAt(0))))
53
+ return true;
54
+ return false;
55
+ }
56
+ // ------------------------------------------------------------------
57
+ // SatisfiesBidiRule
58
+ // ------------------------------------------------------------------
59
+ export function SatisfiesBidiRule(value) {
60
+ let isRtl = false;
61
+ let allowed = RE_LTR_ALLOWED;
62
+ let sawEN = false;
63
+ let sawAN = false;
64
+ let isFirst = true;
65
+ // let lastClass: string | null = null // (no-spec-coverage)
66
+ for (const ch of value) {
67
+ const bidiClass = GetBidiClass(ch.codePointAt(0));
68
+ if (isFirst) {
69
+ // 1. The first character must be a character with Bidi property L, R, or AL.
70
+ if (bidiClass !== 'L' && bidiClass !== 'R' && bidiClass !== 'AL')
71
+ return false;
72
+ isRtl = bidiClass === 'R' || bidiClass === 'AL';
73
+ allowed = isRtl ? RE_RTL_ALLOWED : RE_LTR_ALLOWED;
74
+ isFirst = false;
75
+ }
76
+ // 2 / 5. Only characters in the allowed set for this direction may appear.
77
+ if (!allowed.test(bidiClass))
78
+ return false;
79
+ if (bidiClass === 'EN')
80
+ sawEN = true;
81
+ else if (bidiClass === 'AN')
82
+ sawAN = true;
83
+ // if (bidiClass !== 'NSM') lastClass = bidiClass // (no-spec-coverage)
84
+ }
85
+ if (isRtl && sawEN && sawAN)
86
+ return false; // spec coverage path
87
+ // (no-spec-coverage)
88
+ // if (isRtl) {
89
+ // // 3. The end of the label must be R, AL, EN, or AN (ignoring trailing NSM).
90
+ // // if (lastClass !== 'R' && lastClass !== 'AL' && lastClass !== 'EN' && lastClass !== 'AN') return false
91
+ // // 4. If an EN is present, no AN may be present, and vice versa.
92
+ // if (sawEN && sawAN) return false
93
+ // } else {
94
+ // // 6. The end of the label must be L or EN (ignoring trailing NSM).
95
+ // // if (lastClass !== 'L' && lastClass !== 'EN') return false
96
+ // }
97
+ return true;
98
+ }
@@ -0,0 +1,3 @@
1
+ export declare function IsAcePrefixed(value: string): boolean;
2
+ export declare function Decode(value: string): string;
3
+ export declare function Encode(input: string): string;
@@ -0,0 +1,144 @@
1
+ import * as Pattern from '../pattern/pattern.mjs';
2
+ // ------------------------------------------------------------------
3
+ // PunyCode (RFC 3492)
4
+ // ------------------------------------------------------------------
5
+ const PUNYCODE_BASE = 36;
6
+ const PUNYCODE_TMIN = 1;
7
+ const PUNYCODE_TMAX = 26;
8
+ const PUNYCODE_SKEW = 38;
9
+ const PUNYCODE_DAMP = 700;
10
+ const PUNYCODE_INITIAL_BIAS = 72;
11
+ const PUNYCODE_INITIAL_N = 128;
12
+ // ------------------------------------------------------------------
13
+ // ThrowDontCare
14
+ // ------------------------------------------------------------------
15
+ function ThrowDontCare() {
16
+ throw null;
17
+ }
18
+ // ------------------------------------------------------------------
19
+ // IsAcePrefixed
20
+ // ------------------------------------------------------------------
21
+ export function IsAcePrefixed(value) {
22
+ return value.toLowerCase().startsWith('xn--');
23
+ }
24
+ // ------------------------------------------------------------------
25
+ // Adapt
26
+ // ------------------------------------------------------------------
27
+ function Adapt(delta, numPoints, firstTime) {
28
+ delta = firstTime ? Math.floor(delta / PUNYCODE_DAMP) : delta >> 1;
29
+ delta += Math.floor(delta / numPoints);
30
+ let k = 0;
31
+ while (delta > (((PUNYCODE_BASE - PUNYCODE_TMIN) * PUNYCODE_TMAX) >> 1)) {
32
+ delta = Math.floor(delta / (PUNYCODE_BASE - PUNYCODE_TMIN));
33
+ k += PUNYCODE_BASE;
34
+ }
35
+ return k + Math.floor(((PUNYCODE_BASE - PUNYCODE_TMIN + 1) * delta) / (delta + PUNYCODE_SKEW));
36
+ }
37
+ // ------------------------------------------------------------------
38
+ // Decode
39
+ // ------------------------------------------------------------------
40
+ export function Decode(value) {
41
+ const output = [];
42
+ let n = PUNYCODE_INITIAL_N;
43
+ let i = 0;
44
+ let bias = PUNYCODE_INITIAL_BIAS;
45
+ const delimIdx = value.lastIndexOf('-');
46
+ if (delimIdx > 0) {
47
+ for (let j = 0; j < delimIdx; j++) {
48
+ const cp = value.charCodeAt(j);
49
+ if (cp >= 128)
50
+ ThrowDontCare(); // throw new Error('Invalid punycode: non-basic before delimiter')
51
+ output.push(cp);
52
+ }
53
+ }
54
+ let inIdx = delimIdx < 0 ? 0 : delimIdx + 1;
55
+ while (inIdx < value.length) {
56
+ const oldi = i;
57
+ let w = 1;
58
+ let k = PUNYCODE_BASE;
59
+ while (true) {
60
+ if (inIdx >= value.length)
61
+ ThrowDontCare(); // throw new Error('Invalid punycode: unexpected end of input')
62
+ const ch = value.charCodeAt(inIdx++);
63
+ let digit;
64
+ if (ch >= 0x61 && ch <= 0x7a)
65
+ digit = ch - 0x61; // a-z => 0-25
66
+ else if (ch >= 0x30 && ch <= 0x39)
67
+ digit = ch - 0x30 + 26; // 0-9 => 26-35
68
+ // else if (ch >= 0x41 && ch <= 0x5a) digit = ch - 0x41 // A-Z => 0-25 // (no-spec-coverage)
69
+ else
70
+ ThrowDontCare(); // throw new Error('Invalid punycode: bad digit character')
71
+ i += digit * w;
72
+ const t = k <= bias ? PUNYCODE_TMIN : k >= bias + PUNYCODE_TMAX ? PUNYCODE_TMAX : k - bias;
73
+ if (digit < t)
74
+ break;
75
+ w *= PUNYCODE_BASE - t;
76
+ k += PUNYCODE_BASE;
77
+ }
78
+ const outLen = output.length + 1;
79
+ bias = Adapt(i - oldi, outLen, oldi === 0);
80
+ n += Math.floor(i / outLen);
81
+ i %= outLen;
82
+ output.splice(i, 0, n);
83
+ i++;
84
+ }
85
+ return String.fromCodePoint(...output);
86
+ }
87
+ // ------------------------------------------------------------------
88
+ // DigitToChar
89
+ // ------------------------------------------------------------------
90
+ function DigitToChar(digit) {
91
+ return digit < 26 ? String.fromCharCode(digit + 0x61) : String.fromCharCode(digit - 26 + 0x30);
92
+ }
93
+ // ------------------------------------------------------------------
94
+ // Encode
95
+ //
96
+ // Encodes a Unicode string into its Punycode payload (the part that
97
+ // follows the 'xn--' ACE prefix). Used to compute the true A-label
98
+ // length of a U-label, since the 63-octet label length limit (RFC
99
+ // 5891 §4.2.4) applies to the encoded form, not the code point count.
100
+ // ------------------------------------------------------------------
101
+ const RE_REPLACE_NON_ASCII = new RegExp(Pattern.RE_NON_ASCII.source, 'gu');
102
+ export function Encode(input) {
103
+ // Extract basic ASCII characters and set initial output array state
104
+ const basic = input.replace(RE_REPLACE_NON_ASCII, '');
105
+ const basicLength = basic.length;
106
+ const result = basicLength > 0 ? [basic, '-'] : [];
107
+ // Extract unicode codepoints
108
+ const codePoints = Array.from(input, (char) => char.codePointAt(0));
109
+ let n = PUNYCODE_INITIAL_N;
110
+ let delta = 0;
111
+ let bias = PUNYCODE_INITIAL_BIAS;
112
+ let handledCPCount = basicLength;
113
+ while (handledCPCount < codePoints.length) {
114
+ let m = Infinity;
115
+ for (const cp of codePoints) {
116
+ if (cp >= n && cp < m)
117
+ m = cp;
118
+ }
119
+ delta += (m - n) * (handledCPCount + 1);
120
+ n = m;
121
+ for (const cp of codePoints) {
122
+ if (cp < n)
123
+ delta++;
124
+ if (cp === n) {
125
+ let q = delta;
126
+ for (let k = PUNYCODE_BASE;; k += PUNYCODE_BASE) {
127
+ const t = k <= bias ? PUNYCODE_TMIN : k >= bias + PUNYCODE_TMAX ? PUNYCODE_TMAX : k - bias;
128
+ if (q < t)
129
+ break;
130
+ const digit = t + ((q - t) % (PUNYCODE_BASE - t));
131
+ result.push(DigitToChar(digit));
132
+ q = Math.floor((q - t) / (PUNYCODE_BASE - t));
133
+ }
134
+ result.push(DigitToChar(q));
135
+ bias = Adapt(delta, handledCPCount + 1, handledCPCount === basicLength);
136
+ delta = 0;
137
+ handledCPCount++;
138
+ }
139
+ }
140
+ delta++;
141
+ n++;
142
+ }
143
+ return result.join('');
144
+ }
@@ -0,0 +1 @@
1
+ export declare function IsHostname(value: string): boolean;
@@ -0,0 +1,16 @@
1
+ import * as LabelAscii from './label/ascii.mjs';
2
+ import * as LabelPuny from './label/puny.mjs';
3
+ function IsValidLabelLength(value) {
4
+ return value.length > 0 && value.length <= 63;
5
+ }
6
+ function IsLabel(value) {
7
+ return IsValidLabelLength(value) && (LabelPuny.IsPunyLabel(value) ||
8
+ LabelAscii.IsAsciiLabel(value));
9
+ }
10
+ export function IsHostname(value) {
11
+ if (value.length === 0 || value.length > 253)
12
+ return false;
13
+ if (value.charCodeAt(value.length - 1) === 46)
14
+ return false;
15
+ return value.split('.').every((label) => IsLabel(label));
16
+ }
@@ -0,0 +1 @@
1
+ export declare function IsIdnHostname(value: string): boolean;
@@ -0,0 +1,23 @@
1
+ import * as FormatBidi from './format/bidi.mjs';
2
+ import * as LabelUnicode from './label/unicode.mjs';
3
+ import * as LabelPuny from './label/puny.mjs';
4
+ function IsValidLabelLength(value) {
5
+ return value.length > 0 && value.length <= 63;
6
+ }
7
+ function IsLabel(value) {
8
+ return IsValidLabelLength(value) && (LabelPuny.IsPunyLabel(value) ||
9
+ LabelUnicode.IsUnicodeLabel(value));
10
+ }
11
+ function NormalizeHostname(value) {
12
+ return value.normalize('NFC').replace(/[\u002E\u3002\uFF0E\uFF61]/g, '.');
13
+ }
14
+ export function IsIdnHostname(value) {
15
+ if (value.length === 0 || value.includes(' '))
16
+ return false;
17
+ const normalized = NormalizeHostname(value);
18
+ if (normalized.length > 253)
19
+ return false;
20
+ const labels = normalized.split('.');
21
+ const hasBidiChars = labels.some((label) => FormatBidi.HasBidiChars(label));
22
+ return labels.every((label) => IsLabel(label) && (!hasBidiChars || FormatBidi.SatisfiesBidiRule(label)));
23
+ }
@@ -0,0 +1,2 @@
1
+ export * from './hostname.mjs';
2
+ export * from './idn-hostname.mjs';