@openclaw/whatsapp 2026.9.1-beta.1 → 2026.9.2

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 (75) hide show
  1. package/dist/{accounts-BX2fZUyR.js → accounts-CiKHiuEe.js} +10 -27
  2. package/dist/{action-runtime-C075e6OP.js → action-runtime-CRZLhN3f.js} +2 -2
  3. package/dist/action-runtime-api.js +1 -1
  4. package/dist/action-runtime.runtime.js +1 -1
  5. package/dist/agent-tools-api.js +3 -3
  6. package/dist/api.js +10 -10
  7. package/dist/{approval-handler.runtime-CljxfPJz.js → approval-handler.runtime-C2cpkbpY.js} +8 -4
  8. package/dist/{approval-reactions-Jyr1JaAK.js → approval-reactions-DrZe-NmN.js} +7 -5
  9. package/dist/auth-presence.js +1 -1
  10. package/dist/{auth-store-CtpBqH5S.js → auth-store-ZWaclAbd.js} +8 -6
  11. package/dist/channel-config-api.js +1 -1
  12. package/dist/{channel-C4FMOZTE.js → channel-dwfgnadr.js} +56 -66
  13. package/dist/channel-plugin-api.js +1 -1
  14. package/dist/{channel-react-action-Bhp2BYRr.js → channel-react-action-CHeJSG9F.js} +3 -3
  15. package/dist/{channel.runtime-CrahUvcb.js → channel.runtime-Bn3K5Ygb.js} +4 -4
  16. package/dist/{channel.setup-CGcBvnpP.js → channel.setup-DckQm9ma.js} +1 -1
  17. package/dist/{config-schema-BQP5YCeK.js → config-schema-BYA6e_Ii.js} +6 -4
  18. package/dist/{connection-controller-CIYuBJrs.js → connection-controller-DNp6U1NN.js} +2 -2
  19. package/dist/{constants-HU41RHGI.js → constants-C7m81BNe.js} +1 -1
  20. package/dist/{creds-files-W6B3EMZ8.js → creds-files-Drg3usj1.js} +1 -1
  21. package/dist/{directory-config-P7_3U73Z.js → directory-config-CoWFw1zn.js} +3 -3
  22. package/dist/directory-contract-api.js +1 -1
  23. package/dist/doctor-BPb-SjdE.js +65 -0
  24. package/dist/doctor-contract-api.js +21 -3
  25. package/dist/{group-session-key-DmFc_Cqi.js → group-session-key-BmVDSPr1.js} +11 -12
  26. package/dist/light-runtime-api.js +1 -1
  27. package/dist/{login-BkpKpndm.js → login-6j2iP9nR.js} +6 -5
  28. package/dist/{login-qr-DY4VFgOq.js → login-qr-DRFgI6k1.js} +9 -7
  29. package/dist/login-qr-runtime.js +1 -1
  30. package/dist/{monitor-C_Nw23PZ.js → monitor-Bc6DC5jl.js} +189 -156
  31. package/dist/{question-reactions-D3eAeB0i.js → question-reactions-bbe0Qnjn.js} +1 -1
  32. package/dist/runtime-api.js +9 -9
  33. package/dist/{send-DLMUc2uZ.js → send-BDDGPxav.js} +53 -28
  34. package/dist/{send-api-BtK45TmZ.js → send-api-C_Zn4Ij-.js} +48 -48
  35. package/dist/{setup-finalize-C1nij8NS.js → setup-finalize-gLmc3FTV.js} +7 -6
  36. package/dist/setup-plugin-api.js +1 -1
  37. package/dist/{setup-surface-CjjqIxQP.js → setup-surface-twIi4TdN.js} +3 -3
  38. package/dist/{shared-BekHi69d.js → shared-ByeKDmh0.js} +13 -8
  39. package/dist/{socket-close-2T0_jZTN.js → socket-close-B3X9uerq.js} +10 -7
  40. package/dist/{targets-runtime-TMk0lGuy.js → targets-runtime-RBjx3pg_.js} +1 -2
  41. package/dist/{text-runtime-CaKLhowd.js → text-runtime-DyfmcATV.js} +1 -1
  42. package/node_modules/baileys/node_modules/process-warning/.github/dependabot.yml +42 -2
  43. package/node_modules/baileys/node_modules/process-warning/.github/workflows/ci.yml +12 -1
  44. package/node_modules/baileys/node_modules/process-warning/.github/workflows/lock-threads.yml +19 -0
  45. package/node_modules/baileys/node_modules/process-warning/LICENSE +1 -1
  46. package/node_modules/baileys/node_modules/process-warning/README.md +41 -2
  47. package/node_modules/baileys/node_modules/process-warning/index.js +85 -17
  48. package/node_modules/baileys/node_modules/process-warning/package.json +6 -7
  49. package/node_modules/baileys/node_modules/process-warning/test/emit-once-only.test.js +3 -3
  50. package/node_modules/baileys/node_modules/process-warning/test/emit-reset.test.js +4 -4
  51. package/node_modules/baileys/node_modules/process-warning/test/emit-unlimited.test.js +2 -2
  52. package/node_modules/baileys/node_modules/process-warning/test/spy-warning.test.js +143 -0
  53. package/node_modules/baileys/node_modules/process-warning/types/index.d.ts +15 -1
  54. package/node_modules/baileys/node_modules/process-warning/types/index.tst.ts +48 -0
  55. package/node_modules/baileys/node_modules/ws/lib/permessage-deflate.js +3 -1
  56. package/node_modules/baileys/node_modules/ws/package.json +1 -1
  57. package/node_modules/typebox/build/format/email.mjs +1 -1
  58. package/node_modules/typebox/build/format/idna/idn-hostname.mjs +19 -1
  59. package/node_modules/typebox/build/format/json_pointer.d.mts +2 -2
  60. package/node_modules/typebox/build/format/json_pointer.mjs +2 -2
  61. package/node_modules/typebox/build/format/json_pointer_uri_fragment.d.mts +2 -2
  62. package/node_modules/typebox/build/format/json_pointer_uri_fragment.mjs +2 -2
  63. package/node_modules/typebox/build/format/relative_json_pointer.d.mts +2 -2
  64. package/node_modules/typebox/build/format/relative_json_pointer.mjs +2 -2
  65. package/node_modules/typebox/build/system/memory/assign.mjs +2 -1
  66. package/node_modules/typebox/build/system/memory/create.mjs +3 -4
  67. package/node_modules/typebox/build/system/memory/discard.mjs +2 -2
  68. package/node_modules/typebox/build/system/memory/freeze.d.mts +4 -0
  69. package/node_modules/typebox/build/system/memory/freeze.mjs +6 -0
  70. package/node_modules/typebox/build/system/memory/update.mjs +3 -2
  71. package/node_modules/typebox/package.json +1 -1
  72. package/openclaw.plugin.json +0 -1
  73. package/package.json +7 -6
  74. package/dist/doctor-CwzVXKoE.js +0 -10
  75. package/node_modules/baileys/node_modules/process-warning/types/index.test-d.ts +0 -36
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
2
- import { a as resolveWhatsAppAccount } from "./accounts-BX2fZUyR.js";
2
+ import { a as resolveWhatsAppAccount } from "./accounts-CiKHiuEe.js";
3
3
  import { createQuestionReactionTargetStore, questionGatewayRuntime } from "openclaw/plugin-sdk/question-gateway-runtime";
4
4
  //#region extensions/whatsapp/src/question-reactions.ts
5
5
  var question_reactions_exports = /* @__PURE__ */ __exportAll({
@@ -1,16 +1,16 @@
1
- import { c as resolveWebCredsPath, r as hasWebCredsSync, s as resolveWebCredsBackupPath } from "./creds-files-W6B3EMZ8.js";
2
- import { n as whatsAppActionRuntime, t as handleWhatsAppAction } from "./action-runtime-C075e6OP.js";
3
- import { i as sendTypingWhatsApp, n as sendPollWhatsApp, r as sendReactionWhatsApp, t as sendMessageWhatsApp } from "./send-DLMUc2uZ.js";
1
+ import { c as resolveWebCredsPath, r as hasWebCredsSync, s as resolveWebCredsBackupPath } from "./creds-files-Drg3usj1.js";
2
+ import { n as whatsAppActionRuntime, t as handleWhatsAppAction } from "./action-runtime-CRZLhN3f.js";
3
+ import { i as sendTypingWhatsApp, n as sendPollWhatsApp, r as sendReactionWhatsApp, t as sendMessageWhatsApp } from "./send-BDDGPxav.js";
4
4
  import { a as setWhatsAppRuntime } from "./runtime-BLlToOi6.js";
5
5
  import { startWebLoginWithQr, waitForWebLogin } from "./login-qr-runtime.js";
6
6
  import { t as createWhatsAppLoginTool } from "./agent-tools-login-B-2qZPzc.js";
7
- import { M as waitForCredsSaveQueueWithTimeout, N as writeCredsJsonAtomically, _ as readWebSelfIdentity, a as formatWhatsAppWebAuthStatusState, b as restoreCredsFromBackupIfNeeded, c as logoutWeb, d as readWebAuthExistsBestEffort, f as readWebAuthExistsForDecision, g as readWebSelfId, h as readWebAuthState, j as waitForCredsSaveQueue, l as pickWebChannel, m as readWebAuthSnapshotBestEffort, n as WHATSAPP_AUTH_UNSTABLE_CODE, o as getWebAuthAgeMs, p as readWebAuthSnapshot, r as WhatsAppAuthUnstableError, s as logWebSelfId, t as WA_WEB_AUTH_DIR, u as readCredsJsonRaw, v as readWebSelfIdentityForDecision, x as webAuthExists, y as resolveDefaultWebAuthDir } from "./auth-store-CtpBqH5S.js";
8
- import { t as DEFAULT_WEB_MEDIA_BYTES } from "./constants-HU41RHGI.js";
7
+ import { M as waitForCredsSaveQueueWithTimeout, N as writeCredsJsonAtomically, _ as readWebSelfIdentity, a as formatWhatsAppWebAuthStatusState, b as restoreCredsFromBackupIfNeeded, c as logoutWeb, d as readWebAuthExistsBestEffort, f as readWebAuthExistsForDecision, g as readWebSelfId, h as readWebAuthState, j as waitForCredsSaveQueue, l as pickWebChannel, m as readWebAuthSnapshotBestEffort, n as WHATSAPP_AUTH_UNSTABLE_CODE, o as getWebAuthAgeMs, p as readWebAuthSnapshot, r as WhatsAppAuthUnstableError, s as logWebSelfId, t as WA_WEB_AUTH_DIR, u as readCredsJsonRaw, v as readWebSelfIdentityForDecision, x as webAuthExists, y as resolveDefaultWebAuthDir } from "./auth-store-ZWaclAbd.js";
8
+ import { t as DEFAULT_WEB_MEDIA_BYTES } from "./constants-C7m81BNe.js";
9
9
  import { n as resolveWebAccountId, t as getActiveWebListener } from "./active-listener-BEjWsCNM.js";
10
- import { a as waitForWaConnection, i as newConnectionId, r as createWaSocket } from "./socket-close-2T0_jZTN.js";
10
+ import { a as waitForWaConnection, i as newConnectionId, r as createWaSocket } from "./socket-close-B3X9uerq.js";
11
11
  import { n as getStatusCode, t as formatError } from "./session-errors-JuazczrA.js";
12
- import { p as extractText, s as extractContactContext, u as extractLocationData } from "./send-api-BtK45TmZ.js";
13
- import { a as loadWebMediaRaw, c as monitorWebInbox, i as loadWebMedia, l as resetWebInboundDedupe, n as LocalMediaAccessError, o as optimizeImageToJpeg, r as getDefaultLocalRoots, s as optimizeImageToPng, t as monitorWebChannel } from "./monitor-C_Nw23PZ.js";
14
- import { t as loginWeb } from "./login-BkpKpndm.js";
12
+ import { p as extractText, s as extractContactContext, u as extractLocationData } from "./send-api-C_Zn4Ij-.js";
13
+ import { a as loadWebMediaRaw, c as monitorWebInbox, i as loadWebMedia, l as resetWebInboundDedupe, n as LocalMediaAccessError, o as optimizeImageToJpeg, r as getDefaultLocalRoots, s as optimizeImageToPng, t as monitorWebChannel } from "./monitor-Bc6DC5jl.js";
14
+ import { t as loginWeb } from "./login-6j2iP9nR.js";
15
15
  import { HEARTBEAT_PROMPT, HEARTBEAT_TOKEN, SILENT_REPLY_TOKEN, stripHeartbeatToken } from "openclaw/plugin-sdk/reply-runtime";
16
16
  export { DEFAULT_WEB_MEDIA_BYTES, HEARTBEAT_PROMPT, HEARTBEAT_TOKEN, LocalMediaAccessError, SILENT_REPLY_TOKEN, WA_WEB_AUTH_DIR, WHATSAPP_AUTH_UNSTABLE_CODE, WhatsAppAuthUnstableError, createWaSocket, createWhatsAppLoginTool, extractContactContext, extractLocationData, extractText, formatError, formatWhatsAppWebAuthStatusState, getActiveWebListener, getDefaultLocalRoots, getStatusCode, getWebAuthAgeMs, handleWhatsAppAction, hasWebCredsSync, loadWebMedia, loadWebMediaRaw, logWebSelfId, loginWeb, logoutWeb, monitorWebChannel, monitorWebInbox, newConnectionId, optimizeImageToJpeg, optimizeImageToPng, pickWebChannel, readCredsJsonRaw, readWebAuthExistsBestEffort, readWebAuthExistsForDecision, readWebAuthSnapshot, readWebAuthSnapshotBestEffort, readWebAuthState, readWebSelfId, readWebSelfIdentity, readWebSelfIdentityForDecision, resetWebInboundDedupe, resolveDefaultWebAuthDir, resolveWebAccountId, resolveWebCredsBackupPath, resolveWebCredsPath, restoreCredsFromBackupIfNeeded, sendMessageWhatsApp, sendPollWhatsApp, sendReactionWhatsApp, sendTypingWhatsApp, setWhatsAppRuntime, startWebLoginWithQr, stripHeartbeatToken, waitForCredsSaveQueue, waitForCredsSaveQueueWithTimeout, waitForWaConnection, waitForWebLogin, webAuthExists, whatsAppActionRuntime, writeCredsJsonAtomically };
@@ -1,13 +1,14 @@
1
- import { a as resolveWhatsAppAccount, c as resolveMergedWhatsAppAccountConfig, s as resolveWhatsAppMediaMaxBytes } from "./accounts-BX2fZUyR.js";
1
+ import { a as resolveWhatsAppAccount, c as resolveMergedWhatsAppAccountConfig, s as resolveWhatsAppMediaMaxBytes } from "./accounts-CiKHiuEe.js";
2
2
  import { r as resolveDefaultWhatsAppAccountId } from "./account-ids-CB5SOWjc.js";
3
3
  import { n as isWhatsAppNewsletterJid } from "./normalize-target-CugRyONv.js";
4
4
  import { r as getWhatsAppConnectionController } from "./connection-controller-runtime-context-DG0tuYuw.js";
5
5
  import "./normalize-C7Hkc_vE.js";
6
- import { a as markdownToWhatsAppChunks, c as toWhatsappJid } from "./targets-runtime-TMk0lGuy.js";
7
- import { a as stripToolCallXmlTags, i as sanitizeAssistantVisibleTextWithProfile, r as sanitizeAssistantVisibleText } from "./text-runtime-CaKLhowd.js";
6
+ import { a as markdownToWhatsAppChunks, c as toWhatsappJid } from "./targets-runtime-RBjx3pg_.js";
7
+ import { a as stripToolCallXmlTags, i as sanitizeAssistantVisibleTextWithProfile, r as sanitizeAssistantVisibleText } from "./text-runtime-DyfmcATV.js";
8
8
  import path from "node:path";
9
9
  import { normalizeStringEntries, normalizeUniqueStringEntries, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
10
10
  import { resolveReactionLevel } from "openclaw/plugin-sdk/status-helpers";
11
+ import { createMessageReceiptFromOutboundResults, createReplyToFanout, listMessageReceiptPlatformIds, sanitizeForPlainText } from "openclaw/plugin-sdk/channel-outbound";
11
12
  import { formatCliCommand } from "openclaw/plugin-sdk/cli-runtime";
12
13
  import { generateSecureUuid } from "openclaw/plugin-sdk/core";
13
14
  import { PlatformMessageNotDispatchedError } from "openclaw/plugin-sdk/error-runtime";
@@ -22,17 +23,17 @@ import { extensionForMime, mediaKindFromMime, mimeTypeFromFilePath, normalizeMim
22
23
  import { AsyncLocalStorage } from "node:async_hooks";
23
24
  import { recordChannelActivity } from "openclaw/plugin-sdk/channel-activity-runtime";
24
25
  import { createChannelPartialDeliveryError, isChannelPartialDeliveryError } from "openclaw/plugin-sdk/channel-inbound";
25
- import { createMessageReceiptFromOutboundResults, listMessageReceiptPlatformIds, sanitizeForPlainText } from "openclaw/plugin-sdk/channel-outbound";
26
26
  import { MEDIA_FFMPEG_MAX_AUDIO_DURATION_SECS, transcodeAudioBufferToOpus } from "openclaw/plugin-sdk/media-runtime";
27
27
  import { resolveOutboundMediaUrls } from "openclaw/plugin-sdk/reply-payload";
28
28
  //#region extensions/whatsapp/src/reaction-level.ts
29
29
  /** Resolve the effective reaction level and its implications for WhatsApp. */
30
30
  function resolveWhatsAppReactionLevel(params) {
31
+ const account = resolveMergedWhatsAppAccountConfig({
32
+ cfg: params.cfg,
33
+ accountId: params.accountId
34
+ });
31
35
  return resolveReactionLevel({
32
- value: resolveMergedWhatsAppAccountConfig({
33
- cfg: params.cfg,
34
- accountId: params.accountId
35
- }).reactionLevel,
36
+ value: account.reactionLevel,
36
37
  defaultLevel: "minimal",
37
38
  invalidFallback: "minimal"
38
39
  });
@@ -494,8 +495,9 @@ async function sendMessageWhatsAppInActivityScope(to, body, options) {
494
495
  accountId: resolvedAccountId ?? options.accountId
495
496
  });
496
497
  const accountIdForFormatting = resolvedAccountId ?? options.accountId;
497
- const textLimit = Math.min(resolveTextChunkLimit(cfg, "whatsapp", accountIdForFormatting, { fallbackLimit: 4e3 }), 4096);
498
- const textChunks = markdownToWhatsAppChunks(text, textLimit, tableMode, resolveChunkMode(cfg, "whatsapp", accountIdForFormatting));
498
+ const requestedLimit = options.formatting?.textLimit ?? Infinity;
499
+ const textLimit = Math.min(requestedLimit > 0 ? requestedLimit : Infinity, resolveTextChunkLimit(cfg, "whatsapp", accountIdForFormatting, { fallbackLimit: 4e3 }), 4096);
500
+ const textChunks = markdownToWhatsAppChunks(text, textLimit, tableMode, options.formatting?.chunkMode ?? resolveChunkMode(cfg, "whatsapp", accountIdForFormatting));
499
501
  text = textChunks.shift() ?? text;
500
502
  if (!text && !hasMedia) return {
501
503
  messageId: "",
@@ -565,30 +567,52 @@ async function sendMessageWhatsAppInActivityScope(to, body, options) {
565
567
  }
566
568
  }
567
569
  const accountId = Boolean(options.accountId?.trim()) ? resolvedAccountId : void 0;
568
- const sendOptions = options.gifPlayback || forceDocumentDelivery || accountId || documentFileName || options.quotedMessageKey ? {
570
+ const trailingTextChunks = [visibleTextAfterVoice, ...textChunks].filter((chunk) => Boolean(chunk));
571
+ const reportProgress = trailingTextChunks.length > 0 ? options.onDeliveryResult : void 0;
572
+ const sendOptions = options.gifPlayback || forceDocumentDelivery || accountId || documentFileName ? {
569
573
  ...options.gifPlayback ? { gifPlayback: true } : {},
570
574
  ...forceDocumentDelivery ? { asDocument: true } : {},
571
575
  ...documentFileName ? { fileName: documentFileName } : {},
572
- ...options.quotedMessageKey ? { quotedMessageKey: options.quotedMessageKey } : {},
573
576
  accountId
574
577
  } : void 0;
575
- const result = requireWhatsAppAcceptedSendResult(sendOptions ? await active.sendMessage(to, text, mediaBuffer, mediaType, sendOptions) : await active.sendMessage(to, text, mediaBuffer, mediaType));
576
- acceptedResults.push(result);
577
- const messageId = result.messageId;
578
- const sentRemoteJid = resolveActualSentRemoteJid(result, jid);
579
- const trailingTextChunks = [visibleTextAfterVoice, ...textChunks].filter((chunk) => Boolean(chunk));
578
+ const quotedSendOptions = options.quotedMessageKey ? {
579
+ ...sendOptions,
580
+ quotedMessageKey: options.quotedMessageKey
581
+ } : sendOptions;
582
+ const nextReplyToId = createReplyToFanout({
583
+ replyToId: options.quotedMessageKey?.id,
584
+ replyToIdSource: options.replyToIdSource,
585
+ replyToMode: options.replyToMode
586
+ });
587
+ const sendPart = async (part, buffer, mime) => {
588
+ await options.onPlatformSendDispatch?.();
589
+ const replyToId = nextReplyToId();
590
+ const partOptions = replyToId ? quotedSendOptions : sendOptions;
591
+ const accepted = requireWhatsAppAcceptedSendResult(partOptions ? await active.sendMessage(to, part, buffer, mime, partOptions) : await active.sendMessage(to, part, buffer, mime));
592
+ acceptedResults.push(accepted);
593
+ const result = {
594
+ messageId: accepted.messageId,
595
+ toJid: resolveActualSentRemoteJid(accepted, jid)
596
+ };
597
+ return {
598
+ ...result,
599
+ ...reportProgress ? { receipt: createMessageReceiptFromOutboundResults({
600
+ results: [{
601
+ channel: "whatsapp",
602
+ ...result
603
+ }],
604
+ kind: buffer ? "media" : "text",
605
+ replyToId
606
+ }) } : {}
607
+ };
608
+ };
609
+ const result = await sendPart(text, mediaBuffer, mediaType);
610
+ const { messageId, toJid: sentRemoteJid } = result;
580
611
  if (trailingTextChunks.length > 0) {
581
- await options.onDeliveryResult?.({
582
- messageId,
583
- toJid: sentRemoteJid
584
- });
612
+ await reportProgress?.(result);
585
613
  for (const trailingText of trailingTextChunks) {
586
- const trailingResult = requireWhatsAppAcceptedSendResult(sendOptions ? await active.sendMessage(to, trailingText, void 0, void 0, sendOptions) : await active.sendMessage(to, trailingText, void 0, void 0));
587
- acceptedResults.push(trailingResult);
588
- await options.onDeliveryResult?.({
589
- messageId: trailingResult.messageId,
590
- toJid: resolveActualSentRemoteJid(trailingResult, jid)
591
- });
614
+ const trailingResult = await sendPart(trailingText);
615
+ await reportProgress?.(trailingResult);
592
616
  }
593
617
  }
594
618
  const durationMs = Date.now() - startedAt;
@@ -639,7 +663,8 @@ async function sendReactionWhatsApp(chatJid, messageId, emoji, options) {
639
663
  messageId
640
664
  });
641
665
  try {
642
- const redactedJid = redactIdentifier(toWhatsappJid(chatJid));
666
+ const jid = toWhatsappJid(chatJid);
667
+ const redactedJid = redactIdentifier(jid);
643
668
  outboundLog.info(`Sending reaction "${emoji}" -> message ${messageId}`);
644
669
  logger.info({
645
670
  chatJid: redactedJid,
@@ -1,10 +1,10 @@
1
1
  import { n as isWhatsAppNewsletterJid } from "./normalize-target-CugRyONv.js";
2
- import { _ as resolveWhatsAppDocumentFileName, f as mergeWhatsAppAcceptedSendError, m as rememberWhatsAppAcceptedSend, p as normalizeWhatsAppSendResult, u as combineWhatsAppSendResults } from "./send-DLMUc2uZ.js";
2
+ import { _ as resolveWhatsAppDocumentFileName, f as mergeWhatsAppAcceptedSendError, m as rememberWhatsAppAcceptedSend, p as normalizeWhatsAppSendResult, u as combineWhatsAppSendResults } from "./send-BDDGPxav.js";
3
3
  import "./normalize-C7Hkc_vE.js";
4
- import { c as toWhatsappJid, l as toWhatsappJidWithLid, r as jidToE164 } from "./targets-runtime-TMk0lGuy.js";
5
- import "./text-runtime-CaKLhowd.js";
6
- import { i as buildQuotedMessageOptions } from "./group-session-key-DmFc_Cqi.js";
7
- import { k as resolveComparableIdentity } from "./auth-store-CtpBqH5S.js";
4
+ import { c as toWhatsappJid, l as toWhatsappJidWithLid, r as jidToE164 } from "./targets-runtime-RBjx3pg_.js";
5
+ import "./text-runtime-DyfmcATV.js";
6
+ import { i as buildQuotedMessageOptions } from "./group-session-key-BmVDSPr1.js";
7
+ import { k as resolveComparableIdentity } from "./auth-store-ZWaclAbd.js";
8
8
  import { isRecord, normalizeLowercaseStringOrEmpty, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
9
9
  import { logVerbose } from "openclaw/plugin-sdk/runtime-env";
10
10
  import { formatLocationText } from "openclaw/plugin-sdk/channel-inbound";
@@ -375,27 +375,25 @@ function hasInboundUserContent(source) {
375
375
  const WHATSAPP_IMAGE_THUMBNAIL_SIDE = 32;
376
376
  const WHATSAPP_IMAGE_THUMBNAIL_QUALITY = 50;
377
377
  async function addWhatsAppImagePreviewFields(content) {
378
+ if (!("image" in content) || !Buffer.isBuffer(content.image)) return content;
378
379
  const image = content.image;
379
- if (!Buffer.isBuffer(image)) return content;
380
- const current = content;
381
- const hasDimensions = typeof current.width === "number" && typeof current.height === "number";
382
- const hasThumbnail = typeof current.jpegThumbnail === "string";
380
+ const hasDimensions = typeof content.width === "number" && typeof content.height === "number";
381
+ const hasThumbnail = typeof content.jpegThumbnail === "string";
383
382
  if (hasDimensions && hasThumbnail) return content;
384
383
  const metadata = hasDimensions ? null : await getImageMetadata(image).catch(() => null);
385
- if (!hasDimensions && !metadata) return content;
386
- const thumbnail = hasThumbnail ? null : await resizeToJpeg({
384
+ const jpegThumbnail = hasThumbnail ? content.jpegThumbnail : await resizeToJpeg({
387
385
  buffer: image,
388
386
  maxSide: WHATSAPP_IMAGE_THUMBNAIL_SIDE,
389
387
  quality: WHATSAPP_IMAGE_THUMBNAIL_QUALITY,
390
388
  withoutEnlargement: true
391
- }).catch(() => null);
389
+ }).then((thumbnail) => thumbnail.toString("base64")).catch(() => "");
392
390
  return {
393
391
  ...content,
394
392
  ...metadata ? {
395
393
  width: metadata.width,
396
394
  height: metadata.height
397
395
  } : {},
398
- ...thumbnail ? { jpegThumbnail: thumbnail.toString("base64") } : {}
396
+ jpegThumbnail
399
397
  };
400
398
  }
401
399
  //#endregion
@@ -625,43 +623,44 @@ function createWebSendApi(params) {
625
623
  text,
626
624
  mentionedJids: []
627
625
  } : await resolveMentions(jid, text);
628
- if (mediaBuffer && mediaType) if (sendOptions?.asDocument === true && supportsForcedDocumentMediaType(mediaType)) payload = {
629
- document: mediaBuffer,
630
- fileName: resolveWhatsAppDocumentFileName({
631
- fileName: sendOptions?.fileName,
626
+ if (mediaBuffer && mediaType) {
627
+ if (sendOptions?.asDocument === true && supportsForcedDocumentMediaType(mediaType)) payload = {
628
+ document: mediaBuffer,
629
+ fileName: resolveWhatsAppDocumentFileName({
630
+ fileName: sendOptions?.fileName,
631
+ mimetype: mediaType
632
+ }),
633
+ caption: resolvedPayloadText.text || void 0,
632
634
  mimetype: mediaType
633
- }),
634
- caption: resolvedPayloadText.text || void 0,
635
- mimetype: mediaType
636
- };
637
- else if (mediaType.startsWith("image/")) payload = await addWhatsAppImagePreviewFields({
638
- image: mediaBuffer,
639
- caption: resolvedPayloadText.text || void 0,
640
- mimetype: mediaType
641
- });
642
- else if (mediaType.startsWith("audio/")) payload = {
643
- audio: mediaBuffer,
644
- ptt: true,
645
- mimetype: mediaType
646
- };
647
- else if (mediaType.startsWith("video/")) {
648
- const gifPlayback = sendOptions?.gifPlayback;
649
- payload = {
650
- video: mediaBuffer,
635
+ };
636
+ else if (mediaType.startsWith("image/")) payload = await addWhatsAppImagePreviewFields({
637
+ image: mediaBuffer,
651
638
  caption: resolvedPayloadText.text || void 0,
652
- mimetype: mediaType,
653
- ...gifPlayback ? { gifPlayback: true } : {}
639
+ mimetype: mediaType
640
+ });
641
+ else if (mediaType.startsWith("audio/")) payload = {
642
+ audio: mediaBuffer,
643
+ ptt: true,
644
+ mimetype: mediaType
654
645
  };
655
- } else payload = {
656
- document: mediaBuffer,
657
- fileName: resolveWhatsAppDocumentFileName({
658
- fileName: sendOptions?.fileName,
646
+ else if (mediaType.startsWith("video/")) {
647
+ const gifPlayback = sendOptions?.gifPlayback;
648
+ payload = {
649
+ video: mediaBuffer,
650
+ caption: resolvedPayloadText.text || void 0,
651
+ mimetype: mediaType,
652
+ ...gifPlayback ? { gifPlayback: true } : {}
653
+ };
654
+ } else payload = {
655
+ document: mediaBuffer,
656
+ fileName: resolveWhatsAppDocumentFileName({
657
+ fileName: sendOptions?.fileName,
658
+ mimetype: mediaType
659
+ }),
660
+ caption: resolvedPayloadText.text || void 0,
659
661
  mimetype: mediaType
660
- }),
661
- caption: resolvedPayloadText.text || void 0,
662
- mimetype: mediaType
663
- };
664
- else payload = { text: resolvedPayloadText.text };
662
+ };
663
+ } else payload = { text: resolvedPayloadText.text };
665
664
  payload = addWhatsAppOutboundMentionsToContent(payload, resolvedPayloadText.mentionedJids);
666
665
  const quotedOpts = buildQuotedMessageOptions({
667
666
  messageId: sendOptions?.quotedMessageKey?.id,
@@ -717,7 +716,7 @@ function createWebSendApi(params) {
717
716
  },
718
717
  sendReaction: async (chatJid, messageId, emoji, fromMe, participant) => {
719
718
  const jid = resolveOutboundJid(chatJid);
720
- return normalizeWhatsAppSendResult(await params.sock.sendMessage(jid, { react: {
719
+ const result = await params.sock.sendMessage(jid, { react: {
721
720
  text: emoji,
722
721
  key: {
723
722
  remoteJid: jid,
@@ -725,7 +724,8 @@ function createWebSendApi(params) {
725
724
  fromMe,
726
725
  participant: participant ? toWhatsappJid(participant) : void 0
727
726
  }
728
- } }), "reaction");
727
+ } });
728
+ return normalizeWhatsAppSendResult(result, "reaction");
729
729
  },
730
730
  sendComposingTo: async (to) => {
731
731
  const jid = resolveOutboundJid(to);
@@ -1,8 +1,8 @@
1
- import { a as resolveWhatsAppAccount, o as resolveWhatsAppAuthDir } from "./accounts-BX2fZUyR.js";
1
+ import { a as resolveWhatsAppAccount, o as resolveWhatsAppAuthDir } from "./accounts-CiKHiuEe.js";
2
2
  import { r as resolveDefaultWhatsAppAccountId } from "./account-ids-CB5SOWjc.js";
3
- import { r as hasWebCredsSync } from "./creds-files-W6B3EMZ8.js";
3
+ import { r as hasWebCredsSync } from "./creds-files-Drg3usj1.js";
4
4
  import { a as normalizeWhatsAppAllowFromEntries, o as normalizeWhatsAppAllowFromEntry } from "./normalize-target-CugRyONv.js";
5
- import { r as whatsappSetupAdapter } from "./shared-BekHi69d.js";
5
+ import { r as whatsappSetupAdapter } from "./shared-ByeKDmh0.js";
6
6
  import { formatCliCommand, formatDocsLink } from "openclaw/plugin-sdk/setup-tools";
7
7
  import { DEFAULT_ACCOUNT_ID, createSetupTranslator, splitSetupEntries } from "openclaw/plugin-sdk/setup";
8
8
  //#region extensions/whatsapp/src/setup-finalize.ts
@@ -94,7 +94,7 @@ async function detectWhatsAppLinked(cfg, accountId) {
94
94
  async function promptWhatsAppOwnerAllowFrom(params) {
95
95
  const { prompter, existingAllowFrom } = params;
96
96
  await prompter.note(t("wizard.whatsapp.ownerNumberNote"), t("wizard.whatsapp.numberTitle"));
97
- const normalized = normalizeWhatsAppAllowFromEntry(trimPromptText(await prompter.text({
97
+ const entry = await prompter.text({
98
98
  message: t("wizard.whatsapp.personalNumberPrompt"),
99
99
  placeholder: "+15555550123",
100
100
  initialValue: existingAllowFrom[0],
@@ -103,7 +103,8 @@ async function promptWhatsAppOwnerAllowFrom(params) {
103
103
  if (!raw) return t("common.required");
104
104
  if (!normalizeWhatsAppAllowFromEntry(raw)) return `Invalid number: ${raw}`;
105
105
  }
106
- })));
106
+ });
107
+ const normalized = normalizeWhatsAppAllowFromEntry(trimPromptText(entry));
107
108
  if (!normalized) throw new Error("Invalid WhatsApp owner number (expected E.164 after validation).");
108
109
  return {
109
110
  normalized,
@@ -295,7 +296,7 @@ async function finalizeWhatsAppSetup(params) {
295
296
  };
296
297
  let loginWeb;
297
298
  try {
298
- ({loginWeb} = await import("./login-BkpKpndm.js").then((n) => n.n));
299
+ ({loginWeb} = await import("./login-6j2iP9nR.js").then((n) => n.n));
299
300
  } catch (error) {
300
301
  await reportLoginFailure(error);
301
302
  }
@@ -1,2 +1,2 @@
1
- import { t as whatsappSetupPlugin } from "./channel.setup-CGcBvnpP.js";
1
+ import { t as whatsappSetupPlugin } from "./channel.setup-DckQm9ma.js";
2
2
  export { whatsappSetupPlugin };
@@ -1,6 +1,6 @@
1
- import { o as resolveWhatsAppAuthDir } from "./accounts-BX2fZUyR.js";
1
+ import { o as resolveWhatsAppAuthDir } from "./accounts-CiKHiuEe.js";
2
2
  import { t as listAccountIds } from "./account-ids-CB5SOWjc.js";
3
- import { a as formatWhatsAppWebAuthStatusState, h as readWebAuthState } from "./auth-store-CtpBqH5S.js";
3
+ import { a as formatWhatsAppWebAuthStatusState, h as readWebAuthState } from "./auth-store-ZWaclAbd.js";
4
4
  import { DEFAULT_ACCOUNT_ID, createSetupTranslator, setSetupChannelEnabled } from "openclaw/plugin-sdk/setup";
5
5
  //#region extensions/whatsapp/src/setup-surface.ts
6
6
  const t = createSetupTranslator();
@@ -36,7 +36,7 @@ const whatsappSetupWizard = {
36
36
  },
37
37
  resolveShouldPromptAccountIds: ({ shouldPromptAccountIds }) => shouldPromptAccountIds,
38
38
  credentials: [],
39
- finalize: async (params) => await (await import("./setup-finalize-C1nij8NS.js")).finalizeWhatsAppSetup(params),
39
+ finalize: async (params) => await (await import("./setup-finalize-gLmc3FTV.js")).finalizeWhatsAppSetup(params),
40
40
  disable: (cfg) => setSetupChannelEnabled(cfg, channel, false),
41
41
  onAccountRecorded: (accountId, options) => {
42
42
  options?.onAccountId?.(channel, accountId);
@@ -1,8 +1,8 @@
1
- import { a as resolveWhatsAppAccount, n as hasAnyWhatsAppAuth } from "./accounts-BX2fZUyR.js";
1
+ import { a as resolveWhatsAppAccount, n as hasAnyWhatsAppAuth } from "./accounts-CiKHiuEe.js";
2
2
  import { r as resolveDefaultWhatsAppAccountId, t as listAccountIds } from "./account-ids-CB5SOWjc.js";
3
3
  import { a as normalizeWhatsAppAllowFromEntries } from "./normalize-target-CugRyONv.js";
4
- import { t as WhatsAppChannelConfigSchema } from "./config-schema-BQP5YCeK.js";
5
- import { n as whatsappDoctor } from "./doctor-CwzVXKoE.js";
4
+ import { t as WhatsAppChannelConfigSchema } from "./config-schema-BYA6e_Ii.js";
5
+ import { n as whatsappDoctor } from "./doctor-BPb-SjdE.js";
6
6
  import { t as resolveWhatsAppConfigPath } from "./group-config-path-BGyzT9Lg.js";
7
7
  import { t as resolveLegacyGroupSessionKey } from "./group-session-contract-DDnZSsJ1.js";
8
8
  import { n as unsupportedSecretRefSurfacePatterns, t as collectUnsupportedSecretRefConfigCandidates } from "./security-contract-nAzD945y.js";
@@ -20,14 +20,14 @@ import { adaptScopedAccountAccessor, createScopedChannelConfigAdapter, createSco
20
20
  import { createDelegatedSetupWizardProxy } from "openclaw/plugin-sdk/setup-runtime";
21
21
  import { readChannelAllowFromStore } from "openclaw/plugin-sdk/channel-pairing";
22
22
  //#region extensions/whatsapp/src/channel-runtime-loader.ts
23
- const loadWhatsAppAuthStore = createLazyRuntimeModule(() => import("./auth-store-CtpBqH5S.js").then((n) => n.i));
23
+ const loadWhatsAppAuthStore = createLazyRuntimeModule(() => import("./auth-store-ZWaclAbd.js").then((n) => n.i));
24
24
  async function readWhatsAppAccountLinkState(authDir) {
25
25
  const state = await (await loadWhatsAppAuthStore()).readWebAuthState(authDir);
26
26
  return state === "unstable" ? "unknown" : state;
27
27
  }
28
28
  const loadWhatsAppChannelRuntime = createLazyRuntimeModule(async () => {
29
29
  await loadWhatsAppAuthStore();
30
- return await import("./channel.runtime-CrahUvcb.js");
30
+ return await import("./channel.runtime-Bn3K5Ygb.js");
31
31
  });
32
32
  //#endregion
33
33
  //#region extensions/whatsapp/src/config-accessors.ts
@@ -96,7 +96,8 @@ function applyGroupAllowFromFromStore(params) {
96
96
  return changed ? next : params.cfg;
97
97
  }
98
98
  async function applyWhatsAppSecurityConfigFixes(params) {
99
- const normalized = normalizeUniqueStringEntries(await readChannelAllowFromStore("whatsapp", params.env, DEFAULT_ACCOUNT_ID).catch(() => []));
99
+ const fromStore = await readChannelAllowFromStore("whatsapp", params.env, DEFAULT_ACCOUNT_ID).catch(() => []);
100
+ const normalized = normalizeUniqueStringEntries(fromStore);
100
101
  if (normalized.length === 0) return {
101
102
  config: params.cfg,
102
103
  changes: []
@@ -115,7 +116,7 @@ async function applyWhatsAppSecurityConfigFixes(params) {
115
116
  //#region extensions/whatsapp/src/shared.ts
116
117
  const WHATSAPP_CHANNEL = "whatsapp";
117
118
  async function loadWhatsAppSetupSurface() {
118
- return await import("./setup-surface-CjjqIxQP.js");
119
+ return await import("./setup-surface-twIi4TdN.js");
119
120
  }
120
121
  const whatsappSetupWizardProxy = createWhatsAppSetupWizardProxy(async () => (await loadWhatsAppSetupSurface()).whatsappSetupWizard);
121
122
  const whatsappConfigAdapter = createScopedChannelConfigAdapter({
@@ -251,7 +252,11 @@ function createWhatsAppPluginBase(params) {
251
252
  "channels.whatsapp.accounts",
252
253
  "channels.whatsapp.selfChatMode"
253
254
  ],
254
- noopPrefixes: ["channels.whatsapp"]
255
+ noopPrefixes: [
256
+ "channels.whatsapp",
257
+ "messages.inbound",
258
+ "messages.ackReactionScope"
259
+ ]
255
260
  },
256
261
  gatewayMethodDescriptors: [{ name: "web.login.start" }, { name: "web.login.wait" }],
257
262
  configSchema: WhatsAppChannelConfigSchema,
@@ -1,5 +1,5 @@
1
- import { c as resolveWebCredsPath, s as resolveWebCredsBackupPath, t as assertWebCredsPathRegularFileOrMissing } from "./creds-files-W6B3EMZ8.js";
2
- import { A as enqueueCredsSave, M as waitForCredsSaveQueueWithTimeout, N as writeCredsJsonAtomically, P as writeWebCredsRawAtomically, b as restoreCredsFromBackupIfNeeded, u as readCredsJsonRaw, y as resolveDefaultWebAuthDir } from "./auth-store-CtpBqH5S.js";
1
+ import { c as resolveWebCredsPath, s as resolveWebCredsBackupPath, t as assertWebCredsPathRegularFileOrMissing } from "./creds-files-Drg3usj1.js";
2
+ import { A as enqueueCredsSave, M as waitForCredsSaveQueueWithTimeout, N as writeCredsJsonAtomically, P as writeWebCredsRawAtomically, b as restoreCredsFromBackupIfNeeded, u as readCredsJsonRaw, y as resolveDefaultWebAuthDir } from "./auth-store-ZWaclAbd.js";
3
3
  import { n as getStatusCode } from "./session-errors-JuazczrA.js";
4
4
  import { a as makeWASocket, i as makeCacheableSignalKeyStore, n as createBaileysSignalRepository, r as fetchLatestBaileysVersion, s as useMultiFileAuthState } from "./session.runtime-Nsqaehbd.js";
5
5
  import { VERSION, formatCliCommand } from "openclaw/plugin-sdk/cli-runtime";
@@ -22,7 +22,7 @@ var WhatsAppConnectionOwnerBusyError = class extends Error {
22
22
  this.name = "WhatsAppConnectionOwnerBusyError";
23
23
  }
24
24
  };
25
- const OWNER_LOCK_STALE_MS = 5 * 6e4;
25
+ const OWNER_LOCK_STALE_MS = 3e5;
26
26
  const GATEWAY_LOCAL_OWNER_WAIT_MS = 15e4;
27
27
  const processOwners = /* @__PURE__ */ new Map();
28
28
  function ownershipCancelledError(signal) {
@@ -325,7 +325,8 @@ async function createWaSocket(printQr, verbose, opts = {}) {
325
325
  return await createWaSocketInternal(printQr, verbose, opts, "normal");
326
326
  }
327
327
  async function createWaSocketInternal(printQr, verbose, opts, receiveMode) {
328
- const logger = toPinoLikeLogger(getChildLogger({ module: "baileys" }, { level: verbose ? "info" : "silent" }), verbose ? "info" : "silent");
328
+ const baseLogger = getChildLogger({ module: "baileys" }, { level: verbose ? "info" : "silent" });
329
+ const logger = toPinoLikeLogger(baseLogger, verbose ? "info" : "silent");
329
330
  const authDir = resolveUserPath(opts.authDir ?? resolveDefaultWebAuthDir());
330
331
  await rejectUnsafeWebCredsPath(authDir);
331
332
  await opts.beforeCredentialPersistence?.();
@@ -357,13 +358,14 @@ async function createWaSocketInternal(printQr, verbose, opts, receiveMode) {
357
358
  else pendingSocketAbort = { error };
358
359
  opts.onCredentialPersistenceError?.(error);
359
360
  };
360
- const cachedSignalKeys = makeCacheableSignalKeyStore(opts.beforeCredentialPersistence ? {
361
+ const persistedSignalKeys = opts.beforeCredentialPersistence ? {
361
362
  ...state.keys,
362
363
  async set(data) {
363
364
  await opts.beforeCredentialPersistence?.();
364
365
  await state.keys.set(data);
365
366
  }
366
- } : state.keys, logger);
367
+ } : state.keys;
368
+ const cachedSignalKeys = makeCacheableSignalKeyStore(persistedSignalKeys, logger);
367
369
  const signalKeys = opts.beforeCredentialPersistence ? {
368
370
  ...cachedSignalKeys,
369
371
  get(type, ids) {
@@ -542,7 +544,8 @@ async function waitForWaConnection(sock, options = { timeout: "none" }) {
542
544
  }
543
545
  if (update.connection === "close") {
544
546
  cleanup();
545
- reject(toErrorObject(update.lastDisconnect?.error ?? update.lastDisconnect ?? /* @__PURE__ */ new Error("Connection closed"), "Non-Error rejection"));
547
+ const disconnectError = update.lastDisconnect?.error ?? update.lastDisconnect;
548
+ reject(toErrorObject(disconnectError ?? /* @__PURE__ */ new Error("Connection closed"), "Non-Error rejection"));
546
549
  }
547
550
  };
548
551
  sock.ev.on("connection.update", handler);
@@ -282,8 +282,7 @@ function markdownToWhatsAppChunks(text, limit, tableMode = "bullets", chunkMode
282
282
  if (!text.trim()) return chunkMarkdownTextWithMode(text, limit, chunkMode);
283
283
  const { ir, escapedMarkers } = prepareWhatsAppMarkdown(text, tableMode);
284
284
  const render = (chunk) => renderWhatsAppMarkdownIR(chunk, escapedMarkers);
285
- const rendered = render(ir);
286
- let chunks = ir.styles.length === 0 && ir.links.length === 0 ? chunkMarkdownTextWithMode(rendered, limit, chunkMode) : splitWhatsAppIRForChunkMode(ir, limit, chunkMode).flatMap((source) => renderMarkdownIRChunksWithinLimit({
285
+ let chunks = ir.styles.length === 0 && ir.links.length === 0 ? chunkMarkdownTextWithMode(render(ir), limit, chunkMode) : splitWhatsAppIRForChunkMode(ir, limit, chunkMode).flatMap((source) => renderMarkdownIRChunksWithinLimit({
287
286
  ir: source,
288
287
  limit,
289
288
  renderChunk: render,
@@ -1,4 +1,4 @@
1
- import "./targets-runtime-TMk0lGuy.js";
1
+ import "./targets-runtime-RBjx3pg_.js";
2
2
  import { sanitizeAssistantVisibleText, sanitizeAssistantVisibleTextWithProfile, stripToolCallXmlTags } from "openclaw/plugin-sdk/text-chunking";
3
3
  import { normalizeE164, resolveUserPath as resolveUserPath$1 } from "openclaw/plugin-sdk/text-utility-runtime";
4
4
  export { stripToolCallXmlTags as a, sanitizeAssistantVisibleTextWithProfile as i, resolveUserPath$1 as n, sanitizeAssistantVisibleText as r, normalizeE164 as t };
@@ -2,12 +2,52 @@ version: 2
2
2
  updates:
3
3
  - package-ecosystem: "github-actions"
4
4
  directory: "/"
5
+ commit-message:
6
+ # Prefix all commit messages with "chore: "
7
+ prefix: "chore"
5
8
  schedule:
6
- interval: "monthly"
9
+ interval: "weekly"
10
+ cooldown:
11
+ default-days: 7
12
+ allow:
13
+ - dependency-name: "*"
14
+ update-types:
15
+ - "version-update:semver-major"
7
16
  open-pull-requests-limit: 10
8
17
 
9
18
  - package-ecosystem: "npm"
10
19
  directory: "/"
20
+ commit-message:
21
+ # Prefix all commit messages with "chore: "
22
+ prefix: "chore"
11
23
  schedule:
12
- interval: "monthly"
24
+ interval: "weekly"
25
+ cooldown:
26
+ default-days: 7
27
+ versioning-strategy: "increase-if-necessary"
28
+ allow:
29
+ - dependency-name: "*"
30
+ update-types:
31
+ - "version-update:semver-major"
32
+ ignore:
33
+ # TODO: remove ignore until neostandard support ESLint 10
34
+ - dependency-name: "eslint"
35
+ - dependency-name: "neostandard"
36
+ - dependency-name: "@stylistic/*"
13
37
  open-pull-requests-limit: 10
38
+ groups:
39
+ # Production dependencies with breaking changes
40
+ dependencies:
41
+ dependency-type: "production"
42
+ # ESLint related dependencies
43
+ dev-dependencies-eslint:
44
+ patterns:
45
+ - "eslint"
46
+ - "neostandard"
47
+ - "@stylistic/*"
48
+ # TypeScript related dependencies
49
+ dev-dependencies-typescript:
50
+ patterns:
51
+ - "@types/*"
52
+ - "tstyche"
53
+ - "typescript"
@@ -14,9 +14,20 @@ on:
14
14
  - 'docs/**'
15
15
  - '*.md'
16
16
 
17
+ # This allows a subsequently queued workflow run to interrupt previous runs
18
+ concurrency:
19
+ group: "${{ github.workflow }}-${{ github.event.pull_request.head.label || github.head_ref || github.ref }}"
20
+ cancel-in-progress: true
21
+
22
+ permissions:
23
+ contents: read
24
+
17
25
  jobs:
18
26
  test:
19
- uses: fastify/workflows/.github/workflows/plugins-ci.yml@v5
27
+ permissions:
28
+ contents: write
29
+ pull-requests: write
30
+ uses: fastify/workflows/.github/workflows/plugins-ci.yml@2073dc8e1f9e172bf42daa3843c9dbd31af1e8cb # v6.0.0
20
31
  with:
21
32
  license-check: true
22
33
  lint: true
@@ -0,0 +1,19 @@
1
+ name: Lock Threads
2
+
3
+ on:
4
+ schedule:
5
+ - cron: '0 0 1 * *'
6
+ workflow_dispatch:
7
+
8
+ concurrency:
9
+ group: lock
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ jobs:
15
+ lock-threads:
16
+ permissions:
17
+ issues: write
18
+ pull-requests: write
19
+ uses: fastify/workflows/.github/workflows/lock-threads.yml@2073dc8e1f9e172bf42daa3843c9dbd31af1e8cb # v6.0.0
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) Fastify
3
+ Copyright (c) 2020-present The Fastify team <https://github.com/fastify/fastify#team>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal