refactor(qqbot): install plugin from Tencent package (#107295)

* refactor(qqbot): remove bundled extension source

Mechanical deletion half of the #107295 squashed rebase; the catalog
repoint and host integration land in the follow-up commit.

Co-authored-by: sliverp <870080352@qq.com>

* refactor(qqbot): install plugin from Tencent package

Squashed rebase of #107295 onto current main. Repoints the official
external channel catalog at @tencent-connect/openclaw-qqbot@2.0.1 and
adapts onboarding, doctor migrations, secrets, build guards, and tests.

Documents the known limitation that the external package does not
support structured SecretRef clientSecret values; operators move those
to QQBOT_CLIENT_SECRET or clientSecretFile before upgrading.

Co-authored-by: sliverp <870080352@qq.com>

* fix(doctor): reuse shared hasOwnKey record helper

The rebased QQBot migration carried its own hasOwnKey export, colliding
with the one main now ships in legacy-config-record-shared.ts.

Co-authored-by: sliverp <870080352@qq.com>

* fix(plugins): carry catalog integrity through the update bridge

The externalized-bundled-plugin bridge dropped the official catalog's
expectedIntegrity pin, so bundled-user updates installed the external
npm package without integrity verification. The bridge now carries the
pin for the catalog's exact npm spec and both bridge install calls pass
it through; update-channel spec overrides intentionally skip the pin
since it only covers the pinned version.

Co-authored-by: sliverp <870080352@qq.com>

* chore(plugin-sdk): refresh per-entrypoint API baselines

The QQBot compat export and bundled-type removal shift 26 entrypoint
closure hashes in the new split baseline layout.

Co-authored-by: sliverp <870080352@qq.com>

* refactor(qqbot): drop helper reintroduced during rebase

Main's coercion consolidation added this file after the deletion
commit's base; its only consumers were the removed qqbot sources.

Co-authored-by: sliverp <870080352@qq.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
This commit is contained in:
Sliverp
2026-08-12 06:10:27 +08:00
committed by GitHub
parent d035dba6c7
commit 84c7d45f15
379 changed files with 2996 additions and 47557 deletions
@@ -1676,73 +1676,157 @@
}
},
{
"name": "@openclaw/qqbot",
"version": "2026.8.1",
"description": "OpenClaw QQ Bot channel plugin for group and direct-message workflows.",
"source": "official",
"name": "@tencent-connect/openclaw-qqbot",
"description": "OpenClaw QQ Bot channel plugin by the Tencent Connect team.",
"source": "external",
"kind": "channel",
"openclaw": {
"plugin": {
"id": "openclaw-qqbot",
"label": "QQ Bot"
},
"contracts": {
"tools": [
"qqbot_channel_api",
"qqbot_platform_api",
"qqbot_remind"
]
},
"channel": {
"id": "qqbot",
"configuredState": {
"env": {
"anyOf": [
"QQBOT_APP_ID",
"QQBOT_CLIENT_SECRET"
]
}
},
"approvalFlags": [
"native"
],
"label": "QQ Bot",
"selectionLabel": "QQ Bot (Official API)",
"detailLabel": "QQ Bot",
"docsPath": "/channels/qqbot",
"docsLabel": "qqbot",
"blurb": "connect to QQ via official QQ Bot API with group chat and direct message support.",
"systemImage": "bubble.left.and.bubble.right",
"setup": {
"fields": [
{
"key": "token",
"kind": "string",
"sensitive": true,
"cli": {
"flags": "--token <appId:secret>",
"description": "QQBot app id and client secret"
"envVars": [
"QQBOT_APP_ID",
"QQBOT_CLIENT_SECRET"
],
"approvalFlags": [
"native"
],
"doctorCapabilities": {
"openDmRequiresAllowFromWildcard": false
},
"systemImage": "bubble.left.and.bubble.right"
},
"channelSecrets": {
"fields": [
{
"field": "clientSecret",
"activationField": "appId",
"activationEnv": "QQBOT_APP_ID"
}
]
},
"channelHostConfig": {
"docsSource": "official",
"compatibilityMigration": "qqbot.tencent-2.0-compatibility",
"schemaAllOf": [
{
"not": {
"required": [
"defaultAccount"
]
},
"properties": {
"allowFrom": {
"type": "array",
"minItems": 1,
"items": {
"allOf": [
{
"not": {
"const": "*"
}
},
{
"anyOf": [
{
"const": "openclaw:approval-disabled"
},
{
"type": "string",
"pattern": "^[^a-z]*$"
}
]
}
]
}
},
"accounts": {
"type": "object",
"not": {
"required": [
"default"
]
},
"additionalProperties": {
"type": "object",
"properties": {
"allowFrom": {
"type": "array",
"minItems": 1,
"items": {
"allOf": [
{
"not": {
"const": "*"
}
},
{
"anyOf": [
{
"const": "openclaw:approval-disabled"
},
{
"type": "string",
"pattern": "^[^a-z]*$"
}
]
}
]
}
}
},
"required": [
"allowFrom"
]
}
}
},
{
"key": "tokenFile",
"kind": "string",
"sensitive": true,
"cli": {
"flags": "--token-file <path>",
"description": "QQBot client secret file"
}
},
{
"key": "useEnv",
"kind": "boolean",
"cli": {
"flags": "--use-env",
"description": "Use QQBOT environment credentials"
"required": [
"allowFrom"
]
}
]
},
"channelConfigs": {
"qqbot": {
"label": "QQ Bot",
"description": "QQ Bot API conversation channel.",
"preferOver": [
"qqbot"
],
"schema": {
"type": "object",
"additionalProperties": true,
"properties": {
"appId": {
"type": "string"
},
"clientSecret": {
"type": "string"
}
}
]
}
}
},
"install": {
"npmSpec": "@openclaw/qqbot",
"npmSpec": "@tencent-connect/openclaw-qqbot@2.0.1",
"defaultChoice": "npm",
"minHostVersion": ">=2026.4.10"
"expectedIntegrity": "sha512-2010PaCummeQaxerLtaGfQ/5HChiXaW/KpTERid7V/1zyTs46S2ACi0hgZQ1SB7tH0t1InWr8tzVBJV/pLss3Q=="
}
}
},
@@ -82,6 +82,168 @@
}
}
},
{
"name": "@tencent-connect/openclaw-qqbot",
"description": "OpenClaw QQ Bot channel plugin by the Tencent Connect team.",
"source": "external",
"kind": "channel",
"openclaw": {
"plugin": {
"id": "openclaw-qqbot",
"label": "QQ Bot"
},
"contracts": {
"tools": ["qqbot_platform_api", "qqbot_remind"]
},
"channel": {
"id": "qqbot",
"label": "QQ Bot",
"selectionLabel": "QQ Bot (Official API)",
"detailLabel": "QQ Bot",
"docsPath": "/channels/qqbot",
"docsLabel": "qqbot",
"blurb": "connect to QQ via official QQ Bot API with group chat and direct message support.",
"envVars": ["QQBOT_APP_ID", "QQBOT_CLIENT_SECRET"],
"approvalFlags": ["native"],
"doctorCapabilities": {
"openDmRequiresAllowFromWildcard": false
},
"systemImage": "bubble.left.and.bubble.right"
},
"channelSecrets": {
"fields": [
{
"field": "clientSecret",
"activationField": "appId",
"activationEnv": "QQBOT_APP_ID"
}
]
},
"channelHostConfig": {
"docsSource": "official",
"docsInventory": {
"package": {
"name": "@openclaw/qqbot",
"description": "OpenClaw QQ Bot channel plugin for group and direct-message workflows.",
"openclaw": {
"install": {
"npmSpec": "@openclaw/qqbot",
"defaultChoice": "npm"
},
"release": {
"publishToClawHub": true,
"publishToNpm": true
}
}
},
"manifest": {
"id": "qqbot",
"description": "OpenClaw QQ Bot channel plugin for group and direct-message workflows.",
"channels": ["qqbot"],
"contracts": {
"tools": []
},
"skills": ["./skills"]
}
},
"compatibilityMigration": "qqbot.tencent-2.0-compatibility",
"schemaAllOf": [
{
"not": {
"required": ["defaultAccount"]
},
"properties": {
"allowFrom": {
"type": "array",
"minItems": 1,
"items": {
"allOf": [
{
"not": {
"const": "*"
}
},
{
"anyOf": [
{
"const": "openclaw:approval-disabled"
},
{
"type": "string",
"pattern": "^[^a-z]*$"
}
]
}
]
}
},
"accounts": {
"type": "object",
"not": {
"required": ["default"]
},
"additionalProperties": {
"type": "object",
"properties": {
"allowFrom": {
"type": "array",
"minItems": 1,
"items": {
"allOf": [
{
"not": {
"const": "*"
}
},
{
"anyOf": [
{
"const": "openclaw:approval-disabled"
},
{
"type": "string",
"pattern": "^[^a-z]*$"
}
]
}
]
}
}
},
"required": ["allowFrom"]
}
}
},
"required": ["allowFrom"]
}
]
},
"channelConfigs": {
"qqbot": {
"label": "QQ Bot",
"description": "QQ Bot API conversation channel.",
"preferOver": ["qqbot"],
"schema": {
"type": "object",
"additionalProperties": true,
"properties": {
"appId": {
"type": "string"
},
"clientSecret": {
"type": "string"
}
}
}
}
},
"install": {
"npmSpec": "@tencent-connect/openclaw-qqbot@2.0.1",
"defaultChoice": "npm",
"expectedIntegrity": "sha512-2010PaCummeQaxerLtaGfQ/5HChiXaW/KpTERid7V/1zyTs46S2ACi0hgZQ1SB7tH0t1InWr8tzVBJV/pLss3Q=="
}
}
},
{
"name": "@tencent-weixin/openclaw-weixin",
"description": "OpenClaw Weixin channel plugin by the Tencent Weixin team.",