@openclaw/clickclack 2026.7.2-beta.7 → 2026.8.1-beta.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 +17 -20
- package/dist/api.js +2 -2
- package/dist/{channel-CECIpaS0.js → channel-DaHgaTy1.js} +495 -77
- package/dist/channel-plugin-api.js +1 -1
- package/dist/doctor-contract-api.js +1 -1
- package/dist/index.js +1 -1
- package/dist/{runtime-api-CZ1rmHjv.js → runtime-api-CPL3m5AD.js} +218 -231
- package/dist/runtime-api.js +3 -3
- package/dist/{setup-claim-CP-QZ5bt.js → setup-claim-CQjgPGxU.js} +1 -1
- package/dist/setup-plugin-api.js +1 -2
- package/dist/{setup-surface-DAy8vDJK.js → setup-surface-DjT-gmMe.js} +63 -16
- package/openclaw.plugin.json +201 -0
- package/package.json +8 -5
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as
|
|
1
|
+
import { a as isClickClackSetupLoopbackHost, i as buildClickClackSetupClaimUrl, o as requireClickClackSetupApiBaseUrl } from "./setup-surface-DjT-gmMe.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";
|
package/dist/setup-plugin-api.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { g as clickClackMeta, h as clickClackConfigAdapter, n as clickClackSetupContract, p as clickClackConfigSchema, t as clickClackSetupWizard } from "./setup-surface-DjT-gmMe.js";
|
|
2
2
|
//#region extensions/clickclack/src/channel.setup.ts
|
|
3
3
|
const clickClackSetupPlugin = {
|
|
4
4
|
id: "clickclack",
|
|
@@ -11,7 +11,6 @@ const clickClackSetupPlugin = {
|
|
|
11
11
|
reload: { configPrefixes: ["channels.clickclack"] },
|
|
12
12
|
configSchema: clickClackConfigSchema,
|
|
13
13
|
config: clickClackConfigAdapter,
|
|
14
|
-
setup: clickClackSetupAdapter,
|
|
15
14
|
setupContract: clickClackSetupContract,
|
|
16
15
|
setupWizard: clickClackSetupWizard
|
|
17
16
|
};
|
|
@@ -2,12 +2,13 @@ import { createAccountListHelpers, hasConfiguredAccountValue } from "openclaw/pl
|
|
|
2
2
|
import { DEFAULT_ACCOUNT_ID, DEFAULT_ACCOUNT_ID as DEFAULT_ACCOUNT_ID$2, normalizeAccountId } from "openclaw/plugin-sdk/account-id";
|
|
3
3
|
import { resolveNormalizedAccountEntry } from "openclaw/plugin-sdk/account-resolution-runtime";
|
|
4
4
|
import { resolveIntegerOption } from "openclaw/plugin-sdk/number-runtime";
|
|
5
|
+
import { mergePairLoopGuardConfig } from "openclaw/plugin-sdk/pair-loop-guard-runtime";
|
|
5
6
|
import { resolveDefaultSecretProviderAlias } from "openclaw/plugin-sdk/provider-auth";
|
|
6
7
|
import { tryReadSecretFileSync } from "openclaw/plugin-sdk/secret-file-runtime";
|
|
7
8
|
import { buildSecretInputSchema, normalizeResolvedSecretInputString, normalizeSecretInputString, resolveSecretInputString } from "openclaw/plugin-sdk/secret-input";
|
|
8
9
|
import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
9
10
|
import { getChatChannelMeta } from "openclaw/plugin-sdk/channel-plugin-common";
|
|
10
|
-
import { buildChannelConfigSchema, buildMultiAccountChannelSchema } from "openclaw/plugin-sdk/channel-config-schema";
|
|
11
|
+
import { ChannelBotLoopProtectionSchema, buildChannelAllowBotsSchema, buildChannelConfigSchema, buildMultiAccountChannelSchema } from "openclaw/plugin-sdk/channel-config-schema";
|
|
11
12
|
import { z } from "zod";
|
|
12
13
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
13
14
|
import { redactToolPayloadText } from "openclaw/plugin-sdk/logging-core";
|
|
@@ -41,7 +42,7 @@ const DEFAULT_DISCUSSIONS_SECTION = "Sessions";
|
|
|
41
42
|
const { listAccountIds: listClickClackAccountIds, resolveDefaultAccountId: resolveDefaultClickClackAccountId, resolveAccountConfig: resolveMergedClickClackAccountConfig } = createAccountListHelpers("clickclack", {
|
|
42
43
|
normalizeAccountId,
|
|
43
44
|
omitKeys: ["defaultAccount"],
|
|
44
|
-
nestedObjectKeys: ["discussions"],
|
|
45
|
+
nestedObjectKeys: ["botLoopProtection", "discussions"],
|
|
45
46
|
hasImplicitDefaultAccount: (cfg) => {
|
|
46
47
|
const channel = cfg.channels?.clickclack;
|
|
47
48
|
return Boolean(channel?.baseUrl?.trim() && (hasConfiguredAccountValue(channel.token) || Boolean(channel.tokenFile?.trim()) || Boolean(process.env.CLICKCLACK_BOT_TOKEN?.trim())) && channel.workspace?.trim());
|
|
@@ -52,10 +53,13 @@ function mergeClickClackGroups(...sources) {
|
|
|
52
53
|
for (const source of sources) for (const [rawKey, value] of Object.entries(source ?? {})) {
|
|
53
54
|
const key = rawKey.trim();
|
|
54
55
|
if (!key) continue;
|
|
56
|
+
const mergedBotLoopProtection = mergePairLoopGuardConfig(merged.get(key)?.botLoopProtection, value.botLoopProtection);
|
|
55
57
|
merged.set(key, {
|
|
56
58
|
...merged.get(key),
|
|
57
59
|
...value.requireMention !== void 0 ? { requireMention: value.requireMention } : {},
|
|
58
|
-
...value.mentionPatterns !== void 0 ? { mentionPatterns: value.mentionPatterns } : {}
|
|
60
|
+
...value.mentionPatterns !== void 0 ? { mentionPatterns: value.mentionPatterns } : {},
|
|
61
|
+
...value.allowBots !== void 0 ? { allowBots: value.allowBots } : {},
|
|
62
|
+
...mergedBotLoopProtection ? { botLoopProtection: mergedBotLoopProtection } : {}
|
|
59
63
|
});
|
|
60
64
|
}
|
|
61
65
|
return Object.fromEntries(merged);
|
|
@@ -148,6 +152,7 @@ function resolveClickClackAccount(params) {
|
|
|
148
152
|
max: MAX_RECONNECT_MS
|
|
149
153
|
}),
|
|
150
154
|
agentActivity: merged.agentActivity === true,
|
|
155
|
+
nativeProgress: merged.nativeProgress === true,
|
|
151
156
|
commandMenu: merged.commandMenu !== false,
|
|
152
157
|
discussions: {
|
|
153
158
|
enabled: merged.discussions?.enabled === true,
|
|
@@ -157,6 +162,8 @@ function resolveClickClackAccount(params) {
|
|
|
157
162
|
},
|
|
158
163
|
requireMention: merged.requireMention === true,
|
|
159
164
|
mentionPatterns: merged.mentionPatterns ?? [],
|
|
165
|
+
allowBots: merged.allowBots ?? false,
|
|
166
|
+
botLoopProtection: merged.botLoopProtection,
|
|
160
167
|
groups: mergeClickClackGroups(merged.groups),
|
|
161
168
|
config: {
|
|
162
169
|
...merged,
|
|
@@ -204,6 +211,7 @@ const clickClackConfigAdapter = {
|
|
|
204
211
|
const ClickClackAccountConfigSchema = z.object({
|
|
205
212
|
name: z.string().optional(),
|
|
206
213
|
enabled: z.boolean().optional(),
|
|
214
|
+
configWrites: z.boolean().optional(),
|
|
207
215
|
baseUrl: z.string().url().optional(),
|
|
208
216
|
apiBaseUrl: z.string().url().optional(),
|
|
209
217
|
token: buildSecretInputSchema().optional(),
|
|
@@ -217,14 +225,19 @@ const ClickClackAccountConfigSchema = z.object({
|
|
|
217
225
|
toolsAllow: z.array(z.string()).optional(),
|
|
218
226
|
defaultTo: z.string().optional(),
|
|
219
227
|
allowFrom: z.array(z.string()).optional(),
|
|
228
|
+
allowBots: buildChannelAllowBotsSchema({ allowMentions: true }),
|
|
229
|
+
botLoopProtection: ChannelBotLoopProtectionSchema.optional(),
|
|
220
230
|
reconnectMs: z.number().int().min(100).max(6e4).optional(),
|
|
221
231
|
agentActivity: z.boolean().optional(),
|
|
232
|
+
nativeProgress: z.boolean().optional(),
|
|
222
233
|
commandMenu: z.boolean().optional(),
|
|
223
234
|
requireMention: z.boolean().optional(),
|
|
224
235
|
mentionPatterns: z.array(z.string()).optional(),
|
|
225
236
|
groups: z.record(z.string(), z.object({
|
|
226
237
|
requireMention: z.boolean().optional(),
|
|
227
|
-
mentionPatterns: z.array(z.string()).optional()
|
|
238
|
+
mentionPatterns: z.array(z.string()).optional(),
|
|
239
|
+
allowBots: buildChannelAllowBotsSchema({ allowMentions: true }),
|
|
240
|
+
botLoopProtection: ChannelBotLoopProtectionSchema.optional()
|
|
228
241
|
}).strict()).optional(),
|
|
229
242
|
discussions: z.object({
|
|
230
243
|
enabled: z.boolean().optional(),
|
|
@@ -262,6 +275,7 @@ const CLICKCLACK_CORRELATION_ID_PATTERN = /^[A-Za-z0-9._:-]+$/u;
|
|
|
262
275
|
const CLICKCLACK_CORRELATION_ID_HEADER = "X-Correlation-ID";
|
|
263
276
|
const CLICKCLACK_INBOUND_JSON_LIMIT_BYTES = 16 * 1024 * 1024;
|
|
264
277
|
const CLICKCLACK_WEBSOCKET_HANDSHAKE_TIMEOUT_MS = 3e4;
|
|
278
|
+
const CLICKCLACK_EPHEMERAL_REQUEST_TIMEOUT_MS = 15e3;
|
|
265
279
|
const CLICKCLACK_MESSAGE_PAGE_LIMIT = 200;
|
|
266
280
|
const CLICKCLACK_DISCUSSION_ROOT_PAGE_LIMIT = 8;
|
|
267
281
|
const CLICKCLACK_DISCUSSION_THREAD_REQUEST_LIMIT = 24;
|
|
@@ -302,20 +316,33 @@ function createClickClackClient(options) {
|
|
|
302
316
|
Authorization: `Bearer ${options.token}`,
|
|
303
317
|
Accept: "application/json"
|
|
304
318
|
};
|
|
305
|
-
async function request(path, init = {}) {
|
|
319
|
+
async function request(path, init = {}, requestOptions = {}) {
|
|
306
320
|
const requestHeaders = new Headers(init.headers);
|
|
307
321
|
for (const [key, value] of Object.entries(headers)) requestHeaders.set(key, value);
|
|
308
322
|
if (correlationId) requestHeaders.set(CLICKCLACK_CORRELATION_ID_HEADER, correlationId);
|
|
309
323
|
if (init.body && !(init.body instanceof FormData)) requestHeaders.set("Content-Type", "application/json");
|
|
310
|
-
const
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
324
|
+
const controller = requestOptions.timeoutMs !== void 0 && !init.signal ? new AbortController() : void 0;
|
|
325
|
+
const timeout = controller ? setTimeout(() => controller.abort(), requestOptions.timeoutMs) : void 0;
|
|
326
|
+
try {
|
|
327
|
+
const response = await fetcher(`${baseUrl}${path}`, {
|
|
328
|
+
...init,
|
|
329
|
+
...controller ? { signal: controller.signal } : {},
|
|
330
|
+
headers: requestHeaders
|
|
331
|
+
});
|
|
332
|
+
if (!response.ok) {
|
|
333
|
+
const detail = await readResponseTextLimited(response, CLICKCLACK_ERROR_BODY_LIMIT_BYTES);
|
|
334
|
+
throw new ClickClackHttpError(response.status, redactToolPayloadText(detail), new Headers(response.headers));
|
|
335
|
+
}
|
|
336
|
+
if (requestOptions.responseMode === "none") {
|
|
337
|
+
try {
|
|
338
|
+
await response.body?.cancel();
|
|
339
|
+
} catch {}
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
return await readProviderJsonResponse(response, "ClickClack response", { maxBytes: CLICKCLACK_INBOUND_JSON_LIMIT_BYTES });
|
|
343
|
+
} finally {
|
|
344
|
+
if (timeout) clearTimeout(timeout);
|
|
317
345
|
}
|
|
318
|
-
return await readProviderJsonResponse(response, "ClickClack response", { maxBytes: CLICKCLACK_INBOUND_JSON_LIMIT_BYTES });
|
|
319
346
|
}
|
|
320
347
|
async function fetchEventPage(workspaceId, pageOptions = {}) {
|
|
321
348
|
const query = new URLSearchParams({ workspace_id: workspaceId });
|
|
@@ -509,6 +536,25 @@ function createClickClackClient(options) {
|
|
|
509
536
|
body: JSON.stringify({ body })
|
|
510
537
|
})).message;
|
|
511
538
|
},
|
|
539
|
+
/**
|
|
540
|
+
* Publishes an ephemeral realtime signal such as native agent progress.
|
|
541
|
+
* These frames are intentionally not persisted as messages.
|
|
542
|
+
*/
|
|
543
|
+
publishEphemeral: async (params) => {
|
|
544
|
+
await request("/api/realtime/ephemeral", {
|
|
545
|
+
method: "POST",
|
|
546
|
+
body: JSON.stringify({
|
|
547
|
+
workspace_id: params.workspaceId,
|
|
548
|
+
...params.channelId ? { channel_id: params.channelId } : {},
|
|
549
|
+
...params.conversationId ? { direct_conversation_id: params.conversationId } : {},
|
|
550
|
+
type: params.type,
|
|
551
|
+
payload: params.payload ?? {}
|
|
552
|
+
})
|
|
553
|
+
}, {
|
|
554
|
+
timeoutMs: CLICKCLACK_EPHEMERAL_REQUEST_TIMEOUT_MS,
|
|
555
|
+
responseMode: "none"
|
|
556
|
+
});
|
|
557
|
+
},
|
|
512
558
|
createDirectMessage: async (conversationId, body, opts) => {
|
|
513
559
|
return (await request(`/api/dms/${encodeURIComponent(conversationId)}/messages`, {
|
|
514
560
|
method: "POST",
|
|
@@ -733,7 +779,7 @@ const clickClackSetupAdapter = {
|
|
|
733
779
|
const claimUrl = setup.exactClaimUrl && !privateApiBaseUrl ? setup.exactClaimUrl : buildClickClackSetupClaimUrl(privateApiBaseUrl ?? setup.baseUrl);
|
|
734
780
|
let claim;
|
|
735
781
|
try {
|
|
736
|
-
const { claimClickClackSetupCode } = await import("./setup-claim-
|
|
782
|
+
const { claimClickClackSetupCode } = await import("./setup-claim-CQjgPGxU.js");
|
|
737
783
|
claim = await claimClickClackSetupCode({
|
|
738
784
|
claimUrl,
|
|
739
785
|
code: setup.code,
|
|
@@ -893,7 +939,8 @@ const clickClackSetupContract = defineChannelSetupContract({
|
|
|
893
939
|
cli: {
|
|
894
940
|
flags: "--use-env",
|
|
895
941
|
description: "Use CLICKCLACK_BOT_TOKEN"
|
|
896
|
-
}
|
|
942
|
+
},
|
|
943
|
+
envVars: ["CLICKCLACK_BOT_TOKEN"]
|
|
897
944
|
}
|
|
898
945
|
},
|
|
899
946
|
legacyAdapter: clickClackSetupAdapter
|
|
@@ -1128,4 +1175,4 @@ const clickClackSetupWizard = {
|
|
|
1128
1175
|
disable: (cfg) => setSetupChannelEnabled(cfg, channel, false)
|
|
1129
1176
|
};
|
|
1130
1177
|
//#endregion
|
|
1131
|
-
export {
|
|
1178
|
+
export { DEFAULT_ACCOUNT_ID$2 as _, isClickClackSetupLoopbackHost as a, resolveClickClackAccount as b, resolveWorkspaceId as c, isClickClackChannelNameConflict as d, normalizeClickClackCorrelationId as f, clickClackMeta as g, clickClackConfigAdapter as h, buildClickClackSetupClaimUrl as i, ClickClackHttpError as l, CLICKCLACK_CHANNEL_ID as m, clickClackSetupContract as n, requireClickClackSetupApiBaseUrl as o, clickClackConfigSchema as p, CLICKCLACK_SETUP_CODE_CLAIM_PATH as r, resolveChannelId as s, clickClackSetupWizard as t, createClickClackClient as u, listClickClackAccountIds as v, resolveDefaultClickClackAccountId as x, listEnabledClickClackAccounts as y };
|
package/openclaw.plugin.json
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "clickclack",
|
|
3
|
+
"doctorContract": {
|
|
4
|
+
"configRepair": true
|
|
5
|
+
},
|
|
3
6
|
"activation": {
|
|
4
7
|
"onStartup": false
|
|
5
8
|
},
|
|
@@ -18,6 +21,9 @@
|
|
|
18
21
|
"enabled": {
|
|
19
22
|
"type": "boolean"
|
|
20
23
|
},
|
|
24
|
+
"configWrites": {
|
|
25
|
+
"type": "boolean"
|
|
26
|
+
},
|
|
21
27
|
"baseUrl": {
|
|
22
28
|
"type": "string",
|
|
23
29
|
"format": "uri"
|
|
@@ -56,6 +62,29 @@
|
|
|
56
62
|
],
|
|
57
63
|
"additionalProperties": false
|
|
58
64
|
},
|
|
65
|
+
{
|
|
66
|
+
"type": "object",
|
|
67
|
+
"properties": {
|
|
68
|
+
"source": {
|
|
69
|
+
"type": "string",
|
|
70
|
+
"const": "store"
|
|
71
|
+
},
|
|
72
|
+
"provider": {
|
|
73
|
+
"type": "string",
|
|
74
|
+
"pattern": "^[a-z][a-z0-9_-]{0,63}$"
|
|
75
|
+
},
|
|
76
|
+
"id": {
|
|
77
|
+
"type": "string",
|
|
78
|
+
"pattern": "^[A-Z][A-Z0-9_]{0,127}$"
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
"required": [
|
|
82
|
+
"source",
|
|
83
|
+
"provider",
|
|
84
|
+
"id"
|
|
85
|
+
],
|
|
86
|
+
"additionalProperties": false
|
|
87
|
+
},
|
|
59
88
|
{
|
|
60
89
|
"type": "object",
|
|
61
90
|
"properties": {
|
|
@@ -144,6 +173,41 @@
|
|
|
144
173
|
"type": "string"
|
|
145
174
|
}
|
|
146
175
|
},
|
|
176
|
+
"allowBots": {
|
|
177
|
+
"anyOf": [
|
|
178
|
+
{
|
|
179
|
+
"type": "boolean"
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"type": "string",
|
|
183
|
+
"const": "mentions"
|
|
184
|
+
}
|
|
185
|
+
]
|
|
186
|
+
},
|
|
187
|
+
"botLoopProtection": {
|
|
188
|
+
"type": "object",
|
|
189
|
+
"properties": {
|
|
190
|
+
"enabled": {
|
|
191
|
+
"type": "boolean"
|
|
192
|
+
},
|
|
193
|
+
"maxEventsPerWindow": {
|
|
194
|
+
"type": "integer",
|
|
195
|
+
"exclusiveMinimum": 0,
|
|
196
|
+
"maximum": 9007199254740991
|
|
197
|
+
},
|
|
198
|
+
"windowSeconds": {
|
|
199
|
+
"type": "integer",
|
|
200
|
+
"exclusiveMinimum": 0,
|
|
201
|
+
"maximum": 9007199254740991
|
|
202
|
+
},
|
|
203
|
+
"cooldownSeconds": {
|
|
204
|
+
"type": "integer",
|
|
205
|
+
"exclusiveMinimum": 0,
|
|
206
|
+
"maximum": 9007199254740991
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
"additionalProperties": false
|
|
210
|
+
},
|
|
147
211
|
"reconnectMs": {
|
|
148
212
|
"type": "integer",
|
|
149
213
|
"minimum": 100,
|
|
@@ -152,6 +216,9 @@
|
|
|
152
216
|
"agentActivity": {
|
|
153
217
|
"type": "boolean"
|
|
154
218
|
},
|
|
219
|
+
"nativeProgress": {
|
|
220
|
+
"type": "boolean"
|
|
221
|
+
},
|
|
155
222
|
"commandMenu": {
|
|
156
223
|
"type": "boolean"
|
|
157
224
|
},
|
|
@@ -180,6 +247,41 @@
|
|
|
180
247
|
"items": {
|
|
181
248
|
"type": "string"
|
|
182
249
|
}
|
|
250
|
+
},
|
|
251
|
+
"allowBots": {
|
|
252
|
+
"anyOf": [
|
|
253
|
+
{
|
|
254
|
+
"type": "boolean"
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
"type": "string",
|
|
258
|
+
"const": "mentions"
|
|
259
|
+
}
|
|
260
|
+
]
|
|
261
|
+
},
|
|
262
|
+
"botLoopProtection": {
|
|
263
|
+
"type": "object",
|
|
264
|
+
"properties": {
|
|
265
|
+
"enabled": {
|
|
266
|
+
"type": "boolean"
|
|
267
|
+
},
|
|
268
|
+
"maxEventsPerWindow": {
|
|
269
|
+
"type": "integer",
|
|
270
|
+
"exclusiveMinimum": 0,
|
|
271
|
+
"maximum": 9007199254740991
|
|
272
|
+
},
|
|
273
|
+
"windowSeconds": {
|
|
274
|
+
"type": "integer",
|
|
275
|
+
"exclusiveMinimum": 0,
|
|
276
|
+
"maximum": 9007199254740991
|
|
277
|
+
},
|
|
278
|
+
"cooldownSeconds": {
|
|
279
|
+
"type": "integer",
|
|
280
|
+
"exclusiveMinimum": 0,
|
|
281
|
+
"maximum": 9007199254740991
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
"additionalProperties": false
|
|
183
285
|
}
|
|
184
286
|
},
|
|
185
287
|
"additionalProperties": false
|
|
@@ -218,6 +320,9 @@
|
|
|
218
320
|
"enabled": {
|
|
219
321
|
"type": "boolean"
|
|
220
322
|
},
|
|
323
|
+
"configWrites": {
|
|
324
|
+
"type": "boolean"
|
|
325
|
+
},
|
|
221
326
|
"baseUrl": {
|
|
222
327
|
"type": "string",
|
|
223
328
|
"format": "uri"
|
|
@@ -256,6 +361,29 @@
|
|
|
256
361
|
],
|
|
257
362
|
"additionalProperties": false
|
|
258
363
|
},
|
|
364
|
+
{
|
|
365
|
+
"type": "object",
|
|
366
|
+
"properties": {
|
|
367
|
+
"source": {
|
|
368
|
+
"type": "string",
|
|
369
|
+
"const": "store"
|
|
370
|
+
},
|
|
371
|
+
"provider": {
|
|
372
|
+
"type": "string",
|
|
373
|
+
"pattern": "^[a-z][a-z0-9_-]{0,63}$"
|
|
374
|
+
},
|
|
375
|
+
"id": {
|
|
376
|
+
"type": "string",
|
|
377
|
+
"pattern": "^[A-Z][A-Z0-9_]{0,127}$"
|
|
378
|
+
}
|
|
379
|
+
},
|
|
380
|
+
"required": [
|
|
381
|
+
"source",
|
|
382
|
+
"provider",
|
|
383
|
+
"id"
|
|
384
|
+
],
|
|
385
|
+
"additionalProperties": false
|
|
386
|
+
},
|
|
259
387
|
{
|
|
260
388
|
"type": "object",
|
|
261
389
|
"properties": {
|
|
@@ -344,6 +472,41 @@
|
|
|
344
472
|
"type": "string"
|
|
345
473
|
}
|
|
346
474
|
},
|
|
475
|
+
"allowBots": {
|
|
476
|
+
"anyOf": [
|
|
477
|
+
{
|
|
478
|
+
"type": "boolean"
|
|
479
|
+
},
|
|
480
|
+
{
|
|
481
|
+
"type": "string",
|
|
482
|
+
"const": "mentions"
|
|
483
|
+
}
|
|
484
|
+
]
|
|
485
|
+
},
|
|
486
|
+
"botLoopProtection": {
|
|
487
|
+
"type": "object",
|
|
488
|
+
"properties": {
|
|
489
|
+
"enabled": {
|
|
490
|
+
"type": "boolean"
|
|
491
|
+
},
|
|
492
|
+
"maxEventsPerWindow": {
|
|
493
|
+
"type": "integer",
|
|
494
|
+
"exclusiveMinimum": 0,
|
|
495
|
+
"maximum": 9007199254740991
|
|
496
|
+
},
|
|
497
|
+
"windowSeconds": {
|
|
498
|
+
"type": "integer",
|
|
499
|
+
"exclusiveMinimum": 0,
|
|
500
|
+
"maximum": 9007199254740991
|
|
501
|
+
},
|
|
502
|
+
"cooldownSeconds": {
|
|
503
|
+
"type": "integer",
|
|
504
|
+
"exclusiveMinimum": 0,
|
|
505
|
+
"maximum": 9007199254740991
|
|
506
|
+
}
|
|
507
|
+
},
|
|
508
|
+
"additionalProperties": false
|
|
509
|
+
},
|
|
347
510
|
"reconnectMs": {
|
|
348
511
|
"type": "integer",
|
|
349
512
|
"minimum": 100,
|
|
@@ -352,6 +515,9 @@
|
|
|
352
515
|
"agentActivity": {
|
|
353
516
|
"type": "boolean"
|
|
354
517
|
},
|
|
518
|
+
"nativeProgress": {
|
|
519
|
+
"type": "boolean"
|
|
520
|
+
},
|
|
355
521
|
"commandMenu": {
|
|
356
522
|
"type": "boolean"
|
|
357
523
|
},
|
|
@@ -380,6 +546,41 @@
|
|
|
380
546
|
"items": {
|
|
381
547
|
"type": "string"
|
|
382
548
|
}
|
|
549
|
+
},
|
|
550
|
+
"allowBots": {
|
|
551
|
+
"anyOf": [
|
|
552
|
+
{
|
|
553
|
+
"type": "boolean"
|
|
554
|
+
},
|
|
555
|
+
{
|
|
556
|
+
"type": "string",
|
|
557
|
+
"const": "mentions"
|
|
558
|
+
}
|
|
559
|
+
]
|
|
560
|
+
},
|
|
561
|
+
"botLoopProtection": {
|
|
562
|
+
"type": "object",
|
|
563
|
+
"properties": {
|
|
564
|
+
"enabled": {
|
|
565
|
+
"type": "boolean"
|
|
566
|
+
},
|
|
567
|
+
"maxEventsPerWindow": {
|
|
568
|
+
"type": "integer",
|
|
569
|
+
"exclusiveMinimum": 0,
|
|
570
|
+
"maximum": 9007199254740991
|
|
571
|
+
},
|
|
572
|
+
"windowSeconds": {
|
|
573
|
+
"type": "integer",
|
|
574
|
+
"exclusiveMinimum": 0,
|
|
575
|
+
"maximum": 9007199254740991
|
|
576
|
+
},
|
|
577
|
+
"cooldownSeconds": {
|
|
578
|
+
"type": "integer",
|
|
579
|
+
"exclusiveMinimum": 0,
|
|
580
|
+
"maximum": 9007199254740991
|
|
581
|
+
}
|
|
582
|
+
},
|
|
583
|
+
"additionalProperties": false
|
|
383
584
|
}
|
|
384
585
|
},
|
|
385
586
|
"additionalProperties": false
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/clickclack",
|
|
3
|
-
"version": "2026.
|
|
3
|
+
"version": "2026.8.1-beta.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.
|
|
16
|
+
"openclaw": ">=2026.8.1-beta.2"
|
|
17
17
|
},
|
|
18
18
|
"peerDependenciesMeta": {
|
|
19
19
|
"openclaw": {
|
|
@@ -123,7 +123,10 @@
|
|
|
123
123
|
"cli": {
|
|
124
124
|
"flags": "--use-env",
|
|
125
125
|
"description": "Use CLICKCLACK_BOT_TOKEN"
|
|
126
|
-
}
|
|
126
|
+
},
|
|
127
|
+
"envVars": [
|
|
128
|
+
"CLICKCLACK_BOT_TOKEN"
|
|
129
|
+
]
|
|
127
130
|
}
|
|
128
131
|
]
|
|
129
132
|
}
|
|
@@ -136,10 +139,10 @@
|
|
|
136
139
|
"allowInvalidConfigRecovery": true
|
|
137
140
|
},
|
|
138
141
|
"compat": {
|
|
139
|
-
"pluginApi": ">=2026.
|
|
142
|
+
"pluginApi": ">=2026.8.1-beta.2"
|
|
140
143
|
},
|
|
141
144
|
"build": {
|
|
142
|
-
"openclawVersion": "2026.
|
|
145
|
+
"openclawVersion": "2026.8.1-beta.2",
|
|
143
146
|
"bundledDist": false
|
|
144
147
|
},
|
|
145
148
|
"release": {
|