lightclawbot 1.0.3 → 1.0.4
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/README.md +241 -1
- package/dist/public/data/scripts/check-update.9c4e848e.sh +138 -0
- package/dist/public/data/scripts/check-update.sh +138 -0
- package/dist/public/data/scripts/manifest.json +21 -0
- package/dist/public/data/scripts/preflight.7c5a27cd.sh +86 -0
- package/dist/public/data/scripts/preflight.sh +86 -0
- package/dist/public/data/scripts/upgrade.bd220b70.sh +214 -0
- package/dist/public/data/scripts/upgrade.sh +214 -0
- package/dist/src/channel.d.ts.map +1 -1
- package/dist/src/channel.js +34 -17
- package/dist/src/channel.js.map +1 -1
- package/dist/src/config.d.ts +34 -1
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +104 -6
- package/dist/src/config.js.map +1 -1
- package/dist/src/download-tool.d.ts.map +1 -1
- package/dist/src/download-tool.js +16 -16
- package/dist/src/download-tool.js.map +1 -1
- package/dist/src/file-storage.d.ts.map +1 -1
- package/dist/src/file-storage.js +3 -5
- package/dist/src/file-storage.js.map +1 -1
- package/dist/src/format-urls.d.ts +26 -0
- package/dist/src/format-urls.d.ts.map +1 -0
- package/dist/src/format-urls.js +53 -0
- package/dist/src/format-urls.js.map +1 -0
- package/dist/src/gateway.d.ts.map +1 -1
- package/dist/src/gateway.js +89 -39
- package/dist/src/gateway.js.map +1 -1
- package/dist/src/history/session-store.d.ts +4 -0
- package/dist/src/history/session-store.d.ts.map +1 -1
- package/dist/src/history/session-store.js +41 -0
- package/dist/src/history/session-store.js.map +1 -1
- package/dist/src/inbound.d.ts.map +1 -1
- package/dist/src/inbound.js +38 -15
- package/dist/src/inbound.js.map +1 -1
- package/dist/src/outbound.d.ts.map +1 -1
- package/dist/src/outbound.js +5 -3
- package/dist/src/outbound.js.map +1 -1
- package/dist/src/socket-handlers.d.ts.map +1 -1
- package/dist/src/socket-handlers.js +1 -0
- package/dist/src/socket-handlers.js.map +1 -1
- package/dist/src/types.d.ts +6 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/upload-tool.d.ts.map +1 -1
- package/dist/src/upload-tool.js +14 -19
- package/dist/src/upload-tool.js.map +1 -1
- package/package.json +6 -3
- package/skills/lightclaw-media/SKILL.md +330 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# ========== lightclawbot 插件前置检查脚本 ==========
|
|
4
|
+
# 用途:快速判断 lightclawbot 插件是否可用
|
|
5
|
+
# 输出:最后一行固定为 RESULT:{...} JSON,供前端解析
|
|
6
|
+
# - 可用: RESULT:{"status":"ok","version":"x.y.z"}
|
|
7
|
+
# - 缺 openclaw: RESULT:{"status":"need_openclaw","reason":"..."}
|
|
8
|
+
# - 缺 lightclawbot:RESULT:{"status":"need_install","reason":"..."}
|
|
9
|
+
#
|
|
10
|
+
# 使用方式:
|
|
11
|
+
# 本地执行: bash scripts/preflight.sh
|
|
12
|
+
# CDN 执行: bash <(curl -fsSL https://your-cdn.com/preflight.sh)
|
|
13
|
+
|
|
14
|
+
id="lightclawbot"
|
|
15
|
+
cfg="$HOME/.openclaw/openclaw.json"
|
|
16
|
+
plugin_dir="$HOME/.openclaw/extensions/${id}"
|
|
17
|
+
|
|
18
|
+
# ---------- 1. 检查 openclaw 是否可用 ----------
|
|
19
|
+
|
|
20
|
+
# 加载 nvm 环境(openclaw 可能依赖 nvm 管理的 node)
|
|
21
|
+
export NVM_DIR="$HOME/.nvm"
|
|
22
|
+
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
|
23
|
+
|
|
24
|
+
if ! command -v openclaw &>/dev/null; then
|
|
25
|
+
echo "RESULT:{\"status\":\"need_openclaw\",\"reason\":\"openclaw_not_found\"}"
|
|
26
|
+
exit 1
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
# 验证 openclaw 可执行
|
|
30
|
+
# 已知输出格式:
|
|
31
|
+
# - OpenClaw 2026.3.8 (3caab92) (新版本,带前缀 + commit hash)
|
|
32
|
+
# - OpenClaw 2026.3.2 (带前缀,无 commit hash)
|
|
33
|
+
# - 2026.3.2 (旧版本,直接输出版本号,无前缀)
|
|
34
|
+
openclaw_output=$(openclaw -v 2>/dev/null || true)
|
|
35
|
+
if ! echo "$openclaw_output" | grep -qiE '(^OpenClaw[/ ])?[0-9]+\.[0-9]+'; then
|
|
36
|
+
echo "RESULT:{\"status\":\"need_openclaw\",\"reason\":\"openclaw_not_working\"}"
|
|
37
|
+
exit 1
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
# ---------- 2. 检查配置文件是否存在 ----------
|
|
41
|
+
|
|
42
|
+
if [ ! -f "$cfg" ]; then
|
|
43
|
+
echo "RESULT:{\"status\":\"need_install\",\"reason\":\"config_not_found\"}"
|
|
44
|
+
exit 1
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
# ---------- 3. 检查插件是否已安装(目录 + package.json) ----------
|
|
48
|
+
|
|
49
|
+
if [ ! -d "$plugin_dir" ] || [ ! -f "$plugin_dir/package.json" ]; then
|
|
50
|
+
echo "RESULT:{\"status\":\"need_install\",\"reason\":\"plugin_not_installed\"}"
|
|
51
|
+
exit 1
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
# ---------- 4. 检查配置文件中插件注册是否完整 ----------
|
|
55
|
+
|
|
56
|
+
# 需要 jq 来解析 JSON
|
|
57
|
+
if ! command -v jq &>/dev/null; then
|
|
58
|
+
echo "RESULT:{\"status\":\"need_install\",\"reason\":\"jq_not_found\"}"
|
|
59
|
+
exit 1
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
# 4a. plugins.entries 中是否存在且 enabled
|
|
63
|
+
plugin_enabled=$(jq -r ".plugins.entries.\"${id}\".enabled // false" "$cfg" 2>/dev/null)
|
|
64
|
+
if [ "$plugin_enabled" != "true" ]; then
|
|
65
|
+
echo "RESULT:{\"status\":\"need_install\",\"reason\":\"plugin_not_enabled\"}"
|
|
66
|
+
exit 1
|
|
67
|
+
fi
|
|
68
|
+
|
|
69
|
+
# 4b. plugins.installs 中是否有安装记录
|
|
70
|
+
if ! jq -e ".plugins.installs.\"${id}\"" "$cfg" > /dev/null 2>&1; then
|
|
71
|
+
echo "RESULT:{\"status\":\"need_install\",\"reason\":\"plugin_install_record_missing\"}"
|
|
72
|
+
exit 1
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
# 4c. channels 中是否配置且 enabled
|
|
76
|
+
channel_enabled=$(jq -r ".channels.\"${id}\".enabled // false" "$cfg" 2>/dev/null)
|
|
77
|
+
if [ "$channel_enabled" != "true" ]; then
|
|
78
|
+
echo "RESULT:{\"status\":\"need_install\",\"reason\":\"channel_not_enabled\"}"
|
|
79
|
+
exit 1
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
# ---------- 5. 全部通过,插件可用 ----------
|
|
83
|
+
|
|
84
|
+
version=$(jq -r '.version // "unknown"' "$plugin_dir/package.json")
|
|
85
|
+
echo "RESULT:{\"status\":\"ok\",\"version\":\"${version}\"}"
|
|
86
|
+
exit 0
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
# ========== lightclawbot 插件快速安装/升级脚本 ==========
|
|
5
|
+
# 用途:跳过 openclaw plugins install 的慢路径,直接安装/升级 lightclawbot 插件
|
|
6
|
+
# 前提:openclaw 已安装且可用,npm/pnpm/jq 已安装
|
|
7
|
+
# 支持:首次安装 / 重装 / 升级,自动保留已有的 channels 配置
|
|
8
|
+
#
|
|
9
|
+
# 使用方式:
|
|
10
|
+
# 本地执行: bash scripts/upgrade.sh
|
|
11
|
+
# CDN 执行: bash <(curl -fsSL https://your-cdn.com/upgrade.sh)
|
|
12
|
+
# 传入参数: APIKEY="sk-xxx" bash <(curl -fsSL https://your-cdn.com/upgrade.sh)
|
|
13
|
+
|
|
14
|
+
echo "=== lightclawbot Plugin Installer / Upgrader ==="
|
|
15
|
+
|
|
16
|
+
# ========== 配置(支持环境变量覆盖) ==========
|
|
17
|
+
|
|
18
|
+
# npm 源:使用腾讯镜像源(可通过 NPM_REGISTRY 环境变量覆盖)
|
|
19
|
+
NPM_REGISTRY="${NPM_REGISTRY:-https://mirrors.tencent.com/npm/}"
|
|
20
|
+
|
|
21
|
+
# API Key:优先读取环境变量,为空则保留配置文件中已有的值
|
|
22
|
+
# 用法:APIKEY="sk-xxx" bash <(curl -fsSL https://your-cdn.com/upgrade.sh)
|
|
23
|
+
APIKEY="${APIKEY:-}"
|
|
24
|
+
|
|
25
|
+
# ========== 环境加载 ==========
|
|
26
|
+
|
|
27
|
+
load_env() {
|
|
28
|
+
export NVM_DIR="$HOME/.nvm"
|
|
29
|
+
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
|
30
|
+
|
|
31
|
+
if [ -z "$PNPM_HOME" ] && [ -d "$HOME/.local/share/pnpm" ]; then
|
|
32
|
+
export PNPM_HOME="$HOME/.local/share/pnpm"
|
|
33
|
+
export PATH="$PNPM_HOME:$PATH"
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
if [ ! -t 1 ]; then
|
|
37
|
+
export CI=true
|
|
38
|
+
fi
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
load_env
|
|
42
|
+
|
|
43
|
+
# 验证前置依赖
|
|
44
|
+
for cmd in npm jq openclaw; do
|
|
45
|
+
if ! command -v "$cmd" &>/dev/null; then
|
|
46
|
+
echo "Error: $cmd not found. Please install it first."
|
|
47
|
+
echo "RESULT:{\"status\":\"error\",\"error\":\"missing_dependency\",\"detail\":\"$cmd not found\"}"
|
|
48
|
+
exit 1
|
|
49
|
+
fi
|
|
50
|
+
done
|
|
51
|
+
|
|
52
|
+
# ========== 安装 / 升级 lightclawbot ==========
|
|
53
|
+
|
|
54
|
+
SCRIPT_START=$SECONDS
|
|
55
|
+
|
|
56
|
+
cfg="$HOME/.openclaw/openclaw.json"
|
|
57
|
+
id="lightclawbot"
|
|
58
|
+
spec="lightclawbot"
|
|
59
|
+
plugin_dir="$HOME/.openclaw/extensions/${id}"
|
|
60
|
+
|
|
61
|
+
# ---------- 检查是否已安装,获取本地版本 ----------
|
|
62
|
+
local_version=""
|
|
63
|
+
if [ -d "$plugin_dir" ] && [ -f "$plugin_dir/package.json" ]; then
|
|
64
|
+
local_version=$(jq -r '.version // ""' "$plugin_dir/package.json")
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
# ---------- 查询远程最新版本 ----------
|
|
68
|
+
echo "Checking latest version from registry..."
|
|
69
|
+
remote_version=$(npm view "$spec" version --registry "$NPM_REGISTRY" 2>/dev/null || true)
|
|
70
|
+
|
|
71
|
+
if [ -z "$remote_version" ]; then
|
|
72
|
+
echo "Tencent mirror failed, retrying with official registry..."
|
|
73
|
+
remote_version=$(npm view "$spec" version --registry https://registry.npmjs.org 2>/dev/null || true)
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
if [ -z "$remote_version" ]; then
|
|
77
|
+
echo "Warning: Could not fetch remote version, will proceed with install anyway"
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
# ---------- 判断安装模式 ----------
|
|
81
|
+
install_mode="install"
|
|
82
|
+
if [ -n "$local_version" ]; then
|
|
83
|
+
if [ -n "$remote_version" ] && [ "$local_version" = "$remote_version" ]; then
|
|
84
|
+
install_mode="up-to-date"
|
|
85
|
+
else
|
|
86
|
+
install_mode="upgrade"
|
|
87
|
+
fi
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
if [ "$install_mode" = "up-to-date" ]; then
|
|
91
|
+
echo "Plugin $id@$local_version is already up-to-date"
|
|
92
|
+
echo "Checking and updating configuration..."
|
|
93
|
+
# 即使版本一致,也要确保配置正确(后面会更新配置)
|
|
94
|
+
else
|
|
95
|
+
if [ "$install_mode" = "upgrade" ]; then
|
|
96
|
+
echo "Upgrading $id: $local_version -> ${remote_version:-latest}"
|
|
97
|
+
else
|
|
98
|
+
echo "Installing $id for the first time..."
|
|
99
|
+
fi
|
|
100
|
+
|
|
101
|
+
# ---------- 清理旧版本 ----------
|
|
102
|
+
echo "Cleaning up old installation..."
|
|
103
|
+
rm -rf "$plugin_dir"
|
|
104
|
+
|
|
105
|
+
# ---------- npm pack 下载 tgz ----------
|
|
106
|
+
tmp_dir=$(mktemp -d /tmp/openclaw-plugin-XXXXXX)
|
|
107
|
+
echo "Downloading $spec from Tencent mirror..."
|
|
108
|
+
|
|
109
|
+
tgz_file=$(cd "$tmp_dir" && npm pack "$spec" --registry "$NPM_REGISTRY" 2>/dev/null | tail -n1)
|
|
110
|
+
if [ -z "$tgz_file" ] || [ ! -f "$tmp_dir/$tgz_file" ]; then
|
|
111
|
+
echo "Tencent mirror failed, retrying with official registry..."
|
|
112
|
+
tgz_file=$(cd "$tmp_dir" && npm pack "$spec" --registry https://registry.npmjs.org 2>/dev/null | tail -n1)
|
|
113
|
+
fi
|
|
114
|
+
if [ -z "$tgz_file" ] || [ ! -f "$tmp_dir/$tgz_file" ]; then
|
|
115
|
+
echo "Error: failed to download $spec"
|
|
116
|
+
echo "RESULT:{\"status\":\"error\",\"error\":\"download_failed\",\"detail\":\"failed to download $spec\"}"
|
|
117
|
+
rm -rf "$tmp_dir"
|
|
118
|
+
exit 1
|
|
119
|
+
fi
|
|
120
|
+
|
|
121
|
+
# ---------- 解压到插件目录 ----------
|
|
122
|
+
mkdir -p "$plugin_dir"
|
|
123
|
+
tar -xzf "$tmp_dir/$tgz_file" -C "$plugin_dir" --strip-components=1
|
|
124
|
+
rm -rf "$tmp_dir"
|
|
125
|
+
|
|
126
|
+
# ---------- 安装生产依赖 ----------
|
|
127
|
+
# lightclawbot 声明了 bundledDependencies,npm pack 产出的 tgz 已包含所有依赖
|
|
128
|
+
has_unbundled_deps=false
|
|
129
|
+
if jq -e '.dependencies | length > 0' "$plugin_dir/package.json" > /dev/null 2>&1; then
|
|
130
|
+
bundled_count=$(jq -r '.bundledDependencies // .bundleDependencies // [] | length' "$plugin_dir/package.json")
|
|
131
|
+
dep_count=$(jq -r '.dependencies | length' "$plugin_dir/package.json")
|
|
132
|
+
if [ "$bundled_count" -lt "$dep_count" ]; then
|
|
133
|
+
has_unbundled_deps=true
|
|
134
|
+
fi
|
|
135
|
+
fi
|
|
136
|
+
|
|
137
|
+
if [ "$has_unbundled_deps" = true ]; then
|
|
138
|
+
echo "Installing dependencies for $id..."
|
|
139
|
+
(cd "$plugin_dir" && CI=true pnpm install --prod)
|
|
140
|
+
else
|
|
141
|
+
echo "All dependencies bundled for $id, skipping dependency install"
|
|
142
|
+
fi
|
|
143
|
+
fi
|
|
144
|
+
|
|
145
|
+
# ========== 更新配置文件 ==========
|
|
146
|
+
|
|
147
|
+
version=$(jq -r '.version // "unknown"' "$plugin_dir/package.json")
|
|
148
|
+
|
|
149
|
+
if [ -f "$cfg" ]; then
|
|
150
|
+
echo "Updating configuration..."
|
|
151
|
+
|
|
152
|
+
# 1) 基础配置:plugins.entries + plugins.installs
|
|
153
|
+
jq ".plugins.entries.\"${id}\" = {\"enabled\": true} | .plugins.installs.\"${id}\" = {\"source\": \"npm\", \"spec\": \"${spec}\", \"installPath\": \"${plugin_dir}\", \"version\": \"${version}\", \"installedAt\": \"$(date -u +%Y-%m-%dT%H:%M:%S.000Z)\"}" "$cfg" > "$cfg.tmp" && mv "$cfg.tmp" "$cfg"
|
|
154
|
+
|
|
155
|
+
# 2) 确保插件在 allow 白名单中
|
|
156
|
+
if ! jq -e ".plugins.allow // [] | index(\"${id}\")" "$cfg" > /dev/null 2>&1; then
|
|
157
|
+
jq ".plugins.allow = ((.plugins.allow // []) + [\"${id}\"])" "$cfg" > "$cfg.tmp" && mv "$cfg.tmp" "$cfg"
|
|
158
|
+
fi
|
|
159
|
+
|
|
160
|
+
# 3) channel 配置:智能合并,迁移 apiKey -> apiKeys(新版本只需要 apiKeys)
|
|
161
|
+
echo "Updating channel configuration for $id..."
|
|
162
|
+
|
|
163
|
+
# 读取现有的 channel 配置
|
|
164
|
+
existing_apikey=$(jq -r ".channels.\"${id}\".apiKey // \"\"" "$cfg" 2>/dev/null || echo "")
|
|
165
|
+
existing_apikeys=$(jq -c ".channels.\"${id}\".apiKeys // []" "$cfg" 2>/dev/null || echo "[]")
|
|
166
|
+
|
|
167
|
+
# 确保 channel 基础配置存在(enabled=true),并删除旧的 apiKey 字段
|
|
168
|
+
jq ".channels.\"${id}\" = ((.channels.\"${id}\" // {}) + {\"enabled\": true}) | del(.channels.\"${id}\".apiKey)" "$cfg" > "$cfg.tmp" && mv "$cfg.tmp" "$cfg"
|
|
169
|
+
|
|
170
|
+
# 迁移:如果存在旧的 apiKey,将其加入 apiKeys 数组(去重)
|
|
171
|
+
if [ -n "$existing_apikey" ]; then
|
|
172
|
+
apikey_in_array=$(echo "$existing_apikeys" | jq --arg k "$existing_apikey" 'index($k)')
|
|
173
|
+
if [ "$apikey_in_array" = "null" ]; then
|
|
174
|
+
echo "Migrating existing apiKey to apiKeys array..."
|
|
175
|
+
jq --arg k "$existing_apikey" ".channels.\"${id}\".apiKeys = ((.channels.\"${id}\".apiKeys // []) + [\$k])" "$cfg" > "$cfg.tmp" && mv "$cfg.tmp" "$cfg"
|
|
176
|
+
else
|
|
177
|
+
echo "Existing apiKey already in apiKeys array, skipping migration"
|
|
178
|
+
fi
|
|
179
|
+
fi
|
|
180
|
+
|
|
181
|
+
# 如果通过环境变量传入了 APIKEY,确保它在 apiKeys 数组中(去重)
|
|
182
|
+
if [ -n "$APIKEY" ]; then
|
|
183
|
+
apikey_exists=$(jq -r --arg k "$APIKEY" ".channels.\"${id}\".apiKeys // [] | index(\$k)" "$cfg" 2>/dev/null || echo "null")
|
|
184
|
+
if [ "$apikey_exists" = "null" ]; then
|
|
185
|
+
echo "Adding APIKEY to apiKeys array..."
|
|
186
|
+
jq --arg k "$APIKEY" ".channels.\"${id}\".apiKeys = ((.channels.\"${id}\".apiKeys // []) + [\$k])" "$cfg" > "$cfg.tmp" && mv "$cfg.tmp" "$cfg"
|
|
187
|
+
else
|
|
188
|
+
echo "APIKEY already exists in apiKeys array"
|
|
189
|
+
fi
|
|
190
|
+
fi
|
|
191
|
+
|
|
192
|
+
# 确保 apiKeys 字段至少存在(即使为空数组)
|
|
193
|
+
jq ".channels.\"${id}\".apiKeys //= []" "$cfg" > "$cfg.tmp" && mv "$cfg.tmp" "$cfg"
|
|
194
|
+
|
|
195
|
+
echo "Channel configuration updated successfully"
|
|
196
|
+
fi
|
|
197
|
+
|
|
198
|
+
# ========== 重启 Gateway ==========
|
|
199
|
+
|
|
200
|
+
echo "Restarting openclaw gateway..."
|
|
201
|
+
openclaw gateway restart >/dev/null 2>&1 || true
|
|
202
|
+
|
|
203
|
+
elapsed=$((SECONDS - SCRIPT_START))
|
|
204
|
+
echo ""
|
|
205
|
+
if [ "$install_mode" = "up-to-date" ]; then
|
|
206
|
+
echo "=== Plugin $id@$version config refreshed in ${elapsed}s ==="
|
|
207
|
+
elif [ "$install_mode" = "upgrade" ]; then
|
|
208
|
+
echo "=== Plugin $id upgraded to $version in ${elapsed}s ==="
|
|
209
|
+
else
|
|
210
|
+
echo "=== Plugin $id@$version installed in ${elapsed}s ==="
|
|
211
|
+
fi
|
|
212
|
+
|
|
213
|
+
# 结构化结果行,供前端程序解析(固定前缀 RESULT:)
|
|
214
|
+
echo "RESULT:{\"status\":\"success\",\"mode\":\"${install_mode}\",\"version\":\"${version}\",\"elapsed\":${elapsed}}"
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
# ========== lightclawbot 插件快速安装/升级脚本 ==========
|
|
5
|
+
# 用途:跳过 openclaw plugins install 的慢路径,直接安装/升级 lightclawbot 插件
|
|
6
|
+
# 前提:openclaw 已安装且可用,npm/pnpm/jq 已安装
|
|
7
|
+
# 支持:首次安装 / 重装 / 升级,自动保留已有的 channels 配置
|
|
8
|
+
#
|
|
9
|
+
# 使用方式:
|
|
10
|
+
# 本地执行: bash scripts/upgrade.sh
|
|
11
|
+
# CDN 执行: bash <(curl -fsSL https://your-cdn.com/upgrade.sh)
|
|
12
|
+
# 传入参数: APIKEY="sk-xxx" bash <(curl -fsSL https://your-cdn.com/upgrade.sh)
|
|
13
|
+
|
|
14
|
+
echo "=== lightclawbot Plugin Installer / Upgrader ==="
|
|
15
|
+
|
|
16
|
+
# ========== 配置(支持环境变量覆盖) ==========
|
|
17
|
+
|
|
18
|
+
# npm 源:使用腾讯镜像源(可通过 NPM_REGISTRY 环境变量覆盖)
|
|
19
|
+
NPM_REGISTRY="${NPM_REGISTRY:-https://mirrors.tencent.com/npm/}"
|
|
20
|
+
|
|
21
|
+
# API Key:优先读取环境变量,为空则保留配置文件中已有的值
|
|
22
|
+
# 用法:APIKEY="sk-xxx" bash <(curl -fsSL https://your-cdn.com/upgrade.sh)
|
|
23
|
+
APIKEY="${APIKEY:-}"
|
|
24
|
+
|
|
25
|
+
# ========== 环境加载 ==========
|
|
26
|
+
|
|
27
|
+
load_env() {
|
|
28
|
+
export NVM_DIR="$HOME/.nvm"
|
|
29
|
+
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
|
30
|
+
|
|
31
|
+
if [ -z "$PNPM_HOME" ] && [ -d "$HOME/.local/share/pnpm" ]; then
|
|
32
|
+
export PNPM_HOME="$HOME/.local/share/pnpm"
|
|
33
|
+
export PATH="$PNPM_HOME:$PATH"
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
if [ ! -t 1 ]; then
|
|
37
|
+
export CI=true
|
|
38
|
+
fi
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
load_env
|
|
42
|
+
|
|
43
|
+
# 验证前置依赖
|
|
44
|
+
for cmd in npm jq openclaw; do
|
|
45
|
+
if ! command -v "$cmd" &>/dev/null; then
|
|
46
|
+
echo "Error: $cmd not found. Please install it first."
|
|
47
|
+
echo "RESULT:{\"status\":\"error\",\"error\":\"missing_dependency\",\"detail\":\"$cmd not found\"}"
|
|
48
|
+
exit 1
|
|
49
|
+
fi
|
|
50
|
+
done
|
|
51
|
+
|
|
52
|
+
# ========== 安装 / 升级 lightclawbot ==========
|
|
53
|
+
|
|
54
|
+
SCRIPT_START=$SECONDS
|
|
55
|
+
|
|
56
|
+
cfg="$HOME/.openclaw/openclaw.json"
|
|
57
|
+
id="lightclawbot"
|
|
58
|
+
spec="lightclawbot"
|
|
59
|
+
plugin_dir="$HOME/.openclaw/extensions/${id}"
|
|
60
|
+
|
|
61
|
+
# ---------- 检查是否已安装,获取本地版本 ----------
|
|
62
|
+
local_version=""
|
|
63
|
+
if [ -d "$plugin_dir" ] && [ -f "$plugin_dir/package.json" ]; then
|
|
64
|
+
local_version=$(jq -r '.version // ""' "$plugin_dir/package.json")
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
# ---------- 查询远程最新版本 ----------
|
|
68
|
+
echo "Checking latest version from registry..."
|
|
69
|
+
remote_version=$(npm view "$spec" version --registry "$NPM_REGISTRY" 2>/dev/null || true)
|
|
70
|
+
|
|
71
|
+
if [ -z "$remote_version" ]; then
|
|
72
|
+
echo "Tencent mirror failed, retrying with official registry..."
|
|
73
|
+
remote_version=$(npm view "$spec" version --registry https://registry.npmjs.org 2>/dev/null || true)
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
if [ -z "$remote_version" ]; then
|
|
77
|
+
echo "Warning: Could not fetch remote version, will proceed with install anyway"
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
# ---------- 判断安装模式 ----------
|
|
81
|
+
install_mode="install"
|
|
82
|
+
if [ -n "$local_version" ]; then
|
|
83
|
+
if [ -n "$remote_version" ] && [ "$local_version" = "$remote_version" ]; then
|
|
84
|
+
install_mode="up-to-date"
|
|
85
|
+
else
|
|
86
|
+
install_mode="upgrade"
|
|
87
|
+
fi
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
if [ "$install_mode" = "up-to-date" ]; then
|
|
91
|
+
echo "Plugin $id@$local_version is already up-to-date"
|
|
92
|
+
echo "Checking and updating configuration..."
|
|
93
|
+
# 即使版本一致,也要确保配置正确(后面会更新配置)
|
|
94
|
+
else
|
|
95
|
+
if [ "$install_mode" = "upgrade" ]; then
|
|
96
|
+
echo "Upgrading $id: $local_version -> ${remote_version:-latest}"
|
|
97
|
+
else
|
|
98
|
+
echo "Installing $id for the first time..."
|
|
99
|
+
fi
|
|
100
|
+
|
|
101
|
+
# ---------- 清理旧版本 ----------
|
|
102
|
+
echo "Cleaning up old installation..."
|
|
103
|
+
rm -rf "$plugin_dir"
|
|
104
|
+
|
|
105
|
+
# ---------- npm pack 下载 tgz ----------
|
|
106
|
+
tmp_dir=$(mktemp -d /tmp/openclaw-plugin-XXXXXX)
|
|
107
|
+
echo "Downloading $spec from Tencent mirror..."
|
|
108
|
+
|
|
109
|
+
tgz_file=$(cd "$tmp_dir" && npm pack "$spec" --registry "$NPM_REGISTRY" 2>/dev/null | tail -n1)
|
|
110
|
+
if [ -z "$tgz_file" ] || [ ! -f "$tmp_dir/$tgz_file" ]; then
|
|
111
|
+
echo "Tencent mirror failed, retrying with official registry..."
|
|
112
|
+
tgz_file=$(cd "$tmp_dir" && npm pack "$spec" --registry https://registry.npmjs.org 2>/dev/null | tail -n1)
|
|
113
|
+
fi
|
|
114
|
+
if [ -z "$tgz_file" ] || [ ! -f "$tmp_dir/$tgz_file" ]; then
|
|
115
|
+
echo "Error: failed to download $spec"
|
|
116
|
+
echo "RESULT:{\"status\":\"error\",\"error\":\"download_failed\",\"detail\":\"failed to download $spec\"}"
|
|
117
|
+
rm -rf "$tmp_dir"
|
|
118
|
+
exit 1
|
|
119
|
+
fi
|
|
120
|
+
|
|
121
|
+
# ---------- 解压到插件目录 ----------
|
|
122
|
+
mkdir -p "$plugin_dir"
|
|
123
|
+
tar -xzf "$tmp_dir/$tgz_file" -C "$plugin_dir" --strip-components=1
|
|
124
|
+
rm -rf "$tmp_dir"
|
|
125
|
+
|
|
126
|
+
# ---------- 安装生产依赖 ----------
|
|
127
|
+
# lightclawbot 声明了 bundledDependencies,npm pack 产出的 tgz 已包含所有依赖
|
|
128
|
+
has_unbundled_deps=false
|
|
129
|
+
if jq -e '.dependencies | length > 0' "$plugin_dir/package.json" > /dev/null 2>&1; then
|
|
130
|
+
bundled_count=$(jq -r '.bundledDependencies // .bundleDependencies // [] | length' "$plugin_dir/package.json")
|
|
131
|
+
dep_count=$(jq -r '.dependencies | length' "$plugin_dir/package.json")
|
|
132
|
+
if [ "$bundled_count" -lt "$dep_count" ]; then
|
|
133
|
+
has_unbundled_deps=true
|
|
134
|
+
fi
|
|
135
|
+
fi
|
|
136
|
+
|
|
137
|
+
if [ "$has_unbundled_deps" = true ]; then
|
|
138
|
+
echo "Installing dependencies for $id..."
|
|
139
|
+
(cd "$plugin_dir" && CI=true pnpm install --prod)
|
|
140
|
+
else
|
|
141
|
+
echo "All dependencies bundled for $id, skipping dependency install"
|
|
142
|
+
fi
|
|
143
|
+
fi
|
|
144
|
+
|
|
145
|
+
# ========== 更新配置文件 ==========
|
|
146
|
+
|
|
147
|
+
version=$(jq -r '.version // "unknown"' "$plugin_dir/package.json")
|
|
148
|
+
|
|
149
|
+
if [ -f "$cfg" ]; then
|
|
150
|
+
echo "Updating configuration..."
|
|
151
|
+
|
|
152
|
+
# 1) 基础配置:plugins.entries + plugins.installs
|
|
153
|
+
jq ".plugins.entries.\"${id}\" = {\"enabled\": true} | .plugins.installs.\"${id}\" = {\"source\": \"npm\", \"spec\": \"${spec}\", \"installPath\": \"${plugin_dir}\", \"version\": \"${version}\", \"installedAt\": \"$(date -u +%Y-%m-%dT%H:%M:%S.000Z)\"}" "$cfg" > "$cfg.tmp" && mv "$cfg.tmp" "$cfg"
|
|
154
|
+
|
|
155
|
+
# 2) 确保插件在 allow 白名单中
|
|
156
|
+
if ! jq -e ".plugins.allow // [] | index(\"${id}\")" "$cfg" > /dev/null 2>&1; then
|
|
157
|
+
jq ".plugins.allow = ((.plugins.allow // []) + [\"${id}\"])" "$cfg" > "$cfg.tmp" && mv "$cfg.tmp" "$cfg"
|
|
158
|
+
fi
|
|
159
|
+
|
|
160
|
+
# 3) channel 配置:智能合并,迁移 apiKey -> apiKeys(新版本只需要 apiKeys)
|
|
161
|
+
echo "Updating channel configuration for $id..."
|
|
162
|
+
|
|
163
|
+
# 读取现有的 channel 配置
|
|
164
|
+
existing_apikey=$(jq -r ".channels.\"${id}\".apiKey // \"\"" "$cfg" 2>/dev/null || echo "")
|
|
165
|
+
existing_apikeys=$(jq -c ".channels.\"${id}\".apiKeys // []" "$cfg" 2>/dev/null || echo "[]")
|
|
166
|
+
|
|
167
|
+
# 确保 channel 基础配置存在(enabled=true),并删除旧的 apiKey 字段
|
|
168
|
+
jq ".channels.\"${id}\" = ((.channels.\"${id}\" // {}) + {\"enabled\": true}) | del(.channels.\"${id}\".apiKey)" "$cfg" > "$cfg.tmp" && mv "$cfg.tmp" "$cfg"
|
|
169
|
+
|
|
170
|
+
# 迁移:如果存在旧的 apiKey,将其加入 apiKeys 数组(去重)
|
|
171
|
+
if [ -n "$existing_apikey" ]; then
|
|
172
|
+
apikey_in_array=$(echo "$existing_apikeys" | jq --arg k "$existing_apikey" 'index($k)')
|
|
173
|
+
if [ "$apikey_in_array" = "null" ]; then
|
|
174
|
+
echo "Migrating existing apiKey to apiKeys array..."
|
|
175
|
+
jq --arg k "$existing_apikey" ".channels.\"${id}\".apiKeys = ((.channels.\"${id}\".apiKeys // []) + [\$k])" "$cfg" > "$cfg.tmp" && mv "$cfg.tmp" "$cfg"
|
|
176
|
+
else
|
|
177
|
+
echo "Existing apiKey already in apiKeys array, skipping migration"
|
|
178
|
+
fi
|
|
179
|
+
fi
|
|
180
|
+
|
|
181
|
+
# 如果通过环境变量传入了 APIKEY,确保它在 apiKeys 数组中(去重)
|
|
182
|
+
if [ -n "$APIKEY" ]; then
|
|
183
|
+
apikey_exists=$(jq -r --arg k "$APIKEY" ".channels.\"${id}\".apiKeys // [] | index(\$k)" "$cfg" 2>/dev/null || echo "null")
|
|
184
|
+
if [ "$apikey_exists" = "null" ]; then
|
|
185
|
+
echo "Adding APIKEY to apiKeys array..."
|
|
186
|
+
jq --arg k "$APIKEY" ".channels.\"${id}\".apiKeys = ((.channels.\"${id}\".apiKeys // []) + [\$k])" "$cfg" > "$cfg.tmp" && mv "$cfg.tmp" "$cfg"
|
|
187
|
+
else
|
|
188
|
+
echo "APIKEY already exists in apiKeys array"
|
|
189
|
+
fi
|
|
190
|
+
fi
|
|
191
|
+
|
|
192
|
+
# 确保 apiKeys 字段至少存在(即使为空数组)
|
|
193
|
+
jq ".channels.\"${id}\".apiKeys //= []" "$cfg" > "$cfg.tmp" && mv "$cfg.tmp" "$cfg"
|
|
194
|
+
|
|
195
|
+
echo "Channel configuration updated successfully"
|
|
196
|
+
fi
|
|
197
|
+
|
|
198
|
+
# ========== 重启 Gateway ==========
|
|
199
|
+
|
|
200
|
+
echo "Restarting openclaw gateway..."
|
|
201
|
+
openclaw gateway restart >/dev/null 2>&1 || true
|
|
202
|
+
|
|
203
|
+
elapsed=$((SECONDS - SCRIPT_START))
|
|
204
|
+
echo ""
|
|
205
|
+
if [ "$install_mode" = "up-to-date" ]; then
|
|
206
|
+
echo "=== Plugin $id@$version config refreshed in ${elapsed}s ==="
|
|
207
|
+
elif [ "$install_mode" = "upgrade" ]; then
|
|
208
|
+
echo "=== Plugin $id upgraded to $version in ${elapsed}s ==="
|
|
209
|
+
else
|
|
210
|
+
echo "=== Plugin $id@$version installed in ${elapsed}s ==="
|
|
211
|
+
fi
|
|
212
|
+
|
|
213
|
+
# 结构化结果行,供前端程序解析(固定前缀 RESULT:)
|
|
214
|
+
echo "RESULT:{\"status\":\"success\",\"mode\":\"${install_mode}\",\"version\":\"${version}\",\"elapsed\":${elapsed}}"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,aAAa,EAKnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAqC3D,eAAO,MAAM,iBAAiB,EAAE,aAAa,CAAC,wBAAwB,
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,aAAa,EAKnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAqC3D,eAAO,MAAM,iBAAiB,EAAE,aAAa,CAAC,wBAAwB,CAqQrE,CAAC"}
|
package/dist/src/channel.js
CHANGED
|
@@ -71,14 +71,14 @@ export const myAssistantPlugin = {
|
|
|
71
71
|
cfg,
|
|
72
72
|
sectionKey: CHANNEL_KEY,
|
|
73
73
|
accountId,
|
|
74
|
-
clearBaseFields: ["
|
|
74
|
+
clearBaseFields: ["apiKeys", "apiBaseUrl", "name"],
|
|
75
75
|
}),
|
|
76
|
-
isConfigured: (account) => Boolean(account?.
|
|
76
|
+
isConfigured: (account) => Boolean(account?.allApiKeys?.length),
|
|
77
77
|
describeAccount: (account) => ({
|
|
78
78
|
accountId: account?.accountId ?? DEFAULT_ACCOUNT_ID,
|
|
79
79
|
name: account?.name,
|
|
80
80
|
enabled: account?.enabled ?? false,
|
|
81
|
-
configured: Boolean(account?.
|
|
81
|
+
configured: Boolean(account?.allApiKeys?.length),
|
|
82
82
|
tokenSource: account?.secretSource,
|
|
83
83
|
}),
|
|
84
84
|
resolveAllowFrom: ({ cfg, accountId }) => {
|
|
@@ -105,24 +105,41 @@ export const myAssistantPlugin = {
|
|
|
105
105
|
},
|
|
106
106
|
},
|
|
107
107
|
// ---- 消息目标解析 ----
|
|
108
|
+
// 使用标准 user:/channel: 前缀,确保框架的 detectTargetKind 能正确识别 peer kind
|
|
108
109
|
messaging: {
|
|
109
110
|
normalizeTarget: (target) => {
|
|
111
|
+
// 剥离通道名前缀 (lightclawbot:)
|
|
110
112
|
const cleaned = target.replace(new RegExp(`^${CHANNEL_KEY}:`, "i"), "");
|
|
111
113
|
if (!cleaned)
|
|
112
114
|
return undefined;
|
|
113
|
-
//
|
|
114
|
-
if (cleaned.startsWith("dm:")
|
|
115
|
-
return
|
|
115
|
+
// dm:xxx → user:xxx (私聊)
|
|
116
|
+
if (cleaned.startsWith("dm:")) {
|
|
117
|
+
return `user:${cleaned.slice(3)}`;
|
|
116
118
|
}
|
|
117
|
-
//
|
|
118
|
-
|
|
119
|
+
// group:xxx → channel:xxx (群聊)
|
|
120
|
+
if (cleaned.startsWith("group:")) {
|
|
121
|
+
return `channel:${cleaned.slice(6)}`;
|
|
122
|
+
}
|
|
123
|
+
// 已经是标准格式 user:/channel:,原样返回
|
|
124
|
+
if (/^(user|channel):/i.test(cleaned)) {
|
|
125
|
+
return cleaned;
|
|
126
|
+
}
|
|
127
|
+
// 纯 ID,默认当作私聊
|
|
128
|
+
return `user:${cleaned}`;
|
|
119
129
|
},
|
|
120
130
|
targetResolver: {
|
|
121
|
-
looksLikeId: (id) => {
|
|
122
|
-
const
|
|
123
|
-
|
|
131
|
+
looksLikeId: (id, normalized) => {
|
|
132
|
+
const value = (normalized ?? id).trim();
|
|
133
|
+
if (!value)
|
|
134
|
+
return false;
|
|
135
|
+
// 标准前缀格式
|
|
136
|
+
if (/^(user|channel):/i.test(value))
|
|
137
|
+
return true;
|
|
138
|
+
// lightclawbot 自有格式
|
|
139
|
+
const cleaned = value.replace(new RegExp(`^${CHANNEL_KEY}:`, "i"), "");
|
|
140
|
+
return /^(dm|group):\d+/.test(cleaned) || /^\d+$/.test(cleaned);
|
|
124
141
|
},
|
|
125
|
-
hint:
|
|
142
|
+
hint: `user:<userId> or channel:<groupId>`,
|
|
126
143
|
},
|
|
127
144
|
},
|
|
128
145
|
// ---- 出站消息适配器 ----
|
|
@@ -210,13 +227,13 @@ export const myAssistantPlugin = {
|
|
|
210
227
|
const section = nextCfg.channels?.[CHANNEL_KEY];
|
|
211
228
|
let cleared = false;
|
|
212
229
|
if (section) {
|
|
213
|
-
if (accountId === DEFAULT_ACCOUNT_ID && section.
|
|
214
|
-
delete section.
|
|
230
|
+
if (accountId === DEFAULT_ACCOUNT_ID && section.apiKeys) {
|
|
231
|
+
delete section.apiKeys;
|
|
215
232
|
cleared = true;
|
|
216
233
|
}
|
|
217
234
|
const accounts = section.accounts;
|
|
218
|
-
if (accounts?.[accountId]?.
|
|
219
|
-
delete accounts[accountId].
|
|
235
|
+
if (accounts?.[accountId]?.apiKeys) {
|
|
236
|
+
delete accounts[accountId].apiKeys;
|
|
220
237
|
cleared = true;
|
|
221
238
|
}
|
|
222
239
|
}
|
|
@@ -243,7 +260,7 @@ export const myAssistantPlugin = {
|
|
|
243
260
|
accountId: account?.accountId ?? DEFAULT_ACCOUNT_ID,
|
|
244
261
|
name: account?.name,
|
|
245
262
|
enabled: account?.enabled ?? false,
|
|
246
|
-
configured: Boolean(account?.
|
|
263
|
+
configured: Boolean(account?.allApiKeys?.length),
|
|
247
264
|
tokenSource: account?.secretSource,
|
|
248
265
|
running: runtime?.running ?? false,
|
|
249
266
|
connected: runtime?.connected ?? false,
|
package/dist/src/channel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"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"}
|