openclaw-multi-auto 1.6.2 → 1.6.6

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 (182) hide show
  1. package/dist/{accounts-L9ByEpnP.js → accounts-C9HcPI9h.js} +2 -2
  2. package/dist/{accounts-BOzyfwW4.js → accounts-C_lW3Ag9.js} +2 -2
  3. package/dist/{accounts-yfBeCZtS.js → accounts-Tgelvk0C.js} +17 -17
  4. package/dist/{active-listener-D1yqT1cw.js → active-listener-BEdprTkn.js} +2 -2
  5. package/dist/{api-key-rotation-DtsNS2Nb.js → api-key-rotation-BJpKWXy0.js} +2 -2
  6. package/dist/{audio-preflight-DoPfNXDz.js → audio-preflight-BMvgEQ5j.js} +32 -32
  7. package/dist/{audio-transcription-runner-CzjuH3uL.js → audio-transcription-runner-gLFfz8fr.js} +12 -12
  8. package/dist/{audit-membership-runtime-DWyHWAHM.js → audit-membership-runtime-Dntemq07.js} +4 -4
  9. package/dist/build-info.json +3 -3
  10. package/dist/bundled/boot-md/handler.js +51 -51
  11. package/dist/bundled/bootstrap-extra-files/handler.js +6 -6
  12. package/dist/bundled/command-logger/handler.js +2 -2
  13. package/dist/bundled/session-memory/handler.js +51 -51
  14. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  15. package/dist/{channel-activity-xHOMiarp.js → channel-activity-BDnjYF7B.js} +3 -3
  16. package/dist/{chrome-DlhJHqj8.js → chrome-DxxEKrY7.js} +26 -26
  17. package/dist/{commands-registry-V1zZ5pPC.js → commands-registry-D5qXbFJn.js} +4 -4
  18. package/dist/{deliver-CApVJA_l.js → deliver-DbdywYJE.js} +21 -21
  19. package/dist/deliver-runtime-BFs7iAZF.js +36 -0
  20. package/dist/deps-send-discord.runtime-DZUccI6Z.js +26 -0
  21. package/dist/deps-send-imessage.runtime-CF3OpoqY.js +25 -0
  22. package/dist/deps-send-signal.runtime-Cw4-ozeO.js +24 -0
  23. package/dist/deps-send-slack.runtime-BDsDhS1P.js +22 -0
  24. package/dist/deps-send-telegram.runtime-D_4xVasO.js +27 -0
  25. package/dist/deps-send-whatsapp.runtime-DK8jqd14.js +60 -0
  26. package/dist/{diagnostic-Bn4PZjMZ.js → diagnostic-Co6Kghr-.js} +2 -2
  27. package/dist/{errors-CCLeFWAg.js → errors-xt401nuk.js} +1 -1
  28. package/dist/{fetch-BlJWzEP6.js → fetch-DuraYswo.js} +5 -5
  29. package/dist/{fetch-guard-ChYBwfiy.js → fetch-guard-DWr0d00H.js} +2 -2
  30. package/dist/{frontmatter-CvaMP376.js → frontmatter-BkTfEZ93.js} +3 -3
  31. package/dist/{fs-safe-0jAo_Whb.js → fs-safe-CTYUrIgQ.js} +4 -4
  32. package/dist/{github-copilot-token-D13V9YBz.js → github-copilot-token-BDioPmd6.js} +7 -7
  33. package/dist/{image-B3Mz7N5I.js → image-eT7Y-nP5.js} +6 -6
  34. package/dist/{image-ops-CehkHxmW.js → image-ops-BuUnEOE0.js} +2 -2
  35. package/dist/image-runtime-BcAK3n8a.js +29 -0
  36. package/dist/{ir-DAP-B-Xw.js → ir-B83looB-.js} +8 -8
  37. package/dist/{legacy-names-TyzbVqa_.js → legacy-names-DOC03BkU.js} +1 -1
  38. package/dist/llm-slug-generator.js +51 -51
  39. package/dist/{logger-DMZQQtxK.js → logger-BfjWMCSD.js} +7 -7
  40. package/dist/{login-DiCctRo1.js → login-CrIwcrVI.js} +5 -5
  41. package/dist/{login-qr-MUbXgjtd.js → login-qr-BpPDZdl_.js} +10 -10
  42. package/dist/{manager-BW_NSIMl.js → manager-1bvuGrNR.js} +13 -13
  43. package/dist/manager-runtime-FO1Sx3W8.js +18 -0
  44. package/dist/{model-selection-idoqPmw0.js → model-selection-Dna0Gz1k.js} +43 -43
  45. package/dist/{outbound-C2kanETZ.js → outbound-ChDjtuD6.js} +6 -6
  46. package/dist/{outbound-attachment-DBrYWX8h.js → outbound-attachment-DqHlD21U.js} +2 -2
  47. package/dist/{path-alias-guards-DqXRZmsL.js → path-alias-guards-BzvdLvTI.js} +1 -1
  48. package/dist/{paths-CCxysrzL.js → paths-Bkr-BCxW.js} +4 -4
  49. package/dist/{paths-C6TxBCvO.js → paths-Cvc9EM8Y.js} +5 -5
  50. package/dist/{pi-embedded-bcjMe3wj.js → pi-embedded-BQQa91aA.js} +167 -167
  51. package/dist/{pi-embedded-helpers-D5yyGEvA.js → pi-embedded-helpers-CLXm10bV.js} +52 -52
  52. package/dist/{plugin-sdk/pi-model-discovery-v-XPUOOf.js → pi-model-discovery-Dymwdjt0.js} +2 -2
  53. package/dist/pi-model-discovery-runtime-BeY4EUPp.js +11 -0
  54. package/dist/{pi-tools.before-tool-call.runtime-BuLxSyx9.js → pi-tools.before-tool-call.runtime-Cwab_5W1.js} +9 -9
  55. package/dist/plugin-sdk/compat.js +50 -50
  56. package/dist/plugin-sdk/discord.js +6 -6
  57. package/dist/plugin-sdk/slack.js +2 -2
  58. package/dist/{plugins-CWkRQYDj.js → plugins-4Rj4OjLY.js} +11 -11
  59. package/dist/{proxy-env-Cq5gdrbj.js → proxy-env-DlmzDx8x.js} +1 -1
  60. package/dist/{proxy-fetch-CCjEYbFm.js → proxy-fetch-B2pEfjbR.js} +1 -1
  61. package/dist/{pw-ai-CDQDCfUa.js → pw-ai-DNMjFMqH.js} +14 -14
  62. package/dist/{qmd-manager-BsYsO9Ii.js → qmd-manager-BtIKUaO9.js} +10 -10
  63. package/dist/{query-expansion-DtLc3wjL.js → query-expansion-CX-1fS52.js} +6 -6
  64. package/dist/{plugin-sdk/redact-DjVX-1N3.js → redact-COik8ET1.js} +1 -1
  65. package/dist/{run-with-concurrency-D_ZpbgEG.js → run-with-concurrency-BgYfgkXT.js} +4 -4
  66. package/dist/runtime-whatsapp-login.runtime-DUb55byQ.js +13 -0
  67. package/dist/runtime-whatsapp-outbound.runtime-Bii_xSfI.js +22 -0
  68. package/dist/{send-Dx2RkUOZ.js → send-6lz6rNVP.js} +6 -6
  69. package/dist/{send-vmONuVgL.js → send-BHTiZcH3.js} +26 -26
  70. package/dist/{send-Bj776ESJ.js → send-L7gRiwyd.js} +7 -7
  71. package/dist/{send-DcxmcFi_.js → send-PE6cwoTe.js} +8 -8
  72. package/dist/{send-BQERFNyo.js → send-dfu6_rgf.js} +5 -5
  73. package/dist/{session-A4QhBRvH.js → session-D8ImowSs.js} +8 -8
  74. package/dist/{skill-commands-CMzBZKG2.js → skill-commands-DNqJ-kwn.js} +9 -9
  75. package/dist/{skills-CE_iqvM5.js → skills-7ODkHQYp.js} +22 -22
  76. package/dist/slash-commands.runtime-CVw6566g.js +16 -0
  77. package/dist/slash-dispatch.runtime-B9Ygtzi4.js +56 -0
  78. package/dist/slash-skill-commands.runtime-DxZ4z5h6.js +20 -0
  79. package/dist/{store--eR1R_UX.js → store-D89wDcz9.js} +2 -2
  80. package/dist/subagent-registry-runtime-DL1Wv7nA.js +56 -0
  81. package/dist/{subsystem-Di1z8l0Z.js → subsystem-B45WV3qB.js} +14 -14
  82. package/dist/{tables-d739Y1xW.js → tables-mE4cJBN2.js} +1 -1
  83. package/dist/{plugin-sdk/target-errors-Blia4S69.js → target-errors-mnlwhAjP.js} +2 -2
  84. package/dist/{thinking-DXYisHiZ.js → thinking-BeGmb5k6.js} +7 -7
  85. package/dist/{tokens-DxnY9ui_.js → tokens-q32vI39c.js} +1 -1
  86. package/dist/{tool-images-2cBx1W8h.js → tool-images-RZdHiZcG.js} +2 -2
  87. package/dist/{web-NWKn8ABz.js → web-Btj-e8kN.js} +55 -55
  88. package/dist/{whatsapp-actions-iEArE_Ez.js → whatsapp-actions-BHbJJyqw.js} +21 -21
  89. package/dist/{workspace-CUVC6GX1.js → workspace-U-DyR64O.js} +20 -20
  90. package/package.json +1 -1
  91. package/scripts/create-instance.sh +93 -96
  92. package/dist/deliver-runtime-D1z-h5eg.js +0 -36
  93. package/dist/deps-send-discord.runtime-DnbhTFX9.js +0 -26
  94. package/dist/deps-send-imessage.runtime-BOiQ6mDx.js +0 -25
  95. package/dist/deps-send-signal.runtime-CTcl388M.js +0 -24
  96. package/dist/deps-send-slack.runtime-CCqBz4Kg.js +0 -22
  97. package/dist/deps-send-telegram.runtime-DGSKTCpH.js +0 -27
  98. package/dist/deps-send-whatsapp.runtime-Dz_4fi2D.js +0 -60
  99. package/dist/image-runtime-DWjhow2W.js +0 -29
  100. package/dist/manager-runtime-BN6VevdC.js +0 -18
  101. package/dist/pi-model-discovery-BGgOlX8N.js +0 -134
  102. package/dist/pi-model-discovery-runtime-Bwmi4Ev8.js +0 -11
  103. package/dist/plugin-sdk/accounts-CJWOBzwB.js +0 -35
  104. package/dist/plugin-sdk/accounts-DP1-L-QS.js +0 -288
  105. package/dist/plugin-sdk/accounts-DZhWlEg3.js +0 -46
  106. package/dist/plugin-sdk/active-listener-B_sLJTXM.js +0 -50
  107. package/dist/plugin-sdk/api-key-rotation-BRE4X2tf.js +0 -181
  108. package/dist/plugin-sdk/audio-preflight-DGEUDxxR.js +0 -69
  109. package/dist/plugin-sdk/audio-transcription-runner-DkoPNPYt.js +0 -2176
  110. package/dist/plugin-sdk/audit-membership-runtime-DSBHHw7o.js +0 -58
  111. package/dist/plugin-sdk/channel-activity-F3d0yUwy.js +0 -94
  112. package/dist/plugin-sdk/channel-web-QF7EpjeP.js +0 -2256
  113. package/dist/plugin-sdk/chrome-BXoCyCkY.js +0 -2415
  114. package/dist/plugin-sdk/commands-registry-t7cXBTfN.js +0 -1125
  115. package/dist/plugin-sdk/config-BkEnz2Po.js +0 -17913
  116. package/dist/plugin-sdk/deliver-B6AG_l67.js +0 -1694
  117. package/dist/plugin-sdk/deliver-runtime-D585kJZc.js +0 -32
  118. package/dist/plugin-sdk/deps-send-discord.runtime-a_OKY2js.js +0 -23
  119. package/dist/plugin-sdk/deps-send-imessage.runtime-Baxy9TD4.js +0 -22
  120. package/dist/plugin-sdk/deps-send-signal.runtime-BwXoCrFl.js +0 -21
  121. package/dist/plugin-sdk/deps-send-slack.runtime-CLmKjgso.js +0 -19
  122. package/dist/plugin-sdk/deps-send-telegram.runtime-BKfdBKnZ.js +0 -24
  123. package/dist/plugin-sdk/deps-send-whatsapp.runtime-BOTwkbx_.js +0 -57
  124. package/dist/plugin-sdk/diagnostic-CsP-lEkI.js +0 -319
  125. package/dist/plugin-sdk/errors-DaiAM-yU.js +0 -54
  126. package/dist/plugin-sdk/fetch-guard-DETCcJzQ.js +0 -156
  127. package/dist/plugin-sdk/fs-safe-B8y811FR.js +0 -352
  128. package/dist/plugin-sdk/image-DjTEkYZE.js +0 -2310
  129. package/dist/plugin-sdk/image-ops-BSiMpAw4.js +0 -584
  130. package/dist/plugin-sdk/image-runtime-6xPp8m5a.js +0 -25
  131. package/dist/plugin-sdk/ir-DQ7_HbvK.js +0 -1296
  132. package/dist/plugin-sdk/local-roots-BUP4YBmR.js +0 -186
  133. package/dist/plugin-sdk/logger-CZY9KIoY.js +0 -1163
  134. package/dist/plugin-sdk/login-BxEKLlCo.js +0 -57
  135. package/dist/plugin-sdk/login-qr-BQIpMPr9.js +0 -320
  136. package/dist/plugin-sdk/manager-I6KbPihW.js +0 -3917
  137. package/dist/plugin-sdk/manager-runtime-CFfYYWIQ.js +0 -15
  138. package/dist/plugin-sdk/outbound-NS6UHnB6.js +0 -212
  139. package/dist/plugin-sdk/outbound-attachment-Dy6fyf6H.js +0 -19
  140. package/dist/plugin-sdk/path-alias-guards-DBjLbIX_.js +0 -43
  141. package/dist/plugin-sdk/paths-vTM3Lh3X.js +0 -166
  142. package/dist/plugin-sdk/pi-embedded-helpers-1R1gu7eX.js +0 -9627
  143. package/dist/plugin-sdk/pi-model-discovery-runtime-Do9o-dUd.js +0 -8
  144. package/dist/plugin-sdk/pi-tools.before-tool-call.runtime-D4sFsIks.js +0 -354
  145. package/dist/plugin-sdk/plugins-DeBZB9l_.js +0 -864
  146. package/dist/plugin-sdk/proxy-fetch-ChxOhWF4.js +0 -38
  147. package/dist/plugin-sdk/pw-ai-DEOmCSSC.js +0 -1938
  148. package/dist/plugin-sdk/qmd-manager-HyYKoEch.js +0 -1448
  149. package/dist/plugin-sdk/query-expansion-CeyKUeDW.js +0 -1011
  150. package/dist/plugin-sdk/reply-DAo_Jt8K.js +0 -97916
  151. package/dist/plugin-sdk/resolve-outbound-target-B42qgQS9.js +0 -40
  152. package/dist/plugin-sdk/run-with-concurrency-Bt_ks0Qa.js +0 -1994
  153. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-B6W989eF.js +0 -10
  154. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-c_GDFy37.js +0 -19
  155. package/dist/plugin-sdk/send-CQpMudwO.js +0 -2587
  156. package/dist/plugin-sdk/send-DQHLzVyO.js +0 -414
  157. package/dist/plugin-sdk/send-DTB24bEF.js +0 -3135
  158. package/dist/plugin-sdk/send-DfHadjZ_.js +0 -503
  159. package/dist/plugin-sdk/send-XXlW2iny.js +0 -540
  160. package/dist/plugin-sdk/session-6TF6MyaC.js +0 -169
  161. package/dist/plugin-sdk/skill-commands-CkGeFUMl.js +0 -342
  162. package/dist/plugin-sdk/skills-CBkHBYPq.js +0 -1428
  163. package/dist/plugin-sdk/slash-commands.runtime-CxliuGaP.js +0 -13
  164. package/dist/plugin-sdk/slash-dispatch.runtime-DFaeYlJQ.js +0 -52
  165. package/dist/plugin-sdk/slash-skill-commands.runtime-0M0OLCxq.js +0 -16
  166. package/dist/plugin-sdk/ssrf-cFtplYtS.js +0 -202
  167. package/dist/plugin-sdk/store-5nyxY3WU.js +0 -81
  168. package/dist/plugin-sdk/subagent-registry-runtime-DCtmDwna.js +0 -52
  169. package/dist/plugin-sdk/tables-C47P4GTN.js +0 -55
  170. package/dist/plugin-sdk/thinking-Bo2eosVa.js +0 -1206
  171. package/dist/plugin-sdk/tokens-DgNRBwIg.js +0 -52
  172. package/dist/plugin-sdk/tool-images-Gk_-0y2N.js +0 -274
  173. package/dist/plugin-sdk/web-CVxZbXyH.js +0 -56
  174. package/dist/plugin-sdk/whatsapp-actions-Bw0H9g-n.js +0 -80
  175. package/dist/redact-ClbcYG1J.js +0 -319
  176. package/dist/runtime-whatsapp-login.runtime-IeylZEl4.js +0 -13
  177. package/dist/runtime-whatsapp-outbound.runtime-ClBRuLsq.js +0 -22
  178. package/dist/slash-commands.runtime-Cpn2tYW4.js +0 -16
  179. package/dist/slash-dispatch.runtime-CWbpp23S.js +0 -56
  180. package/dist/slash-skill-commands.runtime-DKMvvdDW.js +0 -20
  181. package/dist/subagent-registry-runtime-DEVpAaAP.js +0 -56
  182. package/dist/target-errors-CBI2Ga0y.js +0 -195
@@ -1,503 +0,0 @@
1
- import { n as loadConfig } from "./config-BkEnz2Po.js";
2
- import { E as resolveUserPath, S as normalizeE164 } from "./logger-CZY9KIoY.js";
3
- import { m as kindFromMime } from "./image-ops-BSiMpAw4.js";
4
- import { r as resolveIMessageAccount } from "./accounts-CJWOBzwB.js";
5
- import { i as resolveMarkdownTableMode } from "./ir-DQ7_HbvK.js";
6
- import { t as convertMarkdownTables } from "./tables-C47P4GTN.js";
7
- import { t as resolveOutboundAttachmentFromUrl } from "./outbound-attachment-Dy6fyf6H.js";
8
- import { spawn } from "node:child_process";
9
- import { createInterface } from "node:readline";
10
-
11
- //#region src/plugin-sdk/allow-from.ts
12
- function formatAllowFromLowercase(params) {
13
- return params.allowFrom.map((entry) => String(entry).trim()).filter(Boolean).map((entry) => params.stripPrefixRe ? entry.replace(params.stripPrefixRe, "") : entry).map((entry) => entry.toLowerCase());
14
- }
15
- function isNormalizedSenderAllowed(params) {
16
- const normalizedAllow = formatAllowFromLowercase({
17
- allowFrom: params.allowFrom,
18
- stripPrefixRe: params.stripPrefixRe
19
- });
20
- if (normalizedAllow.length === 0) return false;
21
- if (normalizedAllow.includes("*")) return true;
22
- const sender = String(params.senderId).trim().toLowerCase();
23
- return normalizedAllow.includes(sender);
24
- }
25
- function isAllowedParsedChatSender(params) {
26
- const allowFrom = params.allowFrom.map((entry) => String(entry).trim());
27
- if (allowFrom.length === 0) return false;
28
- if (allowFrom.includes("*")) return true;
29
- const senderNormalized = params.normalizeSender(params.sender);
30
- const chatId = params.chatId ?? void 0;
31
- const chatGuid = params.chatGuid?.trim();
32
- const chatIdentifier = params.chatIdentifier?.trim();
33
- for (const entry of allowFrom) {
34
- if (!entry) continue;
35
- const parsed = params.parseAllowTarget(entry);
36
- if (parsed.kind === "chat_id" && chatId !== void 0) {
37
- if (parsed.chatId === chatId) return true;
38
- } else if (parsed.kind === "chat_guid" && chatGuid) {
39
- if (parsed.chatGuid === chatGuid) return true;
40
- } else if (parsed.kind === "chat_identifier" && chatIdentifier) {
41
- if (parsed.chatIdentifier === chatIdentifier) return true;
42
- } else if (parsed.kind === "handle" && senderNormalized) {
43
- if (parsed.handle === senderNormalized) return true;
44
- }
45
- }
46
- return false;
47
- }
48
-
49
- //#endregion
50
- //#region src/imessage/target-parsing-helpers.ts
51
- function stripPrefix(value, prefix) {
52
- return value.slice(prefix.length).trim();
53
- }
54
- function resolveServicePrefixedTarget(params) {
55
- for (const { prefix, service } of params.servicePrefixes) {
56
- if (!params.lower.startsWith(prefix)) continue;
57
- const remainder = stripPrefix(params.trimmed, prefix);
58
- if (!remainder) throw new Error(`${prefix} target is required`);
59
- const remainderLower = remainder.toLowerCase();
60
- if (params.isChatTarget(remainderLower)) return params.parseTarget(remainder);
61
- return {
62
- kind: "handle",
63
- to: remainder,
64
- service
65
- };
66
- }
67
- return null;
68
- }
69
- function parseChatTargetPrefixesOrThrow(params) {
70
- for (const prefix of params.chatIdPrefixes) if (params.lower.startsWith(prefix)) {
71
- const value = stripPrefix(params.trimmed, prefix);
72
- const chatId = Number.parseInt(value, 10);
73
- if (!Number.isFinite(chatId)) throw new Error(`Invalid chat_id: ${value}`);
74
- return {
75
- kind: "chat_id",
76
- chatId
77
- };
78
- }
79
- for (const prefix of params.chatGuidPrefixes) if (params.lower.startsWith(prefix)) {
80
- const value = stripPrefix(params.trimmed, prefix);
81
- if (!value) throw new Error("chat_guid is required");
82
- return {
83
- kind: "chat_guid",
84
- chatGuid: value
85
- };
86
- }
87
- for (const prefix of params.chatIdentifierPrefixes) if (params.lower.startsWith(prefix)) {
88
- const value = stripPrefix(params.trimmed, prefix);
89
- if (!value) throw new Error("chat_identifier is required");
90
- return {
91
- kind: "chat_identifier",
92
- chatIdentifier: value
93
- };
94
- }
95
- return null;
96
- }
97
- function resolveServicePrefixedAllowTarget(params) {
98
- for (const { prefix } of params.servicePrefixes) {
99
- if (!params.lower.startsWith(prefix)) continue;
100
- const remainder = stripPrefix(params.trimmed, prefix);
101
- if (!remainder) return {
102
- kind: "handle",
103
- handle: ""
104
- };
105
- return params.parseAllowTarget(remainder);
106
- }
107
- return null;
108
- }
109
- function parseChatAllowTargetPrefixes(params) {
110
- for (const prefix of params.chatIdPrefixes) if (params.lower.startsWith(prefix)) {
111
- const value = stripPrefix(params.trimmed, prefix);
112
- const chatId = Number.parseInt(value, 10);
113
- if (Number.isFinite(chatId)) return {
114
- kind: "chat_id",
115
- chatId
116
- };
117
- }
118
- for (const prefix of params.chatGuidPrefixes) if (params.lower.startsWith(prefix)) {
119
- const value = stripPrefix(params.trimmed, prefix);
120
- if (value) return {
121
- kind: "chat_guid",
122
- chatGuid: value
123
- };
124
- }
125
- for (const prefix of params.chatIdentifierPrefixes) if (params.lower.startsWith(prefix)) {
126
- const value = stripPrefix(params.trimmed, prefix);
127
- if (value) return {
128
- kind: "chat_identifier",
129
- chatIdentifier: value
130
- };
131
- }
132
- return null;
133
- }
134
-
135
- //#endregion
136
- //#region src/imessage/targets.ts
137
- const CHAT_ID_PREFIXES = [
138
- "chat_id:",
139
- "chatid:",
140
- "chat:"
141
- ];
142
- const CHAT_GUID_PREFIXES = [
143
- "chat_guid:",
144
- "chatguid:",
145
- "guid:"
146
- ];
147
- const CHAT_IDENTIFIER_PREFIXES = [
148
- "chat_identifier:",
149
- "chatidentifier:",
150
- "chatident:"
151
- ];
152
- const SERVICE_PREFIXES = [
153
- {
154
- prefix: "imessage:",
155
- service: "imessage"
156
- },
157
- {
158
- prefix: "sms:",
159
- service: "sms"
160
- },
161
- {
162
- prefix: "auto:",
163
- service: "auto"
164
- }
165
- ];
166
- function normalizeIMessageHandle(raw) {
167
- const trimmed = raw.trim();
168
- if (!trimmed) return "";
169
- const lowered = trimmed.toLowerCase();
170
- if (lowered.startsWith("imessage:")) return normalizeIMessageHandle(trimmed.slice(9));
171
- if (lowered.startsWith("sms:")) return normalizeIMessageHandle(trimmed.slice(4));
172
- if (lowered.startsWith("auto:")) return normalizeIMessageHandle(trimmed.slice(5));
173
- for (const prefix of CHAT_ID_PREFIXES) if (lowered.startsWith(prefix)) return `chat_id:${trimmed.slice(prefix.length).trim()}`;
174
- for (const prefix of CHAT_GUID_PREFIXES) if (lowered.startsWith(prefix)) return `chat_guid:${trimmed.slice(prefix.length).trim()}`;
175
- for (const prefix of CHAT_IDENTIFIER_PREFIXES) if (lowered.startsWith(prefix)) return `chat_identifier:${trimmed.slice(prefix.length).trim()}`;
176
- if (trimmed.includes("@")) return trimmed.toLowerCase();
177
- const normalized = normalizeE164(trimmed);
178
- if (normalized) return normalized;
179
- return trimmed.replace(/\s+/g, "");
180
- }
181
- function parseIMessageTarget(raw) {
182
- const trimmed = raw.trim();
183
- if (!trimmed) throw new Error("iMessage target is required");
184
- const lower = trimmed.toLowerCase();
185
- const servicePrefixed = resolveServicePrefixedTarget({
186
- trimmed,
187
- lower,
188
- servicePrefixes: SERVICE_PREFIXES,
189
- isChatTarget: (remainderLower) => CHAT_ID_PREFIXES.some((p) => remainderLower.startsWith(p)) || CHAT_GUID_PREFIXES.some((p) => remainderLower.startsWith(p)) || CHAT_IDENTIFIER_PREFIXES.some((p) => remainderLower.startsWith(p)),
190
- parseTarget: parseIMessageTarget
191
- });
192
- if (servicePrefixed) return servicePrefixed;
193
- const chatTarget = parseChatTargetPrefixesOrThrow({
194
- trimmed,
195
- lower,
196
- chatIdPrefixes: CHAT_ID_PREFIXES,
197
- chatGuidPrefixes: CHAT_GUID_PREFIXES,
198
- chatIdentifierPrefixes: CHAT_IDENTIFIER_PREFIXES
199
- });
200
- if (chatTarget) return chatTarget;
201
- return {
202
- kind: "handle",
203
- to: trimmed,
204
- service: "auto"
205
- };
206
- }
207
- function parseIMessageAllowTarget(raw) {
208
- const trimmed = raw.trim();
209
- if (!trimmed) return {
210
- kind: "handle",
211
- handle: ""
212
- };
213
- const lower = trimmed.toLowerCase();
214
- const servicePrefixed = resolveServicePrefixedAllowTarget({
215
- trimmed,
216
- lower,
217
- servicePrefixes: SERVICE_PREFIXES,
218
- parseAllowTarget: parseIMessageAllowTarget
219
- });
220
- if (servicePrefixed) return servicePrefixed;
221
- const chatTarget = parseChatAllowTargetPrefixes({
222
- trimmed,
223
- lower,
224
- chatIdPrefixes: CHAT_ID_PREFIXES,
225
- chatGuidPrefixes: CHAT_GUID_PREFIXES,
226
- chatIdentifierPrefixes: CHAT_IDENTIFIER_PREFIXES
227
- });
228
- if (chatTarget) return chatTarget;
229
- return {
230
- kind: "handle",
231
- handle: normalizeIMessageHandle(trimmed)
232
- };
233
- }
234
- function isAllowedIMessageSender(params) {
235
- return isAllowedParsedChatSender({
236
- allowFrom: params.allowFrom,
237
- sender: params.sender,
238
- chatId: params.chatId,
239
- chatGuid: params.chatGuid,
240
- chatIdentifier: params.chatIdentifier,
241
- normalizeSender: normalizeIMessageHandle,
242
- parseAllowTarget: parseIMessageAllowTarget
243
- });
244
- }
245
- function formatIMessageChatTarget(chatId) {
246
- if (!chatId || !Number.isFinite(chatId)) return "";
247
- return `chat_id:${chatId}`;
248
- }
249
-
250
- //#endregion
251
- //#region src/imessage/constants.ts
252
- /** Default timeout for iMessage probe/RPC operations (10 seconds). */
253
- const DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS = 1e4;
254
-
255
- //#endregion
256
- //#region src/imessage/client.ts
257
- function isTestEnv() {
258
- const vitest = process.env.VITEST?.trim().toLowerCase();
259
- return Boolean(vitest);
260
- }
261
- var IMessageRpcClient = class {
262
- constructor(opts = {}) {
263
- this.pending = /* @__PURE__ */ new Map();
264
- this.closedResolve = null;
265
- this.child = null;
266
- this.reader = null;
267
- this.nextId = 1;
268
- this.cliPath = opts.cliPath?.trim() || "imsg";
269
- this.dbPath = opts.dbPath?.trim() ? resolveUserPath(opts.dbPath) : void 0;
270
- this.runtime = opts.runtime;
271
- this.onNotification = opts.onNotification;
272
- this.closed = new Promise((resolve) => {
273
- this.closedResolve = resolve;
274
- });
275
- }
276
- async start() {
277
- if (this.child) return;
278
- if (isTestEnv()) throw new Error("Refusing to start imsg rpc in test environment; mock iMessage RPC client");
279
- const args = ["rpc"];
280
- if (this.dbPath) args.push("--db", this.dbPath);
281
- const child = spawn(this.cliPath, args, { stdio: [
282
- "pipe",
283
- "pipe",
284
- "pipe"
285
- ] });
286
- this.child = child;
287
- this.reader = createInterface({ input: child.stdout });
288
- this.reader.on("line", (line) => {
289
- const trimmed = line.trim();
290
- if (!trimmed) return;
291
- this.handleLine(trimmed);
292
- });
293
- child.stderr?.on("data", (chunk) => {
294
- const lines = chunk.toString().split(/\r?\n/);
295
- for (const line of lines) {
296
- if (!line.trim()) continue;
297
- this.runtime?.error?.(`imsg rpc: ${line.trim()}`);
298
- }
299
- });
300
- child.on("error", (err) => {
301
- this.failAll(err instanceof Error ? err : new Error(String(err)));
302
- this.closedResolve?.();
303
- });
304
- child.on("close", (code, signal) => {
305
- if (code !== 0 && code !== null) {
306
- const reason = signal ? `signal ${signal}` : `code ${code}`;
307
- this.failAll(/* @__PURE__ */ new Error(`imsg rpc exited (${reason})`));
308
- } else this.failAll(/* @__PURE__ */ new Error("imsg rpc closed"));
309
- this.closedResolve?.();
310
- });
311
- }
312
- async stop() {
313
- if (!this.child) return;
314
- this.reader?.close();
315
- this.reader = null;
316
- this.child.stdin?.end();
317
- const child = this.child;
318
- this.child = null;
319
- await Promise.race([this.closed, new Promise((resolve) => {
320
- setTimeout(() => {
321
- if (!child.killed) child.kill("SIGTERM");
322
- resolve();
323
- }, 500);
324
- })]);
325
- }
326
- async waitForClose() {
327
- await this.closed;
328
- }
329
- async request(method, params, opts) {
330
- if (!this.child || !this.child.stdin) throw new Error("imsg rpc not running");
331
- const id = this.nextId++;
332
- const payload = {
333
- jsonrpc: "2.0",
334
- id,
335
- method,
336
- params: params ?? {}
337
- };
338
- const line = `${JSON.stringify(payload)}\n`;
339
- const timeoutMs = opts?.timeoutMs ?? DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS;
340
- const response = new Promise((resolve, reject) => {
341
- const key = String(id);
342
- const timer = timeoutMs > 0 ? setTimeout(() => {
343
- this.pending.delete(key);
344
- reject(/* @__PURE__ */ new Error(`imsg rpc timeout (${method})`));
345
- }, timeoutMs) : void 0;
346
- this.pending.set(key, {
347
- resolve: (value) => resolve(value),
348
- reject,
349
- timer
350
- });
351
- });
352
- this.child.stdin.write(line);
353
- return await response;
354
- }
355
- handleLine(line) {
356
- let parsed;
357
- try {
358
- parsed = JSON.parse(line);
359
- } catch (err) {
360
- const detail = err instanceof Error ? err.message : String(err);
361
- this.runtime?.error?.(`imsg rpc: failed to parse ${line}: ${detail}`);
362
- return;
363
- }
364
- if (parsed.id !== void 0 && parsed.id !== null) {
365
- const key = String(parsed.id);
366
- const pending = this.pending.get(key);
367
- if (!pending) return;
368
- if (pending.timer) clearTimeout(pending.timer);
369
- this.pending.delete(key);
370
- if (parsed.error) {
371
- const baseMessage = parsed.error.message ?? "imsg rpc error";
372
- const details = parsed.error.data;
373
- const code = parsed.error.code;
374
- const suffixes = [];
375
- if (typeof code === "number") suffixes.push(`code=${code}`);
376
- if (details !== void 0) {
377
- const detailText = typeof details === "string" ? details : JSON.stringify(details, null, 2);
378
- if (detailText) suffixes.push(detailText);
379
- }
380
- const msg = suffixes.length > 0 ? `${baseMessage}: ${suffixes.join(" ")}` : baseMessage;
381
- pending.reject(new Error(msg));
382
- return;
383
- }
384
- pending.resolve(parsed.result);
385
- return;
386
- }
387
- if (parsed.method) this.onNotification?.({
388
- method: parsed.method,
389
- params: parsed.params
390
- });
391
- }
392
- failAll(err) {
393
- for (const [key, pending] of this.pending.entries()) {
394
- if (pending.timer) clearTimeout(pending.timer);
395
- pending.reject(err);
396
- this.pending.delete(key);
397
- }
398
- }
399
- };
400
- async function createIMessageRpcClient(opts = {}) {
401
- const client = new IMessageRpcClient(opts);
402
- await client.start();
403
- return client;
404
- }
405
-
406
- //#endregion
407
- //#region src/imessage/send.ts
408
- const LEADING_REPLY_TAG_RE = /^\s*\[\[\s*reply_to\s*:\s*([^\]\n]+)\s*\]\]\s*/i;
409
- const MAX_REPLY_TO_ID_LENGTH = 256;
410
- function stripUnsafeReplyTagChars(value) {
411
- let next = "";
412
- for (const ch of value) {
413
- const code = ch.charCodeAt(0);
414
- if (code >= 0 && code <= 31 || code === 127 || ch === "[" || ch === "]") continue;
415
- next += ch;
416
- }
417
- return next;
418
- }
419
- function sanitizeReplyToId(rawReplyToId) {
420
- const trimmed = rawReplyToId?.trim();
421
- if (!trimmed) return;
422
- const sanitized = stripUnsafeReplyTagChars(trimmed).trim();
423
- if (!sanitized) return;
424
- if (sanitized.length > MAX_REPLY_TO_ID_LENGTH) return sanitized.slice(0, MAX_REPLY_TO_ID_LENGTH);
425
- return sanitized;
426
- }
427
- function prependReplyTagIfNeeded(message, replyToId) {
428
- const resolvedReplyToId = sanitizeReplyToId(replyToId);
429
- if (!resolvedReplyToId) return message;
430
- const replyTag = `[[reply_to:${resolvedReplyToId}]]`;
431
- const existingLeadingTag = message.match(LEADING_REPLY_TAG_RE);
432
- if (existingLeadingTag) {
433
- const remainder = message.slice(existingLeadingTag[0].length).trimStart();
434
- return remainder ? `${replyTag} ${remainder}` : replyTag;
435
- }
436
- const trimmedMessage = message.trimStart();
437
- return trimmedMessage ? `${replyTag} ${trimmedMessage}` : replyTag;
438
- }
439
- function resolveMessageId(result) {
440
- if (!result) return null;
441
- const raw = typeof result.messageId === "string" && result.messageId.trim() || typeof result.message_id === "string" && result.message_id.trim() || typeof result.id === "string" && result.id.trim() || typeof result.guid === "string" && result.guid.trim() || (typeof result.message_id === "number" ? String(result.message_id) : null) || (typeof result.id === "number" ? String(result.id) : null);
442
- return raw ? String(raw).trim() : null;
443
- }
444
- async function sendMessageIMessage(to, text, opts = {}) {
445
- const cfg = opts.config ?? loadConfig();
446
- const account = opts.account ?? resolveIMessageAccount({
447
- cfg,
448
- accountId: opts.accountId
449
- });
450
- const cliPath = opts.cliPath?.trim() || account.config.cliPath?.trim() || "imsg";
451
- const dbPath = opts.dbPath?.trim() || account.config.dbPath?.trim();
452
- const target = parseIMessageTarget(opts.chatId ? formatIMessageChatTarget(opts.chatId) : to);
453
- const service = opts.service ?? (target.kind === "handle" ? target.service : void 0) ?? account.config.service;
454
- const region = opts.region?.trim() || account.config.region?.trim() || "US";
455
- const maxBytes = typeof opts.maxBytes === "number" ? opts.maxBytes : typeof account.config.mediaMaxMb === "number" ? account.config.mediaMaxMb * 1024 * 1024 : 16 * 1024 * 1024;
456
- let message = text ?? "";
457
- let filePath;
458
- if (opts.mediaUrl?.trim()) {
459
- const resolved = await (opts.resolveAttachmentImpl ?? resolveOutboundAttachmentFromUrl)(opts.mediaUrl.trim(), maxBytes, { localRoots: opts.mediaLocalRoots });
460
- filePath = resolved.path;
461
- if (!message.trim()) {
462
- const kind = kindFromMime(resolved.contentType ?? void 0);
463
- if (kind) message = kind === "image" ? "<media:image>" : `<media:${kind}>`;
464
- }
465
- }
466
- if (!message.trim() && !filePath) throw new Error("iMessage send requires text or media");
467
- if (message.trim()) {
468
- const tableMode = resolveMarkdownTableMode({
469
- cfg,
470
- channel: "imessage",
471
- accountId: account.accountId
472
- });
473
- message = convertMarkdownTables(message, tableMode);
474
- }
475
- message = prependReplyTagIfNeeded(message, opts.replyToId);
476
- const params = {
477
- text: message,
478
- service: service || "auto",
479
- region
480
- };
481
- if (filePath) params.file = filePath;
482
- if (target.kind === "chat_id") params.chat_id = target.chatId;
483
- else if (target.kind === "chat_guid") params.chat_guid = target.chatGuid;
484
- else if (target.kind === "chat_identifier") params.chat_identifier = target.chatIdentifier;
485
- else params.to = target.to;
486
- const client = opts.client ?? (opts.createClient ? await opts.createClient({
487
- cliPath,
488
- dbPath
489
- }) : await createIMessageRpcClient({
490
- cliPath,
491
- dbPath
492
- }));
493
- const shouldClose = !opts.client;
494
- try {
495
- const result = await client.request("send", params, { timeoutMs: opts.timeoutMs });
496
- return { messageId: resolveMessageId(result) ?? (result?.ok ? "ok" : "unknown") };
497
- } finally {
498
- if (shouldClose) await client.stop();
499
- }
500
- }
501
-
502
- //#endregion
503
- export { isAllowedIMessageSender as a, parseChatAllowTargetPrefixes as c, resolveServicePrefixedTarget as d, formatAllowFromLowercase as f, formatIMessageChatTarget as i, parseChatTargetPrefixesOrThrow as l, isNormalizedSenderAllowed as m, createIMessageRpcClient as n, normalizeIMessageHandle as o, isAllowedParsedChatSender as p, DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS as r, parseIMessageTarget as s, sendMessageIMessage as t, resolveServicePrefixedAllowTarget as u };