openclaw-agent-dashboard 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 (111) hide show
  1. package/.github/workflows/release.yml +56 -0
  2. package/README.md +302 -0
  3. package/docs/CHANGELOG_AGENT_MODIFICATIONS.md +132 -0
  4. package/docs/RELEASE-LATEST.md +189 -0
  5. package/docs/RELEASE-MODEL-CONFIG.md +95 -0
  6. package/docs/release-guide.md +259 -0
  7. package/docs/release-operations-manual.md +167 -0
  8. package/docs/specs/tr3-install-system.md +580 -0
  9. package/docs/windows-collaboration-model-paths-troubleshooting.md +0 -0
  10. package/frontend/index.html +12 -0
  11. package/frontend/package-lock.json +1240 -0
  12. package/frontend/package.json +19 -0
  13. package/frontend/src/App.vue +331 -0
  14. package/frontend/src/components/AgentCard.vue +796 -0
  15. package/frontend/src/components/AgentConfigPanel.vue +539 -0
  16. package/frontend/src/components/AgentDetailPanel.vue +738 -0
  17. package/frontend/src/components/ErrorAnalysisView.vue +546 -0
  18. package/frontend/src/components/ErrorCenterPanel.vue +844 -0
  19. package/frontend/src/components/PerformanceMonitor.vue +515 -0
  20. package/frontend/src/components/SettingsPanel.vue +236 -0
  21. package/frontend/src/components/TokenAnalysisPanel.vue +683 -0
  22. package/frontend/src/components/chain/ChainEdge.vue +85 -0
  23. package/frontend/src/components/chain/ChainNode.vue +166 -0
  24. package/frontend/src/components/chain/TaskChainView.vue +425 -0
  25. package/frontend/src/components/chain/index.ts +3 -0
  26. package/frontend/src/components/chain/types.ts +70 -0
  27. package/frontend/src/components/collaboration/CollaborationFlowSection.vue +1032 -0
  28. package/frontend/src/components/collaboration/CollaborationFlowWrapper.vue +113 -0
  29. package/frontend/src/components/performance/PerformancePanel.vue +119 -0
  30. package/frontend/src/components/performance/PerformanceSection.vue +1137 -0
  31. package/frontend/src/components/tasks/TaskStatusSection.vue +973 -0
  32. package/frontend/src/components/timeline/TimelineConnector.vue +31 -0
  33. package/frontend/src/components/timeline/TimelineRound.vue +135 -0
  34. package/frontend/src/components/timeline/TimelineStep.vue +691 -0
  35. package/frontend/src/components/timeline/TimelineToolLink.vue +109 -0
  36. package/frontend/src/components/timeline/TimelineView.vue +540 -0
  37. package/frontend/src/components/timeline/index.ts +5 -0
  38. package/frontend/src/components/timeline/types.ts +120 -0
  39. package/frontend/src/composables/index.ts +7 -0
  40. package/frontend/src/composables/useDebounce.ts +48 -0
  41. package/frontend/src/composables/useRealtime.ts +52 -0
  42. package/frontend/src/composables/useState.ts +52 -0
  43. package/frontend/src/composables/useThrottle.ts +46 -0
  44. package/frontend/src/composables/useVirtualScroll.ts +106 -0
  45. package/frontend/src/main.ts +4 -0
  46. package/frontend/src/managers/EventDispatcher.ts +127 -0
  47. package/frontend/src/managers/RealtimeDataManager.ts +293 -0
  48. package/frontend/src/managers/StateManager.ts +128 -0
  49. package/frontend/src/managers/index.ts +5 -0
  50. package/frontend/src/types/collaboration.ts +135 -0
  51. package/frontend/src/types/index.ts +20 -0
  52. package/frontend/src/types/performance.ts +105 -0
  53. package/frontend/src/types/task.ts +38 -0
  54. package/frontend/vite.config.ts +18 -0
  55. package/package.json +22 -0
  56. package/plugin/README.md +99 -0
  57. package/plugin/config.json.example +1 -0
  58. package/plugin/index.js +250 -0
  59. package/plugin/openclaw.plugin.json +17 -0
  60. package/plugin/package.json +21 -0
  61. package/scripts/build-plugin.js +67 -0
  62. package/scripts/bundle.sh +62 -0
  63. package/scripts/install-plugin.sh +162 -0
  64. package/scripts/install-python-deps.js +346 -0
  65. package/scripts/install-python-deps.sh +226 -0
  66. package/scripts/install.js +512 -0
  67. package/scripts/install.sh +367 -0
  68. package/scripts/lib/common.js +490 -0
  69. package/scripts/lib/common.sh +137 -0
  70. package/scripts/release-pack.sh +110 -0
  71. package/scripts/start.js +50 -0
  72. package/scripts/test_available_models.py +284 -0
  73. package/scripts/test_websocket_ping.py +44 -0
  74. package/src/backend/agents.py +73 -0
  75. package/src/backend/api/__init__.py +1 -0
  76. package/src/backend/api/agent_config_api.py +90 -0
  77. package/src/backend/api/agents.py +73 -0
  78. package/src/backend/api/agents_config.py +75 -0
  79. package/src/backend/api/chains.py +126 -0
  80. package/src/backend/api/collaboration.py +902 -0
  81. package/src/backend/api/debug_paths.py +39 -0
  82. package/src/backend/api/error_analysis.py +146 -0
  83. package/src/backend/api/errors.py +281 -0
  84. package/src/backend/api/performance.py +784 -0
  85. package/src/backend/api/subagents.py +770 -0
  86. package/src/backend/api/timeline.py +144 -0
  87. package/src/backend/api/websocket.py +251 -0
  88. package/src/backend/collaboration.py +405 -0
  89. package/src/backend/data/__init__.py +1 -0
  90. package/src/backend/data/agent_config_manager.py +270 -0
  91. package/src/backend/data/chain_reader.py +299 -0
  92. package/src/backend/data/config_reader.py +153 -0
  93. package/src/backend/data/error_analyzer.py +430 -0
  94. package/src/backend/data/session_reader.py +445 -0
  95. package/src/backend/data/subagent_reader.py +244 -0
  96. package/src/backend/data/task_history.py +118 -0
  97. package/src/backend/data/timeline_reader.py +981 -0
  98. package/src/backend/errors.py +63 -0
  99. package/src/backend/main.py +89 -0
  100. package/src/backend/mechanism_reader.py +131 -0
  101. package/src/backend/mechanisms.py +32 -0
  102. package/src/backend/performance.py +474 -0
  103. package/src/backend/requirements.txt +5 -0
  104. package/src/backend/session_reader.py +238 -0
  105. package/src/backend/status/__init__.py +1 -0
  106. package/src/backend/status/error_detector.py +122 -0
  107. package/src/backend/status/status_calculator.py +301 -0
  108. package/src/backend/status_calculator.py +121 -0
  109. package/src/backend/subagent_reader.py +229 -0
  110. package/src/backend/watchers/__init__.py +4 -0
  111. package/src/backend/watchers/file_watcher.py +159 -0
@@ -0,0 +1,367 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # OpenClaw Agent Dashboard - 一键安装脚本
4
+ # 用法: curl -fsSL https://raw.githubusercontent.com/Umarchen/openclaw-agent-dashboard/main/scripts/install.sh | bash
5
+ # 默认安装仓库中标记为 Latest 的发布(即你最近推送的 release)。
6
+ #
7
+ # 选项:
8
+ # DASHBOARD_VERSION=x.x.x 安装指定版本 (默认: latest,即 Latest release)
9
+ # DASHBOARD_RELEASE_URL=URL 使用自定义下载地址
10
+ # DASHBOARD_SKIP_PYTHON=1 跳过 Python 依赖安装
11
+ # VERBOSE=1 显示详细输出
12
+ # DRY_RUN=1 仅预览,不执行实际安装
13
+ #
14
+ set -euo pipefail
15
+
16
+ # ============================================
17
+ # [公共函数] 与 scripts/lib/common.sh 同步
18
+ # ============================================
19
+
20
+ log_info() { echo "$1"; }
21
+ log_step() { echo ""; echo ">>> $1"; }
22
+ log_ok() { echo "✓ $1"; }
23
+ log_warn() { echo "⚠ $1"; }
24
+ log_error() { echo "❌ $1" >&2; }
25
+
26
+ run_silent() {
27
+ if [ "${VERBOSE:-0}" = "1" ]; then
28
+ "$@"
29
+ else
30
+ "$@" 2>/dev/null
31
+ fi
32
+ }
33
+
34
+ resolve_openclaw_config_dir() {
35
+ if [ -n "${OPENCLAW_STATE_DIR:-}" ]; then
36
+ echo "${OPENCLAW_STATE_DIR}"
37
+ return
38
+ fi
39
+ if [ -n "${CLAWDBOT_STATE_DIR:-}" ]; then
40
+ echo "${CLAWDBOT_STATE_DIR}"
41
+ return
42
+ fi
43
+ local home_dir="${OPENCLAW_HOME:-${HOME:-${USERPROFILE:-}}}"
44
+ if [ -z "$home_dir" ]; then
45
+ home_dir="${HOME:-}"
46
+ fi
47
+ if [[ "$home_dir" == '~'* ]]; then
48
+ home_dir="${HOME:-}${home_dir#\~}"
49
+ fi
50
+ echo "${home_dir}/.openclaw"
51
+ }
52
+
53
+ detect_os() {
54
+ case "$(uname -s 2>/dev/null)" in
55
+ Linux*) echo "linux" ;;
56
+ Darwin*) echo "macos" ;;
57
+ MINGW*|MSYS*|CYGWIN*) echo "windows" ;;
58
+ *) echo "unknown" ;;
59
+ esac
60
+ }
61
+
62
+ validate_os() {
63
+ local os="$1"
64
+ case "$os" in
65
+ linux|macos|windows)
66
+ log_info "系统: $os"
67
+ ;;
68
+ *)
69
+ log_error "不支持的系统: $(uname -s 2>/dev/null || echo 'unknown')"
70
+ log_info "支持的系统: Linux, macOS, Windows (Git Bash)"
71
+ exit 1
72
+ ;;
73
+ esac
74
+ }
75
+
76
+ download_file() {
77
+ local url="$1"
78
+ local output="$2"
79
+ log_info " 下载: $url"
80
+ if command -v curl &>/dev/null; then
81
+ if ! curl -fSL --progress-bar -o "$output" "$url"; then
82
+ return 1
83
+ fi
84
+ elif command -v wget &>/dev/null; then
85
+ if ! wget -q --show-progress -O "$output" "$url"; then
86
+ return 1
87
+ fi
88
+ else
89
+ log_error "需要 curl 或 wget 来下载文件"
90
+ exit 1
91
+ fi
92
+ return 0
93
+ }
94
+
95
+ # ============================================
96
+ # 配置
97
+ # ============================================
98
+
99
+ REPO_OWNER="Umarchen"
100
+ REPO_NAME="openclaw-agent-dashboard"
101
+ PLUGIN_ID="openclaw-agent-dashboard"
102
+
103
+ # ============================================
104
+ # 环境变量
105
+ # ============================================
106
+
107
+ VERBOSE="${VERBOSE:-0}"
108
+ DRY_RUN="${DRY_RUN:-0}"
109
+ DASHBOARD_VERSION="${DASHBOARD_VERSION:-latest}"
110
+ DASHBOARD_RELEASE_URL="${DASHBOARD_RELEASE_URL:-}"
111
+ DASHBOARD_SKIP_PYTHON="${DASHBOARD_SKIP_PYTHON:-0}"
112
+
113
+ # ============================================
114
+ # 版本解析
115
+ # ============================================
116
+
117
+ resolve_version() {
118
+ local requested="$1"
119
+
120
+ if [ "$requested" = "latest" ]; then
121
+ local api_url="https://api.github.com/repos/${REPO_OWNER}/${REPO_NAME}/releases/latest"
122
+ local latest_tag
123
+
124
+ if command -v curl &>/dev/null; then
125
+ latest_tag=$(curl -fsSL "$api_url" 2>/dev/null | grep '"tag_name"' | head -1 | sed 's/.*"tag_name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/')
126
+ elif command -v wget &>/dev/null; then
127
+ latest_tag=$(wget -qO- "$api_url" 2>/dev/null | grep '"tag_name"' | head -1 | sed 's/.*"tag_name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/')
128
+ fi
129
+
130
+ if [ -n "$latest_tag" ]; then
131
+ echo "${latest_tag#v}"
132
+ else
133
+ echo "1.0.0"
134
+ fi
135
+ else
136
+ echo "$requested"
137
+ fi
138
+ }
139
+
140
+ # ============================================
141
+ # [Python 依赖安装] 与 install-python-deps.sh 同步
142
+ # ============================================
143
+
144
+ install_python_deps_inline() {
145
+ local plugin_dir="$1"
146
+ local req_file="$plugin_dir/dashboard/requirements.txt"
147
+ local venv_dir="$plugin_dir/dashboard/.venv"
148
+ local python_deps_ok=""
149
+
150
+ if [ ! -f "$req_file" ]; then
151
+ log_warn "未找到 requirements.txt"
152
+ return 1
153
+ fi
154
+
155
+ # 策略 1: venv(推荐,不受 PEP 668 影响)
156
+ if python3 -c "import venv" 2>/dev/null; then
157
+ log_info " 尝试: venv(推荐)"
158
+ rm -rf "$venv_dir"
159
+ if python3 -m venv "$venv_dir" 2>/dev/null; then
160
+ local venv_python="$venv_dir/bin/python"
161
+ [ ! -x "$venv_python" ] && [ -x "$venv_dir/Scripts/python.exe" ] && venv_python="$venv_dir/Scripts/python.exe"
162
+ if [ -n "$venv_python" ]; then
163
+ run_silent "$venv_python" -m pip install --upgrade pip -q 2>/dev/null || true
164
+ if run_silent "$venv_python" -m pip install -r "$req_file" -q; then
165
+ python_deps_ok="venv"
166
+ fi
167
+ fi
168
+ fi
169
+ fi
170
+
171
+ # 策略 2: pip --user 兜底
172
+ if [ -z "$python_deps_ok" ]; then
173
+ log_info " 尝试: pip --user"
174
+ if run_silent python3 -m pip install -r "$req_file" -q --user; then
175
+ python_deps_ok="pip --user"
176
+ elif run_silent python3 -m pip install -r "$req_file" -q; then
177
+ python_deps_ok="pip"
178
+ elif run_silent pip install -r "$req_file" -q --user; then
179
+ python_deps_ok="pip --user"
180
+ elif run_silent pip3 install -r "$req_file" -q --user; then
181
+ python_deps_ok="pip3 --user"
182
+ fi
183
+ fi
184
+
185
+ if [ -n "$python_deps_ok" ]; then
186
+ log_ok "Python 依赖已就绪 ($python_deps_ok)"
187
+ return 0
188
+ else
189
+ log_warn "Python 依赖安装失败"
190
+ print_python_deps_help "$req_file"
191
+ return 1
192
+ fi
193
+ }
194
+
195
+ print_python_deps_help() {
196
+ local req_file="$1"
197
+ echo ""
198
+ echo "========================================"
199
+ echo "请检查以下系统依赖是否已安装:"
200
+ echo "========================================"
201
+ echo ""
202
+
203
+ # 检测系统并给出针对性建议
204
+ if [ -f /etc/debian_version ]; then
205
+ echo "检测到 Debian/Ubuntu 系统(PEP 668 限制,请用 venv 安装):"
206
+ echo ""
207
+ echo " 1. 安装 python3-venv:"
208
+ echo " sudo apt update"
209
+ echo " sudo apt install python3 python3-pip python3-venv"
210
+ echo ""
211
+ echo " 2. 在插件目录下用 venv 安装依赖(推荐):"
212
+ echo " cd ~/.openclaw/extensions/openclaw-agent-dashboard/dashboard"
213
+ echo " python3 -m venv .venv"
214
+ echo " .venv/bin/pip install -r requirements.txt"
215
+ echo ""
216
+ elif [ -f /etc/redhat-release ]; then
217
+ echo "检测到 RedHat/CentOS/Fedora 系统,请执行:"
218
+ echo ""
219
+ echo " sudo dnf install python3 python3-pip"
220
+ echo ""
221
+ elif [[ "$(uname -s)" == "Darwin" ]]; then
222
+ echo "检测到 macOS 系统,请执行:"
223
+ echo ""
224
+ echo " brew install python3"
225
+ echo ""
226
+ else
227
+ echo "请确保已安装:"
228
+ echo " - Python 3"
229
+ echo " - pip (python3-pip)"
230
+ echo " - venv 模块 (python3-venv,Linux 通常需要单独安装)"
231
+ echo ""
232
+ fi
233
+
234
+ echo "========================================"
235
+ echo "安装系统依赖后,重新执行安装:"
236
+ echo "========================================"
237
+ echo ""
238
+ echo " curl -fsSL https://raw.githubusercontent.com/Umarchen/openclaw-agent-dashboard/main/scripts/install.sh | bash"
239
+ echo ""
240
+ echo "或手动用 venv 安装 Python 依赖(Debian/Ubuntu 请用此方式):"
241
+ echo ""
242
+ echo " cd \$(dirname $req_file)"
243
+ echo " python3 -m venv .venv"
244
+ echo " .venv/bin/pip install -r requirements.txt"
245
+ echo ""
246
+ }
247
+
248
+ # ============================================
249
+ # 主流程
250
+ # ============================================
251
+
252
+ main() {
253
+ # 1. 检测系统
254
+ OS=$(detect_os)
255
+ validate_os "$OS"
256
+
257
+ # 2. 解析配置目录
258
+ OPENCLAW_CONFIG_DIR=$(resolve_openclaw_config_dir)
259
+ PLUGIN_PATH="${OPENCLAW_CONFIG_DIR}/extensions/${PLUGIN_ID}"
260
+
261
+ log_info "配置目录: $OPENCLAW_CONFIG_DIR"
262
+ log_info "插件路径: $PLUGIN_PATH"
263
+ echo ""
264
+
265
+ # 3. 检查 openclaw
266
+ if ! command -v openclaw &>/dev/null; then
267
+ log_error "未找到 openclaw 命令"
268
+ log_info "请先安装: npm install -g openclaw"
269
+ exit 1
270
+ fi
271
+
272
+ # 4. 解析版本
273
+ VERSION=$(resolve_version "$DASHBOARD_VERSION")
274
+ if [ "$DASHBOARD_VERSION" = "latest" ] && [ "$VERSION" = "1.0.0" ]; then
275
+ log_warn "无法获取最新版本,使用默认版本 1.0.0"
276
+ fi
277
+ log_info "版本: $VERSION"
278
+
279
+ # 5. 构建下载 URL
280
+ if [ -n "$DASHBOARD_RELEASE_URL" ]; then
281
+ DOWNLOAD_URL="$DASHBOARD_RELEASE_URL"
282
+ else
283
+ DOWNLOAD_URL="https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/v${VERSION}/${PLUGIN_ID}-v${VERSION}.tgz"
284
+ fi
285
+
286
+ log_info "下载地址: $DOWNLOAD_URL"
287
+
288
+ # 6. dry-run 模式
289
+ if [ "$DRY_RUN" = "1" ]; then
290
+ echo ""
291
+ log_info "[DRY-RUN] 将执行以下操作:"
292
+ log_info " - 下载: $DOWNLOAD_URL"
293
+ log_info " - 安装插件到: $PLUGIN_PATH"
294
+ if [ "$DASHBOARD_SKIP_PYTHON" != "1" ]; then
295
+ log_info " - 安装 Python 依赖到 venv 或 --user"
296
+ fi
297
+ log_ok "预览完成,未执行实际安装"
298
+ exit 0
299
+ fi
300
+
301
+ # 7. 创建临时目录
302
+ TMP_DIR=$(mktemp -d)
303
+ TGZ_FILE="$TMP_DIR/${PLUGIN_ID}.tgz"
304
+ trap 'rm -rf "$TMP_DIR"' EXIT
305
+
306
+ # 8. 下载
307
+ log_step "下载预构建包..."
308
+ if ! download_file "$DOWNLOAD_URL" "$TGZ_FILE"; then
309
+ log_error "下载失败"
310
+ log_info ""
311
+ log_info "可能的原因:"
312
+ log_info " 1. 网络连接问题"
313
+ log_info " 2. 版本不存在: v$VERSION"
314
+ log_info " 3. GitHub 访问受限"
315
+ log_info ""
316
+ log_info "尝试:"
317
+ log_info " 1. 检查网络连接"
318
+ log_info " 2. 设置代理: export https_proxy=http://proxy:port"
319
+ log_info " 3. 手动下载: curl -LO $DOWNLOAD_URL"
320
+ log_info " 4. 指定版本: DASHBOARD_VERSION=1.0.0 bash install.sh"
321
+ exit 1
322
+ fi
323
+ log_ok "下载完成"
324
+
325
+ # 9. 清理旧安装
326
+ log_step "清理旧版本..."
327
+ if [ -d "$PLUGIN_PATH" ]; then
328
+ log_info " 执行: openclaw plugins uninstall $PLUGIN_ID"
329
+ if run_silent openclaw plugins uninstall "$PLUGIN_ID" --force; then
330
+ log_ok " 已卸载(配置记录)"
331
+ else
332
+ log_warn " uninstall 失败(可能未注册)"
333
+ fi
334
+ rm -rf "$PLUGIN_PATH"
335
+ log_ok " 已删除旧目录"
336
+ else
337
+ log_ok " 无旧版本"
338
+ fi
339
+
340
+ # 10. 安装插件
341
+ log_step "安装插件..."
342
+ log_info " 执行: openclaw plugins install $TGZ_FILE"
343
+ if ! openclaw plugins install "$TGZ_FILE"; then
344
+ log_error "插件安装失败"
345
+ exit 1
346
+ fi
347
+ log_ok "插件已安装"
348
+
349
+ # 11. 安装 Python 依赖
350
+ if [ "$DASHBOARD_SKIP_PYTHON" != "1" ] && [ -f "$PLUGIN_PATH/dashboard/requirements.txt" ]; then
351
+ log_step "安装 Python 依赖..."
352
+ install_python_deps_inline "$PLUGIN_PATH" || true
353
+ fi
354
+
355
+ # 12. 完成
356
+ echo ""
357
+ log_ok "=== 安装完成 (v$VERSION) ==="
358
+ echo ""
359
+ log_info "执行任意 openclaw 命令(如 openclaw tui)时,Dashboard 会自动启动。"
360
+ log_info "访问地址: http://localhost:38271"
361
+ echo ""
362
+ log_info "若端口被占用,可创建 ~/.openclaw-agent-dashboard/config.json 设置端口:"
363
+ log_info ' {"port": 38271}'
364
+ echo ""
365
+ }
366
+
367
+ main "$@"