@openclaw/nextcloud-talk 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.
@@ -0,0 +1,3 @@
1
+ import { t as nextcloudTalkPlugin } from "./channel-8QL-89-o.mjs";
2
+ import "../api.js";
3
+ export { nextcloudTalkPlugin };
@@ -1,13 +1,14 @@
1
- import { i as __reExport, n as normalizeCompatibilityConfig, r as __exportAll, t as legacyConfigRules } from "./doctor-contract-BVJcDIeU.mjs";
2
- import { a as fetchWithSsrFGuard, c as resolveDefaultGroupPolicy, i as deliverFormattedTextWithAttachments, l as warnMissingProviderGroupPolicyFallbackOnce, o as logInboundDrop, r as createChannelPairingController, s as resolveAllowlistProviderRuntimeGroupPolicy, t as GROUP_POLICY_BLOCKED_LABEL, u as getNextcloudTalkRuntime } from "./runtime-api-BKsxTw4J.mjs";
1
+ import { a as __reExport, i as __exportAll, n as legacyConfigRules, r as normalizeCompatibilityConfig } from "./doctor-contract-cCN4i0Kr.mjs";
2
+ import { listNextcloudTalkAccountIds as listNextcloudTalkAccountIds$1, mergeNextcloudTalkAccountConfig, resolveDefaultNextcloudTalkAccountId } from "../configured-state.js";
3
+ import { a as logInboundDrop, c as warnMissingProviderGroupPolicyFallbackOnce, i as fetchWithSsrFGuard, l as getNextcloudTalkRuntime, n as createChannelPairingController, o as resolveAllowlistProviderRuntimeGroupPolicy, r as deliverFormattedTextWithAttachments, s as resolveDefaultGroupPolicy, t as GROUP_POLICY_BLOCKED_LABEL, u as getOptionalNextcloudTalkRuntime } from "./runtime-api-DVkVOUSo.mjs";
3
4
  import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-Bvm0PmP3.mjs";
4
- import { createAccountListHelpers, describeWebhookAccountSnapshot } from "openclaw/plugin-sdk/account-helpers";
5
+ import { describeWebhookAccountSnapshot } from "openclaw/plugin-sdk/account-helpers";
5
6
  import { buildChannelOutboundSessionRoute, createChatChannelPlugin } from "openclaw/plugin-sdk/channel-core";
6
7
  import { createLoggedPairingApprovalNotifier, createPairingPrefixStripper } from "openclaw/plugin-sdk/channel-pairing";
7
8
  import { createAllowlistProviderRouteAllowlistWarningCollector, createConditionalWarningCollector, resolveScopeRequireMention, resolveScopeToolsPolicy } from "openclaw/plugin-sdk/channel-policy";
8
9
  import { buildWebhookChannelStatusSummary, createComputedAccountStatusAdapter, createDefaultChannelRuntimeState } from "openclaw/plugin-sdk/status-helpers";
9
- import { FormatCapabilityProfile, convertMarkdownTables, renderMarkdownWithMarkers, sanitizeAssistantVisibleText } from "openclaw/plugin-sdk/text-chunking";
10
- import { DEFAULT_ACCOUNT_ID, hasConfiguredAccountValue, normalizeAccountId, resolveAccountWithDefaultFallback } from "openclaw/plugin-sdk/account-core";
10
+ import { convertMarkdownTables, sanitizeAssistantVisibleText } from "openclaw/plugin-sdk/text-chunking";
11
+ import { DEFAULT_ACCOUNT_ID, normalizeAccountId, resolveAccountWithDefaultFallback } from "openclaw/plugin-sdk/account-core";
11
12
  import { isTruthyEnvValue } from "openclaw/plugin-sdk/runtime-env";
12
13
  import { tryReadSecretFileSync } from "openclaw/plugin-sdk/secret-file-runtime";
13
14
  import { buildSecretInputSchema, hasConfiguredSecretInput, resolveSecretInputString } from "openclaw/plugin-sdk/secret-input";
@@ -17,7 +18,6 @@ import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
17
18
  import { parseStrictNonNegativeInteger, parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime";
18
19
  import { readProviderJsonResponse, readProviderTextResponse } from "openclaw/plugin-sdk/provider-http";
19
20
  import { resolveChannelInboundRouteEnvelope } from "openclaw/plugin-sdk/channel-inbound";
20
- import { bindIngressLifecycleToReplyOptions, createAccountStatusSink, createChannelIngressMonitor, createMessageReceiptFromOutboundResults, defineChannelMessageAdapter, resolveChannelStreamingBlockEnabled, runPassiveAccountLifecycle } from "openclaw/plugin-sdk/channel-outbound";
21
21
  import { SsrFBlockedError, ssrfPolicyFromPrivateNetworkOptIn, ssrfPolicyFromPrivateNetworkOptIn as ssrfPolicyFromPrivateNetworkOptIn$1 } from "openclaw/plugin-sdk/ssrf-runtime";
22
22
  import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
23
23
  import { redactToolPayloadText } from "openclaw/plugin-sdk/logging-core";
@@ -34,8 +34,8 @@ import { z } from "zod";
34
34
  import os from "node:os";
35
35
  import path from "node:path";
36
36
  import { fileExists } from "openclaw/plugin-sdk/file-access-runtime";
37
- import { migratePersistentDedupeLegacyJsonFile, resolvePersistentDedupePluginStateNamespace } from "openclaw/plugin-sdk/persistent-dedupe";
38
37
  import { resolveStateDir } from "openclaw/plugin-sdk/state-paths";
38
+ import { bindIngressLifecycleToReplyOptions, createAccountStatusSink, createChannelIngressMonitor, createMessageReceiptFromOutboundResults, defineChannelMessageAdapter, resolveChannelStreamingBlockEnabled, runPassiveAccountLifecycle } from "openclaw/plugin-sdk/channel-outbound";
39
39
  import { channelReadyPatch } from "openclaw/plugin-sdk/gateway-runtime";
40
40
  import { channelIngressRoutes } from "openclaw/plugin-sdk/channel-ingress-runtime";
41
41
  import { safeParseJson, truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
@@ -45,6 +45,7 @@ import { WEBHOOK_RATE_LIMIT_DEFAULTS, createAuthRateLimiter, createWebhookInFlig
45
45
  import { sendHttpRequestRejection } from "openclaw/plugin-sdk/webhook-request-guards";
46
46
  import { canonicalizeWebhookRouteKey, registerPluginHttpRoute, registerWebhookTarget, resolveSingleWebhookTarget } from "openclaw/plugin-sdk/webhook-targets";
47
47
  import { isRecord as isRecord$1 } from "openclaw/plugin-sdk/channel-secret-basic-runtime";
48
+ import { resolvePersistentDedupePluginStateNamespace } from "openclaw/plugin-sdk/persistent-dedupe";
48
49
  import { jsonResult, readStringParam, resolveReactionMessageId } from "openclaw/plugin-sdk/channel-actions";
49
50
  import { createChannelDmPolicy } from "openclaw/plugin-sdk/channel-dm-policy";
50
51
  import { defineChannelSetupContract } from "openclaw/plugin-sdk/channel-setup";
@@ -89,16 +90,8 @@ function resolveNextcloudTalkApiCredentials(params) {
89
90
  const debugAccounts = (...args) => {
90
91
  if (isTruthyEnvValue(process.env.OPENCLAW_DEBUG_NEXTCLOUD_TALK_ACCOUNTS)) console.warn("[nextcloud-talk:accounts]", ...args);
91
92
  };
92
- const { listAccountIds: listNextcloudTalkAccountIdsInternal, resolveDefaultAccountId: resolveDefaultNextcloudTalkAccountId, resolveAccountConfig: mergeNextcloudTalkAccountConfig } = createAccountListHelpers("nextcloud-talk", {
93
- normalizeAccountId,
94
- omitKeys: ["defaultAccount"],
95
- hasImplicitDefaultAccount: (cfg) => {
96
- const channel = cfg.channels?.["nextcloud-talk"];
97
- return Boolean(channel?.baseUrl?.trim() && (hasConfiguredAccountValue(channel.botSecret) || channel.botSecretFile?.trim() || process.env.NEXTCLOUD_TALK_BOT_SECRET?.trim()));
98
- }
99
- });
100
93
  function listNextcloudTalkAccountIds(cfg) {
101
- const ids = listNextcloudTalkAccountIdsInternal(cfg);
94
+ const ids = listNextcloudTalkAccountIds$1(cfg);
102
95
  debugAccounts("listNextcloudTalkAccountIds", ids);
103
96
  return ids;
104
97
  }
@@ -602,21 +595,14 @@ var gateway_config_runtime_exports = /* @__PURE__ */ __exportAll({
602
595
  import * as import_openclaw_plugin_sdk_gateway_config_runtime from "openclaw/plugin-sdk/gateway-config-runtime";
603
596
  __reExport(gateway_config_runtime_exports, import_openclaw_plugin_sdk_gateway_config_runtime);
604
597
  //#endregion
605
- //#region extensions/nextcloud-talk/src/replay-migration-contract.ts
606
- const NEXTCLOUD_TALK_PLUGIN_ID = "nextcloud-talk";
607
- const NEXTCLOUD_TALK_REPLAY_DEDUPE_NAMESPACE_PREFIX = "replay-dedupe";
608
- const NEXTCLOUD_TALK_REPLAY_DEDUPE_TTL_MS = 864e5;
609
- const NEXTCLOUD_TALK_REPLAY_DEDUPE_MAX_ENTRIES = 1e4;
610
- //#endregion
611
598
  //#region extensions/nextcloud-talk/src/webhook-route.ts
612
599
  const DEFAULT_NEXTCLOUD_TALK_WEBHOOK_PATH = "/nextcloud-talk-webhook";
613
600
  function resolveNextcloudTalkLegacyWebhook(config) {
614
601
  const listener = config.legacyWebhook;
615
- if (listener === false) return;
616
- return {
617
- port: listener?.port ?? 8788,
618
- host: listener?.host ?? "0.0.0.0"
619
- };
602
+ return listener ? {
603
+ port: listener.port,
604
+ host: listener.host ?? "0.0.0.0"
605
+ } : void 0;
620
606
  }
621
607
  function describeNextcloudTalkWebhookRouteConflict(path, gatewayPort) {
622
608
  const pathname = URL.parse(path, "http://localhost")?.pathname ?? path;
@@ -646,9 +632,9 @@ function runNextcloudTalkDoctorSequence(params) {
646
632
  const destination = `Gateway port ${gatewayPort}${webhookPath}`;
647
633
  const legacyListener = resolveNextcloudTalkLegacyWebhook(account.config);
648
634
  const routeConflict = describeNextcloudTalkWebhookRouteConflict(webhookPath, gatewayPort);
649
- if (routeConflict) warningNotes.push(`- channels.nextcloud-talk.${account.accountId}: ${routeConflict}` + (legacyListener ? ` Legacy webhook listener ${legacyListener.host}:${legacyListener.port} remains available; verify the new route before setting legacyWebhook: false.` : " This account cannot start until the callback path is changed."));
650
- else if (legacyListener) infoNotes.push(`- channels.nextcloud-talk.${account.accountId}: legacy webhook listener ${legacyListener.host}:${legacyListener.port} forwards to the Gateway route. Point the Nextcloud callback or reverse-proxy upstream to ${destination}, verify delivery, then set legacyWebhook: false to disable this account's legacy forwarding.`);
651
- else infoNotes.push(`- channels.nextcloud-talk.${account.accountId}: legacyWebhook is false; use ${destination} for the Nextcloud callback or reverse-proxy upstream.`);
635
+ if (routeConflict) warningNotes.push(`- channels.nextcloud-talk.${account.accountId}: ${routeConflict}` + (legacyListener ? ` Legacy webhook listener ${legacyListener.host}:${legacyListener.port} remains available; verify the new route before removing the legacyWebhook pin.` : " This account cannot start until the callback path is changed."));
636
+ else if (legacyListener) infoNotes.push(`- channels.nextcloud-talk.${account.accountId}: legacy webhook listener ${legacyListener.host}:${legacyListener.port} forwards to the Gateway route. Point the Nextcloud callback or reverse-proxy upstream to ${destination}, verify delivery, then remove the legacyWebhook pin; use legacyWebhook: false to override an inherited endpoint.`);
637
+ else infoNotes.push(`- channels.nextcloud-talk.${account.accountId}: no legacy listener is configured; use ${destination} for the Nextcloud callback or reverse-proxy upstream.`);
652
638
  }
653
639
  return {
654
640
  changeNotes: [],
@@ -668,54 +654,24 @@ async function collectNextcloudTalkBotResponseWarnings(params) {
668
654
  account,
669
655
  timeoutMs: 5e3
670
656
  });
671
- if (result.code === "missing_response_feature" || result.code === "bot_not_found" || result.code === "api_error" || result.code === "request_failed") warnings.push(`- channels.nextcloud-talk.${account.accountId}: ${result.message}`);
657
+ if (!result.ok) warnings.push(`- channels.nextcloud-talk.${account.accountId}: ${result.message}`);
672
658
  }
673
659
  return warnings;
674
660
  }
675
- async function repairNextcloudTalkReplayDedupeState(params) {
676
- const changes = [];
677
- const warnings = [];
678
- const env = params.env ?? process.env;
679
- const stateDir = resolveStateDir(env, os.homedir);
680
- const replayDir = path.join(stateDir, "nextcloud-talk", "replay-dedupe");
681
- for (const accountId of listNextcloudTalkAccountIds(params.cfg)) {
682
- const legacyPath = path.join(replayDir, `${sanitizeLegacyReplaySegment(accountId)}.json`);
683
- if (!fileExists(legacyPath)) continue;
684
- try {
685
- const result = await migratePersistentDedupeLegacyJsonFile({
686
- filePath: legacyPath,
687
- namespace: accountId,
688
- ttlMs: NEXTCLOUD_TALK_REPLAY_DEDUPE_TTL_MS,
689
- memoryMaxSize: 0,
690
- pluginId: NEXTCLOUD_TALK_PLUGIN_ID,
691
- namespacePrefix: NEXTCLOUD_TALK_REPLAY_DEDUPE_NAMESPACE_PREFIX,
692
- stateMaxEntries: NEXTCLOUD_TALK_REPLAY_DEDUPE_MAX_ENTRIES,
693
- env
694
- });
695
- changes.push(`Migrated Nextcloud Talk replay dedupe cache for account "${accountId}" to SQLite (${result.imported} imported, ${result.skippedExpired} expired, ${result.skippedExisting} already current).`);
696
- } catch (error) {
697
- warnings.push(`Skipped Nextcloud Talk replay dedupe cache for account "${accountId}": ${String(error)}`);
698
- }
699
- }
700
- return {
701
- changes,
702
- warnings
703
- };
704
- }
705
661
  const nextcloudTalkDoctor = {
706
662
  legacyConfigRules,
707
663
  normalizeCompatibilityConfig,
708
664
  runConfigSequence: runNextcloudTalkDoctorSequence,
709
665
  collectPreviewWarnings: collectNextcloudTalkBotResponseWarnings,
710
- repairConfig: async ({ cfg, env }) => {
711
- const repair = await repairNextcloudTalkReplayDedupeState({
712
- cfg,
713
- ...env ? { env } : {}
714
- });
666
+ repairConfig: ({ cfg, doctorFixCommand, env = process.env }) => {
667
+ const replayDir = path.join(resolveStateDir(env, os.homedir), "nextcloud-talk", "replay-dedupe");
668
+ for (const accountId of listNextcloudTalkAccountIds(cfg)) {
669
+ const legacyPath = path.join(replayDir, `${sanitizeLegacyReplaySegment(accountId)}.json`);
670
+ if (fileExists(legacyPath)) throw new Error(`Retired pre-July Nextcloud Talk replay state at ${legacyPath} was left unchanged. Install OpenClaw 2026.9.5, run "${doctorFixCommand}", then upgrade to latest. See https://docs.openclaw.ai/install/updating#upgrading-very-old-versions.`);
671
+ }
715
672
  return {
716
673
  config: cfg,
717
- changes: repair.changes,
718
- warnings: repair.warnings
674
+ changes: []
719
675
  };
720
676
  }
721
677
  };
@@ -897,24 +853,6 @@ function looksLikeNextcloudTalkTargetId(raw) {
897
853
  //#region extensions/nextcloud-talk/src/send.ts
898
854
  const NEXTCLOUD_TALK_ERROR_SNIPPET_MAX_CHARS = 200;
899
855
  const NEXTCLOUD_TALK_SEND_TIMEOUT_MS = 3e4;
900
- const NEXTCLOUD_TALK_FORMAT_PROFILE = FormatCapabilityProfile.define({
901
- mechanism: "markdown",
902
- chunk: {
903
- limit: 4e3,
904
- unit: "chars",
905
- hardCap: 32e3
906
- }
907
- });
908
- function renderNextcloudTalkMarkdown(markdown) {
909
- return renderMarkdownWithMarkers({
910
- text: markdown,
911
- styles: [],
912
- links: []
913
- }, {
914
- styleMarkers: {},
915
- escapeText: (text) => text
916
- }, NEXTCLOUD_TALK_FORMAT_PROFILE);
917
- }
918
856
  /** Collapses and caps an already-redacted error body for display. */
919
857
  function collapseErrorSnippet(text) {
920
858
  const collapsed = text.replace(/\s+/g, " ").trim();
@@ -943,29 +881,6 @@ function normalizeRoomToken(to) {
943
881
  if (!normalized) throw new Error("Room token is required for Nextcloud Talk sends");
944
882
  return normalized;
945
883
  }
946
- function recordNextcloudTalkOutboundActivity(accountId) {
947
- try {
948
- getNextcloudTalkRuntime().channel.activity.record({
949
- channel: "nextcloud-talk",
950
- accountId,
951
- direction: "outbound"
952
- });
953
- } catch (error) {
954
- if (!(error instanceof Error) || error.message !== "Nextcloud Talk runtime not initialized") throw error;
955
- }
956
- }
957
- function createNextcloudTalkSendReceipt(params) {
958
- const messageId = params.messageId.trim();
959
- return createMessageReceiptFromOutboundResults({
960
- results: messageId && messageId !== "unknown" ? [{
961
- channel: "nextcloud-talk",
962
- messageId,
963
- conversationId: params.roomToken
964
- }] : [],
965
- kind: "text",
966
- ...params.replyTo ? { replyToId: params.replyTo } : {}
967
- });
968
- }
969
884
  async function sendMessageNextcloudTalk(to, text, opts) {
970
885
  const { cfg, account, baseUrl, secret } = resolveNextcloudTalkSendContext(opts);
971
886
  const roomToken = normalizeRoomToken(to);
@@ -975,7 +890,7 @@ async function sendMessageNextcloudTalk(to, text, opts) {
975
890
  channel: "nextcloud-talk",
976
891
  accountId: account.accountId
977
892
  });
978
- const message = convertMarkdownTables(renderNextcloudTalkMarkdown(text.trim()), tableMode);
893
+ const message = convertMarkdownTables(text.trim(), tableMode);
979
894
  const body = { message };
980
895
  if (opts.replyTo) body.replyTo = opts.replyTo;
981
896
  const bodyStr = JSON.stringify(body);
@@ -1022,14 +937,23 @@ async function sendMessageNextcloudTalk(to, text, opts) {
1022
937
  if (typeof data.ocs?.data?.timestamp === "number") timestamp = data.ocs.data.timestamp;
1023
938
  } catch {}
1024
939
  if (opts.verbose) console.log(`[nextcloud-talk] Sent message ${messageId} to room ${roomToken}`);
1025
- recordNextcloudTalkOutboundActivity(account.accountId);
940
+ getOptionalNextcloudTalkRuntime()?.channel.activity.record({
941
+ channel: "nextcloud-talk",
942
+ accountId: account.accountId,
943
+ direction: "outbound"
944
+ });
945
+ const receiptMessageId = messageId.trim();
1026
946
  return {
1027
947
  messageId,
1028
948
  roomToken,
1029
- receipt: createNextcloudTalkSendReceipt({
1030
- messageId,
1031
- roomToken,
1032
- ...opts.replyTo ? { replyTo: opts.replyTo } : {}
949
+ receipt: createMessageReceiptFromOutboundResults({
950
+ results: receiptMessageId && receiptMessageId !== "unknown" ? [{
951
+ channel: "nextcloud-talk",
952
+ messageId: receiptMessageId,
953
+ conversationId: roomToken
954
+ }] : [],
955
+ kind: "text",
956
+ ...opts.replyTo ? { replyToId: opts.replyTo } : {}
1033
957
  }),
1034
958
  timestamp
1035
959
  };
@@ -1927,11 +1851,11 @@ async function monitorNextcloudTalkProvider(opts) {
1927
1851
  }
1928
1852
  opts.statusSink?.(channelReadyPatch());
1929
1853
  if (routeConflict && legacyListener) {
1930
- logger.warn(`[nextcloud-talk:${account.accountId}] ${routeConflict} Legacy webhook listener ${legacyListener.host}:${legacyListener.port} remains available; verify the new route before setting legacyWebhook: false.`);
1854
+ logger.warn(`[nextcloud-talk:${account.accountId}] ${routeConflict} Legacy webhook listener ${legacyListener.host}:${legacyListener.port} remains available; verify the new route before removing the legacyWebhook pin.`);
1931
1855
  return { stop };
1932
1856
  }
1933
1857
  logger.info(`[nextcloud-talk:${account.accountId}] Gateway webhook route ready at port ${gatewayPort}${path}; point the Nextcloud bot callback or reverse-proxy upstream here.`);
1934
- if (legacyListener) logger.info(`[nextcloud-talk:${account.accountId}] legacy webhook listener ${legacyListener.host}:${legacyListener.port} forwards to the Gateway route. After verifying the callback or proxy upstream uses the Gateway port, set legacyWebhook: false to disable this account's legacy forwarding.`);
1858
+ if (legacyListener) logger.info(`[nextcloud-talk:${account.accountId}] legacy webhook listener ${legacyListener.host}:${legacyListener.port} forwards to the Gateway route. After verifying the callback or proxy upstream uses the Gateway port, remove the legacyWebhook pin; use legacyWebhook: false to override an inherited endpoint.`);
1935
1859
  return { stop };
1936
1860
  }
1937
1861
  //#endregion
@@ -1,3 +1,4 @@
1
+ import { hasConfiguredNextcloudTalkChannelState, listNextcloudTalkAccountIds, mergeNextcloudTalkAccountConfig } from "../configured-state.js";
1
2
  //#region \0rolldown/runtime.js
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -124,6 +125,12 @@ function createLegacyWebhookListenerDoctorContract(params) {
124
125
  };
125
126
  const prefix = `channels.${params.channelKey}`;
126
127
  return {
128
+ historicalWebhookListener: {
129
+ channelId: params.channelKey,
130
+ port: params.defaultPort,
131
+ preserveAuthoredActivation: params.preserveAuthoredActivation,
132
+ ...params.defaultHost === void 0 ? {} : { host: params.defaultHost }
133
+ },
127
134
  legacyConfigRules: [{
128
135
  path: ["channels", params.channelKey],
129
136
  message: `${prefix} webhook listeners moved to Gateway routes. Run "openclaw doctor --fix" to preserve explicitly configured listener settings as legacyWebhook.`,
@@ -187,7 +194,7 @@ const webhookContract = createLegacyWebhookListenerDoctorContract({
187
194
  defaultHost: "0.0.0.0",
188
195
  defaultPort: 8788
189
196
  });
190
- const networkContract = (0, runtime_doctor_migrations_exports.createLegacyPrivateNetworkDoctorContract)({ channelKey: "nextcloud-talk" });
197
+ const { historicalWebhookListener } = webhookContract;
191
198
  const streamingAliasMigration = (0, runtime_doctor_migrations_exports.defineChannelAliasMigration)({
192
199
  channelId: "nextcloud-talk",
193
200
  streaming: {
@@ -196,18 +203,16 @@ const streamingAliasMigration = (0, runtime_doctor_migrations_exports.defineChan
196
203
  },
197
204
  accountStreamingReplacesRoot: true
198
205
  });
199
- const legacyConfigRules = [
200
- ...webhookContract.legacyConfigRules,
201
- ...networkContract.legacyConfigRules,
202
- ...streamingAliasMigration.legacyConfigRules
203
- ];
206
+ const legacyConfigRules = [...webhookContract.legacyConfigRules, ...streamingAliasMigration.legacyConfigRules];
204
207
  function normalizeCompatibilityConfig({ cfg }) {
205
208
  const webhook = webhookContract.normalizeCompatibilityConfig({ cfg });
206
- const network = networkContract.normalizeCompatibilityConfig({ cfg: webhook.config });
207
- return streamingAliasMigration.normalizeChannelConfig({
208
- cfg: network.config,
209
- changes: [...webhook.changes, ...network.changes]
210
- });
209
+ return {
210
+ ...streamingAliasMigration.normalizeChannelConfig({
211
+ cfg: webhook.config,
212
+ changes: webhook.changes
213
+ }),
214
+ historicalWebhookAccountIds: !hasConfiguredNextcloudTalkChannelState({ cfg }) ? [] : listNextcloudTalkAccountIds(cfg).filter((accountId) => mergeNextcloudTalkAccountConfig(cfg, accountId).enabled !== false)
215
+ };
211
216
  }
212
217
  //#endregion
213
- export { __reExport as i, normalizeCompatibilityConfig as n, __exportAll as r, legacyConfigRules as t };
218
+ export { __reExport as a, __exportAll as i, legacyConfigRules as n, normalizeCompatibilityConfig as r, historicalWebhookListener as t };
@@ -1,14 +1,13 @@
1
1
  import { createChannelPairingController } from "openclaw/plugin-sdk/channel-pairing";
2
2
  import { logInboundDrop } from "openclaw/plugin-sdk/channel-inbound";
3
3
  import { GROUP_POLICY_BLOCKED_LABEL, resolveAllowlistProviderRuntimeGroupPolicy, resolveDefaultGroupPolicy, warnMissingProviderGroupPolicyFallbackOnce } from "openclaw/plugin-sdk/runtime-group-policy";
4
- import { createChannelMessageReplyPipeline } from "openclaw/plugin-sdk/channel-outbound";
5
4
  import { deliverFormattedTextWithAttachments } from "openclaw/plugin-sdk/reply-payload";
6
5
  import { fetchWithSsrFGuard } from "openclaw/plugin-sdk/ssrf-runtime";
7
6
  import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
8
7
  //#region extensions/nextcloud-talk/src/runtime.ts
9
- const { setRuntime: setNextcloudTalkRuntime, getRuntime: getNextcloudTalkRuntime } = createPluginRuntimeStore({
8
+ const { setRuntime: setNextcloudTalkRuntime, getRuntime: getNextcloudTalkRuntime, tryGetRuntime: getOptionalNextcloudTalkRuntime } = createPluginRuntimeStore({
10
9
  pluginId: "nextcloud-talk",
11
10
  errorMessage: "Nextcloud Talk runtime not initialized"
12
11
  });
13
12
  //#endregion
14
- export { fetchWithSsrFGuard as a, resolveDefaultGroupPolicy as c, setNextcloudTalkRuntime as d, deliverFormattedTextWithAttachments as i, warnMissingProviderGroupPolicyFallbackOnce as l, createChannelMessageReplyPipeline as n, logInboundDrop as o, createChannelPairingController as r, resolveAllowlistProviderRuntimeGroupPolicy as s, GROUP_POLICY_BLOCKED_LABEL as t, getNextcloudTalkRuntime as u };
13
+ export { logInboundDrop as a, warnMissingProviderGroupPolicyFallbackOnce as c, setNextcloudTalkRuntime as d, fetchWithSsrFGuard as i, getNextcloudTalkRuntime as l, createChannelPairingController as n, resolveAllowlistProviderRuntimeGroupPolicy as o, deliverFormattedTextWithAttachments as r, resolveDefaultGroupPolicy as s, GROUP_POLICY_BLOCKED_LABEL as t, getOptionalNextcloudTalkRuntime as u };
package/dist/api.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as nextcloudTalkPlugin } from "./.setup/channel-CeJpOTiY.mjs";
1
+ import { t as nextcloudTalkPlugin } from "./.setup/channel-8QL-89-o.mjs";
2
2
  export { nextcloudTalkPlugin };
@@ -1,2 +1,2 @@
1
- import { t as nextcloudTalkPlugin } from "./.setup/channel-CeJpOTiY.mjs";
1
+ import { t as nextcloudTalkPlugin } from "./.setup/channel-8QL-89-o.mjs";
2
2
  export { nextcloudTalkPlugin };
@@ -1,5 +1,13 @@
1
- import { DEFAULT_ACCOUNT_ID, hasConfiguredAccountValue, mergeAccountConfig } from "openclaw/plugin-sdk/account-core";
1
+ import { DEFAULT_ACCOUNT_ID, createAccountListHelpers, hasConfiguredAccountValue, normalizeAccountId } from "openclaw/plugin-sdk/account-core";
2
2
  //#region extensions/nextcloud-talk/configured-state.ts
3
+ const { listAccountIds: listNextcloudTalkAccountIds, resolveDefaultAccountId: resolveDefaultNextcloudTalkAccountId, resolveAccountConfig: mergeNextcloudTalkAccountConfig } = createAccountListHelpers("nextcloud-talk", {
4
+ normalizeAccountId,
5
+ omitKeys: ["defaultAccount"],
6
+ hasImplicitDefaultAccount: (cfg) => {
7
+ const channel = cfg.channels?.["nextcloud-talk"];
8
+ return Boolean(channel?.baseUrl?.trim() && (hasConfiguredAccountValue(channel.botSecret) || channel.botSecretFile?.trim() || process.env.NEXTCLOUD_TALK_BOT_SECRET?.trim()));
9
+ }
10
+ });
3
11
  function hasConfiguredNextcloudAccount(account, env) {
4
12
  return Boolean(account?.baseUrl?.trim() && (hasConfiguredAccountValue(account.botSecret) || hasConfiguredAccountValue(account.botSecretFile) || hasConfiguredAccountValue(env.NEXTCLOUD_TALK_BOT_SECRET)));
5
13
  }
@@ -7,19 +15,10 @@ function hasConfiguredNextcloudAccount(account, env) {
7
15
  function hasConfiguredNextcloudTalkChannelState(params) {
8
16
  const channel = params.cfg.channels?.["nextcloud-talk"];
9
17
  if (channel?.enabled === false) return false;
10
- const defaultAccount = channel?.accounts?.[DEFAULT_ACCOUNT_ID];
11
- if (defaultAccount?.enabled !== false) {
12
- if (hasConfiguredNextcloudAccount(defaultAccount ? mergeAccountConfig({
13
- channelConfig: channel,
14
- accountConfig: defaultAccount,
15
- omitKeys: ["defaultAccount"]
16
- }) : channel, params.env ?? process.env)) return true;
18
+ if ((channel?.accounts?.[DEFAULT_ACCOUNT_ID])?.enabled !== false) {
19
+ if (hasConfiguredNextcloudAccount(mergeNextcloudTalkAccountConfig(params.cfg, DEFAULT_ACCOUNT_ID), params.env ?? process.env)) return true;
17
20
  }
18
- return Object.entries(channel?.accounts ?? {}).some(([accountId, account]) => accountId !== DEFAULT_ACCOUNT_ID && account.enabled !== false && hasConfiguredNextcloudAccount(mergeAccountConfig({
19
- channelConfig: channel,
20
- accountConfig: account,
21
- omitKeys: ["defaultAccount"]
22
- }), {}));
21
+ return Object.entries(channel?.accounts ?? {}).some(([accountId, account]) => accountId !== DEFAULT_ACCOUNT_ID && account.enabled !== false && hasConfiguredNextcloudAccount(mergeNextcloudTalkAccountConfig(params.cfg, accountId), {}));
23
22
  }
24
23
  //#endregion
25
- export { hasConfiguredNextcloudTalkChannelState };
24
+ export { hasConfiguredNextcloudTalkChannelState, listNextcloudTalkAccountIds, mergeNextcloudTalkAccountConfig, resolveDefaultNextcloudTalkAccountId };
@@ -1,2 +1,2 @@
1
- import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./.setup/doctor-contract-BVJcDIeU.mjs";
2
- export { legacyConfigRules, normalizeCompatibilityConfig };
1
+ import { n as legacyConfigRules, r as normalizeCompatibilityConfig, t as historicalWebhookListener } from "./.setup/doctor-contract-cCN4i0Kr.mjs";
2
+ export { historicalWebhookListener, legacyConfigRules, normalizeCompatibilityConfig };
@@ -1,2 +1,2 @@
1
- import { a as fetchWithSsrFGuard, c as resolveDefaultGroupPolicy, d as setNextcloudTalkRuntime, i as deliverFormattedTextWithAttachments, l as warnMissingProviderGroupPolicyFallbackOnce, n as createChannelMessageReplyPipeline, o as logInboundDrop, r as createChannelPairingController, s as resolveAllowlistProviderRuntimeGroupPolicy, t as GROUP_POLICY_BLOCKED_LABEL } from "./.setup/runtime-api-BKsxTw4J.mjs";
2
- export { GROUP_POLICY_BLOCKED_LABEL, createChannelMessageReplyPipeline, createChannelPairingController, deliverFormattedTextWithAttachments, fetchWithSsrFGuard, logInboundDrop, resolveAllowlistProviderRuntimeGroupPolicy, resolveDefaultGroupPolicy, setNextcloudTalkRuntime, warnMissingProviderGroupPolicyFallbackOnce };
1
+ import { a as logInboundDrop, c as warnMissingProviderGroupPolicyFallbackOnce, d as setNextcloudTalkRuntime, i as fetchWithSsrFGuard, n as createChannelPairingController, o as resolveAllowlistProviderRuntimeGroupPolicy, r as deliverFormattedTextWithAttachments, s as resolveDefaultGroupPolicy, t as GROUP_POLICY_BLOCKED_LABEL } from "./.setup/runtime-api-DVkVOUSo.mjs";
2
+ export { GROUP_POLICY_BLOCKED_LABEL, createChannelPairingController, deliverFormattedTextWithAttachments, fetchWithSsrFGuard, logInboundDrop, resolveAllowlistProviderRuntimeGroupPolicy, resolveDefaultGroupPolicy, setNextcloudTalkRuntime, warnMissingProviderGroupPolicyFallbackOnce };
@@ -4,7 +4,7 @@ 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/api-hlcmleZc.mjs", import.meta.url).href),
7
+ specifier: fileURLToPath(new URL(".setup/api-2aJflUI4.mjs", import.meta.url).href),
8
8
  exportName: "nextcloudTalkPlugin"
9
9
  },
10
10
  secrets: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/nextcloud-talk",
3
- "version": "2026.9.8",
3
+ "version": "2026.10.1-beta.1",
4
4
  "description": "OpenClaw Nextcloud Talk channel plugin for conversations.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -8,7 +8,7 @@
8
8
  },
9
9
  "type": "module",
10
10
  "peerDependencies": {
11
- "openclaw": ">=2026.9.8"
11
+ "openclaw": ">=2026.10.1-beta.1"
12
12
  },
13
13
  "peerDependenciesMeta": {
14
14
  "openclaw": {
@@ -130,10 +130,10 @@
130
130
  "minHostVersion": ">=2026.4.10"
131
131
  },
132
132
  "compat": {
133
- "pluginApi": ">=2026.9.8"
133
+ "pluginApi": ">=2026.10.1-beta.1"
134
134
  },
135
135
  "build": {
136
- "openclawVersion": "2026.9.8"
136
+ "openclawVersion": "2026.10.1-beta.1"
137
137
  },
138
138
  "release": {
139
139
  "publishToClawHub": true,
@@ -1,3 +0,0 @@
1
- import { t as nextcloudTalkPlugin } from "./channel-CeJpOTiY.mjs";
2
- import "../api.js";
3
- export { nextcloudTalkPlugin };