@openclaw/nextcloud-talk 2026.9.6 → 2026.9.8

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,213 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __exportAll = (all, no_symbols) => {
7
+ let target = {};
8
+ for (var name in all) __defProp(target, name, {
9
+ get: all[name],
10
+ enumerable: true
11
+ });
12
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
13
+ return target;
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
17
+ key = keys[i];
18
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
19
+ get: ((k) => from[k]).bind(null, key),
20
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
21
+ });
22
+ }
23
+ return to;
24
+ };
25
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
26
+ //#endregion
27
+ //#region packages/normalization-core/src/record-coerce.ts
28
+ /** Type guard for non-array object records at browser-safe boundaries. */
29
+ function isRecord(value) {
30
+ return value !== null && typeof value === "object" && !Array.isArray(value);
31
+ }
32
+ /** Returns a non-array record or null. */
33
+ function asNullableRecord(value) {
34
+ return isRecord(value) ? value : null;
35
+ }
36
+ //#endregion
37
+ //#region src/config/channel-config-normalization.ts
38
+ /** Applies one channel-specific doctor migration to every object-shaped account. */
39
+ function normalizeChannelAccounts(params) {
40
+ const rawAccounts = asNullableRecord(params.entry.accounts);
41
+ if (!rawAccounts) return {
42
+ entry: params.entry,
43
+ changed: false
44
+ };
45
+ let changed = false;
46
+ const accounts = { ...rawAccounts };
47
+ for (const [accountId, value] of Object.entries(rawAccounts)) {
48
+ const account = asNullableRecord(value);
49
+ if (!account) continue;
50
+ const normalized = params.normalizeAccount({
51
+ account,
52
+ accountId,
53
+ pathPrefix: `${params.pathPrefix}.accounts.${accountId}`,
54
+ changes: params.changes
55
+ });
56
+ if (normalized.changed) {
57
+ accounts[accountId] = normalized.entry;
58
+ changed = true;
59
+ }
60
+ }
61
+ return changed ? {
62
+ entry: {
63
+ ...params.entry,
64
+ accounts
65
+ },
66
+ changed: true
67
+ } : {
68
+ entry: params.entry,
69
+ changed: false
70
+ };
71
+ }
72
+ /** Applies the same channel-specific doctor migration at root and account scope. */
73
+ function normalizeChannelConfigEntries(params) {
74
+ const changes = params.changes ?? [];
75
+ const channels = params.cfg.channels;
76
+ const entry = asNullableRecord(channels?.[params.channelId]);
77
+ if (!entry) return {
78
+ config: params.cfg,
79
+ changes
80
+ };
81
+ const channelPath = `channels.${params.channelId}`;
82
+ const root = params.normalizeEntry({
83
+ entry,
84
+ pathPrefix: channelPath,
85
+ changes
86
+ });
87
+ const accounts = normalizeChannelAccounts({
88
+ entry: root.entry,
89
+ pathPrefix: channelPath,
90
+ changes,
91
+ normalizeAccount: (accountParams) => params.normalizeEntry({
92
+ entry: accountParams.account,
93
+ accountId: accountParams.accountId,
94
+ pathPrefix: accountParams.pathPrefix,
95
+ changes: accountParams.changes
96
+ })
97
+ });
98
+ if (!root.changed && !accounts.changed) return {
99
+ config: params.cfg,
100
+ changes
101
+ };
102
+ return {
103
+ config: {
104
+ ...params.cfg,
105
+ channels: {
106
+ ...channels,
107
+ [params.channelId]: accounts.entry
108
+ }
109
+ },
110
+ changes
111
+ };
112
+ }
113
+ //#endregion
114
+ //#region src/plugin-sdk/legacy-webhook-listener-migration.ts
115
+ /** Preserve explicitly configured webhook listeners while moving ingress onto Gateway routes. */
116
+ function createLegacyWebhookListenerDoctorContract(params) {
117
+ const portKey = params.portKey ?? "webhookPort";
118
+ const hostKey = params.hostKey === void 0 ? "webhookHost" : params.hostKey;
119
+ const source = (entry) => params.webhookKey ? asNullableRecord(entry[params.webhookKey]) : entry;
120
+ const hasLegacy = (value) => {
121
+ const entry = asNullableRecord(value);
122
+ const listener = entry && source(entry);
123
+ return Boolean(listener && (Object.hasOwn(listener, portKey) || hostKey && Object.hasOwn(listener, hostKey)));
124
+ };
125
+ const prefix = `channels.${params.channelKey}`;
126
+ return {
127
+ legacyConfigRules: [{
128
+ path: ["channels", params.channelKey],
129
+ message: `${prefix} webhook listeners moved to Gateway routes. Run "openclaw doctor --fix" to preserve explicitly configured listener settings as legacyWebhook.`,
130
+ match: (value) => {
131
+ const accounts = asNullableRecord(asNullableRecord(value)?.accounts);
132
+ return hasLegacy(value) || Object.values(accounts ?? {}).some(hasLegacy);
133
+ }
134
+ }],
135
+ normalizeCompatibilityConfig: ({ cfg }) => {
136
+ const root = asNullableRecord(asNullableRecord(cfg.channels)?.[params.channelKey]);
137
+ const inherited = root && source(root);
138
+ const canonicalRoot = asNullableRecord(root?.legacyWebhook);
139
+ return normalizeChannelConfigEntries({
140
+ cfg,
141
+ channelId: params.channelKey,
142
+ normalizeEntry: ({ entry, accountId, pathPrefix, changes }) => {
143
+ const listener = source(entry);
144
+ if (!listener || !hasLegacy(entry)) return {
145
+ entry,
146
+ changed: false
147
+ };
148
+ const next = { ...entry };
149
+ const port = Object.hasOwn(listener, portKey) ? listener[portKey] : (accountId ? canonicalRoot?.port ?? inherited?.[portKey] : void 0) ?? params.defaultPort;
150
+ const inheritedHost = accountId ? canonicalRoot ? canonicalRoot.host : (hostKey ? inherited?.[hostKey] : void 0) ?? params.defaultHost : params.defaultHost;
151
+ const host = hostKey ? listener[hostKey] ?? inheritedHost : inheritedHost;
152
+ const legacyPath = [pathPrefix, params.webhookKey].filter(Boolean).join(".");
153
+ if (Object.hasOwn(entry, "legacyWebhook")) changes.push(`Removed ${legacyPath} legacy listener keys; ${pathPrefix}.legacyWebhook is already configured.`);
154
+ else if (accountId && root?.legacyWebhook === false) changes.push(`Removed ${legacyPath} legacy listener keys; ${prefix}.legacyWebhook: false keeps this account's inherited listener disabled.`);
155
+ else {
156
+ next.legacyWebhook = {
157
+ port,
158
+ ...host !== void 0 ? { host } : {}
159
+ };
160
+ changes.push(`Moved ${legacyPath} listener settings to ${pathPrefix}.legacyWebhook. Point the external callback or reverse proxy at the Gateway port and webhook path, verify delivery, then set legacyWebhook: false to disable legacy forwarding.`);
161
+ }
162
+ const updated = params.webhookKey ? { ...listener } : next;
163
+ delete updated[portKey];
164
+ if (hostKey) delete updated[hostKey];
165
+ if (params.webhookKey) {
166
+ if (Object.keys(updated).length) next[params.webhookKey] = updated;
167
+ else delete next[params.webhookKey];
168
+ }
169
+ return {
170
+ entry: next,
171
+ changed: true
172
+ };
173
+ }
174
+ });
175
+ }
176
+ };
177
+ }
178
+ //#endregion
179
+ //#region \0openclaw:bundled-sdk:openclaw/plugin-sdk/runtime-doctor-migrations
180
+ var runtime_doctor_migrations_exports = /* @__PURE__ */ __exportAll({ createLegacyWebhookListenerDoctorContract: () => createLegacyWebhookListenerDoctorContract });
181
+ import * as import_openclaw_plugin_sdk_runtime_doctor_migrations from "openclaw/plugin-sdk/runtime-doctor-migrations";
182
+ __reExport(runtime_doctor_migrations_exports, import_openclaw_plugin_sdk_runtime_doctor_migrations);
183
+ //#endregion
184
+ //#region extensions/nextcloud-talk/src/doctor-contract.ts
185
+ const webhookContract = createLegacyWebhookListenerDoctorContract({
186
+ channelKey: "nextcloud-talk",
187
+ defaultHost: "0.0.0.0",
188
+ defaultPort: 8788
189
+ });
190
+ const networkContract = (0, runtime_doctor_migrations_exports.createLegacyPrivateNetworkDoctorContract)({ channelKey: "nextcloud-talk" });
191
+ const streamingAliasMigration = (0, runtime_doctor_migrations_exports.defineChannelAliasMigration)({
192
+ channelId: "nextcloud-talk",
193
+ streaming: {
194
+ defaultMode: "partial",
195
+ deliveryOnly: true
196
+ },
197
+ accountStreamingReplacesRoot: true
198
+ });
199
+ const legacyConfigRules = [
200
+ ...webhookContract.legacyConfigRules,
201
+ ...networkContract.legacyConfigRules,
202
+ ...streamingAliasMigration.legacyConfigRules
203
+ ];
204
+ function normalizeCompatibilityConfig({ cfg }) {
205
+ 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
+ });
211
+ }
212
+ //#endregion
213
+ export { __reExport as i, normalizeCompatibilityConfig as n, __exportAll as r, legacyConfigRules as t };
package/dist/api.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as nextcloudTalkPlugin } from "./.setup/channel-B_MT8EAm.mjs";
1
+ import { t as nextcloudTalkPlugin } from "./.setup/channel-CeJpOTiY.mjs";
2
2
  export { nextcloudTalkPlugin };
@@ -1,2 +1,2 @@
1
- import { t as nextcloudTalkPlugin } from "./.setup/channel-B_MT8EAm.mjs";
1
+ import { t as nextcloudTalkPlugin } from "./.setup/channel-CeJpOTiY.mjs";
2
2
  export { nextcloudTalkPlugin };
@@ -1,2 +1,2 @@
1
- import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./.setup/doctor-contract-Bda_xc6V.mjs";
1
+ import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./.setup/doctor-contract-BVJcDIeU.mjs";
2
2
  export { legacyConfigRules, normalizeCompatibilityConfig };
@@ -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-CLvR4rnO.mjs", import.meta.url).href),
7
+ specifier: fileURLToPath(new URL(".setup/api-hlcmleZc.mjs", import.meta.url).href),
8
8
  exportName: "nextcloudTalkPlugin"
9
9
  },
10
10
  secrets: {
@@ -293,13 +293,30 @@
293
293
  "disabled"
294
294
  ]
295
295
  },
296
- "webhookPort": {
297
- "type": "integer",
298
- "exclusiveMinimum": 0,
299
- "maximum": 9007199254740991
300
- },
301
- "webhookHost": {
302
- "type": "string"
296
+ "legacyWebhook": {
297
+ "anyOf": [
298
+ {
299
+ "type": "boolean",
300
+ "const": false
301
+ },
302
+ {
303
+ "type": "object",
304
+ "properties": {
305
+ "port": {
306
+ "type": "integer",
307
+ "minimum": 1,
308
+ "maximum": 65535
309
+ },
310
+ "host": {
311
+ "type": "string"
312
+ }
313
+ },
314
+ "required": [
315
+ "port"
316
+ ],
317
+ "additionalProperties": false
318
+ }
319
+ ]
303
320
  },
304
321
  "webhookPath": {
305
322
  "type": "string"
@@ -760,13 +777,30 @@
760
777
  "disabled"
761
778
  ]
762
779
  },
763
- "webhookPort": {
764
- "type": "integer",
765
- "exclusiveMinimum": 0,
766
- "maximum": 9007199254740991
767
- },
768
- "webhookHost": {
769
- "type": "string"
780
+ "legacyWebhook": {
781
+ "anyOf": [
782
+ {
783
+ "type": "boolean",
784
+ "const": false
785
+ },
786
+ {
787
+ "type": "object",
788
+ "properties": {
789
+ "port": {
790
+ "type": "integer",
791
+ "minimum": 1,
792
+ "maximum": 65535
793
+ },
794
+ "host": {
795
+ "type": "string"
796
+ }
797
+ },
798
+ "required": [
799
+ "port"
800
+ ],
801
+ "additionalProperties": false
802
+ }
803
+ ]
770
804
  },
771
805
  "webhookPath": {
772
806
  "type": "string"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/nextcloud-talk",
3
- "version": "2026.9.6",
3
+ "version": "2026.9.8",
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.6"
11
+ "openclaw": ">=2026.9.8"
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.6"
133
+ "pluginApi": ">=2026.9.8"
134
134
  },
135
135
  "build": {
136
- "openclawVersion": "2026.9.6"
136
+ "openclawVersion": "2026.9.8"
137
137
  },
138
138
  "release": {
139
139
  "publishToClawHub": true,
@@ -1,3 +0,0 @@
1
- import { t as nextcloudTalkPlugin } from "./channel-B_MT8EAm.mjs";
2
- import "../api.js";
3
- export { nextcloudTalkPlugin };
@@ -1,21 +0,0 @@
1
- import { createLegacyPrivateNetworkDoctorContract, defineChannelAliasMigration } from "openclaw/plugin-sdk/runtime-doctor-migrations";
2
- //#region extensions/nextcloud-talk/src/doctor-contract.ts
3
- const networkContract = createLegacyPrivateNetworkDoctorContract({ channelKey: "nextcloud-talk" });
4
- const streamingAliasMigration = defineChannelAliasMigration({
5
- channelId: "nextcloud-talk",
6
- streaming: {
7
- defaultMode: "partial",
8
- deliveryOnly: true
9
- },
10
- accountStreamingReplacesRoot: true
11
- });
12
- const legacyConfigRules = [...networkContract.legacyConfigRules, ...streamingAliasMigration.legacyConfigRules];
13
- function normalizeCompatibilityConfig({ cfg }) {
14
- const network = networkContract.normalizeCompatibilityConfig({ cfg });
15
- return streamingAliasMigration.normalizeChannelConfig({
16
- cfg: network.config,
17
- changes: network.changes
18
- });
19
- }
20
- //#endregion
21
- export { normalizeCompatibilityConfig as n, legacyConfigRules as t };