@openclaw/msteams 2026.5.24-beta.2 → 2026.5.26-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/api.js CHANGED
@@ -1,3 +1,3 @@
1
- import { i as msteamsSetupAdapter, n as openDelegatedOAuthUrl, r as createMSTeamsSetupWizardBase, t as msteamsSetupWizard } from "./setup-surface-Clzyi6mr.js";
2
- import { t as msteamsPlugin } from "./channel-GgLcEkGO.js";
1
+ import { i as msteamsSetupAdapter, n as openDelegatedOAuthUrl, r as createMSTeamsSetupWizardBase, t as msteamsSetupWizard } from "./setup-surface-f9pZ7G9O.js";
2
+ import { t as msteamsPlugin } from "./channel-DZt_jPWh.js";
3
3
  export { createMSTeamsSetupWizardBase, msteamsPlugin, msteamsSetupAdapter, msteamsSetupWizard, openDelegatedOAuthUrl };
@@ -1,6 +1,6 @@
1
1
  import { O as resolveNestedAllowlistDecision, S as normalizeChannelSlug, T as resolveChannelEntryMatchWithFallback, _ as isDangerousNameMatchingEnabled, i as buildChannelKeyCandidates, k as resolveToolsBySender, o as buildProbeChannelStatusSummary, r as PAIRING_APPROVED_MESSAGE, s as chunkTextForOutbound, t as DEFAULT_ACCOUNT_ID, u as createDefaultChannelRuntimeState, w as resolveAllowlistMatchSimple } from "./runtime-api-CJC3UvbX.js";
2
- import { h as resolveMSTeamsCredentials } from "./graph-users-B73-A6hC.js";
3
- import { a as looksLikeMSTeamsTargetId, c as parseMSTeamsConversationId, d as resolveMSTeamsUserAllowlist, i as msteamsSetupAdapter, l as parseMSTeamsTeamChannelInput, o as normalizeMSTeamsMessagingTarget, s as normalizeMSTeamsUserInput, t as msteamsSetupWizard, u as resolveMSTeamsChannelAllowlist } from "./setup-surface-Clzyi6mr.js";
2
+ import { h as resolveMSTeamsCredentials } from "./graph-users-CwYemYEo.js";
3
+ import { a as looksLikeMSTeamsTargetId, c as parseMSTeamsConversationId, d as resolveMSTeamsUserAllowlist, i as msteamsSetupAdapter, l as parseMSTeamsTeamChannelInput, o as normalizeMSTeamsMessagingTarget, s as normalizeMSTeamsUserInput, t as msteamsSetupWizard, u as resolveMSTeamsChannelAllowlist } from "./setup-surface-f9pZ7G9O.js";
4
4
  import { t as MSTeamsChannelConfigSchema } from "./config-schema-CuksCQKC.js";
5
5
  import { describeAccountSnapshot } from "openclaw/plugin-sdk/account-helpers";
6
6
  import { formatAllowFromLowercase } from "openclaw/plugin-sdk/allow-from";
@@ -14,7 +14,7 @@ import { adaptMessagePresentationForChannel, normalizeMessagePresentation } from
14
14
  import { createLazyRuntimeNamedExport } from "openclaw/plugin-sdk/lazy-runtime";
15
15
  import { createRuntimeOutboundDelegates } from "openclaw/plugin-sdk/outbound-runtime";
16
16
  import { createComputedAccountStatusAdapter } from "openclaw/plugin-sdk/status-helpers";
17
- import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
17
+ import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString, normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
18
18
  import { Type } from "typebox";
19
19
  import { createResolvedApproverActionAuthAdapter, resolveApprovalApprovers } from "openclaw/plugin-sdk/approval-auth-runtime";
20
20
  //#region extensions/msteams/src/approval-auth.ts
@@ -331,7 +331,7 @@ const collectMSTeamsSecurityWarnings = createAllowlistProviderGroupPolicyWarning
331
331
  resolveGroupPolicy: ({ cfg }) => cfg.channels?.msteams?.groupPolicy,
332
332
  collect: ({ groupPolicy }) => groupPolicy === "open" ? ["- MS Teams groups: groupPolicy=\"open\" allows any member to trigger (mention-gated). Set channels.msteams.groupPolicy=\"allowlist\" + channels.msteams.groupAllowFrom to restrict senders."] : []
333
333
  });
334
- const loadMSTeamsChannelRuntime = createLazyRuntimeNamedExport(() => import("./channel.runtime-D_q6kao-.js"), "msTeamsChannelRuntime");
334
+ const loadMSTeamsChannelRuntime = createLazyRuntimeNamedExport(() => import("./channel.runtime-BJgDc9SC.js"), "msTeamsChannelRuntime");
335
335
  const resolveMSTeamsChannelConfig = (cfg) => ({
336
336
  allowFrom: cfg.channels?.msteams?.allowFrom,
337
337
  defaultTo: cfg.channels?.msteams?.defaultTo
@@ -1092,8 +1092,8 @@ const msteamsPlugin = createChatChannelPlugin({
1092
1092
  if (appId) lines.push({ text: `App: ${appId}` });
1093
1093
  const graph = teamsProbe?.graph;
1094
1094
  if (graph) {
1095
- const roles = Array.isArray(graph.roles) ? graph.roles.map((role) => role.trim()).filter(Boolean) : [];
1096
- const scopes = Array.isArray(graph.scopes) ? graph.scopes.map((scope) => scope.trim()).filter(Boolean) : [];
1095
+ const roles = Array.isArray(graph.roles) ? normalizeStringEntries(graph.roles) : [];
1096
+ const scopes = Array.isArray(graph.scopes) ? normalizeStringEntries(graph.scopes) : [];
1097
1097
  const formatPermission = (permission) => {
1098
1098
  const hint = TEAMS_GRAPH_PERMISSION_HINTS[permission];
1099
1099
  return hint ? `${permission} (${hint})` : permission;
@@ -1117,7 +1117,7 @@ const msteamsPlugin = createChatChannelPlugin({
1117
1117
  })
1118
1118
  }),
1119
1119
  gateway: { startAccount: async (ctx) => {
1120
- const { monitorMSTeamsProvider } = await import("./src-Cxm8Wa25.js");
1120
+ const { monitorMSTeamsProvider } = await import("./src-B2Yc1zLS.js");
1121
1121
  const port = ctx.cfg.channels?.msteams?.webhook?.port ?? 3978;
1122
1122
  ctx.setStatus({
1123
1123
  accountId: ctx.accountId,
@@ -1,2 +1,2 @@
1
- import { t as msteamsPlugin } from "./channel-GgLcEkGO.js";
1
+ import { t as msteamsPlugin } from "./channel-DZt_jPWh.js";
2
2
  export { msteamsPlugin };
@@ -1,8 +1,8 @@
1
- import { s as chunkTextForOutbound } from "./runtime-api-CJC3UvbX.js";
2
- import { a as fetchGraphJson, c as normalizeQuery, d as postGraphJson, f as resolveGraphToken, i as fetchGraphAbsoluteUrl, l as patchGraphJson, n as deleteGraphRequest, o as listChannelsForTeam, r as escapeOData, s as listTeamsByName, t as searchGraphUsers, u as postGraphBetaJson } from "./graph-users-B73-A6hC.js";
3
- import { n as MSTEAMS_PRESENTATION_CAPABILITIES, r as buildMSTeamsPresentationCard } from "./channel-GgLcEkGO.js";
4
- import { S as createMSTeamsConversationStoreFs, a as sendMessageMSTeams, b as createMSTeamsPollStoreFs, i as sendAdaptiveCardMSTeams, n as deleteMessageMSTeams, o as sendPollMSTeams, r as editMessageMSTeams, t as probeMSTeams } from "./probe-BmuQDgsE.js";
5
- import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
1
+ import { C as normalizeStringEntries$1, s as chunkTextForOutbound } from "./runtime-api-CJC3UvbX.js";
2
+ import { a as fetchGraphJson, c as normalizeQuery, d as postGraphJson, f as resolveGraphToken, i as fetchGraphAbsoluteUrl, l as patchGraphJson, n as deleteGraphRequest, o as listChannelsForTeam, r as escapeOData, s as listTeamsByName, t as searchGraphUsers, u as postGraphBetaJson } from "./graph-users-CwYemYEo.js";
3
+ import { n as MSTEAMS_PRESENTATION_CAPABILITIES, r as buildMSTeamsPresentationCard } from "./channel-DZt_jPWh.js";
4
+ import { S as createMSTeamsConversationStoreFs, a as sendMessageMSTeams, b as createMSTeamsPollStoreFs, i as sendAdaptiveCardMSTeams, n as deleteMessageMSTeams, o as sendPollMSTeams, r as editMessageMSTeams, t as probeMSTeams } from "./probe-DC3tmy9c.js";
5
+ import { normalizeLowercaseStringOrEmpty, normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
6
6
  import { resolvePayloadMediaUrls, resolveTextChunksWithFallback, sendPayloadMediaSequence } from "openclaw/plugin-sdk/reply-payload";
7
7
  import { attachChannelToResult, createAttachedChannelResultAdapter } from "openclaw/plugin-sdk/channel-send-result";
8
8
  import { resolveOutboundSendDep } from "openclaw/plugin-sdk/outbound-send-deps";
@@ -33,7 +33,7 @@ async function listMSTeamsDirectoryGroupsLive(params) {
33
33
  if (!rawQuery) return [];
34
34
  const token = await resolveGraphToken(params.cfg);
35
35
  const limit = typeof params.limit === "number" && params.limit > 0 ? params.limit : 20;
36
- const [teamQuery, channelQuery] = rawQuery.includes("/") ? rawQuery.split("/", 2).map((part) => part.trim()).filter(Boolean) : [rawQuery, null];
36
+ const [teamQuery, channelQuery] = rawQuery.includes("/") ? normalizeStringEntries(rawQuery.split("/", 2)) : [rawQuery, null];
37
37
  const teams = await listTeamsByName(token, teamQuery);
38
38
  const results = [];
39
39
  for (const team of teams) {
@@ -559,10 +559,10 @@ const msTeamsChannelRuntime = {
559
559
  to,
560
560
  card: presentationCard
561
561
  }));
562
- const mediaUrls = resolvePayloadMediaUrls({
562
+ const mediaUrls = normalizeStringEntries$1(resolvePayloadMediaUrls({
563
563
  ...payload,
564
564
  mediaUrl: payload.mediaUrl ?? mediaUrl
565
- }).map((url) => url.trim()).filter(Boolean);
565
+ }));
566
566
  if (mediaUrls.length > 0) {
567
567
  const send = resolveOutboundSendDep(deps, "msteams") ?? ((to, text, opts) => sendMessageMSTeams({
568
568
  cfg,
@@ -1,7 +1,7 @@
1
1
  import { M as getMSTeamsRuntime, h as fetchWithSsrFGuard$1 } from "./runtime-api-CJC3UvbX.js";
2
2
  import { n as refreshMSTeamsDelegatedTokens } from "./oauth.token-BNbWziwM.js";
3
3
  import { createRequire } from "node:module";
4
- import { isRecord as isRecord$2, normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
4
+ import { isRecord, isRecord as isRecord$1, normalizeLowercaseStringOrEmpty, normalizeOptionalString, normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  import { fetchWithSsrFGuard } from "openclaw/plugin-sdk/ssrf-runtime";
6
6
  import { readProviderJsonResponse } from "openclaw/plugin-sdk/provider-http";
7
7
  import { Buffer } from "node:buffer";
@@ -124,7 +124,7 @@ function tryBuildGraphSharesUrlForSharedLink(url) {
124
124
  function readNestedString(value, keys) {
125
125
  let current = value;
126
126
  for (const key of keys) {
127
- if (!isRecord$2(current)) return;
127
+ if (!isRecord$1(current)) return;
128
128
  current = current[key];
129
129
  }
130
130
  return normalizeOptionalString(current);
@@ -155,7 +155,7 @@ function isLikelyImageAttachment(att) {
155
155
  const name = typeof att.name === "string" ? att.name : "";
156
156
  if (contentType.startsWith("image/")) return true;
157
157
  if (IMAGE_EXT_RE.test(name)) return true;
158
- if (contentType === "application/vnd.microsoft.teams.file.download.info" && isRecord$2(att.content)) {
158
+ if (contentType === "application/vnd.microsoft.teams.file.download.info" && isRecord$1(att.content)) {
159
159
  const fileType = typeof att.content.fileType === "string" ? att.content.fileType : "";
160
160
  if (fileType && IMAGE_EXT_RE.test(`x.${fileType}`)) return true;
161
161
  const fileName = typeof att.content.fileName === "string" ? att.content.fileName : "";
@@ -168,7 +168,7 @@ function isLikelyImageAttachment(att) {
168
168
  * Used when downloading all files, not just images.
169
169
  */
170
170
  function isDownloadableAttachment(att) {
171
- if ((normalizeContentType(att.contentType) ?? "") === "application/vnd.microsoft.teams.file.download.info" && isRecord$2(att.content) && typeof att.content.downloadUrl === "string") return true;
171
+ if ((normalizeContentType(att.contentType) ?? "") === "application/vnd.microsoft.teams.file.download.info" && isRecord$1(att.content) && typeof att.content.downloadUrl === "string") return true;
172
172
  if (typeof att.contentUrl === "string" && att.contentUrl.trim()) return true;
173
173
  return false;
174
174
  }
@@ -178,7 +178,7 @@ function isHtmlAttachment(att) {
178
178
  function extractHtmlFromAttachment(att) {
179
179
  if (!isHtmlAttachment(att)) return;
180
180
  if (typeof att.content === "string") return att.content;
181
- if (!isRecord$2(att.content)) return;
181
+ if (!isRecord$1(att.content)) return;
182
182
  return typeof att.content.text === "string" ? att.content.text : typeof att.content.body === "string" ? att.content.body : typeof att.content.content === "string" ? att.content.content : void 0;
183
183
  }
184
184
  function canonicalizeInlineBase64Payload(value) {
@@ -405,9 +405,6 @@ async function safeFetchWithPolicy(params) {
405
405
  }
406
406
  //#endregion
407
407
  //#region extensions/msteams/src/errors.ts
408
- function isRecord$1(value) {
409
- return typeof value === "object" && value !== null && !Array.isArray(value);
410
- }
411
408
  function formatUnknownError(err) {
412
409
  if (err instanceof Error) return err.message;
413
410
  if (typeof err === "string") return err;
@@ -423,7 +420,7 @@ function formatUnknownError(err) {
423
420
  }
424
421
  }
425
422
  function extractStatusCode(err) {
426
- if (!isRecord$1(err)) return null;
423
+ if (!isRecord(err)) return null;
427
424
  const direct = err.statusCode ?? err.status;
428
425
  if (typeof direct === "number" && Number.isFinite(direct)) return direct;
429
426
  if (typeof direct === "string") {
@@ -431,7 +428,7 @@ function extractStatusCode(err) {
431
428
  if (Number.isFinite(parsed)) return parsed;
432
429
  }
433
430
  const response = err.response;
434
- if (isRecord$1(response)) {
431
+ if (isRecord(response)) {
435
432
  const status = response.status;
436
433
  if (typeof status === "number" && Number.isFinite(status)) return status;
437
434
  if (typeof status === "string") {
@@ -442,20 +439,20 @@ function extractStatusCode(err) {
442
439
  return null;
443
440
  }
444
441
  function extractErrorCode(err) {
445
- if (!isRecord$1(err)) return null;
442
+ if (!isRecord(err)) return null;
446
443
  const direct = err.code;
447
444
  if (typeof direct === "string" && direct.trim()) return direct;
448
445
  const response = err.response;
449
- if (!isRecord$1(response)) return null;
446
+ if (!isRecord(response)) return null;
450
447
  const body = response.body;
451
- if (isRecord$1(body)) {
448
+ if (isRecord(body)) {
452
449
  const error = body.error;
453
- if (isRecord$1(error) && typeof error.code === "string" && error.code.trim()) return error.code;
450
+ if (isRecord(error) && typeof error.code === "string" && error.code.trim()) return error.code;
454
451
  }
455
452
  return null;
456
453
  }
457
454
  function extractRetryAfterMs(err) {
458
- if (!isRecord$1(err)) return null;
455
+ if (!isRecord(err)) return null;
459
456
  const direct = err.retryAfterMs ?? err.retry_after_ms;
460
457
  if (typeof direct === "number" && Number.isFinite(direct) && direct >= 0) return direct;
461
458
  const retryAfter = err.retryAfter ?? err.retry_after;
@@ -465,10 +462,10 @@ function extractRetryAfterMs(err) {
465
462
  if (Number.isFinite(parsed) && parsed >= 0) return parsed * 1e3;
466
463
  }
467
464
  const response = err.response;
468
- if (!isRecord$1(response)) return null;
465
+ if (!isRecord(response)) return null;
469
466
  const headers = response.headers;
470
467
  if (!headers) return null;
471
- if (isRecord$1(headers)) {
468
+ if (isRecord(headers)) {
472
469
  const raw = headers["retry-after"] ?? headers["Retry-After"];
473
470
  if (typeof raw === "string") {
474
471
  const parsed = Number.parseFloat(raw);
@@ -531,7 +528,7 @@ function classifyMSTeamsSendError(err) {
531
528
  errorCode
532
529
  };
533
530
  if (statusCode == null) {
534
- const networkCode = isRecord$1(err) && typeof err.code === "string" ? err.code : null;
531
+ const networkCode = isRecord(err) && typeof err.code === "string" ? err.code : null;
535
532
  if (networkCode === "ECONNREFUSED" || networkCode === "ENOTFOUND" || networkCode === "EHOSTUNREACH" || networkCode === "ETIMEDOUT" || networkCode === "ECONNRESET") return {
536
533
  kind: "network",
537
534
  errorCode: networkCode
@@ -959,7 +956,7 @@ function getAudienceClaims(payload) {
959
956
  const trimmed = audience.trim();
960
957
  return trimmed ? [trimmed] : [];
961
958
  }
962
- if (Array.isArray(audience)) return audience.filter((value) => typeof value === "string").map((value) => value.trim()).filter(Boolean);
959
+ if (Array.isArray(audience)) return normalizeStringEntries(audience.filter((value) => typeof value === "string"));
963
960
  return [];
964
961
  }
965
962
  function normalizeBotIdentityClaim(value) {
@@ -1408,4 +1405,4 @@ async function searchGraphUsers(params) {
1408
1405
  })).value ?? [];
1409
1406
  }
1410
1407
  //#endregion
1411
- export { ATTACHMENT_TAG_RE as A, isLikelyImageAttachment as B, loadMSTeamsSdkWithAuth as C, formatMSTeamsSendErrorHint as D, classifyMSTeamsSendError as E, estimateBase64DecodedBytes as F, resolveAttachmentFetchPolicy as G, isUrlAllowed as H, extractHtmlFromAttachment as I, safeFetchWithPolicy as J, resolveMediaSsrfPolicy as K, extractInlineImageCandidates as L, IMG_SRC_RE as M, applyAuthorizationHeaderForUrl as N, formatUnknownError as O, encodeGraphShareId as P, inferPlaceholder as R, createMSTeamsTokenProvider as S, ensureUserAgentHeader as T, normalizeContentType as U, isRecord$2 as V, readNestedString as W, tryBuildGraphSharesUrlForSharedLink as X, safeHostForUrl as Y, resolveMSTeamsStorePath as _, fetchGraphJson as a, createBotFrameworkJwtValidator as b, normalizeQuery as c, postGraphJson as d, resolveGraphToken as f, saveDelegatedTokens as g, resolveMSTeamsCredentials as h, fetchGraphAbsoluteUrl as i, GRAPH_ROOT as j, isRevokedProxyError as k, patchGraphJson as l, loadDelegatedTokens as m, deleteGraphRequest as n, listChannelsForTeam as o, hasConfiguredMSTeamsCredentials as p, resolveRequestUrl as q, escapeOData as r, listTeamsByName as s, searchGraphUsers as t, postGraphBetaJson as u, normalizeSecretInputString as v, buildUserAgent as w, createMSTeamsAdapter as x, readAccessToken as y, isDownloadableAttachment as z };
1408
+ export { ATTACHMENT_TAG_RE as A, isLikelyImageAttachment as B, loadMSTeamsSdkWithAuth as C, formatMSTeamsSendErrorHint as D, classifyMSTeamsSendError as E, estimateBase64DecodedBytes as F, resolveAttachmentFetchPolicy as G, isUrlAllowed as H, extractHtmlFromAttachment as I, safeFetchWithPolicy as J, resolveMediaSsrfPolicy as K, extractInlineImageCandidates as L, IMG_SRC_RE as M, applyAuthorizationHeaderForUrl as N, formatUnknownError as O, encodeGraphShareId as P, inferPlaceholder as R, createMSTeamsTokenProvider as S, ensureUserAgentHeader as T, normalizeContentType as U, isRecord$1 as V, readNestedString as W, tryBuildGraphSharesUrlForSharedLink as X, safeHostForUrl as Y, resolveMSTeamsStorePath as _, fetchGraphJson as a, createBotFrameworkJwtValidator as b, normalizeQuery as c, postGraphJson as d, resolveGraphToken as f, saveDelegatedTokens as g, resolveMSTeamsCredentials as h, fetchGraphAbsoluteUrl as i, GRAPH_ROOT as j, isRevokedProxyError as k, patchGraphJson as l, loadDelegatedTokens as m, deleteGraphRequest as n, listChannelsForTeam as o, hasConfiguredMSTeamsCredentials as p, resolveRequestUrl as q, escapeOData as r, listTeamsByName as s, searchGraphUsers as t, postGraphBetaJson as u, normalizeSecretInputString as v, buildUserAgent as w, createMSTeamsAdapter as x, readAccessToken as y, isDownloadableAttachment as z };
@@ -1,8 +1,8 @@
1
- import { C as normalizeStringEntries, E as resolveChannelMediaMaxBytes, M as getMSTeamsRuntime, d as detectMime, g as getFileExtension, m as extractOriginalFilename, p as extensionForMime, y as loadOutboundMediaFromUrl } from "./runtime-api-CJC3UvbX.js";
2
- import { C as loadMSTeamsSdkWithAuth, D as formatMSTeamsSendErrorHint, E as classifyMSTeamsSendError, O as formatUnknownError, S as createMSTeamsTokenProvider, _ as resolveMSTeamsStorePath, h as resolveMSTeamsCredentials, k as isRevokedProxyError, m as loadDelegatedTokens, w as buildUserAgent, x as createMSTeamsAdapter, y as readAccessToken } from "./graph-users-B73-A6hC.js";
3
- import { a as resolveMSTeamsReplyPolicy, o as resolveMSTeamsRouteConfig } from "./channel-GgLcEkGO.js";
1
+ import { C as normalizeStringEntries$1, E as resolveChannelMediaMaxBytes, M as getMSTeamsRuntime, d as detectMime, g as getFileExtension, m as extractOriginalFilename, p as extensionForMime, y as loadOutboundMediaFromUrl } from "./runtime-api-CJC3UvbX.js";
2
+ import { C as loadMSTeamsSdkWithAuth, D as formatMSTeamsSendErrorHint, E as classifyMSTeamsSendError, O as formatUnknownError, S as createMSTeamsTokenProvider, _ as resolveMSTeamsStorePath, h as resolveMSTeamsCredentials, k as isRevokedProxyError, m as loadDelegatedTokens, w as buildUserAgent, x as createMSTeamsAdapter, y as readAccessToken } from "./graph-users-CwYemYEo.js";
3
+ import { a as resolveMSTeamsReplyPolicy, o as resolveMSTeamsRouteConfig } from "./channel-DZt_jPWh.js";
4
4
  import { createMessageReceiptFromOutboundResults } from "openclaw/plugin-sdk/channel-message";
5
- import { isRecord, normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
5
+ import { isRecord, normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString, normalizeStringEntries, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
6
6
  import { withFileLock } from "openclaw/plugin-sdk/file-lock";
7
7
  import { resolveSendableOutboundReplyParts } from "openclaw/plugin-sdk/reply-payload";
8
8
  import { convertMarkdownTables } from "openclaw/plugin-sdk/text-chunking";
@@ -195,7 +195,7 @@ function extractSelections(value) {
195
195
  if (Array.isArray(value)) return value.map(normalizeChoiceValue).filter((entry) => Boolean(entry));
196
196
  const normalized = normalizeChoiceValue(value);
197
197
  if (!normalized) return [];
198
- if (normalized.includes(",")) return normalized.split(",").map((entry) => entry.trim()).filter(Boolean);
198
+ if (normalized.includes(",")) return normalizeStringEntries(normalized.split(","));
199
199
  return [normalized];
200
200
  }
201
201
  function readNestedValue(value, keys) {
@@ -319,8 +319,7 @@ function pruneToLimit$1(polls) {
319
319
  function normalizeMSTeamsPollSelections(poll, selections) {
320
320
  const maxSelections = Math.max(1, poll.maxSelections);
321
321
  const mapped = selections.map((entry) => Number.parseInt(entry, 10)).filter((value) => Number.isFinite(value)).filter((value) => value >= 0 && value < poll.options.length).map((value) => String(value));
322
- const limited = maxSelections > 1 ? mapped.slice(0, maxSelections) : mapped.slice(0, 1);
323
- return Array.from(new Set(limited));
322
+ return uniqueStrings(maxSelections > 1 ? mapped.slice(0, maxSelections) : mapped.slice(0, 1));
324
323
  }
325
324
  function createMSTeamsPollStoreFs(params) {
326
325
  const filePath = resolveMSTeamsStorePath({
@@ -2118,12 +2117,12 @@ function decodeJwtPayload(token) {
2118
2117
  }
2119
2118
  function readStringArray(value) {
2120
2119
  if (!Array.isArray(value)) return;
2121
- const out = normalizeStringEntries(value);
2120
+ const out = normalizeStringEntries$1(value);
2122
2121
  return out.length > 0 ? out : void 0;
2123
2122
  }
2124
2123
  function readScopes(value) {
2125
2124
  if (typeof value !== "string") return;
2126
- const out = value.split(/\s+/).map((entry) => entry.trim()).filter(Boolean);
2125
+ const out = normalizeStringEntries$1(value.split(/\s+/));
2127
2126
  return out.length > 0 ? out : void 0;
2128
2127
  }
2129
2128
  async function probeMSTeams(cfg) {
@@ -1,5 +1,5 @@
1
- import { h as resolveMSTeamsCredentials } from "./graph-users-B73-A6hC.js";
2
- import { i as msteamsSetupAdapter, t as msteamsSetupWizard } from "./setup-surface-Clzyi6mr.js";
1
+ import { h as resolveMSTeamsCredentials } from "./graph-users-CwYemYEo.js";
2
+ import { i as msteamsSetupAdapter, t as msteamsSetupWizard } from "./setup-surface-f9pZ7G9O.js";
3
3
  import { t as MSTeamsChannelConfigSchema } from "./config-schema-CuksCQKC.js";
4
4
  import { describeAccountSnapshot } from "openclaw/plugin-sdk/account-helpers";
5
5
  import { formatAllowFromLowercase } from "openclaw/plugin-sdk/allow-from";
@@ -1,4 +1,4 @@
1
- import { O as formatUnknownError, c as normalizeQuery, f as resolveGraphToken, g as saveDelegatedTokens, h as resolveMSTeamsCredentials, o as listChannelsForTeam, p as hasConfiguredMSTeamsCredentials, s as listTeamsByName, t as searchGraphUsers, v as normalizeSecretInputString } from "./graph-users-B73-A6hC.js";
1
+ import { O as formatUnknownError, c as normalizeQuery, f as resolveGraphToken, g as saveDelegatedTokens, h as resolveMSTeamsCredentials, o as listChannelsForTeam, p as hasConfiguredMSTeamsCredentials, s as listTeamsByName, t as searchGraphUsers, v as normalizeSecretInputString } from "./graph-users-CwYemYEo.js";
2
2
  import { mapAllowlistResolutionInputs } from "openclaw/plugin-sdk/allow-from";
3
3
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString } from "openclaw/plugin-sdk/string-coerce-runtime";
4
4
  import { DEFAULT_ACCOUNT_ID, createSetupTranslator, createStandardChannelSetupStatus, createTopLevelChannelAllowFromSetter, createTopLevelChannelDmPolicy, createTopLevelChannelGroupPolicySetter, mergeAllowFromEntries, splitSetupEntries } from "openclaw/plugin-sdk/setup";
@@ -1,11 +1,11 @@
1
1
  import { A as summarizeMapping, D as resolveDefaultGroupPolicy, E as resolveChannelMediaMaxBytes, M as getMSTeamsRuntime, N as getOptionalMSTeamsRuntime, _ as isDangerousNameMatchingEnabled, a as buildMediaPayload, b as logTypingFailure, c as createChannelMessageReplyPipeline, f as dispatchReplyFromConfigWithSettledDispatcher$1, l as createChannelPairingController, n as DEFAULT_WEBHOOK_MAX_BODY_BYTES, t as DEFAULT_ACCOUNT_ID, v as keepHttpServerTaskAlive, x as mergeAllowlist } from "./runtime-api-CJC3UvbX.js";
2
- import { A as ATTACHMENT_TAG_RE, B as isLikelyImageAttachment, C as loadMSTeamsSdkWithAuth, D as formatMSTeamsSendErrorHint, E as classifyMSTeamsSendError, F as estimateBase64DecodedBytes, G as resolveAttachmentFetchPolicy, H as isUrlAllowed, I as extractHtmlFromAttachment, J as safeFetchWithPolicy, K as resolveMediaSsrfPolicy, L as extractInlineImageCandidates, M as IMG_SRC_RE, N as applyAuthorizationHeaderForUrl, O as formatUnknownError, P as encodeGraphShareId, R as inferPlaceholder, S as createMSTeamsTokenProvider, T as ensureUserAgentHeader, U as normalizeContentType, V as isRecord$1, W as readNestedString, X as tryBuildGraphSharesUrlForSharedLink, Y as safeHostForUrl, _ as resolveMSTeamsStorePath, a as fetchGraphJson, b as createBotFrameworkJwtValidator, h as resolveMSTeamsCredentials, j as GRAPH_ROOT, q as resolveRequestUrl, w as buildUserAgent, x as createMSTeamsAdapter, z as isDownloadableAttachment } from "./graph-users-B73-A6hC.js";
3
- import { d as resolveMSTeamsUserAllowlist, u as resolveMSTeamsChannelAllowlist } from "./setup-surface-Clzyi6mr.js";
4
- import { a as resolveMSTeamsReplyPolicy, i as resolveMSTeamsAllowlistMatch, o as resolveMSTeamsRouteConfig } from "./channel-GgLcEkGO.js";
5
- import { C as readJsonFile, S as createMSTeamsConversationStoreFs, T as writeJsonFile, _ as buildFileInfoCard, b as createMSTeamsPollStoreFs, c as renderReplyPayloadsToMessages, d as withRevokedProxyFallback, f as resolveGraphChatId, g as removePendingUploadFs, h as getPendingUploadFs, l as sendMSTeamsMessages, m as removePendingUpload, p as getPendingUpload, s as buildConversationReference, u as AI_GENERATED_ENTITY, v as parseFileConsentInvoke, w as withFileLock, x as extractMSTeamsPollVote, y as uploadToConsentUrl } from "./probe-BmuQDgsE.js";
2
+ import { A as ATTACHMENT_TAG_RE, B as isLikelyImageAttachment, C as loadMSTeamsSdkWithAuth, D as formatMSTeamsSendErrorHint, E as classifyMSTeamsSendError, F as estimateBase64DecodedBytes, G as resolveAttachmentFetchPolicy, H as isUrlAllowed, I as extractHtmlFromAttachment, J as safeFetchWithPolicy, K as resolveMediaSsrfPolicy, L as extractInlineImageCandidates, M as IMG_SRC_RE, N as applyAuthorizationHeaderForUrl, O as formatUnknownError, P as encodeGraphShareId, R as inferPlaceholder, S as createMSTeamsTokenProvider, T as ensureUserAgentHeader, U as normalizeContentType, V as isRecord$1, W as readNestedString, X as tryBuildGraphSharesUrlForSharedLink, Y as safeHostForUrl, _ as resolveMSTeamsStorePath, a as fetchGraphJson, b as createBotFrameworkJwtValidator, h as resolveMSTeamsCredentials, j as GRAPH_ROOT, q as resolveRequestUrl, w as buildUserAgent, x as createMSTeamsAdapter, z as isDownloadableAttachment } from "./graph-users-CwYemYEo.js";
3
+ import { d as resolveMSTeamsUserAllowlist, u as resolveMSTeamsChannelAllowlist } from "./setup-surface-f9pZ7G9O.js";
4
+ import { a as resolveMSTeamsReplyPolicy, i as resolveMSTeamsAllowlistMatch, o as resolveMSTeamsRouteConfig } from "./channel-DZt_jPWh.js";
5
+ import { C as readJsonFile, S as createMSTeamsConversationStoreFs, T as writeJsonFile, _ as buildFileInfoCard, b as createMSTeamsPollStoreFs, c as renderReplyPayloadsToMessages, d as withRevokedProxyFallback, f as resolveGraphChatId, g as removePendingUploadFs, h as getPendingUploadFs, l as sendMSTeamsMessages, m as removePendingUpload, p as getPendingUpload, s as buildConversationReference, u as AI_GENERATED_ENTITY, v as parseFileConsentInvoke, w as withFileLock, x as extractMSTeamsPollVote, y as uploadToConsentUrl } from "./probe-DC3tmy9c.js";
6
6
  import { formatAllowlistMatchMeta } from "openclaw/plugin-sdk/allow-from";
7
7
  import { createLiveMessageState, createPreviewMessageReceipt, defineFinalizableLivePreviewAdapter, deliverWithFinalizableLivePreviewAdapter, markLiveMessageFinalized } from "openclaw/plugin-sdk/channel-message";
8
- import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString, readStringValue } from "openclaw/plugin-sdk/string-coerce-runtime";
8
+ import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString, readStringValue, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
9
9
  import { createDraftStreamLoop } from "openclaw/plugin-sdk/channel-lifecycle";
10
10
  import { saveResponseMedia } from "openclaw/plugin-sdk/media-runtime";
11
11
  import { dispatchReplyFromConfigWithSettledDispatcher, hasFinalInboundReplyDispatch, resolveInboundReplyDispatchCounts } from "openclaw/plugin-sdk/inbound-reply-dispatch";
@@ -1021,13 +1021,12 @@ function buildMSTeamsGraphMessageUrls(params) {
1021
1021
  }
1022
1022
  if (messageIdCandidates.size === 0 && replyToId) messageIdCandidates.add(replyToId);
1023
1023
  for (const candidate of messageIdCandidates) urls.push(`${GRAPH_ROOT}/teams/${encodeURIComponent(teamId)}/channels/${encodeURIComponent(channelId)}/messages/${encodeURIComponent(candidate)}`);
1024
- return Array.from(new Set(urls));
1024
+ return uniqueStrings(urls);
1025
1025
  }
1026
1026
  const chatId = params.conversationId?.trim() || readNestedString(params.channelData, ["chatId"]);
1027
1027
  if (!chatId) return [];
1028
1028
  if (messageIdCandidates.size === 0 && replyToId) messageIdCandidates.add(replyToId);
1029
- const urls = Array.from(messageIdCandidates).map((candidate) => `${GRAPH_ROOT}/chats/${encodeURIComponent(chatId)}/messages/${encodeURIComponent(candidate)}`);
1030
- return Array.from(new Set(urls));
1029
+ return uniqueStrings(Array.from(messageIdCandidates).map((candidate) => `${GRAPH_ROOT}/chats/${encodeURIComponent(chatId)}/messages/${encodeURIComponent(candidate)}`));
1031
1030
  }
1032
1031
  async function fetchGraphCollection(params) {
1033
1032
  const fetchFn = params.fetchFn ?? fetch;
package/dist/test-api.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as msteamsPlugin } from "./channel-GgLcEkGO.js";
1
+ import { t as msteamsPlugin } from "./channel-DZt_jPWh.js";
2
2
  export { msteamsPlugin };
@@ -1,3 +1,23 @@
1
+ ## **6.15.2**
2
+ - [Fix] `stringify`: skip null/undefined entries in `arrayFormat: 'comma'` + `encodeValuesOnly` instead of crashing in `encoder`
3
+ - [Fix] `stringify`: use configured `delimiter` after `charsetSentinel` (#555)
4
+ - [Fix] `stringify`: apply `formatter` to encoded key under `strictNullHandling` (#554)
5
+ - [Fix] `stringify`: skip null/undefined filter-array entries instead of crashing in `encoder` (#551)
6
+ - [Fix] `parse`: handle nested bracket groups and add regression tests (#530)
7
+ - [readme] fix grammar (#550)
8
+ - [Dev Deps] update `@ljharb/eslint-config`
9
+ - [Tests] add regression tests for keys containing percent-encoded bracket text
10
+
11
+ ## **6.15.1**
12
+ - [Fix] `parse`: `parameterLimit: Infinity` with `throwOnLimitExceeded: true` silently drops all parameters
13
+ - [Deps] update `@ljharb/eslint-config`
14
+ - [Dev Deps] update `@ljharb/eslint-config`, `iconv-lite`
15
+ - [Tests] increase coverage
16
+
17
+ ## **6.15.0**
18
+ - [New] `parse`: add `strictMerge` option to wrap object/primitive conflicts in an array (#425, #122)
19
+ - [Fix] `duplicates` option should not apply to bracket notation keys (#514)
20
+
1
21
  ## **6.14.2**
2
22
  - [Fix] `parse`: mark overflow objects for indexed notation exceeding `arrayLimit` (#546)
3
23
  - [Fix] `arrayLimit` means max count, not max index, in `combine`/`merge`/`parseArrayValue`
@@ -30,6 +50,17 @@
30
50
  - [Dev Deps] update `es-value-fixtures`, `has-bigints`, `has-proto`, `has-symbols`
31
51
  - [Tests] increase coverage
32
52
 
53
+ ## **6.13.3**
54
+ [Fix] fix regressions from robustness refactor
55
+ [actions] update reusable workflows
56
+
57
+ ## **6.13.2**
58
+ - [Robustness] avoid `.push`, use `void`
59
+ - [readme] clarify `parseArrays` and `arrayLimit` documentation (#543)
60
+ - [readme] document that `addQueryPrefix` does not add `?` to empty output (#418)
61
+ - [readme] replace runkit CI badge with shields.io check-runs badge
62
+ - [actions] fix rebase workflow permissions
63
+
33
64
  ## **6.13.1**
34
65
  - [Fix] `stringify`: avoid a crash when a `filter` key is `null`
35
66
  - [Fix] `utils.merge`: functions should not be stringified into keys
@@ -46,6 +77,17 @@
46
77
  - [New] `parse`: add `strictDepth` option (#511)
47
78
  - [Tests] use `npm audit` instead of `aud`
48
79
 
80
+ ## **6.12.5**
81
+ - [Fix] fix regressions from robustness refactor
82
+ - [actions] update reusable workflows
83
+
84
+ ## **6.12.4**
85
+ - [Robustness] avoid `.push`, use `void`
86
+ - [readme] clarify `parseArrays` and `arrayLimit` documentation (#543)
87
+ - [readme] document that `addQueryPrefix` does not add `?` to empty output (#418)
88
+ - [readme] replace runkit CI badge with shields.io check-runs badge
89
+ - [actions] fix rebase workflow permissions
90
+
49
91
  ## **6.12.3**
50
92
  - [Fix] `parse`: properly account for `strictNullHandling` when `allowEmptyArrays`
51
93
  - [meta] fix changelog indentation
@@ -83,6 +125,17 @@
83
125
  - [Dev Deps] pin `glob`, since v10.3.8+ requires a broken `jackspeak`
84
126
  - [Dev Deps] pin `jackspeak` since 2.1.2+ depends on npm aliases, which kill the install process in npm < 6
85
127
 
128
+ ## **6.11.4**
129
+ - [Fix] fix regressions from robustness refactor
130
+ - [actions] update reusable workflows
131
+
132
+ ## **6.11.3**
133
+ - [Robustness] avoid `.push`, use `void`
134
+ - [readme] clarify `parseArrays` and `arrayLimit` documentation (#543)
135
+ - [readme] document that `addQueryPrefix` does not add `?` to empty output (#418)
136
+ - [readme] replace runkit CI badge with shields.io check-runs badge
137
+ - [actions] fix rebase workflow permissions
138
+
86
139
  ## **6.11.2**
87
140
  - [Fix] `parse`: Fix parsing when the global Object prototype is frozen (#473)
88
141
  - [Tests] add passing test cases with empty keys (#473)
@@ -100,6 +153,17 @@
100
153
  - [New] [Fix] `stringify`: revert 0e903c0; add `commaRoundTrip` option (#442)
101
154
  - [readme] fix version badge
102
155
 
156
+ ## **6.10.7**
157
+ - [Fix] fix regressions from robustness refactor
158
+ - [actions] update reusable workflows
159
+
160
+ ## **6.10.6**
161
+ - [Robustness] avoid `.push`, use `void`
162
+ - [readme] clarify `parseArrays` and `arrayLimit` documentation (#543)
163
+ - [readme] document that `addQueryPrefix` does not add `?` to empty output (#418)
164
+ - [readme] replace runkit CI badge with shields.io check-runs badge
165
+ - [actions] fix rebase workflow permissions
166
+
103
167
  ## **6.10.5**
104
168
  - [Fix] `stringify`: with `arrayFormat: comma`, properly include an explicit `[]` on a single-item array (#434)
105
169
 
@@ -137,6 +201,18 @@
137
201
  - [Tests] use `ljharb/actions/node/install` instead of `ljharb/actions/node/run`
138
202
  - [Tests] Revert "[meta] ignore eclint transitive audit warning"
139
203
 
204
+ ## **6.9.9**
205
+ - [Fix] fix regressions from robustness refactor
206
+ - [meta] add `npmignore` to autogenerate an npmignore file
207
+ - [actions] update reusable workflows
208
+
209
+ ## **6.9.8**
210
+ - [Robustness] avoid `.push`, use `void`
211
+ - [readme] clarify `parseArrays` and `arrayLimit` documentation (#543)
212
+ - [readme] document that `addQueryPrefix` does not add `?` to empty output (#418)
213
+ - [readme] replace runkit CI badge with shields.io check-runs badge
214
+ - [actions] fix rebase workflow permissions
215
+
140
216
  ## **6.9.7**
141
217
  - [Fix] `parse`: ignore `__proto__` keys (#428)
142
218
  - [Fix] `stringify`: avoid encoding arrayformat comma when `encodeValuesOnly = true` (#424)
@@ -197,6 +273,18 @@
197
273
  - [Tests] up to `node` `v12.10`, `v11.15`, `v10.16`, `v8.16`
198
274
  - [Tests] `Buffer.from` in node v5.0-v5.9 and v4.0-v4.4 requires a TypedArray
199
275
 
276
+ ## **6.8.5**
277
+ - [Fix] fix regressions from robustness refactor
278
+ - [meta] add `npmignore` to autogenerate an npmignore file
279
+ - [actions] update reusable workflows
280
+
281
+ ## **6.8.4**
282
+ - [Robustness] avoid `.push`, use `void`
283
+ - [readme] clarify `parseArrays` and `arrayLimit` documentation (#543)
284
+ - [readme] document that `addQueryPrefix` does not add `?` to empty output (#418)
285
+ - [readme] replace runkit CI badge with shields.io check-runs badge
286
+ - [actions] fix rebase workflow permissions
287
+
200
288
  ## **6.8.3**
201
289
  - [Fix] `parse`: ignore `__proto__` keys (#428)
202
290
  - [Robustness] `stringify`: avoid relying on a global `undefined` (#427)
@@ -241,6 +329,18 @@
241
329
  - [meta] add FUNDING.yml
242
330
  - [meta] Clean up license text so it’s properly detected as BSD-3-Clause
243
331
 
332
+ ## **6.7.5**
333
+ - [Fix] fix regressions from robustness refactor
334
+ - [meta] add `npmignore` to autogenerate an npmignore file
335
+ - [actions] update reusable workflows
336
+
337
+ ## **6.7.4**
338
+ - [Robustness] avoid `.push`, use `void`
339
+ - [readme] clarify `parseArrays` and `arrayLimit` documentation (#543)
340
+ - [readme] document that `addQueryPrefix` does not add `?` to empty output (#418)
341
+ - [readme] replace runkit CI badge with shields.io check-runs badge
342
+ - [actions] fix rebase workflow permissions
343
+
244
344
  ## **6.7.3**
245
345
  - [Fix] `parse`: ignore `__proto__` keys (#428)
246
346
  - [Fix] `stringify`: avoid encoding arrayformat comma when `encodeValuesOnly = true` (#424)
@@ -292,6 +392,18 @@
292
392
  - [Tests] fix Buffer tests to work in node < 4.5 and node < 5.10
293
393
  - [Tests] temporarily allow coverage to fail
294
394
 
395
+ ## **6.6.3**
396
+ - [Fix] fix regressions from robustness refactor
397
+ - [meta] add `npmignore` to autogenerate an npmignore file
398
+ - [actions] update reusable workflows
399
+
400
+ ## **6.6.2**
401
+ - [Robustness] avoid `.push`, use `void`
402
+ - [readme] clarify `parseArrays` and `arrayLimit` documentation (#543)
403
+ - [readme] document that `addQueryPrefix` does not add `?` to empty output (#418)
404
+ - [readme] replace runkit CI badge with shields.io check-runs badge
405
+ - [actions] fix rebase workflow permissions
406
+
295
407
  ## **6.6.1**
296
408
  - [Fix] `parse`: ignore `__proto__` keys (#428)
297
409
  - [Fix] fix for an impossible situation: when the formatter is called with a non-string value
@@ -334,6 +446,18 @@
334
446
  - [Dev Deps] update `browserify`, `eslint`, `@ljharb/eslint-config`, `iconv-lite`, `safe-publish-latest`, `tape`
335
447
  - [Tests] up to `node` `v10.10`, `v9.11`, `v8.12`, `v6.14`, `v4.9`; pin included builds to LTS
336
448
 
449
+ ## **6.5.5**
450
+ - [Fix] fix regressions from robustness refactor
451
+ - [meta] add `npmignore` to autogenerate an npmignore file
452
+ - [actions] update reusable workflows
453
+
454
+ ## **6.5.4**
455
+ - [Robustness] avoid `.push`, use `void`
456
+ - [readme] clarify `parseArrays` and `arrayLimit` documentation (#543)
457
+ - [readme] document that `addQueryPrefix` does not add `?` to empty output (#418)
458
+ - [readme] replace runkit CI badge with shields.io check-runs badge
459
+ - [actions] fix rebase workflow permissions
460
+
337
461
  ## **6.5.3**
338
462
  - [Fix] `parse`: ignore `__proto__` keys (#428)
339
463
  - [Fix] `utils.merge`: avoid a crash with a null target and a truthy non-array source
@@ -384,6 +508,18 @@
384
508
  - [Tests] up to `node` `v8.1`, `v7.10`, `v6.11`; npm v4.6 breaks on node < v1; npm v5+ breaks on node < v4
385
509
  - [Tests] add `editorconfig-tools`
386
510
 
511
+ ## **6.4.3**
512
+ - [Fix] fix regressions from robustness refactor
513
+ - [meta] add `npmignore` to autogenerate an npmignore file
514
+ - [actions] update reusable workflows
515
+
516
+ ## **6.4.2**
517
+ - [Robustness] avoid `.push`, use `void`
518
+ - [readme] clarify `parseArrays` and `arrayLimit` documentation (#543)
519
+ - [readme] replace runkit CI badge with shields.io check-runs badge
520
+ - [readme] replace travis CI badge with shields.io check-runs badge
521
+ - [actions] fix rebase workflow permissions
522
+
387
523
  ## **6.4.1**
388
524
  - [Fix] `parse`: ignore `__proto__` keys (#428)
389
525
  - [Fix] fix for an impossible situation: when the formatter is called with a non-string value
@@ -414,6 +550,17 @@
414
550
  - [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds
415
551
  - [eslint] reduce warnings
416
552
 
553
+ ## **6.3.5**
554
+ - [Fix] fix regressions from robustness refactor
555
+ - [meta] add `npmignore` to autogenerate an npmignore file
556
+ - [actions] update reusable workflows
557
+
558
+ ## **6.3.4**
559
+ - [Robustness] avoid `.push`, use `void`
560
+ - [readme] clarify `parseArrays` and `arrayLimit` documentation (#543)
561
+ - [readme] replace travis CI badge with shields.io check-runs badge
562
+ - [actions] fix rebase workflow permissions
563
+
417
564
  ## **6.3.3**
418
565
  - [Fix] `parse`: ignore `__proto__` keys (#428)
419
566
  - [Fix] fix for an impossible situation: when the formatter is called with a non-string value
@@ -467,6 +614,17 @@
467
614
  - [Tests] skip Object.create tests when null objects are not available
468
615
  - [Tests] Turn on eslint for test files (#175)
469
616
 
617
+ ## **6.2.6**
618
+ - [Fix] fix regression from robustness refactor
619
+ - [meta] add `npmignore` to autogenerate an npmignore file
620
+ - [actions] update reusable workflows
621
+
622
+ ## **6.2.5**
623
+ - [Robustness] avoid `.push`, use `void`
624
+ - [readme] clarify `parseArrays` and `arrayLimit` documentation (#543)
625
+ - [readme] replace travis CI badge with shields.io check-runs badge
626
+ - [actions] fix rebase workflow permissions
627
+
470
628
  ## **6.2.4**
471
629
  - [Fix] `parse`: ignore `__proto__` keys (#428)
472
630
  - [Fix] `utils.merge`: avoid a crash with a null target and an array source
@@ -505,6 +663,16 @@
505
663
  - [New] add "encoder" and "decoder" options, for custom param encoding/decoding (#160)
506
664
  - [Fix] fix compacting of nested sparse arrays (#150)
507
665
 
666
+ ## **6.1.4**
667
+ - [Fix] fix regression from robustness refactor
668
+ - [meta] add `npmignore` to autogenerate an npmignore file
669
+ - [actions] update reusable workflows
670
+
671
+ ## **6.1.3**
672
+ - [Robustness] avoid `.push`, use `void`
673
+ - [readme] clarify `parseArrays` and `arrayLimit` documentation (#543)
674
+ - [readme] replace travis CI badge with shields.io check-runs badge
675
+
508
676
  ## **6.1.2**
509
677
  - [Fix] follow `allowPrototypes` option during merge (#201, #200)
510
678
  - [Fix] chmod a-x
@@ -519,6 +687,16 @@
519
687
  - [Fix] "sort" option should work at a depth of 3 or more (#151)
520
688
  - [Fix] Restore `dist` directory; will be removed in v7 (#148)
521
689
 
690
+ ## **6.0.6**
691
+ - [Fix] fix regression from robustness refactor
692
+ - [meta] add `npmignore` to autogenerate an npmignore file
693
+ - [actions] update reusable workflows
694
+
695
+ ## **6.0.5**
696
+ - [Robustness] avoid `.push`, use `void`
697
+ - [readme] clarify `parseArrays` and `arrayLimit` documentation (#543)
698
+ - [readme] replace travis CI badge with shields.io check-runs badge
699
+
522
700
  ## **6.0.4**
523
701
  - [Fix] follow `allowPrototypes` option during merge (#201, #200)
524
702
  - [Fix] chmod a-x