lightclawbot 1.0.2 → 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.
Files changed (51) hide show
  1. package/README.md +241 -1
  2. package/dist/public/data/scripts/check-update.9c4e848e.sh +138 -0
  3. package/dist/public/data/scripts/check-update.sh +138 -0
  4. package/dist/public/data/scripts/manifest.json +21 -0
  5. package/dist/public/data/scripts/preflight.7c5a27cd.sh +86 -0
  6. package/dist/public/data/scripts/preflight.sh +86 -0
  7. package/dist/public/data/scripts/upgrade.bd220b70.sh +214 -0
  8. package/dist/public/data/scripts/upgrade.sh +214 -0
  9. package/dist/src/channel.d.ts.map +1 -1
  10. package/dist/src/channel.js +34 -17
  11. package/dist/src/channel.js.map +1 -1
  12. package/dist/src/config.d.ts +34 -1
  13. package/dist/src/config.d.ts.map +1 -1
  14. package/dist/src/config.js +104 -6
  15. package/dist/src/config.js.map +1 -1
  16. package/dist/src/download-tool.d.ts.map +1 -1
  17. package/dist/src/download-tool.js +16 -16
  18. package/dist/src/download-tool.js.map +1 -1
  19. package/dist/src/file-storage.d.ts.map +1 -1
  20. package/dist/src/file-storage.js +3 -5
  21. package/dist/src/file-storage.js.map +1 -1
  22. package/dist/src/format-urls.d.ts +26 -0
  23. package/dist/src/format-urls.d.ts.map +1 -0
  24. package/dist/src/format-urls.js +53 -0
  25. package/dist/src/format-urls.js.map +1 -0
  26. package/dist/src/gateway.d.ts.map +1 -1
  27. package/dist/src/gateway.js +89 -39
  28. package/dist/src/gateway.js.map +1 -1
  29. package/dist/src/history/session-store.d.ts +4 -0
  30. package/dist/src/history/session-store.d.ts.map +1 -1
  31. package/dist/src/history/session-store.js +41 -0
  32. package/dist/src/history/session-store.js.map +1 -1
  33. package/dist/src/history/text-processing.d.ts.map +1 -1
  34. package/dist/src/history/text-processing.js +4 -3
  35. package/dist/src/history/text-processing.js.map +1 -1
  36. package/dist/src/inbound.d.ts.map +1 -1
  37. package/dist/src/inbound.js +38 -15
  38. package/dist/src/inbound.js.map +1 -1
  39. package/dist/src/outbound.d.ts.map +1 -1
  40. package/dist/src/outbound.js +5 -3
  41. package/dist/src/outbound.js.map +1 -1
  42. package/dist/src/socket-handlers.d.ts.map +1 -1
  43. package/dist/src/socket-handlers.js +1 -0
  44. package/dist/src/socket-handlers.js.map +1 -1
  45. package/dist/src/types.d.ts +6 -1
  46. package/dist/src/types.d.ts.map +1 -1
  47. package/dist/src/upload-tool.d.ts.map +1 -1
  48. package/dist/src/upload-tool.js +14 -19
  49. package/dist/src/upload-tool.js.map +1 -1
  50. package/package.json +6 -3
  51. 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,CAqPrE,CAAC"}
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"}
@@ -71,14 +71,14 @@ export const myAssistantPlugin = {
71
71
  cfg,
72
72
  sectionKey: CHANNEL_KEY,
73
73
  accountId,
74
- clearBaseFields: ["apiKey", "apiBaseUrl", "name"],
74
+ clearBaseFields: ["apiKeys", "apiBaseUrl", "name"],
75
75
  }),
76
- isConfigured: (account) => Boolean(account?.apiKey),
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?.apiKey),
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
- // 支持格式: dm:userId, group:groupId, 或纯 userId
114
- if (cleaned.startsWith("dm:") || cleaned.startsWith("group:")) {
115
- return `${CHANNEL_KEY}:${cleaned}`;
115
+ // dm:xxx → user:xxx (私聊)
116
+ if (cleaned.startsWith("dm:")) {
117
+ return `user:${cleaned.slice(3)}`;
116
118
  }
117
- // 默认当作私聊 userId
118
- return `${CHANNEL_KEY}:dm:${cleaned}`;
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 cleaned = id.replace(new RegExp(`^${CHANNEL_KEY}:`, "i"), "");
123
- return /^(dm|group):/.test(cleaned) || cleaned.length > 0;
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: `${CHANNEL_KEY}:dm:<userId> or ${CHANNEL_KEY}:group:<groupId>`,
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.apiKey) {
214
- delete section.apiKey;
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]?.apiKey) {
219
- delete accounts[accountId].apiKey;
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?.apiKey),
263
+ configured: Boolean(account?.allApiKeys?.length),
247
264
  tokenSource: account?.secretSource,
248
265
  running: runtime?.running ?? false,
249
266
  connected: runtime?.connected ?? false,
@@ -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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"}