@ryantest/openclaw-qqbot 1.6.7-beta.16 → 1.6.7-beta.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -757,12 +757,16 @@ function fireHotUpgrade(targetVersion, pkg, useLocal) {
757
757
  changed = true;
758
758
  }
759
759
  // 同步 plugins.entries(openclaw plugins install 会写入 entries)
760
+ // 注意:不同步 openclaw-qqbot 自身的 entry,因为插件通过 auto-discover 加载,
761
+ // 显式写入 entries 会导致 "duplicate plugin id" 警告刷屏。
760
762
  if (tmp.plugins?.entries) {
761
763
  if (!real.plugins)
762
764
  real.plugins = {};
763
765
  if (!real.plugins.entries)
764
766
  real.plugins.entries = {};
765
767
  for (const [k, v] of Object.entries(tmp.plugins.entries)) {
768
+ if (k === "openclaw-qqbot")
769
+ continue; // 跳过自身,避免 duplicate
766
770
  if (!real.plugins.entries[k]) {
767
771
  real.plugins.entries[k] = v;
768
772
  changed = true;
@@ -895,12 +899,64 @@ CLI="${cliInvoke}"
895
899
  CONFIG="${configPath}"
896
900
  BACKUP="${qqbotChannelBackup}"
897
901
 
902
+ # ── 兼容 openclaw 3.23+ 配置严格校验 ──
903
+ # 所有 openclaw CLI 命令(包括 gateway stop/start)启动时都会 loadConfig 校验配置,
904
+ # 如果 channels.qqbot 存在但 qqbot 插件尚未加载,校验会报 "unknown channel id: qqbot"。
905
+ #
906
+ # 策略:
907
+ # 1. gateway stop:使用 OPENCLAW_CONFIG_PATH 临时配置(不含 channels.qqbot)
908
+ # 2. gateway start:先尝试直接启动(真实配置),如果 CLI 校验失败,
909
+ # 则临时修改真实配置(此时 gateway 已停止,无 config watcher),启动后恢复。
910
+ # 这样 gateway 进程读取的是完整配置(含 channels.qqbot)。
911
+
912
+ # 为 gateway stop 创建临时配置
913
+ TEMP_RESTART_CONFIG=""
914
+ if [ -f "$BACKUP" ]; then
915
+ TEMP_RESTART_CONFIG="\$(mktemp)"
916
+ node -e "
917
+ const fs = require('fs');
918
+ const cfg = JSON.parse(fs.readFileSync(process.argv[1], 'utf8'));
919
+ if (cfg.channels && cfg.channels.qqbot) {
920
+ delete cfg.channels.qqbot;
921
+ if (Object.keys(cfg.channels).length === 0) delete cfg.channels;
922
+ }
923
+ if (cfg.plugins && cfg.plugins.entries && cfg.plugins.entries['openclaw-qqbot']) {
924
+ delete cfg.plugins.entries['openclaw-qqbot'];
925
+ if (Object.keys(cfg.plugins.entries).length === 0) delete cfg.plugins.entries;
926
+ }
927
+ fs.writeFileSync(process.argv[2], JSON.stringify(cfg, null, 4) + '\\n');
928
+ " "$CONFIG" "$TEMP_RESTART_CONFIG" 2>/dev/null
929
+ if [ \$? -ne 0 ] || [ ! -s "$TEMP_RESTART_CONFIG" ]; then
930
+ echo "[qqbot-upgrade] WARNING: failed to create temp config"
931
+ TEMP_RESTART_CONFIG=""
932
+ fi
933
+ fi
934
+
898
935
  echo "[qqbot-upgrade] Stopping gateway..."
899
- $CLI gateway stop 2>/dev/null || true
936
+ if [ -n "$TEMP_RESTART_CONFIG" ]; then
937
+ OPENCLAW_CONFIG_PATH="$TEMP_RESTART_CONFIG" $CLI gateway stop 2>/dev/null || true
938
+ else
939
+ $CLI gateway stop 2>/dev/null || true
940
+ fi
900
941
  sleep 2
901
942
 
902
- if [ -f "$BACKUP" ]; then
903
- echo "[qqbot-upgrade] Temporarily removing channels.qqbot and plugins.entries for config validation bypass..."
943
+ # 清理临时配置(不再需要)
944
+ if [ -n "$TEMP_RESTART_CONFIG" ] && [ -f "$TEMP_RESTART_CONFIG" ]; then
945
+ rm -f "$TEMP_RESTART_CONFIG"
946
+ fi
947
+
948
+ echo "[qqbot-upgrade] Starting gateway..."
949
+ START_OK=false
950
+
951
+ # 先尝试直接启动(使用真实配置,含 channels.qqbot)
952
+ # 如果 openclaw 版本不做严格校验,或者插件已注册,这会直接成功
953
+ if $CLI gateway start 2>/dev/null; then
954
+ START_OK=true
955
+ echo "[qqbot-upgrade] Gateway started successfully (direct start)"
956
+ elif [ -f "$BACKUP" ]; then
957
+ # 直接启动失败(可能是 channels.qqbot 校验失败),
958
+ # 临时修改真实配置(此时 gateway 已停止,无 config watcher,安全)
959
+ echo "[qqbot-upgrade] Direct start failed, temporarily removing channels.qqbot from real config..."
904
960
  node -e "
905
961
  const fs = require('fs');
906
962
  const cfg = JSON.parse(fs.readFileSync(process.argv[1], 'utf8'));
@@ -919,42 +975,44 @@ if [ -f "$BACKUP" ]; then
919
975
  fs.writeFileSync(process.argv[1], JSON.stringify(cfg, null, 4) + '\\n');
920
976
  }
921
977
  " "$CONFIG" 2>/dev/null
922
- echo "[qqbot-upgrade] channels.qqbot temporarily removed"
923
- fi
924
978
 
925
- echo "[qqbot-upgrade] Starting gateway..."
926
- START_OK=false
927
- if $CLI gateway start 2>/dev/null; then
928
- START_OK=true
929
- echo "[qqbot-upgrade] Gateway started successfully"
930
- else
931
- echo "[qqbot-upgrade] WARNING: gateway start failed, will still restore config"
932
- fi
979
+ if $CLI gateway start 2>/dev/null; then
980
+ START_OK=true
981
+ echo "[qqbot-upgrade] Gateway started successfully (after config fix)"
982
+ else
983
+ echo "[qqbot-upgrade] WARNING: gateway start still failed after config fix"
984
+ fi
933
985
 
934
- echo "[qqbot-upgrade] Waiting for plugin to load (8s)..."
935
- sleep 8
986
+ # 等待 gateway 进程启动并加载插件(插件注册 qqbot channel type)
987
+ echo "[qqbot-upgrade] Waiting for plugin to load (8s)..."
988
+ sleep 8
936
989
 
937
- if [ -f "$BACKUP" ]; then
938
- echo "[qqbot-upgrade] Restoring channels.qqbot and plugins.entries..."
990
+ # 恢复 channels.qqbot 到真实配置
991
+ # gateway config file watcher 会检测到变更并热加载
992
+ echo "[qqbot-upgrade] Restoring channels.qqbot to real config..."
939
993
  node -e "
994
+ const fs = require('fs');
940
995
  const fs = require('fs');
941
996
  const cfg = JSON.parse(fs.readFileSync(process.argv[1], 'utf8'));
942
997
  const qqbot = JSON.parse(fs.readFileSync(process.argv[2], 'utf8'));
943
998
  if (!cfg.channels) cfg.channels = {};
944
999
  cfg.channels.qqbot = qqbot;
945
- // 恢复 plugins.entries
946
- if (!cfg.plugins) cfg.plugins = {};
947
- if (!cfg.plugins.entries) cfg.plugins.entries = {};
948
- if (!cfg.plugins.entries['openclaw-qqbot']) {
949
- cfg.plugins.entries['openclaw-qqbot'] = { enabled: true };
950
- }
1000
+ // 注意:不写入 plugins.entries.openclaw-qqbot,
1001
+ // 插件通过 auto-discover 加载,显式 entry 会导致 duplicate plugin id 警告。
951
1002
  fs.writeFileSync(process.argv[1], JSON.stringify(cfg, null, 4) + '\\n');
952
1003
  " "$CONFIG" "$BACKUP" 2>/dev/null
953
1004
  rm -f "$BACKUP"
954
1005
  echo "[qqbot-upgrade] channels.qqbot restored"
1006
+ else
1007
+ echo "[qqbot-upgrade] WARNING: gateway start failed, no backup to restore"
1008
+ fi
1009
+
1010
+ # 直接启动成功的情况下,清理备份文件
1011
+ if [ "$START_OK" = "true" ] && [ -f "$BACKUP" ]; then
1012
+ rm -f "$BACKUP"
955
1013
  fi
956
1014
 
957
- # 如果 start 失败,尝试再次启动(此时 channels.qqbot 已恢复,插件可能已注册)
1015
+ # 如果 start 失败,尝试再次启动
958
1016
  if [ "$START_OK" != "true" ]; then
959
1017
  echo "[qqbot-upgrade] Retrying gateway start..."
960
1018
  sleep 2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryantest/openclaw-qqbot",
3
- "version": "1.6.7-beta.16",
3
+ "version": "1.6.7-beta.18",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -861,10 +861,13 @@ function fireHotUpgrade(targetVersion?: string, pkg?: string, useLocal?: boolean
861
861
  changed = true;
862
862
  }
863
863
  // 同步 plugins.entries(openclaw plugins install 会写入 entries)
864
+ // 注意:不同步 openclaw-qqbot 自身的 entry,因为插件通过 auto-discover 加载,
865
+ // 显式写入 entries 会导致 "duplicate plugin id" 警告刷屏。
864
866
  if (tmp.plugins?.entries) {
865
867
  if (!real.plugins) real.plugins = {};
866
868
  if (!real.plugins.entries) real.plugins.entries = {};
867
869
  for (const [k, v] of Object.entries(tmp.plugins.entries)) {
870
+ if (k === "openclaw-qqbot") continue; // 跳过自身,避免 duplicate
868
871
  if (!real.plugins.entries[k]) {
869
872
  real.plugins.entries[k] = v;
870
873
  changed = true;
@@ -997,12 +1000,64 @@ CLI="${cliInvoke}"
997
1000
  CONFIG="${configPath}"
998
1001
  BACKUP="${qqbotChannelBackup}"
999
1002
 
1003
+ # ── 兼容 openclaw 3.23+ 配置严格校验 ──
1004
+ # 所有 openclaw CLI 命令(包括 gateway stop/start)启动时都会 loadConfig 校验配置,
1005
+ # 如果 channels.qqbot 存在但 qqbot 插件尚未加载,校验会报 "unknown channel id: qqbot"。
1006
+ #
1007
+ # 策略:
1008
+ # 1. gateway stop:使用 OPENCLAW_CONFIG_PATH 临时配置(不含 channels.qqbot)
1009
+ # 2. gateway start:先尝试直接启动(真实配置),如果 CLI 校验失败,
1010
+ # 则临时修改真实配置(此时 gateway 已停止,无 config watcher),启动后恢复。
1011
+ # 这样 gateway 进程读取的是完整配置(含 channels.qqbot)。
1012
+
1013
+ # 为 gateway stop 创建临时配置
1014
+ TEMP_RESTART_CONFIG=""
1015
+ if [ -f "$BACKUP" ]; then
1016
+ TEMP_RESTART_CONFIG="\$(mktemp)"
1017
+ node -e "
1018
+ const fs = require('fs');
1019
+ const cfg = JSON.parse(fs.readFileSync(process.argv[1], 'utf8'));
1020
+ if (cfg.channels && cfg.channels.qqbot) {
1021
+ delete cfg.channels.qqbot;
1022
+ if (Object.keys(cfg.channels).length === 0) delete cfg.channels;
1023
+ }
1024
+ if (cfg.plugins && cfg.plugins.entries && cfg.plugins.entries['openclaw-qqbot']) {
1025
+ delete cfg.plugins.entries['openclaw-qqbot'];
1026
+ if (Object.keys(cfg.plugins.entries).length === 0) delete cfg.plugins.entries;
1027
+ }
1028
+ fs.writeFileSync(process.argv[2], JSON.stringify(cfg, null, 4) + '\\n');
1029
+ " "$CONFIG" "$TEMP_RESTART_CONFIG" 2>/dev/null
1030
+ if [ \$? -ne 0 ] || [ ! -s "$TEMP_RESTART_CONFIG" ]; then
1031
+ echo "[qqbot-upgrade] WARNING: failed to create temp config"
1032
+ TEMP_RESTART_CONFIG=""
1033
+ fi
1034
+ fi
1035
+
1000
1036
  echo "[qqbot-upgrade] Stopping gateway..."
1001
- $CLI gateway stop 2>/dev/null || true
1037
+ if [ -n "$TEMP_RESTART_CONFIG" ]; then
1038
+ OPENCLAW_CONFIG_PATH="$TEMP_RESTART_CONFIG" $CLI gateway stop 2>/dev/null || true
1039
+ else
1040
+ $CLI gateway stop 2>/dev/null || true
1041
+ fi
1002
1042
  sleep 2
1003
1043
 
1004
- if [ -f "$BACKUP" ]; then
1005
- echo "[qqbot-upgrade] Temporarily removing channels.qqbot and plugins.entries for config validation bypass..."
1044
+ # 清理临时配置(不再需要)
1045
+ if [ -n "$TEMP_RESTART_CONFIG" ] && [ -f "$TEMP_RESTART_CONFIG" ]; then
1046
+ rm -f "$TEMP_RESTART_CONFIG"
1047
+ fi
1048
+
1049
+ echo "[qqbot-upgrade] Starting gateway..."
1050
+ START_OK=false
1051
+
1052
+ # 先尝试直接启动(使用真实配置,含 channels.qqbot)
1053
+ # 如果 openclaw 版本不做严格校验,或者插件已注册,这会直接成功
1054
+ if $CLI gateway start 2>/dev/null; then
1055
+ START_OK=true
1056
+ echo "[qqbot-upgrade] Gateway started successfully (direct start)"
1057
+ elif [ -f "$BACKUP" ]; then
1058
+ # 直接启动失败(可能是 channels.qqbot 校验失败),
1059
+ # 临时修改真实配置(此时 gateway 已停止,无 config watcher,安全)
1060
+ echo "[qqbot-upgrade] Direct start failed, temporarily removing channels.qqbot from real config..."
1006
1061
  node -e "
1007
1062
  const fs = require('fs');
1008
1063
  const cfg = JSON.parse(fs.readFileSync(process.argv[1], 'utf8'));
@@ -1021,42 +1076,44 @@ if [ -f "$BACKUP" ]; then
1021
1076
  fs.writeFileSync(process.argv[1], JSON.stringify(cfg, null, 4) + '\\n');
1022
1077
  }
1023
1078
  " "$CONFIG" 2>/dev/null
1024
- echo "[qqbot-upgrade] channels.qqbot temporarily removed"
1025
- fi
1026
1079
 
1027
- echo "[qqbot-upgrade] Starting gateway..."
1028
- START_OK=false
1029
- if $CLI gateway start 2>/dev/null; then
1030
- START_OK=true
1031
- echo "[qqbot-upgrade] Gateway started successfully"
1032
- else
1033
- echo "[qqbot-upgrade] WARNING: gateway start failed, will still restore config"
1034
- fi
1080
+ if $CLI gateway start 2>/dev/null; then
1081
+ START_OK=true
1082
+ echo "[qqbot-upgrade] Gateway started successfully (after config fix)"
1083
+ else
1084
+ echo "[qqbot-upgrade] WARNING: gateway start still failed after config fix"
1085
+ fi
1035
1086
 
1036
- echo "[qqbot-upgrade] Waiting for plugin to load (8s)..."
1037
- sleep 8
1087
+ # 等待 gateway 进程启动并加载插件(插件注册 qqbot channel type)
1088
+ echo "[qqbot-upgrade] Waiting for plugin to load (8s)..."
1089
+ sleep 8
1038
1090
 
1039
- if [ -f "$BACKUP" ]; then
1040
- echo "[qqbot-upgrade] Restoring channels.qqbot and plugins.entries..."
1091
+ # 恢复 channels.qqbot 到真实配置
1092
+ # gateway config file watcher 会检测到变更并热加载
1093
+ echo "[qqbot-upgrade] Restoring channels.qqbot to real config..."
1041
1094
  node -e "
1095
+ const fs = require('fs');
1042
1096
  const fs = require('fs');
1043
1097
  const cfg = JSON.parse(fs.readFileSync(process.argv[1], 'utf8'));
1044
1098
  const qqbot = JSON.parse(fs.readFileSync(process.argv[2], 'utf8'));
1045
1099
  if (!cfg.channels) cfg.channels = {};
1046
1100
  cfg.channels.qqbot = qqbot;
1047
- // 恢复 plugins.entries
1048
- if (!cfg.plugins) cfg.plugins = {};
1049
- if (!cfg.plugins.entries) cfg.plugins.entries = {};
1050
- if (!cfg.plugins.entries['openclaw-qqbot']) {
1051
- cfg.plugins.entries['openclaw-qqbot'] = { enabled: true };
1052
- }
1101
+ // 注意:不写入 plugins.entries.openclaw-qqbot,
1102
+ // 插件通过 auto-discover 加载,显式 entry 会导致 duplicate plugin id 警告。
1053
1103
  fs.writeFileSync(process.argv[1], JSON.stringify(cfg, null, 4) + '\\n');
1054
1104
  " "$CONFIG" "$BACKUP" 2>/dev/null
1055
1105
  rm -f "$BACKUP"
1056
1106
  echo "[qqbot-upgrade] channels.qqbot restored"
1107
+ else
1108
+ echo "[qqbot-upgrade] WARNING: gateway start failed, no backup to restore"
1109
+ fi
1110
+
1111
+ # 直接启动成功的情况下,清理备份文件
1112
+ if [ "$START_OK" = "true" ] && [ -f "$BACKUP" ]; then
1113
+ rm -f "$BACKUP"
1057
1114
  fi
1058
1115
 
1059
- # 如果 start 失败,尝试再次启动(此时 channels.qqbot 已恢复,插件可能已注册)
1116
+ # 如果 start 失败,尝试再次启动
1060
1117
  if [ "$START_OK" != "true" ]; then
1061
1118
  echo "[qqbot-upgrade] Retrying gateway start..."
1062
1119
  sleep 2