@openclaw/imessage 2026.8.1-beta.2 → 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 (151) hide show
  1. package/dist/{accounts-D00Njxg2.js → accounts-DIpGOIiN.js} +2 -2
  2. package/dist/{actions.runtime-DTFKDN5p.js → actions.runtime-BhggncbG.js} +3 -3
  3. package/dist/api.js +6 -5
  4. package/dist/{approval-handler.runtime-BtLs4gho.js → approval-handler.runtime-BC-YsgAf.js} +15 -9
  5. package/dist/approval-reactions-Cvwmdlev.js +566 -0
  6. package/dist/{catchup-D32oYNxR.js → catchup-Dh-Rv4Ur.js} +1 -1
  7. package/dist/{channel-lppmI51h.js → channel-CnKQ2MVB.js} +26 -20
  8. package/dist/channel-plugin-api.js +1 -1
  9. package/dist/{channel.runtime-5wpCKQb7.js → channel.runtime-BQLCh7bE.js} +6 -4
  10. package/dist/contract-api.js +1 -1
  11. package/dist/doctor-contract-api.js +4 -4
  12. package/dist/{group-policy-DF9xSdik.js → group-policy-BipELT2x.js} +19 -650
  13. package/dist/{media-contract-BEgdvYhW.js → media-contract-BVXuQHG2.js} +1 -1
  14. package/dist/media-contract-api.js +1 -1
  15. package/dist/{message-tool-api-CPDfJJoE.js → message-tool-api-BwIxJDoz.js} +7 -4
  16. package/dist/message-tool-api.js +1 -1
  17. package/dist/{monitor-DnxJ8pW9.js → monitor-DRD_Dnp9.js} +76 -107
  18. package/dist/{monitor-reply-cache-DKlYGd5x.js → monitor-reply-cache-BdeUQaHO.js} +6 -1
  19. package/dist/{persisted-echo-cache-BPWGUK-L.js → persisted-echo-cache-DGxy-J4t.js} +1 -1
  20. package/dist/{question-reactions-DVe50UhB.js → question-reactions-viP7ZcyG.js} +2 -1
  21. package/dist/reaction-context-BAYI7pz0.js +105 -0
  22. package/dist/{remote-file-DLwO9ved.js → remote-file-CyTTuRAt.js} +7 -3
  23. package/dist/rolldown-runtime-D7D4PA-g.js +13 -0
  24. package/dist/runtime-api.js +9 -8
  25. package/dist/{sanitize-outbound-CoTZLXMw.js → sanitize-outbound-g651fIhi.js} +2 -2
  26. package/dist/{send-BUXW76tw.js → send-DVQY6M5M.js} +24 -24
  27. package/node_modules/typebox/build/format/date.d.mts +1 -1
  28. package/node_modules/typebox/build/format/date.mjs +1 -1
  29. package/node_modules/typebox/build/format/date_time.d.mts +2 -2
  30. package/node_modules/typebox/build/format/date_time.mjs +3 -3
  31. package/node_modules/typebox/build/format/email.d.mts +1 -1
  32. package/node_modules/typebox/build/format/email.mjs +2 -2
  33. package/node_modules/typebox/build/format/hostname.mjs +2 -10
  34. package/node_modules/typebox/build/format/idn_email.d.mts +1 -1
  35. package/node_modules/typebox/build/format/idn_email.mjs +3 -3
  36. package/node_modules/typebox/build/format/idn_hostname.d.mts +1 -0
  37. package/node_modules/typebox/build/format/idn_hostname.mjs +3 -11
  38. package/node_modules/typebox/build/format/idna/format/bidi.d.mts +3 -0
  39. package/node_modules/typebox/build/format/idna/format/bidi.mjs +98 -0
  40. package/node_modules/typebox/build/format/idna/format/puny.d.mts +3 -0
  41. package/node_modules/typebox/build/format/idna/format/puny.mjs +144 -0
  42. package/node_modules/typebox/build/format/idna/hostname.d.mts +1 -0
  43. package/node_modules/typebox/build/format/idna/hostname.mjs +16 -0
  44. package/node_modules/typebox/build/format/idna/idn-hostname.d.mts +1 -0
  45. package/node_modules/typebox/build/format/idna/idn-hostname.mjs +23 -0
  46. package/node_modules/typebox/build/format/idna/index.d.mts +2 -0
  47. package/node_modules/typebox/build/format/idna/index.mjs +2 -0
  48. package/node_modules/typebox/build/format/idna/label/ascii.d.mts +1 -0
  49. package/node_modules/typebox/build/format/idna/label/ascii.mjs +9 -0
  50. package/node_modules/typebox/build/format/idna/label/puny.d.mts +1 -0
  51. package/node_modules/typebox/build/format/idna/label/puny.mjs +28 -0
  52. package/node_modules/typebox/build/format/idna/label/unicode.d.mts +1 -0
  53. package/node_modules/typebox/build/format/idna/label/unicode.mjs +106 -0
  54. package/node_modules/typebox/build/format/idna/pattern/pattern.d.mts +30 -0
  55. package/node_modules/typebox/build/format/idna/pattern/pattern.mjs +70 -0
  56. package/node_modules/typebox/build/format/ipv4.d.mts +0 -1
  57. package/node_modules/typebox/build/format/ipv4.mjs +2 -32
  58. package/node_modules/typebox/build/format/ipv6.mjs +2 -61
  59. package/node_modules/typebox/build/format/iri.d.mts +2 -2
  60. package/node_modules/typebox/build/format/iri.mjs +26 -8
  61. package/node_modules/typebox/build/format/iri_reference.d.mts +2 -2
  62. package/node_modules/typebox/build/format/iri_reference.mjs +9 -55
  63. package/node_modules/typebox/build/format/regex.d.mts +1 -2
  64. package/node_modules/typebox/build/format/regex.mjs +2 -6
  65. package/node_modules/typebox/build/format/time.d.mts +2 -2
  66. package/node_modules/typebox/build/format/time.mjs +19 -14
  67. package/node_modules/typebox/build/format/uri.d.mts +1 -1
  68. package/node_modules/typebox/build/format/uri.mjs +3 -130
  69. package/node_modules/typebox/build/format/uri_reference.d.mts +1 -1
  70. package/node_modules/typebox/build/format/uri_reference.mjs +2 -3
  71. package/node_modules/typebox/build/format/uri_template.d.mts +2 -3
  72. package/node_modules/typebox/build/format/uri_template.mjs +4 -5
  73. package/node_modules/typebox/build/format/url.d.mts +3 -3
  74. package/node_modules/typebox/build/format/url.mjs +4 -5
  75. package/node_modules/typebox/build/guard/emit.d.mts +3 -1
  76. package/node_modules/typebox/build/guard/emit.mjs +12 -5
  77. package/node_modules/typebox/build/guard/guard.d.mts +8 -2
  78. package/node_modules/typebox/build/guard/guard.mjs +25 -4
  79. package/node_modules/typebox/build/guard/string.d.mts +2 -2
  80. package/node_modules/typebox/build/guard/string.mjs +7 -7
  81. package/node_modules/typebox/build/schema/engine/_context.mjs +3 -3
  82. package/node_modules/typebox/build/schema/engine/_functions.mjs +1 -2
  83. package/node_modules/typebox/build/schema/engine/_regexp.d.mts +2 -0
  84. package/node_modules/typebox/build/schema/engine/_regexp.mjs +4 -0
  85. package/node_modules/typebox/build/schema/engine/_stack.mjs +12 -13
  86. package/node_modules/typebox/build/schema/engine/additionalItems.mjs +17 -7
  87. package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +4 -3
  88. package/node_modules/typebox/build/schema/engine/contains.mjs +18 -6
  89. package/node_modules/typebox/build/schema/engine/enum.mjs +1 -1
  90. package/node_modules/typebox/build/schema/engine/items.mjs +26 -6
  91. package/node_modules/typebox/build/schema/engine/maxContains.mjs +3 -3
  92. package/node_modules/typebox/build/schema/engine/minContains.mjs +14 -4
  93. package/node_modules/typebox/build/schema/engine/not.mjs +4 -2
  94. package/node_modules/typebox/build/schema/engine/oneOf.mjs +7 -6
  95. package/node_modules/typebox/build/schema/engine/pattern.mjs +3 -2
  96. package/node_modules/typebox/build/schema/engine/patternProperties.mjs +4 -3
  97. package/node_modules/typebox/build/schema/engine/ref.mjs +1 -7
  98. package/node_modules/typebox/build/schema/engine/schema.mjs +13 -4
  99. package/node_modules/typebox/build/schema/engine/type.mjs +1 -1
  100. package/node_modules/typebox/build/schema/resolve/resolve.d.mts +4 -1
  101. package/node_modules/typebox/build/schema/resolve/resolve.mjs +202 -1
  102. package/node_modules/typebox/build/schema/static/propertyNames.d.mts +5 -0
  103. package/node_modules/typebox/build/schema/static/propertyNames.mjs +3 -0
  104. package/node_modules/typebox/build/schema/static/schema.d.mts +3 -0
  105. package/node_modules/typebox/build/schema/types/index.d.mts +0 -2
  106. package/node_modules/typebox/build/schema/types/index.mjs +0 -2
  107. package/node_modules/typebox/build/system/memory/clone.mjs +14 -11
  108. package/node_modules/typebox/build/system/memory/discard.mjs +6 -5
  109. package/node_modules/typebox/build/system/settings/settings.d.mts +9 -0
  110. package/node_modules/typebox/build/system/settings/settings.mjs +2 -0
  111. package/node_modules/typebox/build/type/engine/call/distribute_arguments.d.mts +6 -1
  112. package/node_modules/typebox/build/type/engine/call/distribute_arguments.mjs +16 -3
  113. package/node_modules/typebox/build/type/engine/call/instantiate.mjs +34 -4
  114. package/node_modules/typebox/build/type/engine/evaluate/broaden.d.mts +5 -5
  115. package/node_modules/typebox/build/type/engine/evaluate/broaden.mjs +20 -26
  116. package/node_modules/typebox/build/type/engine/evaluate/compare.d.mts +6 -10
  117. package/node_modules/typebox/build/type/engine/evaluate/compare.mjs +9 -13
  118. package/node_modules/typebox/build/type/engine/evaluate/composite.d.mts +7 -4
  119. package/node_modules/typebox/build/type/engine/evaluate/composite.mjs +12 -19
  120. package/node_modules/typebox/build/type/engine/evaluate/distribute.d.mts +4 -20
  121. package/node_modules/typebox/build/type/engine/evaluate/distribute.mjs +8 -20
  122. package/node_modules/typebox/build/type/engine/evaluate/evaluate.d.mts +4 -4
  123. package/node_modules/typebox/build/type/engine/evaluate/evaluate.mjs +11 -8
  124. package/node_modules/typebox/build/type/engine/evaluate/flatten.d.mts +1 -1
  125. package/node_modules/typebox/build/type/engine/evaluate/flatten.mjs +3 -4
  126. package/node_modules/typebox/build/type/engine/evaluate/narrow.d.mts +17 -2
  127. package/node_modules/typebox/build/type/engine/evaluate/narrow.mjs +26 -6
  128. package/node_modules/typebox/build/type/engine/exclude/operation.mjs +3 -4
  129. package/node_modules/typebox/build/type/engine/extract/operation.d.mts +1 -1
  130. package/node_modules/typebox/build/type/engine/extract/operation.mjs +3 -4
  131. package/node_modules/typebox/build/type/engine/priority/priority.d.mts +2 -2
  132. package/node_modules/typebox/build/type/engine/priority/priority.mjs +3 -4
  133. package/node_modules/typebox/build/type/script/mapping.d.mts +32 -29
  134. package/node_modules/typebox/build/type/script/mapping.mjs +18 -25
  135. package/node_modules/typebox/build/type/script/parser.d.mts +19 -25
  136. package/node_modules/typebox/build/type/script/parser.mjs +27 -23
  137. package/node_modules/typebox/build/value/errors/errors.d.mts +2 -2
  138. package/node_modules/typebox/build/value/errors/errors.mjs +1 -1
  139. package/node_modules/typebox/package.json +27 -27
  140. package/node_modules/typebox/readme.md +79 -82
  141. package/package.json +5 -5
  142. package/node_modules/typebox/build/format/_idna.d.mts +0 -2
  143. package/node_modules/typebox/build/format/_idna.mjs +0 -246
  144. package/node_modules/typebox/build/format/_puny.d.mts +0 -1
  145. package/node_modules/typebox/build/format/_puny.mjs +0 -77
  146. package/node_modules/typebox/build/schema/resolve/ref.d.mts +0 -3
  147. package/node_modules/typebox/build/schema/resolve/ref.mjs +0 -146
  148. package/node_modules/typebox/build/schema/types/contentEncoding.d.mts +0 -9
  149. package/node_modules/typebox/build/schema/types/contentEncoding.mjs +0 -13
  150. package/node_modules/typebox/build/schema/types/contentMediaType.d.mts +0 -9
  151. package/node_modules/typebox/build/schema/types/contentMediaType.mjs +0 -13
@@ -1,15 +1,16 @@
1
- import { F as imessageMessageActions, I as probeIMessage, h as normalizeIMessageMessagingTarget, l as chunkTextForOutbound, m as looksLikeIMessageTargetId, n as resolveIMessageGroupToolPolicy, t as resolveIMessageGroupRequireMention } from "./group-policy-DF9xSdik.js";
2
- import { o as resolveIMessageAccount } from "./accounts-D00Njxg2.js";
3
- import { m as setIMessageRuntime } from "./monitor-reply-cache-DKlYGd5x.js";
1
+ import { o as resolveIMessageAccount } from "./accounts-DIpGOIiN.js";
2
+ import { m as setIMessageRuntime } from "./monitor-reply-cache-BdeUQaHO.js";
3
+ import { c as normalizeIMessageMessagingTarget, d as imessageMessageActions, f as probeIMessage, n as resolveIMessageGroupToolPolicy, s as looksLikeIMessageTargetId, t as resolveIMessageGroupRequireMention } from "./group-policy-BipELT2x.js";
4
4
  import { n as IMessageConfigSchema } from "./config-schema-DV0KP5nC.js";
5
- import { t as sendMessageIMessage } from "./send-BUXW76tw.js";
6
- import { t as monitorIMessageProvider } from "./monitor-DnxJ8pW9.js";
7
- import { buildComputedAccountStatusSnapshot, collectStatusIssuesFromLastError } from "openclaw/plugin-sdk/status-helpers";
5
+ import { t as sendMessageIMessage } from "./send-DVQY6M5M.js";
6
+ import { t as monitorIMessageProvider } from "./monitor-DRD_Dnp9.js";
8
7
  import { formatTrimmedAllowFromEntries } from "openclaw/plugin-sdk/channel-config-helpers";
9
- import { PAIRING_APPROVED_MESSAGE } from "openclaw/plugin-sdk/channel-status";
10
- import { DEFAULT_ACCOUNT_ID, getChatChannelMeta } from "openclaw/plugin-sdk/core";
8
+ import { buildComputedAccountStatusSnapshot, collectStatusIssuesFromLastError } from "openclaw/plugin-sdk/status-helpers";
11
9
  import { resolveChannelMediaMaxBytes } from "openclaw/plugin-sdk/media-runtime";
10
+ import { chunkTextForOutbound } from "openclaw/plugin-sdk/text-chunking";
11
+ import { DEFAULT_ACCOUNT_ID, getChatChannelMeta } from "openclaw/plugin-sdk/core";
12
12
  import { buildChannelConfigSchema } from "openclaw/plugin-sdk/channel-config-schema";
13
+ import { PAIRING_APPROVED_MESSAGE } from "openclaw/plugin-sdk/channel-status";
13
14
  //#region extensions/imessage/src/config-accessors.ts
14
15
  function resolveIMessageConfigAllowFrom(params) {
15
16
  return (resolveIMessageAccount(params).config.allowFrom ?? []).map((entry) => String(entry));
@@ -1,4 +1,4 @@
1
- import { u as expandIMessageUserPath } from "./accounts-D00Njxg2.js";
1
+ import { u as expandIMessageUserPath } from "./accounts-DIpGOIiN.js";
2
2
  import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
3
3
  import { resolveUserPath } from "openclaw/plugin-sdk/text-utility-runtime";
4
4
  import { spawn } from "node:child_process";
@@ -445,7 +445,7 @@ const FINAL_PRIVATE_MARKER_RE = /(?:#\+){2,}#?|\bassistant\s+to\s*=\s*\w+|^[ \t]
445
445
  const PRIVATE_USE_START = 57344;
446
446
  const PRIVATE_USE_END = 63743;
447
447
  const MAX_PRIVATE_MARKDOWN_UNWRAP_PASSES = 32;
448
- const PLAIN_TEXT_HTML_TAG_RE = /<\/?[a-z][a-z0-9_-]*\b[^>]*>/gi;
448
+ const PLAIN_TEXT_HTML_TAG_RE = /<\/?[a-z][a-z0-9_.:-]*(?=[\s/>])[^>]*>/gi;
449
449
  const PRIVATE_PROVIDER_TAG_NAMES = [
450
450
  "think",
451
451
  "thinking",
@@ -1,24 +1,25 @@
1
- import { A as enumerateConversationKeyForms, D as buildIMessageApprovalConversationKeyForInbound, M as normalizeIMessageGuid, N as getIMessageApprovalApprovers, P as imessageApprovalAuth, _ as appendIMessageApprovalReactionHintForOutboundMessage, j as normalizeConversationKey, k as enumerateApprovalTargetKeys, w as registerIMessageApprovalReactionTargetForOutboundMessage, y as extractIMessageApprovalPromptBinding } from "./group-policy-DF9xSdik.js";
2
- import { d as resolveIMessageChatDbLookupPath, l as resolveIMessageRemoteHost, n as hasExclusiveIMessageLocalDatabase, o as resolveIMessageAccount } from "./accounts-D00Njxg2.js";
3
- import { l as parseIMessageTarget, n as formatIMessageChatTarget, s as normalizeIMessageHandle } from "./message-tool-api-CPDfJJoE.js";
4
- import { c as rememberIMessageReplyCache, h as chatContextFromIMessageTarget, p as getOptionalIMessageRuntime } from "./monitor-reply-cache-DKlYGd5x.js";
5
- import { a as IMessageRpcRequestError, n as sanitizeIMessageFinalOutboundText, o as createIMessageRpcClient, t as protectIMessageFencedRoleMarkers } from "./sanitize-outbound-CoTZLXMw.js";
6
- import { a as rememberPersistedIMessageEcho, r as forgetPersistedIMessageEchoKey } from "./persisted-echo-cache-BPWGUK-L.js";
7
- import { i as runIMessageCliJsonCommand, r as resolveAuthorizedIMessageReplyReference, t as withIMessageRemoteFile } from "./remote-file-DLwO9ved.js";
1
+ import { d as resolveIMessageChatDbLookupPath, l as resolveIMessageRemoteHost, n as hasExclusiveIMessageLocalDatabase, o as resolveIMessageAccount } from "./accounts-DIpGOIiN.js";
2
+ import { l as parseIMessageTarget, n as formatIMessageChatTarget, s as normalizeIMessageHandle } from "./message-tool-api-BwIxJDoz.js";
3
+ import { c as rememberIMessageReplyCache, h as chatContextFromIMessageTarget, p as getOptionalIMessageRuntime, v as resolveIMessageDirectChatService } from "./monitor-reply-cache-BdeUQaHO.js";
4
+ import { a as IMessageRpcRequestError, n as sanitizeIMessageFinalOutboundText, o as createIMessageRpcClient, t as protectIMessageFencedRoleMarkers } from "./sanitize-outbound-g651fIhi.js";
5
+ import { l as getIMessageApprovalApprovers, u as imessageApprovalAuth } from "./group-policy-BipELT2x.js";
6
+ import { a as rememberPersistedIMessageEcho, r as forgetPersistedIMessageEchoKey } from "./persisted-echo-cache-DGxy-J4t.js";
7
+ import { d as normalizeConversationKey, f as normalizeIMessageGuid, i as registerIMessageApprovalReactionTarget, l as enumerateApprovalTargetKeys, s as buildIMessageApprovalConversationKeyForInbound, u as enumerateConversationKeyForms } from "./approval-reactions-Cvwmdlev.js";
8
+ import { i as runIMessageCliJsonCommand, r as resolveAuthorizedIMessageReplyReference, t as withIMessageRemoteFile } from "./remote-file-CyTTuRAt.js";
8
9
  import { createMessageReceiptFromOutboundResults } from "openclaw/plugin-sdk/channel-outbound";
9
10
  import { createLazyRuntimeSurface } from "openclaw/plugin-sdk/lazy-runtime";
10
11
  import { accessSync, constants } from "node:fs";
11
12
  import { basename } from "node:path";
12
13
  import { asOptionalRecord, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
13
14
  import { sleep } from "openclaw/plugin-sdk/runtime-env";
15
+ import { extractOriginalFilename, kindFromMime, resolveOutboundAttachmentFromUrl } from "openclaw/plugin-sdk/media-runtime";
14
16
  import { asDateTimestampMs } from "openclaw/plugin-sdk/number-runtime";
15
17
  import { PlatformMessageNotDispatchedError, isApprovalNotFoundError } from "openclaw/plugin-sdk/error-runtime";
16
- import { createApprovalReactionTargetStore, listApprovalReactionBindings } from "openclaw/plugin-sdk/approval-reaction-runtime";
17
- import { createPluginStateErrorReporter } from "openclaw/plugin-sdk/plugin-state-runtime";
18
- import { extractOriginalFilename, kindFromMime, resolveOutboundAttachmentFromUrl } from "openclaw/plugin-sdk/media-runtime";
18
+ import { addApprovalReactionHintToText, createApprovalReactionTargetStore, listApprovalReactionBindings } from "openclaw/plugin-sdk/approval-reaction-runtime";
19
19
  import { convertMarkdownTables, stripInlineDirectiveTagsForDelivery } from "openclaw/plugin-sdk/text-chunking";
20
20
  import { createChannelPartialDeliveryError } from "openclaw/plugin-sdk/channel-inbound";
21
21
  import { openNodeSqliteDatabase } from "openclaw/plugin-sdk/sqlite-runtime";
22
+ import { createPluginStateErrorReporter } from "openclaw/plugin-sdk/plugin-state-runtime";
22
23
  import { requireRuntimeConfig } from "openclaw/plugin-sdk/plugin-config-runtime";
23
24
  import { resolveMarkdownTableMode } from "openclaw/plugin-sdk/markdown-table-runtime";
24
25
  import { resolvePreferredOpenClawTmpDir, withTempWorkspace } from "openclaw/plugin-sdk/temp-path";
@@ -598,7 +599,7 @@ async function resolveFallbackSentMessageGuid(params) {
598
599
  return null;
599
600
  }
600
601
  function shouldRecoverApprovalPromptGuid(params) {
601
- return !params.filePath && !params.replyToId && Boolean(params.message.trim()) && Boolean(extractIMessageApprovalPromptBinding(params.message));
602
+ return Boolean(params.approvalPrompt && !params.filePath && !params.replyToId);
602
603
  }
603
604
  function canCheckSentMessageAfterRpcTimeout(params) {
604
605
  return Boolean(params.resolveSentMessageGuidImpl) || canResolveLatestSentMessageGuidFromChatDb(params.dbPath);
@@ -686,11 +687,6 @@ function resultService(value) {
686
687
  const normalized = normalizeOptionalString(value)?.toLowerCase();
687
688
  return normalized === "imessage" || normalized === "sms" ? normalized : void 0;
688
689
  }
689
- function resultChatGuidService(value) {
690
- const chatGuid = normalizeOptionalString(value);
691
- if (/^imessage;/iu.test(chatGuid ?? "")) return "imessage";
692
- return /^sms;/iu.test(chatGuid ?? "") ? "sms" : void 0;
693
- }
694
690
  function resolvePendingPersistedEchoTtlMs(timeoutMs) {
695
691
  return Math.max(MIN_PENDING_PERSISTED_ECHO_TTL_MS, Math.max(0, timeoutMs) + PENDING_PERSISTED_ECHO_GRACE_MS);
696
692
  }
@@ -886,7 +882,10 @@ async function sendMessageIMessage(to, text, opts) {
886
882
  const pendingEchoTtlMs = resolvePendingPersistedEchoTtlMs(timeoutMs);
887
883
  const region = opts.region?.trim() || account.config.region?.trim() || "US";
888
884
  const maxBytes = typeof opts.maxBytes === "number" ? opts.maxBytes : typeof account.config.mediaMaxMb === "number" ? account.config.mediaMaxMb * 1024 * 1024 : 16 * 1024 * 1024;
889
- let message = text && opts.approvalKind ? appendIMessageApprovalReactionHintForOutboundMessage(text) : text;
885
+ let message = opts.approvalPrompt ? addApprovalReactionHintToText({
886
+ text,
887
+ allowedDecisions: opts.approvalPrompt.allowedDecisions
888
+ }) : text;
890
889
  const protectedRoles = protectIMessageFencedRoleMarkers(message);
891
890
  message = protectedRoles.text;
892
891
  let filePath;
@@ -1074,7 +1073,7 @@ async function sendMessageIMessage(to, text, opts) {
1074
1073
  effectiveReplyToId = void 0;
1075
1074
  } else if (filePath || !isIMessageRpcSendTimeout(error)) throw error;
1076
1075
  else if (!shouldRecoverApprovalPromptGuid({
1077
- message,
1076
+ approvalPrompt: opts.approvalPrompt,
1078
1077
  filePath,
1079
1078
  replyToId: resolvedReplyToId
1080
1079
  }) || !canCheckSentMessageAfterRpcTimeout({
@@ -1105,7 +1104,7 @@ async function sendMessageIMessage(to, text, opts) {
1105
1104
  resolveMessageGuidImpl: opts.resolveMessageGuidImpl
1106
1105
  });
1107
1106
  if (!approvalBindingMessageId && shouldRecoverApprovalPromptGuid({
1108
- message,
1107
+ approvalPrompt: opts.approvalPrompt,
1109
1108
  filePath,
1110
1109
  replyToId: effectiveReplyToId
1111
1110
  })) approvalBindingMessageId = await resolveFallbackSentMessageGuid({
@@ -1122,7 +1121,7 @@ async function sendMessageIMessage(to, text, opts) {
1122
1121
  messageId: resolvedId ?? void 0
1123
1122
  });
1124
1123
  const providerChatGuid = normalizeOptionalString(result.chat_guid) ?? normalizeOptionalString(result.chatGuid);
1125
- const confirmedService = resultService(result.service) ?? resultChatGuidService(providerChatGuid) ?? (service === "imessage" || service === "sms" ? service : void 0);
1124
+ const confirmedService = resolveIMessageDirectChatService(resultService(result.service) ?? service, providerChatGuid);
1126
1125
  if (resolvedId && isConcreteIMessageMessageId(resolvedId)) {
1127
1126
  const chatContext = chatContextFromIMessageTarget(target, confirmedService ?? service);
1128
1127
  rememberIMessageReplyCache({
@@ -1134,7 +1133,7 @@ async function sendMessageIMessage(to, text, opts) {
1134
1133
  isFromMe: true
1135
1134
  });
1136
1135
  }
1137
- if (message && approvalBindingMessageId && opts.approvalKind) {
1136
+ if (message && approvalBindingMessageId && opts.approvalPrompt) {
1138
1137
  const handleForKey = target.kind === "handle" ? normalizeIMessageHandle(target.to) : void 0;
1139
1138
  const conversation = {
1140
1139
  ...target.kind === "chat_guid" ? { chatGuid: target.chatGuid } : {},
@@ -1142,12 +1141,13 @@ async function sendMessageIMessage(to, text, opts) {
1142
1141
  ...target.kind === "chat_id" ? { chatId: target.chatId } : {},
1143
1142
  ...handleForKey ? { handle: handleForKey } : {}
1144
1143
  };
1145
- registerIMessageApprovalReactionTargetForOutboundMessage({
1144
+ registerIMessageApprovalReactionTarget({
1146
1145
  accountId: account.accountId,
1147
1146
  conversation,
1148
1147
  messageId: approvalBindingMessageId,
1149
- text: message,
1150
- approvalKind: opts.approvalKind
1148
+ approvalId: opts.approvalPrompt.approvalId,
1149
+ approvalKind: opts.approvalPrompt.approvalKind,
1150
+ allowedDecisions: opts.approvalPrompt.allowedDecisions
1151
1151
  });
1152
1152
  }
1153
1153
  return {
@@ -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';
@@ -0,0 +1,2 @@
1
+ export * from './hostname.mjs';
2
+ export * from './idn-hostname.mjs';
@@ -0,0 +1 @@
1
+ export declare function IsAsciiLabel(value: string): boolean;
@@ -0,0 +1,9 @@
1
+ import * as Pattern from '../pattern/pattern.mjs';
2
+ // -------------------------------------------------------------------
3
+ // Validates an ASCII LDH label per RFC 5891 §4.2.3.1
4
+ // -------------------------------------------------------------------
5
+ export function IsAsciiLabel(value) {
6
+ return (Pattern.RE_RULE_HYPHEN_PLACEMENT.test(value) &&
7
+ Pattern.RE_RULE_NOT_RESERVED_ACE.test(value) &&
8
+ Pattern.RE_ASCII_LDH.test(value));
9
+ }
@@ -0,0 +1 @@
1
+ export declare function IsPunyLabel(value: string): boolean;