@ryantest/openclaw-qqbot 0.0.1
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/LICENSE +22 -0
- package/README.md +483 -0
- package/README.zh.md +478 -0
- package/bin/qqbot-cli.js +243 -0
- package/clawdbot.plugin.json +16 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +26 -0
- package/dist/src/admin-resolver.d.ts +27 -0
- package/dist/src/admin-resolver.js +122 -0
- package/dist/src/api.d.ts +156 -0
- package/dist/src/api.js +599 -0
- package/dist/src/channel.d.ts +11 -0
- package/dist/src/channel.js +354 -0
- package/dist/src/config.d.ts +25 -0
- package/dist/src/config.js +161 -0
- package/dist/src/credential-backup.d.ts +31 -0
- package/dist/src/credential-backup.js +66 -0
- package/dist/src/gateway.d.ts +18 -0
- package/dist/src/gateway.js +1265 -0
- package/dist/src/image-server.d.ts +68 -0
- package/dist/src/image-server.js +462 -0
- package/dist/src/inbound-attachments.d.ts +58 -0
- package/dist/src/inbound-attachments.js +234 -0
- package/dist/src/known-users.d.ts +100 -0
- package/dist/src/known-users.js +263 -0
- package/dist/src/message-queue.d.ts +50 -0
- package/dist/src/message-queue.js +115 -0
- package/dist/src/onboarding.d.ts +10 -0
- package/dist/src/onboarding.js +203 -0
- package/dist/src/outbound-deliver.d.ts +48 -0
- package/dist/src/outbound-deliver.js +462 -0
- package/dist/src/outbound.d.ts +203 -0
- package/dist/src/outbound.js +1102 -0
- package/dist/src/proactive.d.ts +170 -0
- package/dist/src/proactive.js +399 -0
- package/dist/src/ref-index-store.d.ts +70 -0
- package/dist/src/ref-index-store.js +273 -0
- package/dist/src/reply-dispatcher.d.ts +35 -0
- package/dist/src/reply-dispatcher.js +311 -0
- package/dist/src/runtime.d.ts +3 -0
- package/dist/src/runtime.js +10 -0
- package/dist/src/session-store.d.ts +52 -0
- package/dist/src/session-store.js +254 -0
- package/dist/src/slash-commands.d.ts +71 -0
- package/dist/src/slash-commands.js +1179 -0
- package/dist/src/startup-greeting.d.ts +30 -0
- package/dist/src/startup-greeting.js +78 -0
- package/dist/src/stt.d.ts +21 -0
- package/dist/src/stt.js +70 -0
- package/dist/src/tools/channel.d.ts +16 -0
- package/dist/src/tools/channel.js +234 -0
- package/dist/src/tools/remind.d.ts +2 -0
- package/dist/src/tools/remind.js +247 -0
- package/dist/src/types.d.ts +175 -0
- package/dist/src/types.js +1 -0
- package/dist/src/typing-keepalive.d.ts +27 -0
- package/dist/src/typing-keepalive.js +64 -0
- package/dist/src/update-checker.d.ts +34 -0
- package/dist/src/update-checker.js +166 -0
- package/dist/src/user-messages.d.ts +8 -0
- package/dist/src/user-messages.js +8 -0
- package/dist/src/utils/audio-convert.d.ts +89 -0
- package/dist/src/utils/audio-convert.js +704 -0
- package/dist/src/utils/file-utils.d.ts +55 -0
- package/dist/src/utils/file-utils.js +150 -0
- package/dist/src/utils/image-size.d.ts +51 -0
- package/dist/src/utils/image-size.js +234 -0
- package/dist/src/utils/media-tags.d.ts +14 -0
- package/dist/src/utils/media-tags.js +164 -0
- package/dist/src/utils/payload.d.ts +112 -0
- package/dist/src/utils/payload.js +186 -0
- package/dist/src/utils/platform.d.ts +137 -0
- package/dist/src/utils/platform.js +390 -0
- package/dist/src/utils/text-parsing.d.ts +32 -0
- package/dist/src/utils/text-parsing.js +80 -0
- package/dist/src/utils/upload-cache.d.ts +34 -0
- package/dist/src/utils/upload-cache.js +93 -0
- package/index.ts +31 -0
- package/moltbot.plugin.json +16 -0
- package/node_modules/@eshaz/web-worker/LICENSE +201 -0
- package/node_modules/@eshaz/web-worker/README.md +134 -0
- package/node_modules/@eshaz/web-worker/browser.js +17 -0
- package/node_modules/@eshaz/web-worker/cjs/browser.js +16 -0
- package/node_modules/@eshaz/web-worker/cjs/node.js +219 -0
- package/node_modules/@eshaz/web-worker/index.d.ts +4 -0
- package/node_modules/@eshaz/web-worker/node.js +223 -0
- package/node_modules/@eshaz/web-worker/package.json +54 -0
- package/node_modules/@wasm-audio-decoders/common/index.js +5 -0
- package/node_modules/@wasm-audio-decoders/common/package.json +36 -0
- package/node_modules/@wasm-audio-decoders/common/src/WASMAudioDecoderCommon.js +231 -0
- package/node_modules/@wasm-audio-decoders/common/src/WASMAudioDecoderWorker.js +129 -0
- package/node_modules/@wasm-audio-decoders/common/src/puff/README +67 -0
- package/node_modules/@wasm-audio-decoders/common/src/puff/build_puff.js +31 -0
- package/node_modules/@wasm-audio-decoders/common/src/puff/puff.c +863 -0
- package/node_modules/@wasm-audio-decoders/common/src/puff/puff.h +35 -0
- package/node_modules/@wasm-audio-decoders/common/src/utilities.js +3 -0
- package/node_modules/@wasm-audio-decoders/common/types.d.ts +7 -0
- package/node_modules/mpg123-decoder/README.md +265 -0
- package/node_modules/mpg123-decoder/dist/mpg123-decoder.min.js +185 -0
- package/node_modules/mpg123-decoder/dist/mpg123-decoder.min.js.map +1 -0
- package/node_modules/mpg123-decoder/index.js +8 -0
- package/node_modules/mpg123-decoder/package.json +58 -0
- package/node_modules/mpg123-decoder/src/EmscriptenWasm.js +464 -0
- package/node_modules/mpg123-decoder/src/MPEGDecoder.js +200 -0
- package/node_modules/mpg123-decoder/src/MPEGDecoderWebWorker.js +21 -0
- package/node_modules/mpg123-decoder/types.d.ts +30 -0
- package/node_modules/silk-wasm/LICENSE +21 -0
- package/node_modules/silk-wasm/README.md +85 -0
- package/node_modules/silk-wasm/lib/index.cjs +16 -0
- package/node_modules/silk-wasm/lib/index.d.ts +70 -0
- package/node_modules/silk-wasm/lib/index.mjs +16 -0
- package/node_modules/silk-wasm/lib/silk.wasm +0 -0
- package/node_modules/silk-wasm/lib/utils.d.ts +4 -0
- package/node_modules/silk-wasm/package.json +39 -0
- package/node_modules/simple-yenc/.github/FUNDING.yml +1 -0
- package/node_modules/simple-yenc/.prettierignore +1 -0
- package/node_modules/simple-yenc/LICENSE +7 -0
- package/node_modules/simple-yenc/README.md +163 -0
- package/node_modules/simple-yenc/dist/esm.js +1 -0
- package/node_modules/simple-yenc/dist/index.js +1 -0
- package/node_modules/simple-yenc/package.json +50 -0
- package/node_modules/simple-yenc/rollup.config.js +27 -0
- package/node_modules/simple-yenc/src/simple-yenc.js +302 -0
- package/node_modules/ws/LICENSE +20 -0
- package/node_modules/ws/README.md +548 -0
- package/node_modules/ws/browser.js +8 -0
- package/node_modules/ws/index.js +13 -0
- package/node_modules/ws/lib/buffer-util.js +131 -0
- package/node_modules/ws/lib/constants.js +19 -0
- package/node_modules/ws/lib/event-target.js +292 -0
- package/node_modules/ws/lib/extension.js +203 -0
- package/node_modules/ws/lib/limiter.js +55 -0
- package/node_modules/ws/lib/permessage-deflate.js +528 -0
- package/node_modules/ws/lib/receiver.js +706 -0
- package/node_modules/ws/lib/sender.js +602 -0
- package/node_modules/ws/lib/stream.js +161 -0
- package/node_modules/ws/lib/subprotocol.js +62 -0
- package/node_modules/ws/lib/validation.js +152 -0
- package/node_modules/ws/lib/websocket-server.js +554 -0
- package/node_modules/ws/lib/websocket.js +1393 -0
- package/node_modules/ws/package.json +69 -0
- package/node_modules/ws/wrapper.mjs +8 -0
- package/openclaw.plugin.json +16 -0
- package/package.json +76 -0
- package/scripts/cleanup-legacy-plugins.sh +124 -0
- package/scripts/proactive-api-server.ts +369 -0
- package/scripts/send-proactive.ts +293 -0
- package/scripts/set-markdown.sh +156 -0
- package/scripts/test-sendmedia.ts +116 -0
- package/scripts/upgrade-via-alt-pkg.sh +307 -0
- package/scripts/upgrade-via-npm.ps1 +296 -0
- package/scripts/upgrade-via-npm.sh +301 -0
- package/scripts/upgrade-via-source.sh +774 -0
- package/skills/qqbot-channel/SKILL.md +263 -0
- package/skills/qqbot-channel/references/api_references.md +521 -0
- package/skills/qqbot-media/SKILL.md +56 -0
- package/skills/qqbot-remind/SKILL.md +149 -0
- package/src/admin-resolver.ts +140 -0
- package/src/api.ts +819 -0
- package/src/bot-logs-2026-03-21T11-21-47(2).txt +46 -0
- package/src/channel.ts +381 -0
- package/src/config.ts +187 -0
- package/src/credential-backup.ts +72 -0
- package/src/gateway.log +43 -0
- package/src/gateway.ts +1404 -0
- package/src/image-server.ts +539 -0
- package/src/inbound-attachments.ts +304 -0
- package/src/known-users.ts +353 -0
- package/src/message-queue.ts +169 -0
- package/src/onboarding.ts +274 -0
- package/src/openclaw-2026-03-21.log +3729 -0
- package/src/openclaw-plugin-sdk.d.ts +522 -0
- package/src/outbound-deliver.ts +552 -0
- package/src/outbound.ts +1266 -0
- package/src/proactive.ts +530 -0
- package/src/ref-index-store.ts +357 -0
- package/src/reply-dispatcher.ts +334 -0
- package/src/runtime.ts +14 -0
- package/src/session-store.ts +303 -0
- package/src/slash-commands.ts +1305 -0
- package/src/startup-greeting.ts +98 -0
- package/src/stt.ts +86 -0
- package/src/tools/channel.ts +281 -0
- package/src/tools/remind.ts +296 -0
- package/src/types.ts +183 -0
- package/src/typing-keepalive.ts +59 -0
- package/src/update-checker.ts +179 -0
- package/src/user-messages.ts +7 -0
- package/src/utils/audio-convert.ts +803 -0
- package/src/utils/file-utils.ts +167 -0
- package/src/utils/image-size.ts +266 -0
- package/src/utils/media-tags.ts +182 -0
- package/src/utils/payload.ts +265 -0
- package/src/utils/platform.ts +435 -0
- package/src/utils/text-parsing.ts +82 -0
- package/src/utils/upload-cache.ts +128 -0
- package/tsconfig.json +16 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# qqbot 通过 npm 包升级(纯文件操作版本)
|
|
4
|
+
#
|
|
5
|
+
# 默认只做文件替换,不修改 openclaw.json 配置文件。
|
|
6
|
+
# 但如果提供了 --appid/--secret 参数(首次安装场景),
|
|
7
|
+
# 则在文件安装完成后自动写入通道配置。
|
|
8
|
+
#
|
|
9
|
+
# 用法:
|
|
10
|
+
# upgrade-via-npm.sh # 升级到 latest(默认)
|
|
11
|
+
# upgrade-via-npm.sh --version <version> # 升级到指定版本
|
|
12
|
+
# upgrade-via-npm.sh --self-version # 升级到当前仓库 package.json 版本
|
|
13
|
+
# upgrade-via-npm.sh --appid <appid> --secret <secret> # 首次安装时配置 appid/secret
|
|
14
|
+
# upgrade-via-npm.sh --no-restart # 只做文件替换,不重启 gateway(供热更指令使用)
|
|
15
|
+
|
|
16
|
+
set -eo pipefail
|
|
17
|
+
|
|
18
|
+
PKG_NAME="@tencent-connect/openclaw-qqbot"
|
|
19
|
+
INSTALL_SRC=""
|
|
20
|
+
APPID=""
|
|
21
|
+
SECRET=""
|
|
22
|
+
NO_RESTART=false
|
|
23
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
24
|
+
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
25
|
+
|
|
26
|
+
LOCAL_VERSION="$(node -e "
|
|
27
|
+
try {
|
|
28
|
+
const fs = require('fs');
|
|
29
|
+
const path = require('path');
|
|
30
|
+
const p = path.join('$PROJECT_DIR', 'package.json');
|
|
31
|
+
const v = JSON.parse(fs.readFileSync(p, 'utf8')).version;
|
|
32
|
+
if (v) process.stdout.write(String(v));
|
|
33
|
+
} catch {}
|
|
34
|
+
" 2>/dev/null || true)"
|
|
35
|
+
|
|
36
|
+
print_usage() {
|
|
37
|
+
echo "用法:"
|
|
38
|
+
echo " upgrade-via-npm.sh # 升级到 latest(默认)"
|
|
39
|
+
echo " upgrade-via-npm.sh --version <版本号> # 升级到指定版本"
|
|
40
|
+
if [ -n "$LOCAL_VERSION" ]; then
|
|
41
|
+
echo " upgrade-via-npm.sh --self-version # 升级到当前仓库版本($LOCAL_VERSION)"
|
|
42
|
+
else
|
|
43
|
+
echo " upgrade-via-npm.sh --self-version # 升级到当前仓库版本"
|
|
44
|
+
fi
|
|
45
|
+
echo ""
|
|
46
|
+
echo " --appid <appid> QQ机器人 appid(首次安装时必填)"
|
|
47
|
+
echo " --secret <secret> QQ机器人 secret(首次安装时必填)"
|
|
48
|
+
echo ""
|
|
49
|
+
echo "也可以通过环境变量设置:"
|
|
50
|
+
echo " QQBOT_APPID QQ机器人 appid"
|
|
51
|
+
echo " QQBOT_SECRET QQ机器人 secret"
|
|
52
|
+
echo " QQBOT_TOKEN QQ机器人 token (appid:secret)"
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
while [[ $# -gt 0 ]]; do
|
|
56
|
+
case "$1" in
|
|
57
|
+
--tag)
|
|
58
|
+
[ -z "$2" ] && echo "❌ --tag 需要参数" && exit 1
|
|
59
|
+
INSTALL_SRC="${PKG_NAME}@$2"
|
|
60
|
+
shift 2
|
|
61
|
+
;;
|
|
62
|
+
--version)
|
|
63
|
+
[ -z "$2" ] && echo "❌ --version 需要参数" && exit 1
|
|
64
|
+
INSTALL_SRC="${PKG_NAME}@$2"
|
|
65
|
+
shift 2
|
|
66
|
+
;;
|
|
67
|
+
--self-version)
|
|
68
|
+
[ -z "$LOCAL_VERSION" ] && echo "❌ 无法从 package.json 读取版本" && exit 1
|
|
69
|
+
INSTALL_SRC="${PKG_NAME}@${LOCAL_VERSION}"
|
|
70
|
+
shift 1
|
|
71
|
+
;;
|
|
72
|
+
--appid)
|
|
73
|
+
[ -z "$2" ] && echo "❌ --appid 需要参数" && exit 1
|
|
74
|
+
APPID="$2"
|
|
75
|
+
shift 2
|
|
76
|
+
;;
|
|
77
|
+
--secret)
|
|
78
|
+
[ -z "$2" ] && echo "❌ --secret 需要参数" && exit 1
|
|
79
|
+
SECRET="$2"
|
|
80
|
+
shift 2
|
|
81
|
+
;;
|
|
82
|
+
--no-restart)
|
|
83
|
+
NO_RESTART=true
|
|
84
|
+
shift 1
|
|
85
|
+
;;
|
|
86
|
+
-h|--help)
|
|
87
|
+
print_usage
|
|
88
|
+
exit 0
|
|
89
|
+
;;
|
|
90
|
+
*) echo "未知选项: $1"; print_usage; exit 1 ;;
|
|
91
|
+
esac
|
|
92
|
+
done
|
|
93
|
+
INSTALL_SRC="${INSTALL_SRC:-${PKG_NAME}@latest}"
|
|
94
|
+
|
|
95
|
+
# 环境变量 fallback
|
|
96
|
+
APPID="${APPID:-$QQBOT_APPID}"
|
|
97
|
+
SECRET="${SECRET:-$QQBOT_SECRET}"
|
|
98
|
+
if [ -z "$APPID" ] && [ -z "$SECRET" ] && [ -n "$QQBOT_TOKEN" ]; then
|
|
99
|
+
APPID="${QQBOT_TOKEN%%:*}"
|
|
100
|
+
SECRET="${QQBOT_TOKEN#*:}"
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
# 检测 CLI(仅用于确定 extensions 目录路径)
|
|
104
|
+
CMD=""
|
|
105
|
+
for name in openclaw clawdbot moltbot; do
|
|
106
|
+
command -v "$name" &>/dev/null && CMD="$name" && break
|
|
107
|
+
done
|
|
108
|
+
[ -z "$CMD" ] && echo "❌ 未找到 openclaw / clawdbot / moltbot" && exit 1
|
|
109
|
+
|
|
110
|
+
EXTENSIONS_DIR="$HOME/.$CMD/extensions"
|
|
111
|
+
|
|
112
|
+
echo "==========================================="
|
|
113
|
+
echo " qqbot npm 升级: $INSTALL_SRC"
|
|
114
|
+
echo "==========================================="
|
|
115
|
+
echo ""
|
|
116
|
+
|
|
117
|
+
# [1/3] 下载并安装新版本到临时目录
|
|
118
|
+
echo "[1/3] 下载新版本..."
|
|
119
|
+
TMPDIR_PACK=$(mktemp -d)
|
|
120
|
+
EXTRACT_DIR=$(mktemp -d)
|
|
121
|
+
trap "rm -rf '$TMPDIR_PACK' '$EXTRACT_DIR'" EXIT
|
|
122
|
+
|
|
123
|
+
cd "$TMPDIR_PACK"
|
|
124
|
+
# 多 registry fallback:npmjs.org → npmmirror(国内镜像)→ 默认 registry
|
|
125
|
+
PACK_OK=false
|
|
126
|
+
for _registry in "https://registry.npmjs.org/" "https://registry.npmmirror.com/" ""; do
|
|
127
|
+
if [ -n "$_registry" ]; then
|
|
128
|
+
echo " 尝试 registry: $_registry"
|
|
129
|
+
npm pack "$INSTALL_SRC" --registry "$_registry" --quiet 2>&1 && PACK_OK=true && break
|
|
130
|
+
else
|
|
131
|
+
echo " 尝试默认 registry..."
|
|
132
|
+
npm pack "$INSTALL_SRC" --quiet 2>&1 && PACK_OK=true && break
|
|
133
|
+
fi
|
|
134
|
+
done
|
|
135
|
+
$PACK_OK || { echo "❌ npm pack 失败(所有 registry 均不可用)"; exit 1; }
|
|
136
|
+
TGZ_FILE=$(ls -1 *.tgz 2>/dev/null | head -1)
|
|
137
|
+
[ -z "$TGZ_FILE" ] && echo "❌ 未找到下载的 tgz 文件" && exit 1
|
|
138
|
+
echo " 已下载: $TGZ_FILE"
|
|
139
|
+
|
|
140
|
+
tar xzf "$TGZ_FILE" -C "$EXTRACT_DIR"
|
|
141
|
+
PACKAGE_DIR="$EXTRACT_DIR/package"
|
|
142
|
+
[ ! -d "$PACKAGE_DIR" ] && echo "❌ 解压失败,未找到 package 目录" && exit 1
|
|
143
|
+
|
|
144
|
+
# 准备 staging 目录:放在 ~/.openclaw/ 下(extensions 的父目录),
|
|
145
|
+
# 同一文件系统保证 mv 原子操作,同时避免 OpenClaw 扫描 extensions/ 时发现它。
|
|
146
|
+
STAGING_DIR="$(dirname "$EXTENSIONS_DIR")/.qqbot-upgrade-staging"
|
|
147
|
+
rm -rf "$STAGING_DIR"
|
|
148
|
+
mkdir -p "$STAGING_DIR"
|
|
149
|
+
cp -R "$PACKAGE_DIR/"* "$STAGING_DIR/"
|
|
150
|
+
|
|
151
|
+
# 依赖处理:所有 production dependencies 都声明为 bundledDependencies,
|
|
152
|
+
# npm pack 时已打包进 tgz,解压后 node_modules/ 已包含全部依赖,无需 npm install。
|
|
153
|
+
# 注意:不能执行 npm install,否则会安装 peerDependencies(openclaw 平台及其 400+ 传递依赖),
|
|
154
|
+
# 导致插件目录膨胀到 900MB+,而这些依赖在运行时由宿主 openclaw 提供。
|
|
155
|
+
if [ -d "$STAGING_DIR/node_modules" ]; then
|
|
156
|
+
BUNDLED_COUNT=$(ls -d "$STAGING_DIR/node_modules"/*/ "$STAGING_DIR/node_modules"/@*/*/ 2>/dev/null | wc -l | tr -d ' ')
|
|
157
|
+
echo " bundled 依赖已就绪(${BUNDLED_COUNT} 个包)"
|
|
158
|
+
else
|
|
159
|
+
echo " ⚠️ 未找到 bundled node_modules,尝试安装依赖..."
|
|
160
|
+
NPM_TMP_CACHE=$(mktemp -d)
|
|
161
|
+
(cd "$STAGING_DIR" && npm install --omit=dev --omit=peer --ignore-scripts --cache="$NPM_TMP_CACHE" --quiet 2>&1) || echo " ⚠️ 依赖安装失败"
|
|
162
|
+
rm -rf "$NPM_TMP_CACHE"
|
|
163
|
+
fi
|
|
164
|
+
|
|
165
|
+
# 清理下载临时文件
|
|
166
|
+
rm -rf "$TMPDIR_PACK" "$EXTRACT_DIR"
|
|
167
|
+
cd "$HOME"
|
|
168
|
+
|
|
169
|
+
# [2/3] 原子替换:使用 mv -T/rename 确保目录切换尽可能原子
|
|
170
|
+
# 策略:先把 staging 放到 extensions/ 同级的临时名,再做单次 mv 替换
|
|
171
|
+
echo ""
|
|
172
|
+
echo "[2/3] 原子替换插件目录..."
|
|
173
|
+
TARGET_DIR="$EXTENSIONS_DIR/openclaw-qqbot"
|
|
174
|
+
OLD_DIR="$(dirname "$EXTENSIONS_DIR")/.qqbot-upgrade-old"
|
|
175
|
+
|
|
176
|
+
rm -rf "$OLD_DIR"
|
|
177
|
+
|
|
178
|
+
# 先把 staging 目录移到 extensions/ 下的临时位置(同文件系统,确保 mv 是 rename 操作)
|
|
179
|
+
STAGING_IN_EXT="$EXTENSIONS_DIR/.openclaw-qqbot-new"
|
|
180
|
+
rm -rf "$STAGING_IN_EXT"
|
|
181
|
+
mv "$STAGING_DIR" "$STAGING_IN_EXT"
|
|
182
|
+
|
|
183
|
+
if [ -d "$TARGET_DIR" ]; then
|
|
184
|
+
# 使用连续两个 mv 但中间零操作,最小化目录不存在的时间窗口
|
|
185
|
+
mv "$TARGET_DIR" "$OLD_DIR" && mv "$STAGING_IN_EXT" "$TARGET_DIR"
|
|
186
|
+
else
|
|
187
|
+
mv "$STAGING_IN_EXT" "$TARGET_DIR"
|
|
188
|
+
fi
|
|
189
|
+
rm -rf "$OLD_DIR"
|
|
190
|
+
|
|
191
|
+
# 清理可能残留的旧版 staging 目录(extensions 内外都清理)
|
|
192
|
+
rm -rf "$EXTENSIONS_DIR/openclaw-qqbot.staging"
|
|
193
|
+
rm -rf "$EXTENSIONS_DIR/.qqbot-upgrade-staging"
|
|
194
|
+
rm -rf "$EXTENSIONS_DIR/.qqbot-upgrade-old"
|
|
195
|
+
|
|
196
|
+
# 同时清理历史遗留的其他目录名
|
|
197
|
+
for dir_name in qqbot openclaw-qq; do
|
|
198
|
+
[ -d "$EXTENSIONS_DIR/$dir_name" ] && rm -rf "$EXTENSIONS_DIR/$dir_name"
|
|
199
|
+
done
|
|
200
|
+
echo " 已安装到: $TARGET_DIR"
|
|
201
|
+
|
|
202
|
+
# [3/3] 输出新版本号和升级报告(供调用方解析)
|
|
203
|
+
echo ""
|
|
204
|
+
echo "[3/3] 验证安装..."
|
|
205
|
+
NEW_VERSION="$(node -e "
|
|
206
|
+
try {
|
|
207
|
+
const fs = require('fs');
|
|
208
|
+
const path = require('path');
|
|
209
|
+
const p = path.join('$EXTENSIONS_DIR', 'openclaw-qqbot', 'package.json');
|
|
210
|
+
if (fs.existsSync(p)) {
|
|
211
|
+
const v = JSON.parse(fs.readFileSync(p, 'utf8')).version;
|
|
212
|
+
if (v) { process.stdout.write(v); process.exit(0); }
|
|
213
|
+
}
|
|
214
|
+
} catch {}
|
|
215
|
+
" 2>/dev/null || true)"
|
|
216
|
+
echo "QQBOT_NEW_VERSION=${NEW_VERSION:-unknown}"
|
|
217
|
+
|
|
218
|
+
# 输出结构化升级报告(QQBOT_REPORT=...),供 TS handler 解析后直接回复用户
|
|
219
|
+
if [ -n "$NEW_VERSION" ] && [ "$NEW_VERSION" != "unknown" ]; then
|
|
220
|
+
echo "QQBOT_REPORT=✅ QQBot 升级完成: v${NEW_VERSION}"
|
|
221
|
+
else
|
|
222
|
+
echo "QQBOT_REPORT=⚠️ QQBot 升级异常,无法确认新版本"
|
|
223
|
+
fi
|
|
224
|
+
|
|
225
|
+
echo ""
|
|
226
|
+
echo "==========================================="
|
|
227
|
+
echo " ✅ 文件安装完成"
|
|
228
|
+
echo "==========================================="
|
|
229
|
+
|
|
230
|
+
# --no-restart 模式(热更新场景):文件替换完成后立即退出,
|
|
231
|
+
# 让调用方尽快触发 gateway restart,避免 openclaw 配置轮询
|
|
232
|
+
# 在旧进程中检测到插件变更产生 "plugin not found" warning 刷屏。
|
|
233
|
+
# appid/secret 配置在热更新场景下已经存在,无需重新写入。
|
|
234
|
+
if [ "$NO_RESTART" = "true" ]; then
|
|
235
|
+
echo ""
|
|
236
|
+
echo "[跳过重启] --no-restart 已指定,脚本立即退出以便调用方触发 gateway restart"
|
|
237
|
+
exit 0
|
|
238
|
+
fi
|
|
239
|
+
|
|
240
|
+
# 以下步骤仅在非热更新(手动执行)场景中执行
|
|
241
|
+
|
|
242
|
+
# [4/4] 配置 appid/secret(仅在提供了参数时执行)
|
|
243
|
+
if [ -n "$APPID" ] && [ -n "$SECRET" ]; then
|
|
244
|
+
echo ""
|
|
245
|
+
echo "[配置] 写入 qqbot 通道配置..."
|
|
246
|
+
DESIRED_TOKEN="${APPID}:${SECRET}"
|
|
247
|
+
|
|
248
|
+
# 读取当前已有的 token
|
|
249
|
+
CURRENT_TOKEN=""
|
|
250
|
+
for _app in openclaw clawdbot moltbot; do
|
|
251
|
+
_cfg="$HOME/.$_app/$_app.json"
|
|
252
|
+
if [ -f "$_cfg" ]; then
|
|
253
|
+
CURRENT_TOKEN=$(node -e "
|
|
254
|
+
const cfg = JSON.parse(require('fs').readFileSync('$_cfg', 'utf8'));
|
|
255
|
+
const keys = ['qqbot', 'openclaw-qqbot', 'openclaw-qq'];
|
|
256
|
+
for (const key of keys) {
|
|
257
|
+
const ch = cfg.channels && cfg.channels[key];
|
|
258
|
+
if (!ch) continue;
|
|
259
|
+
if (ch.token) { process.stdout.write(ch.token); process.exit(0); }
|
|
260
|
+
if (ch.appId && ch.clientSecret) { process.stdout.write(ch.appId + ':' + ch.clientSecret); process.exit(0); }
|
|
261
|
+
}
|
|
262
|
+
" 2>/dev/null || true)
|
|
263
|
+
[ -n "$CURRENT_TOKEN" ] && break
|
|
264
|
+
fi
|
|
265
|
+
done
|
|
266
|
+
|
|
267
|
+
if [ "$CURRENT_TOKEN" = "$DESIRED_TOKEN" ]; then
|
|
268
|
+
echo " ✅ 当前配置已是目标值,跳过写入"
|
|
269
|
+
elif $CMD channels add --channel qqbot --token "$DESIRED_TOKEN" 2>&1; then
|
|
270
|
+
echo " ✅ 通道配置写入成功"
|
|
271
|
+
else
|
|
272
|
+
echo " ⚠️ $CMD channels add 失败,尝试直接编辑配置文件..."
|
|
273
|
+
CONFIG_FILE="$HOME/.$CMD/$CMD.json"
|
|
274
|
+
if [ -f "$CONFIG_FILE" ] && node -e "
|
|
275
|
+
const fs = require('fs');
|
|
276
|
+
const cfg = JSON.parse(fs.readFileSync('$CONFIG_FILE', 'utf8'));
|
|
277
|
+
if (!cfg.channels) cfg.channels = {};
|
|
278
|
+
if (!cfg.channels.qqbot) cfg.channels.qqbot = {};
|
|
279
|
+
cfg.channels.qqbot.appId = '$APPID';
|
|
280
|
+
cfg.channels.qqbot.clientSecret = '$SECRET';
|
|
281
|
+
fs.writeFileSync('$CONFIG_FILE', JSON.stringify(cfg, null, 4) + '\n');
|
|
282
|
+
" 2>&1; then
|
|
283
|
+
echo " ✅ 通道配置写入成功(直接编辑配置文件)"
|
|
284
|
+
else
|
|
285
|
+
echo " ❌ 配置写入失败,请手动配置:"
|
|
286
|
+
echo " $CMD channels add --channel qqbot --token \"${APPID}:${SECRET}\""
|
|
287
|
+
fi
|
|
288
|
+
fi
|
|
289
|
+
elif [ -n "$APPID" ] || [ -n "$SECRET" ]; then
|
|
290
|
+
echo ""
|
|
291
|
+
echo "⚠️ --appid 和 --secret 必须同时提供"
|
|
292
|
+
fi
|
|
293
|
+
|
|
294
|
+
# [5/5] 重启 gateway 使新版本生效
|
|
295
|
+
echo ""
|
|
296
|
+
echo "[重启] 重启 gateway 使新版本生效..."
|
|
297
|
+
if $CMD gateway restart 2>&1; then
|
|
298
|
+
echo " ✅ gateway 已重启"
|
|
299
|
+
else
|
|
300
|
+
echo " ⚠️ gateway 重启失败,请手动执行: $CMD gateway restart"
|
|
301
|
+
fi
|