Files
openclaw/extensions/qqbot/openclaw.plugin.json
cxy 4013c65853 fix(qqbot): enable qqbot plugin by default so runtime deps install be… (#71051)
* fix(qqbot): enable qqbot plugin by default so runtime deps install before QR-code setup

The qqbot plugin manifest was missing the enabledByDefault: true flag.
Without it, ensureBundledPluginRuntimeDeps treats qqbot as bundled-but-
disabled-by-default (isBundledPluginConfiguredForRuntimeDeps returns
false when no qqbot channel/account is configured yet), so
@tencent-connect/qqbot-connector is never installed into
dist/extensions/qqbot/node_modules on first launch.

This creates a chicken-and-egg failure for the QR-code binding flow:
finalize.ts dynamically imports @tencent-connect/qqbot-connector to run
qrConnect(), but the package isn't present yet because no account is
configured — binding is exactly the step that configures the first
account. Users hit:

  QQ Bot 绑定失败: Error [ERR_MODULE_NOT_FOUND]: Cannot find package
  '@tencent-connect/qqbot-connector' imported from
  .../dist/extensions/qqbot/channel-*.js

Adding enabledByDefault: true makes the host install qqbot's runtime
deps eagerly on first launch, mirroring the pattern already used by
mistral / groq / deepgram / amazon-bedrock-mantle and other bundled
plugins whose providers must be available before any channel config
exists. No code changes required; the existing runtime-deps install
pipeline handles everything once the gate is opened.

* fix(qqbot): changelog for enable-by-default fix (#71051) (thanks @cxyhhhhh)

---------

Co-authored-by: sliverp <870080352@qq.com>
2026-04-24 17:58:14 +08:00

154 lines
4.3 KiB
JSON

{
"id": "qqbot",
"channels": ["qqbot"],
"channelEnvVars": {
"qqbot": ["QQBOT_APP_ID", "QQBOT_CLIENT_SECRET"]
},
"enabledByDefault": true,
"skills": ["./skills"],
"configSchema": {
"type": "object",
"additionalProperties": true,
"$defs": {
"audioFormatPolicy": {
"type": "object",
"additionalProperties": false,
"properties": {
"sttDirectFormats": {
"type": "array",
"items": { "type": "string" }
},
"uploadDirectFormats": {
"type": "array",
"items": { "type": "string" }
},
"transcodeEnabled": { "type": "boolean" }
}
},
"stt": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"provider": { "type": "string" },
"baseUrl": { "type": "string" },
"apiKey": { "type": "string" },
"model": { "type": "string" }
}
},
"secretRef": {
"type": "object",
"additionalProperties": false,
"properties": {
"source": {
"type": "string",
"enum": ["env", "file", "exec"]
},
"provider": { "type": "string" },
"id": { "type": "string" }
},
"required": ["source", "provider", "id"]
},
"secretInput": {
"anyOf": [{ "type": "string", "minLength": 1 }, { "$ref": "#/$defs/secretRef" }]
},
"account": {
"type": "object",
"additionalProperties": true,
"properties": {
"enabled": { "type": "boolean" },
"name": { "type": "string" },
"appId": { "type": "string" },
"clientSecret": { "$ref": "#/$defs/secretInput" },
"clientSecretFile": { "type": "string" },
"allowFrom": {
"type": "array",
"items": { "type": "string" }
},
"systemPrompt": { "type": "string" },
"markdownSupport": { "type": "boolean" },
"voiceDirectUploadFormats": {
"type": "array",
"items": { "type": "string" }
},
"audioFormatPolicy": { "$ref": "#/$defs/audioFormatPolicy" },
"urlDirectUpload": { "type": "boolean" },
"upgradeUrl": { "type": "string" },
"upgradeMode": {
"type": "string",
"enum": ["doc", "hot-reload"]
},
"streaming": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "object",
"additionalProperties": true,
"properties": {
"mode": {
"type": "string",
"enum": ["off", "partial"],
"default": "partial"
}
}
}
]
}
}
}
},
"properties": {
"enabled": { "type": "boolean" },
"name": { "type": "string" },
"appId": { "type": "string" },
"clientSecret": { "$ref": "#/$defs/secretInput" },
"clientSecretFile": { "type": "string" },
"allowFrom": {
"type": "array",
"items": { "type": "string" }
},
"systemPrompt": { "type": "string" },
"markdownSupport": { "type": "boolean" },
"voiceDirectUploadFormats": {
"type": "array",
"items": { "type": "string" }
},
"audioFormatPolicy": { "$ref": "#/$defs/audioFormatPolicy" },
"stt": { "$ref": "#/$defs/stt" },
"urlDirectUpload": { "type": "boolean" },
"upgradeUrl": { "type": "string" },
"upgradeMode": {
"type": "string",
"enum": ["doc", "hot-reload"]
},
"streaming": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"mode": {
"type": "string",
"enum": ["off", "partial"],
"default": "partial"
}
}
}
]
},
"accounts": {
"type": "object",
"additionalProperties": {
"$ref": "#/$defs/account"
}
},
"defaultAccount": { "type": "string" }
}
}
}