@openclaw/clickclack 2026.8.1-beta.2 → 2026.9.1-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 { _ as DEFAULT_ACCOUNT_ID, b as resolveClickClackAccount, p as clickClackConfigSchema, u as createClickClackClient, v as listClickClackAccountIds, x as resolveDefaultClickClackAccountId, y as listEnabledClickClackAccounts } from "./setup-surface-DjT-gmMe.js";
2
- import { a as setClickClackRuntime, i as getClickClackRuntime, n as buildClickClackTarget, r as parseClickClackTarget, t as clickClackPlugin } from "./channel-DaHgaTy1.js";
1
+ import { _ as DEFAULT_ACCOUNT_ID, b as resolveClickClackAccount, p as clickClackConfigSchema, u as createClickClackClient, v as listClickClackAccountIds, x as resolveDefaultClickClackAccountId, y as listEnabledClickClackAccounts } from "./setup-surface-u7Mgy8Wp.js";
2
+ import { a as setClickClackRuntime, i as getClickClackRuntime, n as buildClickClackTarget, r as parseClickClackTarget, t as clickClackPlugin } from "./channel-DbE7fnUL.js";
3
3
  export { DEFAULT_ACCOUNT_ID, buildClickClackTarget, clickClackConfigSchema, clickClackPlugin, createClickClackClient, getClickClackRuntime, listClickClackAccountIds, listEnabledClickClackAccounts, parseClickClackTarget, resolveClickClackAccount, resolveDefaultClickClackAccountId, setClickClackRuntime };
@@ -1,10 +1,10 @@
1
- import { _ as DEFAULT_ACCOUNT_ID, b as resolveClickClackAccount, c as resolveWorkspaceId, f as normalizeClickClackCorrelationId, g as clickClackMeta, h as clickClackConfigAdapter, l as ClickClackHttpError, m as CLICKCLACK_CHANNEL_ID, n as clickClackSetupContract, p as clickClackConfigSchema, s as resolveChannelId, t as clickClackSetupWizard, u as createClickClackClient, y as listEnabledClickClackAccounts } from "./setup-surface-DjT-gmMe.js";
1
+ import { _ as DEFAULT_ACCOUNT_ID, b as resolveClickClackAccount, c as resolveWorkspaceId, f as normalizeClickClackCorrelationId, g as clickClackMeta, h as clickClackConfigAdapter, l as ClickClackHttpError, m as CLICKCLACK_CHANNEL_ID, n as clickClackSetupContract, p as clickClackConfigSchema, s as resolveChannelId, t as clickClackSetupWizard, u as createClickClackClient, y as listEnabledClickClackAccounts } from "./setup-surface-u7Mgy8Wp.js";
2
2
  import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-BKkzzjBA.js";
3
3
  import { parseDateStringTimestampMs } from "openclaw/plugin-sdk/number-runtime";
4
4
  import { mergePairLoopGuardConfig } from "openclaw/plugin-sdk/pair-loop-guard-runtime";
5
5
  import { readStringField } from "openclaw/plugin-sdk/string-coerce-runtime";
6
6
  import { buildChannelOutboundSessionRoute, buildThreadAwareOutboundSessionRoute, createChatChannelPlugin } from "openclaw/plugin-sdk/channel-core";
7
- import { buildChannelProgressDraftLine, createMessageReceiptFromOutboundResults, defineChannelMessageAdapter, deriveDurableFinalDeliveryRequirements } from "openclaw/plugin-sdk/channel-outbound";
7
+ import { buildChannelProgressDraftLine, createChannelMessageReplyPipeline, createMessageReceiptFromOutboundResults, defineChannelMessageAdapter, deriveDurableFinalDeliveryRequirements } from "openclaw/plugin-sdk/channel-outbound";
8
8
  import { createComputedAccountStatusAdapter, createDefaultChannelRuntimeState } from "openclaw/plugin-sdk/status-helpers";
9
9
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
10
10
  import { channelReadyPatch, channelStoppedPatch } from "openclaw/plugin-sdk/gateway-runtime";
@@ -866,15 +866,16 @@ async function syncClickClackCommandMenu(params) {
866
866
  await params.client.setBotCommands(commands);
867
867
  } catch (error) {
868
868
  const status = errorStatus(error);
869
+ const messagePrefix = `[${params.accountId}] ClickClack command menu sync`;
869
870
  if (status === 403) {
870
- params.log?.warn?.("ClickClack command menu sync skipped: bot token lacks commands:write");
871
+ params.log?.warn?.(`${messagePrefix} skipped: ${formatErrorMessage(error)}; verify token/workspace command permissions or set commandMenu: false if menus are not needed`);
871
872
  return;
872
873
  }
873
874
  if (status === 404) {
874
- params.log?.debug?.("ClickClack command menu sync skipped: server does not support /api/bots/self/commands");
875
+ params.log?.debug?.(`${messagePrefix} skipped: server does not support /api/bots/self/commands`);
875
876
  return;
876
877
  }
877
- params.log?.warn?.(`ClickClack command menu sync failed: ${formatErrorMessage(error)}`);
878
+ params.log?.warn?.(`${messagePrefix} failed: ${formatErrorMessage(error)}`);
878
879
  }
879
880
  }
880
881
  //#endregion
@@ -1591,7 +1592,7 @@ function resolveClickClackAgentRunId(messageId) {
1591
1592
  }
1592
1593
  async function dispatchModelReply(params) {
1593
1594
  const runtime = getClickClackRuntime();
1594
- const text = (await runtime.llm.complete({
1595
+ const result = await runtime.llm.complete({
1595
1596
  agentId: params.route.agentId,
1596
1597
  model: params.account.model,
1597
1598
  purpose: "clickclack bot reply",
@@ -1600,14 +1601,28 @@ async function dispatchModelReply(params) {
1600
1601
  role: "user",
1601
1602
  content: params.message.body
1602
1603
  }]
1603
- })).text.trim();
1604
- if (!text) {
1604
+ });
1605
+ const completion = result.text.trim();
1606
+ if (!completion) {
1605
1607
  runtime.logging.getChildLogger({
1606
1608
  plugin: "clickclack",
1607
1609
  feature: "model-reply"
1608
1610
  }).warn(`[${params.account.accountId}] ClickClack model reply produced no sendable text`);
1609
1611
  return;
1610
1612
  }
1613
+ const replyPipeline = createChannelMessageReplyPipeline({
1614
+ cfg: params.cfg,
1615
+ agentId: params.route.agentId,
1616
+ channel: CHANNEL_ID$1,
1617
+ accountId: params.account.accountId
1618
+ });
1619
+ replyPipeline.onModelSelected?.({
1620
+ provider: result.provider,
1621
+ model: result.model,
1622
+ thinkLevel: void 0
1623
+ });
1624
+ const responsePrefix = replyPipeline.resolveResponsePrefix?.();
1625
+ const text = responsePrefix && !completion.startsWith(responsePrefix) ? `${responsePrefix} ${completion}` : completion;
1611
1626
  await sendClickClackText({
1612
1627
  cfg: params.cfg,
1613
1628
  accountId: params.account.accountId,
@@ -1868,7 +1883,7 @@ function parseSocketEvent(data) {
1868
1883
  }
1869
1884
  async function processEvent(params) {
1870
1885
  if (params.event.type !== "message.created" && params.event.type !== "thread.reply_created") return;
1871
- if (payloadString(params.event, "author_id") === params.botUserId) return;
1886
+ if (params.abortSignal.aborted || payloadString(params.event, "author_id") === params.botUserId) return;
1872
1887
  const correlationId = eventCorrelationId(params.event);
1873
1888
  const message = await resolveEventMessage({
1874
1889
  client: correlationId ? createClickClackClient({
@@ -1882,12 +1897,13 @@ async function processEvent(params) {
1882
1897
  params.log?.warn?.(`[${params.account.accountId}] skipped unreadable ClickClack message before agent dispatch: type=${params.event.type} messageId=${payloadString(params.event, "message_id") || "unknown"}`);
1883
1898
  return;
1884
1899
  }
1885
- if (message.author_id === params.botUserId) return;
1900
+ if (params.abortSignal.aborted || message.author_id === params.botUserId) return;
1886
1901
  const access = await resolveClickClackInboundAccess({
1887
1902
  account: params.account,
1888
1903
  config: params.config,
1889
1904
  message
1890
1905
  });
1906
+ if (params.abortSignal.aborted) return;
1891
1907
  if (!access.shouldDispatch) {
1892
1908
  params.log?.info(`[${params.account.accountId}] skipped ClickClack message before agent dispatch: kind=${message.direct_conversation_id ? "dm" : "group"} requireMention=${access.requireMention ?? "unknown"} wasMentioned=${access.mentionFacts.wasMentioned} hasAnyMention=${access.mentionFacts.hasAnyMention ?? "unknown"} commandAuthorized=${access.commandAuthorized}`);
1893
1909
  return;
@@ -1937,6 +1953,7 @@ async function startClickClackGatewayAccount(ctx) {
1937
1953
  botHandle: me.handle
1938
1954
  };
1939
1955
  const processIncomingEvent = (event) => processEvent({
1956
+ abortSignal: ctx.abortSignal,
1940
1957
  account,
1941
1958
  config: ctx.cfg,
1942
1959
  client,
@@ -1948,7 +1965,8 @@ async function startClickClackGatewayAccount(ctx) {
1948
1965
  if (account.commandMenu) await syncClickClackCommandMenu({
1949
1966
  cfg: ctx.cfg,
1950
1967
  client,
1951
- log: ctx.log
1968
+ log: ctx.log,
1969
+ accountId: account.accountId
1952
1970
  });
1953
1971
  ctx.setStatus({
1954
1972
  accountId: account.accountId,
@@ -2015,6 +2033,7 @@ async function startClickClackGatewayAccount(ctx) {
2015
2033
  socket.on("message", (data) => {
2016
2034
  if (closing || settled) return;
2017
2035
  messageQueue = messageQueue.then(async () => {
2036
+ if (ctx.abortSignal.aborted) return;
2018
2037
  const event = parseSocketEvent(data);
2019
2038
  if (!event) {
2020
2039
  ctx.log?.warn?.(`[${account.accountId}] skipped malformed ClickClack websocket event`);
@@ -2156,6 +2175,7 @@ const clickClackPlugin = createChatChannelPlugin({
2156
2175
  capabilities: {
2157
2176
  chatTypes: ["direct", "group"],
2158
2177
  threads: true,
2178
+ media: true,
2159
2179
  blockStreaming: true
2160
2180
  },
2161
2181
  reload: { configPrefixes: ["channels.clickclack"] },
@@ -2222,7 +2242,11 @@ const clickClackPlugin = createChatChannelPlugin({
2222
2242
  name: account.name,
2223
2243
  enabled: account.enabled,
2224
2244
  configured: account.configured,
2225
- baseUrl: account.baseUrl
2245
+ extra: {
2246
+ baseUrl: account.baseUrl,
2247
+ tokenSource: account.tokenSource,
2248
+ tokenStatus: account.tokenStatus
2249
+ }
2226
2250
  })
2227
2251
  }),
2228
2252
  gateway: { startAccount: startClickClackGatewayAccount },
@@ -1,2 +1,2 @@
1
- import { t as clickClackPlugin } from "./channel-DaHgaTy1.js";
1
+ import { t as clickClackPlugin } from "./channel-DbE7fnUL.js";
2
2
  export { clickClackPlugin };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as registerClickClackDiscussions } from "./runtime-api-CPL3m5AD.js";
1
+ import { t as registerClickClackDiscussions } from "./runtime-api-Pul_CTEN.js";
2
2
  import { defineBundledChannelEntry } from "openclaw/plugin-sdk/channel-entry-contract";
3
3
  //#region extensions/clickclack/index.ts
4
4
  /**
@@ -1,5 +1,5 @@
1
- import { b as resolveClickClackAccount, d as isClickClackChannelNameConflict, l as ClickClackHttpError, u as createClickClackClient, v as listClickClackAccountIds } from "./setup-surface-DjT-gmMe.js";
2
- import { C as slugifyDiscussionLabel, D as listPendingDiscussionOpens, E as clearPendingDiscussionOpen, O as recordPendingDiscussionOpen, S as resolveDiscussionLabel, T as clearDiscussionBindingGeneration, _ as getClickClackDiscussionBindingStore, b as fallbackDiscussionLabel, c as markClickClackDiscussionChannelIdentityRevoked, d as discussionInfoForBinding, f as normalizedServerBaseUrl, g as bindingMatchesActiveSessionIncarnation, h as attachBindingToCurrentActiveSession, k as reserveDiscussionBindingGeneration, l as markClickClackDiscussionChannelRevoked, o as clearClickClackDiscussionChannelRevoked, p as resolveDiscussionBindingAccount, s as isClickClackDiscussionChannelRevoked, u as discussionAccounts, v as discussionCredentialFingerprint, w as truncateDiscussionDisplayTitle, x as isDiscussionSessionKey, y as discussionExternalRef } from "./channel-DaHgaTy1.js";
1
+ import { b as resolveClickClackAccount, d as isClickClackChannelNameConflict, l as ClickClackHttpError, u as createClickClackClient, v as listClickClackAccountIds } from "./setup-surface-u7Mgy8Wp.js";
2
+ import { C as slugifyDiscussionLabel, D as listPendingDiscussionOpens, E as clearPendingDiscussionOpen, O as recordPendingDiscussionOpen, S as resolveDiscussionLabel, T as clearDiscussionBindingGeneration, _ as getClickClackDiscussionBindingStore, b as fallbackDiscussionLabel, c as markClickClackDiscussionChannelIdentityRevoked, d as discussionInfoForBinding, f as normalizedServerBaseUrl, g as bindingMatchesActiveSessionIncarnation, h as attachBindingToCurrentActiveSession, k as reserveDiscussionBindingGeneration, l as markClickClackDiscussionChannelRevoked, o as clearClickClackDiscussionChannelRevoked, p as resolveDiscussionBindingAccount, s as isClickClackDiscussionChannelRevoked, u as discussionAccounts, v as discussionCredentialFingerprint, w as truncateDiscussionDisplayTitle, x as isDiscussionSessionKey, y as discussionExternalRef } from "./channel-DbE7fnUL.js";
3
3
  import "./api.js";
4
4
  import { randomUUID } from "node:crypto";
5
5
  import { buildControlUiSessionPath, registerSessionDiscussionProvider } from "openclaw/plugin-sdk/session-discussion";
@@ -1,4 +1,4 @@
1
- import { b as resolveClickClackAccount, u as createClickClackClient } from "./setup-surface-DjT-gmMe.js";
2
- import { a as setClickClackRuntime, r as parseClickClackTarget } from "./channel-DaHgaTy1.js";
3
- import { t as registerClickClackDiscussions } from "./runtime-api-CPL3m5AD.js";
1
+ import { b as resolveClickClackAccount, u as createClickClackClient } from "./setup-surface-u7Mgy8Wp.js";
2
+ import { a as setClickClackRuntime, r as parseClickClackTarget } from "./channel-DbE7fnUL.js";
3
+ import { t as registerClickClackDiscussions } from "./runtime-api-Pul_CTEN.js";
4
4
  export { createClickClackClient, parseClickClackTarget, registerClickClackDiscussions, resolveClickClackAccount, setClickClackRuntime };
@@ -1,4 +1,4 @@
1
- import { a as isClickClackSetupLoopbackHost, i as buildClickClackSetupClaimUrl, o as requireClickClackSetupApiBaseUrl } from "./setup-surface-DjT-gmMe.js";
1
+ import { a as isClickClackSetupLoopbackHost, i as buildClickClackSetupClaimUrl, o as requireClickClackSetupApiBaseUrl } from "./setup-surface-u7Mgy8Wp.js";
2
2
  import { createProviderOperationDeadline, readProviderJsonResponse, readResponseTextLimited, resolveProviderOperationTimeoutMs } from "openclaw/plugin-sdk/provider-http";
3
3
  import { fetchWithSsrFGuard, resolvePinnedHostnameWithPolicy, ssrfPolicyFromHttpBaseUrlAllowedHostname } from "openclaw/plugin-sdk/ssrf-runtime";
4
4
  import { withTimeout } from "openclaw/plugin-sdk/text-utility-runtime";
@@ -1,4 +1,4 @@
1
- import { g as clickClackMeta, h as clickClackConfigAdapter, n as clickClackSetupContract, p as clickClackConfigSchema, t as clickClackSetupWizard } from "./setup-surface-DjT-gmMe.js";
1
+ import { g as clickClackMeta, h as clickClackConfigAdapter, n as clickClackSetupContract, p as clickClackConfigSchema, t as clickClackSetupWizard } from "./setup-surface-u7Mgy8Wp.js";
2
2
  //#region extensions/clickclack/src/channel.setup.ts
3
3
  const clickClackSetupPlugin = {
4
4
  id: "clickclack",
@@ -5,7 +5,7 @@ import { resolveIntegerOption } from "openclaw/plugin-sdk/number-runtime";
5
5
  import { mergePairLoopGuardConfig } from "openclaw/plugin-sdk/pair-loop-guard-runtime";
6
6
  import { resolveDefaultSecretProviderAlias } from "openclaw/plugin-sdk/provider-auth";
7
7
  import { tryReadSecretFileSync } from "openclaw/plugin-sdk/secret-file-runtime";
8
- import { buildSecretInputSchema, normalizeResolvedSecretInputString, normalizeSecretInputString, resolveSecretInputString } from "openclaw/plugin-sdk/secret-input";
8
+ import { buildSecretInputSchema, normalizeSecretInputString, resolveSecretInputString } from "openclaw/plugin-sdk/secret-input";
9
9
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
10
10
  import { getChatChannelMeta } from "openclaw/plugin-sdk/channel-plugin-common";
11
11
  import { ChannelBotLoopProtectionSchema, buildChannelAllowBotsSchema, buildChannelConfigSchema, buildMultiAccountChannelSchema } from "openclaw/plugin-sdk/channel-config-schema";
@@ -87,7 +87,20 @@ function resolveClickClackAccountConfig(cfg, accountId) {
87
87
  }
88
88
  function resolveClickClackToken(params) {
89
89
  const tokenFile = params.tokenFile?.trim();
90
- if (tokenFile) return tryReadSecretFileSync(tokenFile, params.accountId === DEFAULT_ACCOUNT_ID$2 ? "channels.clickclack.tokenFile" : `channels.clickclack.accounts.${params.accountId}.tokenFile`, { rejectSymlink: true }) ?? "";
90
+ if (tokenFile) {
91
+ const accountTokenFile = resolveNormalizedAccountEntry(params.cfg.channels?.clickclack?.accounts, params.accountId, normalizeAccountId)?.tokenFile?.trim();
92
+ const result = tryReadSecretFileSync(tokenFile, "ClickClack bot token", { rejectSymlink: true }, { configPath: accountTokenFile ? `channels.clickclack.accounts.${params.accountId}.tokenFile` : "channels.clickclack.tokenFile" });
93
+ return result.status === "available" ? {
94
+ token: result.value,
95
+ tokenSource: "tokenFile",
96
+ tokenStatus: "available"
97
+ } : {
98
+ token: "",
99
+ tokenSource: "tokenFile",
100
+ tokenStatus: "configured_unavailable",
101
+ credentialDiagnostics: [result.diagnostic]
102
+ };
103
+ }
91
104
  const resolved = resolveSecretInputString({
92
105
  value: params.value,
93
106
  path: params.accountId === DEFAULT_ACCOUNT_ID$2 ? "channels.clickclack.token" : `channels.clickclack.accounts.${params.accountId}.token`,
@@ -95,21 +108,42 @@ function resolveClickClackToken(params) {
95
108
  mode: "inspect"
96
109
  });
97
110
  if (resolved.status !== "available") {
98
- if (resolved.status === "missing" && params.accountId === DEFAULT_ACCOUNT_ID$2) return normalizeSecretInputString((params.env ?? process.env).CLICKCLACK_BOT_TOKEN) ?? "";
111
+ if (resolved.status === "missing" && params.accountId === DEFAULT_ACCOUNT_ID$2) {
112
+ const token = normalizeSecretInputString((params.env ?? process.env).CLICKCLACK_BOT_TOKEN);
113
+ return token ? {
114
+ token,
115
+ tokenSource: "env",
116
+ tokenStatus: "available"
117
+ } : {
118
+ token: "",
119
+ tokenSource: "none",
120
+ tokenStatus: "missing"
121
+ };
122
+ }
99
123
  if (resolved.status === "configured_unavailable" && resolved.ref.source === "env") {
100
124
  const providerConfig = params.cfg.secrets?.providers?.[resolved.ref.provider];
101
125
  if (providerConfig) {
102
126
  if (providerConfig.source !== "env") throw new Error(`Secret provider "${resolved.ref.provider}" has source "${providerConfig.source}" but ref requests "env".`);
103
127
  if (providerConfig.allowlist && !providerConfig.allowlist.includes(resolved.ref.id)) throw new Error(`Environment variable "${resolved.ref.id}" is not allowlisted in secrets.providers.${resolved.ref.provider}.allowlist.`);
104
128
  } else if (resolved.ref.provider !== resolveDefaultSecretProviderAlias({ secrets: params.cfg.secrets }, "env")) throw new Error(`Secret provider "${resolved.ref.provider}" is not configured (ref: env:${resolved.ref.provider}:${resolved.ref.id}).`);
105
- return normalizeSecretInputString((params.env ?? process.env)[resolved.ref.id]) ?? "";
129
+ const token = normalizeSecretInputString((params.env ?? process.env)[resolved.ref.id]);
130
+ return {
131
+ token: token ?? "",
132
+ tokenSource: "config",
133
+ tokenStatus: token ? "available" : "configured_unavailable"
134
+ };
106
135
  }
107
- return "";
136
+ return {
137
+ token: "",
138
+ tokenSource: resolved.status === "missing" ? "none" : "config",
139
+ tokenStatus: resolved.status
140
+ };
108
141
  }
109
- return normalizeResolvedSecretInputString({
110
- value: resolved.value,
111
- path: "channels.clickclack.token"
112
- }) ?? "";
142
+ return {
143
+ token: resolved.value,
144
+ tokenSource: "config",
145
+ tokenStatus: "available"
146
+ };
113
147
  }
114
148
  /**
115
149
  * Builds the normalized account snapshot used by gateway, outbound delivery,
@@ -134,10 +168,10 @@ function resolveClickClackAccount(params) {
134
168
  return {
135
169
  accountId,
136
170
  enabled,
137
- configured: Boolean(baseUrl && token && workspace),
171
+ configured: Boolean(baseUrl && token.tokenStatus !== "missing" && workspace),
138
172
  name: normalizeOptionalString(merged.name),
139
173
  baseUrl,
140
- token,
174
+ ...token,
141
175
  workspace,
142
176
  botUserId: normalizeOptionalString(merged.botUserId),
143
177
  agentId: normalizeOptionalString(merged.agentId),
@@ -212,6 +246,7 @@ const ClickClackAccountConfigSchema = z.object({
212
246
  name: z.string().optional(),
213
247
  enabled: z.boolean().optional(),
214
248
  configWrites: z.boolean().optional(),
249
+ responsePrefix: z.string().optional(),
215
250
  baseUrl: z.string().url().optional(),
216
251
  apiBaseUrl: z.string().url().optional(),
217
252
  token: buildSecretInputSchema().optional(),
@@ -250,7 +285,7 @@ const ClickClackAccountConfigSchema = z.object({
250
285
  * Config schema exported to core so `openclaw doctor` and config validation
251
286
  * understand both default and named ClickClack accounts.
252
287
  */
253
- const clickClackConfigSchema = buildChannelConfigSchema(buildMultiAccountChannelSchema(ClickClackAccountConfigSchema, { accountSchema: ClickClackAccountConfigSchema.partial() }));
288
+ const clickClackConfigSchema = buildChannelConfigSchema(buildMultiAccountChannelSchema(ClickClackAccountConfigSchema.extend({ historyLimit: z.number().int().min(0).optional() }), { accountSchema: ClickClackAccountConfigSchema.partial() }));
254
289
  //#endregion
255
290
  //#region extensions/clickclack/src/http-client.ts
256
291
  /**
@@ -482,7 +517,7 @@ function createClickClackClient(options) {
482
517
  },
483
518
  createUpload: async (params) => {
484
519
  const form = new FormData();
485
- const bytes = new Uint8Array(params.buffer);
520
+ const bytes = params.buffer.buffer instanceof ArrayBuffer ? new Uint8Array(params.buffer.buffer, params.buffer.byteOffset, params.buffer.byteLength) : Uint8Array.from(params.buffer);
486
521
  form.append("file", new Blob([bytes], { type: params.contentType }), params.filename);
487
522
  const query = new URLSearchParams({ workspace_id: params.workspaceId });
488
523
  if (params.nonce) query.set("nonce", params.nonce);
@@ -779,7 +814,7 @@ const clickClackSetupAdapter = {
779
814
  const claimUrl = setup.exactClaimUrl && !privateApiBaseUrl ? setup.exactClaimUrl : buildClickClackSetupClaimUrl(privateApiBaseUrl ?? setup.baseUrl);
780
815
  let claim;
781
816
  try {
782
- const { claimClickClackSetupCode } = await import("./setup-claim-CQjgPGxU.js");
817
+ const { claimClickClackSetupCode } = await import("./setup-claim-Dd4LkDU2.js");
783
818
  claim = await claimClickClackSetupCode({
784
819
  claimUrl,
785
820
  code: setup.code,
@@ -167,7 +167,9 @@ class PerMessageDeflate {
167
167
  (typeof opts.serverMaxWindowBits === 'number' &&
168
168
  opts.serverMaxWindowBits > params.server_max_window_bits))) ||
169
169
  (typeof opts.clientMaxWindowBits === 'number' &&
170
- !params.client_max_window_bits)
170
+ (typeof params.client_max_window_bits === 'number'
171
+ ? opts.clientMaxWindowBits > params.client_max_window_bits
172
+ : !params.client_max_window_bits))
171
173
  ) {
172
174
  return false;
173
175
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ws",
3
- "version": "8.21.1",
3
+ "version": "8.21.3",
4
4
  "description": "Simple to use, blazing fast and thoroughly tested websocket client and server for Node.js",
5
5
  "keywords": [
6
6
  "HyBi",
@@ -24,6 +24,9 @@
24
24
  "configWrites": {
25
25
  "type": "boolean"
26
26
  },
27
+ "responsePrefix": {
28
+ "type": "string"
29
+ },
27
30
  "baseUrl": {
28
31
  "type": "string",
29
32
  "format": "uri"
@@ -306,6 +309,11 @@
306
309
  },
307
310
  "additionalProperties": false
308
311
  },
312
+ "historyLimit": {
313
+ "type": "integer",
314
+ "minimum": 0,
315
+ "maximum": 9007199254740991
316
+ },
309
317
  "accounts": {
310
318
  "type": "object",
311
319
  "propertyNames": {
@@ -323,6 +331,9 @@
323
331
  "configWrites": {
324
332
  "type": "boolean"
325
333
  },
334
+ "responsePrefix": {
335
+ "type": "string"
336
+ },
326
337
  "baseUrl": {
327
338
  "type": "string",
328
339
  "format": "uri"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/clickclack",
3
- "version": "2026.8.1-beta.2",
3
+ "version": "2026.9.1-beta.1",
4
4
  "description": "OpenClaw ClickClack channel plugin",
5
5
  "type": "module",
6
6
  "exports": {
@@ -9,11 +9,11 @@
9
9
  "./runtime-api.js": "./dist/runtime-api.js"
10
10
  },
11
11
  "dependencies": {
12
- "ws": "8.21.1",
12
+ "ws": "8.21.3",
13
13
  "zod": "4.4.3"
14
14
  },
15
15
  "peerDependencies": {
16
- "openclaw": ">=2026.8.1-beta.2"
16
+ "openclaw": ">=2026.9.1-beta.1"
17
17
  },
18
18
  "peerDependenciesMeta": {
19
19
  "openclaw": {
@@ -139,10 +139,10 @@
139
139
  "allowInvalidConfigRecovery": true
140
140
  },
141
141
  "compat": {
142
- "pluginApi": ">=2026.8.1-beta.2"
142
+ "pluginApi": ">=2026.9.1-beta.1"
143
143
  },
144
144
  "build": {
145
- "openclawVersion": "2026.8.1-beta.2",
145
+ "openclawVersion": "2026.9.1-beta.1",
146
146
  "bundledDist": false
147
147
  },
148
148
  "release": {