@openclaw/signal 2026.9.1 → 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.
Files changed (29) hide show
  1. package/dist/api.js +7 -7
  2. package/dist/{approval-auth-CkljhI65.js → approval-auth-pNCKKotV.js} +12 -1
  3. package/dist/{approval-handler.runtime-DvZd_IWj.js → approval-handler.runtime-X6DXgK_3.js} +3 -3
  4. package/dist/{approval-reactions-Cno-4mmH.js → approval-reactions-Cub0slPC.js} +26 -66
  5. package/dist/{channel-sL5Cf1nT.js → channel-DJQccJtU.js} +22 -16
  6. package/dist/channel-config-api.js +1 -1
  7. package/dist/channel-plugin-api.js +1 -1
  8. package/dist/{channel.runtime-D2a4nSLo.js → channel.runtime-QerbTca6.js} +2 -2
  9. package/dist/{client-BmpTN7R3.js → client-B3C0ciqU.js} +6 -1
  10. package/dist/{client-adapter-CDyW9LrQ.js → client-adapter-CNc5wzzs.js} +1 -1
  11. package/dist/{config-schema-CHihQTOp.js → config-schema-DfEbpMVQ.js} +10 -37
  12. package/dist/contract-api.js +1 -1
  13. package/dist/{doctor-contract-api-C18u1hW0.js → doctor-contract-api-D0SnglP4.js} +40 -78
  14. package/dist/doctor-contract-api.js +1 -1
  15. package/dist/{monitor-BPOcRufA.js → monitor-CokYfKOk.js} +76 -62
  16. package/dist/{probe-Bjs1Yd79.js → probe-Bh9f0rRO.js} +3 -3
  17. package/dist/{question-reactions-DJfSmeYo.js → question-reactions-B06vyt3T.js} +4 -15
  18. package/dist/{reaction-runtime-api-7FQFT_qb.js → reaction-runtime-api-CWqDv5-q.js} +1 -1
  19. package/dist/reaction-runtime-api.js +1 -1
  20. package/dist/{rolldown-runtime-D7D4PA-g.js → rolldown-runtime-8H4AJuhK.js} +1 -0
  21. package/dist/runtime-api.js +7 -7
  22. package/dist/{send-DF4T9tXZ.js → send-BvWSfyNf.js} +2 -2
  23. package/dist/{send.runtime-DHPi6R_z.js → send.runtime-BNQ0x-2k.js} +1 -1
  24. package/dist/{transport-detection-CbPFIo0i.js → transport-detection-BD__qywn.js} +4 -4
  25. package/dist/{transport-detection.runtime-B81flHI8.js → transport-detection.runtime-c9q3r3AM.js} +1 -1
  26. package/dist/{transport-probes.runtime-B7kr_6Zu.js → transport-probes.runtime-DV7x4VWu.js} +1 -1
  27. package/openclaw.plugin.json +2 -1
  28. package/package.json +4 -4
  29. package/dist/{install-signal-cli-7tEL37_j.js → install-signal-cli-QlEIfWBv.js} +1 -1
package/dist/api.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import { i as resolveSignalAccount, n as listSignalAccountIds, r as resolveDefaultSignalAccountId, t as listEnabledSignalAccounts } from "./accounts-DO4HMqaK.js";
2
2
  import { n as normalizeSignalMessagingTarget, t as looksLikeSignalTargetId } from "./normalize-l_b99hap.js";
3
3
  import { a as normalizeSignalAllowRecipient, c as resolveSignalSender, i as isSignalSenderAllowed, l as looksLikeUuid, n as formatSignalSenderDisplay, o as resolveSignalPeerId, r as formatSignalSenderId, s as resolveSignalRecipient, t as formatSignalPairingIdLine } from "./identity-YXPmgFMu.js";
4
- import { c as resolveSignalReactionLevel, d as markdownToSignalTextChunks, s as signalMessageActions, t as detectSignalTransport, u as markdownToSignalText } from "./transport-detection-CbPFIo0i.js";
5
- import { n as sendReactionSignal, t as removeReactionSignal } from "./reaction-runtime-api-7FQFT_qb.js";
6
- import { a as normalizeSignalAccountInput, d as probeSignalTransport, f as writeSignalAccountTransport, l as signalSetupContract, n as createSignalPluginBase, p as resolveSignalOutboundTarget, r as signalSetupWizard, t as signalPlugin, u as prepareSignalManagedNativeTransport } from "./channel-sL5Cf1nT.js";
7
- import { i as installSignalCli } from "./install-signal-cli-7tEL37_j.js";
8
- import { t as monitorSignalProvider } from "./monitor-BPOcRufA.js";
9
- import { n as sendReadReceiptSignal, r as sendTypingSignal, t as sendMessageSignal } from "./send-DF4T9tXZ.js";
10
- import { t as probeSignal } from "./probe-Bjs1Yd79.js";
4
+ import { c as resolveSignalReactionLevel, d as markdownToSignalTextChunks, s as signalMessageActions, t as detectSignalTransport, u as markdownToSignalText } from "./transport-detection-BD__qywn.js";
5
+ import { n as sendReactionSignal, t as removeReactionSignal } from "./reaction-runtime-api-CWqDv5-q.js";
6
+ import { a as normalizeSignalAccountInput, d as probeSignalTransport, f as writeSignalAccountTransport, l as signalSetupContract, n as createSignalPluginBase, p as resolveSignalOutboundTarget, r as signalSetupWizard, t as signalPlugin, u as prepareSignalManagedNativeTransport } from "./channel-DJQccJtU.js";
7
+ import { i as installSignalCli } from "./install-signal-cli-QlEIfWBv.js";
8
+ import { t as monitorSignalProvider } from "./monitor-CokYfKOk.js";
9
+ import { n as sendReadReceiptSignal, r as sendTypingSignal, t as sendMessageSignal } from "./send-BvWSfyNf.js";
10
+ import { t as probeSignal } from "./probe-Bh9f0rRO.js";
11
11
  //#region extensions/signal/src/channel.setup.ts
12
12
  const signalSetupPlugin = { ...createSignalPluginBase({
13
13
  setupWizard: signalSetupWizard,
@@ -77,6 +77,17 @@ function resolveSignalTarget(params) {
77
77
  };
78
78
  return null;
79
79
  }
80
+ function resolveSignalDeliveredConversationKey(params) {
81
+ try {
82
+ return resolveSignalTarget({
83
+ cfg: params.cfg,
84
+ accountId: params.accountId,
85
+ input: params.to
86
+ })?.to ?? normalizeSignalMessagingTarget(params.to) ?? null;
87
+ } catch {
88
+ return normalizeSignalMessagingTarget(params.to) ?? null;
89
+ }
90
+ }
80
91
  function listSignalAliasDirectoryEntries(params) {
81
92
  const aliases = resolveAliasMap(params);
82
93
  const query = normalizeLowercaseStringOrEmpty(params.query);
@@ -153,4 +164,4 @@ const signalApproval = createChannelApprovalAuth({
153
164
  const getSignalApprovalApprovers = signalApproval.resolveApprovers;
154
165
  const signalApprovalAuth = signalApproval.approvalAuth;
155
166
  //#endregion
156
- export { resolveSignalTarget as i, signalApprovalAuth as n, listSignalAliasDirectoryEntries as r, getSignalApprovalApprovers as t };
167
+ export { resolveSignalTarget as a, resolveSignalDeliveredConversationKey as i, signalApprovalAuth as n, listSignalAliasDirectoryEntries as r, getSignalApprovalApprovers as t };
@@ -1,8 +1,8 @@
1
1
  import { r as resolveDefaultSignalAccountId } from "./accounts-DO4HMqaK.js";
2
2
  import { n as normalizeSignalMessagingTarget } from "./normalize-l_b99hap.js";
3
- import { i as resolveSignalTarget } from "./approval-auth-CkljhI65.js";
4
- import { a as registerSignalApprovalReactionTarget, c as resolveSignalApprovalTargetAuthorKeys, l as unregisterSignalApprovalReactionTarget, r as hasSignalApprovalReactionApprovers, s as resolveSignalApprovalConversationKey } from "./approval-reactions-Cno-4mmH.js";
5
- import { r as sendTypingSignal, t as sendMessageSignal } from "./send-DF4T9tXZ.js";
3
+ import { a as resolveSignalTarget } from "./approval-auth-pNCKKotV.js";
4
+ import { a as registerSignalApprovalReactionTarget, c as resolveSignalApprovalTargetAuthorKeys, l as unregisterSignalApprovalReactionTarget, r as hasSignalApprovalReactionApprovers, s as resolveSignalApprovalConversationKey } from "./approval-reactions-Cub0slPC.js";
5
+ import { r as sendTypingSignal, t as sendMessageSignal } from "./send-BvWSfyNf.js";
6
6
  import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/account-id";
7
7
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
8
8
  import { buildChannelApprovalNativeTargetKey } from "openclaw/plugin-sdk/approval-native-runtime";
@@ -1,14 +1,13 @@
1
- import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
1
+ import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
2
  import { n as normalizeSignalMessagingTarget } from "./normalize-l_b99hap.js";
3
- import { i as resolveSignalTarget, n as signalApprovalAuth, t as getSignalApprovalApprovers } from "./approval-auth-CkljhI65.js";
3
+ import { a as resolveSignalTarget, i as resolveSignalDeliveredConversationKey, n as signalApprovalAuth, t as getSignalApprovalApprovers } from "./approval-auth-pNCKKotV.js";
4
4
  import { l as looksLikeUuid } from "./identity-YXPmgFMu.js";
5
- import { i as getOptionalSignalRuntime } from "./transport-detection-CbPFIo0i.js";
5
+ import { i as getOptionalSignalRuntime } from "./transport-detection-BD__qywn.js";
6
6
  import { createLazyRuntimeSurface } from "openclaw/plugin-sdk/lazy-runtime";
7
7
  import { normalizeAccountId } from "openclaw/plugin-sdk/routing";
8
8
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
9
- import { addApprovalReactionHintToText, createApprovalReactionTargetStore, hasApprovalReactionHintText, listApprovalReactionBindings, readApprovalReactionDecisionList, resolveTypedApprovalReactionTarget } from "openclaw/plugin-sdk/approval-reaction-runtime";
9
+ import { addApprovalReactionHintToText, createApprovalReactionTargetStore, hasApprovalReactionHintText, listApprovalReactionBindings, readApprovalReactionTargetRecord, resolveTypedApprovalReactionTarget, settleApprovalReaction } from "openclaw/plugin-sdk/approval-reaction-runtime";
10
10
  import { normalizeE164 } from "openclaw/plugin-sdk/text-utility-runtime";
11
- import { isApprovalNotFoundError } from "openclaw/plugin-sdk/error-runtime";
12
11
  import { getExecApprovalReplyMetadata } from "openclaw/plugin-sdk/approval-reply-runtime";
13
12
  import { createPluginStateErrorReporter } from "openclaw/plugin-sdk/plugin-state-runtime";
14
13
  import { matchesApprovalRequestFilters } from "openclaw/plugin-sdk/approval-client-runtime";
@@ -141,17 +140,6 @@ const signalApprovalReactionTargets = createApprovalReactionTargetStore({
141
140
  function resolveSignalApprovalConversationKey(to) {
142
141
  return normalizeSignalMessagingTarget(to) ?? null;
143
142
  }
144
- function resolveSignalApprovalConversationKeyForDeliveredTarget(params) {
145
- try {
146
- return resolveSignalTarget({
147
- cfg: params.cfg,
148
- accountId: params.accountId,
149
- input: params.to
150
- })?.to ?? resolveSignalApprovalConversationKey(params.to);
151
- } catch {
152
- return resolveSignalApprovalConversationKey(params.to);
153
- }
154
- }
155
143
  function normalizeSignalApprovalTargetAuthorKey(value) {
156
144
  const normalized = normalizeOptionalString(value);
157
145
  if (!normalized) return null;
@@ -176,10 +164,9 @@ function buildReactionTargetKey(params) {
176
164
  return `${accountId}:${conversationKey}:${messageId}`;
177
165
  }
178
166
  function readPersistedTarget(target) {
167
+ const record = readApprovalReactionTargetRecord(target);
179
168
  const value = target;
180
- if (!value || typeof value.approvalId !== "string" || value.approvalKind !== "exec" && value.approvalKind !== "plugin" || !value.route || value.route.deliveryMode !== "session" && value.route.deliveryMode !== "target" || !Array.isArray(value.targetAuthorKeys)) return null;
181
- const allowedDecisions = readApprovalReactionDecisionList(value.allowedDecisions);
182
- if (!allowedDecisions) return null;
169
+ if (!record || !value?.route || value.route.deliveryMode !== "session" && value.route.deliveryMode !== "target" || !Array.isArray(value.targetAuthorKeys)) return null;
183
170
  const targetRouteTo = value.route.deliveryMode === "target" && typeof value.route.to === "string" ? normalizeSignalMessagingTarget(value.route.to) : null;
184
171
  if (value.route.deliveryMode === "target" && !targetRouteTo) return null;
185
172
  const route = value.route.deliveryMode === "target" ? {
@@ -194,9 +181,7 @@ function readPersistedTarget(target) {
194
181
  ...typeof value.route.sessionKey === "string" ? { sessionKey: value.route.sessionKey } : {}
195
182
  };
196
183
  return {
197
- approvalId: value.approvalId,
198
- approvalKind: value.approvalKind,
199
- allowedDecisions,
184
+ ...record,
200
185
  targetAuthorKeys: value.targetAuthorKeys,
201
186
  route
202
187
  };
@@ -281,7 +266,7 @@ function registerSignalApprovalReactionTargetForDeliveredPayload(params) {
281
266
  cfg: params.cfg,
282
267
  accountId: params.target.accountId
283
268
  })) return false;
284
- const conversationKey = resolveSignalApprovalConversationKeyForDeliveredTarget({
269
+ const conversationKey = resolveSignalDeliveredConversationKey({
285
270
  cfg: params.cfg,
286
271
  accountId: params.target.accountId,
287
272
  to: params.target.to
@@ -370,26 +355,8 @@ async function maybeResolveSignalApprovalReaction(params) {
370
355
  params.logVerboseMessage?.(`signal: approval reaction ignored for ${target.approvalId}; missing actor identity`);
371
356
  return true;
372
357
  }
373
- if (getSignalApprovalApprovers({
374
- cfg: params.cfg,
375
- accountId: params.accountId
376
- }).length === 0) {
377
- params.logVerboseMessage?.(`signal: approval reaction denied id=${target.approvalId}; reactions require explicit approvers`);
378
- return true;
379
- }
380
- if (!signalApprovalAuth.authorizeActorAction({
381
- cfg: params.cfg,
382
- accountId: params.accountId,
383
- senderId: actorId,
384
- action: "approve",
385
- approvalKind: target.approvalKind
386
- }).authorized) {
387
- params.logVerboseMessage?.(`signal: approval reaction denied id=${target.approvalId} sender=${actorId}`);
388
- return true;
389
- }
390
- const resolveApprovalOverGateway = await loadResolveApprovalOverGateway();
391
- try {
392
- const result = await resolveApprovalOverGateway({
358
+ await settleApprovalReaction({
359
+ request: {
393
360
  cfg: params.cfg,
394
361
  approvalId: target.approvalId,
395
362
  approvalKind: target.approvalKind,
@@ -398,32 +365,25 @@ async function maybeResolveSignalApprovalReaction(params) {
398
365
  accountId: params.accountId,
399
366
  senderId: actorId,
400
367
  gatewayUrl: params.gatewayUrl
401
- });
402
- const terminalTruth = formatSignalApprovalTerminalTruth(result.approval);
403
- unregisterSignalApprovalReactionTarget({
368
+ },
369
+ approvers: getSignalApprovalApprovers({
370
+ cfg: params.cfg,
371
+ accountId: params.accountId
372
+ }),
373
+ authorizeActorAction: (input) => signalApprovalAuth.authorizeActorAction(input),
374
+ loadResolver: loadResolveApprovalOverGateway,
375
+ clearTarget: () => unregisterSignalApprovalReactionTarget({
404
376
  accountId: params.accountId,
405
377
  conversationKey: params.conversationKey,
406
378
  messageId: params.messageId
407
- });
408
- if (!result.applied) {
409
- params.logVerboseMessage?.(`signal: approval reaction already resolved id=${target.approvalId} sender=${actorId} ${terminalTruth}`);
410
- return true;
411
- }
412
- params.logVerboseMessage?.(`signal: approval reaction resolved id=${target.approvalId} sender=${actorId} ${terminalTruth}`);
413
- return true;
414
- } catch (error) {
415
- if (isApprovalNotFoundError(error)) {
416
- unregisterSignalApprovalReactionTarget({
417
- accountId: params.accountId,
418
- conversationKey: params.conversationKey,
419
- messageId: params.messageId
420
- });
421
- params.logVerboseMessage?.(`signal: approval reaction ignored for expired approval id=${target.approvalId} sender=${actorId}`);
422
- return true;
423
- }
424
- params.logVerboseMessage?.(`signal: approval reaction failed id=${target.approvalId} sender=${actorId}: ${String(error)}`);
425
- throw error;
426
- }
379
+ }),
380
+ onResolved: (result) => {
381
+ const outcome = result.applied ? "resolved" : "already resolved";
382
+ params.logVerboseMessage?.(`signal: approval reaction ${outcome} id=${target.approvalId} sender=${actorId} ${formatSignalApprovalTerminalTruth(result.approval)}`);
383
+ },
384
+ logVerboseMessage: params.logVerboseMessage
385
+ });
386
+ return true;
427
387
  }
428
388
  function clearSignalApprovalReactionTargetsForTest() {
429
389
  signalApprovalReactionTargets.clearForTest();
@@ -1,11 +1,11 @@
1
1
  import { a as isSignalManagedNativeConnectionUrlForBind, i as assignSignalManagedNativePort, l as normalizeSignalTransportHost, o as isValidSignalManagedNativePort, r as allocateSignalManagedNativePort, s as resolveLocalSignalTransportPort, u as normalizeSignalTransportUrl } from "./transport-policy-DxvSMHp9.js";
2
2
  import { a as resolveSignalAccountConfig, i as resolveSignalAccount, n as listSignalAccountIds, o as resolveSignalReplyToMode, r as resolveDefaultSignalAccountId, s as resolveSignalTransport } from "./accounts-DO4HMqaK.js";
3
3
  import { n as normalizeSignalMessagingTarget, t as looksLikeSignalTargetId } from "./normalize-l_b99hap.js";
4
- import { i as resolveSignalTarget, r as listSignalAliasDirectoryEntries } from "./approval-auth-CkljhI65.js";
4
+ import { a as resolveSignalTarget, r as listSignalAliasDirectoryEntries } from "./approval-auth-pNCKKotV.js";
5
5
  import { c as resolveSignalSender, l as looksLikeUuid, o as resolveSignalPeerId, s as resolveSignalRecipient } from "./identity-YXPmgFMu.js";
6
- import { c as resolveSignalReactionLevel, d as markdownToSignalTextChunks, l as formatSignalMediaText, m as signalApprovalCapability, o as materializeSignalPresentationFallback, p as shouldSuppressLocalSignalExecApprovalPrompt, r as resolveSignalReplyContextWithPersistence, s as signalMessageActions, t as detectSignalTransport } from "./transport-detection-CbPFIo0i.js";
7
- import { i as migrateLegacySignalTransportConfig, n as normalizeCompatibilityConfig, r as clearLegacySignalTransportFieldsForAccount } from "./doctor-contract-api-C18u1hW0.js";
8
- import { t as SignalChannelConfigSchema } from "./config-schema-CHihQTOp.js";
6
+ import { c as resolveSignalReactionLevel, d as markdownToSignalTextChunks, l as formatSignalMediaText, m as signalApprovalCapability, o as materializeSignalPresentationFallback, p as shouldSuppressLocalSignalExecApprovalPrompt, r as resolveSignalReplyContextWithPersistence, s as signalMessageActions, t as detectSignalTransport } from "./transport-detection-BD__qywn.js";
7
+ import { i as migrateLegacySignalTransportConfig, n as normalizeCompatibilityConfig, r as clearLegacySignalTransportFieldsForAccount } from "./doctor-contract-api-D0SnglP4.js";
8
+ import { t as SignalChannelConfigSchema } from "./config-schema-DfEbpMVQ.js";
9
9
  import { describeAccountSnapshot, resolveChannelMediaMaxBytes } from "openclaw/plugin-sdk/account-helpers";
10
10
  import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/account-id";
11
11
  import { buildDmGroupAccountAllowlistAdapter } from "openclaw/plugin-sdk/allowlist-config-edit";
@@ -214,8 +214,8 @@ async function probeSignalTransport(params) {
214
214
  overrides: managedTransportOptions(params.transport)
215
215
  }) : params.transport;
216
216
  const resolved = resolveSignalTransport(transport);
217
- if (resolved.kind === "container") return (params.probeContainer ?? (await import("./transport-probes.runtime-B7kr_6Zu.js")).containerCheck)(resolved.baseUrl, timeoutMs, params.account);
218
- return (params.probeNative ?? (await import("./transport-probes.runtime-B7kr_6Zu.js")).nativeCheck)(resolved.baseUrl, timeoutMs);
217
+ if (resolved.kind === "container") return (params.probeContainer ?? (await import("./transport-probes.runtime-DV7x4VWu.js")).containerCheck)(resolved.baseUrl, timeoutMs, params.account);
218
+ return (params.probeNative ?? (await import("./transport-probes.runtime-DV7x4VWu.js")).nativeCheck)(resolved.baseUrl, timeoutMs);
219
219
  }
220
220
  function writeSignalAccountTransport(params) {
221
221
  const transport = normalizeTransport(params.transport);
@@ -572,7 +572,7 @@ function createSignalSetupWizardProxy(loadWizard) {
572
572
  const signalDoctor = {
573
573
  normalizeCompatibilityConfig,
574
574
  cleanStaleConfig: async ({ cfg }) => {
575
- const { detectSignalTransport } = await import("./transport-detection.runtime-B81flHI8.js");
575
+ const { detectSignalTransport } = await import("./transport-detection.runtime-c9q3r3AM.js");
576
576
  return await migrateLegacySignalTransportConfig({
577
577
  cfg,
578
578
  detect: detectSignalTransport
@@ -583,7 +583,7 @@ const signalDoctor = {
583
583
  //#region extensions/signal/src/shared.ts
584
584
  const SIGNAL_CHANNEL = "signal";
585
585
  async function loadSignalChannelRuntime() {
586
- return await import("./channel.runtime-D2a4nSLo.js");
586
+ return await import("./channel.runtime-QerbTca6.js");
587
587
  }
588
588
  const signalSetupWizard = createSignalSetupWizardProxy(async () => (await loadSignalChannelRuntime()).signalSetupWizard);
589
589
  const signalConfigAdapter = {
@@ -648,7 +648,10 @@ function createSignalPluginBase(params) {
648
648
  minChars: 1500,
649
649
  idleMs: 1e3
650
650
  } },
651
- reload: { configPrefixes: ["channels.signal"] },
651
+ reload: {
652
+ configPrefixes: ["channels.signal"],
653
+ noopPrefixes: ["messages.inbound", "messages.ackReactionScope"]
654
+ },
652
655
  configSchema: SignalChannelConfigSchema,
653
656
  doctor: signalDoctor,
654
657
  config: {
@@ -668,10 +671,10 @@ function createSignalPluginBase(params) {
668
671
  }
669
672
  //#endregion
670
673
  //#region extensions/signal/src/channel.ts
671
- const loadSignalMonitorModule = createLazyRuntimeModule(() => import("./monitor-BPOcRufA.js").then((n) => n.n));
672
- const loadSignalProbeModule = createLazyRuntimeModule(() => import("./probe-Bjs1Yd79.js").then((n) => n.n));
673
- const loadSignalSendRuntime = createLazyRuntimeModule(() => import("./send.runtime-DHPi6R_z.js"));
674
- const loadSignalApprovalReactionsModule = createLazyRuntimeModule(() => import("./approval-reactions-Cno-4mmH.js").then((n) => n.n));
674
+ const loadSignalMonitorModule = createLazyRuntimeModule(() => import("./monitor-CokYfKOk.js").then((n) => n.n));
675
+ const loadSignalProbeModule = createLazyRuntimeModule(() => import("./probe-Bh9f0rRO.js").then((n) => n.n));
676
+ const loadSignalSendRuntime = createLazyRuntimeModule(() => import("./send.runtime-BNQ0x-2k.js"));
677
+ const loadSignalApprovalReactionsModule = createLazyRuntimeModule(() => import("./approval-reactions-Cub0slPC.js").then((n) => n.n));
675
678
  async function resolveSignalSendContext(params) {
676
679
  return {
677
680
  send: resolveOutboundSendDep(params.deps, "signal") ?? (await loadSignalSendRuntime()).sendMessageSignal,
@@ -899,7 +902,7 @@ async function registerDeliveredSignalApprovalPayloadForReactions(params) {
899
902
  const targetAuthor = normalizeOptionalString(account.config.account);
900
903
  const targetAuthorUuid = normalizeOptionalString(account.config.accountUuid);
901
904
  if (!targetAuthor && !targetAuthorUuid) return;
902
- const { registerSignalQuestionReactionTargetForDeliveredPayload } = await import("./question-reactions-DJfSmeYo.js").then((n) => n.n);
905
+ const { registerSignalQuestionReactionTargetForDeliveredPayload } = await import("./question-reactions-B06vyt3T.js").then((n) => n.n);
903
906
  registerSignalQuestionReactionTargetForDeliveredPayload({
904
907
  cfg: params.cfg,
905
908
  target: {
@@ -1090,8 +1093,11 @@ const signalPlugin = createChatChannelPlugin({
1090
1093
  idLabel: "signalNumber",
1091
1094
  message: PAIRING_APPROVED_MESSAGE,
1092
1095
  normalizeAllowEntry: createPairingPrefixStripper(/^signal:/i),
1093
- notify: async ({ cfg, id, message }) => {
1094
- await (await loadSignalSendRuntime()).sendMessageSignal(id, message, { cfg });
1096
+ notify: async ({ cfg, id, message, accountId }) => {
1097
+ await (await loadSignalSendRuntime()).sendMessageSignal(id, message, {
1098
+ cfg,
1099
+ accountId
1100
+ });
1095
1101
  }
1096
1102
  } },
1097
1103
  security: signalSecurityAdapter,
@@ -1,2 +1,2 @@
1
- import { t as SignalChannelConfigSchema } from "./config-schema-CHihQTOp.js";
1
+ import { t as SignalChannelConfigSchema } from "./config-schema-DfEbpMVQ.js";
2
2
  export { SignalChannelConfigSchema };
@@ -1,2 +1,2 @@
1
- import { t as signalPlugin } from "./channel-sL5Cf1nT.js";
1
+ import { t as signalPlugin } from "./channel-DJQccJtU.js";
2
2
  export { signalPlugin };
@@ -1,6 +1,6 @@
1
1
  import { i as resolveSignalAccount, n as listSignalAccountIds } from "./accounts-DO4HMqaK.js";
2
- import { c as signalNumberTextInput, i as createSignalCliPathTextInput, o as signalCompletionNote, s as signalDmPolicy } from "./channel-sL5Cf1nT.js";
3
- import { i as installSignalCli } from "./install-signal-cli-7tEL37_j.js";
2
+ import { c as signalNumberTextInput, i as createSignalCliPathTextInput, o as signalCompletionNote, s as signalDmPolicy } from "./channel-DJQccJtU.js";
3
+ import { i as installSignalCli } from "./install-signal-cli-QlEIfWBv.js";
4
4
  import { detectBinary } from "openclaw/plugin-sdk/setup-tools";
5
5
  import { createDetectedBinaryStatus, createSetupTranslator, setSetupChannelEnabled } from "openclaw/plugin-sdk/setup";
6
6
  //#region extensions/signal/src/setup-surface.ts
@@ -1,14 +1,19 @@
1
+ import { createRequire } from "node:module";
1
2
  import { detectMime, extractOriginalFilename, parseMediaContentLength } from "openclaw/plugin-sdk/media-runtime";
2
3
  import { parseStrictNonNegativeInteger, resolveTimerTimeoutMs } from "openclaw/plugin-sdk/number-runtime";
3
4
  import { coerceErrorMessage, formatErrorMessage, toErrorObject } from "openclaw/plugin-sdk/error-runtime";
4
5
  import { resolveFetch } from "openclaw/plugin-sdk/fetch-runtime";
5
6
  import { readResponseTextPrefix, readResponseWithLimit } from "openclaw/plugin-sdk/response-limit-runtime";
6
7
  import { readRegularFile } from "openclaw/plugin-sdk/security-runtime";
7
- import WebSocket from "ws";
8
+ import path from "node:path";
8
9
  import { Buffer as Buffer$1 } from "node:buffer";
9
10
  import http from "node:http";
10
11
  import https from "node:https";
11
12
  import { generateSecureUuid } from "openclaw/plugin-sdk/core";
13
+ //#region extensions/signal/src/ws-runtime.ts
14
+ const require = createRequire(import.meta.url);
15
+ const WebSocket = require(path.join(path.dirname(require.resolve("ws/package.json")), "index.js"));
16
+ //#endregion
12
17
  //#region extensions/signal/src/client-container.ts
13
18
  /**
14
19
  * Signal client for bbernhard/signal-cli-rest-api container.
@@ -1,4 +1,4 @@
1
- import { a as containerCheck, i as streamSignalEvents$1, n as signalCheck$1, o as containerRpcRequest, r as signalRpcRequest$1, s as streamContainerEvents } from "./client-BmpTN7R3.js";
1
+ import { a as containerCheck, i as streamSignalEvents$1, n as signalCheck$1, o as containerRpcRequest, r as signalRpcRequest$1, s as streamContainerEvents } from "./client-B3C0ciqU.js";
2
2
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
3
3
  //#region extensions/signal/src/client-adapter.ts
4
4
  /**
@@ -1,7 +1,7 @@
1
1
  import { createChannelConfigUiHints } from "openclaw/plugin-sdk/channel-core";
2
2
  import { isRecord, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
3
3
  import { DEFAULT_ACCOUNT_ID, normalizeAccountId, resolveAccountEntry } from "openclaw/plugin-sdk/account-resolution";
4
- import { ChannelDeliveryStreamingConfigSchema, ChannelSendReadReceiptsSchema, ExecutableTokenSchema, ReplyToModeSchema, buildChannelAccountSchemaParts, buildChannelConfigSchema, buildChannelReactionShape, buildGroupEntrySchema, requireAllowlistAllowFrom, requireOpenAllowFrom } from "openclaw/plugin-sdk/channel-config-schema";
4
+ import { ChannelDeliveryStreamingConfigSchema, ChannelSendReadReceiptsSchema, ExecutableTokenSchema, ReplyToModeSchema, buildChannelAccountSchemaParts, buildChannelConfigSchema, buildChannelReactionShape, buildGroupEntrySchema, refineChannelDmPolicy } from "openclaw/plugin-sdk/channel-config-schema";
5
5
  import { z } from "zod";
6
6
  //#region extensions/signal/src/config-ui-hints.ts
7
7
  const signalChannelConfigUiHints = {
@@ -142,45 +142,18 @@ const SignalConfigSchemaBase = SignalAccountSchemaBase.extend({
142
142
  defaultAccount: z.string().optional()
143
143
  });
144
144
  function validateSignalConfigAllowFrom(value, ctx) {
145
- requireOpenAllowFrom({
146
- policy: value.dmPolicy,
147
- allowFrom: value.allowFrom,
148
- ctx,
149
- path: ["allowFrom"],
150
- message: "channels.signal.dmPolicy=\"open\" requires channels.signal.allowFrom to include \"*\""
151
- });
152
- requireAllowlistAllowFrom({
153
- policy: value.dmPolicy,
154
- allowFrom: value.allowFrom,
155
- ctx,
156
- path: ["allowFrom"],
157
- message: "channels.signal.dmPolicy=\"allowlist\" requires channels.signal.allowFrom to contain at least one sender ID"
145
+ refineChannelDmPolicy({
146
+ channelId: "signal",
147
+ value,
148
+ ctx
158
149
  });
159
150
  for (const [accountId, account] of Object.entries(value.accounts ?? {})) {
160
151
  if (!account) continue;
161
- const effectivePolicy = account.dmPolicy ?? value.dmPolicy;
162
- const effectiveAllowFrom = account.allowFrom ?? value.allowFrom;
163
- requireOpenAllowFrom({
164
- policy: effectivePolicy,
165
- allowFrom: effectiveAllowFrom,
166
- ctx,
167
- path: [
168
- "accounts",
169
- accountId,
170
- "allowFrom"
171
- ],
172
- message: "channels.signal.accounts.*.dmPolicy=\"open\" requires channels.signal.accounts.*.allowFrom (or channels.signal.allowFrom) to include \"*\""
173
- });
174
- requireAllowlistAllowFrom({
175
- policy: effectivePolicy,
176
- allowFrom: effectiveAllowFrom,
177
- ctx,
178
- path: [
179
- "accounts",
180
- accountId,
181
- "allowFrom"
182
- ],
183
- message: "channels.signal.accounts.*.dmPolicy=\"allowlist\" requires channels.signal.accounts.*.allowFrom (or channels.signal.allowFrom) to contain at least one sender ID"
152
+ refineChannelDmPolicy({
153
+ channelId: "signal",
154
+ value,
155
+ accountId,
156
+ ctx
184
157
  });
185
158
  }
186
159
  }
@@ -1,4 +1,4 @@
1
1
  import { n as normalizeSignalMessagingTarget, r as normalizeSignalReactionRecipient, t as looksLikeSignalTargetId } from "./normalize-l_b99hap.js";
2
2
  import { i as isSignalSenderAllowed } from "./identity-YXPmgFMu.js";
3
- import { a as installSignalCliFromRelease, i as installSignalCli, n as downloadToFile, o as looksLikeArchive, r as extractSignalCliArchive, s as pickAsset, t as MAX_SIGNAL_CLI_EXTRACTED_BYTES } from "./install-signal-cli-7tEL37_j.js";
3
+ import { a as installSignalCliFromRelease, i as installSignalCli, n as downloadToFile, o as looksLikeArchive, r as extractSignalCliArchive, s as pickAsset, t as MAX_SIGNAL_CLI_EXTRACTED_BYTES } from "./install-signal-cli-QlEIfWBv.js";
4
4
  export { MAX_SIGNAL_CLI_EXTRACTED_BYTES, downloadToFile, extractSignalCliArchive, installSignalCli, installSignalCliFromRelease, isSignalSenderAllowed, looksLikeArchive, looksLikeSignalTargetId, normalizeSignalMessagingTarget, normalizeSignalReactionRecipient, pickAsset };
@@ -293,76 +293,7 @@ function hasContainerTransportWithoutEffectiveAccount(cfg) {
293
293
  }
294
294
  return false;
295
295
  }
296
- async function migrateLegacySignalTransportConfig(params) {
297
- const signal = params.cfg.channels?.signal;
298
- if (!isRecord(signal)) return {
299
- config: params.cfg,
300
- changes: []
301
- };
302
- const accounts = isRecord(signal.accounts) ? signal.accounts : {};
303
- if (!(Object.hasOwn(signal, "apiMode") || hasLegacyFields(signal) || Object.values(accounts).some((entry) => isRecord(entry) && hasLegacyFields(entry)))) return {
304
- config: params.cfg,
305
- changes: []
306
- };
307
- const apiMode = signal.apiMode;
308
- const entries = [signal, ...Object.values(accounts).filter(isRecord)];
309
- const legacyResolutionEntries = entries.filter((_, index) => shouldMaterializeTransport(entries, index)).filter((entry) => !isSignalTransportConfig(entry.transport));
310
- const invalidDerivedEndpoint = findInvalidLegacyDerivedEndpoint(legacyResolutionEntries, signal);
311
- if (invalidDerivedEndpoint) return {
312
- config: params.cfg,
313
- changes: [],
314
- warnings: [invalidDerivedEndpoint === "port" ? PENDING_LEGACY_INVALID_PORT_WARNING : PENDING_LEGACY_INVALID_HOST_WARNING]
315
- };
316
- if (hasInvalidLegacyHttpUrl(legacyResolutionEntries, signal)) return {
317
- config: params.cfg,
318
- changes: [],
319
- warnings: [PENDING_LEGACY_INVALID_URL_WARNING]
320
- };
321
- if (!params.detect && legacyResolutionEntries.some((entry) => requiresDetection(entry, signal, apiMode))) return {
322
- config: params.cfg,
323
- changes: [],
324
- warnings: [PENDING_LEGACY_TRANSPORT_WARNING]
325
- };
326
- const resolvedTransports = await Promise.all(entries.map(async (entry, index) => !shouldMaterializeTransport(entries, index) ? void 0 : await resolveLegacyTransport({
327
- entry,
328
- parent: signal,
329
- apiMode,
330
- detect: params.detect
331
- })));
332
- if (hasInvalidManagedTransportPort(resolvedTransports)) return {
333
- config: params.cfg,
334
- changes: [],
335
- warnings: [PENDING_LEGACY_INVALID_PORT_WARNING]
336
- };
337
- const transports = allocateMigratedManagedPorts({
338
- entries,
339
- transports: resolvedTransports
340
- });
341
- if (transports.some((transport, index) => shouldMaterializeTransport(entries, index) && !transport)) return {
342
- config: params.cfg,
343
- changes: [],
344
- warnings: [PENDING_LEGACY_TRANSPORT_WARNING]
345
- };
346
- const next = applyMigratedSignalTransports({
347
- cfg: params.cfg,
348
- entries,
349
- transports
350
- });
351
- if (!next) return {
352
- config: params.cfg,
353
- changes: []
354
- };
355
- if (hasContainerTransportWithoutEffectiveAccount(next)) return {
356
- config: params.cfg,
357
- changes: [],
358
- warnings: [PENDING_LEGACY_CONTAINER_ACCOUNT_WARNING]
359
- };
360
- return {
361
- config: next,
362
- changes: ["Migrated channels.signal transport settings to concrete account-owned transport objects."]
363
- };
364
- }
365
- function migrateLegacySignalTransportConfigSync(cfg) {
296
+ function prepareLegacySignalTransportMigration(cfg) {
366
297
  const signal = cfg.channels?.signal;
367
298
  if (!isRecord(signal)) return {
368
299
  config: cfg,
@@ -373,6 +304,7 @@ function migrateLegacySignalTransportConfigSync(cfg) {
373
304
  config: cfg,
374
305
  changes: []
375
306
  };
307
+ const apiMode = signal.apiMode;
376
308
  const entries = [signal, ...Object.values(accounts).filter(isRecord)];
377
309
  const legacyResolutionEntries = entries.filter((_, index) => shouldMaterializeTransport(entries, index)).filter((entry) => !isSignalTransportConfig(entry.transport));
378
310
  const invalidDerivedEndpoint = findInvalidLegacyDerivedEndpoint(legacyResolutionEntries, signal);
@@ -386,14 +318,14 @@ function migrateLegacySignalTransportConfigSync(cfg) {
386
318
  changes: [],
387
319
  warnings: [PENDING_LEGACY_INVALID_URL_WARNING]
388
320
  };
389
- const resolvedTransports = entries.map((entry, index) => {
390
- if (!shouldMaterializeTransport(entries, index)) return;
391
- return resolveLegacyTransportWithoutDetection({
392
- entry,
393
- parent: signal,
394
- apiMode: signal.apiMode
395
- });
396
- });
321
+ return {
322
+ signal,
323
+ apiMode,
324
+ entries,
325
+ legacyResolutionEntries
326
+ };
327
+ }
328
+ function finishLegacySignalTransportMigration(cfg, entries, resolvedTransports) {
397
329
  if (hasInvalidManagedTransportPort(resolvedTransports)) return {
398
330
  config: cfg,
399
331
  changes: [],
@@ -427,6 +359,36 @@ function migrateLegacySignalTransportConfigSync(cfg) {
427
359
  changes: ["Migrated channels.signal transport settings to concrete account-owned transport objects."]
428
360
  };
429
361
  }
362
+ async function migrateLegacySignalTransportConfig(params) {
363
+ const prepared = prepareLegacySignalTransportMigration(params.cfg);
364
+ if ("config" in prepared) return prepared;
365
+ const { signal, apiMode, entries, legacyResolutionEntries } = prepared;
366
+ if (!params.detect && legacyResolutionEntries.some((entry) => requiresDetection(entry, signal, apiMode))) return {
367
+ config: params.cfg,
368
+ changes: [],
369
+ warnings: [PENDING_LEGACY_TRANSPORT_WARNING]
370
+ };
371
+ const resolvedTransports = await Promise.all(entries.map(async (entry, index) => !shouldMaterializeTransport(entries, index) ? void 0 : await resolveLegacyTransport({
372
+ entry,
373
+ parent: signal,
374
+ apiMode,
375
+ detect: params.detect
376
+ })));
377
+ return finishLegacySignalTransportMigration(params.cfg, entries, resolvedTransports);
378
+ }
379
+ function migrateLegacySignalTransportConfigSync(cfg) {
380
+ const prepared = prepareLegacySignalTransportMigration(cfg);
381
+ if ("config" in prepared) return prepared;
382
+ const { signal, apiMode, entries } = prepared;
383
+ return finishLegacySignalTransportMigration(cfg, entries, entries.map((entry, index) => {
384
+ if (!shouldMaterializeTransport(entries, index)) return;
385
+ return resolveLegacyTransportWithoutDetection({
386
+ entry,
387
+ parent: signal,
388
+ apiMode
389
+ });
390
+ }));
391
+ }
430
392
  //#endregion
431
393
  //#region extensions/signal/config-doctor-api.ts
432
394
  const RETIRED_SIGNAL_ACCOUNT_TRANSPORT_FIELDS = [
@@ -1,2 +1,2 @@
1
- import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./doctor-contract-api-C18u1hW0.js";
1
+ import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./doctor-contract-api-D0SnglP4.js";
2
2
  export { legacyConfigRules, normalizeCompatibilityConfig };
@@ -1,32 +1,32 @@
1
- import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
1
+ import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
2
  import { l as normalizeSignalTransportHost } from "./transport-policy-DxvSMHp9.js";
3
3
  import { i as resolveSignalAccount, o as resolveSignalReplyToMode } from "./accounts-DO4HMqaK.js";
4
4
  import { n as normalizeSignalMessagingTarget } from "./normalize-l_b99hap.js";
5
5
  import { a as normalizeSignalAllowRecipient, c as resolveSignalSender, i as isSignalSenderAllowed, l as looksLikeUuid, n as formatSignalSenderDisplay, o as resolveSignalPeerId, r as formatSignalSenderId, s as resolveSignalRecipient, t as formatSignalPairingIdLine } from "./identity-YXPmgFMu.js";
6
- import { c as resolveSignalReactionLevel, f as isSignalNativeApprovalHandlerConfigured, i as getOptionalSignalRuntime, l as formatSignalMediaText, n as registerSignalReplyContext, o as materializeSignalPresentationFallback } from "./transport-detection-CbPFIo0i.js";
7
- import { t as SignalSseRejectionError } from "./client-BmpTN7R3.js";
8
- import { n as signalRpcRequest, r as streamSignalEvents, t as signalCheck } from "./client-adapter-CDyW9LrQ.js";
9
- import { n as sendReactionSignal } from "./reaction-runtime-api-7FQFT_qb.js";
10
- import { i as maybeResolveSignalApprovalReaction, o as registerSignalApprovalReactionTargetForDeliveredPayload, s as resolveSignalApprovalConversationKey, t as addSignalApprovalReactionHintToStructuredPayload } from "./approval-reactions-Cno-4mmH.js";
11
- import { r as registerSignalQuestionReactionTargetForDeliveredPayload, t as maybeResolveSignalQuestionReaction } from "./question-reactions-DJfSmeYo.js";
12
- import { n as sendReadReceiptSignal, r as sendTypingSignal, t as sendMessageSignal } from "./send-DF4T9tXZ.js";
6
+ import { c as resolveSignalReactionLevel, f as isSignalNativeApprovalHandlerConfigured, i as getOptionalSignalRuntime, l as formatSignalMediaText, n as registerSignalReplyContext, o as materializeSignalPresentationFallback } from "./transport-detection-BD__qywn.js";
7
+ import { t as SignalSseRejectionError } from "./client-B3C0ciqU.js";
8
+ import { n as signalRpcRequest, r as streamSignalEvents, t as signalCheck } from "./client-adapter-CNc5wzzs.js";
9
+ import { n as sendReactionSignal } from "./reaction-runtime-api-CWqDv5-q.js";
10
+ import { i as maybeResolveSignalApprovalReaction, o as registerSignalApprovalReactionTargetForDeliveredPayload, s as resolveSignalApprovalConversationKey, t as addSignalApprovalReactionHintToStructuredPayload } from "./approval-reactions-Cub0slPC.js";
11
+ import { r as registerSignalQuestionReactionTargetForDeliveredPayload, t as maybeResolveSignalQuestionReaction } from "./question-reactions-B06vyt3T.js";
12
+ import { n as sendReadReceiptSignal, r as sendTypingSignal, t as sendMessageSignal } from "./send-BvWSfyNf.js";
13
13
  import { bindIngressLifecycleToReplyOptions, createChannelIngressError, createChannelIngressMonitor, createChannelMessageReplyPipeline, resolveChannelStreamingBlockEnabled } from "openclaw/plugin-sdk/channel-outbound";
14
14
  import { createChannelPairingChallengeIssuer } from "openclaw/plugin-sdk/channel-pairing";
15
15
  import { resolveAgentRoute, resolveInboundLastRouteSessionKey } from "openclaw/plugin-sdk/routing";
16
16
  import { asPositiveSafeInteger, isRecord, normalizeNullableString, normalizeOptionalString, normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
17
17
  import { CHANNEL_APPROVAL_NATIVE_RUNTIME_CONTEXT_CAPABILITY } from "openclaw/plugin-sdk/approval-handler-adapter-runtime";
18
18
  import { normalizeE164, truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
19
- import { buildChannelInboundEventContext, buildMentionRegexes, createChannelInboundDebouncer, filterChannelInboundQuoteContext, formatInboundEnvelope, formatInboundFromLabel, formatInboundMediaUnavailableText, hasVisibleInboundReplyDispatch, logInboundDrop, matchesMentionPatterns, readAgentRunTerminalOutcome, resolveEnvelopeFormatOptions, resolveInboundMentionDecision, resolveInboundSupplementalSenderAllowed, runChannelInboundEvent, shouldDebounceTextInbound, toHistoryMediaEntries, toInboundMediaFactsWithMetadata } from "openclaw/plugin-sdk/channel-inbound";
19
+ import { buildChannelInboundEventContext, buildMentionRegexes, createChannelInboundDebouncer, filterChannelInboundQuoteContext, formatInboundEnvelope, formatInboundFromLabel, formatInboundMediaUnavailableText, hasVisibleInboundReplyDispatch, logInboundDrop, matchesMentionPatterns, readAgentRunTerminalOutcome, resolveEnvelopeFormatOptions, resolveInboundDebounceMs, resolveInboundMentionDecision, resolveInboundSupplementalSenderAllowed, runChannelInboundEvent, shouldDebounceTextInbound, toHistoryMediaEntries, toInboundMediaFactsWithMetadata } from "openclaw/plugin-sdk/channel-inbound";
20
20
  import { canonicalizeBase64, detectMime, estimateBase64DecodedBytes, kindFromMime, saveMediaBuffer } from "openclaw/plugin-sdk/media-runtime";
21
21
  import { collectErrorGraphCandidates, formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
22
22
  import { ensurePortAvailable, extractErrorCode, formatErrorMessage as formatErrorMessage$1, resolvePinnedMainDmOwnerFromAllowlist } from "openclaw/plugin-sdk/security-runtime";
23
- import { resolveChannelGroupPolicy, resolveChannelGroupRequireMention } from "openclaw/plugin-sdk/channel-policy";
24
23
  import path from "node:path";
24
+ import { resolveChannelGroupPolicy, resolveChannelGroupRequireMention, resolveChannelGroups, resolveChannelGroupsConfigPath } from "openclaw/plugin-sdk/channel-policy";
25
25
  import { registerChannelRuntimeContext } from "openclaw/plugin-sdk/channel-runtime-context";
26
26
  import { DEFAULT_GROUP_HISTORY_LIMIT, createChannelHistoryWindow } from "openclaw/plugin-sdk/reply-history";
27
27
  import { deliverTextOrMediaReply, resolveSendableOutboundReplyParts } from "openclaw/plugin-sdk/reply-payload";
28
28
  import { chunkTextWithMode, createReplyReferencePlanner, resolveChunkMode, resolveTextChunkLimit } from "openclaw/plugin-sdk/reply-runtime";
29
- import { getRuntimeConfig } from "openclaw/plugin-sdk/runtime-config-snapshot";
29
+ import { createRuntimeConfigReader, getRuntimeConfig } from "openclaw/plugin-sdk/runtime-config-snapshot";
30
30
  import { computeBackoff, createNonExitingRuntime, danger, logVerbose, shouldLogVerbose, sleepWithAbort } from "openclaw/plugin-sdk/runtime-env";
31
31
  import { resolveAllowlistProviderRuntimeGroupPolicy, resolveDefaultGroupPolicy, warnMissingProviderGroupPolicyFallbackOnce } from "openclaw/plugin-sdk/runtime-group-policy";
32
32
  import { waitForTransportReady } from "openclaw/plugin-sdk/transport-ready-runtime";
@@ -676,9 +676,17 @@ async function finalizeSignalStatusReaction(params) {
676
676
  await params.controller.restoreInitial();
677
677
  }
678
678
  function createSignalEventHandler(deps) {
679
+ const readConfig = createRuntimeConfigReader(deps.cfg);
680
+ const groupsConfigPath = resolveChannelGroupsConfigPath({
681
+ cfg: deps.cfg,
682
+ channel: "signal",
683
+ accountId: deps.accountId,
684
+ groups: resolveChannelGroups(deps.cfg, "signal", deps.accountId)
685
+ });
679
686
  const statusReactionTiming = deps.statusReactionTiming ?? DEFAULT_TIMING;
680
687
  const activeEnqueueEntries = /* @__PURE__ */ new WeakSet();
681
688
  async function handleSignalInboundMessage(entry) {
689
+ const { cfg } = entry;
682
690
  const fromLabel = formatInboundFromLabel({
683
691
  isGroup: entry.isGroup,
684
692
  groupLabel: entry.groupName ?? void 0,
@@ -688,14 +696,14 @@ function createSignalEventHandler(deps) {
688
696
  directId: entry.senderDisplay
689
697
  });
690
698
  const route = resolveSignalInboundRoute({
691
- cfg: deps.cfg,
699
+ cfg,
692
700
  accountId: deps.accountId,
693
701
  isGroup: entry.isGroup,
694
702
  groupId: entry.groupId,
695
703
  senderPeerId: entry.senderPeerId
696
704
  });
697
- const storePath = resolveStorePath(deps.cfg.session?.store, { agentId: route.agentId });
698
- const envelopeOptions = resolveEnvelopeFormatOptions(deps.cfg);
705
+ const storePath = resolveStorePath(cfg.session?.store, { agentId: route.agentId });
706
+ const envelopeOptions = resolveEnvelopeFormatOptions(cfg);
699
707
  const previousTimestamp = readSessionUpdatedAt({
700
708
  storePath,
701
709
  sessionKey: route.sessionKey
@@ -736,7 +744,7 @@ function createSignalEventHandler(deps) {
736
744
  limit: deps.historyLimit
737
745
  }) : void 0;
738
746
  const replyToMode = resolveSignalReplyToMode({
739
- cfg: deps.cfg,
747
+ cfg,
740
748
  accountId: deps.accountId,
741
749
  chatType: entry.isGroup ? "group" : "direct"
742
750
  });
@@ -798,17 +806,17 @@ function createSignalEventHandler(deps) {
798
806
  logVerbose(`signal inbound: from=${ctxPayload.From} len=${body.length} preview="${preview}"`);
799
807
  }
800
808
  const statusReactionTimestamp = resolveSignalStatusReactionTimestamp(entry);
801
- const statusReactionsConfig = deps.cfg.messages?.statusReactions;
809
+ const statusReactionsConfig = cfg.messages?.statusReactions;
802
810
  const signalReactionLevel = resolveSignalReactionLevel({
803
- cfg: deps.cfg,
811
+ cfg,
804
812
  accountId: route.accountId
805
813
  });
806
- const ackReaction = resolveAckReaction(deps.cfg, route.agentId, {
814
+ const ackReaction = resolveAckReaction(cfg, route.agentId, {
807
815
  channel: "signal",
808
816
  accountId: route.accountId
809
817
  });
810
818
  const shouldSendStatusReaction = Boolean(ackReaction && shouldAckReaction({
811
- scope: deps.cfg.messages?.ackReactionScope,
819
+ scope: cfg.messages?.ackReactionScope,
812
820
  isDirect: !entry.isGroup,
813
821
  isGroup: entry.isGroup,
814
822
  isMentionableGroup: entry.isGroup,
@@ -817,7 +825,7 @@ function createSignalEventHandler(deps) {
817
825
  }));
818
826
  const statusReactionTarget = `${entry.groupId ?? entry.senderRecipient}/${statusReactionTimestamp ?? "unknown"}`;
819
827
  const signalReactionOpts = {
820
- cfg: deps.cfg,
828
+ cfg,
821
829
  ...deps.baseUrl ? { baseUrl: deps.baseUrl } : {},
822
830
  ...deps.account ? { account: deps.account } : {},
823
831
  ...deps.accountId ? { accountId: deps.accountId } : {},
@@ -846,7 +854,7 @@ function createSignalEventHandler(deps) {
846
854
  }) : null;
847
855
  if (statusReactionController) statusReactionController.setQueued();
848
856
  const { onModelSelected, typingCallbacks, ...replyPipeline } = createChannelMessageReplyPipeline({
849
- cfg: deps.cfg,
857
+ cfg,
850
858
  agentId: route.agentId,
851
859
  channel: "signal",
852
860
  accountId: route.accountId,
@@ -854,7 +862,7 @@ function createSignalEventHandler(deps) {
854
862
  start: async () => {
855
863
  if (!ctxPayload.To) return;
856
864
  await sendTypingSignal(ctxPayload.To, {
857
- cfg: deps.cfg,
865
+ cfg,
858
866
  baseUrl: deps.baseUrl,
859
867
  account: deps.account,
860
868
  accountId: deps.accountId
@@ -880,13 +888,13 @@ function createSignalEventHandler(deps) {
880
888
  const dispatcherOptions = {
881
889
  ...replyPipeline,
882
890
  propagateRetryableNoSendFailure: true,
883
- humanDelay: resolveHumanDelayConfig(deps.cfg, route.agentId),
891
+ humanDelay: resolveHumanDelayConfig(cfg, route.agentId),
884
892
  typingCallbacks
885
893
  };
886
894
  const delivery = {
887
895
  deliver: async (payload, _info) => {
888
896
  await deps.deliverReplies({
889
- cfg: deps.cfg,
897
+ cfg,
890
898
  replies: [payload],
891
899
  target: ctxPayload.To,
892
900
  baseUrl: deps.baseUrl,
@@ -946,7 +954,7 @@ function createSignalEventHandler(deps) {
946
954
  raw: entry
947
955
  }),
948
956
  resolveTurn: () => ({
949
- cfg: deps.cfg,
957
+ cfg,
950
958
  channel: "signal",
951
959
  accountId: route.accountId,
952
960
  route: {
@@ -964,7 +972,7 @@ function createSignalEventHandler(deps) {
964
972
  mainDmOwnerPin: (() => {
965
973
  if (inboundLastRouteSessionKey !== route.mainSessionKey) return;
966
974
  const pinnedOwner = resolvePinnedMainDmOwnerFromAllowlist({
967
- dmScope: deps.cfg.session?.dmScope,
975
+ dmScope: cfg.session?.dmScope,
968
976
  allowFrom: deps.allowFrom,
969
977
  normalizeEntry: normalizeSignalAllowRecipient
970
978
  });
@@ -1072,7 +1080,7 @@ function createSignalEventHandler(deps) {
1072
1080
  async function resolveSignalBatchChannelIngress(entries, last) {
1073
1081
  if (last.boundChannelIngress) return last.boundChannelIngress;
1074
1082
  const route = resolveSignalInboundRoute({
1075
- cfg: deps.cfg,
1083
+ cfg: last.cfg,
1076
1084
  accountId: deps.accountId,
1077
1085
  isGroup: last.isGroup,
1078
1086
  groupId: last.groupId,
@@ -1152,6 +1160,10 @@ function createSignalEventHandler(deps) {
1152
1160
  const { debouncer } = createChannelInboundDebouncer({
1153
1161
  cfg: deps.cfg,
1154
1162
  channel: "signal",
1163
+ resolveDebounceMs: (entry) => resolveInboundDebounceMs({
1164
+ cfg: entry.cfg,
1165
+ channel: "signal"
1166
+ }),
1155
1167
  buildKey: (entry) => resolveSignalInboundDebounceKey(deps.accountId, entry),
1156
1168
  shouldDebounce: (entry) => shouldDebounceTextInbound({
1157
1169
  text: entry.commandBody,
@@ -1183,7 +1195,7 @@ function createSignalEventHandler(deps) {
1183
1195
  const messageId = params.reaction.targetSentTimestamp ? String(params.reaction.targetSentTimestamp) : "unknown";
1184
1196
  const conversationKey = resolveSignalApprovalConversationKey(groupId ? `group:${groupId}` : `signal:${resolveSignalRecipient(params.sender)}`);
1185
1197
  if (conversationKey && await maybeResolveSignalApprovalReaction({
1186
- cfg: deps.cfg,
1198
+ cfg: params.cfg,
1187
1199
  accountId: deps.accountId,
1188
1200
  conversationKey,
1189
1201
  messageId,
@@ -1198,7 +1210,7 @@ function createSignalEventHandler(deps) {
1198
1210
  return true;
1199
1211
  }
1200
1212
  if (conversationKey && await maybeResolveSignalQuestionReaction({
1201
- cfg: deps.cfg,
1213
+ cfg: params.cfg,
1202
1214
  accountId: deps.accountId,
1203
1215
  conversationKey,
1204
1216
  messageId,
@@ -1220,7 +1232,7 @@ function createSignalEventHandler(deps) {
1220
1232
  })) return true;
1221
1233
  const senderPeerId = resolveSignalPeerId(params.sender);
1222
1234
  const route = resolveSignalInboundRoute({
1223
- cfg: deps.cfg,
1235
+ cfg: params.cfg,
1224
1236
  accountId: deps.accountId,
1225
1237
  isGroup,
1226
1238
  groupId,
@@ -1251,6 +1263,7 @@ function createSignalEventHandler(deps) {
1251
1263
  }
1252
1264
  return async (event, turnAdoptionLifecycle, preparedPayload) => {
1253
1265
  if (event.event !== "receive" || !event.data) return;
1266
+ const cfg = readConfig();
1254
1267
  let payload = preparedPayload ?? null;
1255
1268
  if (!preparedPayload) try {
1256
1269
  payload = JSON.parse(event.data);
@@ -1272,7 +1285,7 @@ function createSignalEventHandler(deps) {
1272
1285
  const messageText = renderSignalMentions(rawMessage, dataMessage?.mentions).trim();
1273
1286
  const groupId = dataMessage?.groupInfo?.groupId ?? reaction?.groupInfo?.groupId ?? void 0;
1274
1287
  const isGroup = Boolean(groupId);
1275
- const hasControlCommandInMessage = isControlCommandMessage(messageText, deps.cfg);
1288
+ const hasControlCommandInMessage = isControlCommandMessage(messageText, cfg);
1276
1289
  const senderDisplay = formatSignalSenderDisplay(sender);
1277
1290
  const resolveChannelIngress = async (contextBinding) => await resolveSignalAccessState({
1278
1291
  accountId: deps.accountId,
@@ -1283,14 +1296,14 @@ function createSignalEventHandler(deps) {
1283
1296
  sender,
1284
1297
  groupId,
1285
1298
  isGroup,
1286
- cfg: deps.cfg,
1299
+ cfg,
1287
1300
  hasControlCommand: hasControlCommandInMessage,
1288
1301
  contextBinding
1289
1302
  });
1290
1303
  const { senderAccess, commandAccess } = await resolveChannelIngress();
1291
1304
  const quoteText = normalizeOptionalString(dataMessage?.quote?.text) ?? "";
1292
1305
  const { contextVisibilityMode, quoteSenderAllowed, visibleQuoteText, visibleQuoteSender } = resolveSignalQuoteContext({
1293
- cfg: deps.cfg,
1306
+ cfg,
1294
1307
  accountId: deps.accountId,
1295
1308
  isGroup,
1296
1309
  dataMessage,
@@ -1299,6 +1312,7 @@ function createSignalEventHandler(deps) {
1299
1312
  if (quoteText && !visibleQuoteText && isGroup) logVerbose(`signal: drop quote context (mode=${contextVisibilityMode}, sender_allowed=${quoteSenderAllowed ? "yes" : "no"})`);
1300
1313
  const hasBodyContent = Boolean(messageText || visibleQuoteText) || Boolean(!reaction && dataMessage?.attachments?.length);
1301
1314
  if (reaction && await handleReactionOnlyInbound({
1315
+ cfg,
1302
1316
  envelope,
1303
1317
  sender,
1304
1318
  senderDisplay,
@@ -1324,7 +1338,7 @@ function createSignalEventHandler(deps) {
1324
1338
  accountId: deps.accountId,
1325
1339
  sendPairingReply: async (text) => {
1326
1340
  await sendMessageSignal(`signal:${senderRecipient}`, text, {
1327
- cfg: deps.cfg,
1341
+ cfg,
1328
1342
  baseUrl: deps.baseUrl,
1329
1343
  account: deps.account,
1330
1344
  maxBytes: deps.mediaMaxBytes,
@@ -1353,7 +1367,7 @@ function createSignalEventHandler(deps) {
1353
1367
  return;
1354
1368
  }
1355
1369
  const route = resolveSignalInboundRoute({
1356
- cfg: deps.cfg,
1370
+ cfg,
1357
1371
  accountId: deps.accountId,
1358
1372
  isGroup,
1359
1373
  groupId,
@@ -1365,12 +1379,12 @@ function createSignalEventHandler(deps) {
1365
1379
  const replyToId = typeof nativeReplyTargetTimestamp === "number" ? String(nativeReplyTargetTimestamp) : void 0;
1366
1380
  const signalToRaw = isGroup ? `group:${groupId}` : `signal:${senderRecipient}`;
1367
1381
  const signalTo = normalizeSignalMessagingTarget(signalToRaw) ?? signalToRaw;
1368
- const mentionRegexes = buildMentionRegexes(deps.cfg, route.agentId);
1382
+ const mentionRegexes = buildMentionRegexes(cfg, route.agentId);
1369
1383
  const textWasMentioned = isGroup && matchesMentionPatterns(messageText, mentionRegexes);
1370
1384
  const nativeMentionFacts = resolveSignalMentionFacts(deps, rawMessage, dataMessage?.mentions);
1371
1385
  const wasMentioned = isGroup && (textWasMentioned || nativeMentionFacts.mentionsBot);
1372
1386
  const requireMention = isGroup && resolveChannelGroupRequireMention({
1373
- cfg: deps.cfg,
1387
+ cfg,
1374
1388
  channel: "signal",
1375
1389
  groupId,
1376
1390
  accountId: deps.accountId,
@@ -1395,10 +1409,12 @@ function createSignalEventHandler(deps) {
1395
1409
  const effectiveWasMentioned = mentionDecision.effectiveWasMentioned;
1396
1410
  if (isGroup && requireMention && canDetectMention && mentionDecision.shouldSkip) {
1397
1411
  logInboundDrop({
1398
- log: logVerbose,
1412
+ log: deps.runtime.log,
1399
1413
  channel: "signal",
1400
1414
  reason: "no mention",
1401
- target: senderDisplay
1415
+ target: groupId,
1416
+ onceKey: JSON.stringify([deps.accountId, groupId]),
1417
+ hint: `Mention patterns can be derived from the agent identity name. Set ${groupsConfigPath}[${JSON.stringify(groupId)}].requireMention=false to process messages without a mention. Preserve existing groups entries; when adding the first groups map, include "*": {} to keep other chats admitted.`
1402
1418
  });
1403
1419
  const pendingMedia = (dataMessage.attachments ?? []).map((attachment) => {
1404
1420
  const contentType = attachment?.contentType ?? void 0;
@@ -1431,32 +1447,29 @@ function createSignalEventHandler(deps) {
1431
1447
  sourceTimestamp: inboundTimestamp
1432
1448
  });
1433
1449
  const signalGroupPolicy = resolveChannelGroupPolicy({
1434
- cfg: deps.cfg,
1450
+ cfg,
1435
1451
  channel: "signal",
1436
1452
  groupId,
1437
1453
  accountId: deps.accountId
1438
1454
  });
1439
- if ((signalGroupPolicy.groupConfig?.ingest ?? signalGroupPolicy.defaultConfig?.ingest) === true) {
1440
- const canonicalGroupTarget = normalizeSignalMessagingTarget(`group:${groupId}`) ?? `group:${groupId}`;
1441
- fireAndForgetHook(triggerInternalHook(createInternalHookEvent("message", "received", route.sessionKey, toInternalMessageReceivedContext({
1442
- from: `group:${groupId}`,
1443
- to: canonicalGroupTarget,
1444
- content: pendingBodyText,
1445
- timestamp: envelope.timestamp ?? void 0,
1446
- channelId: "signal",
1447
- accountId: deps.accountId,
1448
- conversationId: canonicalGroupTarget,
1449
- messageId: typeof envelope.timestamp === "number" ? String(envelope.timestamp) : void 0,
1450
- senderId: senderDisplay,
1451
- senderName: envelope.sourceName ?? void 0,
1452
- provider: "signal",
1453
- surface: "signal",
1454
- originatingChannel: "signal",
1455
- originatingTo: canonicalGroupTarget,
1456
- isGroup: true,
1457
- groupId: canonicalGroupTarget
1458
- }))), "signal: mention-skip message hook failed");
1459
- }
1455
+ if ((signalGroupPolicy.groupConfig?.ingest ?? signalGroupPolicy.defaultConfig?.ingest) === true) fireAndForgetHook(triggerInternalHook(createInternalHookEvent("message", "received", route.sessionKey, toInternalMessageReceivedContext({
1456
+ from: `group:${groupId}`,
1457
+ to: signalTo,
1458
+ content: pendingBodyText,
1459
+ timestamp: envelope.timestamp ?? void 0,
1460
+ channelId: "signal",
1461
+ accountId: deps.accountId,
1462
+ conversationId: signalTo,
1463
+ messageId: typeof envelope.timestamp === "number" ? String(envelope.timestamp) : void 0,
1464
+ senderId: senderDisplay,
1465
+ senderName: envelope.sourceName ?? void 0,
1466
+ provider: "signal",
1467
+ surface: "signal",
1468
+ originatingChannel: "signal",
1469
+ originatingTo: signalTo,
1470
+ isGroup: true,
1471
+ groupId: signalTo
1472
+ }))), "signal: mention-skip message hook failed");
1460
1473
  return;
1461
1474
  }
1462
1475
  const attachments = dataMessage.attachments ?? [];
@@ -1507,7 +1520,7 @@ function createSignalEventHandler(deps) {
1507
1520
  if (!bodyText && mediaFacts.length === 0 && !visibleQuoteText) return;
1508
1521
  if (deps.sendReadReceipts && !deps.readReceiptsViaDaemon && !isGroup && inboundTimestamp) try {
1509
1522
  await sendReadReceiptSignal(`signal:${senderRecipient}`, inboundTimestamp, {
1510
- cfg: deps.cfg,
1523
+ cfg,
1511
1524
  baseUrl: deps.baseUrl,
1512
1525
  account: deps.account,
1513
1526
  accountId: deps.accountId
@@ -1527,6 +1540,7 @@ function createSignalEventHandler(deps) {
1527
1540
  sourceTimestamp: inboundTimestamp
1528
1541
  });
1529
1542
  const entry = {
1543
+ cfg,
1530
1544
  senderName,
1531
1545
  senderDisplay,
1532
1546
  senderRecipient,
@@ -1,6 +1,6 @@
1
- import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
2
- import { t as detectSignalTransport } from "./transport-detection-CbPFIo0i.js";
3
- import { n as signalRpcRequest, t as signalCheck } from "./client-adapter-CDyW9LrQ.js";
1
+ import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
+ import { t as detectSignalTransport } from "./transport-detection-BD__qywn.js";
3
+ import { n as signalRpcRequest, t as signalCheck } from "./client-adapter-CNc5wzzs.js";
4
4
  import { runChannelProbe } from "openclaw/plugin-sdk/text-utility-runtime";
5
5
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
6
6
  //#region extensions/signal/src/probe.ts
@@ -1,6 +1,6 @@
1
- import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
2
- import { i as resolveSignalTarget } from "./approval-auth-CkljhI65.js";
3
- import { c as resolveSignalApprovalTargetAuthorKeys, s as resolveSignalApprovalConversationKey } from "./approval-reactions-Cno-4mmH.js";
1
+ import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
+ import { i as resolveSignalDeliveredConversationKey } from "./approval-auth-pNCKKotV.js";
3
+ import { c as resolveSignalApprovalTargetAuthorKeys } from "./approval-reactions-Cub0slPC.js";
4
4
  import { createQuestionReactionTargetStore, questionGatewayRuntime } from "openclaw/plugin-sdk/question-gateway-runtime";
5
5
  import { normalizeAccountId } from "openclaw/plugin-sdk/routing";
6
6
  //#region extensions/signal/src/question-reactions.ts
@@ -24,21 +24,10 @@ const questionReactionTargets = createQuestionReactionTargetStore({
24
24
  registerChannelDelivery: questionGatewayRuntime.registerChannelDelivery,
25
25
  resolveReaction: questionGatewayRuntime.resolveReaction
26
26
  });
27
- function resolveConversationKey(params) {
28
- try {
29
- return resolveSignalTarget({
30
- cfg: params.cfg,
31
- accountId: params.accountId,
32
- input: params.to
33
- })?.to ?? resolveSignalApprovalConversationKey(params.to);
34
- } catch {
35
- return resolveSignalApprovalConversationKey(params.to);
36
- }
37
- }
38
27
  function registerSignalQuestionReactionTargetForDeliveredPayload(params) {
39
28
  const binding = questionGatewayRuntime.readReactionBinding(params.payload);
40
29
  if (params.target.channel !== "signal" || !binding) return false;
41
- const conversationKey = resolveConversationKey({
30
+ const conversationKey = resolveSignalDeliveredConversationKey({
42
31
  cfg: params.cfg,
43
32
  ...params.target
44
33
  });
@@ -1,6 +1,6 @@
1
1
  import { i as resolveSignalAccount } from "./accounts-DO4HMqaK.js";
2
2
  import { r as normalizeSignalReactionRecipient } from "./normalize-l_b99hap.js";
3
- import { n as signalRpcRequest } from "./client-adapter-CDyW9LrQ.js";
3
+ import { n as signalRpcRequest } from "./client-adapter-CNc5wzzs.js";
4
4
  import { t as resolveSignalRpcContext } from "./rpc-context-dXSy4NtF.js";
5
5
  import { requireRuntimeConfig } from "openclaw/plugin-sdk/plugin-config-runtime";
6
6
  //#region extensions/signal/src/send-reactions.ts
@@ -1,2 +1,2 @@
1
- import { n as sendReactionSignal, t as removeReactionSignal } from "./reaction-runtime-api-7FQFT_qb.js";
1
+ import { n as sendReactionSignal, t as removeReactionSignal } from "./reaction-runtime-api-CWqDv5-q.js";
2
2
  export { removeReactionSignal, sendReactionSignal };
@@ -1,3 +1,4 @@
1
+ import "node:module";
1
2
  //#region \0rolldown/runtime.js
2
3
  var __defProp = Object.defineProperty;
3
4
  var __exportAll = (all, no_symbols) => {
@@ -1,12 +1,12 @@
1
1
  import { i as resolveSignalAccount, n as listSignalAccountIds, r as resolveDefaultSignalAccountId, t as listEnabledSignalAccounts } from "./accounts-DO4HMqaK.js";
2
2
  import { n as normalizeSignalMessagingTarget, t as looksLikeSignalTargetId } from "./normalize-l_b99hap.js";
3
- import { a as setSignalRuntime, c as resolveSignalReactionLevel, s as signalMessageActions } from "./transport-detection-CbPFIo0i.js";
4
- import { n as sendReactionSignal, t as removeReactionSignal } from "./reaction-runtime-api-7FQFT_qb.js";
5
- import { n as SignalConfigSchema } from "./config-schema-CHihQTOp.js";
6
- import { i as installSignalCli } from "./install-signal-cli-7tEL37_j.js";
7
- import { t as monitorSignalProvider } from "./monitor-BPOcRufA.js";
8
- import { t as sendMessageSignal } from "./send-DF4T9tXZ.js";
9
- import { t as probeSignal } from "./probe-Bjs1Yd79.js";
3
+ import { a as setSignalRuntime, c as resolveSignalReactionLevel, s as signalMessageActions } from "./transport-detection-BD__qywn.js";
4
+ import { n as sendReactionSignal, t as removeReactionSignal } from "./reaction-runtime-api-CWqDv5-q.js";
5
+ import { n as SignalConfigSchema } from "./config-schema-DfEbpMVQ.js";
6
+ import { i as installSignalCli } from "./install-signal-cli-QlEIfWBv.js";
7
+ import { t as monitorSignalProvider } from "./monitor-CokYfKOk.js";
8
+ import { t as sendMessageSignal } from "./send-BvWSfyNf.js";
9
+ import { t as probeSignal } from "./probe-Bh9f0rRO.js";
10
10
  import { resolveChannelMediaMaxBytes } from "openclaw/plugin-sdk/account-helpers";
11
11
  import { PAIRING_APPROVED_MESSAGE } from "openclaw/plugin-sdk/channel-status";
12
12
  import { buildBaseAccountStatusSnapshot, buildBaseChannelStatusSummary, collectStatusIssuesFromLastError, createDefaultChannelRuntimeState } from "openclaw/plugin-sdk/status-helpers";
@@ -1,7 +1,7 @@
1
1
  import { i as resolveSignalAccount } from "./accounts-DO4HMqaK.js";
2
2
  import { n as normalizeSignalMessagingTarget } from "./normalize-l_b99hap.js";
3
- import { n as registerSignalReplyContext, u as markdownToSignalText } from "./transport-detection-CbPFIo0i.js";
4
- import { n as signalRpcRequest } from "./client-adapter-CDyW9LrQ.js";
3
+ import { n as registerSignalReplyContext, u as markdownToSignalText } from "./transport-detection-BD__qywn.js";
4
+ import { n as signalRpcRequest } from "./client-adapter-CNc5wzzs.js";
5
5
  import { t as resolveSignalRpcContext } from "./rpc-context-dXSy4NtF.js";
6
6
  import { createMessageReceiptFromOutboundResults } from "openclaw/plugin-sdk/channel-outbound";
7
7
  import { resolveMarkdownTableMode } from "openclaw/plugin-sdk/markdown-table-runtime";
@@ -1,2 +1,2 @@
1
- import { r as sendTypingSignal, t as sendMessageSignal } from "./send-DF4T9tXZ.js";
1
+ import { r as sendTypingSignal, t as sendMessageSignal } from "./send-BvWSfyNf.js";
2
2
  export { sendMessageSignal, sendTypingSignal };
@@ -1,8 +1,8 @@
1
1
  import { u as normalizeSignalTransportUrl } from "./transport-policy-DxvSMHp9.js";
2
2
  import { i as resolveSignalAccount, n as listSignalAccountIds, r as resolveDefaultSignalAccountId, t as listEnabledSignalAccounts } from "./accounts-DO4HMqaK.js";
3
3
  import { n as normalizeSignalMessagingTarget, r as normalizeSignalReactionRecipient } from "./normalize-l_b99hap.js";
4
- import { n as signalApprovalAuth, t as getSignalApprovalApprovers } from "./approval-auth-CkljhI65.js";
5
- import { n as sendReactionSignal, t as removeReactionSignal } from "./reaction-runtime-api-7FQFT_qb.js";
4
+ import { n as signalApprovalAuth, t as getSignalApprovalApprovers } from "./approval-auth-pNCKKotV.js";
5
+ import { n as sendReactionSignal, t as removeReactionSignal } from "./reaction-runtime-api-CWqDv5-q.js";
6
6
  import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/account-id";
7
7
  import { questionGatewayRuntime } from "openclaw/plugin-sdk/question-gateway-runtime";
8
8
  import { parseAgentSessionKey } from "openclaw/plugin-sdk/routing";
@@ -73,7 +73,7 @@ const signalApproval = createApproverRestrictedNativeApprovalCapabilityFromForwa
73
73
  approvalKind,
74
74
  request
75
75
  }),
76
- load: async () => (await import("./approval-handler.runtime-DvZd_IWj.js")).signalApprovalNativeRuntime
76
+ load: async () => (await import("./approval-handler.runtime-X6DXgK_3.js")).signalApprovalNativeRuntime
77
77
  })
78
78
  });
79
79
  const signalApprovalRouting = signalApproval.routing;
@@ -522,7 +522,7 @@ const DEFAULT_PROBE_TIMEOUT_MS = 1e4;
522
522
  async function detectSignalTransport(params) {
523
523
  const url = normalizeSignalTransportUrl(params.url);
524
524
  const timeoutMs = params.timeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS;
525
- const probes = params.probeNative && params.probeContainer ? void 0 : await import("./transport-probes.runtime-B7kr_6Zu.js");
525
+ const probes = params.probeNative && params.probeContainer ? void 0 : await import("./transport-probes.runtime-DV7x4VWu.js");
526
526
  const probeNative = params.probeNative ?? probes?.nativeCheck;
527
527
  const probeContainer = params.probeContainer ?? probes?.containerCheck;
528
528
  if (!probeNative || !probeContainer) throw new Error("Signal transport probes are unavailable");
@@ -1,2 +1,2 @@
1
- import { t as detectSignalTransport } from "./transport-detection-CbPFIo0i.js";
1
+ import { t as detectSignalTransport } from "./transport-detection-BD__qywn.js";
2
2
  export { detectSignalTransport };
@@ -1,2 +1,2 @@
1
- import { a as containerCheck, n as signalCheck } from "./client-BmpTN7R3.js";
1
+ import { a as containerCheck, n as signalCheck } from "./client-B3C0ciqU.js";
2
2
  export { containerCheck, signalCheck as nativeCheck };
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "id": "signal",
3
+ "name": "Signal",
4
+ "description": "OpenClaw Signal channel plugin.",
3
5
  "doctorContract": {
4
6
  "configRepair": true
5
7
  },
6
- "icon": "https://cdn.simpleicons.org/signal",
7
8
  "activation": {
8
9
  "onStartup": false
9
10
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/signal",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.3",
4
4
  "description": "OpenClaw Signal channel plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -93,10 +93,10 @@
93
93
  "allowInvalidConfigRecovery": true
94
94
  },
95
95
  "compat": {
96
- "pluginApi": ">=2026.9.1"
96
+ "pluginApi": ">=2026.9.3"
97
97
  },
98
98
  "build": {
99
- "openclawVersion": "2026.9.1",
99
+ "openclawVersion": "2026.9.3",
100
100
  "bundledDist": false
101
101
  },
102
102
  "release": {
@@ -118,7 +118,7 @@
118
118
  "README.md"
119
119
  ],
120
120
  "peerDependencies": {
121
- "openclaw": ">=2026.9.1"
121
+ "openclaw": ">=2026.9.3"
122
122
  },
123
123
  "peerDependenciesMeta": {
124
124
  "openclaw": {
@@ -1,10 +1,10 @@
1
1
  import { isRecord, normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
2
2
  import { truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
3
3
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
4
+ import path from "node:path";
4
5
  import { CONFIG_DIR, extractArchive, resolveBrewExecutable } from "openclaw/plugin-sdk/setup-tools";
5
6
  import { createWriteStream } from "node:fs";
6
7
  import fs from "node:fs/promises";
7
- import path from "node:path";
8
8
  import { Readable, Transform } from "node:stream";
9
9
  import { pipeline } from "node:stream/promises";
10
10
  import { readProviderJsonObjectResponse } from "openclaw/plugin-sdk/provider-http";