@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.
- package/dist/.setup/api-2aJflUI4.mjs +3 -0
- package/dist/.setup/{channel-CeJpOTiY.mjs → channel-8QL-89-o.mjs} +41 -117
- package/dist/.setup/{doctor-contract-BVJcDIeU.mjs → doctor-contract-cCN4i0Kr.mjs} +17 -12
- package/dist/.setup/{runtime-api-BKsxTw4J.mjs → runtime-api-DVkVOUSo.mjs} +2 -3
- package/dist/api.js +1 -1
- package/dist/channel-plugin-api.js +1 -1
- package/dist/configured-state.js +13 -14
- package/dist/doctor-contract-api.js +2 -2
- package/dist/runtime-api.js +2 -2
- package/dist/setup-entry.js +1 -1
- package/package.json +4 -4
- package/dist/.setup/api-hlcmleZc.mjs +0 -3
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
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 {
|
|
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 {
|
|
10
|
-
import { DEFAULT_ACCOUNT_ID,
|
|
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 =
|
|
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
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
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
|
|
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
|
|
651
|
-
else infoNotes.push(`- channels.nextcloud-talk.${account.accountId}:
|
|
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.
|
|
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:
|
|
711
|
-
const
|
|
712
|
-
|
|
713
|
-
|
|
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:
|
|
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(
|
|
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
|
-
|
|
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:
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
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
|
|
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,
|
|
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
|
|
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
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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,
|
|
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 {
|
|
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-
|
|
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-
|
|
1
|
+
import { t as nextcloudTalkPlugin } from "./.setup/channel-8QL-89-o.mjs";
|
|
2
2
|
export { nextcloudTalkPlugin };
|
package/dist/configured-state.js
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
|
-
import { DEFAULT_ACCOUNT_ID, hasConfiguredAccountValue,
|
|
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
|
-
|
|
11
|
-
|
|
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(
|
|
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
|
|
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 };
|
package/dist/runtime-api.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
export { GROUP_POLICY_BLOCKED_LABEL,
|
|
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 };
|
package/dist/setup-entry.js
CHANGED
|
@@ -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-
|
|
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.
|
|
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.
|
|
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.
|
|
133
|
+
"pluginApi": ">=2026.10.1-beta.1"
|
|
134
134
|
},
|
|
135
135
|
"build": {
|
|
136
|
-
"openclawVersion": "2026.
|
|
136
|
+
"openclawVersion": "2026.10.1-beta.1"
|
|
137
137
|
},
|
|
138
138
|
"release": {
|
|
139
139
|
"publishToClawHub": true,
|