@openclaw/imessage 2026.10.10-beta.5 → 2026.11.5-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 (142) hide show
  1. package/dist/.setup/{accounts-DacCvDBt.mjs → accounts-C1Ypv3Wn.mjs} +9 -13
  2. package/dist/.setup/{actions-762Azi-J.mjs → actions-qOuKy8To.mjs} +364 -116
  3. package/dist/.setup/{actions.runtime-DHiRiPHe.mjs → actions.runtime-Ccg9CARL.mjs} +12 -61
  4. package/dist/.setup/{api-Deyo8NDs.mjs → api-BXXuQQCS.mjs} +8 -9
  5. package/dist/.setup/{api-BFGXDHiC.mjs → api-DTbxSOPc.mjs} +9 -9
  6. package/dist/.setup/{approval-handler.runtime-fsSBf2jf.mjs → approval-handler.runtime-B6vrFfZx.mjs} +113 -133
  7. package/dist/.setup/{approval-reactions-CoAkCiwf.mjs → approval-reactions-DBBsqbRC.mjs} +156 -79
  8. package/dist/.setup/{channel-C61YdcZR.mjs → channel-CLaN4mQn.mjs} +151 -137
  9. package/dist/.setup/{channel.runtime-B5jle0g3.mjs → channel.runtime-XJGx1MIH.mjs} +236 -425
  10. package/dist/.setup/chat-context-fTfJVqAi.mjs +77 -0
  11. package/dist/.setup/chat-lookup-xtPsOBkl.mjs +50 -0
  12. package/dist/.setup/client-D_BaG8sC.mjs +367 -0
  13. package/dist/.setup/{config-schema-DXwa_3V5.mjs → config-schema-BjkQV5P5.mjs} +1 -4
  14. package/dist/.setup/{conversation-bindings-DR-dbHjs.mjs → conversation-bindings-8DjxoIYU.mjs} +10 -8
  15. package/dist/.setup/{media-contract-BwWs5PM7.mjs → media-contract-BErFBKV9.mjs} +2 -3
  16. package/dist/.setup/{message-tool-api-B5NfPnFL.mjs → message-tool-api-DtZ1wKbT.mjs} +6 -12
  17. package/dist/.setup/{outbound-send-deps-B-QEsLSM.mjs → outbound-send-deps-_da8jqeo.mjs} +1 -2
  18. package/dist/.setup/{remote-file-B94a787O.mjs → remote-file-DpK3GQFD.mjs} +12 -30
  19. package/dist/.setup/{rolldown-runtime-BBjsoOtd.mjs → rolldown-runtime-782esTHO.mjs} +1 -2
  20. package/dist/.setup/{sanitize-outbound-BtEY324R.mjs → sanitize-outbound-Dhjhz0a-.mjs} +25 -31
  21. package/dist/.setup/{send-BvxKNWzF.mjs → send-DhEW0gfe.mjs} +155 -236
  22. package/dist/.setup/{setup-core-BHyLkAEJ.mjs → setup-core-B1_P_t4T.mjs} +3 -4
  23. package/dist/.setup/{setup-surface-DPqiLGy0.mjs → setup-surface-CD28mXWK.mjs} +13 -29
  24. package/dist/.setup/{targets-B4oU7n-v.mjs → targets-C7CIWJ0k.mjs} +15 -9
  25. package/dist/.source-module-urls/929c518fa2986b0f85f66bceefead22868db0ab452dee914dc6a2bb86b2e60ad.json +1 -1
  26. package/dist/api.js +9 -9
  27. package/dist/channel-config-api.js +1 -1
  28. package/dist/channel-plugin-api.js +1 -1
  29. package/dist/contract-api.js +1 -1
  30. package/dist/doctor-contract-api.js +7 -13
  31. package/dist/index.js +1 -2
  32. package/dist/media-contract-api.js +1 -1
  33. package/dist/message-tool-api.js +1 -1
  34. package/dist/runtime-api.js +1 -3
  35. package/dist/secret-contract-api.js +1 -2
  36. package/dist/session-binding-contract-api.js +1 -1
  37. package/dist/setup-entry.js +2 -3
  38. package/dist/src/chat-db.worker.js +2 -3
  39. package/node_modules/typebox/build/format/duration.d.mts +2 -2
  40. package/node_modules/typebox/build/format/duration.mjs +2 -2
  41. package/node_modules/typebox/build/format/idn_email.d.mts +1 -0
  42. package/node_modules/typebox/build/format/idn_email.mjs +1 -0
  43. package/node_modules/typebox/build/format/idn_hostname.d.mts +1 -1
  44. package/node_modules/typebox/build/format/idn_hostname.mjs +1 -1
  45. package/node_modules/typebox/build/format/ipv4.d.mts +2 -2
  46. package/node_modules/typebox/build/format/ipv4.mjs +2 -2
  47. package/node_modules/typebox/build/format/ipv6.d.mts +1 -1
  48. package/node_modules/typebox/build/format/ipv6.mjs +1 -1
  49. package/node_modules/typebox/build/format/relative_json_pointer.d.mts +2 -2
  50. package/node_modules/typebox/build/format/relative_json_pointer.mjs +2 -2
  51. package/node_modules/typebox/build/schema/build.mjs +1 -0
  52. package/node_modules/typebox/build/schema/engine/_unique.d.mts +4 -2
  53. package/node_modules/typebox/build/schema/engine/_unique.mjs +7 -3
  54. package/node_modules/typebox/build/schema/engine/additionalItems.mjs +3 -3
  55. package/node_modules/typebox/build/schema/engine/additionalProperties.d.mts +0 -3
  56. package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +15 -17
  57. package/node_modules/typebox/build/schema/engine/contains.mjs +3 -3
  58. package/node_modules/typebox/build/schema/engine/index.d.mts +1 -0
  59. package/node_modules/typebox/build/schema/engine/index.mjs +1 -0
  60. package/node_modules/typebox/build/schema/engine/items.mjs +7 -4
  61. package/node_modules/typebox/build/schema/engine/maxContains.mjs +2 -2
  62. package/node_modules/typebox/build/schema/engine/minContains.mjs +3 -3
  63. package/node_modules/typebox/build/schema/engine/oneOf.mjs +2 -2
  64. package/node_modules/typebox/build/schema/engine/patternProperties.mjs +2 -2
  65. package/node_modules/typebox/build/schema/engine/propertyNames.mjs +2 -2
  66. package/node_modules/typebox/build/schema/engine/unevaluatedItems.mjs +2 -2
  67. package/node_modules/typebox/build/schema/engine/unevaluatedProperties.mjs +2 -2
  68. package/node_modules/typebox/build/system/hashing/hash.mjs +63 -34
  69. package/node_modules/typebox/build/system/locale/en_US.mjs +2 -1
  70. package/node_modules/typebox/build/system/memory/assign.d.mts +2 -8
  71. package/node_modules/typebox/build/system/memory/assign.mjs +13 -6
  72. package/node_modules/typebox/build/system/memory/clone.d.mts +4 -5
  73. package/node_modules/typebox/build/system/memory/clone.mjs +8 -96
  74. package/node_modules/typebox/build/system/memory/create.d.mts +1 -5
  75. package/node_modules/typebox/build/system/memory/create.mjs +18 -13
  76. package/node_modules/typebox/build/system/memory/deep.d.mts +2 -0
  77. package/node_modules/typebox/build/system/memory/deep.mjs +108 -0
  78. package/node_modules/typebox/build/system/memory/discard.d.mts +1 -1
  79. package/node_modules/typebox/build/system/memory/discard.mjs +9 -8
  80. package/node_modules/typebox/build/system/memory/finalize.d.mts +4 -0
  81. package/node_modules/typebox/build/system/memory/finalize.mjs +30 -0
  82. package/node_modules/typebox/build/system/memory/keys.d.mts +2 -0
  83. package/node_modules/typebox/build/system/memory/keys.mjs +8 -0
  84. package/node_modules/typebox/build/system/memory/update.d.mts +1 -4
  85. package/node_modules/typebox/build/system/memory/update.mjs +43 -16
  86. package/node_modules/typebox/build/type/engine/call/index.d.mts +1 -0
  87. package/node_modules/typebox/build/type/engine/call/index.mjs +1 -0
  88. package/node_modules/typebox/build/type/engine/evaluate/composite.d.mts +2 -24
  89. package/node_modules/typebox/build/type/engine/evaluate/composite.mjs +2 -29
  90. package/node_modules/typebox/build/type/engine/evaluate/index.d.mts +1 -0
  91. package/node_modules/typebox/build/type/engine/evaluate/index.mjs +1 -0
  92. package/node_modules/typebox/build/type/engine/evaluate/narrow.d.mts +5 -1
  93. package/node_modules/typebox/build/type/engine/evaluate/narrow.mjs +6 -1
  94. package/node_modules/typebox/build/type/engine/evaluate/property.d.mts +30 -0
  95. package/node_modules/typebox/build/type/engine/evaluate/property.mjs +29 -0
  96. package/node_modules/typebox/build/type/engine/immutable/instantiate_add.d.mts +1 -3
  97. package/node_modules/typebox/build/type/engine/immutable/instantiate_add.mjs +1 -4
  98. package/node_modules/typebox/build/type/engine/object/from_intersect.d.mts +2 -2
  99. package/node_modules/typebox/build/type/engine/object/from_intersect.mjs +2 -2
  100. package/node_modules/typebox/build/type/engine/object/from_union.d.mts +2 -2
  101. package/node_modules/typebox/build/type/engine/object/from_union.mjs +2 -2
  102. package/node_modules/typebox/build/type/engine/optional/instantiate_add.d.mts +1 -3
  103. package/node_modules/typebox/build/type/engine/optional/instantiate_add.mjs +1 -4
  104. package/node_modules/typebox/build/type/engine/readonly/instantiate_add.d.mts +1 -3
  105. package/node_modules/typebox/build/type/engine/readonly/instantiate_add.mjs +1 -4
  106. package/node_modules/typebox/build/type/engine/this/index.d.mts +1 -0
  107. package/node_modules/typebox/build/type/engine/this/index.mjs +1 -0
  108. package/node_modules/typebox/build/value/clone/clone.d.mts +4 -3
  109. package/node_modules/typebox/build/value/clone/clone.mjs +5 -7
  110. package/node_modules/typebox/build/value/repair/from_cyclic.d.mts +2 -0
  111. package/node_modules/typebox/build/value/repair/from_cyclic.mjs +6 -0
  112. package/node_modules/typebox/build/value/shared/union_priority_sort.mjs +25 -14
  113. package/node_modules/typebox/package.json +1 -1
  114. package/node_modules/typebox/readme.md +1 -1
  115. package/node_modules/zod/package.json +1 -1
  116. package/node_modules/zod/src/v4/classic/tests/array.test.ts +27 -0
  117. package/node_modules/zod/src/v4/classic/tests/map.test.ts +7 -0
  118. package/node_modules/zod/src/v4/classic/tests/set.test.ts +6 -0
  119. package/node_modules/zod/src/v4/core/compile.ts +9 -0
  120. package/node_modules/zod/src/v4/core/schemas.ts +35 -1
  121. package/node_modules/zod/src/v4/core/util.ts +13 -0
  122. package/node_modules/zod/src/v4/core/versions.ts +1 -1
  123. package/node_modules/zod/v4/core/compile.cjs +8 -0
  124. package/node_modules/zod/v4/core/compile.js +8 -0
  125. package/node_modules/zod/v4/core/schemas.cjs +30 -0
  126. package/node_modules/zod/v4/core/schemas.d.cts +3 -1
  127. package/node_modules/zod/v4/core/schemas.d.ts +3 -1
  128. package/node_modules/zod/v4/core/schemas.js +30 -0
  129. package/node_modules/zod/v4/core/util.cjs +15 -0
  130. package/node_modules/zod/v4/core/util.d.cts +2 -0
  131. package/node_modules/zod/v4/core/util.d.ts +2 -0
  132. package/node_modules/zod/v4/core/util.js +14 -0
  133. package/node_modules/zod/v4/core/versions.cjs +1 -1
  134. package/node_modules/zod/v4/core/versions.js +1 -1
  135. package/openclaw.plugin.json +0 -30
  136. package/package.json +6 -6
  137. package/dist/.setup/client-CcROCvRq.mjs +0 -746
  138. package/dist/.setup/question-reactions-BD06B1Lx.mjs +0 -68
  139. package/dist/.setup/reaction-context-Q26DYzQH.mjs +0 -106
  140. package/dist/.setup/runtime-Cza4CY5T.mjs +0 -8
  141. package/node_modules/typebox/build/system/memory/freeze.d.mts +0 -4
  142. package/node_modules/typebox/build/system/memory/freeze.mjs +0 -6
@@ -1,66 +1,19 @@
1
- import { l as resolveIMessageMessageId, n as createIMessageRpcClient, r as runIMessageCliJsonCommand, x as normalizeDirectChatIdentifier } from "./client-CcROCvRq.mjs";
2
- import { n as sanitizeIMessageFinalOutboundText } from "./sanitize-outbound-BtEY324R.mjs";
3
- import { n as authorizeIMessageResourceReference, t as withIMessageRemoteFile } from "./remote-file-B94a787O.mjs";
4
- import { isRecord, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
1
+ import { i as runIMessageCliJsonCommand, n as createIMessageRpcClient } from "./client-D_BaG8sC.mjs";
2
+ import { s as resolveIMessageMessageId } from "./actions-qOuKy8To.mjs";
3
+ import { n as sanitizeIMessageFinalOutboundText } from "./sanitize-outbound-Dhjhz0a-.mjs";
4
+ import { resolveIMessageChat } from "./chat-lookup-xtPsOBkl.mjs";
5
+ import { n as authorizeIMessageResourceReference, t as withIMessageRemoteFile } from "./remote-file-DpK3GQFD.mjs";
5
6
  import { basename, parse, win32 } from "node:path";
6
- import { parseStrictInteger } from "openclaw/plugin-sdk/number-runtime";
7
7
  import { truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
8
8
  import { captureChannelReadAuthority, captureEffectAuthority } from "openclaw/plugin-sdk/fetch-runtime";
9
9
  import { sanitizeUntrustedFileName } from "openclaw/plugin-sdk/security-runtime";
10
10
  import { resolvePreferredOpenClawTmpDir, withTempWorkspace } from "openclaw/plugin-sdk/temp-path";
11
- //#region extensions/imessage/src/actions-chat-guid.ts
12
- const CHAT_LIST_CACHE_TTL_MS = 3e4;
13
- const chatListCache = /* @__PURE__ */ new Map();
14
- function numberFromUnknown(value) {
15
- return typeof value === "number" && Number.isFinite(value) ? value : parseStrictInteger(value);
16
- }
17
- function findChatGuid(chats, target) {
18
- if (target.kind === "chat_id") {
19
- for (const chat of chats) {
20
- const id = numberFromUnknown(chat.id);
21
- const guid = normalizeOptionalString(chat.guid);
22
- if (id === target.chatId && guid) return guid;
23
- }
24
- return null;
25
- }
26
- const wanted = normalizeDirectChatIdentifier(target.chatIdentifier);
27
- for (const chat of chats) {
28
- const identifier = normalizeOptionalString(chat.identifier);
29
- const guid = normalizeOptionalString(chat.guid);
30
- if (guid && (identifier === target.chatIdentifier || guid === target.chatIdentifier || identifier && normalizeDirectChatIdentifier(identifier) === wanted || normalizeDirectChatIdentifier(guid) === wanted)) return guid;
31
- }
32
- return null;
33
- }
34
- async function resolveIMessageActionChatGuid(params) {
35
- const { cliPath, dbPath, remoteHost } = params.options;
36
- const key = `${cliPath}\0${dbPath ?? ""}\0${remoteHost ?? ""}`;
37
- const cached = chatListCache.get(key);
38
- if (cached && cached.expiresAt > Date.now()) return findChatGuid(cached.list, params.target);
39
- chatListCache.delete(key);
40
- const client = await createIMessageRpcClient(params.options);
41
- try {
42
- const result = await client.request("chats.list", { limit: 1e3 }, { timeoutMs: params.options.timeoutMs });
43
- const list = isRecord(result) && Array.isArray(result.chats) ? result.chats.filter(isRecord) : [];
44
- chatListCache.set(key, {
45
- list,
46
- expiresAt: Date.now() + CHAT_LIST_CACHE_TTL_MS
47
- });
48
- return findChatGuid(list, params.target);
49
- } finally {
50
- await client.stop();
51
- }
52
- }
53
- //#endregion
54
- //#region extensions/imessage/src/actions-transport.ts
55
- var IMessageRemoteUnsupportedError = class extends Error {
56
- constructor(message) {
57
- super(message);
58
- this.code = "IMESSAGE_REMOTE_UNSUPPORTED";
59
- this.name = "IMessageRemoteUnsupportedError";
60
- }
61
- };
11
+ // extensions/imessage/src/actions-transport.ts
62
12
  function throwIMessageRemoteUnsupported(message) {
63
- throw new IMessageRemoteUnsupportedError(`iMessage Remote Mac limitation: ${message}`);
13
+ throw Object.assign(/* @__PURE__ */ new Error(`iMessage Remote Mac limitation: ${message}`), {
14
+ code: "IMESSAGE_REMOTE_UNSUPPORTED",
15
+ name: "IMessageRemoteUnsupportedError"
16
+ });
64
17
  }
65
18
  async function runIMessageAction(options, method, params, args) {
66
19
  if (!options.remoteHost) {
@@ -86,8 +39,7 @@ async function runIMessageAction(options, method, params, args) {
86
39
  await client.stop();
87
40
  }
88
41
  }
89
- //#endregion
90
- //#region extensions/imessage/src/actions.runtime.ts
42
+ // extensions/imessage/src/actions.runtime.ts
91
43
  /**
92
44
  * Messages mints the option UUIDs, so the send response is the only place they
93
45
  * appear before someone votes. Approval bindings key decisions off these ids
@@ -167,7 +119,7 @@ function participantAction(method, command) {
167
119
  const imessageActionsRuntime = {
168
120
  resolveIMessageMessageId,
169
121
  authorizeMessageReference: authorizeIMessageResourceReference,
170
- resolveChatGuidForTarget: resolveIMessageActionChatGuid,
122
+ resolveChatGuidForTarget: async (params) => (await resolveIMessageChat(params))?.guid ?? null,
171
123
  async sendReaction(params) {
172
124
  await runMessageAction(params, "tapback", "tapback", {
173
125
  reaction: params.reaction,
@@ -330,5 +282,4 @@ const imessageActionsRuntime = {
330
282
  });
331
283
  }
332
284
  };
333
- //#endregion
334
285
  export { imessageActionsRuntime };
@@ -1,15 +1,14 @@
1
- import "./targets-B4oU7n-v.mjs";
2
- import "./accounts-DacCvDBt.mjs";
3
- import "./message-tool-api-B5NfPnFL.mjs";
4
- import "./actions-762Azi-J.mjs";
5
- import { s as imessageSetupContract } from "./setup-core-BHyLkAEJ.mjs";
6
- import { n as createIMessagePluginBase, r as imessageSetupWizard } from "./channel-C61YdcZR.mjs";
7
- import "./conversation-bindings-DR-dbHjs.mjs";
1
+ import "./targets-C7CIWJ0k.mjs";
2
+ import "./accounts-C1Ypv3Wn.mjs";
3
+ import "./message-tool-api-DtZ1wKbT.mjs";
4
+ import "./actions-qOuKy8To.mjs";
5
+ import { s as imessageSetupContract } from "./setup-core-B1_P_t4T.mjs";
6
+ import { n as createIMessagePluginBase, r as imessageSetupWizard } from "./channel-CLaN4mQn.mjs";
7
+ import "./conversation-bindings-8DjxoIYU.mjs";
8
8
  import { createAllowedChatSenderMatcher as createAllowedChatSenderMatcher$1, parseChatAllowTargetPrefixes, parseChatTargetPrefixesOrThrow as parseChatTargetPrefixesOrThrow$1, resolveServicePrefixedAllowTarget, resolveServicePrefixedChatTarget as resolveServicePrefixedChatTarget$1, resolveServicePrefixedOrChatAllowTarget as resolveServicePrefixedOrChatAllowTarget$1, resolveServicePrefixedTarget } from "openclaw/plugin-sdk/channel-targets";
9
- //#region extensions/imessage/src/channel.setup.ts
9
+ // extensions/imessage/src/channel.setup.ts
10
10
  const imessageSetupPlugin = createIMessagePluginBase({
11
11
  setupWizard: imessageSetupWizard,
12
12
  setupContract: imessageSetupContract
13
13
  });
14
- //#endregion
15
14
  export { resolveServicePrefixedChatTarget$1 as a, imessageSetupPlugin as c, resolveServicePrefixedAllowTarget as i, parseChatAllowTargetPrefixes as n, resolveServicePrefixedOrChatAllowTarget$1 as o, parseChatTargetPrefixesOrThrow$1 as r, resolveServicePrefixedTarget as s, createAllowedChatSenderMatcher$1 as t };
@@ -1,10 +1,10 @@
1
- import { a as looksLikeIMessageExplicitTargetId, c as parseIMessageTarget, d as normalizeIMessageMessagingTarget, i as isAllowedIMessageSender, n as inferIMessageTargetChatType, o as normalizeIMessageHandle, s as parseIMessageAllowTarget, t as formatIMessageChatTarget, u as looksLikeIMessageTargetId } from "./targets-B4oU7n-v.mjs";
2
- import { a as resolveDefaultIMessageAccountId, i as listIMessageAccountIds, o as resolveIMessageAccount, r as listEnabledIMessageAccounts } from "./accounts-DacCvDBt.mjs";
3
- import { o as IMESSAGE_ACTIONS, s as IMESSAGE_ACTION_NAMES } from "./message-tool-api-B5NfPnFL.mjs";
4
- import { _ as DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS } from "./client-CcROCvRq.mjs";
5
- import { n as probeIMessage } from "./actions-762Azi-J.mjs";
6
- import { c as matchIMessageAcpConversation, i as resolveIMessageGroupRequireMention, l as normalizeIMessageAcpConversationId, o as resolveIMessageGroupToolPolicy, s as resolveIMessageInboundConversationId, t as imessagePlugin, u as resolveIMessageConversationIdFromTarget } from "./channel-C61YdcZR.mjs";
7
- import { n as createIMessageConversationBindingManagerV2, t as createIMessageConversationBindingManager } from "./conversation-bindings-DR-dbHjs.mjs";
8
- import { a as resolveServicePrefixedChatTarget, c as imessageSetupPlugin, i as resolveServicePrefixedAllowTarget, n as parseChatAllowTargetPrefixes, o as resolveServicePrefixedOrChatAllowTarget, r as parseChatTargetPrefixesOrThrow, s as resolveServicePrefixedTarget, t as createAllowedChatSenderMatcher } from "./api-Deyo8NDs.mjs";
9
- import { t as IMESSAGE_LEGACY_OUTBOUND_SEND_DEP_KEYS } from "./outbound-send-deps-B-QEsLSM.mjs";
1
+ import { a as isAllowedIMessageSender, c as parseIMessageAllowTarget, d as looksLikeIMessageTargetId, f as normalizeIMessageMessagingTarget, l as parseIMessageTarget, o as looksLikeIMessageExplicitTargetId, r as inferIMessageTargetChatType, s as normalizeIMessageHandle, t as formatIMessageChatTarget } from "./targets-C7CIWJ0k.mjs";
2
+ import { a as resolveDefaultIMessageAccountId, i as listIMessageAccountIds, o as resolveIMessageAccount, r as listEnabledIMessageAccounts } from "./accounts-C1Ypv3Wn.mjs";
3
+ import { o as IMESSAGE_ACTIONS, s as IMESSAGE_ACTION_NAMES } from "./message-tool-api-DtZ1wKbT.mjs";
4
+ import { a as DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS } from "./client-D_BaG8sC.mjs";
5
+ import { n as probeIMessage } from "./actions-qOuKy8To.mjs";
6
+ import { c as matchIMessageAcpConversation, i as resolveIMessageGroupRequireMention, l as normalizeIMessageAcpConversationId, o as resolveIMessageGroupToolPolicy, s as resolveIMessageInboundConversationId, t as imessagePlugin, u as resolveIMessageConversationIdFromTarget } from "./channel-CLaN4mQn.mjs";
7
+ import { n as createIMessageConversationBindingManagerV2, t as createIMessageConversationBindingManager } from "./conversation-bindings-8DjxoIYU.mjs";
8
+ import { a as resolveServicePrefixedChatTarget, c as imessageSetupPlugin, i as resolveServicePrefixedAllowTarget, n as parseChatAllowTargetPrefixes, o as resolveServicePrefixedOrChatAllowTarget, r as parseChatTargetPrefixesOrThrow, s as resolveServicePrefixedTarget, t as createAllowedChatSenderMatcher } from "./api-BXXuQQCS.mjs";
9
+ import { t as IMESSAGE_LEGACY_OUTBOUND_SEND_DEP_KEYS } from "./outbound-send-deps-_da8jqeo.mjs";
10
10
  export { DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS, IMESSAGE_ACTIONS, IMESSAGE_ACTION_NAMES, IMESSAGE_LEGACY_OUTBOUND_SEND_DEP_KEYS, createAllowedChatSenderMatcher, createIMessageConversationBindingManager, createIMessageConversationBindingManagerV2, formatIMessageChatTarget, imessagePlugin, imessageSetupPlugin, inferIMessageTargetChatType, isAllowedIMessageSender, listEnabledIMessageAccounts, listIMessageAccountIds, looksLikeIMessageExplicitTargetId, looksLikeIMessageTargetId, matchIMessageAcpConversation, normalizeIMessageAcpConversationId, normalizeIMessageHandle, normalizeIMessageMessagingTarget, parseChatAllowTargetPrefixes, parseChatTargetPrefixesOrThrow, parseIMessageAllowTarget, parseIMessageTarget, probeIMessage, resolveDefaultIMessageAccountId, resolveIMessageAccount, resolveIMessageConversationIdFromTarget, resolveIMessageGroupRequireMention, resolveIMessageGroupToolPolicy, resolveIMessageInboundConversationId, resolveServicePrefixedAllowTarget, resolveServicePrefixedChatTarget, resolveServicePrefixedOrChatAllowTarget, resolveServicePrefixedTarget };
@@ -1,11 +1,11 @@
1
- import { c as parseIMessageTarget, d as normalizeIMessageMessagingTarget } from "./targets-B4oU7n-v.mjs";
2
- import { o as resolveIMessageAccount } from "./accounts-DacCvDBt.mjs";
3
- import { n as getCachedIMessagePrivateApiStatus } from "./message-tool-api-B5NfPnFL.mjs";
4
- import { a as normalizeIMessageMessageId } from "./actions-762Azi-J.mjs";
5
- import { d as getIMessageApprovalApprovers } from "./channel-C61YdcZR.mjs";
6
- import { i as extractMarkdownFormatRuns } from "./sanitize-outbound-BtEY324R.mjs";
7
- import { a as unregisterIMessageApprovalReactionTarget, c as buildIMessageApprovalConversationKeyForTarget, i as registerIMessageApprovalReactionTarget } from "./approval-reactions-CoAkCiwf.mjs";
8
- import { a as iMessageApprovalPollTargets, i as buildApprovalPollOptions, o as mapSentPollOptionsToDecisions, t as sendMessageIMessage } from "./send-BvxKNWzF.mjs";
1
+ import { f as normalizeIMessageMessagingTarget, l as parseIMessageTarget } from "./targets-C7CIWJ0k.mjs";
2
+ import { o as resolveIMessageAccount } from "./accounts-C1Ypv3Wn.mjs";
3
+ import { n as getCachedIMessagePrivateApiStatus } from "./message-tool-api-DtZ1wKbT.mjs";
4
+ import { b as normalizeIMessageMessageId } from "./actions-qOuKy8To.mjs";
5
+ import { d as getIMessageApprovalApprovers } from "./channel-CLaN4mQn.mjs";
6
+ import { i as extractMarkdownFormatRuns } from "./sanitize-outbound-Dhjhz0a-.mjs";
7
+ import { c as buildIMessageApprovalConversationKeyForTarget, i as unregisterIMessageApprovalReactionTarget, r as registerIMessageApprovalReactionTarget } from "./approval-reactions-DBBsqbRC.mjs";
8
+ import { a as iMessageApprovalPollTargets, i as buildApprovalPollOptions, o as mapSentPollOptionsToDecisions, t as sendMessageIMessage } from "./send-DhEW0gfe.mjs";
9
9
  import { createLazyRuntimeNamedExport } from "openclaw/plugin-sdk/lazy-runtime";
10
10
  import { createActionGate } from "openclaw/plugin-sdk/channel-actions";
11
11
  import { createSubsystemLogger } from "openclaw/plugin-sdk/runtime-env";
@@ -13,9 +13,9 @@ import { buildChannelApprovalNativeTargetKey } from "openclaw/plugin-sdk/approva
13
13
  import { buildApprovalNativeControlsPromptText, buildApprovalReactionPendingContent } from "openclaw/plugin-sdk/approval-reaction-runtime";
14
14
  import { setTimeout } from "node:timers/promises";
15
15
  import { buildChannelApprovalExpiredText, buildChannelApprovalResolvedText, createChannelApprovalNativeRuntimeAdapterAsync, resolvePreparedApprovalAccountId } from "openclaw/plugin-sdk/approval-handler-runtime";
16
- //#region extensions/imessage/src/approval-handler.runtime.ts
16
+ // extensions/imessage/src/approval-handler.runtime.ts
17
17
  const log = createSubsystemLogger("imessage/approvals");
18
- const loadIMessageActionsRuntime = createLazyRuntimeNamedExport(() => import("./actions.runtime-DHiRiPHe.mjs"), "imessageActionsRuntime");
18
+ const loadIMessageActionsRuntime = createLazyRuntimeNamedExport(() => import("./actions.runtime-Ccg9CARL.mjs"), "imessageActionsRuntime");
19
19
  const DEFAULT_PROBE_TIMEOUT_MS = 5e3;
20
20
  const APPROVAL_POLL_ORDERING_DELAY_MS = 1100;
21
21
  function classifyIMessageApprovalTargetTransport(params) {
@@ -33,113 +33,6 @@ function classifyIMessageApprovalTargetTransport(params) {
33
33
  if (/^SMS;/i.test(conversationId)) return "sms";
34
34
  return "unknown";
35
35
  }
36
- function canIMessageApprovalUsePoll(params) {
37
- if (params.plannedTarget.surface !== "origin" && params.plannedTarget.surface !== "approver-dm") return false;
38
- if (buildApprovalPollOptions({ allowedDecisions: params.allowedDecisions }).length < 2) return false;
39
- try {
40
- const account = resolveIMessageAccount({
41
- cfg: params.cfg,
42
- accountId: params.target.accountId
43
- });
44
- if (classifyIMessageApprovalTargetTransport({
45
- cfg: params.cfg,
46
- target: params.target
47
- }) === "sms") return false;
48
- if (!createActionGate(account.config.actions)("polls") || getIMessageApprovalApprovers({
49
- cfg: params.cfg,
50
- accountId: account.accountId
51
- }).length === 0) return false;
52
- const cliPath = account.config.cliPath?.trim() || "imsg";
53
- const status = getCachedIMessagePrivateApiStatus(cliPath);
54
- return status?.available === true && status?.selectors?.pollPayloadMessage === true && status.cliCapabilities?.pollSendSupportsNoComment === true;
55
- } catch {
56
- return false;
57
- }
58
- }
59
- async function deliverIMessageApprovalPoll(params) {
60
- const options = buildApprovalPollOptions({ allowedDecisions: params.allowedDecisions });
61
- try {
62
- const account = resolveIMessageAccount({
63
- cfg: params.cfg,
64
- accountId: params.target.accountId
65
- });
66
- const cliOptions = {
67
- cliPath: account.config.cliPath?.trim() || "imsg",
68
- dbPath: account.config.dbPath?.trim() || void 0,
69
- timeoutMs: account.config.probeTimeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS
70
- };
71
- const target = parseIMessageTarget(params.target.to);
72
- let chatGuid;
73
- if (target.kind === "chat_guid") chatGuid = target.chatGuid;
74
- else chatGuid = await (await loadIMessageActionsRuntime()).resolveChatGuidForTarget({
75
- target: target.kind === "handle" ? {
76
- kind: "chat_identifier",
77
- chatIdentifier: `${target.service === "sms" ? "SMS" : "iMessage"};-;${target.to}`
78
- } : target,
79
- options: cliOptions,
80
- conversationReadOrigin: "direct-operator"
81
- });
82
- if (!chatGuid || /^SMS;/i.test(chatGuid)) return null;
83
- await setTimeout(APPROVAL_POLL_ORDERING_DELAY_MS);
84
- const sent = await (await loadIMessageActionsRuntime()).sendPoll({
85
- chatGuid,
86
- question: extractMarkdownFormatRuns(params.question).text,
87
- choices: options.map((option) => option.text),
88
- suppressComment: true,
89
- options: cliOptions
90
- });
91
- const pollGuid = normalizeIMessageMessageId(sent.messageId);
92
- const optionDecisions = mapSentPollOptionsToDecisions({
93
- requested: options,
94
- sent: sent.pollOptions
95
- });
96
- if (optionDecisions.length !== options.length) {
97
- log.error("imessage approvals: imsg poll response did not return a complete option mapping");
98
- await iMessageApprovalPollTargets.registerTombstone({
99
- accountId: resolveIMessageAccount({
100
- cfg: params.cfg,
101
- accountId: params.target.accountId
102
- }).accountId,
103
- conversation: { chatGuid },
104
- ...pollGuid ? { pollGuid } : {},
105
- optionIds: sent.pollOptions.map((option) => option.id),
106
- approvalId: params.approvalId
107
- });
108
- return null;
109
- }
110
- const accountId = resolveIMessageAccount({
111
- cfg: params.cfg,
112
- accountId: params.target.accountId
113
- }).accountId;
114
- if (!await iMessageApprovalPollTargets.register({
115
- accountId,
116
- conversation: { chatGuid },
117
- ...pollGuid ? { pollGuid } : {},
118
- approvalId: params.approvalId,
119
- approvalKind: params.approvalKind,
120
- optionDecisions,
121
- expiresAtMs: params.expiresAtMs
122
- })) {
123
- await iMessageApprovalPollTargets.registerTombstone({
124
- accountId,
125
- conversation: { chatGuid },
126
- ...pollGuid ? { pollGuid } : {},
127
- optionIds: optionDecisions.map(([optionId]) => optionId),
128
- approvalId: params.approvalId
129
- });
130
- log.error("imessage approvals: poll target could not be registered");
131
- return null;
132
- }
133
- return {
134
- ...pollGuid ? { pollGuid } : {},
135
- chatGuid,
136
- optionDecisions
137
- };
138
- } catch (error) {
139
- log.warn(`imessage approvals: poll send failed, falling back to tapbacks: ${String(error)}`);
140
- return null;
141
- }
142
- }
143
36
  /** Clear both controls together; a stale binding would resolve a dead approval. */
144
37
  async function clearIMessageApprovalBindings(entry) {
145
38
  const accountId = entry.accountId?.trim();
@@ -259,12 +152,30 @@ const imessageApprovalNativeRuntime = createChannelApprovalNativeRuntimeAdapterA
259
152
  };
260
153
  },
261
154
  deliverPending: async ({ cfg, preparedTarget, plannedTarget, pendingPayload, view }) => {
262
- const expectPoll = canIMessageApprovalUsePoll({
263
- cfg,
264
- target: preparedTarget,
265
- plannedTarget,
266
- allowedDecisions: pendingPayload.allowedDecisions
267
- });
155
+ const canUsePoll = (surface) => {
156
+ if (surface !== "origin" && surface !== "approver-dm") return false;
157
+ if (buildApprovalPollOptions({ allowedDecisions: pendingPayload.allowedDecisions }).length < 2) return false;
158
+ try {
159
+ const account = resolveIMessageAccount({
160
+ cfg,
161
+ accountId: preparedTarget.accountId
162
+ });
163
+ if (classifyIMessageApprovalTargetTransport({
164
+ cfg,
165
+ target: preparedTarget
166
+ }) === "sms") return false;
167
+ if (!createActionGate(account.config.actions)("polls") || getIMessageApprovalApprovers({
168
+ cfg,
169
+ accountId: account.accountId
170
+ }).length === 0) return false;
171
+ const cliPath = account.config.cliPath?.trim() || "imsg";
172
+ const status = getCachedIMessagePrivateApiStatus(cliPath);
173
+ return status?.available === true && status?.selectors?.pollPayloadMessage === true && status.cliCapabilities?.pollSendSupportsNoComment === true;
174
+ } catch {
175
+ return false;
176
+ }
177
+ };
178
+ const expectPoll = canUsePoll(plannedTarget.surface);
268
179
  const conversation = buildIMessageApprovalConversationKeyForTarget(preparedTarget.to);
269
180
  if (!conversation) return null;
270
181
  const accountId = resolveIMessageAccount({
@@ -290,15 +201,85 @@ const imessageApprovalNativeRuntime = createChannelApprovalNativeRuntimeAdapterA
290
201
  });
291
202
  if (!result.guid) return null;
292
203
  const confirmedTransport = result.service ?? (result.chatGuid && /^iMessage;/i.test(result.chatGuid) ? "imessage" : result.chatGuid && /^SMS;/i.test(result.chatGuid) ? "sms" : targetTransport);
293
- const poll = expectPoll && confirmedTransport === "imessage" ? await deliverIMessageApprovalPoll({
294
- cfg,
295
- target: preparedTarget,
296
- approvalId: view.approvalId,
297
- approvalKind: view.approvalKind,
298
- expiresAtMs: view.expiresAtMs,
299
- question: pendingPayload.pollText,
300
- allowedDecisions: pendingPayload.allowedDecisions
301
- }) : null;
204
+ const poll = expectPoll && confirmedTransport === "imessage" ? await (async () => {
205
+ const { approvalId, approvalKind, expiresAtMs } = view;
206
+ const { pollText: question, allowedDecisions } = pendingPayload;
207
+ const options = buildApprovalPollOptions({ allowedDecisions });
208
+ try {
209
+ const account = resolveIMessageAccount({
210
+ cfg,
211
+ accountId: preparedTarget.accountId
212
+ });
213
+ const cliOptions = {
214
+ cliPath: account.config.cliPath?.trim() || "imsg",
215
+ dbPath: account.config.dbPath?.trim() || void 0,
216
+ timeoutMs: account.config.probeTimeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS
217
+ };
218
+ const target = parseIMessageTarget(preparedTarget.to);
219
+ let chatGuid;
220
+ if (target.kind === "chat_guid") chatGuid = target.chatGuid;
221
+ else chatGuid = await (await loadIMessageActionsRuntime()).resolveChatGuidForTarget({
222
+ target: target.kind === "handle" ? {
223
+ kind: "chat_identifier",
224
+ chatIdentifier: `${target.service === "sms" ? "SMS" : "iMessage"};-;${target.to}`
225
+ } : target,
226
+ options: cliOptions,
227
+ conversationReadOrigin: "direct-operator"
228
+ });
229
+ if (!chatGuid || /^SMS;/i.test(chatGuid)) return null;
230
+ await setTimeout(APPROVAL_POLL_ORDERING_DELAY_MS);
231
+ const sent = await (await loadIMessageActionsRuntime()).sendPoll({
232
+ chatGuid,
233
+ question: extractMarkdownFormatRuns(question).text,
234
+ choices: options.map((option) => option.text),
235
+ suppressComment: true,
236
+ options: cliOptions
237
+ });
238
+ const pollGuid = normalizeIMessageMessageId(sent.messageId);
239
+ const optionDecisions = mapSentPollOptionsToDecisions({
240
+ requested: options,
241
+ sent: sent.pollOptions
242
+ });
243
+ if (optionDecisions.length !== options.length) {
244
+ log.error("imessage approvals: imsg poll response did not return a complete option mapping");
245
+ await iMessageApprovalPollTargets.registerTombstone({
246
+ accountId: account.accountId,
247
+ conversation: { chatGuid },
248
+ ...pollGuid ? { pollGuid } : {},
249
+ optionIds: sent.pollOptions.map((option) => option.id),
250
+ approvalId
251
+ });
252
+ return null;
253
+ }
254
+ if (!await iMessageApprovalPollTargets.register({
255
+ accountId: account.accountId,
256
+ conversation: { chatGuid },
257
+ ...pollGuid ? { pollGuid } : {},
258
+ approvalId,
259
+ approvalKind,
260
+ optionDecisions,
261
+ expiresAtMs
262
+ })) {
263
+ await iMessageApprovalPollTargets.registerTombstone({
264
+ accountId: account.accountId,
265
+ conversation: { chatGuid },
266
+ ...pollGuid ? { pollGuid } : {},
267
+ optionIds: optionDecisions.map(([optionId]) => optionId),
268
+ approvalId
269
+ });
270
+ log.error("imessage approvals: poll target could not be registered");
271
+ return null;
272
+ }
273
+ return {
274
+ ...pollGuid ? { pollGuid } : {},
275
+ chatGuid,
276
+ optionDecisions
277
+ };
278
+ } catch (error) {
279
+ log.warn(`imessage approvals: poll send failed, falling back to tapbacks: ${String(error)}`);
280
+ return null;
281
+ }
282
+ })() : null;
302
283
  let hintMessageId;
303
284
  if (expectPoll && !poll && !reactionFallbackVisible) try {
304
285
  hintMessageId = (await sendMessageIMessage(preparedTarget.to, pendingPayload.text, {
@@ -363,5 +344,4 @@ const imessageApprovalNativeRuntime = createChannelApprovalNativeRuntimeAdapterA
363
344
  log.error(`imessage approvals: failed to send request ${request.id}: ${String(error)}`);
364
345
  } }
365
346
  });
366
- //#endregion
367
347
  export { imessageApprovalNativeRuntime };