@openclaw/clickclack 2026.8.1-beta.3 → 2026.8.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-BQ1Zyohu.js";
2
- import { a as setClickClackRuntime, i as getClickClackRuntime, n as buildClickClackTarget, r as parseClickClackTarget, t as clickClackPlugin } from "./channel-ChO3E9i2.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-1p34fBnm.js";
2
+ import { a as setClickClackRuntime, i as getClickClackRuntime, n as buildClickClackTarget, r as parseClickClackTarget, t as clickClackPlugin } from "./channel-Byi8SvFt.js";
3
3
  export { DEFAULT_ACCOUNT_ID, buildClickClackTarget, clickClackConfigSchema, clickClackPlugin, createClickClackClient, getClickClackRuntime, listClickClackAccountIds, listEnabledClickClackAccounts, parseClickClackTarget, resolveClickClackAccount, resolveDefaultClickClackAccountId, setClickClackRuntime };
@@ -1,10 +1,11 @@
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-BQ1Zyohu.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-1p34fBnm.js";
2
2
  import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-BKkzzjBA.js";
3
+ import { resolveChannelMediaMaxBytes } from "openclaw/plugin-sdk/account-helpers";
3
4
  import { parseDateStringTimestampMs } from "openclaw/plugin-sdk/number-runtime";
4
5
  import { mergePairLoopGuardConfig } from "openclaw/plugin-sdk/pair-loop-guard-runtime";
5
6
  import { readStringField } from "openclaw/plugin-sdk/string-coerce-runtime";
6
7
  import { buildChannelOutboundSessionRoute, buildThreadAwareOutboundSessionRoute, createChatChannelPlugin } from "openclaw/plugin-sdk/channel-core";
7
- import { buildChannelProgressDraftLine, createMessageReceiptFromOutboundResults, defineChannelMessageAdapter, deriveDurableFinalDeliveryRequirements } from "openclaw/plugin-sdk/channel-outbound";
8
+ import { buildChannelProgressDraftLine, createChannelMessageReplyPipeline, createMessageReceiptFromOutboundResults, defineChannelMessageAdapter, deriveDurableFinalDeliveryRequirements } from "openclaw/plugin-sdk/channel-outbound";
8
9
  import { createComputedAccountStatusAdapter, createDefaultChannelRuntimeState } from "openclaw/plugin-sdk/status-helpers";
9
10
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
10
11
  import { channelReadyPatch, channelStoppedPatch } from "openclaw/plugin-sdk/gateway-runtime";
@@ -1211,13 +1212,18 @@ async function sendClickClackMedia(params) {
1211
1212
  deliveryQueueId: params.deliveryQueueId,
1212
1213
  deliveryPartIndex: params.deliveryPartIndex
1213
1214
  });
1215
+ const { account, client } = createOutboundContext(params);
1216
+ const maxBytes = Math.min(resolveChannelMediaMaxBytes({
1217
+ cfg: params.cfg,
1218
+ accountId: account.accountId,
1219
+ resolveChannelLimitMb: () => account.config.mediaMaxMb
1220
+ }) ?? CLICKCLACK_MAX_UPLOAD_BYTES, CLICKCLACK_MAX_UPLOAD_BYTES);
1214
1221
  const preloadedMedia = nonces.upload ? void 0 : await loadOutboundMediaFromUrl(params.mediaUrl, {
1215
- maxBytes: CLICKCLACK_MAX_UPLOAD_BYTES,
1222
+ maxBytes,
1216
1223
  mediaAccess: params.mediaAccess,
1217
1224
  mediaLocalRoots: params.mediaLocalRoots,
1218
1225
  mediaReadFile: params.mediaReadFile
1219
1226
  });
1220
- const { account, client } = createOutboundContext(params);
1221
1227
  const workspaceId = await resolveWorkspaceId(client, account.workspace);
1222
1228
  const persistedUpload = nonces.upload ? await client.findUploadByNonce({
1223
1229
  workspaceId,
@@ -1228,7 +1234,7 @@ async function sendClickClackMedia(params) {
1228
1234
  let mediaFilename = preloadedMedia?.fileName?.trim();
1229
1235
  if (!upload) {
1230
1236
  const media = preloadedMedia ?? await loadOutboundMediaFromUrl(params.mediaUrl, {
1231
- maxBytes: CLICKCLACK_MAX_UPLOAD_BYTES,
1237
+ maxBytes,
1232
1238
  mediaAccess: params.mediaAccess,
1233
1239
  mediaLocalRoots: params.mediaLocalRoots,
1234
1240
  mediaReadFile: params.mediaReadFile
@@ -1592,7 +1598,7 @@ function resolveClickClackAgentRunId(messageId) {
1592
1598
  }
1593
1599
  async function dispatchModelReply(params) {
1594
1600
  const runtime = getClickClackRuntime();
1595
- const text = (await runtime.llm.complete({
1601
+ const result = await runtime.llm.complete({
1596
1602
  agentId: params.route.agentId,
1597
1603
  model: params.account.model,
1598
1604
  purpose: "clickclack bot reply",
@@ -1601,14 +1607,28 @@ async function dispatchModelReply(params) {
1601
1607
  role: "user",
1602
1608
  content: params.message.body
1603
1609
  }]
1604
- })).text.trim();
1605
- if (!text) {
1610
+ });
1611
+ const completion = result.text.trim();
1612
+ if (!completion) {
1606
1613
  runtime.logging.getChildLogger({
1607
1614
  plugin: "clickclack",
1608
1615
  feature: "model-reply"
1609
1616
  }).warn(`[${params.account.accountId}] ClickClack model reply produced no sendable text`);
1610
1617
  return;
1611
1618
  }
1619
+ const replyPipeline = createChannelMessageReplyPipeline({
1620
+ cfg: params.cfg,
1621
+ agentId: params.route.agentId,
1622
+ channel: CHANNEL_ID$1,
1623
+ accountId: params.account.accountId
1624
+ });
1625
+ replyPipeline.onModelSelected?.({
1626
+ provider: result.provider,
1627
+ model: result.model,
1628
+ thinkLevel: void 0
1629
+ });
1630
+ const responsePrefix = replyPipeline.resolveResponsePrefix?.();
1631
+ const text = responsePrefix && !completion.startsWith(responsePrefix) ? `${responsePrefix} ${completion}` : completion;
1612
1632
  await sendClickClackText({
1613
1633
  cfg: params.cfg,
1614
1634
  accountId: params.account.accountId,
@@ -1869,7 +1889,7 @@ function parseSocketEvent(data) {
1869
1889
  }
1870
1890
  async function processEvent(params) {
1871
1891
  if (params.event.type !== "message.created" && params.event.type !== "thread.reply_created") return;
1872
- if (payloadString(params.event, "author_id") === params.botUserId) return;
1892
+ if (params.abortSignal.aborted || payloadString(params.event, "author_id") === params.botUserId) return;
1873
1893
  const correlationId = eventCorrelationId(params.event);
1874
1894
  const message = await resolveEventMessage({
1875
1895
  client: correlationId ? createClickClackClient({
@@ -1883,12 +1903,13 @@ async function processEvent(params) {
1883
1903
  params.log?.warn?.(`[${params.account.accountId}] skipped unreadable ClickClack message before agent dispatch: type=${params.event.type} messageId=${payloadString(params.event, "message_id") || "unknown"}`);
1884
1904
  return;
1885
1905
  }
1886
- if (message.author_id === params.botUserId) return;
1906
+ if (params.abortSignal.aborted || message.author_id === params.botUserId) return;
1887
1907
  const access = await resolveClickClackInboundAccess({
1888
1908
  account: params.account,
1889
1909
  config: params.config,
1890
1910
  message
1891
1911
  });
1912
+ if (params.abortSignal.aborted) return;
1892
1913
  if (!access.shouldDispatch) {
1893
1914
  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}`);
1894
1915
  return;
@@ -1938,6 +1959,7 @@ async function startClickClackGatewayAccount(ctx) {
1938
1959
  botHandle: me.handle
1939
1960
  };
1940
1961
  const processIncomingEvent = (event) => processEvent({
1962
+ abortSignal: ctx.abortSignal,
1941
1963
  account,
1942
1964
  config: ctx.cfg,
1943
1965
  client,
@@ -2017,6 +2039,7 @@ async function startClickClackGatewayAccount(ctx) {
2017
2039
  socket.on("message", (data) => {
2018
2040
  if (closing || settled) return;
2019
2041
  messageQueue = messageQueue.then(async () => {
2042
+ if (ctx.abortSignal.aborted) return;
2020
2043
  const event = parseSocketEvent(data);
2021
2044
  if (!event) {
2022
2045
  ctx.log?.warn?.(`[${account.accountId}] skipped malformed ClickClack websocket event`);
@@ -1,2 +1,2 @@
1
- import { t as clickClackPlugin } from "./channel-ChO3E9i2.js";
1
+ import { t as clickClackPlugin } from "./channel-Byi8SvFt.js";
2
2
  export { clickClackPlugin };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as registerClickClackDiscussions } from "./runtime-api-B0ChZLhm.js";
1
+ import { t as registerClickClackDiscussions } from "./runtime-api-DynyiJBy.js";
2
2
  import { defineBundledChannelEntry } from "openclaw/plugin-sdk/channel-entry-contract";
3
3
  //#region extensions/clickclack/index.ts
4
4
  /**
@@ -1,10 +1,10 @@
1
- import { b as resolveClickClackAccount, d as isClickClackChannelNameConflict, l as ClickClackHttpError, u as createClickClackClient, v as listClickClackAccountIds } from "./setup-surface-BQ1Zyohu.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-ChO3E9i2.js";
1
+ import { b as resolveClickClackAccount, d as isClickClackChannelNameConflict, l as ClickClackHttpError, u as createClickClackClient, v as listClickClackAccountIds } from "./setup-surface-1p34fBnm.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-Byi8SvFt.js";
3
3
  import "./api.js";
4
4
  import { randomUUID } from "node:crypto";
5
5
  import { buildControlUiSessionPath, registerSessionDiscussionProvider } from "openclaw/plugin-sdk/session-discussion";
6
6
  import { createSessionVisibilityChecker } from "openclaw/plugin-sdk/session-visibility";
7
- import { resolveSessionAgentId } from "openclaw/plugin-sdk/agent-scope-runtime";
7
+ import { resolveSessionAgentIdStrict } from "openclaw/plugin-sdk/agent-scope-runtime";
8
8
  import { textResult } from "openclaw/plugin-sdk/tool-results";
9
9
  //#region extensions/clickclack/src/discussions/binding-retention.ts
10
10
  var DetachedDiscussionBindingRetention = class {
@@ -257,7 +257,7 @@ async function openClickClackDiscussionBinding(params) {
257
257
  if (listPendingDiscussionOpens(runtime).some((pending) => pending.sessionKey === sessionKey)) throw new Error("A previous ClickClack discussion open is still unresolved; restore its credential and retry");
258
258
  }
259
259
  const config = runtime.config.current();
260
- const agentId = resolveSessionAgentId({
260
+ const agentId = resolveSessionAgentIdStrict({
261
261
  config,
262
262
  sessionKey
263
263
  });
@@ -1,4 +1,4 @@
1
- import { b as resolveClickClackAccount, u as createClickClackClient } from "./setup-surface-BQ1Zyohu.js";
2
- import { a as setClickClackRuntime, r as parseClickClackTarget } from "./channel-ChO3E9i2.js";
3
- import { t as registerClickClackDiscussions } from "./runtime-api-B0ChZLhm.js";
1
+ import { b as resolveClickClackAccount, u as createClickClackClient } from "./setup-surface-1p34fBnm.js";
2
+ import { a as setClickClackRuntime, r as parseClickClackTarget } from "./channel-Byi8SvFt.js";
3
+ import { t as registerClickClackDiscussions } from "./runtime-api-DynyiJBy.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-BQ1Zyohu.js";
1
+ import { a as isClickClackSetupLoopbackHost, i as buildClickClackSetupClaimUrl, o as requireClickClackSetupApiBaseUrl } from "./setup-surface-1p34fBnm.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-BQ1Zyohu.js";
1
+ import { g as clickClackMeta, h as clickClackConfigAdapter, n as clickClackSetupContract, p as clickClackConfigSchema, t as clickClackSetupWizard } from "./setup-surface-1p34fBnm.js";
2
2
  //#region extensions/clickclack/src/channel.setup.ts
3
3
  const clickClackSetupPlugin = {
4
4
  id: "clickclack",
@@ -3,9 +3,9 @@ import { DEFAULT_ACCOUNT_ID, DEFAULT_ACCOUNT_ID as DEFAULT_ACCOUNT_ID$2, normali
3
3
  import { resolveNormalizedAccountEntry } from "openclaw/plugin-sdk/account-resolution-runtime";
4
4
  import { resolveIntegerOption } from "openclaw/plugin-sdk/number-runtime";
5
5
  import { mergePairLoopGuardConfig } from "openclaw/plugin-sdk/pair-loop-guard-runtime";
6
- import { resolveDefaultSecretProviderAlias } from "openclaw/plugin-sdk/provider-auth";
7
6
  import { tryReadSecretFileSync } from "openclaw/plugin-sdk/secret-file-runtime";
8
7
  import { buildSecretInputSchema, normalizeSecretInputString, resolveSecretInputString } from "openclaw/plugin-sdk/secret-input";
8
+ import { canResolveEnvSecretRefInReadOnlyPath } from "openclaw/plugin-sdk/secret-ref-readonly";
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";
@@ -121,11 +121,15 @@ function resolveClickClackToken(params) {
121
121
  };
122
122
  }
123
123
  if (resolved.status === "configured_unavailable" && resolved.ref.source === "env") {
124
- const providerConfig = params.cfg.secrets?.providers?.[resolved.ref.provider];
125
- if (providerConfig) {
124
+ if (!canResolveEnvSecretRefInReadOnlyPath({
125
+ cfg: params.cfg,
126
+ ...resolved.ref
127
+ })) {
128
+ const providerConfig = params.cfg.secrets?.providers?.[resolved.ref.provider];
129
+ if (!providerConfig) throw new Error(`Secret provider "${resolved.ref.provider}" is not configured (ref: env:${resolved.ref.provider}:${resolved.ref.id}).`);
126
130
  if (providerConfig.source !== "env") throw new Error(`Secret provider "${resolved.ref.provider}" has source "${providerConfig.source}" but ref requests "env".`);
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.`);
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}).`);
131
+ throw new Error(`Environment variable "${resolved.ref.id}" is not allowlisted in secrets.providers.${resolved.ref.provider}.allowlist.`);
132
+ }
129
133
  const token = normalizeSecretInputString((params.env ?? process.env)[resolved.ref.id]);
130
134
  return {
131
135
  token: token ?? "",
@@ -246,6 +250,8 @@ const ClickClackAccountConfigSchema = z.object({
246
250
  name: z.string().optional(),
247
251
  enabled: z.boolean().optional(),
248
252
  configWrites: z.boolean().optional(),
253
+ mediaMaxMb: z.number().positive().optional(),
254
+ responsePrefix: z.string().optional(),
249
255
  baseUrl: z.string().url().optional(),
250
256
  apiBaseUrl: z.string().url().optional(),
251
257
  token: buildSecretInputSchema().optional(),
@@ -284,7 +290,7 @@ const ClickClackAccountConfigSchema = z.object({
284
290
  * Config schema exported to core so `openclaw doctor` and config validation
285
291
  * understand both default and named ClickClack accounts.
286
292
  */
287
- const clickClackConfigSchema = buildChannelConfigSchema(buildMultiAccountChannelSchema(ClickClackAccountConfigSchema, { accountSchema: ClickClackAccountConfigSchema.partial() }));
293
+ const clickClackConfigSchema = buildChannelConfigSchema(buildMultiAccountChannelSchema(ClickClackAccountConfigSchema.extend({ historyLimit: z.number().int().min(0).optional() }), { accountSchema: ClickClackAccountConfigSchema.partial() }));
288
294
  //#endregion
289
295
  //#region extensions/clickclack/src/http-client.ts
290
296
  /**
@@ -813,7 +819,7 @@ const clickClackSetupAdapter = {
813
819
  const claimUrl = setup.exactClaimUrl && !privateApiBaseUrl ? setup.exactClaimUrl : buildClickClackSetupClaimUrl(privateApiBaseUrl ?? setup.baseUrl);
814
820
  let claim;
815
821
  try {
816
- const { claimClickClackSetupCode } = await import("./setup-claim--cdFCz2P.js");
822
+ const { claimClickClackSetupCode } = await import("./setup-claim-D_6JQdu5.js");
817
823
  claim = await claimClickClackSetupCode({
818
824
  claimUrl,
819
825
  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,13 @@
24
24
  "configWrites": {
25
25
  "type": "boolean"
26
26
  },
27
+ "mediaMaxMb": {
28
+ "type": "number",
29
+ "exclusiveMinimum": 0
30
+ },
31
+ "responsePrefix": {
32
+ "type": "string"
33
+ },
27
34
  "baseUrl": {
28
35
  "type": "string",
29
36
  "format": "uri"
@@ -306,6 +313,11 @@
306
313
  },
307
314
  "additionalProperties": false
308
315
  },
316
+ "historyLimit": {
317
+ "type": "integer",
318
+ "minimum": 0,
319
+ "maximum": 9007199254740991
320
+ },
309
321
  "accounts": {
310
322
  "type": "object",
311
323
  "propertyNames": {
@@ -323,6 +335,13 @@
323
335
  "configWrites": {
324
336
  "type": "boolean"
325
337
  },
338
+ "mediaMaxMb": {
339
+ "type": "number",
340
+ "exclusiveMinimum": 0
341
+ },
342
+ "responsePrefix": {
343
+ "type": "string"
344
+ },
326
345
  "baseUrl": {
327
346
  "type": "string",
328
347
  "format": "uri"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/clickclack",
3
- "version": "2026.8.1-beta.3",
3
+ "version": "2026.8.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.3"
16
+ "openclaw": ">=2026.8.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.3"
142
+ "pluginApi": ">=2026.8.1"
143
143
  },
144
144
  "build": {
145
- "openclawVersion": "2026.8.1-beta.3",
145
+ "openclawVersion": "2026.8.1",
146
146
  "bundledDist": false
147
147
  },
148
148
  "release": {