@openclaw/clickclack 2026.9.8 → 2026.10.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.
@@ -16,10 +16,6 @@ import { DEFAULT_ACCOUNT_ID as DEFAULT_ACCOUNT_ID$1, applyAccountNameToChannelSe
16
16
  import { createSetupInputPresenceValidator } from "openclaw/plugin-sdk/setup-runtime";
17
17
  import net from "node:net";
18
18
  //#region extensions/clickclack/src/accounts.ts
19
- /**
20
- * Resolves ClickClack account configuration from root channel config, named
21
- * account overrides, and secret-provider references.
22
- */
23
19
  const DEFAULT_RECONNECT_MS = 1500;
24
20
  const MIN_RECONNECT_MS = 100;
25
21
  const MAX_RECONNECT_MS = 6e4;
@@ -150,10 +146,6 @@ function resolveClickClackToken(params) {
150
146
  tokenStatus: "available"
151
147
  };
152
148
  }
153
- /**
154
- * Builds the normalized account snapshot used by gateway, outbound delivery,
155
- * status reporting, and channel routing.
156
- */
157
149
  function resolveClickClackAccount(params) {
158
150
  const accountId = normalizeAccountId(params.accountId);
159
151
  const merged = resolveClickClackAccountConfig(params.cfg, accountId);
@@ -211,10 +203,6 @@ function resolveClickClackAccount(params) {
211
203
  apiEndpoint
212
204
  };
213
205
  }
214
- /**
215
- * Returns all enabled accounts, including the implicit default account when
216
- * legacy top-level ClickClack config is present.
217
- */
218
206
  function listEnabledClickClackAccounts(cfg) {
219
207
  return listClickClackAccountIds(cfg).map((accountId) => resolveClickClackAccount({
220
208
  cfg,
@@ -474,8 +462,7 @@ function applyClickClackCredentialConfig(params) {
474
462
  }
475
463
  const clickClackSetupAdapter = {
476
464
  resolveAccountId: ({ accountId }) => normalizeAccountId(accountId),
477
- prepareAccountConfigInput: async ({ cfg, accountId, input }) => {
478
- const setupInput = input;
465
+ prepareAccountConfigInput: async ({ cfg, accountId, input: setupInput }) => {
479
466
  if (!setupInput.code?.trim()) return setupInput;
480
467
  if (setupInput.token?.trim() || setupInput.tokenFile?.trim() || setupInput.useEnv) throw new Error(SETUP_CODE_CONFLICT_ERROR);
481
468
  const setup = parseClickClackSetupCodeInput({
@@ -486,7 +473,7 @@ const clickClackSetupAdapter = {
486
473
  const claimUrl = setup.exactClaimUrl && !privateApiBaseUrl ? setup.exactClaimUrl : buildClickClackSetupClaimUrl(privateApiBaseUrl ?? setup.baseUrl);
487
474
  let claim;
488
475
  try {
489
- const { claimClickClackSetupCode } = await import("./setup-claim-Cx8knvXs.mjs");
476
+ const { claimClickClackSetupCode } = await import("./setup-claim-Cfv5ikVH.mjs");
490
477
  claim = await claimClickClackSetupCode({
491
478
  claimUrl,
492
479
  code: setup.code,
@@ -528,8 +515,7 @@ const clickClackSetupAdapter = {
528
515
  message: REQUIRED_INPUT_ERROR
529
516
  }
530
517
  ],
531
- validate: ({ cfg, accountId, input }) => {
532
- const setupInput = input;
518
+ validate: ({ cfg, accountId, input: setupInput }) => {
533
519
  const baseUrl = normalizeClickClackBaseUrl(setupInput.baseUrl);
534
520
  if (setupInput.baseUrl && !baseUrl) return INVALID_BASE_URL_ERROR;
535
521
  if (!setupInput.useEnv) return null;
@@ -541,8 +527,7 @@ const clickClackSetupAdapter = {
541
527
  return null;
542
528
  }
543
529
  }),
544
- applyAccountConfig: ({ cfg, accountId, input }) => {
545
- const setupInput = input;
530
+ applyAccountConfig: ({ cfg, accountId, input: setupInput }) => {
546
531
  const existing = setupInput.useEnv ? resolveClickClackAccountConfig(cfg, accountId) : void 0;
547
532
  const baseUrl = normalizeClickClackBaseUrl(setupInput.baseUrl ?? existing?.baseUrl);
548
533
  const workspace = setupInput.workspace?.trim() || existing?.workspace?.trim();
@@ -568,7 +553,7 @@ const clickClackSetupAdapter = {
568
553
  });
569
554
  },
570
555
  afterAccountConfigWritten: async ({ cfg, accountId, runtime }) => {
571
- const { verifyClickClackAccountAfterSetup } = await import("./setup-verify-Msgd70_M.mjs");
556
+ const { verifyClickClackAccountAfterSetup } = await import("./setup-verify-POQZk8SG.mjs");
572
557
  await verifyClickClackAccountAfterSetup({
573
558
  cfg,
574
559
  accountId,
@@ -750,7 +735,7 @@ const clickClackSetupWizard = {
750
735
  })
751
736
  }],
752
737
  finalize: async ({ cfg, accountId, credentialValues, prompter }) => {
753
- const { checkClickClackSetupConnection } = await import("./setup-verify-Msgd70_M.mjs");
738
+ const { checkClickClackSetupConnection } = await import("./setup-verify-POQZk8SG.mjs");
754
739
  const result = await checkClickClackSetupConnection({
755
740
  cfg,
756
741
  accountId,
@@ -1,5 +1,5 @@
1
- import { h as resolveClickClackAccount } from "./setup-surface-BW1Q06w5.mjs";
2
- import { i as createClickClackClient, n as resolveWorkspaceId } from "./resolve-BHGLohni.mjs";
1
+ import { h as resolveClickClackAccount } from "./setup-surface-DcF_7-VV.mjs";
2
+ import { a as createClickClackClient, r as resolveWorkspaceId } from "./resolve-DPtjHQHt.mjs";
3
3
  import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/account-id";
4
4
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
5
5
  import { hasConfiguredSecretInput } from "openclaw/plugin-sdk/setup";
@@ -67,9 +67,9 @@ async function probeClickClackGatewayStatus() {
67
67
  expectFinal: false,
68
68
  progress: false
69
69
  });
70
- return "running";
70
+ return GATEWAY_RUNNING_MESSAGE;
71
71
  } catch (error) {
72
- return isGatewayNotRunningError(error) ? "not-running" : "unavailable";
72
+ return isGatewayNotRunningError(error) ? GATEWAY_NOT_RUNNING_MESSAGE : GATEWAY_UNKNOWN_MESSAGE;
73
73
  }
74
74
  }
75
75
  function formatClickClackConnectionLog(result) {
@@ -82,14 +82,6 @@ function formatClickClackConnectionLog(result) {
82
82
  case "skipped-unconfigured": return;
83
83
  }
84
84
  }
85
- function formatClickClackGatewayLog(status) {
86
- switch (status) {
87
- case "running": return GATEWAY_RUNNING_MESSAGE;
88
- case "not-running": return GATEWAY_NOT_RUNNING_MESSAGE;
89
- case "unavailable": return GATEWAY_UNKNOWN_MESSAGE;
90
- }
91
- return GATEWAY_UNKNOWN_MESSAGE;
92
- }
93
85
  async function verifyClickClackAccountAfterSetup(params) {
94
86
  try {
95
87
  const message = formatClickClackConnectionLog(await checkClickClackSetupConnection({
@@ -101,8 +93,7 @@ async function verifyClickClackAccountAfterSetup(params) {
101
93
  params.runtime.log(`Connection check failed: ${formatErrorMessage(error)}. Setup was saved; fix the connection and rerun setup.`);
102
94
  }
103
95
  try {
104
- const status = await probeClickClackGatewayStatus();
105
- params.runtime.log(formatClickClackGatewayLog(status));
96
+ params.runtime.log(await probeClickClackGatewayStatus());
106
97
  } catch {
107
98
  params.runtime.log(GATEWAY_UNKNOWN_MESSAGE);
108
99
  }
package/dist/api.js CHANGED
@@ -1,4 +1,4 @@
1
- import { _ as resolveDefaultClickClackAccountId, d as DEFAULT_ACCOUNT_ID, h as resolveClickClackAccount, m as listEnabledClickClackAccounts, p as listClickClackAccountIds, s as clickClackConfigSchema } from "./.setup/setup-surface-BW1Q06w5.mjs";
2
- import { a as setClickClackRuntime, i as getClickClackRuntime, n as buildClickClackTarget, r as parseClickClackTarget, t as clickClackPlugin } from "./.setup/channel-Bcwtohk7.mjs";
3
- import { i as createClickClackClient } from "./.setup/resolve-BHGLohni.mjs";
1
+ import { _ as resolveDefaultClickClackAccountId, d as DEFAULT_ACCOUNT_ID, h as resolveClickClackAccount, m as listEnabledClickClackAccounts, p as listClickClackAccountIds, s as clickClackConfigSchema } from "./.setup/setup-surface-DcF_7-VV.mjs";
2
+ import { a as setClickClackRuntime, i as getClickClackRuntime, n as buildClickClackTarget, r as parseClickClackTarget, t as clickClackPlugin } from "./.setup/channel-DI3hKiSg.mjs";
3
+ import { a as createClickClackClient } from "./.setup/resolve-DPtjHQHt.mjs";
4
4
  export { DEFAULT_ACCOUNT_ID, buildClickClackTarget, clickClackConfigSchema, clickClackPlugin, createClickClackClient, getClickClackRuntime, listClickClackAccountIds, listEnabledClickClackAccounts, parseClickClackTarget, resolveClickClackAccount, resolveDefaultClickClackAccountId, setClickClackRuntime };
@@ -1,2 +1,2 @@
1
- import { t as clickClackPlugin } from "./.setup/channel-Bcwtohk7.mjs";
1
+ import { t as clickClackPlugin } from "./.setup/channel-DI3hKiSg.mjs";
2
2
  export { clickClackPlugin };
@@ -99,6 +99,12 @@ function createLegacyWebhookListenerDoctorContract(params) {
99
99
  };
100
100
  const prefix = `channels.${params.channelKey}`;
101
101
  return {
102
+ historicalWebhookListener: {
103
+ channelId: params.channelKey,
104
+ port: params.defaultPort,
105
+ preserveAuthoredActivation: params.preserveAuthoredActivation,
106
+ ...params.defaultHost === void 0 ? {} : { host: params.defaultHost }
107
+ },
102
108
  legacyConfigRules: [{
103
109
  path: ["channels", params.channelKey],
104
110
  message: `${prefix} webhook listeners moved to Gateway routes. Run "openclaw doctor --fix" to preserve explicitly configured listener settings as legacyWebhook.`,
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as registerClickClackDiscussions } from "./.setup/runtime-api-BvP8DrPQ.mjs";
1
+ import { t as registerClickClackDiscussions } from "./.setup/runtime-api-Dm_MQHNq.mjs";
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 { h as resolveClickClackAccount } from "./.setup/setup-surface-BW1Q06w5.mjs";
2
- import { a as setClickClackRuntime, r as parseClickClackTarget } from "./.setup/channel-Bcwtohk7.mjs";
3
- import { i as createClickClackClient } from "./.setup/resolve-BHGLohni.mjs";
4
- import { t as registerClickClackDiscussions } from "./.setup/runtime-api-BvP8DrPQ.mjs";
1
+ import { h as resolveClickClackAccount } from "./.setup/setup-surface-DcF_7-VV.mjs";
2
+ import { a as setClickClackRuntime, r as parseClickClackTarget } from "./.setup/channel-DI3hKiSg.mjs";
3
+ import { a as createClickClackClient } from "./.setup/resolve-DPtjHQHt.mjs";
4
+ import { t as registerClickClackDiscussions } from "./.setup/runtime-api-Dm_MQHNq.mjs";
5
5
  export { createClickClackClient, parseClickClackTarget, registerClickClackDiscussions, resolveClickClackAccount, setClickClackRuntime };
@@ -1,2 +1,2 @@
1
- import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries, t as channelSecrets } from "./.setup/secret-contract-BKkzzjBA.mjs";
1
+ import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries, t as channelSecrets } from "./.setup/secret-contract-CF7TKtkU.mjs";
2
2
  export { channelSecrets, collectRuntimeConfigAssignments, secretTargetRegistryEntries };
@@ -4,11 +4,11 @@ import { fileURLToPath } from "node:url";
4
4
  var setup_entry_default = defineBundledChannelSetupEntry({
5
5
  importMetaUrl: import.meta.url,
6
6
  plugin: {
7
- specifier: fileURLToPath(new URL(".setup/setup-plugin-api-BH_nw-AP.mjs", import.meta.url).href),
7
+ specifier: fileURLToPath(new URL(".setup/setup-plugin-api-BXhjNJRg.mjs", import.meta.url).href),
8
8
  exportName: "clickClackSetupPlugin"
9
9
  },
10
10
  secrets: {
11
- specifier: fileURLToPath(new URL(".setup/secret-contract-api-C1QwGlzF.mjs", import.meta.url).href),
11
+ specifier: fileURLToPath(new URL(".setup/secret-contract-api-CBcsgIYZ.mjs", import.meta.url).href),
12
12
  exportName: "channelSecrets"
13
13
  }
14
14
  });
@@ -1,2 +1,2 @@
1
- import { t as clickClackSetupPlugin } from "./.setup/setup-plugin-api-C9QcBJuW.mjs";
1
+ import { t as clickClackSetupPlugin } from "./.setup/setup-plugin-api-CqfAb-CU.mjs";
2
2
  export { clickClackSetupPlugin };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/clickclack",
3
- "version": "2026.9.8",
3
+ "version": "2026.10.1-beta.1",
4
4
  "description": "OpenClaw ClickClack channel plugin",
5
5
  "type": "module",
6
6
  "exports": {
@@ -13,7 +13,7 @@
13
13
  "zod": "4.6.5"
14
14
  },
15
15
  "peerDependencies": {
16
- "openclaw": ">=2026.9.8"
16
+ "openclaw": ">=2026.10.1-beta.1"
17
17
  },
18
18
  "peerDependenciesMeta": {
19
19
  "openclaw": {
@@ -135,14 +135,14 @@
135
135
  "clawhubSpec": "clawhub:@openclaw/clickclack",
136
136
  "npmSpec": "@openclaw/clickclack",
137
137
  "defaultChoice": "npm",
138
- "minHostVersion": ">=2026.6.9",
138
+ "minHostVersion": ">=2026.9.8",
139
139
  "allowInvalidConfigRecovery": true
140
140
  },
141
141
  "compat": {
142
- "pluginApi": ">=2026.9.8"
142
+ "pluginApi": ">=2026.10.1-beta.1"
143
143
  },
144
144
  "build": {
145
- "openclawVersion": "2026.9.8",
145
+ "openclawVersion": "2026.10.1-beta.1",
146
146
  "bundledDist": false
147
147
  },
148
148
  "release": {
@@ -1,35 +0,0 @@
1
- import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
2
- import { collectConditionalChannelFieldAssignments, createChannelSecretTargetRegistryEntries, getChannelSurface, hasConfiguredSecretInputValue } from "openclaw/plugin-sdk/channel-secret-basic-runtime";
3
- //#region extensions/clickclack/src/secret-contract.ts
4
- const secretTargetRegistryEntries = createChannelSecretTargetRegistryEntries({
5
- channelKey: "clickclack",
6
- account: ["token"],
7
- channel: ["token"]
8
- });
9
- function collectRuntimeConfigAssignments(params) {
10
- const resolved = getChannelSurface(params.config, "clickclack");
11
- if (!resolved) return;
12
- const { channel: clickclack, surface } = resolved;
13
- const baseTokenFile = normalizeOptionalString(clickclack.tokenFile) ?? "";
14
- const accountTokenFile = (account) => normalizeOptionalString(account.tokenFile) ?? "";
15
- const hasImplicitDefault = Boolean(normalizeOptionalString(clickclack.baseUrl)) && Boolean(normalizeOptionalString(clickclack.workspace));
16
- collectConditionalChannelFieldAssignments({
17
- channelKey: "clickclack",
18
- field: "token",
19
- channel: clickclack,
20
- surface,
21
- defaults: params.defaults,
22
- context: params.context,
23
- topLevelActiveWithoutAccounts: baseTokenFile.length === 0,
24
- topLevelInheritedAccountActive: ({ account, enabled }) => hasImplicitDefault && baseTokenFile.length === 0 || enabled && baseTokenFile.length === 0 && accountTokenFile(account).length === 0 && !hasConfiguredSecretInputValue(account.token, params.defaults),
25
- accountActive: ({ account, enabled }) => enabled && accountTokenFile(account).length === 0,
26
- topInactiveReason: "no enabled ClickClack account inherits this top-level token (tokenFile is configured).",
27
- accountInactiveReason: "ClickClack account is disabled or tokenFile is configured."
28
- });
29
- }
30
- const channelSecrets = {
31
- secretTargetRegistryEntries,
32
- collectRuntimeConfigAssignments
33
- };
34
- //#endregion
35
- export { collectRuntimeConfigAssignments as n, secretTargetRegistryEntries as r, channelSecrets as t };