@openclaw/clickclack 2026.7.2-beta.5 → 2026.7.2-beta.7

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.
@@ -1,2 +1,2 @@
1
- import { t as clickClackPlugin } from "./channel-DfcFlLjC.js";
1
+ import { t as clickClackPlugin } from "./channel-CECIpaS0.js";
2
2
  export { clickClackPlugin };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as registerClickClackDiscussions } from "./runtime-api-D1H9vheM.js";
1
+ import { t as registerClickClackDiscussions } from "./runtime-api-CZ1rmHjv.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 { d as createClickClackClient, f as isClickClackChannelNameConflict, u as ClickClackHttpError, x as resolveClickClackAccount, y as listClickClackAccountIds } from "./setup-surface-CD6MUC1g.js";
2
- import { C as listPendingDiscussionOpens, S as clearDiscussionBindingGeneration, T as reserveDiscussionBindingGeneration, _ as fallbackDiscussionLabel, a as isClickClackDiscussionChannelRevoked, b as slugifyDiscussionLabel, c as discussionAccounts, d as resolveDiscussionBindingAccount, f as bindingMatchesActiveSessionIncarnation, g as discussionExternalRef, h as discussionCredentialFingerprint, i as clearClickClackDiscussionChannelRevoked, l as discussionInfoForBinding, m as getClickClackDiscussionBindingStore, o as markClickClackDiscussionChannelIdentityRevoked, p as bindingMatchesSessionIncarnation, s as markClickClackDiscussionChannelRevoked, u as normalizedServerBaseUrl, v as isDiscussionSessionKey, w as recordPendingDiscussionOpen, x as truncateDiscussionDisplayTitle, y as resolveDiscussionLabel } from "./channel-DfcFlLjC.js";
1
+ import { d as createClickClackClient, f as isClickClackChannelNameConflict, u as ClickClackHttpError, x as resolveClickClackAccount, y as listClickClackAccountIds } from "./setup-surface-DAy8vDJK.js";
2
+ import { C as truncateDiscussionDisplayTitle, D as reserveDiscussionBindingGeneration, E as recordPendingDiscussionOpen, S as slugifyDiscussionLabel, T as listPendingDiscussionOpens, _ as discussionCredentialFingerprint, b as isDiscussionSessionKey, c as markClickClackDiscussionChannelIdentityRevoked, d as discussionInfoForBinding, f as normalizedServerBaseUrl, g as getClickClackDiscussionBindingStore, h as bindingMatchesSessionIncarnation, l as markClickClackDiscussionChannelRevoked, m as bindingMatchesActiveSessionIncarnation, o as clearClickClackDiscussionChannelRevoked, p as resolveDiscussionBindingAccount, s as isClickClackDiscussionChannelRevoked, u as discussionAccounts, v as discussionExternalRef, w as clearDiscussionBindingGeneration, x as resolveDiscussionLabel, y as fallbackDiscussionLabel } from "./channel-CECIpaS0.js";
3
3
  import "./api.js";
4
4
  import { resolveAgentIdFromSessionKey } from "openclaw/plugin-sdk/routing";
5
5
  import { randomUUID } from "node:crypto";
@@ -1,4 +1,4 @@
1
- import { d as createClickClackClient, x as resolveClickClackAccount } from "./setup-surface-CD6MUC1g.js";
2
- import { D as setClickClackRuntime, r as parseClickClackTarget } from "./channel-DfcFlLjC.js";
3
- import { t as registerClickClackDiscussions } from "./runtime-api-D1H9vheM.js";
1
+ import { d as createClickClackClient, x as resolveClickClackAccount } from "./setup-surface-DAy8vDJK.js";
2
+ import { a as setClickClackRuntime, r as parseClickClackTarget } from "./channel-CECIpaS0.js";
3
+ import { t as registerClickClackDiscussions } from "./runtime-api-CZ1rmHjv.js";
4
4
  export { createClickClackClient, parseClickClackTarget, registerClickClackDiscussions, resolveClickClackAccount, setClickClackRuntime };
@@ -1,4 +1,4 @@
1
- import { a as buildClickClackSetupClaimUrl, o as isClickClackSetupLoopbackHost, s as requireClickClackSetupApiBaseUrl } from "./setup-surface-CD6MUC1g.js";
1
+ import { a as buildClickClackSetupClaimUrl, o as isClickClackSetupLoopbackHost, s as requireClickClackSetupApiBaseUrl } from "./setup-surface-DAy8vDJK.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 { _ as clickClackMeta, g as clickClackConfigAdapter, m as clickClackConfigSchema, n as clickClackSetupAdapter, r as clickClackSetupContract, t as clickClackSetupWizard } from "./setup-surface-CD6MUC1g.js";
1
+ import { _ as clickClackMeta, g as clickClackConfigAdapter, m as clickClackConfigSchema, n as clickClackSetupAdapter, r as clickClackSetupContract, t as clickClackSetupWizard } from "./setup-surface-DAy8vDJK.js";
2
2
  //#region extensions/clickclack/src/channel.setup.ts
3
3
  const clickClackSetupPlugin = {
4
4
  id: "clickclack",
@@ -14,7 +14,7 @@ import { redactToolPayloadText } from "openclaw/plugin-sdk/logging-core";
14
14
  import { readProviderJsonResponse, readResponseTextLimited } from "openclaw/plugin-sdk/provider-http";
15
15
  import { WebSocket } from "ws";
16
16
  import { defineChannelSetupContract } from "openclaw/plugin-sdk/channel-setup";
17
- import { DEFAULT_ACCOUNT_ID as DEFAULT_ACCOUNT_ID$1, applyAccountNameToChannelSection, baseUrlTextInput, createSetupTranslator, createStandardChannelSetupStatus, defineTokenCredential, formatDocsLink, hasConfiguredSecretInput, migrateBaseNameToDefaultAccount, moveSingleAccountChannelSectionToDefaultAccount, patchScopedAccountConfig, setSetupChannelEnabled } from "openclaw/plugin-sdk/setup";
17
+ import { DEFAULT_ACCOUNT_ID as DEFAULT_ACCOUNT_ID$1, applyAccountNameToChannelSection, baseUrlTextInput, createSetupTranslator, createStandardChannelSetupStatus, defineTokenCredential, formatDocsLink, hasConfiguredSecretInput, moveSingleAccountChannelSectionToDefaultAccount, patchScopedAccountConfig, prepareScopedSetupConfig, setSetupChannelEnabled } from "openclaw/plugin-sdk/setup";
18
18
  import { createSetupInputPresenceValidator } from "openclaw/plugin-sdk/setup-runtime";
19
19
  import net from "node:net";
20
20
  //#region \0rolldown/runtime.js
@@ -47,22 +47,39 @@ const { listAccountIds: listClickClackAccountIds, resolveDefaultAccountId: resol
47
47
  return Boolean(channel?.baseUrl?.trim() && (hasConfiguredAccountValue(channel.token) || Boolean(channel.tokenFile?.trim()) || Boolean(process.env.CLICKCLACK_BOT_TOKEN?.trim())) && channel.workspace?.trim());
48
48
  }
49
49
  });
50
+ function mergeClickClackGroups(...sources) {
51
+ const merged = /* @__PURE__ */ new Map();
52
+ for (const source of sources) for (const [rawKey, value] of Object.entries(source ?? {})) {
53
+ const key = rawKey.trim();
54
+ if (!key) continue;
55
+ merged.set(key, {
56
+ ...merged.get(key),
57
+ ...value.requireMention !== void 0 ? { requireMention: value.requireMention } : {},
58
+ ...value.mentionPatterns !== void 0 ? { mentionPatterns: value.mentionPatterns } : {}
59
+ });
60
+ }
61
+ return Object.fromEntries(merged);
62
+ }
50
63
  function resolveClickClackAccountConfig(cfg, accountId) {
51
64
  const channel = cfg.channels?.clickclack;
52
65
  const merged = resolveMergedClickClackAccountConfig(cfg, accountId);
53
66
  const account = resolveNormalizedAccountEntry(channel?.accounts, accountId, normalizeAccountId);
67
+ const mergedWithGroups = channel?.groups || account?.groups ? {
68
+ ...merged,
69
+ groups: mergeClickClackGroups(channel?.groups, account?.groups)
70
+ } : merged;
54
71
  const accountTokenFile = account?.tokenFile?.trim();
55
72
  if (accountTokenFile) return {
56
- ...merged,
73
+ ...mergedWithGroups,
57
74
  token: account?.token,
58
75
  tokenFile: accountTokenFile
59
76
  };
60
77
  if (hasConfiguredAccountValue(account?.token)) return {
61
- ...merged,
78
+ ...mergedWithGroups,
62
79
  token: account?.token,
63
80
  tokenFile: void 0
64
81
  };
65
- return merged;
82
+ return mergedWithGroups;
66
83
  }
67
84
  function resolveClickClackToken(params) {
68
85
  const tokenFile = params.tokenFile?.trim();
@@ -138,6 +155,9 @@ function resolveClickClackAccount(params) {
138
155
  ...controlUrlBase ? { controlUrlBase } : {},
139
156
  section: merged.discussions?.section?.trim() || DEFAULT_DISCUSSIONS_SECTION
140
157
  },
158
+ requireMention: merged.requireMention === true,
159
+ mentionPatterns: merged.mentionPatterns ?? [],
160
+ groups: mergeClickClackGroups(merged.groups),
141
161
  config: {
142
162
  ...merged,
143
163
  allowFrom: merged.allowFrom ?? ["*"]
@@ -200,6 +220,12 @@ const ClickClackAccountConfigSchema = z.object({
200
220
  reconnectMs: z.number().int().min(100).max(6e4).optional(),
201
221
  agentActivity: z.boolean().optional(),
202
222
  commandMenu: z.boolean().optional(),
223
+ requireMention: z.boolean().optional(),
224
+ mentionPatterns: z.array(z.string()).optional(),
225
+ groups: z.record(z.string(), z.object({
226
+ requireMention: z.boolean().optional(),
227
+ mentionPatterns: z.array(z.string()).optional()
228
+ }).strict()).optional(),
203
229
  discussions: z.object({
204
230
  enabled: z.boolean().optional(),
205
231
  workspace: z.string().optional(),
@@ -666,23 +692,20 @@ function formatClickClackSetupCodeClaimError(error) {
666
692
  }
667
693
  function applyClickClackSetupConfigPatch(params) {
668
694
  const accountId = normalizeAccountId(params.accountId);
669
- const namedConfig = applyAccountNameToChannelSection({
670
- cfg: accountId === DEFAULT_ACCOUNT_ID ? params.cfg : moveSingleAccountChannelSectionToDefaultAccount({
671
- cfg: params.cfg,
695
+ return patchScopedAccountConfig({
696
+ cfg: prepareScopedSetupConfig({
697
+ cfg: accountId === DEFAULT_ACCOUNT_ID ? params.cfg : moveSingleAccountChannelSectionToDefaultAccount({
698
+ cfg: params.cfg,
699
+ channelKey: channel$1,
700
+ setupSurface: clickClackSetupAdapter
701
+ }),
672
702
  channelKey: channel$1,
673
- setupSurface: clickClackSetupAdapter
703
+ accountId,
704
+ name: params.name,
705
+ migrateBaseName: accountId !== DEFAULT_ACCOUNT_ID
674
706
  }),
675
707
  channelKey: channel$1,
676
708
  accountId,
677
- name: params.name
678
- });
679
- return patchScopedAccountConfig({
680
- cfg: accountId !== DEFAULT_ACCOUNT_ID ? migrateBaseNameToDefaultAccount({
681
- cfg: namedConfig,
682
- channelKey: channel$1
683
- }) : namedConfig,
684
- channelKey: channel$1,
685
- accountId,
686
709
  patch: params.patch,
687
710
  ...params.clearFields ? { clearFields: params.clearFields } : {}
688
711
  });
@@ -710,7 +733,7 @@ const clickClackSetupAdapter = {
710
733
  const claimUrl = setup.exactClaimUrl && !privateApiBaseUrl ? setup.exactClaimUrl : buildClickClackSetupClaimUrl(privateApiBaseUrl ?? setup.baseUrl);
711
734
  let claim;
712
735
  try {
713
- const { claimClickClackSetupCode } = await import("./setup-claim-BFU16zoo.js");
736
+ const { claimClickClackSetupCode } = await import("./setup-claim-CP-QZ5bt.js");
714
737
  claim = await claimClickClackSetupCode({
715
738
  claimUrl,
716
739
  code: setup.code,
@@ -6,16 +6,6 @@
6
6
  "channels": [
7
7
  "clickclack"
8
8
  ],
9
- "contracts": {
10
- "tools": [
11
- "discussion"
12
- ]
13
- },
14
- "configSchema": {
15
- "type": "object",
16
- "additionalProperties": false,
17
- "properties": {}
18
- },
19
9
  "channelConfigs": {
20
10
  "clickclack": {
21
11
  "schema": {
@@ -165,6 +155,36 @@
165
155
  "commandMenu": {
166
156
  "type": "boolean"
167
157
  },
158
+ "requireMention": {
159
+ "type": "boolean"
160
+ },
161
+ "mentionPatterns": {
162
+ "type": "array",
163
+ "items": {
164
+ "type": "string"
165
+ }
166
+ },
167
+ "groups": {
168
+ "type": "object",
169
+ "propertyNames": {
170
+ "type": "string"
171
+ },
172
+ "additionalProperties": {
173
+ "type": "object",
174
+ "properties": {
175
+ "requireMention": {
176
+ "type": "boolean"
177
+ },
178
+ "mentionPatterns": {
179
+ "type": "array",
180
+ "items": {
181
+ "type": "string"
182
+ }
183
+ }
184
+ },
185
+ "additionalProperties": false
186
+ }
187
+ },
168
188
  "discussions": {
169
189
  "type": "object",
170
190
  "properties": {
@@ -335,6 +355,36 @@
335
355
  "commandMenu": {
336
356
  "type": "boolean"
337
357
  },
358
+ "requireMention": {
359
+ "type": "boolean"
360
+ },
361
+ "mentionPatterns": {
362
+ "type": "array",
363
+ "items": {
364
+ "type": "string"
365
+ }
366
+ },
367
+ "groups": {
368
+ "type": "object",
369
+ "propertyNames": {
370
+ "type": "string"
371
+ },
372
+ "additionalProperties": {
373
+ "type": "object",
374
+ "properties": {
375
+ "requireMention": {
376
+ "type": "boolean"
377
+ },
378
+ "mentionPatterns": {
379
+ "type": "array",
380
+ "items": {
381
+ "type": "string"
382
+ }
383
+ }
384
+ },
385
+ "additionalProperties": false
386
+ }
387
+ },
338
388
  "discussions": {
339
389
  "type": "object",
340
390
  "properties": {
@@ -365,7 +415,17 @@
365
415
  "additionalProperties": false
366
416
  },
367
417
  "label": "ClickClack",
368
- "description": "self-hosted chat via first-class ClickClack bot tokens."
418
+ "description": "ClickClack channel accounts and group activation policy."
369
419
  }
420
+ },
421
+ "contracts": {
422
+ "tools": [
423
+ "discussion"
424
+ ]
425
+ },
426
+ "configSchema": {
427
+ "type": "object",
428
+ "additionalProperties": false,
429
+ "properties": {}
370
430
  }
371
431
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/clickclack",
3
- "version": "2026.7.2-beta.5",
3
+ "version": "2026.7.2-beta.7",
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.7.2-beta.5"
16
+ "openclaw": ">=2026.7.2-beta.7"
17
17
  },
18
18
  "peerDependenciesMeta": {
19
19
  "openclaw": {
@@ -136,10 +136,10 @@
136
136
  "allowInvalidConfigRecovery": true
137
137
  },
138
138
  "compat": {
139
- "pluginApi": ">=2026.7.2-beta.5"
139
+ "pluginApi": ">=2026.7.2-beta.7"
140
140
  },
141
141
  "build": {
142
- "openclawVersion": "2026.7.2-beta.5",
142
+ "openclawVersion": "2026.7.2-beta.7",
143
143
  "bundledDist": false
144
144
  },
145
145
  "release": {