@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.
- package/dist/src/slash-commands.js +82 -24
- package/package.json +1 -1
- package/src/slash-commands.ts +81 -24
|
@@ -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
|
-
|
|
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
|
-
|
|
903
|
-
|
|
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
|
-
|
|
926
|
-
START_OK=
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
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
|
-
|
|
935
|
-
|
|
986
|
+
# 等待 gateway 进程启动并加载插件(插件注册 qqbot channel type)
|
|
987
|
+
echo "[qqbot-upgrade] Waiting for plugin to load (8s)..."
|
|
988
|
+
sleep 8
|
|
936
989
|
|
|
937
|
-
|
|
938
|
-
|
|
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
|
-
//
|
|
946
|
-
|
|
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
|
|
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
package/src/slash-commands.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
1005
|
-
|
|
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
|
-
|
|
1028
|
-
START_OK=
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
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
|
-
|
|
1037
|
-
|
|
1087
|
+
# 等待 gateway 进程启动并加载插件(插件注册 qqbot channel type)
|
|
1088
|
+
echo "[qqbot-upgrade] Waiting for plugin to load (8s)..."
|
|
1089
|
+
sleep 8
|
|
1038
1090
|
|
|
1039
|
-
|
|
1040
|
-
|
|
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
|
-
//
|
|
1048
|
-
|
|
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
|
|
1116
|
+
# 如果 start 失败,尝试再次启动
|
|
1060
1117
|
if [ "$START_OK" != "true" ]; then
|
|
1061
1118
|
echo "[qqbot-upgrade] Retrying gateway start..."
|
|
1062
1119
|
sleep 2
|