@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 +2 -2
- package/dist/{channel-DaHgaTy1.js → channel-DbE7fnUL.js} +36 -12
- package/dist/channel-plugin-api.js +1 -1
- package/dist/index.js +1 -1
- package/dist/{runtime-api-CPL3m5AD.js → runtime-api-Pul_CTEN.js} +2 -2
- package/dist/runtime-api.js +3 -3
- package/dist/{setup-claim-CQjgPGxU.js → setup-claim-Dd4LkDU2.js} +1 -1
- package/dist/setup-plugin-api.js +1 -1
- package/dist/{setup-surface-DjT-gmMe.js → setup-surface-u7Mgy8Wp.js} +49 -14
- package/node_modules/ws/lib/permessage-deflate.js +3 -1
- package/node_modules/ws/package.json +1 -1
- package/openclaw.plugin.json +11 -0
- package/package.json +5 -5
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-
|
|
2
|
-
import { a as setClickClackRuntime, i as getClickClackRuntime, n as buildClickClackTarget, r as parseClickClackTarget, t as clickClackPlugin } from "./channel-
|
|
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-
|
|
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?.(
|
|
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?.(
|
|
875
|
+
params.log?.debug?.(`${messagePrefix} skipped: server does not support /api/bots/self/commands`);
|
|
875
876
|
return;
|
|
876
877
|
}
|
|
877
|
-
params.log?.warn?.(
|
|
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
|
|
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
|
-
})
|
|
1604
|
-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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";
|
package/dist/runtime-api.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { b as resolveClickClackAccount, u as createClickClackClient } from "./setup-surface-
|
|
2
|
-
import { a as setClickClackRuntime, r as parseClickClackTarget } from "./channel-
|
|
3
|
-
import { t as registerClickClackDiscussions } from "./runtime-api-
|
|
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-
|
|
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";
|
package/dist/setup-plugin-api.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { g as clickClackMeta, h as clickClackConfigAdapter, n as clickClackSetupContract, p as clickClackConfigSchema, t as clickClackSetupWizard } from "./setup-surface-
|
|
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,
|
|
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)
|
|
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)
|
|
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
|
-
|
|
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
|
|
110
|
-
|
|
111
|
-
|
|
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-
|
|
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
|
-
|
|
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
|
}
|
package/openclaw.plugin.json
CHANGED
|
@@ -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.
|
|
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.
|
|
12
|
+
"ws": "8.21.3",
|
|
13
13
|
"zod": "4.4.3"
|
|
14
14
|
},
|
|
15
15
|
"peerDependencies": {
|
|
16
|
-
"openclaw": ">=2026.
|
|
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.
|
|
142
|
+
"pluginApi": ">=2026.9.1-beta.1"
|
|
143
143
|
},
|
|
144
144
|
"build": {
|
|
145
|
-
"openclawVersion": "2026.
|
|
145
|
+
"openclawVersion": "2026.9.1-beta.1",
|
|
146
146
|
"bundledDist": false
|
|
147
147
|
},
|
|
148
148
|
"release": {
|