diff --git a/CHANGELOG.md b/CHANGELOG.md index 278938c7a3f..6f4081dd787 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,10 @@ Docs: https://docs.openclaw.ai - Windows/exec: settle supervisor waits from child exit state after stdout and stderr drain even when `close` never arrives, so CLI commands stop hanging or dying with forced `SIGKILL` on Windows. (#64072) Thanks @obviyus. - Browser/sandbox: prevent sandbox browser CDP startup hangs by recreating containers when the browser security hash changes and by waiting on the correct sandbox browser lifecycle. (#62873) Thanks @Syysean. - iMessage/self-chat: distinguish normal DM outbound rows from true self-chat using `destination_caller_id` plus chat participants, while preserving multi-handle self-chat aliases so outbound DM replies stop looping back as inbound messages. (#61619) Thanks @neeravmakwana. +- QQBot/streaming: make block streaming configurable per QQ bot account via `streaming.mode` (`"partial"` | `"off"`, default `"partial"`) instead of hardcoding it off, so responses can be delivered incrementally. (#63746) +- QQBot/config: allow extra fields in `channels.qqbot` and `channels.qqbot.accounts.*` so extended qqbot builds can add new config options without gateway startup failing on schema validation. (#64075) Thanks @WideLee. +- Dreaming/gateway: require `operator.admin` for persistent `/dreaming on|off` changes and treat missing gateway client scopes as unprivileged instead of silently allowing config writes. (#63872) Thanks @mbelinky. +- Matrix/multi-account: keep room-level `account` scoping, inherited room overrides, and implicit account selection consistent across top-level default auth, named accounts, and cached-credential env setups. (#58449) thanks @Daanvdplas and @gumadeiras. - Gateway/pairing: prefer explicit QR bootstrap auth over earlier Tailscale auth classification so iOS `/pair qr` silent bootstrap pairing does not fall through to `pairing required`. (#59232) Thanks @ngutman. - Browser/control: auto-generate browser-control auth tokens for `none` and `trusted-proxy` modes, and route browser auth/profile/doctor helpers through the public browser plugin facades. (#63280, #63957) Thanks @pgondhi987. - Browser/act: centralize `/act` request normalization and execution dispatch while adding stable machine-readable route-level error codes for invalid requests, selector misuse, evaluate-disabled gating, target mismatch, and existing-session unsupported actions. (#63977) Thanks @joshavant. diff --git a/extensions/qqbot/openclaw.plugin.json b/extensions/qqbot/openclaw.plugin.json index 6a2487b8b9d..cfb5ff1be49 100644 --- a/extensions/qqbot/openclaw.plugin.json +++ b/extensions/qqbot/openclaw.plugin.json @@ -7,7 +7,7 @@ "skills": ["./skills"], "configSchema": { "type": "object", - "additionalProperties": false, + "additionalProperties": true, "$defs": { "audioFormatPolicy": { "type": "object", @@ -77,7 +77,7 @@ }, "account": { "type": "object", - "additionalProperties": false, + "additionalProperties": true, "properties": { "enabled": { "type": "boolean" }, "name": { "type": "string" }, @@ -102,15 +102,22 @@ "enum": ["doc", "hot-reload"] }, "streaming": { - "type": "object", - "additionalProperties": false, - "properties": { - "mode": { - "type": "string", - "enum": ["off", "partial"], - "default": "partial" + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "mode": { + "type": "string", + "enum": ["off", "partial"], + "default": "partial" + } + } } - } + ] } } } @@ -141,15 +148,22 @@ "enum": ["doc", "hot-reload"] }, "streaming": { - "type": "object", - "additionalProperties": false, - "properties": { - "mode": { - "type": "string", - "enum": ["off", "partial"], - "default": "partial" + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "type": "string", + "enum": ["off", "partial"], + "default": "partial" + } + } } - } + ] }, "accounts": { "type": "object", diff --git a/extensions/qqbot/src/config-schema.ts b/extensions/qqbot/src/config-schema.ts index 2459de50b2f..56610e576ec 100644 --- a/extensions/qqbot/src/config-schema.ts +++ b/extensions/qqbot/src/config-schema.ts @@ -42,11 +42,15 @@ const QQBotSttSchema = z .optional(); const QQBotStreamingSchema = z - .object({ - /** "partial" (default) enables block streaming; "off" disables it. */ - mode: z.enum(["off", "partial"]).default("partial"), - }) - .strict() + .union([ + z.boolean(), + z + .object({ + /** "partial" (default) enables block streaming; "off" disables it. */ + mode: z.enum(["off", "partial"]).default("partial"), + }) + .passthrough(), + ]) .optional(); const QQBotAccountSchema = z @@ -66,12 +70,12 @@ const QQBotAccountSchema = z upgradeMode: z.enum(["doc", "hot-reload"]).optional(), streaming: QQBotStreamingSchema, }) - .strict(); + .passthrough(); export const QQBotConfigSchema = QQBotAccountSchema.extend({ tts: QQBotTtsSchema, stt: QQBotSttSchema, - accounts: z.object({}).catchall(QQBotAccountSchema).optional(), + accounts: z.object({}).catchall(QQBotAccountSchema.passthrough()).optional(), defaultAccount: z.string().optional(), -}); +}).passthrough(); export const qqbotChannelConfigSchema = buildChannelConfigSchema(QQBotConfigSchema); diff --git a/src/config/bundled-channel-config-metadata.generated.ts b/src/config/bundled-channel-config-metadata.generated.ts index 4acc41eb625..9af3dc4445e 100644 --- a/src/config/bundled-channel-config-metadata.generated.ts +++ b/src/config/bundled-channel-config-metadata.generated.ts @@ -9324,16 +9324,23 @@ export const GENERATED_BUNDLED_CHANNEL_CONFIG_METADATA = [ enum: ["doc", "hot-reload"], }, streaming: { - type: "object", - properties: { - mode: { - default: "partial", - type: "string", - enum: ["off", "partial"], + anyOf: [ + { + type: "boolean", }, - }, - required: ["mode"], - additionalProperties: false, + { + type: "object", + properties: { + mode: { + default: "partial", + type: "string", + enum: ["off", "partial"], + }, + }, + required: ["mode"], + additionalProperties: {}, + }, + ], }, tts: { type: "object", @@ -9537,26 +9544,33 @@ export const GENERATED_BUNDLED_CHANNEL_CONFIG_METADATA = [ enum: ["doc", "hot-reload"], }, streaming: { - type: "object", - properties: { - mode: { - default: "partial", - type: "string", - enum: ["off", "partial"], + anyOf: [ + { + type: "boolean", }, - }, - required: ["mode"], - additionalProperties: false, + { + type: "object", + properties: { + mode: { + default: "partial", + type: "string", + enum: ["off", "partial"], + }, + }, + required: ["mode"], + additionalProperties: {}, + }, + ], }, }, - additionalProperties: false, + additionalProperties: {}, }, }, defaultAccount: { type: "string", }, }, - additionalProperties: false, + additionalProperties: {}, }, }, {