@openclaw/clickclack 2026.8.1 → 2026.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -119,8 +119,8 @@ not have an account selector.
119
119
  Messages in the managed channel run in a stable side session under the same
120
120
  agent id as the attached main session. The plugin installs a scoped host grant
121
121
  for `sessions_history`, `session_status`, and `sessions_send` between that side
122
- session and its attached main session, so `tools.sessions.visibility` can stay
123
- at its safer default `tree`. A second host-side policy blocks session discovery
122
+ session and its attached main session, so `tools.sessions.visibility` can be set
123
+ explicitly to `tree` for narrower access than the agent-wide default. A second host-side policy blocks session discovery
124
124
  and alternate targets; the side-agent prompt is not the authorization boundary.
125
125
  The agent still needs those three tools in its effective tool allowlist.
126
126
 
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-1p34fBnm.js";
2
- import { a as setClickClackRuntime, i as getClickClackRuntime, n as buildClickClackTarget, r as parseClickClackTarget, t as clickClackPlugin } from "./channel-Byi8SvFt.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-k_ZLgpwc.js";
2
+ import { a as setClickClackRuntime, i as getClickClackRuntime, n as buildClickClackTarget, r as parseClickClackTarget, t as clickClackPlugin } from "./channel-84ZGfWxl.js";
3
3
  export { DEFAULT_ACCOUNT_ID, buildClickClackTarget, clickClackConfigSchema, clickClackPlugin, createClickClackClient, getClickClackRuntime, listClickClackAccountIds, listEnabledClickClackAccounts, parseClickClackTarget, resolveClickClackAccount, resolveDefaultClickClackAccountId, setClickClackRuntime };
@@ -1,4 +1,4 @@
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";
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-k_ZLgpwc.js";
2
2
  import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-BKkzzjBA.js";
3
3
  import { resolveChannelMediaMaxBytes } from "openclaw/plugin-sdk/account-helpers";
4
4
  import { parseDateStringTimestampMs } from "openclaw/plugin-sdk/number-runtime";
@@ -501,7 +501,7 @@ const CLICKCLACK_MENTION_PATTERN = /(?:^|[^a-z0-9_@-])@([a-z0-9][a-z0-9_-]{1,31}
501
501
  function buildLocalMentionRegexes(params) {
502
502
  if (params.mentionPatterns.length === 0) return [];
503
503
  const cfg = params.cfg;
504
- return buildMentionRegexes({
504
+ const syntheticCfg = {
505
505
  ...cfg,
506
506
  messages: {
507
507
  ...cfg?.messages,
@@ -510,7 +510,8 @@ function buildLocalMentionRegexes(params) {
510
510
  mentionPatterns: params.mentionPatterns
511
511
  }
512
512
  }
513
- }, void 0, {
513
+ };
514
+ return buildMentionRegexes(syntheticCfg, void 0, {
514
515
  provider: "clickclack",
515
516
  conversationId: params.channelId
516
517
  });
@@ -1082,11 +1083,11 @@ function createClickClackActivityPublisher(params) {
1082
1083
  * Outbound ClickClack delivery helpers for channel messages, thread replies,
1083
1084
  * and direct messages.
1084
1085
  */
1085
- const CLICKCLACK_MAX_UPLOAD_BYTES = 64 * 1024 * 1024;
1086
+ const CLICKCLACK_MAX_UPLOAD_BYTES = 67108864;
1086
1087
  const CLICKCLACK_FORMAT_PROFILE = FormatCapabilityProfile.define({
1087
1088
  mechanism: "markdown",
1088
1089
  chunk: {
1089
- limit: 1024 * 1024,
1090
+ limit: 1048576,
1090
1091
  unit: "bytes"
1091
1092
  }
1092
1093
  });
@@ -2203,21 +2204,22 @@ const clickClackPlugin = createChatChannelPlugin({
2203
2204
  },
2204
2205
  resolveOutboundSessionRoute: ({ cfg, agentId, accountId, target, replyToId, threadId, currentSessionKey }) => {
2205
2206
  const parsed = parseClickClackTarget(target);
2207
+ const baseRoute = buildChannelOutboundSessionRoute({
2208
+ cfg,
2209
+ agentId,
2210
+ channel: CHANNEL_ID,
2211
+ accountId,
2212
+ recipientSessionExact: parsed.kind === "dm",
2213
+ peer: {
2214
+ kind: parsed.chatType === "direct" ? "direct" : "channel",
2215
+ id: buildClickClackTarget(parsed)
2216
+ },
2217
+ chatType: parsed.chatType,
2218
+ from: `clickclack:${accountId ?? DEFAULT_ACCOUNT_ID}`,
2219
+ to: buildClickClackTarget(parsed)
2220
+ });
2206
2221
  return buildThreadAwareOutboundSessionRoute({
2207
- route: buildChannelOutboundSessionRoute({
2208
- cfg,
2209
- agentId,
2210
- channel: CHANNEL_ID,
2211
- accountId,
2212
- recipientSessionExact: parsed.kind === "dm",
2213
- peer: {
2214
- kind: parsed.chatType === "direct" ? "direct" : "channel",
2215
- id: buildClickClackTarget(parsed)
2216
- },
2217
- chatType: parsed.chatType,
2218
- from: `clickclack:${accountId ?? DEFAULT_ACCOUNT_ID}`,
2219
- to: buildClickClackTarget(parsed)
2220
- }),
2222
+ route: baseRoute,
2221
2223
  replyToId,
2222
2224
  threadId: threadId ?? (parsed.kind === "thread" ? parsed.id : void 0),
2223
2225
  currentSessionKey,
@@ -1,2 +1,2 @@
1
- import { t as clickClackPlugin } from "./channel-Byi8SvFt.js";
1
+ import { t as clickClackPlugin } from "./channel-84ZGfWxl.js";
2
2
  export { clickClackPlugin };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as registerClickClackDiscussions } from "./runtime-api-DynyiJBy.js";
1
+ import { t as registerClickClackDiscussions } from "./runtime-api-6Kws_vrf.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-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";
1
+ import { b as resolveClickClackAccount, d as isClickClackChannelNameConflict, l as ClickClackHttpError, u as createClickClackClient, v as listClickClackAccountIds } from "./setup-surface-k_ZLgpwc.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-84ZGfWxl.js";
3
3
  import "./api.js";
4
4
  import { randomUUID } from "node:crypto";
5
5
  import { buildControlUiSessionPath, registerSessionDiscussionProvider } from "openclaw/plugin-sdk/session-discussion";
@@ -338,7 +338,7 @@ async function openClickClackDiscussionBinding(params) {
338
338
  }
339
339
  break;
340
340
  } catch (error) {
341
- if (isClickClackChannelNameConflict(error) && attempt < CHANNEL_NAME_MUTATION_ATTEMPTS$1 - 1) {
341
+ if (isClickClackChannelNameConflict(error) && attempt < 3) {
342
342
  channels = await client.channels(workspace.id);
343
343
  assertManagedChannelListContract(channels);
344
344
  continue;
@@ -442,7 +442,7 @@ async function openClickClackDiscussionBinding(params) {
442
442
  assertChannelPatch(currentChannel, latestManagedFields);
443
443
  break;
444
444
  } catch (error) {
445
- if (!isClickClackChannelNameConflict(error) || attempt === CHANNEL_NAME_MUTATION_ATTEMPTS$1 - 1) throw error;
445
+ if (!isClickClackChannelNameConflict(error) || attempt === 3) throw error;
446
446
  }
447
447
  }
448
448
  } catch (error) {
@@ -736,7 +736,7 @@ var ClickClackDiscussionService = class {
736
736
  assertChannelPatch(renamed, patch);
737
737
  return renamed;
738
738
  } catch (error) {
739
- if (!isClickClackChannelNameConflict(error) || attempt === CHANNEL_NAME_MUTATION_ATTEMPTS - 1) throw error;
739
+ if (!isClickClackChannelNameConflict(error) || attempt === 3) throw error;
740
740
  }
741
741
  }
742
742
  throw new Error("ClickClack discussion channel name retries were exhausted");
@@ -1,4 +1,4 @@
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";
1
+ import { b as resolveClickClackAccount, u as createClickClackClient } from "./setup-surface-k_ZLgpwc.js";
2
+ import { a as setClickClackRuntime, r as parseClickClackTarget } from "./channel-84ZGfWxl.js";
3
+ import { t as registerClickClackDiscussions } from "./runtime-api-6Kws_vrf.js";
4
4
  export { createClickClackClient, parseClickClackTarget, registerClickClackDiscussions, resolveClickClackAccount, setClickClackRuntime };
@@ -1,10 +1,10 @@
1
- import { a as isClickClackSetupLoopbackHost, i as buildClickClackSetupClaimUrl, o as requireClickClackSetupApiBaseUrl } from "./setup-surface-1p34fBnm.js";
1
+ import { a as isClickClackSetupLoopbackHost, i as buildClickClackSetupClaimUrl, o as requireClickClackSetupApiBaseUrl } from "./setup-surface-k_ZLgpwc.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";
5
5
  //#region extensions/clickclack/src/setup-claim.ts
6
- const CLICKCLACK_ERROR_BODY_LIMIT_BYTES = 8 * 1024;
7
- const CLICKCLACK_SETUP_CODE_CLAIM_JSON_LIMIT_BYTES = 64 * 1024;
6
+ const CLICKCLACK_ERROR_BODY_LIMIT_BYTES = 8192;
7
+ const CLICKCLACK_SETUP_CODE_CLAIM_JSON_LIMIT_BYTES = 65536;
8
8
  const CLICKCLACK_SETUP_CODE_CLAIM_TIMEOUT_MS = 3e4;
9
9
  var ClickClackSetupCodeClaimError = class extends Error {
10
10
  constructor(status, detail) {
@@ -1,4 +1,4 @@
1
- import { g as clickClackMeta, h as clickClackConfigAdapter, n as clickClackSetupContract, p as clickClackConfigSchema, t as clickClackSetupWizard } from "./setup-surface-1p34fBnm.js";
1
+ import { g as clickClackMeta, h as clickClackConfigAdapter, n as clickClackSetupContract, p as clickClackConfigSchema, t as clickClackSetupWizard } from "./setup-surface-k_ZLgpwc.js";
2
2
  //#region extensions/clickclack/src/channel.setup.ts
3
3
  const clickClackSetupPlugin = {
4
4
  id: "clickclack",
@@ -286,11 +286,12 @@ const ClickClackAccountConfigSchema = z.object({
286
286
  section: z.string().optional()
287
287
  }).strict().optional()
288
288
  }).strict();
289
+ const ClickClackConfigSchema = buildMultiAccountChannelSchema(ClickClackAccountConfigSchema.extend({ historyLimit: z.number().int().min(0).optional() }), { accountSchema: ClickClackAccountConfigSchema.partial() });
289
290
  /**
290
291
  * Config schema exported to core so `openclaw doctor` and config validation
291
292
  * understand both default and named ClickClack accounts.
292
293
  */
293
- const clickClackConfigSchema = buildChannelConfigSchema(buildMultiAccountChannelSchema(ClickClackAccountConfigSchema.extend({ historyLimit: z.number().int().min(0).optional() }), { accountSchema: ClickClackAccountConfigSchema.partial() }));
294
+ const clickClackConfigSchema = buildChannelConfigSchema(ClickClackConfigSchema);
294
295
  //#endregion
295
296
  //#region extensions/clickclack/src/http-client.ts
296
297
  /**
@@ -309,11 +310,11 @@ function provenanceFields(provenance) {
309
310
  if (provenance?.runtime?.trim()) fields.author_runtime = provenance.runtime.trim();
310
311
  return fields;
311
312
  }
312
- const CLICKCLACK_ERROR_BODY_LIMIT_BYTES = 8 * 1024;
313
+ const CLICKCLACK_ERROR_BODY_LIMIT_BYTES = 8192;
313
314
  const CLICKCLACK_CORRELATION_ID_MAX_LENGTH = 128;
314
315
  const CLICKCLACK_CORRELATION_ID_PATTERN = /^[A-Za-z0-9._:-]+$/u;
315
316
  const CLICKCLACK_CORRELATION_ID_HEADER = "X-Correlation-ID";
316
- const CLICKCLACK_INBOUND_JSON_LIMIT_BYTES = 16 * 1024 * 1024;
317
+ const CLICKCLACK_INBOUND_JSON_LIMIT_BYTES = 16777216;
317
318
  const CLICKCLACK_WEBSOCKET_HANDSHAKE_TIMEOUT_MS = 3e4;
318
319
  const CLICKCLACK_EPHEMERAL_REQUEST_TIMEOUT_MS = 15e3;
319
320
  const CLICKCLACK_MESSAGE_PAGE_LIMIT = 200;
@@ -778,13 +779,14 @@ function formatClickClackSetupCodeClaimError(error) {
778
779
  }
779
780
  function applyClickClackSetupConfigPatch(params) {
780
781
  const accountId = normalizeAccountId(params.accountId);
782
+ const scopedConfig = accountId === DEFAULT_ACCOUNT_ID ? params.cfg : moveSingleAccountChannelSectionToDefaultAccount({
783
+ cfg: params.cfg,
784
+ channelKey: channel$1,
785
+ setupSurface: clickClackSetupAdapter
786
+ });
781
787
  return patchScopedAccountConfig({
782
788
  cfg: prepareScopedSetupConfig({
783
- cfg: accountId === DEFAULT_ACCOUNT_ID ? params.cfg : moveSingleAccountChannelSectionToDefaultAccount({
784
- cfg: params.cfg,
785
- channelKey: channel$1,
786
- setupSurface: clickClackSetupAdapter
787
- }),
789
+ cfg: scopedConfig,
788
790
  channelKey: channel$1,
789
791
  accountId,
790
792
  name: params.name,
@@ -819,7 +821,7 @@ const clickClackSetupAdapter = {
819
821
  const claimUrl = setup.exactClaimUrl && !privateApiBaseUrl ? setup.exactClaimUrl : buildClickClackSetupClaimUrl(privateApiBaseUrl ?? setup.baseUrl);
820
822
  let claim;
821
823
  try {
822
- const { claimClickClackSetupCode } = await import("./setup-claim-D_6JQdu5.js");
824
+ const { claimClickClackSetupCode } = await import("./setup-claim-D3B51eQ0.js");
823
825
  claim = await claimClickClackSetupCode({
824
826
  claimUrl,
825
827
  code: setup.code,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/clickclack",
3
- "version": "2026.8.1",
3
+ "version": "2026.8.2",
4
4
  "description": "OpenClaw ClickClack channel plugin",
5
5
  "type": "module",
6
6
  "exports": {
@@ -13,7 +13,7 @@
13
13
  "zod": "4.4.3"
14
14
  },
15
15
  "peerDependencies": {
16
- "openclaw": ">=2026.8.1"
16
+ "openclaw": ">=2026.8.2"
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"
142
+ "pluginApi": ">=2026.8.2"
143
143
  },
144
144
  "build": {
145
- "openclawVersion": "2026.8.1",
145
+ "openclawVersion": "2026.8.2",
146
146
  "bundledDist": false
147
147
  },
148
148
  "release": {