@openclaw/imessage 2026.9.2 → 2026.9.3
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.
- package/dist/{actions.runtime-D5MAgeSs.js → actions.runtime-CzvR20qT.js} +2 -2
- package/dist/api.js +3 -3
- package/dist/{approval-handler.runtime-47rs6THN.js → approval-handler.runtime-B6JGnxQf.js} +5 -5
- package/dist/{approval-reactions-sVpDno7d.js → approval-reactions-BM_AwHPq.js} +44 -79
- package/dist/{channel-BxraMrmK.js → channel-B6qtBfCj.js} +16 -12
- package/dist/channel-config-api.js +1 -1
- package/dist/channel-plugin-api.js +1 -1
- package/dist/{channel.runtime-2jwkMPGR.js → channel.runtime-C2lcFXWn.js} +4 -8
- package/dist/{config-schema-DuGbA8Kp.js → config-schema-CCbTcJEV.js} +10 -37
- package/dist/{group-policy-Cp8SDG4G.js → group-policy-Duro87b4.js} +2 -2
- package/dist/{monitor-CESwxMQ4.js → monitor-Dj3TAimI.js} +16 -23
- package/dist/{remote-file-Biz5PjXi.js → remote-file-5n5LznCa.js} +1 -1
- package/dist/runtime-api.js +5 -5
- package/dist/{sanitize-outbound-Bvo4g1Mp.js → sanitize-outbound-C6UF2cvr.js} +46 -50
- package/dist/{send-DC981dqK.js → send-CIHiLtcY.js} +4 -4
- package/openclaw.plugin.json +5 -1
- package/package.json +4 -4
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as sanitizeIMessageFinalOutboundText, o as createIMessageRpcClient, p as resolveIMessageMessageId, s as runIMessageCliJsonCommand, v as normalizeDirectChatIdentifier } from "./sanitize-outbound-
|
|
2
|
-
import { n as authorizeIMessageResourceReference, t as withIMessageRemoteFile } from "./remote-file-
|
|
1
|
+
import { n as sanitizeIMessageFinalOutboundText, o as createIMessageRpcClient, p as resolveIMessageMessageId, s as runIMessageCliJsonCommand, v as normalizeDirectChatIdentifier } from "./sanitize-outbound-C6UF2cvr.js";
|
|
2
|
+
import { n as authorizeIMessageResourceReference, t as withIMessageRemoteFile } from "./remote-file-5n5LznCa.js";
|
|
3
3
|
import { basename, parse, win32 } from "node:path";
|
|
4
4
|
import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
5
5
|
import { asDateTimestampMs, parseStrictInteger, resolveExpiresAtMsFromDurationMs } from "openclaw/plugin-sdk/number-runtime";
|
package/dist/api.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { a as resolveDefaultIMessageAccountId, i as listIMessageAccountIds, o as resolveIMessageAccount, r as listEnabledIMessageAccounts } from "./accounts-CCirBEIm.js";
|
|
2
2
|
import { _ as IMESSAGE_ACTION_NAMES, a as isAllowedIMessageSender, c as parseIMessageAllowTarget, g as IMESSAGE_ACTIONS, l as parseIMessageTarget, n as formatIMessageChatTarget, o as looksLikeIMessageExplicitTargetId, r as inferIMessageTargetChatType, s as normalizeIMessageHandle } from "./message-tool-api-CUoFESHj.js";
|
|
3
|
-
import { m as DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS } from "./sanitize-outbound-
|
|
4
|
-
import { a as normalizeIMessageAcpConversationId, c as normalizeIMessageMessagingTarget, f as probeIMessage, i as matchIMessageAcpConversation, n as resolveIMessageGroupToolPolicy, o as resolveIMessageConversationIdFromTarget, r as resolveIMessageInboundConversationId, s as looksLikeIMessageTargetId, t as resolveIMessageGroupRequireMention, v as imessageSetupContract } from "./group-policy-
|
|
5
|
-
import { n as createIMessagePluginBase, r as imessageSetupWizard, t as imessagePlugin } from "./channel-
|
|
3
|
+
import { m as DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS } from "./sanitize-outbound-C6UF2cvr.js";
|
|
4
|
+
import { a as normalizeIMessageAcpConversationId, c as normalizeIMessageMessagingTarget, f as probeIMessage, i as matchIMessageAcpConversation, n as resolveIMessageGroupToolPolicy, o as resolveIMessageConversationIdFromTarget, r as resolveIMessageInboundConversationId, s as looksLikeIMessageTargetId, t as resolveIMessageGroupRequireMention, v as imessageSetupContract } from "./group-policy-Duro87b4.js";
|
|
5
|
+
import { n as createIMessagePluginBase, r as imessageSetupWizard, t as imessagePlugin } from "./channel-B6qtBfCj.js";
|
|
6
6
|
import { t as createIMessageConversationBindingManager } from "./conversation-bindings-GDQ_Laxj.js";
|
|
7
7
|
import { t as IMESSAGE_LEGACY_OUTBOUND_SEND_DEP_KEYS } from "./outbound-send-deps-B-QEsLSM.js";
|
|
8
8
|
import { createAllowedChatSenderMatcher, parseChatAllowTargetPrefixes, parseChatTargetPrefixesOrThrow, resolveServicePrefixedAllowTarget, resolveServicePrefixedChatTarget, resolveServicePrefixedOrChatAllowTarget, resolveServicePrefixedTarget } from "openclaw/plugin-sdk/channel-targets";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { o as resolveIMessageAccount } from "./accounts-CCirBEIm.js";
|
|
2
2
|
import { f as getCachedIMessagePrivateApiStatus, l as parseIMessageTarget } from "./message-tool-api-CUoFESHj.js";
|
|
3
|
-
import { i as extractMarkdownFormatRuns } from "./sanitize-outbound-
|
|
4
|
-
import { c as normalizeIMessageMessagingTarget, l as getIMessageApprovalApprovers } from "./group-policy-
|
|
5
|
-
import { a as unregisterIMessageApprovalReactionTarget, c as buildIMessageApprovalConversationKeyForTarget, i as registerIMessageApprovalReactionTarget } from "./approval-reactions-
|
|
6
|
-
import { a as iMessageApprovalPollTargets, c as iMessageApprovalControlBindings, i as buildApprovalPollOptions, o as mapSentPollOptionsToDecisions, t as sendMessageIMessage } from "./send-
|
|
3
|
+
import { i as extractMarkdownFormatRuns } from "./sanitize-outbound-C6UF2cvr.js";
|
|
4
|
+
import { c as normalizeIMessageMessagingTarget, l as getIMessageApprovalApprovers } from "./group-policy-Duro87b4.js";
|
|
5
|
+
import { a as unregisterIMessageApprovalReactionTarget, c as buildIMessageApprovalConversationKeyForTarget, i as registerIMessageApprovalReactionTarget } from "./approval-reactions-BM_AwHPq.js";
|
|
6
|
+
import { a as iMessageApprovalPollTargets, c as iMessageApprovalControlBindings, i as buildApprovalPollOptions, o as mapSentPollOptionsToDecisions, t as sendMessageIMessage } from "./send-CIHiLtcY.js";
|
|
7
7
|
import { createLazyRuntimeNamedExport } from "openclaw/plugin-sdk/lazy-runtime";
|
|
8
8
|
import { createSubsystemLogger } from "openclaw/plugin-sdk/runtime-env";
|
|
9
9
|
import { createActionGate } from "openclaw/plugin-sdk/channel-actions";
|
|
@@ -13,7 +13,7 @@ import { buildChannelApprovalExpiredText, buildChannelApprovalResolvedText, crea
|
|
|
13
13
|
import { setTimeout } from "node:timers/promises";
|
|
14
14
|
//#region extensions/imessage/src/approval-handler.runtime.ts
|
|
15
15
|
const log = createSubsystemLogger("imessage/approvals");
|
|
16
|
-
const loadIMessageActionsRuntime = createLazyRuntimeNamedExport(() => import("./actions.runtime-
|
|
16
|
+
const loadIMessageActionsRuntime = createLazyRuntimeNamedExport(() => import("./actions.runtime-CzvR20qT.js"), "imessageActionsRuntime");
|
|
17
17
|
const DEFAULT_PROBE_TIMEOUT_MS = 5e3;
|
|
18
18
|
const APPROVAL_POLL_ORDERING_DELAY_MS = 1100;
|
|
19
19
|
function buildPendingPayload(params) {
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
|
|
2
2
|
import { l as parseIMessageTarget, s as normalizeIMessageHandle } from "./message-tool-api-CUoFESHj.js";
|
|
3
|
-
import { l as getIMessageApprovalApprovers, u as imessageApprovalAuth } from "./group-policy-
|
|
3
|
+
import { l as getIMessageApprovalApprovers, u as imessageApprovalAuth } from "./group-policy-Duro87b4.js";
|
|
4
4
|
import { n as getOptionalIMessageRuntime } from "./runtime-Cza4CY5T.js";
|
|
5
5
|
import { n as normalizeIMessageGuid, t as resolveIMessageReactionContext } from "./reaction-context-Br-vAJFp.js";
|
|
6
6
|
import { createLazyRuntimeSurface } from "openclaw/plugin-sdk/lazy-runtime";
|
|
7
7
|
import { asOptionalRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
8
8
|
import { asDateTimestampMs, isFutureDateTimestampMs, resolveExpiresAtMsFromDurationMs } from "openclaw/plugin-sdk/number-runtime";
|
|
9
|
-
import {
|
|
10
|
-
import { addApprovalReactionHintToText, approvalReactionDecisionSetsMatch, buildApprovalReactionDeliveredBindingMarker, buildApprovalReactionHint, createApprovalReactionTargetStore, listApprovalReactionBindings, normalizeApprovalReactionDecision, readApprovalReactionDecisionList, readApprovalReactionDeliveredBinding, readApprovalReactionPresentationBinding, resolveTypedApprovalReactionTarget } from "openclaw/plugin-sdk/approval-reaction-runtime";
|
|
9
|
+
import { addApprovalReactionHintToText, approvalReactionDecisionSetsMatch, buildApprovalReactionDeliveredBindingMarker, buildApprovalReactionHint, createApprovalReactionTargetStore, listApprovalReactionBindings, normalizeApprovalReactionDecision, readApprovalReactionDecisionList, readApprovalReactionDeliveredBinding, readApprovalReactionPresentationBinding, readApprovalReactionTargetRecord, resolveTypedApprovalReactionTarget, settleApprovalReaction } from "openclaw/plugin-sdk/approval-reaction-runtime";
|
|
11
10
|
import { createPluginStateErrorReporter } from "openclaw/plugin-sdk/plugin-state-runtime";
|
|
12
11
|
//#region extensions/imessage/src/approval-target-keys.ts
|
|
13
12
|
function chatIdToKeyValue(chatId) {
|
|
@@ -236,24 +235,13 @@ function reportApprovalBindingCorrelationMismatch(binding) {
|
|
|
236
235
|
});
|
|
237
236
|
} catch {}
|
|
238
237
|
}
|
|
239
|
-
function readPersistedTarget(value) {
|
|
240
|
-
const target = value;
|
|
241
|
-
if (!target || typeof target.approvalId !== "string" || target.approvalKind !== "exec" && target.approvalKind !== "plugin") return null;
|
|
242
|
-
const allowedDecisions = readApprovalReactionDecisionList(target.allowedDecisions);
|
|
243
|
-
if (!allowedDecisions) return null;
|
|
244
|
-
return {
|
|
245
|
-
approvalId: target.approvalId,
|
|
246
|
-
approvalKind: target.approvalKind,
|
|
247
|
-
allowedDecisions
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
238
|
const imessageApprovalReactionTargets = createApprovalReactionTargetStore({
|
|
251
239
|
namespace: PERSISTENT_NAMESPACE,
|
|
252
240
|
maxEntries: PERSISTENT_MAX_ENTRIES,
|
|
253
241
|
defaultTtlMs: DEFAULT_REACTION_TARGET_TTL_MS,
|
|
254
242
|
openStore: (params) => getOptionalIMessageRuntime()?.state.openKeyedStore(params),
|
|
255
243
|
logPersistentError: reportPersistentApprovalReactionError,
|
|
256
|
-
readPersistedTarget
|
|
244
|
+
readPersistedTarget: readApprovalReactionTargetRecord
|
|
257
245
|
});
|
|
258
246
|
const IMESSAGE_APPROVAL_DELIVERY_BINDING_KEY = "imessageApprovalReactionBindingV1";
|
|
259
247
|
function visibleApprovalBindingMatches(text, binding, options) {
|
|
@@ -452,50 +440,27 @@ async function handleIMessageApprovalReaction(params) {
|
|
|
452
440
|
handled: false,
|
|
453
441
|
stopPolling: false
|
|
454
442
|
};
|
|
455
|
-
let
|
|
443
|
+
let matchedTarget = null;
|
|
456
444
|
let matchedMessageId = null;
|
|
457
445
|
for (const candidate of event.messageIdCandidates) {
|
|
458
|
-
|
|
446
|
+
matchedTarget = await resolveIMessageApprovalReactionTargetWithPersistence({
|
|
459
447
|
accountId: params.accountId,
|
|
460
448
|
conversation: event.conversation,
|
|
461
449
|
messageId: candidate,
|
|
462
450
|
reactionKey: event.reactionKey
|
|
463
451
|
});
|
|
464
|
-
if (
|
|
452
|
+
if (matchedTarget) {
|
|
465
453
|
matchedMessageId = candidate;
|
|
466
454
|
break;
|
|
467
455
|
}
|
|
468
456
|
}
|
|
457
|
+
const target = matchedTarget;
|
|
469
458
|
if (!target) return {
|
|
470
459
|
handled: false,
|
|
471
460
|
stopPolling: false
|
|
472
461
|
};
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
accountId: params.accountId
|
|
476
|
-
}).length === 0) {
|
|
477
|
-
params.logVerboseMessage?.(`imessage: approval reaction denied id=${target.approvalId}; reactions require explicit approvers`);
|
|
478
|
-
return {
|
|
479
|
-
handled: true,
|
|
480
|
-
stopPolling: false
|
|
481
|
-
};
|
|
482
|
-
}
|
|
483
|
-
if (!imessageApprovalAuth.authorizeActorAction({
|
|
484
|
-
cfg: params.cfg,
|
|
485
|
-
accountId: params.accountId,
|
|
486
|
-
senderId: event.actorHandle,
|
|
487
|
-
action: "approve",
|
|
488
|
-
approvalKind: target.approvalKind
|
|
489
|
-
}).authorized) {
|
|
490
|
-
params.logVerboseMessage?.(`imessage: approval reaction denied id=${target.approvalId} sender=${event.actorHandle}`);
|
|
491
|
-
return {
|
|
492
|
-
handled: true,
|
|
493
|
-
stopPolling: false
|
|
494
|
-
};
|
|
495
|
-
}
|
|
496
|
-
const resolveApprovalOverGateway = await loadResolveApprovalOverGateway();
|
|
497
|
-
try {
|
|
498
|
-
const result = await resolveApprovalOverGateway({
|
|
462
|
+
const settlement = await settleApprovalReaction({
|
|
463
|
+
request: {
|
|
499
464
|
cfg: params.cfg,
|
|
500
465
|
approvalId: target.approvalId,
|
|
501
466
|
approvalKind: target.approvalKind,
|
|
@@ -505,46 +470,46 @@ async function handleIMessageApprovalReaction(params) {
|
|
|
505
470
|
senderId: event.actorHandle,
|
|
506
471
|
gatewayUrl: params.gatewayUrl,
|
|
507
472
|
...params.gatewayRuntime ? { gatewayRuntime: params.gatewayRuntime } : {}
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
return {
|
|
517
|
-
handled: true,
|
|
518
|
-
stopPolling: true,
|
|
519
|
-
stopPollingReason: "resolved"
|
|
520
|
-
};
|
|
521
|
-
} catch (error) {
|
|
522
|
-
if (isApprovalNotFoundError(error)) {
|
|
473
|
+
},
|
|
474
|
+
approvers: getIMessageApprovalApprovers({
|
|
475
|
+
cfg: params.cfg,
|
|
476
|
+
accountId: params.accountId
|
|
477
|
+
}),
|
|
478
|
+
authorizeActorAction: (input) => imessageApprovalAuth.authorizeActorAction(input),
|
|
479
|
+
loadResolver: loadResolveApprovalOverGateway,
|
|
480
|
+
clearTarget: () => {
|
|
523
481
|
for (const candidate of event.messageIdCandidates) unregisterIMessageApprovalReactionTarget({
|
|
524
482
|
accountId: params.accountId,
|
|
525
483
|
conversation: event.conversation,
|
|
526
484
|
messageId: candidate
|
|
527
485
|
});
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
486
|
+
},
|
|
487
|
+
onResolved: (result) => {
|
|
488
|
+
const outcome = result.applied ? "resolved" : "already resolved";
|
|
489
|
+
params.logVerboseMessage?.(`imessage: approval reaction ${outcome} id=${target.approvalId} sender=${event.actorHandle} ${formatCanonicalApprovalTerminalState(result.approval)} via messageId=${matchedMessageId ?? event.messageId}`);
|
|
490
|
+
},
|
|
491
|
+
onError: (error) => {
|
|
492
|
+
try {
|
|
493
|
+
getOptionalIMessageRuntime()?.logging.getChildLogger({
|
|
494
|
+
plugin: "imessage",
|
|
495
|
+
feature: "approval-reactions"
|
|
496
|
+
}).warn("approval reaction failed", {
|
|
497
|
+
approvalId: target.approvalId,
|
|
498
|
+
senderId: event.actorHandle,
|
|
499
|
+
error: String(error)
|
|
500
|
+
});
|
|
501
|
+
} catch {}
|
|
502
|
+
},
|
|
503
|
+
logVerboseMessage: params.logVerboseMessage
|
|
504
|
+
});
|
|
505
|
+
return settlement === "denied" ? {
|
|
506
|
+
handled: true,
|
|
507
|
+
stopPolling: false
|
|
508
|
+
} : {
|
|
509
|
+
handled: true,
|
|
510
|
+
stopPolling: true,
|
|
511
|
+
stopPollingReason: settlement
|
|
512
|
+
};
|
|
548
513
|
}
|
|
549
514
|
async function maybeResolveIMessageApprovalReaction(params) {
|
|
550
515
|
return (await handleIMessageApprovalReaction(params)).handled;
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { a as resolveDefaultIMessageAccountId, i as listIMessageAccountIds, o as resolveIMessageAccount, t as collectIMessageDuplicateAccountSourceWarnings } from "./accounts-CCirBEIm.js";
|
|
2
2
|
import { l as parseIMessageTarget, o as looksLikeIMessageExplicitTargetId, r as inferIMessageTargetChatType, s as normalizeIMessageHandle, u as isIMessagePhoneLikeHandle } from "./message-tool-api-CUoFESHj.js";
|
|
3
|
-
import { n as sanitizeIMessageFinalOutboundText, r as sanitizeOutboundText, y as resolveIMessageDirectChatService } from "./sanitize-outbound-
|
|
4
|
-
import { a as normalizeIMessageAcpConversationId, c as normalizeIMessageMessagingTarget, d as imessageMessageActions, h as createIMessageSetupWizardProxy, i as matchIMessageAcpConversation, l as getIMessageApprovalApprovers, n as resolveIMessageGroupToolPolicy, o as resolveIMessageConversationIdFromTarget, t as resolveIMessageGroupRequireMention, u as imessageApprovalAuth, v as imessageSetupContract } from "./group-policy-
|
|
3
|
+
import { n as sanitizeIMessageFinalOutboundText, r as sanitizeOutboundText, y as resolveIMessageDirectChatService } from "./sanitize-outbound-C6UF2cvr.js";
|
|
4
|
+
import { a as normalizeIMessageAcpConversationId, c as normalizeIMessageMessagingTarget, d as imessageMessageActions, h as createIMessageSetupWizardProxy, i as matchIMessageAcpConversation, l as getIMessageApprovalApprovers, n as resolveIMessageGroupToolPolicy, o as resolveIMessageConversationIdFromTarget, t as resolveIMessageGroupRequireMention, u as imessageApprovalAuth, v as imessageSetupContract } from "./group-policy-Duro87b4.js";
|
|
5
5
|
import { t as createIMessageConversationBindingManager } from "./conversation-bindings-GDQ_Laxj.js";
|
|
6
|
-
import { t as IMessageChannelConfigSchema } from "./config-schema-
|
|
6
|
+
import { t as IMessageChannelConfigSchema } from "./config-schema-CCbTcJEV.js";
|
|
7
7
|
import { n as resolveIMessageAttachmentRoots, r as resolveIMessageRemoteAttachmentRoots } from "./media-contract-pns3TSS5.js";
|
|
8
8
|
import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/account-id";
|
|
9
9
|
import { buildDmGroupAccountAllowlistAdapter } from "openclaw/plugin-sdk/allowlist-config-edit";
|
|
10
10
|
import { adaptScopedAccountAccessor, createScopedChannelConfigAdapter, formatTrimmedAllowFromEntries } from "openclaw/plugin-sdk/channel-config-helpers";
|
|
11
11
|
import { createChatChannelPlugin } from "openclaw/plugin-sdk/channel-core";
|
|
12
12
|
import { createMessageReceiptFromOutboundResults, defineChannelMessageAdapter, sanitizeForPlainText } from "openclaw/plugin-sdk/channel-outbound";
|
|
13
|
+
import { PAIRING_APPROVED_MESSAGE } from "openclaw/plugin-sdk/channel-status";
|
|
13
14
|
import { buildPassiveProbedChannelStatusSummary } from "openclaw/plugin-sdk/extension-shared";
|
|
14
15
|
import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
|
|
15
16
|
import { questionGatewayRuntime } from "openclaw/plugin-sdk/question-gateway-runtime";
|
|
@@ -90,7 +91,7 @@ const imessageApproval = createApproverRestrictedNativeApprovalCapabilityFromFor
|
|
|
90
91
|
approvalKind,
|
|
91
92
|
request
|
|
92
93
|
}),
|
|
93
|
-
load: async () => (await import("./approval-handler.runtime-
|
|
94
|
+
load: async () => (await import("./approval-handler.runtime-B6JGnxQf.js")).imessageApprovalNativeRuntime
|
|
94
95
|
})
|
|
95
96
|
});
|
|
96
97
|
const imessageApprovalRouting = imessageApproval.routing;
|
|
@@ -205,7 +206,7 @@ const imessageDoctor = {
|
|
|
205
206
|
//#region extensions/imessage/src/shared.ts
|
|
206
207
|
const IMESSAGE_CHANNEL = "imessage";
|
|
207
208
|
async function loadIMessageChannelRuntime$1() {
|
|
208
|
-
return await import("./channel.runtime-
|
|
209
|
+
return await import("./channel.runtime-C2lcFXWn.js");
|
|
209
210
|
}
|
|
210
211
|
const imessageSetupWizard = createIMessageSetupWizardProxy(async () => (await loadIMessageChannelRuntime$1()).imessageSetupWizard);
|
|
211
212
|
const imessageConfigAdapter = createScopedChannelConfigAdapter({
|
|
@@ -307,7 +308,7 @@ async function probeIMessageStatusAccount(params) {
|
|
|
307
308
|
}
|
|
308
309
|
//#endregion
|
|
309
310
|
//#region extensions/imessage/src/channel.ts
|
|
310
|
-
const loadIMessageChannelRuntime = createLazyRuntimeModule(() => import("./channel.runtime-
|
|
311
|
+
const loadIMessageChannelRuntime = createLazyRuntimeModule(() => import("./channel.runtime-C2lcFXWn.js"));
|
|
311
312
|
function toIMessageMessageSendResult(result, kind, replyToId) {
|
|
312
313
|
const receipt = result.receipt ?? createMessageReceiptFromOutboundResults({
|
|
313
314
|
results: result.messageId ? [{
|
|
@@ -323,7 +324,7 @@ function toIMessageMessageSendResult(result, kind, replyToId) {
|
|
|
323
324
|
...result.meta && Object.keys(result.meta).length > 0 ? { meta: result.meta } : {}
|
|
324
325
|
};
|
|
325
326
|
}
|
|
326
|
-
const loadIMessageApprovalReactionsModule = createLazyRuntimeModule(() => import("./approval-reactions-
|
|
327
|
+
const loadIMessageApprovalReactionsModule = createLazyRuntimeModule(() => import("./approval-reactions-BM_AwHPq.js").then((n) => n.t));
|
|
327
328
|
const loadIMessageQuestionReactionsModule = createLazyRuntimeModule(() => import("./question-reactions-9tBYB1_F.js").then((n) => n.r));
|
|
328
329
|
async function prepareForwardedIMessageApprovalPayload(params) {
|
|
329
330
|
const prepared = (await loadIMessageApprovalReactionsModule()).addIMessageApprovalReactionHintToStructuredPayload(params);
|
|
@@ -557,11 +558,14 @@ const imessagePlugin = createChatChannelPlugin({
|
|
|
557
558
|
},
|
|
558
559
|
pairing: { text: {
|
|
559
560
|
idLabel: "imessageSenderId",
|
|
560
|
-
message:
|
|
561
|
-
notify: async (
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
561
|
+
message: PAIRING_APPROVED_MESSAGE,
|
|
562
|
+
notify: async (params) => {
|
|
563
|
+
await (await loadIMessageChannelRuntime()).sendIMessageOutbound({
|
|
564
|
+
...params,
|
|
565
|
+
to: params.id,
|
|
566
|
+
text: params.message
|
|
567
|
+
});
|
|
568
|
+
}
|
|
565
569
|
} },
|
|
566
570
|
security: imessageSecurityAdapter,
|
|
567
571
|
outbound: {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as IMessageChannelConfigSchema } from "./config-schema-
|
|
1
|
+
import { t as IMessageChannelConfigSchema } from "./config-schema-CCbTcJEV.js";
|
|
2
2
|
export { IMessageChannelConfigSchema };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as imessagePlugin } from "./channel-
|
|
1
|
+
import { t as imessagePlugin } from "./channel-B6qtBfCj.js";
|
|
2
2
|
export { imessagePlugin };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { l as resolveIMessageRemoteHost, o as resolveIMessageAccount, r as listEnabledIMessageAccounts, s as resolveIMessageDuplicateSourceOwner } from "./accounts-CCirBEIm.js";
|
|
2
|
-
import { _ as imessageDmPolicy, b as isAutoManagedIMessageCliPath, f as probeIMessage, g as imessageCompletionNote, m as createIMessageCliPathTextInput, p as IMESSAGE_INSTALL_COMMAND, x as normalizeIMessageCliPathForSetup, y as imessageSetupStatusBase } from "./group-policy-
|
|
2
|
+
import { _ as imessageDmPolicy, b as isAutoManagedIMessageCliPath, f as probeIMessage, g as imessageCompletionNote, m as createIMessageCliPathTextInput, p as IMESSAGE_INSTALL_COMMAND, x as normalizeIMessageCliPathForSetup, y as imessageSetupStatusBase } from "./group-policy-Duro87b4.js";
|
|
3
3
|
import { t as IMESSAGE_LEGACY_OUTBOUND_SEND_DEP_KEYS } from "./outbound-send-deps-B-QEsLSM.js";
|
|
4
|
-
import { t as sendMessageIMessage } from "./send-
|
|
5
|
-
import { t as monitorIMessageProvider } from "./monitor-
|
|
4
|
+
import { t as sendMessageIMessage } from "./send-CIHiLtcY.js";
|
|
5
|
+
import { t as monitorIMessageProvider } from "./monitor-Dj3TAimI.js";
|
|
6
6
|
import { createAccountStatusSink, resolveOutboundSendDep } from "openclaw/plugin-sdk/channel-outbound";
|
|
7
7
|
import path from "node:path";
|
|
8
8
|
import { resolveChannelMediaMaxBytes } from "openclaw/plugin-sdk/account-helpers";
|
|
@@ -10,7 +10,6 @@ import fs from "node:fs/promises";
|
|
|
10
10
|
import { createDetectedBinaryStatus, setSetupChannelEnabled } from "openclaw/plugin-sdk/setup";
|
|
11
11
|
import { truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
|
|
12
12
|
import { detectBinary as detectBinary$1, resolveBrewExecutable } from "openclaw/plugin-sdk/setup-tools";
|
|
13
|
-
import { PAIRING_APPROVED_MESSAGE } from "openclaw/plugin-sdk/channel-status";
|
|
14
13
|
import { runPluginCommandWithTimeout } from "openclaw/plugin-sdk/run-command";
|
|
15
14
|
//#region extensions/imessage/src/install-imsg.ts
|
|
16
15
|
const IMESSAGE_BREW_FORMULA = "steipete/tap/imsg";
|
|
@@ -226,9 +225,6 @@ async function sendIMessageOutbound(params) {
|
|
|
226
225
|
meta
|
|
227
226
|
} : result;
|
|
228
227
|
}
|
|
229
|
-
async function notifyIMessageApproval(params) {
|
|
230
|
-
await sendMessageIMessage(params.id, PAIRING_APPROVED_MESSAGE, { config: params.cfg });
|
|
231
|
-
}
|
|
232
228
|
async function probeIMessageAccount(params) {
|
|
233
229
|
return await probeIMessage(params?.timeoutMs, {
|
|
234
230
|
cliPath: params?.cliPath,
|
|
@@ -280,4 +276,4 @@ async function startIMessageGatewayAccount(ctx) {
|
|
|
280
276
|
});
|
|
281
277
|
}
|
|
282
278
|
//#endregion
|
|
283
|
-
export { imessageSetupWizard,
|
|
279
|
+
export { imessageSetupWizard, probeIMessageAccount, sendIMessageOutbound, startIMessageGatewayAccount };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createChannelConfigUiHints } from "openclaw/plugin-sdk/channel-core";
|
|
2
|
-
import { ChannelDeliveryStreamingConfigSchema, ChannelSendReadReceiptsSchema, ExecutableTokenSchema, buildChannelAccountSchemaParts, buildChannelConfigSchema, buildChannelReactionShape, buildGroupEntrySchema, isSafeScpRemoteHost, isValidInboundPathRootPattern,
|
|
2
|
+
import { ChannelDeliveryStreamingConfigSchema, ChannelSendReadReceiptsSchema, ExecutableTokenSchema, buildChannelAccountSchemaParts, buildChannelConfigSchema, buildChannelReactionShape, buildGroupEntrySchema, isSafeScpRemoteHost, isValidInboundPathRootPattern, refineChannelDmPolicy } from "openclaw/plugin-sdk/channel-config-schema";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
//#region extensions/imessage/src/config-ui-hints.ts
|
|
5
5
|
const iMessageChannelConfigUiHints = {
|
|
@@ -93,46 +93,19 @@ const IMessageConfigSchema = IMessageAccountSchemaBase.extend({
|
|
|
93
93
|
accounts: z.record(z.string(), IMessageAccountSchemaBase.optional()).optional(),
|
|
94
94
|
defaultAccount: z.string().optional()
|
|
95
95
|
}).superRefine((value, ctx) => {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
ctx
|
|
100
|
-
path: ["allowFrom"],
|
|
101
|
-
message: "channels.imessage.dmPolicy=\"open\" requires channels.imessage.allowFrom to include \"*\""
|
|
102
|
-
});
|
|
103
|
-
requireAllowlistAllowFrom({
|
|
104
|
-
policy: value.dmPolicy,
|
|
105
|
-
allowFrom: value.allowFrom,
|
|
106
|
-
ctx,
|
|
107
|
-
path: ["allowFrom"],
|
|
108
|
-
message: "channels.imessage.dmPolicy=\"allowlist\" requires channels.imessage.allowFrom to contain at least one sender ID"
|
|
96
|
+
refineChannelDmPolicy({
|
|
97
|
+
channelId: "imessage",
|
|
98
|
+
value,
|
|
99
|
+
ctx
|
|
109
100
|
});
|
|
110
101
|
if (!value.accounts) return;
|
|
111
102
|
for (const [accountId, account] of Object.entries(value.accounts)) {
|
|
112
103
|
if (!account) continue;
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
ctx,
|
|
119
|
-
path: [
|
|
120
|
-
"accounts",
|
|
121
|
-
accountId,
|
|
122
|
-
"allowFrom"
|
|
123
|
-
],
|
|
124
|
-
message: "channels.imessage.accounts.*.dmPolicy=\"open\" requires channels.imessage.accounts.*.allowFrom (or channels.imessage.allowFrom) to include \"*\""
|
|
125
|
-
});
|
|
126
|
-
requireAllowlistAllowFrom({
|
|
127
|
-
policy: effectivePolicy,
|
|
128
|
-
allowFrom: effectiveAllowFrom,
|
|
129
|
-
ctx,
|
|
130
|
-
path: [
|
|
131
|
-
"accounts",
|
|
132
|
-
accountId,
|
|
133
|
-
"allowFrom"
|
|
134
|
-
],
|
|
135
|
-
message: "channels.imessage.accounts.*.dmPolicy=\"allowlist\" requires channels.imessage.accounts.*.allowFrom (or channels.imessage.allowFrom) to contain at least one sender ID"
|
|
104
|
+
refineChannelDmPolicy({
|
|
105
|
+
channelId: "imessage",
|
|
106
|
+
value,
|
|
107
|
+
accountId,
|
|
108
|
+
ctx
|
|
136
109
|
});
|
|
137
110
|
}
|
|
138
111
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { a as resolveDefaultIMessageAccountId, l as resolveIMessageRemoteHost, n as hasExclusiveIMessageLocalDatabase, o as resolveIMessageAccount, u as expandIMessageUserPath } from "./accounts-CCirBEIm.js";
|
|
2
2
|
import { _ as IMESSAGE_ACTION_NAMES, d as normalizeBareIMessageChatIdentifier, f as getCachedIMessagePrivateApiStatus, g as IMESSAGE_ACTIONS, h as setCachedIMessagePrivateApiStatus, l as parseIMessageTarget, p as imessageRpcSupportsMethod, s as normalizeIMessageHandle$1, t as describeIMessageMessageTool, u as isIMessagePhoneLikeHandle } from "./message-tool-api-CUoFESHj.js";
|
|
3
|
-
import { c as findLatestIMessageEntryForChat, d as rememberIMessageReplyCache, g as chatContextFromIMessageTarget, l as isIMessageCurrentMessageInChat, o as createIMessageRpcClient } from "./sanitize-outbound-
|
|
3
|
+
import { c as findLatestIMessageEntryForChat, d as rememberIMessageReplyCache, g as chatContextFromIMessageTarget, l as isIMessageCurrentMessageInChat, o as createIMessageRpcClient } from "./sanitize-outbound-C6UF2cvr.js";
|
|
4
4
|
import { createLazyRuntimeNamedExport } from "openclaw/plugin-sdk/lazy-runtime";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { normalizeE164 } from "openclaw/plugin-sdk/account-resolution";
|
|
@@ -519,7 +519,7 @@ async function probeIMessage(timeoutMs, opts = {}) {
|
|
|
519
519
|
}
|
|
520
520
|
//#endregion
|
|
521
521
|
//#region extensions/imessage/src/actions.ts
|
|
522
|
-
const loadIMessageActionsRuntime = createLazyRuntimeNamedExport(() => import("./actions.runtime-
|
|
522
|
+
const loadIMessageActionsRuntime = createLazyRuntimeNamedExport(() => import("./actions.runtime-CzvR20qT.js"), "imessageActionsRuntime");
|
|
523
523
|
const log = createSubsystemLogger("channels/imessage");
|
|
524
524
|
const providerId = "imessage";
|
|
525
525
|
const SUPPORTED_ACTIONS = /* @__PURE__ */ new Set([...IMESSAGE_ACTION_NAMES, "upload-file"]);
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { d as resolveIMessageChatDbLookupPath, f as resolveIMessageHomeDir, l as resolveIMessageRemoteHost, o as resolveIMessageAccount } from "./accounts-CCirBEIm.js";
|
|
2
2
|
import { c as parseIMessageAllowTarget, f as getCachedIMessagePrivateApiStatus, i as isAllowedIMessageReplyContextSender, l as parseIMessageTarget, n as formatIMessageChatTarget, p as imessageRpcSupportsMethod, s as normalizeIMessageHandle } from "./message-tool-api-CUoFESHj.js";
|
|
3
|
-
import { d as rememberIMessageReplyCache, o as createIMessageRpcClient, r as sanitizeOutboundText, u as isKnownFromMeIMessageMessageId, y as resolveIMessageDirectChatService } from "./sanitize-outbound-
|
|
4
|
-
import { f as probeIMessage, r as resolveIMessageInboundConversationId } from "./group-policy-
|
|
3
|
+
import { d as rememberIMessageReplyCache, o as createIMessageRpcClient, r as sanitizeOutboundText, u as isKnownFromMeIMessageMessageId, y as resolveIMessageDirectChatService } from "./sanitize-outbound-C6UF2cvr.js";
|
|
4
|
+
import { f as probeIMessage, r as resolveIMessageInboundConversationId } from "./group-policy-Duro87b4.js";
|
|
5
5
|
import { t as getIMessageRuntime } from "./runtime-Cza4CY5T.js";
|
|
6
6
|
import { d as resolveIMessageEchoMediaKey, l as capFailureRetriesMap, t as IMESSAGE_CATCHUP_CURSOR_NAMESPACE, u as resolveIMessageCatchupCursorKey } from "./state-contract-DvahEY4X.js";
|
|
7
7
|
import { n as resolveIMessageAttachmentRoots, r as resolveIMessageRemoteAttachmentRoots } from "./media-contract-pns3TSS5.js";
|
|
8
|
-
import { i as registerIMessageApprovalReactionTarget, n as handleIMessageApprovalReaction, o as listPendingIMessageApprovalReactionPollTargets, r as maybeResolveIMessageApprovalReaction, s as buildIMessageApprovalConversationKeyForInbound } from "./approval-reactions-
|
|
9
|
-
import { c as iMessageApprovalControlBindings, n as hasPersistedIMessageEcho, r as stripLeadingEchoTextCorruptionMarkers, s as maybeResolveIMessageApprovalPollVote, t as sendMessageIMessage } from "./send-
|
|
8
|
+
import { i as registerIMessageApprovalReactionTarget, n as handleIMessageApprovalReaction, o as listPendingIMessageApprovalReactionPollTargets, r as maybeResolveIMessageApprovalReaction, s as buildIMessageApprovalConversationKeyForInbound } from "./approval-reactions-BM_AwHPq.js";
|
|
9
|
+
import { c as iMessageApprovalControlBindings, n as hasPersistedIMessageEcho, r as stripLeadingEchoTextCorruptionMarkers, s as maybeResolveIMessageApprovalPollVote, t as sendMessageIMessage } from "./send-CIHiLtcY.js";
|
|
10
10
|
import { n as normalizeIMessageGuid, t as resolveIMessageReactionContext } from "./reaction-context-Br-vAJFp.js";
|
|
11
11
|
import { n as maybeResolveIMessageQuestionReaction, t as hasIMessageQuestionReactionTarget } from "./question-reactions-9tBYB1_F.js";
|
|
12
|
-
import { bindIngressLifecycleToReplyOptions, createChannelIngressError, createChannelIngressMonitor, createChannelMessageReplyPipeline,
|
|
12
|
+
import { bindIngressLifecycleToReplyOptions, createChannelIngressError, createChannelIngressMonitor, createChannelMessageReplyPipeline, resolveChannelStreamingBlockEnabled } from "openclaw/plugin-sdk/channel-outbound";
|
|
13
13
|
import { chunkMarkdownTextWithMode as chunkTextWithMode, resolveChunkMode, resolveTextChunkLimit } from "openclaw/plugin-sdk/reply-runtime";
|
|
14
14
|
import { resolveAgentRoute, resolveInboundLastRouteSessionKey } from "openclaw/plugin-sdk/routing";
|
|
15
15
|
import path from "node:path";
|
|
@@ -25,7 +25,7 @@ import { sliceUtf16Safe, truncateUtf16Safe } from "openclaw/plugin-sdk/text-util
|
|
|
25
25
|
import { collectErrorGraphCandidates, formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
26
26
|
import { buildChannelGroupsScopeTree, resolveChannelGroupPolicy, resolveChannelGroups, resolveChannelGroupsConfigPath, resolveScopeRequireMention } from "openclaw/plugin-sdk/channel-policy";
|
|
27
27
|
import { convertMarkdownTables as convertMarkdownTables$1, findCodeRegions, isInsideCode, sanitizeTerminalText } from "openclaw/plugin-sdk/text-chunking";
|
|
28
|
-
import { buildChannelInboundEventContext, buildMentionRegexes, createChannelInboundDebouncer, createChannelPartialDeliveryError, filterChannelInboundQuoteContext, formatInboundEnvelope, formatInboundFromLabel, formatInboundMediaUnavailableText, formatMediaPlaceholderText, isChannelPartialDeliveryError, logInboundDrop, matchesMentionPatterns, resolveEnvelopeFormatOptions, resolveInboundDebounceMs, resolveInboundMentionDecision, resolveInboundSupplementalSenderAllowed, runChannelInboundEvent, shouldDebounceTextInbound, toInboundMediaFactsWithMetadata } from "openclaw/plugin-sdk/channel-inbound";
|
|
28
|
+
import { buildChannelInboundEventContext, buildMentionRegexes, createAcceptedChannelDeliveryResult, createChannelInboundDebouncer, createChannelPartialDeliveryError, filterChannelInboundQuoteContext, formatInboundEnvelope, formatInboundFromLabel, formatInboundMediaUnavailableText, formatMediaPlaceholderText, isChannelPartialDeliveryError, logInboundDrop, matchesMentionPatterns, resolveEnvelopeFormatOptions, resolveInboundDebounceMs, resolveInboundMentionDecision, resolveInboundSupplementalSenderAllowed, runChannelInboundEvent, shouldDebounceTextInbound, toInboundMediaFactsWithMetadata } from "openclaw/plugin-sdk/channel-inbound";
|
|
29
29
|
import { resolveAgentConfig, resolveHumanDelayConfig } from "openclaw/plugin-sdk/agent-runtime";
|
|
30
30
|
import { CHANNEL_APPROVAL_NATIVE_RUNTIME_CONTEXT_CAPABILITY } from "openclaw/plugin-sdk/approval-handler-runtime";
|
|
31
31
|
import { logTypingFailure } from "openclaw/plugin-sdk/channel-feedback";
|
|
@@ -991,32 +991,24 @@ async function deliverIMessageReply(params) {
|
|
|
991
991
|
} catch (error) {
|
|
992
992
|
const partial = isChannelPartialDeliveryError(error) ? error.deliveryResult : void 0;
|
|
993
993
|
if (accepted.length === 0 && partial?.visibleReplySent !== true) throw error;
|
|
994
|
-
|
|
995
|
-
results:
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
throw createChannelPartialDeliveryError(error, {
|
|
999
|
-
messageIds: listMessageReceiptPlatformIds(receipt),
|
|
1000
|
-
receipt,
|
|
1001
|
-
visibleReplySent: true,
|
|
994
|
+
throw createChannelPartialDeliveryError(error, createAcceptedChannelDeliveryResult({
|
|
995
|
+
results: accepted.map((result) => ({ receipt: result.receipt })),
|
|
996
|
+
deliveryResults: partial ? [partial] : [],
|
|
997
|
+
kind: reply.mediaUrls.length > 0 ? "media" : "text",
|
|
1002
998
|
content: [...accepted.map((result) => result.sentText), partial?.content].filter(Boolean).join("\n")
|
|
1003
|
-
});
|
|
999
|
+
}));
|
|
1004
1000
|
}
|
|
1005
1001
|
if (delivered === "empty") return {
|
|
1006
1002
|
visibleReplySent: false,
|
|
1007
1003
|
suppression: { reason: "no_visible_result" }
|
|
1008
1004
|
};
|
|
1009
|
-
const
|
|
1005
|
+
const deliveryResult = createAcceptedChannelDeliveryResult({
|
|
1010
1006
|
results: accepted.map((result) => ({ receipt: result.receipt })),
|
|
1011
|
-
kind: delivered
|
|
1007
|
+
kind: delivered,
|
|
1008
|
+
content: accepted.map((result) => result.sentText).filter(Boolean).join("\n")
|
|
1012
1009
|
});
|
|
1013
1010
|
runtime.log?.(`imessage: delivered reply to ${target}`);
|
|
1014
|
-
return
|
|
1015
|
-
messageIds: listMessageReceiptPlatformIds(receipt),
|
|
1016
|
-
receipt,
|
|
1017
|
-
visibleReplySent: true,
|
|
1018
|
-
content: accepted.map((result) => result.sentText).filter(Boolean).join("\n")
|
|
1019
|
-
};
|
|
1011
|
+
return deliveryResult;
|
|
1020
1012
|
}
|
|
1021
1013
|
function createIMessageEchoCachingSend(params) {
|
|
1022
1014
|
return async (target, text, opts) => {
|
|
@@ -3416,6 +3408,7 @@ async function monitorIMessageProvider(opts = {}) {
|
|
|
3416
3408
|
let directTypingController;
|
|
3417
3409
|
const directToolTypingOptions = shouldUseDirectToolTypingOptions ? {
|
|
3418
3410
|
suppressDefaultToolProgressMessages: true,
|
|
3411
|
+
allowToolLifecycleWhenProgressHidden: true,
|
|
3419
3412
|
allowProgressCallbacksWhenSourceDeliverySuppressed: true,
|
|
3420
3413
|
onTypingController: (typing) => {
|
|
3421
3414
|
directTypingController = typing;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { p as resolveLocalIMessageChatDbPath } from "./accounts-CCirBEIm.js";
|
|
2
|
-
import { _ as isIMessageEmailChatIdentifier, f as resolveIMessageCachedResourceBinding, g as chatContextFromIMessageTarget, p as resolveIMessageMessageId } from "./sanitize-outbound-
|
|
2
|
+
import { _ as isIMessageEmailChatIdentifier, f as resolveIMessageCachedResourceBinding, g as chatContextFromIMessageTarget, p as resolveIMessageMessageId } from "./sanitize-outbound-C6UF2cvr.js";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { normalizeScpRemoteHost } from "openclaw/plugin-sdk/host-runtime";
|
|
5
5
|
import { createSubsystemLogger } from "openclaw/plugin-sdk/runtime-env";
|
package/dist/runtime-api.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { o as resolveIMessageAccount } from "./accounts-CCirBEIm.js";
|
|
2
|
-
import { c as normalizeIMessageMessagingTarget, d as imessageMessageActions, f as probeIMessage, n as resolveIMessageGroupToolPolicy, s as looksLikeIMessageTargetId, t as resolveIMessageGroupRequireMention } from "./group-policy-
|
|
2
|
+
import { c as normalizeIMessageMessagingTarget, d as imessageMessageActions, f as probeIMessage, n as resolveIMessageGroupToolPolicy, s as looksLikeIMessageTargetId, t as resolveIMessageGroupRequireMention } from "./group-policy-Duro87b4.js";
|
|
3
3
|
import { r as setIMessageRuntime } from "./runtime-Cza4CY5T.js";
|
|
4
|
-
import { n as IMessageConfigSchema } from "./config-schema-
|
|
5
|
-
import { t as sendMessageIMessage } from "./send-
|
|
6
|
-
import { t as monitorIMessageProvider } from "./monitor-
|
|
4
|
+
import { n as IMessageConfigSchema } from "./config-schema-CCbTcJEV.js";
|
|
5
|
+
import { t as sendMessageIMessage } from "./send-CIHiLtcY.js";
|
|
6
|
+
import { t as monitorIMessageProvider } from "./monitor-Dj3TAimI.js";
|
|
7
7
|
import { formatTrimmedAllowFromEntries } from "openclaw/plugin-sdk/channel-config-helpers";
|
|
8
|
+
import { PAIRING_APPROVED_MESSAGE } from "openclaw/plugin-sdk/channel-status";
|
|
8
9
|
import { buildComputedAccountStatusSnapshot, collectStatusIssuesFromLastError } from "openclaw/plugin-sdk/status-helpers";
|
|
9
10
|
import { resolveChannelMediaMaxBytes } from "openclaw/plugin-sdk/account-helpers";
|
|
10
11
|
import { chunkTextForOutbound } from "openclaw/plugin-sdk/text-chunking";
|
|
11
12
|
import { DEFAULT_ACCOUNT_ID, getChatChannelMeta } from "openclaw/plugin-sdk/core";
|
|
12
13
|
import { buildChannelConfigSchema } from "openclaw/plugin-sdk/channel-config-schema";
|
|
13
|
-
import { PAIRING_APPROVED_MESSAGE } from "openclaw/plugin-sdk/channel-status";
|
|
14
14
|
//#region extensions/imessage/src/config-accessors.ts
|
|
15
15
|
function resolveIMessageConfigAllowFrom(params) {
|
|
16
16
|
return (resolveIMessageAccount(params).config.allowFrom ?? []).map((entry) => String(entry));
|
|
@@ -450,6 +450,29 @@ function normalizeIMessageFullDiskAccessError(message) {
|
|
|
450
450
|
if (!normalized.includes("full disk access") || !normalized.includes("chat.db")) return;
|
|
451
451
|
return PUBLIC_IMESSAGE_FULL_DISK_ACCESS_ERROR;
|
|
452
452
|
}
|
|
453
|
+
function createLfLineFramer(onLine) {
|
|
454
|
+
const decoder = new StringDecoder("utf8");
|
|
455
|
+
let buffer = "";
|
|
456
|
+
return {
|
|
457
|
+
write(chunk) {
|
|
458
|
+
buffer += typeof chunk === "string" ? chunk : decoder.write(chunk);
|
|
459
|
+
let newlineIndex = buffer.indexOf("\n");
|
|
460
|
+
while (newlineIndex !== -1) {
|
|
461
|
+
const line = buffer.slice(0, newlineIndex);
|
|
462
|
+
buffer = buffer.slice(newlineIndex + 1);
|
|
463
|
+
onLine(line);
|
|
464
|
+
newlineIndex = buffer.indexOf("\n");
|
|
465
|
+
}
|
|
466
|
+
},
|
|
467
|
+
flush() {
|
|
468
|
+
buffer += decoder.end();
|
|
469
|
+
if (!buffer) return;
|
|
470
|
+
const line = buffer;
|
|
471
|
+
buffer = "";
|
|
472
|
+
onLine(line);
|
|
473
|
+
}
|
|
474
|
+
};
|
|
475
|
+
}
|
|
453
476
|
var IMessageRpcClient = class {
|
|
454
477
|
constructor(opts = {}) {
|
|
455
478
|
this.pending = /* @__PURE__ */ new Map();
|
|
@@ -458,10 +481,8 @@ var IMessageRpcClient = class {
|
|
|
458
481
|
this.isReaped = false;
|
|
459
482
|
this.child = null;
|
|
460
483
|
this.stopPromise = null;
|
|
461
|
-
this.
|
|
462
|
-
this.
|
|
463
|
-
this.stderrBuffer = "";
|
|
464
|
-
this.stderrDecoder = new StringDecoder("utf8");
|
|
484
|
+
this.stdoutFramer = createLfLineFramer((line) => this.handleStdoutLine(line));
|
|
485
|
+
this.stderrFramer = createLfLineFramer((line) => this.handleStderrLine(line));
|
|
465
486
|
this.nextId = 1;
|
|
466
487
|
this.publicProcessError = null;
|
|
467
488
|
this.configuredCliPath = opts.cliPath?.trim() || "imsg";
|
|
@@ -490,21 +511,29 @@ var IMessageRpcClient = class {
|
|
|
490
511
|
this.child = child;
|
|
491
512
|
child.stdout.on("data", (chunk) => {
|
|
492
513
|
if (this.child !== child) return;
|
|
493
|
-
this.
|
|
514
|
+
this.stdoutFramer.write(chunk);
|
|
494
515
|
});
|
|
495
516
|
child.stderr?.on("data", (chunk) => {
|
|
496
517
|
if (this.child !== child) return;
|
|
497
|
-
this.
|
|
518
|
+
this.stderrFramer.write(chunk);
|
|
498
519
|
});
|
|
499
520
|
const failFromProcessError = (err) => this.failTransport(err, child);
|
|
500
521
|
child.on("error", failFromProcessError);
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
522
|
+
for (const stream of [
|
|
523
|
+
child.stdin,
|
|
524
|
+
child.stdout,
|
|
525
|
+
child.stderr
|
|
526
|
+
]) {
|
|
527
|
+
stream.on("error", failFromProcessError);
|
|
528
|
+
stream.once("close", () => {
|
|
529
|
+
const error = stream.errored;
|
|
530
|
+
if (error) failFromProcessError(error);
|
|
531
|
+
});
|
|
532
|
+
}
|
|
504
533
|
child.on("close", (code, signal) => {
|
|
505
534
|
if (this.child === child) {
|
|
506
|
-
this.
|
|
507
|
-
this.
|
|
535
|
+
this.stdoutFramer.flush();
|
|
536
|
+
this.stderrFramer.flush();
|
|
508
537
|
this.child = null;
|
|
509
538
|
}
|
|
510
539
|
this.finish(this.buildCloseError(code, signal));
|
|
@@ -597,48 +626,11 @@ var IMessageRpcClient = class {
|
|
|
597
626
|
if (!this.finish(err instanceof Error ? err : new Error(String(err)))) return;
|
|
598
627
|
if (child) this.signalChild(child, "SIGTERM");
|
|
599
628
|
}
|
|
600
|
-
handleStdoutChunk(chunk) {
|
|
601
|
-
const text = typeof chunk === "string" ? chunk : this.stdoutDecoder.write(chunk);
|
|
602
|
-
this.stdoutBuffer += text;
|
|
603
|
-
let newlineIndex = this.stdoutBuffer.indexOf("\n");
|
|
604
|
-
while (newlineIndex !== -1) {
|
|
605
|
-
const line = this.stdoutBuffer.slice(0, newlineIndex);
|
|
606
|
-
this.stdoutBuffer = this.stdoutBuffer.slice(newlineIndex + 1);
|
|
607
|
-
this.handleStdoutLine(line);
|
|
608
|
-
newlineIndex = this.stdoutBuffer.indexOf("\n");
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
flushStdoutBuffer() {
|
|
612
|
-
const tail = this.stdoutDecoder.end();
|
|
613
|
-
if (tail) this.stdoutBuffer += tail;
|
|
614
|
-
if (!this.stdoutBuffer) return;
|
|
615
|
-
const line = this.stdoutBuffer;
|
|
616
|
-
this.stdoutBuffer = "";
|
|
617
|
-
this.handleStdoutLine(line);
|
|
618
|
-
}
|
|
619
629
|
handleStdoutLine(line) {
|
|
620
630
|
const trimmed = line.trim();
|
|
621
631
|
if (!trimmed) return;
|
|
622
632
|
this.handleLine(trimmed);
|
|
623
633
|
}
|
|
624
|
-
handleStderrChunk(chunk) {
|
|
625
|
-
const text = typeof chunk === "string" ? chunk : this.stderrDecoder.write(chunk);
|
|
626
|
-
this.stderrBuffer += text;
|
|
627
|
-
let newlineIndex = this.stderrBuffer.indexOf("\n");
|
|
628
|
-
while (newlineIndex !== -1) {
|
|
629
|
-
const line = this.stderrBuffer.slice(0, newlineIndex);
|
|
630
|
-
this.stderrBuffer = this.stderrBuffer.slice(newlineIndex + 1);
|
|
631
|
-
this.handleStderrLine(line);
|
|
632
|
-
newlineIndex = this.stderrBuffer.indexOf("\n");
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
flushStderrBuffer() {
|
|
636
|
-
this.stderrBuffer += this.stderrDecoder.end();
|
|
637
|
-
if (!this.stderrBuffer) return;
|
|
638
|
-
const line = this.stderrBuffer;
|
|
639
|
-
this.stderrBuffer = "";
|
|
640
|
-
this.handleStderrLine(line);
|
|
641
|
-
}
|
|
642
634
|
handleStderrLine(line) {
|
|
643
635
|
const trimmed = line.trim();
|
|
644
636
|
if (!trimmed) return;
|
|
@@ -764,6 +756,10 @@ function codeDelimiter(content) {
|
|
|
764
756
|
return "`".repeat(longestRun + 1);
|
|
765
757
|
}
|
|
766
758
|
function restoreCodeMarkers(text, ranges, codeRanges) {
|
|
759
|
+
if (codeRanges.length === 0) return {
|
|
760
|
+
text,
|
|
761
|
+
ranges
|
|
762
|
+
};
|
|
767
763
|
let rendered = "";
|
|
768
764
|
let cursor = 0;
|
|
769
765
|
const edits = codeRanges.map((range) => {
|
|
@@ -812,12 +808,12 @@ function extractMarkdownFormatRuns(input) {
|
|
|
812
808
|
preserveSourceBlockSpacing: true
|
|
813
809
|
});
|
|
814
810
|
const rendered = renderMarkdownWithAttributedRanges(ir, { styleMap: IMESSAGE_STYLE_MAP }, IMESSAGE_FORMAT_PROFILE);
|
|
815
|
-
const
|
|
811
|
+
const codeRanges = ir.styles.some((span) => span.style === "code") ? renderMarkdownWithAttributedRanges(ir, { styleMap: { code: "code" } }, IMESSAGE_CODE_PROFILE).ranges : [];
|
|
816
812
|
return restoreCodeMarkers(rendered.text, rendered.ranges.map(({ start, length, style }) => ({
|
|
817
813
|
start,
|
|
818
814
|
length,
|
|
819
815
|
styles: [style]
|
|
820
|
-
})),
|
|
816
|
+
})), codeRanges);
|
|
821
817
|
}
|
|
822
818
|
//#endregion
|
|
823
819
|
//#region extensions/imessage/src/monitor/sanitize-outbound.ts
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { d as resolveIMessageChatDbLookupPath, l as resolveIMessageRemoteHost, n as hasExclusiveIMessageLocalDatabase, o as resolveIMessageAccount } from "./accounts-CCirBEIm.js";
|
|
2
2
|
import { l as parseIMessageTarget, n as formatIMessageChatTarget, s as normalizeIMessageHandle } from "./message-tool-api-CUoFESHj.js";
|
|
3
|
-
import { a as IMessageRpcRequestError, d as rememberIMessageReplyCache, g as chatContextFromIMessageTarget, n as sanitizeIMessageFinalOutboundText, o as createIMessageRpcClient, s as runIMessageCliJsonCommand, t as protectIMessageFencedRoleMarkers, y as resolveIMessageDirectChatService } from "./sanitize-outbound-
|
|
4
|
-
import { l as getIMessageApprovalApprovers, u as imessageApprovalAuth } from "./group-policy-
|
|
3
|
+
import { a as IMessageRpcRequestError, d as rememberIMessageReplyCache, g as chatContextFromIMessageTarget, n as sanitizeIMessageFinalOutboundText, o as createIMessageRpcClient, s as runIMessageCliJsonCommand, t as protectIMessageFencedRoleMarkers, y as resolveIMessageDirectChatService } from "./sanitize-outbound-C6UF2cvr.js";
|
|
4
|
+
import { l as getIMessageApprovalApprovers, u as imessageApprovalAuth } from "./group-policy-Duro87b4.js";
|
|
5
5
|
import { n as getOptionalIMessageRuntime, t as getIMessageRuntime } from "./runtime-Cza4CY5T.js";
|
|
6
6
|
import { c as IMESSAGE_SENT_ECHOES_TTL_MS, d as resolveIMessageEchoMediaKey, p as resolveIMessageSentEchoEntryKey, s as IMESSAGE_SENT_ECHOES_NAMESPACE } from "./state-contract-DvahEY4X.js";
|
|
7
|
-
import { d as normalizeConversationKey, i as registerIMessageApprovalReactionTarget, l as enumerateApprovalTargetKeys, s as buildIMessageApprovalConversationKeyForInbound, u as enumerateConversationKeyForms } from "./approval-reactions-
|
|
7
|
+
import { d as normalizeConversationKey, i as registerIMessageApprovalReactionTarget, l as enumerateApprovalTargetKeys, s as buildIMessageApprovalConversationKeyForInbound, u as enumerateConversationKeyForms } from "./approval-reactions-BM_AwHPq.js";
|
|
8
8
|
import { n as normalizeIMessageGuid } from "./reaction-context-Br-vAJFp.js";
|
|
9
|
-
import { r as resolveAuthorizedIMessageReplyReference, t as withIMessageRemoteFile } from "./remote-file-
|
|
9
|
+
import { r as resolveAuthorizedIMessageReplyReference, t as withIMessageRemoteFile } from "./remote-file-5n5LznCa.js";
|
|
10
10
|
import { createMessageReceiptFromOutboundResults } from "openclaw/plugin-sdk/channel-outbound";
|
|
11
11
|
import { createLazyRuntimeSurface } from "openclaw/plugin-sdk/lazy-runtime";
|
|
12
12
|
import { accessSync, constants } from "node:fs";
|
package/openclaw.plugin.json
CHANGED
|
@@ -4,7 +4,11 @@
|
|
|
4
4
|
"description": "OpenClaw iMessage channel plugin using imsg on a signed-in Mac.",
|
|
5
5
|
"doctorContract": {
|
|
6
6
|
"configRepair": true,
|
|
7
|
-
"stateMigrations":
|
|
7
|
+
"stateMigrations": [
|
|
8
|
+
{
|
|
9
|
+
"id": "imessage-legacy-state"
|
|
10
|
+
}
|
|
11
|
+
]
|
|
8
12
|
},
|
|
9
13
|
"activation": {
|
|
10
14
|
"onStartup": false
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/imessage",
|
|
3
|
-
"version": "2026.9.
|
|
3
|
+
"version": "2026.9.3",
|
|
4
4
|
"description": "OpenClaw iMessage channel plugin using imsg on a signed-in Mac",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"zod": "4.4.3"
|
|
13
13
|
},
|
|
14
14
|
"peerDependencies": {
|
|
15
|
-
"openclaw": ">=2026.9.
|
|
15
|
+
"openclaw": ">=2026.9.3"
|
|
16
16
|
},
|
|
17
17
|
"peerDependenciesMeta": {
|
|
18
18
|
"openclaw": {
|
|
@@ -92,10 +92,10 @@
|
|
|
92
92
|
"allowInvalidConfigRecovery": true
|
|
93
93
|
},
|
|
94
94
|
"compat": {
|
|
95
|
-
"pluginApi": ">=2026.9.
|
|
95
|
+
"pluginApi": ">=2026.9.3"
|
|
96
96
|
},
|
|
97
97
|
"build": {
|
|
98
|
-
"openclawVersion": "2026.9.
|
|
98
|
+
"openclawVersion": "2026.9.3",
|
|
99
99
|
"bundledDist": false
|
|
100
100
|
},
|
|
101
101
|
"release": {
|