@openclaw/nextcloud-talk 2026.8.1-beta.3 → 2026.9.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/api.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as nextcloudTalkPlugin } from "./channel-gYP-jQPr.js";
1
+ import { t as nextcloudTalkPlugin } from "./channel-tgvjpexV.js";
2
2
  export { nextcloudTalkPlugin };
@@ -1,2 +1,2 @@
1
- import { t as nextcloudTalkPlugin } from "./channel-gYP-jQPr.js";
1
+ import { t as nextcloudTalkPlugin } from "./channel-tgvjpexV.js";
2
2
  export { nextcloudTalkPlugin };
@@ -25,7 +25,7 @@ import { createHmac, randomBytes } from "node:crypto";
25
25
  import { fileExists, safeEqualSecret } from "openclaw/plugin-sdk/security-runtime";
26
26
  import { clearAccountEntryFields } from "openclaw/plugin-sdk/channel-plugin-common";
27
27
  import { DEFAULT_ACCOUNT_ID as DEFAULT_ACCOUNT_ID$2 } from "openclaw/plugin-sdk/account-id";
28
- import { DmPolicySchema, GroupPolicySchema, MarkdownConfigSchema, ReplyRuntimeConfigSchemaShape, buildChannelConfigSchema, buildGroupEntrySchema, buildMultiAccountChannelSchema, requireOpenAllowFrom } from "openclaw/plugin-sdk/channel-config-schema";
28
+ import { DmPolicySchema, GroupPolicySchema, MarkdownConfigSchema, ReplyRuntimeConfigSchemaShape, ReplyToModeSchema, buildChannelConfigSchema, buildGroupEntrySchema, buildMultiAccountChannelSchema, requireOpenAllowFrom } from "openclaw/plugin-sdk/channel-config-schema";
29
29
  import { formatAllowFromLowercase, resolveAllowlistMatchByCandidates } from "openclaw/plugin-sdk/allow-from";
30
30
  import { adaptScopedAccountAccessor, createScopedChannelConfigAdapter, createScopedDmSecurityResolver } from "openclaw/plugin-sdk/channel-config-helpers";
31
31
  import { requireChannelOpenAllowFrom, resolveLoggerBackedRuntime } from "openclaw/plugin-sdk/extension-shared";
@@ -147,13 +147,6 @@ function resolveNextcloudTalkAccount(params) {
147
147
  const accountEnabled = merged.enabled !== false;
148
148
  const enabled = baseEnabled && accountEnabled;
149
149
  const secretResolution = resolveNextcloudTalkSecret(accountId, merged);
150
- const apiCredentialResolution = resolveNextcloudTalkApiCredentialsResult({
151
- apiUser: merged.apiUser,
152
- apiPassword: merged.apiPassword,
153
- apiPasswordFile: merged.apiPasswordFile,
154
- configPath: `channels.nextcloud-talk.accounts.${accountId}.apiPasswordFile`
155
- });
156
- const diagnostics = [secretResolution.diagnostic, apiCredentialResolution.status === "configured_unavailable" ? apiCredentialResolution.diagnostic : void 0].filter((diagnostic) => Boolean(diagnostic));
157
150
  const baseUrl = merged.baseUrl?.trim()?.replace(/\/$/, "") ?? "";
158
151
  debugAccounts("resolve", {
159
152
  accountId,
@@ -169,8 +162,7 @@ function resolveNextcloudTalkAccount(params) {
169
162
  secret: secretResolution.secret,
170
163
  secretSource: secretResolution.source,
171
164
  tokenStatus: secretResolution.status,
172
- apiCredentialStatus: apiCredentialResolution.status,
173
- ...diagnostics.length > 0 ? { credentialDiagnostics: diagnostics } : {},
165
+ ...secretResolution.diagnostic ? { credentialDiagnostics: [secretResolution.diagnostic] } : {},
174
166
  config: merged
175
167
  };
176
168
  };
@@ -182,6 +174,21 @@ function resolveNextcloudTalkAccount(params) {
182
174
  resolveDefaultAccountId: () => resolveDefaultNextcloudTalkAccountId(params.cfg)
183
175
  });
184
176
  }
177
+ function inspectNextcloudTalkAccount(params) {
178
+ const account = resolveNextcloudTalkAccount(params);
179
+ const apiCredentialResolution = resolveNextcloudTalkApiCredentialsResult({
180
+ apiUser: account.config.apiUser,
181
+ apiPassword: account.config.apiPassword,
182
+ apiPasswordFile: account.config.apiPasswordFile,
183
+ configPath: `channels.nextcloud-talk.accounts.${account.accountId}.apiPasswordFile`
184
+ });
185
+ const credentialDiagnostics = [...account.credentialDiagnostics ?? [], ...apiCredentialResolution.status === "configured_unavailable" ? [apiCredentialResolution.diagnostic] : []];
186
+ return {
187
+ ...account,
188
+ apiCredentialStatus: apiCredentialResolution.status,
189
+ ...credentialDiagnostics.length > 0 ? { credentialDiagnostics } : {}
190
+ };
191
+ }
185
192
  //#endregion
186
193
  //#region extensions/nextcloud-talk/src/approval-auth.ts
187
194
  function normalizeNextcloudTalkApproverId(value) {
@@ -366,6 +373,7 @@ const nextcloudTalkConfigAdapter = createScopedChannelConfigAdapter({
366
373
  sectionKey: "nextcloud-talk",
367
374
  listAccountIds: listNextcloudTalkAccountIds,
368
375
  resolveAccount: adaptScopedAccountAccessor(resolveNextcloudTalkAccount),
376
+ inspectAccount: adaptScopedAccountAccessor(inspectNextcloudTalkAccount),
369
377
  defaultAccountId: resolveDefaultNextcloudTalkAccountId,
370
378
  clearBaseFields: [
371
379
  "botSecret",
@@ -401,6 +409,7 @@ const NextcloudTalkConfigSchema = buildMultiAccountChannelSchema(z.object({
401
409
  name: z.string().optional(),
402
410
  enabled: z.boolean().optional(),
403
411
  configWrites: z.boolean().optional(),
412
+ replyToMode: ReplyToModeSchema.optional(),
404
413
  markdown: MarkdownConfigSchema,
405
414
  baseUrl: z.string().optional(),
406
415
  botSecret: buildSecretInputSchema().optional(),
@@ -1414,6 +1423,7 @@ function createNextcloudTalkWebhookServer(opts) {
1414
1423
  const stop = async () => {
1415
1424
  stopRequested = true;
1416
1425
  await closeIfListening();
1426
+ webhookAuthRateLimiter.dispose();
1417
1427
  };
1418
1428
  const start = () => {
1419
1429
  if (stopRequested) return Promise.resolve();
@@ -0,0 +1,25 @@
1
+ import { DEFAULT_ACCOUNT_ID, hasConfiguredAccountValue, mergeAccountConfig } from "openclaw/plugin-sdk/account-core";
2
+ //#region extensions/nextcloud-talk/configured-state.ts
3
+ function hasConfiguredNextcloudAccount(account, env) {
4
+ return Boolean(account?.baseUrl?.trim() && (hasConfiguredAccountValue(account.botSecret) || hasConfiguredAccountValue(account.botSecretFile) || hasConfiguredAccountValue(env.NEXTCLOUD_TALK_BOT_SECRET)));
5
+ }
6
+ /** Require a Nextcloud server plus its account-owned bot credential. */
7
+ function hasConfiguredNextcloudTalkChannelState(params) {
8
+ const channel = params.cfg.channels?.["nextcloud-talk"];
9
+ 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;
17
+ }
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
+ }), {}));
23
+ }
24
+ //#endregion
25
+ export { hasConfiguredNextcloudTalkChannelState };
@@ -32,6 +32,26 @@
32
32
  "configWrites": {
33
33
  "type": "boolean"
34
34
  },
35
+ "replyToMode": {
36
+ "anyOf": [
37
+ {
38
+ "type": "string",
39
+ "const": "off"
40
+ },
41
+ {
42
+ "type": "string",
43
+ "const": "first"
44
+ },
45
+ {
46
+ "type": "string",
47
+ "const": "all"
48
+ },
49
+ {
50
+ "type": "string",
51
+ "const": "batched"
52
+ }
53
+ ]
54
+ },
35
55
  "markdown": {
36
56
  "type": "object",
37
57
  "properties": {
@@ -479,6 +499,26 @@
479
499
  "configWrites": {
480
500
  "type": "boolean"
481
501
  },
502
+ "replyToMode": {
503
+ "anyOf": [
504
+ {
505
+ "type": "string",
506
+ "const": "off"
507
+ },
508
+ {
509
+ "type": "string",
510
+ "const": "first"
511
+ },
512
+ {
513
+ "type": "string",
514
+ "const": "all"
515
+ },
516
+ {
517
+ "type": "string",
518
+ "const": "batched"
519
+ }
520
+ ]
521
+ },
482
522
  "markdown": {
483
523
  "type": "object",
484
524
  "properties": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/nextcloud-talk",
3
- "version": "2026.8.1-beta.3",
3
+ "version": "2026.9.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.8.1-beta.3"
11
+ "openclaw": ">=2026.9.1-beta.1"
12
12
  },
13
13
  "peerDependenciesMeta": {
14
14
  "openclaw": {
@@ -31,7 +31,9 @@
31
31
  "NEXTCLOUD_TALK_BOT_SECRET",
32
32
  "NEXTCLOUD_TALK_API_PASSWORD"
33
33
  ]
34
- }
34
+ },
35
+ "specifier": "./dist/configured-state.js",
36
+ "exportName": "hasConfiguredNextcloudTalkChannelState"
35
37
  },
36
38
  "label": "Nextcloud Talk",
37
39
  "selectionLabel": "Nextcloud Talk (self-hosted)",
@@ -127,10 +129,10 @@
127
129
  "minHostVersion": ">=2026.4.10"
128
130
  },
129
131
  "compat": {
130
- "pluginApi": ">=2026.8.1-beta.3"
132
+ "pluginApi": ">=2026.9.1-beta.1"
131
133
  },
132
134
  "build": {
133
- "openclawVersion": "2026.8.1-beta.3"
135
+ "openclawVersion": "2026.9.1-beta.1"
134
136
  },
135
137
  "release": {
136
138
  "publishToClawHub": true,