ForcePilot/backend/package/yuxi/channels/plugins/wechat_woc/manifest.json
Kris eb80382da0 feat(wechat-woc): 新增SSE流式推送支持,优化日志与幂等性
1.  新增WeChatWocStreamConnectorAdapter,实现SSE长连接接收消息,支持热更新配置
2.  升级wechat_woc插件依赖bridge版本至1.5.0,开启both传输模式
3.  新增SSE相关常量与配置项,完善woc_bridge_client SSE实现
4.  重构RouteStage,复用会话缓存避免重复查询
5.  新增入站/出站全链路日志打点,优化异常场景日志输出
6.  实现入站幂等记录状态回写机制,独立事务避免死锁
7.  新增TransportManager重启恢复逻辑,自动恢复在线账号传输任务
8.  修复inbound_pipeline移除冗余persistence_port参数,注入idempotency仓储
9.  新增InboundContext.idempotency_record_id字段,传递幂等记录主键
2026-07-08 00:17:39 +08:00

101 lines
4.8 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.wechat_woc",
"name": "微信 WechatOnCloud",
"version": "1.0.0",
"channel_type": "wechat_woc",
"icon": "smartphone",
"entry_module": "yuxi.channels.plugins.wechat_woc.entry",
"provides": ["wechat_woc"],
"lifecycle": ["init", "start", "stop", "pause", "resume", "unload", "reconfigure", "fail"],
"compatibility": {
"min_host_version": "1.0.0",
"woc_bridge_version": "1.5.0"
},
"failure_policy": "degrade",
"depends": [],
"critical": false,
"requires_dm_pairing": true,
"requires_outbound_delivery": true,
"credential_strategy": {
"type": "static",
"acquire_method": "manual",
"required_fields": ["bridge_url", "bridge_token"],
"optional_fields": [],
"supports_rotation": false,
"supports_revocation": false
},
"max_message_length": 2000,
"supports_credential_cloning": false,
"transport_mode": "both",
"capabilities": {
"rich_message": false,
"streaming": false,
"typing_indicator": false,
"message_edit": false,
"message_recall": false,
"supports_reaction": false,
"supports_pin": false,
"supports_card_update": false,
"supports_card_update_streaming": false,
"supports_image_inbound": true,
"supports_video_inbound": true,
"supports_image_outbound": false,
"supports_video_outbound": false,
"mention": false,
"command": false,
"directory": true,
"doctor": true,
"whitelist": true,
"wizard": true,
"tools": false,
"status": true,
"probeable": true,
"identity_resolver": false,
"lifecycle": true,
"supports_qr_login": true,
"agent_collaboration": false
},
"capability_requirements": [
["supports_image_inbound", ["bridge_url", "bridge_token"]],
["supports_video_inbound", ["bridge_url", "bridge_token"]],
["directory", ["bridge_url", "bridge_token"]],
["doctor", ["bridge_url", "bridge_token"]],
["whitelist", ["bridge_url", "bridge_token"]],
["wizard", ["bridge_url", "bridge_token"]],
["status", []],
["probeable", []],
["lifecycle", []],
["supports_qr_login", ["bridge_url", "bridge_token"]]
],
"resource_quota": {
"max_cpu": "15.0",
"max_memory": "128MB",
"max_connections": 10,
"max_calls_per_sec": 10
},
"accessible_ports": [
"ConfigPort",
"LoggerPort",
"PersistencePort",
"CachePort"
],
"injectable_pipelines": ["inbound", "outbound"],
"config_schema": [
{"key": "bridge_url", "type": "string", "required": true, "default": null, "hot_reloadable": true, "sensitive": true, "scope": "account", "constraints": {"pattern": "^https?://"}},
{"key": "bridge_token", "type": "string", "required": true, "default": null, "hot_reloadable": true, "sensitive": true, "scope": "account", "constraints": {}},
{"key": "poll_interval_ms", "type": "integer", "required": false, "default": 2000, "hot_reloadable": true, "scope": "channel", "constraints": {"min": 1000, "max": 10000}},
{"key": "max_batch_size", "type": "integer", "required": false, "default": 50, "hot_reloadable": true, "scope": "channel", "constraints": {"min": 10, "max": 200}},
{"key": "max_message_length", "type": "integer", "required": false, "default": 2000, "hot_reloadable": true, "scope": "channel", "constraints": {"min": 500, "max": 5000}},
{"key": "sse_heartbeat_interval_ms", "type": "integer", "required": false, "default": 30000, "hot_reloadable": true, "scope": "channel", "constraints": {"min": 10000, "max": 60000}, "description": "SSE 心跳间隔毫秒bridge 默认 30s 发 heartbeat 事件保活"},
{"key": "sse_connect_timeout_ms", "type": "integer", "required": false, "default": 10000, "hot_reloadable": true, "scope": "channel", "constraints": {"min": 5000, "max": 30000}, "description": "SSE 连接建立超时(毫秒)"},
{"key": "sse_read_timeout_s", "type": "integer", "required": false, "default": 120, "hot_reloadable": true, "scope": "channel", "constraints": {"min": 30, "max": 600}, "description": "SSE 流式接收读取超时bridge 30s heartbeat 保活,此处仅兜底防挂死"}
],
"env_vars": [
{"name": "WOC_BRIDGE_URL", "description": "bridge 服务默认地址(可被 config_schema 覆盖)", "required": false, "default": "http://localhost:8088", "sensitive": false},
{"name": "WOC_POLL_INTERVAL_MS", "description": "短轮询间隔(毫秒)", "required": false, "default": "2000", "sensitive": false},
{"name": "WOC_MAX_BATCH_SIZE", "description": "单次拉取消息上限", "required": false, "default": "50", "sensitive": false},
{"name": "WOC_MAX_CALLS_PER_SEC", "description": "每秒调用上限", "required": false, "default": "10", "sensitive": false},
{"name": "WOC_HTTP_TIMEOUT_MS", "description": "HTTP 客户端超时(毫秒)", "required": false, "default": "30000", "sensitive": false}
]
}