@openclaw/nextcloud-talk 2026.8.1 → 2026.8.33
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-BWIFedq4.mjs +3 -0
- package/dist/{channel-C7Xe0Nkb.js → .setup/channel-BRTC52in.mjs} +102 -75
- package/dist/.setup/secret-contract-api-DtjjYcg2.mjs +3 -0
- package/dist/api.js +1 -1
- package/dist/channel-plugin-api.js +1 -1
- package/dist/doctor-contract-api.js +1 -1
- package/dist/runtime-api.js +1 -1
- package/dist/secret-contract-api.js +1 -1
- package/dist/setup-entry.js +3 -2
- package/package.json +4 -4
- /package/dist/{doctor-contract-Bda_xc6V.js → .setup/doctor-contract-Bda_xc6V.mjs} +0 -0
- /package/dist/{runtime-api-BKsxTw4J.js → .setup/runtime-api-BKsxTw4J.mjs} +0 -0
- /package/dist/{secret-contract-Bvm0PmP3.js → .setup/secret-contract-Bvm0PmP3.mjs} +0 -0
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
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.
|
|
2
|
-
import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./doctor-contract-Bda_xc6V.
|
|
3
|
-
import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-Bvm0PmP3.
|
|
1
|
+
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";
|
|
2
|
+
import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./doctor-contract-Bda_xc6V.mjs";
|
|
3
|
+
import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-Bvm0PmP3.mjs";
|
|
4
4
|
import { createAccountListHelpers, describeWebhookAccountSnapshot } from "openclaw/plugin-sdk/account-helpers";
|
|
5
5
|
import { createChatChannelPlugin } from "openclaw/plugin-sdk/channel-core";
|
|
6
6
|
import { createLoggedPairingApprovalNotifier, createPairingPrefixStripper } from "openclaw/plugin-sdk/channel-pairing";
|
|
7
7
|
import { createAllowlistProviderRouteAllowlistWarningCollector, createConditionalWarningCollector, resolveScopeRequireMention, resolveScopeToolsPolicy } from "openclaw/plugin-sdk/channel-policy";
|
|
8
8
|
import { buildWebhookChannelStatusSummary, createComputedAccountStatusAdapter, createDefaultChannelRuntimeState } from "openclaw/plugin-sdk/status-helpers";
|
|
9
9
|
import { FormatCapabilityProfile, convertMarkdownTables, renderMarkdownWithMarkers, sanitizeAssistantVisibleText } from "openclaw/plugin-sdk/text-chunking";
|
|
10
|
-
import { createChannelApprovalAuth } from "openclaw/plugin-sdk/approval-auth-runtime";
|
|
11
|
-
import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString, normalizeStringEntries, readNonEmptyStringPreservingWhitespace } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
12
10
|
import { DEFAULT_ACCOUNT_ID, hasConfiguredAccountValue, normalizeAccountId, resolveAccountWithDefaultFallback } from "openclaw/plugin-sdk/account-core";
|
|
13
11
|
import { isTruthyEnvValue } from "openclaw/plugin-sdk/runtime-env";
|
|
14
12
|
import { tryReadSecretFileSync } from "openclaw/plugin-sdk/secret-file-runtime";
|
|
15
|
-
import { buildSecretInputSchema, hasConfiguredSecretInput,
|
|
13
|
+
import { buildSecretInputSchema, hasConfiguredSecretInput, resolveSecretInputString } from "openclaw/plugin-sdk/secret-input";
|
|
14
|
+
import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString, normalizeStringEntries, readNonEmptyStringPreservingWhitespace } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
15
|
+
import { createChannelApprovalAuth } from "openclaw/plugin-sdk/approval-auth-runtime";
|
|
16
16
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
17
17
|
import { parseStrictNonNegativeInteger, parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime";
|
|
18
18
|
import { readProviderJsonResponse, readProviderTextResponse } from "openclaw/plugin-sdk/provider-http";
|
|
@@ -53,17 +53,19 @@ import { formatDocsLink as formatDocsLink$1 } from "openclaw/plugin-sdk/setup-to
|
|
|
53
53
|
function resolveNextcloudTalkApiCredentialsResult(params) {
|
|
54
54
|
const apiUser = params.apiUser?.trim();
|
|
55
55
|
if (!apiUser) return { status: "missing" };
|
|
56
|
-
const inlinePassword =
|
|
56
|
+
const inlinePassword = resolveSecretInputString({
|
|
57
57
|
value: params.apiPassword,
|
|
58
|
-
path: "channels.nextcloud-talk.apiPassword"
|
|
58
|
+
path: "channels.nextcloud-talk.apiPassword",
|
|
59
|
+
mode: params.mode
|
|
59
60
|
});
|
|
60
|
-
if (inlinePassword) return {
|
|
61
|
+
if (inlinePassword.status === "available") return {
|
|
61
62
|
status: "available",
|
|
62
63
|
value: {
|
|
63
64
|
apiUser,
|
|
64
|
-
apiPassword: inlinePassword
|
|
65
|
+
apiPassword: inlinePassword.value
|
|
65
66
|
}
|
|
66
67
|
};
|
|
68
|
+
if (inlinePassword.status === "configured_unavailable") return { status: "configured_unavailable" };
|
|
67
69
|
if (!params.apiPasswordFile?.trim()) return { status: "missing" };
|
|
68
70
|
const result = tryReadSecretFileSync(params.apiPasswordFile, "Nextcloud Talk API password", { rejectHardlinks: false }, { configPath: params.configPath ?? "channels.nextcloud-talk.apiPasswordFile" });
|
|
69
71
|
if (result.status === "available") return result.value ? {
|
|
@@ -180,15 +182,21 @@ function inspectNextcloudTalkAccount(params) {
|
|
|
180
182
|
apiUser: account.config.apiUser,
|
|
181
183
|
apiPassword: account.config.apiPassword,
|
|
182
184
|
apiPasswordFile: account.config.apiPasswordFile,
|
|
183
|
-
configPath: `channels.nextcloud-talk.accounts.${account.accountId}.apiPasswordFile
|
|
185
|
+
configPath: `channels.nextcloud-talk.accounts.${account.accountId}.apiPasswordFile`,
|
|
186
|
+
mode: "inspect"
|
|
184
187
|
});
|
|
185
|
-
const credentialDiagnostics = [...account.credentialDiagnostics ?? [], ...apiCredentialResolution.status === "configured_unavailable" ? [apiCredentialResolution.diagnostic] : []];
|
|
188
|
+
const credentialDiagnostics = [...account.credentialDiagnostics ?? [], ...apiCredentialResolution.status === "configured_unavailable" && apiCredentialResolution.diagnostic ? [apiCredentialResolution.diagnostic] : []];
|
|
186
189
|
return {
|
|
187
190
|
...account,
|
|
191
|
+
configured: isNextcloudTalkAccountConfigured(account),
|
|
192
|
+
mode: "webhook",
|
|
188
193
|
apiCredentialStatus: apiCredentialResolution.status,
|
|
189
194
|
...credentialDiagnostics.length > 0 ? { credentialDiagnostics } : {}
|
|
190
195
|
};
|
|
191
196
|
}
|
|
197
|
+
function isNextcloudTalkAccountConfigured(account) {
|
|
198
|
+
return Boolean(account.tokenStatus !== "missing" && account.baseUrl?.trim());
|
|
199
|
+
}
|
|
192
200
|
//#endregion
|
|
193
201
|
//#region extensions/nextcloud-talk/src/approval-auth.ts
|
|
194
202
|
function normalizeNextcloudTalkApproverId(value) {
|
|
@@ -213,7 +221,7 @@ async function releaseNextcloudTalkGuardedResponse(params) {
|
|
|
213
221
|
async function readNextcloudTalkErrorBody(response, ...credentials) {
|
|
214
222
|
try {
|
|
215
223
|
let body = await readProviderTextResponse(response, "Nextcloud Talk error", {
|
|
216
|
-
maxBytes:
|
|
224
|
+
maxBytes: 8192,
|
|
217
225
|
chunkTimeoutMs: 1e4
|
|
218
226
|
});
|
|
219
227
|
for (const credential of credentials) body = body.replaceAll(credential, "***");
|
|
@@ -234,7 +242,8 @@ const BACKEND_HEADER = "x-nextcloud-talk-backend";
|
|
|
234
242
|
function verifyNextcloudTalkSignature(params) {
|
|
235
243
|
const { signature, random, body, secret } = params;
|
|
236
244
|
if (!signature || !random || !secret) return false;
|
|
237
|
-
|
|
245
|
+
const expected = createHmac("sha256", secret).update(random + body).digest("hex");
|
|
246
|
+
return safeEqualSecret(signature, expected);
|
|
238
247
|
}
|
|
239
248
|
/**
|
|
240
249
|
* Extract webhook headers from an incoming request.
|
|
@@ -384,7 +393,16 @@ const nextcloudTalkConfigAdapter = createScopedChannelConfigAdapter({
|
|
|
384
393
|
sectionKey: "nextcloud-talk",
|
|
385
394
|
listAccountIds: listNextcloudTalkAccountIds,
|
|
386
395
|
resolveAccount: adaptScopedAccountAccessor(resolveNextcloudTalkAccount),
|
|
387
|
-
inspectAccount:
|
|
396
|
+
inspectAccount: (cfg, accountId) => {
|
|
397
|
+
const account = inspectNextcloudTalkAccount({
|
|
398
|
+
cfg,
|
|
399
|
+
accountId
|
|
400
|
+
});
|
|
401
|
+
return {
|
|
402
|
+
...account,
|
|
403
|
+
baseUrl: account.baseUrl ? "[set]" : "[missing]"
|
|
404
|
+
};
|
|
405
|
+
},
|
|
388
406
|
defaultAccountId: resolveDefaultNextcloudTalkAccountId,
|
|
389
407
|
clearBaseFields: [
|
|
390
408
|
"botSecret",
|
|
@@ -416,7 +434,7 @@ const NextcloudTalkRoomSchema = buildGroupEntrySchema({ allowFrom: z.array(z.str
|
|
|
416
434
|
const NextcloudTalkNetworkSchema = z.object({
|
|
417
435
|
/** Dangerous opt-in for self-hosted Nextcloud Talk on trusted private/internal hosts. */
|
|
418
436
|
dangerouslyAllowPrivateNetwork: z.boolean().optional() }).strict().optional();
|
|
419
|
-
const
|
|
437
|
+
const NextcloudTalkAccountSchemaBase = z.object({
|
|
420
438
|
name: z.string().optional(),
|
|
421
439
|
enabled: z.boolean().optional(),
|
|
422
440
|
configWrites: z.boolean().optional(),
|
|
@@ -440,7 +458,8 @@ const NextcloudTalkConfigSchema = buildMultiAccountChannelSchema(z.object({
|
|
|
440
458
|
/** Network policy overrides for self-hosted Nextcloud Talk on trusted private/internal hosts. */
|
|
441
459
|
network: NextcloudTalkNetworkSchema,
|
|
442
460
|
...ReplyRuntimeConfigSchemaShape
|
|
443
|
-
}).strict()
|
|
461
|
+
}).strict();
|
|
462
|
+
const NextcloudTalkConfigSchema = buildMultiAccountChannelSchema(NextcloudTalkAccountSchemaBase, {
|
|
444
463
|
optionalAccount: true,
|
|
445
464
|
refine: (value, ctx) => {
|
|
446
465
|
requireChannelOpenAllowFrom({
|
|
@@ -456,7 +475,7 @@ const NextcloudTalkConfigSchema = buildMultiAccountChannelSchema(z.object({
|
|
|
456
475
|
//#region extensions/nextcloud-talk/src/replay-migration-contract.ts
|
|
457
476
|
const NEXTCLOUD_TALK_PLUGIN_ID = "nextcloud-talk";
|
|
458
477
|
const NEXTCLOUD_TALK_REPLAY_DEDUPE_NAMESPACE_PREFIX = "replay-dedupe";
|
|
459
|
-
const NEXTCLOUD_TALK_REPLAY_DEDUPE_TTL_MS =
|
|
478
|
+
const NEXTCLOUD_TALK_REPLAY_DEDUPE_TTL_MS = 864e5;
|
|
460
479
|
const NEXTCLOUD_TALK_REPLAY_DEDUPE_MAX_ENTRIES = 1e4;
|
|
461
480
|
//#endregion
|
|
462
481
|
//#region extensions/nextcloud-talk/src/doctor.ts
|
|
@@ -536,10 +555,12 @@ function normalizeNextcloudTalkAllowlist(values) {
|
|
|
536
555
|
return (values ?? []).map((value) => normalizeNextcloudTalkAllowEntry(String(value))).filter(Boolean);
|
|
537
556
|
}
|
|
538
557
|
function resolveNextcloudTalkAllowlistMatch(params) {
|
|
558
|
+
const allowFrom = normalizeNextcloudTalkAllowlist(params.allowFrom);
|
|
559
|
+
const senderId = normalizeNextcloudTalkAllowEntry(params.senderId);
|
|
539
560
|
return resolveAllowlistMatchByCandidates({
|
|
540
|
-
allowList:
|
|
561
|
+
allowList: allowFrom,
|
|
541
562
|
candidates: [{
|
|
542
|
-
value:
|
|
563
|
+
value: senderId,
|
|
543
564
|
source: "id"
|
|
544
565
|
}]
|
|
545
566
|
});
|
|
@@ -607,8 +628,8 @@ function resolveNextcloudTalkGroupRequireMention(params) {
|
|
|
607
628
|
}
|
|
608
629
|
//#endregion
|
|
609
630
|
//#region extensions/nextcloud-talk/src/room-info.ts
|
|
610
|
-
const ROOM_CACHE_TTL_MS =
|
|
611
|
-
const ROOM_CACHE_ERROR_TTL_MS =
|
|
631
|
+
const ROOM_CACHE_TTL_MS = 3e5;
|
|
632
|
+
const ROOM_CACHE_ERROR_TTL_MS = 3e4;
|
|
612
633
|
const ROOM_CACHE_MAX_ENTRIES = 1e3;
|
|
613
634
|
const NEXTCLOUD_TALK_ROOM_INFO_TIMEOUT_MS = 3e4;
|
|
614
635
|
const roomCache = /* @__PURE__ */ new Map();
|
|
@@ -670,7 +691,8 @@ async function resolveNextcloudTalkRoomKind(params) {
|
|
|
670
691
|
runtime?.log?.(`nextcloud-talk: room lookup failed (${response.status}) token=${roomToken}`);
|
|
671
692
|
return;
|
|
672
693
|
}
|
|
673
|
-
const
|
|
694
|
+
const payload = await readProviderJsonResponse(response, "Nextcloud Talk room info failed");
|
|
695
|
+
const kind = resolveRoomKindFromType(parseStrictPositiveInteger(payload.ocs?.data?.type));
|
|
674
696
|
cacheRoomInfo(key, {
|
|
675
697
|
fetchedAt: Date.now(),
|
|
676
698
|
kind
|
|
@@ -814,8 +836,9 @@ async function sendMessageNextcloudTalk(to, text, opts) {
|
|
|
814
836
|
body: message,
|
|
815
837
|
secret
|
|
816
838
|
});
|
|
839
|
+
const url = `${baseUrl}/ocs/v2.php/apps/spreed/api/v1/bot/${roomToken}/message`;
|
|
817
840
|
const { response, release } = await fetchWithSsrFGuard({
|
|
818
|
-
url
|
|
841
|
+
url,
|
|
819
842
|
init: {
|
|
820
843
|
method: "POST",
|
|
821
844
|
headers: {
|
|
@@ -876,8 +899,9 @@ async function sendReactionNextcloudTalk(roomToken, messageId, reaction, opts) {
|
|
|
876
899
|
body: reaction,
|
|
877
900
|
secret
|
|
878
901
|
});
|
|
902
|
+
const url = `${baseUrl}/ocs/v2.php/apps/spreed/api/v1/bot/${normalizedToken}/reaction/${messageId}`;
|
|
879
903
|
const { response, release } = await fetchWithSsrFGuard({
|
|
880
|
-
url
|
|
904
|
+
url,
|
|
881
905
|
init: {
|
|
882
906
|
method: "POST",
|
|
883
907
|
headers: {
|
|
@@ -1289,8 +1313,8 @@ async function migrateNextcloudTalkLegacyReplayState(params) {
|
|
|
1289
1313
|
}
|
|
1290
1314
|
//#endregion
|
|
1291
1315
|
//#region extensions/nextcloud-talk/src/monitor.ts
|
|
1292
|
-
const DEFAULT_WEBHOOK_MAX_BODY_BYTES =
|
|
1293
|
-
const PREAUTH_WEBHOOK_MAX_BODY_BYTES =
|
|
1316
|
+
const DEFAULT_WEBHOOK_MAX_BODY_BYTES = 1048576;
|
|
1317
|
+
const PREAUTH_WEBHOOK_MAX_BODY_BYTES = 65536;
|
|
1294
1318
|
const NEXTCLOUD_TALK_WEBHOOK_ACCEPTED_HEADER = "x-openclaw-delivery-accepted";
|
|
1295
1319
|
const NEXTCLOUD_TALK_WEBHOOK_ACCEPTED_VALUE = "durable";
|
|
1296
1320
|
const PREAUTH_WEBHOOK_BODY_TIMEOUT_MS = 5e3;
|
|
@@ -1449,8 +1473,10 @@ function createNextcloudTalkWebhookServer(opts) {
|
|
|
1449
1473
|
});
|
|
1450
1474
|
});
|
|
1451
1475
|
};
|
|
1452
|
-
if (abortSignal)
|
|
1453
|
-
|
|
1476
|
+
if (abortSignal) {
|
|
1477
|
+
if (abortSignal.aborted) stop();
|
|
1478
|
+
else abortSignal.addEventListener("abort", () => void stop(), { once: true });
|
|
1479
|
+
}
|
|
1454
1480
|
return {
|
|
1455
1481
|
server,
|
|
1456
1482
|
start,
|
|
@@ -1933,6 +1959,49 @@ const nextcloudTalkDmPolicy = createChannelDmPolicy({
|
|
|
1933
1959
|
applyPatch: ({ cfg, account, patch }) => setNextcloudTalkAccountConfig(cfg, account.accountId, patch),
|
|
1934
1960
|
promptAllowFrom: promptNextcloudTalkAllowFromForAccount
|
|
1935
1961
|
});
|
|
1962
|
+
const nextcloudTalkSetupAdapter = {
|
|
1963
|
+
singleAccountKeysToMove: ["rooms"],
|
|
1964
|
+
resolveAccountId: ({ accountId }) => normalizeAccountId$1(accountId),
|
|
1965
|
+
prepareAccountConfigInput: ({ input }) => {
|
|
1966
|
+
const setupInput = input;
|
|
1967
|
+
return {
|
|
1968
|
+
...setupInput,
|
|
1969
|
+
baseUrl: setupInput.baseUrl ?? readNonEmptyStringPreservingWhitespace(setupInput.url),
|
|
1970
|
+
secret: setupInput.secret ?? readNonEmptyStringPreservingWhitespace(setupInput.token) ?? readNonEmptyStringPreservingWhitespace(setupInput.password),
|
|
1971
|
+
secretFile: setupInput.secretFile ?? readNonEmptyStringPreservingWhitespace(setupInput.tokenFile)
|
|
1972
|
+
};
|
|
1973
|
+
},
|
|
1974
|
+
applyAccountName: ({ cfg, accountId, name }) => applyAccountNameToChannelSection({
|
|
1975
|
+
cfg,
|
|
1976
|
+
channelKey: channel$1,
|
|
1977
|
+
accountId,
|
|
1978
|
+
name
|
|
1979
|
+
}),
|
|
1980
|
+
validateInput: createSetupInputPresenceValidator({
|
|
1981
|
+
defaultAccountOnlyEnvError: "NEXTCLOUD_TALK_BOT_SECRET can only be used for the default account.",
|
|
1982
|
+
validate: ({ input }) => {
|
|
1983
|
+
const setupInput = input;
|
|
1984
|
+
if (!setupInput.useEnv && !setupInput.secret && !setupInput.secretFile) return "Nextcloud Talk requires bot secret or --secret-file (or --use-env).";
|
|
1985
|
+
const normalizedBaseUrl = normalizeNextcloudTalkBaseUrl(setupInput.baseUrl);
|
|
1986
|
+
if (!normalizedBaseUrl) return "Nextcloud Talk requires --base-url.";
|
|
1987
|
+
const baseUrlError = validateNextcloudTalkBaseUrl(normalizedBaseUrl);
|
|
1988
|
+
if (baseUrlError) return baseUrlError;
|
|
1989
|
+
return null;
|
|
1990
|
+
}
|
|
1991
|
+
}),
|
|
1992
|
+
applyAccountConfig: ({ cfg, accountId, input }) => {
|
|
1993
|
+
const setupInput = input;
|
|
1994
|
+
return setNextcloudTalkAccountConfig(applyAccountNameToChannelSection({
|
|
1995
|
+
cfg,
|
|
1996
|
+
channelKey: channel$1,
|
|
1997
|
+
accountId,
|
|
1998
|
+
name: setupInput.name
|
|
1999
|
+
}), accountId, {
|
|
2000
|
+
baseUrl: normalizeNextcloudTalkBaseUrl(setupInput.baseUrl),
|
|
2001
|
+
...setupInput.useEnv ? {} : setupInput.secretFile ? { botSecretFile: setupInput.secretFile } : setupInput.secret ? { botSecret: setupInput.secret } : {}
|
|
2002
|
+
}, setupInput.useEnv ? ["botSecret", "botSecretFile"] : void 0);
|
|
2003
|
+
}
|
|
2004
|
+
};
|
|
1936
2005
|
const nextcloudTalkSetupContract = defineChannelSetupContract({
|
|
1937
2006
|
fields: {
|
|
1938
2007
|
baseUrl: {
|
|
@@ -1998,49 +2067,7 @@ const nextcloudTalkSetupContract = defineChannelSetupContract({
|
|
|
1998
2067
|
envVars: ["NEXTCLOUD_TALK_BOT_SECRET"]
|
|
1999
2068
|
}
|
|
2000
2069
|
},
|
|
2001
|
-
legacyAdapter:
|
|
2002
|
-
singleAccountKeysToMove: ["rooms"],
|
|
2003
|
-
resolveAccountId: ({ accountId }) => normalizeAccountId$1(accountId),
|
|
2004
|
-
prepareAccountConfigInput: ({ input }) => {
|
|
2005
|
-
const setupInput = input;
|
|
2006
|
-
return {
|
|
2007
|
-
...setupInput,
|
|
2008
|
-
baseUrl: setupInput.baseUrl ?? readNonEmptyStringPreservingWhitespace(setupInput.url),
|
|
2009
|
-
secret: setupInput.secret ?? readNonEmptyStringPreservingWhitespace(setupInput.token) ?? readNonEmptyStringPreservingWhitespace(setupInput.password),
|
|
2010
|
-
secretFile: setupInput.secretFile ?? readNonEmptyStringPreservingWhitespace(setupInput.tokenFile)
|
|
2011
|
-
};
|
|
2012
|
-
},
|
|
2013
|
-
applyAccountName: ({ cfg, accountId, name }) => applyAccountNameToChannelSection({
|
|
2014
|
-
cfg,
|
|
2015
|
-
channelKey: channel$1,
|
|
2016
|
-
accountId,
|
|
2017
|
-
name
|
|
2018
|
-
}),
|
|
2019
|
-
validateInput: createSetupInputPresenceValidator({
|
|
2020
|
-
defaultAccountOnlyEnvError: "NEXTCLOUD_TALK_BOT_SECRET can only be used for the default account.",
|
|
2021
|
-
validate: ({ input }) => {
|
|
2022
|
-
const setupInput = input;
|
|
2023
|
-
if (!setupInput.useEnv && !setupInput.secret && !setupInput.secretFile) return "Nextcloud Talk requires bot secret or --secret-file (or --use-env).";
|
|
2024
|
-
const normalizedBaseUrl = normalizeNextcloudTalkBaseUrl(setupInput.baseUrl);
|
|
2025
|
-
if (!normalizedBaseUrl) return "Nextcloud Talk requires --base-url.";
|
|
2026
|
-
const baseUrlError = validateNextcloudTalkBaseUrl(normalizedBaseUrl);
|
|
2027
|
-
if (baseUrlError) return baseUrlError;
|
|
2028
|
-
return null;
|
|
2029
|
-
}
|
|
2030
|
-
}),
|
|
2031
|
-
applyAccountConfig: ({ cfg, accountId, input }) => {
|
|
2032
|
-
const setupInput = input;
|
|
2033
|
-
return setNextcloudTalkAccountConfig(applyAccountNameToChannelSection({
|
|
2034
|
-
cfg,
|
|
2035
|
-
channelKey: channel$1,
|
|
2036
|
-
accountId,
|
|
2037
|
-
name: setupInput.name
|
|
2038
|
-
}), accountId, {
|
|
2039
|
-
baseUrl: normalizeNextcloudTalkBaseUrl(setupInput.baseUrl),
|
|
2040
|
-
...setupInput.useEnv ? {} : setupInput.secretFile ? { botSecretFile: setupInput.secretFile } : setupInput.secret ? { botSecret: setupInput.secret } : {}
|
|
2041
|
-
}, setupInput.useEnv ? ["botSecret", "botSecretFile"] : void 0);
|
|
2042
|
-
}
|
|
2043
|
-
}
|
|
2070
|
+
legacyAdapter: nextcloudTalkSetupAdapter
|
|
2044
2071
|
});
|
|
2045
2072
|
//#endregion
|
|
2046
2073
|
//#region extensions/nextcloud-talk/src/setup-surface.ts
|
|
@@ -2225,10 +2252,10 @@ const nextcloudTalkPlugin = createChatChannelPlugin({
|
|
|
2225
2252
|
configSchema: buildChannelConfigSchema(NextcloudTalkConfigSchema),
|
|
2226
2253
|
config: {
|
|
2227
2254
|
...nextcloudTalkConfigAdapter,
|
|
2228
|
-
isConfigured:
|
|
2255
|
+
isConfigured: isNextcloudTalkAccountConfigured,
|
|
2229
2256
|
describeAccount: (account) => describeWebhookAccountSnapshot({
|
|
2230
2257
|
account,
|
|
2231
|
-
configured:
|
|
2258
|
+
configured: isNextcloudTalkAccountConfigured(account),
|
|
2232
2259
|
extra: {
|
|
2233
2260
|
secretSource: account.secretSource,
|
|
2234
2261
|
tokenStatus: account.tokenStatus,
|
|
@@ -2284,7 +2311,7 @@ const nextcloudTalkPlugin = createChatChannelPlugin({
|
|
|
2284
2311
|
accountId: account.accountId,
|
|
2285
2312
|
name: account.name,
|
|
2286
2313
|
enabled: account.enabled,
|
|
2287
|
-
configured:
|
|
2314
|
+
configured: isNextcloudTalkAccountConfigured(account),
|
|
2288
2315
|
extra: {
|
|
2289
2316
|
secretSource: account.secretSource,
|
|
2290
2317
|
tokenStatus: account.tokenStatus,
|
package/dist/api.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as nextcloudTalkPlugin } from "
|
|
1
|
+
import { t as nextcloudTalkPlugin } from "./.setup/channel-BRTC52in.mjs";
|
|
2
2
|
export { nextcloudTalkPlugin };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as nextcloudTalkPlugin } from "
|
|
1
|
+
import { t as nextcloudTalkPlugin } from "./.setup/channel-BRTC52in.mjs";
|
|
2
2
|
export { nextcloudTalkPlugin };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "
|
|
1
|
+
import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./.setup/doctor-contract-Bda_xc6V.mjs";
|
|
2
2
|
export { legacyConfigRules, normalizeCompatibilityConfig };
|
package/dist/runtime-api.js
CHANGED
|
@@ -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 "
|
|
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
2
|
export { GROUP_POLICY_BLOCKED_LABEL, createChannelMessageReplyPipeline, createChannelPairingController, deliverFormattedTextWithAttachments, fetchWithSsrFGuard, logInboundDrop, resolveAllowlistProviderRuntimeGroupPolicy, resolveDefaultGroupPolicy, setNextcloudTalkRuntime, warnMissingProviderGroupPolicyFallbackOnce };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries, t as channelSecrets } from "
|
|
1
|
+
import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries, t as channelSecrets } from "./.setup/secret-contract-Bvm0PmP3.mjs";
|
|
2
2
|
export { channelSecrets, collectRuntimeConfigAssignments, secretTargetRegistryEntries };
|
package/dist/setup-entry.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { defineBundledChannelSetupEntry } from "openclaw/plugin-sdk/channel-entry-contract";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
2
3
|
//#region extensions/nextcloud-talk/setup-entry.ts
|
|
3
4
|
var setup_entry_default = defineBundledChannelSetupEntry({
|
|
4
5
|
importMetaUrl: import.meta.url,
|
|
5
6
|
plugin: {
|
|
6
|
-
specifier: "
|
|
7
|
+
specifier: fileURLToPath(new URL(".setup/api-BWIFedq4.mjs", import.meta.url).href),
|
|
7
8
|
exportName: "nextcloudTalkPlugin"
|
|
8
9
|
},
|
|
9
10
|
secrets: {
|
|
10
|
-
specifier: "
|
|
11
|
+
specifier: fileURLToPath(new URL(".setup/secret-contract-api-DtjjYcg2.mjs", import.meta.url).href),
|
|
11
12
|
exportName: "channelSecrets"
|
|
12
13
|
}
|
|
13
14
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/nextcloud-talk",
|
|
3
|
-
"version": "2026.8.
|
|
3
|
+
"version": "2026.8.33",
|
|
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.8.
|
|
11
|
+
"openclaw": ">=2026.8.33"
|
|
12
12
|
},
|
|
13
13
|
"peerDependenciesMeta": {
|
|
14
14
|
"openclaw": {
|
|
@@ -129,10 +129,10 @@
|
|
|
129
129
|
"minHostVersion": ">=2026.4.10"
|
|
130
130
|
},
|
|
131
131
|
"compat": {
|
|
132
|
-
"pluginApi": ">=2026.8.
|
|
132
|
+
"pluginApi": ">=2026.8.33"
|
|
133
133
|
},
|
|
134
134
|
"build": {
|
|
135
|
-
"openclawVersion": "2026.8.
|
|
135
|
+
"openclawVersion": "2026.8.33"
|
|
136
136
|
},
|
|
137
137
|
"release": {
|
|
138
138
|
"publishToClawHub": true,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|