ForcePilot/backend/package/yuxi/channels/plugins/wecom/manifest.json
Kris 28d2c19f23 feat(wecom): 新增企业微信渠道插件完整实现
实现企业微信全功能渠道插件,包含适配器、客户端、签名校验、模板卡片构建等模块,完成从事件接收、会话解析到消息发送的完整流程支持,包含配置校验、错误翻译、探测能力与生命周期管理。
2026-07-08 22:58:25 +08:00

127 lines
7.7 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"id": "com.yuxi.channels.wecom",
"name": "企业微信",
"version": "1.0.0",
"channel_type": "wecom",
"icon": "message-square",
"entry_module": "yuxi.channels.plugins.wecom.entry",
"provides": ["wecom"],
"lifecycle": ["init", "start", "stop", "pause", "resume", "unload", "reconfigure", "fail"],
"compatibility": {
"min_host_version": "1.0.0",
"wecom_api_version": "2026.03"
},
"failure_policy": "degrade",
"depends": [],
"critical": false,
"requires_dm_pairing": true,
"requires_outbound_delivery": true,
"credential_strategy": {
"type": "hybrid",
"acquire_method": "manual",
"required_fields": ["corp_id", "corp_secret", "agent_id"],
"optional_fields": ["external_contact_secret", "kf_secret"],
"supports_rotation": false,
"supports_revocation": false
},
"max_message_length": 2048,
"supports_credential_cloning": false,
"transport_mode": "both",
"capabilities": {
"rich_message": true,
"streaming": false,
"typing_indicator": false,
"message_edit": false,
"message_recall": true,
"supports_reaction": false,
"supports_pin": false,
"supports_card_update": true,
"supports_card_update_streaming": true,
"supports_image_inbound": true,
"supports_video_inbound": true,
"supports_image_outbound": true,
"supports_video_outbound": true,
"mention": false,
"command": true,
"directory": true,
"doctor": true,
"whitelist": true,
"wizard": true,
"tools": false,
"status": true,
"probeable": true,
"identity_resolver": true,
"lifecycle": true,
"supports_qr_login": true,
"agent_collaboration": false
},
"capability_requirements": [
["supports_image_outbound", ["corp_id", "corp_secret", "agent_id"]],
["supports_video_outbound", ["corp_id", "corp_secret", "agent_id"]],
["supports_qr_login", ["corp_id", "corp_secret", "qr_redirect_uri"]],
["identity_resolver", ["corp_id", "corp_secret"]],
["lifecycle", []],
["probeable", []],
["status", []]
],
"resource_quota": {
"max_cpu": "20.0",
"max_memory": "256MB",
"max_connections": 50,
"max_calls_per_sec": 20
},
"accessible_ports": [
"ConfigPort",
"LoggerPort",
"PersistencePort",
"CachePort",
"TracerPort",
"ConversationPort",
"IdentityResolverPort",
"ChannelAccountRepositoryPort",
"ChannelSessionRepositoryPort",
"OutboxRepositoryPort",
"UserIdentityRepositoryPort",
"AuditLogRepositoryPort",
"IdempotencyRepositoryPort"
],
"injectable_pipelines": ["inbound", "outbound"],
"config_schema": [
{"key": "corp_id", "type": "string", "required": true, "default": null, "hot_reloadable": false, "scope": "account", "constraints": {"pattern": ".+"}},
{"key": "corp_secret", "type": "string", "required": true, "default": null, "hot_reloadable": false, "sensitive": true, "scope": "account", "constraints": {"pattern": ".+"}},
{"key": "agent_id", "type": "string", "required": true, "default": null, "hot_reloadable": false, "scope": "account", "constraints": {"pattern": ".+"}},
{"key": "encoding_aes_key", "type": "string", "required": true, "default": null, "hot_reloadable": false, "sensitive": true, "scope": "account", "constraints": {"pattern": "^.{43}$"}},
{"key": "token", "type": "string", "required": true, "default": null, "hot_reloadable": false, "sensitive": true, "scope": "account", "constraints": {"pattern": ".+"}},
{"key": "webhook_url", "type": "string", "required": true, "default": null, "hot_reloadable": false, "scope": "channel", "constraints": {"pattern": "^https://"}},
{"key": "external_contact_secret", "type": "string", "required": false, "default": null, "hot_reloadable": false, "sensitive": true, "scope": "account", "constraints": {}},
{"key": "kf_secret", "type": "string", "required": false, "default": null, "hot_reloadable": false, "sensitive": true, "scope": "account", "constraints": {}},
{"key": "enable_external_contact", "type": "boolean", "required": false, "default": false, "hot_reloadable": true, "scope": "channel", "constraints": {}},
{"key": "enable_kf", "type": "boolean", "required": false, "default": false, "hot_reloadable": true, "scope": "channel", "constraints": {}},
{"key": "enable_unionid", "type": "boolean", "required": false, "default": false, "hot_reloadable": true, "scope": "channel", "constraints": {}},
{"key": "enable_qr_login", "type": "boolean", "required": false, "default": false, "hot_reloadable": true, "scope": "channel", "constraints": {}},
{"key": "qr_redirect_uri", "type": "string", "required": false, "default": null, "hot_reloadable": true, "scope": "channel", "constraints": {"pattern": "^https://"}},
{"key": "qr_timeout_ms", "type": "integer", "required": false, "default": 120000, "hot_reloadable": true, "scope": "channel", "constraints": {"min": 30000, "max": 300000}},
{"key": "token_cache_ttl", "type": "integer", "required": false, "default": 7200, "hot_reloadable": true, "scope": "channel", "constraints": {"min": 60, "max": 7200}},
{"key": "user_cache_ttl", "type": "integer", "required": false, "default": 1800, "hot_reloadable": true, "scope": "channel", "constraints": {"min": 60, "max": 3600}},
{"key": "dm_policy", "type": "string", "required": false, "default": "allow_all", "hot_reloadable": true, "scope": "channel", "constraints": {"enum": ["allow_all", "allow_from", "deny_all"]}},
{"key": "allow_from", "type": "json", "required": false, "default": [], "hot_reloadable": true, "scope": "channel", "constraints": {}},
{"key": "rate_limit", "type": "integer", "required": false, "default": 20, "hot_reloadable": true, "scope": "channel", "constraints": {"min": 1, "max": 100}},
{"key": "duplicate_check_interval", "type": "integer", "required": false, "default": 1800, "hot_reloadable": true, "scope": "channel", "constraints": {"min": 60, "max": 14400}},
{"key": "api_base_url", "type": "string", "required": false, "default": "https://qyapi.weixin.qq.com", "hot_reloadable": true, "scope": "channel", "constraints": {}},
{"key": "request_timeout_ms", "type": "integer", "required": false, "default": 30000, "hot_reloadable": true, "scope": "channel", "constraints": {"min": 5000, "max": 60000}},
{"key": "max_retries", "type": "integer", "required": false, "default": 3, "hot_reloadable": true, "scope": "channel", "constraints": {"min": 0, "max": 5}}
],
"env_vars": [
{"name": "WECOM_CORP_ID", "description": "企业微信企业 ID", "required": true, "default": null, "sensitive": false},
{"name": "WECOM_CORP_SECRET", "description": "自建应用 Secret", "required": true, "default": null, "sensitive": true},
{"name": "WECOM_AGENT_ID", "description": "自建应用 Agent ID", "required": true, "default": null, "sensitive": false},
{"name": "WECOM_ENCODING_AES_KEY", "description": "回调加密 AES Key43 位)", "required": true, "default": null, "sensitive": true},
{"name": "WECOM_TOKEN", "description": "回调签名 Token", "required": true, "default": null, "sensitive": true},
{"name": "WECOM_EXTERNAL_CONTACT_SECRET", "description": "客户联系 Secret", "required": false, "default": null, "sensitive": true},
{"name": "WECOM_KF_SECRET", "description": "微信客服 Secret", "required": false, "default": null, "sensitive": true},
{"name": "WECOM_WEBHOOK_URL", "description": "回调接收 URL公网 HTTPS", "required": true, "default": null, "sensitive": false},
{"name": "WECOM_QR_REDIRECT_URI", "description": "OAuth 扫码登录回调地址", "required": false, "default": null, "sensitive": false},
{"name": "WECOM_QR_TIMEOUT_MS", "description": "扫码等待超时(毫秒)", "required": false, "default": "120000", "sensitive": false}
]
}