@openclaw/nextcloud-talk 2026.7.2-beta.4 → 2026.7.2-beta.5

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/README.md CHANGED
@@ -5,7 +5,7 @@ Official OpenClaw channel plugin for Nextcloud Talk conversations.
5
5
  Install from OpenClaw:
6
6
 
7
7
  ```bash
8
- openclaw plugin add @openclaw/nextcloud-talk
8
+ openclaw plugins install @openclaw/nextcloud-talk
9
9
  ```
10
10
 
11
11
  Configure the Nextcloud server and Talk credentials in OpenClaw, then enable the conversations where agents should receive and send messages.
package/dist/api.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as nextcloudTalkPlugin } from "./channel-DtnECxVM.js";
1
+ import { t as nextcloudTalkPlugin } from "./channel-D6MTjGj3.js";
2
2
  export { nextcloudTalkPlugin };
@@ -1,15 +1,15 @@
1
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.js";
2
2
  import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./doctor-contract-fNhK1wag.js";
3
3
  import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-DGgvfVqm.js";
4
- import { describeWebhookAccountSnapshot } from "openclaw/plugin-sdk/account-helpers";
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, resolveScopeRequireMention, resolveScopeToolsPolicy } from "openclaw/plugin-sdk/channel-policy";
8
8
  import { buildWebhookChannelStatusSummary, createComputedAccountStatusAdapter, createDefaultChannelRuntimeState } from "openclaw/plugin-sdk/status-helpers";
9
- import { convertMarkdownTables, renderMarkdownWithMarkers, sanitizeAssistantVisibleText } from "openclaw/plugin-sdk/text-chunking";
9
+ import { FormatCapabilityProfile, convertMarkdownTables, renderMarkdownWithMarkers, sanitizeAssistantVisibleText } from "openclaw/plugin-sdk/text-chunking";
10
10
  import { createChannelApprovalAuth } from "openclaw/plugin-sdk/approval-auth-runtime";
11
11
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString, normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
12
- import { DEFAULT_ACCOUNT_ID, createAccountListHelpers, hasConfiguredAccountValue, normalizeAccountId, resolveAccountWithDefaultFallback, resolveMergedAccountConfig } from "openclaw/plugin-sdk/account-core";
12
+ import { DEFAULT_ACCOUNT_ID, hasConfiguredAccountValue, normalizeAccountId, resolveAccountWithDefaultFallback } from "openclaw/plugin-sdk/account-core";
13
13
  import { tryReadSecretFileSync } from "openclaw/plugin-sdk/secret-file-runtime";
14
14
  import { buildSecretInputSchema, hasConfiguredSecretInput, normalizeResolvedSecretInputString } from "openclaw/plugin-sdk/secret-input";
15
15
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
@@ -41,6 +41,7 @@ import { createServer } from "node:http";
41
41
  import { WEBHOOK_RATE_LIMIT_DEFAULTS, createAuthRateLimiter, isRequestBodyLimitError, readRequestBodyWithLimit, requestBodyErrorToText } from "openclaw/plugin-sdk/webhook-ingress";
42
42
  import { jsonResult, readStringParam, resolveReactionMessageId } from "openclaw/plugin-sdk/channel-actions";
43
43
  import { DEFAULT_ACCOUNT_ID as DEFAULT_ACCOUNT_ID$1, buildOutboundBaseSessionKey, normalizeAccountId as normalizeAccountId$1 } from "openclaw/plugin-sdk/routing";
44
+ import { createChannelDmPolicy } from "openclaw/plugin-sdk/channel-dm-policy";
44
45
  import { defineChannelSetupContract } from "openclaw/plugin-sdk/channel-setup";
45
46
  import { applyAccountNameToChannelSection, baseUrlTextInput, createSetupTranslator, createStandardChannelSetupStatus, defineTokenCredential, formatDocsLink, patchScopedAccountConfig, setSetupChannelEnabled } from "openclaw/plugin-sdk/setup";
46
47
  import { createSetupInputPresenceValidator, createSetupTranslator as createSetupTranslator$1, mergeAllowFromEntries, promptParsedAllowFromForAccount, resolveSetupAccountId } from "openclaw/plugin-sdk/setup-runtime";
@@ -84,8 +85,9 @@ function isTruthyEnvValue(value) {
84
85
  const debugAccounts = (...args) => {
85
86
  if (isTruthyEnvValue(process.env.OPENCLAW_DEBUG_NEXTCLOUD_TALK_ACCOUNTS)) console.warn("[nextcloud-talk:accounts]", ...args);
86
87
  };
87
- const { listAccountIds: listNextcloudTalkAccountIdsInternal, resolveDefaultAccountId: resolveDefaultNextcloudTalkAccountId } = createAccountListHelpers("nextcloud-talk", {
88
+ const { listAccountIds: listNextcloudTalkAccountIdsInternal, resolveDefaultAccountId: resolveDefaultNextcloudTalkAccountId, resolveAccountConfig: mergeNextcloudTalkAccountConfig } = createAccountListHelpers("nextcloud-talk", {
88
89
  normalizeAccountId,
90
+ omitKeys: ["defaultAccount"],
89
91
  hasImplicitDefaultAccount: (cfg) => {
90
92
  const channel = cfg.channels?.["nextcloud-talk"];
91
93
  return Boolean(channel?.baseUrl?.trim() && (hasConfiguredAccountValue(channel.botSecret) || channel.botSecretFile?.trim() || process.env.NEXTCLOUD_TALK_BOT_SECRET?.trim()));
@@ -96,15 +98,6 @@ function listNextcloudTalkAccountIds(cfg) {
96
98
  debugAccounts("listNextcloudTalkAccountIds", ids);
97
99
  return ids;
98
100
  }
99
- function mergeNextcloudTalkAccountConfig(cfg, accountId) {
100
- return resolveMergedAccountConfig({
101
- channelConfig: cfg.channels?.["nextcloud-talk"],
102
- accounts: cfg.channels?.["nextcloud-talk"]?.accounts,
103
- accountId,
104
- omitKeys: ["defaultAccount"],
105
- normalizeAccountId
106
- });
107
- }
108
101
  function resolveNextcloudTalkSecret(cfg, opts) {
109
102
  const resolvedAccountId = opts.accountId ?? resolveDefaultNextcloudTalkAccountId(cfg);
110
103
  const merged = mergeNextcloudTalkAccountConfig(cfg, resolvedAccountId);
@@ -706,33 +699,14 @@ function looksLikeNextcloudTalkTargetId(raw) {
706
699
  const NEXTCLOUD_TALK_ERROR_SNIPPET_MAX_BYTES = 8 * 1024;
707
700
  const NEXTCLOUD_TALK_ERROR_SNIPPET_MAX_CHARS = 200;
708
701
  const NEXTCLOUD_TALK_SEND_TIMEOUT_MS = 3e4;
709
- const NEXTCLOUD_TALK_FORMAT_PROFILE = {
702
+ const NEXTCLOUD_TALK_FORMAT_PROFILE = FormatCapabilityProfile.define({
710
703
  mechanism: "markdown",
711
- constructs: {
712
- bold: "native",
713
- italic: "native",
714
- underline: "native",
715
- strikethrough: "native",
716
- spoiler: "native",
717
- codeInline: "native",
718
- codeBlock: "native",
719
- codeLanguage: "native",
720
- linkLabel: "native",
721
- heading: "native",
722
- bulletList: "native",
723
- orderedList: "native",
724
- taskList: "native",
725
- table: "native",
726
- blockquote: "native",
727
- image: "native",
728
- mention: "native"
729
- },
730
704
  chunk: {
731
705
  limit: 4e3,
732
706
  unit: "chars",
733
707
  hardCap: 32e3
734
708
  }
735
- };
709
+ });
736
710
  function renderNextcloudTalkMarkdown(markdown) {
737
711
  return renderMarkdownWithMarkers({
738
712
  text: markdown,
@@ -1892,9 +1866,6 @@ const channel$1 = "nextcloud-talk";
1892
1866
  function readOptionalString(value) {
1893
1867
  return typeof value === "string" && value.length > 0 ? value : void 0;
1894
1868
  }
1895
- function addWildcardAllowFrom(allowFrom) {
1896
- return mergeAllowFromEntries(allowFrom, ["*"]);
1897
- }
1898
1869
  function normalizeNextcloudTalkBaseUrl(value) {
1899
1870
  return value?.trim().replace(/\/+$/, "") ?? "";
1900
1871
  }
@@ -1902,46 +1873,15 @@ function validateNextcloudTalkBaseUrl(value) {
1902
1873
  if (!value) return "Required";
1903
1874
  if (!value.startsWith("http://") && !value.startsWith("https://")) return "URL must start with http:// or https://";
1904
1875
  }
1905
- function setNextcloudTalkAccountConfig(cfg, accountId, updates) {
1876
+ function setNextcloudTalkAccountConfig(cfg, accountId, updates, clearFields) {
1906
1877
  return patchScopedAccountConfig({
1907
1878
  cfg,
1908
1879
  channelKey: channel$1,
1909
1880
  accountId,
1910
- patch: updates
1881
+ patch: updates,
1882
+ ...clearFields ? { clearFields } : {}
1911
1883
  });
1912
1884
  }
1913
- function clearNextcloudTalkAccountFields(cfg, accountId, fields) {
1914
- const section = cfg.channels?.["nextcloud-talk"];
1915
- if (!section) return cfg;
1916
- if (accountId === DEFAULT_ACCOUNT_ID$1) {
1917
- const nextSection = { ...section };
1918
- for (const field of fields) delete nextSection[field];
1919
- return {
1920
- ...cfg,
1921
- channels: {
1922
- ...cfg.channels,
1923
- "nextcloud-talk": nextSection
1924
- }
1925
- };
1926
- }
1927
- const currentAccount = section.accounts?.[accountId];
1928
- if (!currentAccount) return cfg;
1929
- const nextAccount = { ...currentAccount };
1930
- for (const field of fields) delete nextAccount[field];
1931
- return {
1932
- ...cfg,
1933
- channels: {
1934
- ...cfg.channels,
1935
- "nextcloud-talk": {
1936
- ...section,
1937
- accounts: {
1938
- ...section.accounts,
1939
- [accountId]: nextAccount
1940
- }
1941
- }
1942
- }
1943
- };
1944
- }
1945
1885
  async function promptNextcloudTalkAllowFrom(params) {
1946
1886
  return await promptParsedAllowFromForAccount({
1947
1887
  cfg: params.cfg,
@@ -1980,35 +1920,16 @@ async function promptNextcloudTalkAllowFromForAccount(params) {
1980
1920
  accountId
1981
1921
  });
1982
1922
  }
1983
- const nextcloudTalkDmPolicy = {
1923
+ const nextcloudTalkDmPolicy = createChannelDmPolicy({
1984
1924
  label: "Nextcloud Talk",
1985
1925
  channel: channel$1,
1986
- policyKey: "channels.nextcloud-talk.dmPolicy",
1987
- allowFromKey: "channels.nextcloud-talk.allowFrom",
1988
- resolveConfigKeys: (cfg, accountId) => (accountId ?? resolveDefaultNextcloudTalkAccountId(cfg)) !== DEFAULT_ACCOUNT_ID$1 ? {
1989
- policyKey: `channels.nextcloud-talk.accounts.${accountId ?? resolveDefaultNextcloudTalkAccountId(cfg)}.dmPolicy`,
1990
- allowFromKey: `channels.nextcloud-talk.accounts.${accountId ?? resolveDefaultNextcloudTalkAccountId(cfg)}.allowFrom`
1991
- } : {
1992
- policyKey: "channels.nextcloud-talk.dmPolicy",
1993
- allowFromKey: "channels.nextcloud-talk.allowFrom"
1994
- },
1995
- getCurrent: (cfg, accountId) => resolveNextcloudTalkAccount({
1926
+ resolveAccount: (cfg, accountId) => resolveNextcloudTalkAccount({
1996
1927
  cfg,
1997
1928
  accountId: accountId ?? resolveDefaultNextcloudTalkAccountId(cfg)
1998
- }).config.dmPolicy ?? "pairing",
1999
- setPolicy: (cfg, policy, accountId) => {
2000
- const resolvedAccountId = accountId ?? resolveDefaultNextcloudTalkAccountId(cfg);
2001
- const resolved = resolveNextcloudTalkAccount({
2002
- cfg,
2003
- accountId: resolvedAccountId
2004
- });
2005
- return setNextcloudTalkAccountConfig(cfg, resolvedAccountId, {
2006
- dmPolicy: policy,
2007
- ...policy === "open" ? { allowFrom: addWildcardAllowFrom(resolved.config.allowFrom) } : {}
2008
- });
2009
- },
1929
+ }),
1930
+ applyPatch: ({ cfg, account, patch }) => setNextcloudTalkAccountConfig(cfg, account.accountId, patch),
2010
1931
  promptAllowFrom: promptNextcloudTalkAllowFromForAccount
2011
- };
1932
+ });
2012
1933
  const nextcloudTalkSetupAdapter = {
2013
1934
  singleAccountKeysToMove: ["rooms"],
2014
1935
  resolveAccountId: ({ accountId }) => normalizeAccountId$1(accountId),
@@ -2038,16 +1959,15 @@ const nextcloudTalkSetupAdapter = {
2038
1959
  }),
2039
1960
  applyAccountConfig: ({ cfg, accountId, input }) => {
2040
1961
  const setupInput = input;
2041
- const namedConfig = applyAccountNameToChannelSection({
1962
+ return setNextcloudTalkAccountConfig(applyAccountNameToChannelSection({
2042
1963
  cfg,
2043
1964
  channelKey: channel$1,
2044
1965
  accountId,
2045
1966
  name: setupInput.name
2046
- });
2047
- return setNextcloudTalkAccountConfig(setupInput.useEnv ? clearNextcloudTalkAccountFields(namedConfig, accountId, ["botSecret", "botSecretFile"]) : namedConfig, accountId, {
1967
+ }), accountId, {
2048
1968
  baseUrl: normalizeNextcloudTalkBaseUrl(setupInput.baseUrl),
2049
1969
  ...setupInput.useEnv ? {} : setupInput.secretFile ? { botSecretFile: setupInput.secretFile } : setupInput.secret ? { botSecret: setupInput.secret } : {}
2050
- });
1970
+ }, setupInput.useEnv ? ["botSecret", "botSecretFile"] : void 0);
2051
1971
  }
2052
1972
  };
2053
1973
  const nextcloudTalkSetupContract = defineChannelSetupContract({
@@ -2192,9 +2112,7 @@ const nextcloudTalkSetupWizard = {
2192
2112
  hasConfiguredValue: (account) => Boolean(hasConfiguredSecretInput(account.config.botSecret) || account.config.botSecretFile),
2193
2113
  resolvedValue: (account) => account.secret || void 0,
2194
2114
  envValue: ({ accountId }) => accountId === DEFAULT_ACCOUNT_ID$1 ? normalizeOptionalString(process.env.NEXTCLOUD_TALK_BOT_SECRET) : void 0,
2195
- patchAccount: ({ cfg, accountId, patch, clearFields }) => {
2196
- return setNextcloudTalkAccountConfig(clearNextcloudTalkAccountFields(cfg, accountId, clearFields), accountId, patch);
2197
- },
2115
+ patchAccount: ({ cfg, accountId, patch, clearFields }) => setNextcloudTalkAccountConfig(cfg, accountId, patch, clearFields),
2198
2116
  useEnv: {
2199
2117
  clearFields: ["botSecret", "botSecretFile"],
2200
2118
  patch: (account) => ({ baseUrl: account.baseUrl })
@@ -2217,7 +2135,7 @@ const nextcloudTalkSetupWizard = {
2217
2135
  accountConfigured: (account) => Boolean(account.config.apiUser?.trim() && (hasConfiguredSecretInput(account.config.apiPassword) || account.config.apiPasswordFile)),
2218
2136
  hasConfiguredValue: (account) => Boolean(hasConfiguredSecretInput(account.config.apiPassword) || account.config.apiPasswordFile),
2219
2137
  shouldPrompt: ({ credentialValues }) => credentialValues[CONFIGURE_API_FLAG] === "1",
2220
- patchAccount: ({ cfg, accountId, patch, clearFields }) => setNextcloudTalkAccountConfig(clearNextcloudTalkAccountFields(cfg, accountId, clearFields), accountId, patch),
2138
+ patchAccount: ({ cfg, accountId, patch, clearFields }) => setNextcloudTalkAccountConfig(cfg, accountId, patch, clearFields),
2221
2139
  set: { clearFields: ["apiPassword", "apiPasswordFile"] }
2222
2140
  })],
2223
2141
  textInputs: [baseUrlTextInput({
@@ -1,2 +1,2 @@
1
- import { t as nextcloudTalkPlugin } from "./channel-DtnECxVM.js";
1
+ import { t as nextcloudTalkPlugin } from "./channel-D6MTjGj3.js";
2
2
  export { nextcloudTalkPlugin };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/nextcloud-talk",
3
- "version": "2026.7.2-beta.4",
3
+ "version": "2026.7.2-beta.5",
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.7.2-beta.4"
11
+ "openclaw": ">=2026.7.2-beta.5"
12
12
  },
13
13
  "peerDependenciesMeta": {
14
14
  "openclaw": {
@@ -124,10 +124,10 @@
124
124
  "minHostVersion": ">=2026.4.10"
125
125
  },
126
126
  "compat": {
127
- "pluginApi": ">=2026.7.2-beta.4"
127
+ "pluginApi": ">=2026.7.2-beta.5"
128
128
  },
129
129
  "build": {
130
- "openclawVersion": "2026.7.2-beta.4"
130
+ "openclawVersion": "2026.7.2-beta.5"
131
131
  },
132
132
  "release": {
133
133
  "publishToClawHub": true,
@@ -144,7 +144,6 @@
144
144
  "files": [
145
145
  "dist/**",
146
146
  "openclaw.plugin.json",
147
- "npm-shrinkwrap.json",
148
147
  "README.md"
149
148
  ],
150
149
  "bundledDependencies": [
@@ -1,32 +0,0 @@
1
- {
2
- "name": "@openclaw/nextcloud-talk",
3
- "version": "2026.7.2-beta.4",
4
- "lockfileVersion": 3,
5
- "requires": true,
6
- "packages": {
7
- "": {
8
- "name": "@openclaw/nextcloud-talk",
9
- "version": "2026.7.2-beta.4",
10
- "dependencies": {
11
- "zod": "4.4.3"
12
- },
13
- "peerDependencies": {
14
- "openclaw": ">=2026.7.2-beta.4"
15
- },
16
- "peerDependenciesMeta": {
17
- "openclaw": {
18
- "optional": true
19
- }
20
- }
21
- },
22
- "node_modules/zod": {
23
- "version": "4.4.3",
24
- "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz",
25
- "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
26
- "license": "MIT",
27
- "funding": {
28
- "url": "https://github.com/sponsors/colinhacks"
29
- }
30
- }
31
- }
32
- }