openclaw-agent-dashboard 1.0.21 → 1.0.23
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 +55 -321
- package/frontend-dist/assets/index-B7XqKAxm.css +1 -0
- package/frontend-dist/assets/index-CxJaSYyo.js +24 -0
- package/{frontend → frontend-dist}/index.html +2 -1
- package/{plugin/openclaw.plugin.json → openclaw.plugin.json} +2 -2
- package/package.json +21 -13
- package/.github/workflows/release.yml +0 -56
- package/VERSION_DISPLAY_delivery.md +0 -242
- package/VERSION_DISPLAY_implementation_summary.md +0 -315
- package/design_manifest.md +0 -100
- package/docs/CHANGELOG_AGENT_MODIFICATIONS.md +0 -132
- package/docs/MAINTAINER_RELEASE_WORKFLOW.md +0 -211
- package/docs/Openclaw-Agent-Dashboard/345/217/221/345/270/203/344/270/216/346/233/264/346/226/260.md +0 -147
- package/docs/RELEASE-LATEST.md +0 -189
- package/docs/RELEASE-MODEL-CONFIG.md +0 -95
- package/docs/WINDOWS_INSTALL_TROUBLESHOOTING.md +0 -171
- package/docs/design/.gitkeep +0 -0
- package/docs/design/VERSION_DISPLAY_design.md +0 -1236
- package/docs/release-guide.md +0 -259
- package/docs/release-operations-manual.md +0 -167
- package/docs/reviews/.gitkeep +0 -0
- package/docs/reviews/approval_history.json +0 -14
- package/docs/reviews/cr_VERSION_DISPLAY.md +0 -397
- package/docs/reviews/traceability_manifest.json +0 -279
- package/docs/specs/VERSION_DISPLAY_spec.md +0 -371
- package/docs/specs/tr3-install-system.md +0 -580
- package/docs/windows-collaboration-model-paths-troubleshooting.md +0 -0
- package/frontend/package-lock.json +0 -1240
- package/frontend/package.json +0 -19
- package/frontend/src/App.vue +0 -355
- package/frontend/src/components/AgentCard.vue +0 -796
- package/frontend/src/components/AgentConfigPanel.vue +0 -539
- package/frontend/src/components/AgentDetailPanel.vue +0 -738
- package/frontend/src/components/ErrorAnalysisView.vue +0 -546
- package/frontend/src/components/ErrorCenterPanel.vue +0 -844
- package/frontend/src/components/PerformanceMonitor.vue +0 -515
- package/frontend/src/components/SettingsPanel.vue +0 -236
- package/frontend/src/components/TokenAnalysisPanel.vue +0 -683
- package/frontend/src/components/chain/ChainEdge.vue +0 -85
- package/frontend/src/components/chain/ChainNode.vue +0 -166
- package/frontend/src/components/chain/TaskChainView.vue +0 -425
- package/frontend/src/components/chain/index.ts +0 -3
- package/frontend/src/components/chain/types.ts +0 -70
- package/frontend/src/components/collaboration/CollaborationFlowSection.vue +0 -1032
- package/frontend/src/components/collaboration/CollaborationFlowWrapper.vue +0 -113
- package/frontend/src/components/common/VersionDisplay.vue +0 -187
- package/frontend/src/components/performance/PerformancePanel.vue +0 -119
- package/frontend/src/components/performance/PerformanceSection.vue +0 -1137
- package/frontend/src/components/tasks/TaskStatusSection.vue +0 -973
- package/frontend/src/components/timeline/TimelineConnector.vue +0 -31
- package/frontend/src/components/timeline/TimelineRound.vue +0 -135
- package/frontend/src/components/timeline/TimelineStep.vue +0 -691
- package/frontend/src/components/timeline/TimelineToolLink.vue +0 -109
- package/frontend/src/components/timeline/TimelineView.vue +0 -540
- package/frontend/src/components/timeline/index.ts +0 -5
- package/frontend/src/components/timeline/types.ts +0 -120
- package/frontend/src/composables/index.ts +0 -7
- package/frontend/src/composables/useDebounce.ts +0 -48
- package/frontend/src/composables/useRealtime.ts +0 -52
- package/frontend/src/composables/useState.ts +0 -52
- package/frontend/src/composables/useThrottle.ts +0 -46
- package/frontend/src/composables/useVirtualScroll.ts +0 -106
- package/frontend/src/main.ts +0 -4
- package/frontend/src/managers/EventDispatcher.ts +0 -127
- package/frontend/src/managers/RealtimeDataManager.ts +0 -302
- package/frontend/src/managers/StateManager.ts +0 -128
- package/frontend/src/managers/index.ts +0 -5
- package/frontend/src/types/collaboration.ts +0 -135
- package/frontend/src/types/index.ts +0 -20
- package/frontend/src/types/performance.ts +0 -105
- package/frontend/src/types/task.ts +0 -38
- package/frontend/vite.config.ts +0 -18
- package/legacy_code_anatomy.md +0 -518
- package/plugin/README.md +0 -99
- package/plugin/config.json.example +0 -1
- package/plugin/package.json +0 -26
- package/scripts/build-plugin.js +0 -81
- package/scripts/bundle.sh +0 -62
- package/scripts/install-plugin.sh +0 -162
- package/scripts/install-python-deps.sh +0 -226
- package/scripts/install.js +0 -684
- package/scripts/install.sh +0 -367
- package/scripts/lib/common.sh +0 -137
- package/scripts/release-pack.sh +0 -110
- package/scripts/start.js +0 -50
- package/scripts/test_available_models.py +0 -284
- package/scripts/test_version_display.sh +0 -128
- package/scripts/test_websocket_ping.py +0 -44
- package/session_registry.json +0 -58
- package/tests/.gitkeep +0 -0
- package/tests/qa_regression_report.md +0 -359
- package/tests/qa_version_display_report.md +0 -598
- /package/{src/backend → dashboard}/agents.py +0 -0
- /package/{src/backend → dashboard}/api/__init__.py +0 -0
- /package/{src/backend → dashboard}/api/agent_config_api.py +0 -0
- /package/{src/backend → dashboard}/api/agents.py +0 -0
- /package/{src/backend → dashboard}/api/agents_config.py +0 -0
- /package/{src/backend → dashboard}/api/chains.py +0 -0
- /package/{src/backend → dashboard}/api/collaboration.py +0 -0
- /package/{src/backend → dashboard}/api/debug_paths.py +0 -0
- /package/{src/backend → dashboard}/api/error_analysis.py +0 -0
- /package/{src/backend → dashboard}/api/errors.py +0 -0
- /package/{src/backend → dashboard}/api/performance.py +0 -0
- /package/{src/backend → dashboard}/api/subagents.py +0 -0
- /package/{src/backend → dashboard}/api/timeline.py +0 -0
- /package/{src/backend → dashboard}/api/version.py +0 -0
- /package/{src/backend → dashboard}/api/websocket.py +0 -0
- /package/{src/backend → dashboard}/collaboration.py +0 -0
- /package/{src/backend → dashboard}/data/__init__.py +0 -0
- /package/{src/backend → dashboard}/data/agent_config_manager.py +0 -0
- /package/{src/backend → dashboard}/data/chain_reader.py +0 -0
- /package/{src/backend → dashboard}/data/config_reader.py +0 -0
- /package/{src/backend → dashboard}/data/error_analyzer.py +0 -0
- /package/{src/backend → dashboard}/data/session_reader.py +0 -0
- /package/{src/backend → dashboard}/data/subagent_reader.py +0 -0
- /package/{src/backend → dashboard}/data/task_history.py +0 -0
- /package/{src/backend → dashboard}/data/timeline_reader.py +0 -0
- /package/{src/backend → dashboard}/data/version_info_reader.py +0 -0
- /package/{src/backend → dashboard}/errors.py +0 -0
- /package/{src/backend → dashboard}/main.py +0 -0
- /package/{src/backend → dashboard}/mechanism_reader.py +0 -0
- /package/{src/backend → dashboard}/mechanisms.py +0 -0
- /package/{src/backend → dashboard}/performance.py +0 -0
- /package/{src/backend → dashboard}/requirements.txt +0 -0
- /package/{src/backend → dashboard}/session_reader.py +0 -0
- /package/{src/backend → dashboard}/status/__init__.py +0 -0
- /package/{src/backend → dashboard}/status/change_tracker.py +0 -0
- /package/{src/backend → dashboard}/status/error_detector.py +0 -0
- /package/{src/backend → dashboard}/status/status_cache.py +0 -0
- /package/{src/backend → dashboard}/status/status_calculator.py +0 -0
- /package/{src/backend → dashboard}/status_calculator.py +0 -0
- /package/{src/backend → dashboard}/subagent_reader.py +0 -0
- /package/{src/backend → dashboard}/watchers/__init__.py +0 -0
- /package/{src/backend → dashboard}/watchers/file_watcher.py +0 -0
- /package/{plugin/index.js → index.js} +0 -0
package/plugin/package.json
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "openclaw-agent-dashboard",
|
|
3
|
-
"version": "1.0.20",
|
|
4
|
-
"description": "多 Agent 可视化看板 - OpenClaw 插件",
|
|
5
|
-
"main": "index.js",
|
|
6
|
-
"openclaw": {
|
|
7
|
-
"extensions": ["./index.js"]
|
|
8
|
-
},
|
|
9
|
-
"keywords": ["openclaw", "dashboard", "agent", "monitoring"],
|
|
10
|
-
"license": "MIT",
|
|
11
|
-
"repository": {
|
|
12
|
-
"type": "git",
|
|
13
|
-
"url": "https://github.com/Umarchen/openclaw-agent-dashboard.git"
|
|
14
|
-
},
|
|
15
|
-
"files": [
|
|
16
|
-
"openclaw.plugin.json",
|
|
17
|
-
"index.js",
|
|
18
|
-
"dashboard",
|
|
19
|
-
"frontend-dist",
|
|
20
|
-
"scripts"
|
|
21
|
-
],
|
|
22
|
-
"scripts": {
|
|
23
|
-
"pack": "node ../scripts/build-plugin.js",
|
|
24
|
-
"prepublishOnly": "npm run pack"
|
|
25
|
-
}
|
|
26
|
-
}
|
package/scripts/build-plugin.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* 插件打包脚本
|
|
4
|
-
* 1. 构建前端
|
|
5
|
-
* 2. 复制 backend 到 plugin/dashboard
|
|
6
|
-
* 3. 复制 frontend/dist 到 plugin/frontend-dist
|
|
7
|
-
*/
|
|
8
|
-
const fs = require('fs');
|
|
9
|
-
const path = require('path');
|
|
10
|
-
const { execSync } = require('child_process');
|
|
11
|
-
|
|
12
|
-
const ROOT = path.join(__dirname, '..');
|
|
13
|
-
const PLUGIN_DIR = path.join(ROOT, 'plugin');
|
|
14
|
-
const BACKEND_SRC = path.join(ROOT, 'src', 'backend');
|
|
15
|
-
const FRONTEND_DIR = path.join(ROOT, 'frontend');
|
|
16
|
-
const DASHBOARD_DEST = path.join(PLUGIN_DIR, 'dashboard');
|
|
17
|
-
const FRONTEND_DEST = path.join(PLUGIN_DIR, 'frontend-dist');
|
|
18
|
-
|
|
19
|
-
function rmrf(dir) {
|
|
20
|
-
if (fs.existsSync(dir)) {
|
|
21
|
-
fs.rmSync(dir, { recursive: true });
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function copyDir(src, dest, exclude = []) {
|
|
26
|
-
fs.mkdirSync(dest, { recursive: true });
|
|
27
|
-
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
28
|
-
for (const entry of entries) {
|
|
29
|
-
if (exclude.includes(entry.name)) continue;
|
|
30
|
-
if (entry.name.endsWith('.pyc') || entry.name.endsWith('.log')) continue;
|
|
31
|
-
const srcPath = path.join(src, entry.name);
|
|
32
|
-
const destPath = path.join(dest, entry.name);
|
|
33
|
-
if (entry.isDirectory()) {
|
|
34
|
-
copyDir(srcPath, destPath, exclude);
|
|
35
|
-
} else {
|
|
36
|
-
fs.copyFileSync(srcPath, destPath);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
console.log('[pack] 1. 构建前端...');
|
|
42
|
-
// 检查是否需要安装依赖:无 node_modules 或缺少 .bin(如 Windows 下 .bin 未生成)时都执行 install
|
|
43
|
-
const nodeModulesPath = path.join(FRONTEND_DIR, 'node_modules');
|
|
44
|
-
const binVite = path.join(nodeModulesPath, '.bin', 'vite');
|
|
45
|
-
const binViteCmd = path.join(nodeModulesPath, '.bin', 'vite.cmd'); // Windows
|
|
46
|
-
const needInstall = !fs.existsSync(nodeModulesPath) ||
|
|
47
|
-
!(fs.existsSync(binVite) || fs.existsSync(binViteCmd));
|
|
48
|
-
if (needInstall) {
|
|
49
|
-
console.log('[pack] 安装前端依赖...');
|
|
50
|
-
execSync('npm install --no-audit', { cwd: FRONTEND_DIR, stdio: 'inherit', env: process.env });
|
|
51
|
-
}
|
|
52
|
-
execSync('npm run build', { cwd: FRONTEND_DIR, stdio: 'inherit', env: process.env });
|
|
53
|
-
|
|
54
|
-
console.log('[pack] 2. 复制 backend -> plugin/dashboard');
|
|
55
|
-
rmrf(DASHBOARD_DEST);
|
|
56
|
-
copyDir(BACKEND_SRC, DASHBOARD_DEST, ['__pycache__', '.pytest_cache']);
|
|
57
|
-
|
|
58
|
-
console.log('[pack] 3. 复制 frontend/dist -> plugin/frontend-dist');
|
|
59
|
-
rmrf(FRONTEND_DEST);
|
|
60
|
-
const frontendDist = path.join(FRONTEND_DIR, 'dist');
|
|
61
|
-
if (fs.existsSync(frontendDist)) {
|
|
62
|
-
copyDir(frontendDist, FRONTEND_DEST);
|
|
63
|
-
} else {
|
|
64
|
-
console.warn('[pack] frontend/dist 不存在,跳过');
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
console.log('[pack] 4. 复制 Python 依赖安装脚本 -> plugin/scripts(供 npm 包与 openclaw plugins install 使用)');
|
|
68
|
-
const SCRIPTS_SRC = path.join(ROOT, 'scripts');
|
|
69
|
-
const SCRIPTS_DEST = path.join(PLUGIN_DIR, 'scripts');
|
|
70
|
-
rmrf(SCRIPTS_DEST);
|
|
71
|
-
fs.mkdirSync(path.join(SCRIPTS_DEST, 'lib'), { recursive: true });
|
|
72
|
-
fs.copyFileSync(
|
|
73
|
-
path.join(SCRIPTS_SRC, 'install-python-deps.js'),
|
|
74
|
-
path.join(SCRIPTS_DEST, 'install-python-deps.js'),
|
|
75
|
-
);
|
|
76
|
-
fs.copyFileSync(
|
|
77
|
-
path.join(SCRIPTS_SRC, 'lib', 'common.js'),
|
|
78
|
-
path.join(SCRIPTS_DEST, 'lib', 'common.js'),
|
|
79
|
-
);
|
|
80
|
-
|
|
81
|
-
console.log('[pack] 完成');
|
package/scripts/bundle.sh
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
# 打包项目为可分发的压缩包
|
|
4
|
-
# 用法: npm run bundle
|
|
5
|
-
#
|
|
6
|
-
set -e
|
|
7
|
-
cd "$(dirname "$0")/.."
|
|
8
|
-
ROOT=$(pwd)
|
|
9
|
-
|
|
10
|
-
VERSION=$(grep '"version"' "$ROOT/plugin/openclaw.plugin.json" | sed 's/.*"version": *"\([^"]*\)".*/\1/')
|
|
11
|
-
OUTPUT="openclaw-agent-dashboard-v$VERSION.tar.gz"
|
|
12
|
-
|
|
13
|
-
echo "=== 打包分发文件 ==="
|
|
14
|
-
echo ""
|
|
15
|
-
echo " 版本: $VERSION"
|
|
16
|
-
echo " 输出: $OUTPUT"
|
|
17
|
-
echo ""
|
|
18
|
-
|
|
19
|
-
# 临时目录
|
|
20
|
-
TMPDIR=$(mktemp -d)
|
|
21
|
-
DISTDIR="$TMPDIR/openclaw-agent-dashboard"
|
|
22
|
-
|
|
23
|
-
mkdir -p "$DISTDIR"
|
|
24
|
-
|
|
25
|
-
# 复制需要的文件
|
|
26
|
-
echo ">>> 复制文件..."
|
|
27
|
-
cp -r "$ROOT/frontend" "$DISTDIR/"
|
|
28
|
-
cp -r "$ROOT/src" "$DISTDIR/"
|
|
29
|
-
cp -r "$ROOT/plugin" "$DISTDIR/"
|
|
30
|
-
cp -r "$ROOT/scripts" "$DISTDIR/"
|
|
31
|
-
cp "$ROOT/package.json" "$DISTDIR/"
|
|
32
|
-
cp "$ROOT/README.md" "$DISTDIR/"
|
|
33
|
-
|
|
34
|
-
# 清理不需要的文件
|
|
35
|
-
echo ">>> 清理 node_modules..."
|
|
36
|
-
rm -rf "$DISTDIR/frontend/node_modules"
|
|
37
|
-
rm -rf "$DISTDIR/frontend/dist"
|
|
38
|
-
rm -rf "$DISTDIR/plugin/frontend-dist"
|
|
39
|
-
rm -rf "$DISTDIR/plugin/dashboard"
|
|
40
|
-
find "$DISTDIR" -name "__pycache__" -type d -exec rm -rf {} + 2>/dev/null || true
|
|
41
|
-
find "$DISTDIR" -name ".pytest_cache" -type d -exec rm -rf {} + 2>/dev/null || true
|
|
42
|
-
|
|
43
|
-
# 打包
|
|
44
|
-
echo ">>> 压缩..."
|
|
45
|
-
cd "$TMPDIR"
|
|
46
|
-
tar -czf "$ROOT/$OUTPUT" openclaw-agent-dashboard
|
|
47
|
-
|
|
48
|
-
# 清理临时目录
|
|
49
|
-
rm -rf "$TMPDIR"
|
|
50
|
-
|
|
51
|
-
# 显示结果
|
|
52
|
-
echo ""
|
|
53
|
-
echo "=== 打包完成 ==="
|
|
54
|
-
echo ""
|
|
55
|
-
echo " 文件: $OUTPUT"
|
|
56
|
-
echo " 大小: $(du -h "$ROOT/$OUTPUT" | cut -f1)"
|
|
57
|
-
echo ""
|
|
58
|
-
echo "分发使用说明:"
|
|
59
|
-
echo " 1. 解压: tar -xzf $OUTPUT"
|
|
60
|
-
echo " 2. 进入: cd openclaw-agent-dashboard"
|
|
61
|
-
echo " 3. 安装: npm run deploy"
|
|
62
|
-
echo ""
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
# OpenClaw Agent Dashboard 插件 - 安装/升级脚本
|
|
4
|
-
# 用法: npm run deploy(推荐)或 ./scripts/install-plugin.sh
|
|
5
|
-
#
|
|
6
|
-
# 选项:
|
|
7
|
-
# VERBOSE=1 显示详细输出(包括 npm/pip 的错误信息)
|
|
8
|
-
# DRY_RUN=1 仅预览,不执行实际安装
|
|
9
|
-
#
|
|
10
|
-
# 配置目录与 OpenClaw 一致:OPENCLAW_STATE_DIR > OPENCLAW_HOME > HOME
|
|
11
|
-
#
|
|
12
|
-
set -euo pipefail
|
|
13
|
-
|
|
14
|
-
cd "$(dirname "$0")/.."
|
|
15
|
-
ROOT=$(pwd)
|
|
16
|
-
SCRIPT_DIR="$ROOT/scripts"
|
|
17
|
-
|
|
18
|
-
# 引入公共库
|
|
19
|
-
source "$SCRIPT_DIR/lib/common.sh"
|
|
20
|
-
|
|
21
|
-
# 环境变量
|
|
22
|
-
VERBOSE="${VERBOSE:-0}"
|
|
23
|
-
DRY_RUN="${DRY_RUN:-0}"
|
|
24
|
-
|
|
25
|
-
# ============================================
|
|
26
|
-
# 本脚本特有函数
|
|
27
|
-
# ============================================
|
|
28
|
-
|
|
29
|
-
# 获取已安装版本
|
|
30
|
-
get_installed_version() {
|
|
31
|
-
local plugin_path="$1"
|
|
32
|
-
if [ -f "$plugin_path/openclaw.plugin.json" ]; then
|
|
33
|
-
parse_json_version "$plugin_path/openclaw.plugin.json"
|
|
34
|
-
else
|
|
35
|
-
echo ""
|
|
36
|
-
fi
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
# 检查命令是否存在
|
|
40
|
-
check_cmd() {
|
|
41
|
-
if ! command -v "$1" &>/dev/null; then
|
|
42
|
-
log_error "未找到 $1,请先安装: $2"
|
|
43
|
-
exit 1
|
|
44
|
-
fi
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
# ============================================
|
|
48
|
-
# 主流程
|
|
49
|
-
# ============================================
|
|
50
|
-
|
|
51
|
-
OPENCLAW_CONFIG_DIR=$(resolve_openclaw_config_dir)
|
|
52
|
-
PLUGIN_PATH="${OPENCLAW_CONFIG_DIR}/extensions/openclaw-agent-dashboard"
|
|
53
|
-
NEW_VERSION=$(parse_json_version "$ROOT/plugin/openclaw.plugin.json")
|
|
54
|
-
OLD_VERSION=$(get_installed_version "$PLUGIN_PATH")
|
|
55
|
-
|
|
56
|
-
log_info "[安装] 配置目录: $OPENCLAW_CONFIG_DIR"
|
|
57
|
-
log_info "[安装] 插件路径: $PLUGIN_PATH"
|
|
58
|
-
echo ""
|
|
59
|
-
|
|
60
|
-
# 显示标题(区分安装/升级)
|
|
61
|
-
if [ -n "$OLD_VERSION" ] && [ -d "$PLUGIN_PATH" ]; then
|
|
62
|
-
log_info "=== OpenClaw Agent Dashboard 插件升级 ==="
|
|
63
|
-
echo ""
|
|
64
|
-
log_info " $OLD_VERSION → $NEW_VERSION"
|
|
65
|
-
else
|
|
66
|
-
log_info "=== OpenClaw Agent Dashboard 插件安装 ==="
|
|
67
|
-
echo ""
|
|
68
|
-
log_info " 版本: $NEW_VERSION"
|
|
69
|
-
fi
|
|
70
|
-
|
|
71
|
-
# dry-run 模式:仅预览
|
|
72
|
-
if [ "$DRY_RUN" = "1" ]; then
|
|
73
|
-
echo ""
|
|
74
|
-
log_info "[DRY-RUN] 将执行以下操作:"
|
|
75
|
-
log_info " - 安装插件到: $PLUGIN_PATH"
|
|
76
|
-
log_info " - 安装 Python 依赖到 venv 或 --user"
|
|
77
|
-
log_ok "预览完成,未执行实际安装"
|
|
78
|
-
exit 0
|
|
79
|
-
fi
|
|
80
|
-
|
|
81
|
-
# 1. 检查前置条件
|
|
82
|
-
check_cmd node "https://nodejs.org"
|
|
83
|
-
check_cmd python3 "https://www.python.org"
|
|
84
|
-
check_cmd openclaw "npm install -g openclaw"
|
|
85
|
-
|
|
86
|
-
echo ""
|
|
87
|
-
log_ok "前置条件检查通过"
|
|
88
|
-
|
|
89
|
-
# 2. 构建前端(若通过 npm run deploy 调用,pack 已构建,跳过)
|
|
90
|
-
if [ -d "$ROOT/frontend/dist" ] && [ -n "$(ls -A "$ROOT/frontend/dist" 2>/dev/null)" ]; then
|
|
91
|
-
log_step "1/4 前端已构建,跳过"
|
|
92
|
-
else
|
|
93
|
-
log_step "1/4 构建前端..."
|
|
94
|
-
(cd frontend && run_silent npm install && npm run build)
|
|
95
|
-
fi
|
|
96
|
-
|
|
97
|
-
# 3. 打包插件(若通过 npm run deploy 调用,pack 已完成,跳过)
|
|
98
|
-
if [ -d "$ROOT/plugin/dashboard" ] && [ -f "$ROOT/plugin/dashboard/main.py" ]; then
|
|
99
|
-
log_step "2/4 插件已打包,跳过"
|
|
100
|
-
else
|
|
101
|
-
log_step "2/4 打包插件..."
|
|
102
|
-
node scripts/build-plugin.js
|
|
103
|
-
fi
|
|
104
|
-
|
|
105
|
-
# 4. 安装插件(升级时用 uninstall 清理配置+目录,避免 plugins.allow 引用已删目录导致校验失败)
|
|
106
|
-
PLUGIN_ID="openclaw-agent-dashboard"
|
|
107
|
-
if [ -d "$PLUGIN_PATH" ]; then
|
|
108
|
-
log_step "3/4 移除旧版本后安装..."
|
|
109
|
-
log_info " 执行: openclaw plugins uninstall $PLUGIN_ID"
|
|
110
|
-
if run_silent openclaw plugins uninstall "$PLUGIN_ID" --force; then
|
|
111
|
-
log_ok " 已卸载(配置记录)"
|
|
112
|
-
else
|
|
113
|
-
log_warn " uninstall 失败(可能未注册)"
|
|
114
|
-
fi
|
|
115
|
-
# uninstall 只删除配置记录,需要手动删除物理目录
|
|
116
|
-
rm -rf "$PLUGIN_PATH"
|
|
117
|
-
log_ok " 已删除旧目录"
|
|
118
|
-
else
|
|
119
|
-
log_step "3/4 安装插件..."
|
|
120
|
-
fi
|
|
121
|
-
log_info " 目标: $PLUGIN_PATH"
|
|
122
|
-
log_info " 执行: openclaw plugins install ./plugin"
|
|
123
|
-
if ! openclaw plugins install ./plugin; then
|
|
124
|
-
log_error "插件安装失败"
|
|
125
|
-
exit 1
|
|
126
|
-
fi
|
|
127
|
-
log_ok " 插件已安装"
|
|
128
|
-
|
|
129
|
-
# 5. 安装 Python 依赖
|
|
130
|
-
# 详见 docs/python-environment-compatibility.md
|
|
131
|
-
if [ -f "$PLUGIN_PATH/dashboard/requirements.txt" ]; then
|
|
132
|
-
if [ -n "$OLD_VERSION" ]; then
|
|
133
|
-
log_step "4/4 检查 Python 依赖..."
|
|
134
|
-
else
|
|
135
|
-
log_step "4/4 安装 Python 依赖..."
|
|
136
|
-
fi
|
|
137
|
-
|
|
138
|
-
# 调用独立的 Python 依赖安装脚本
|
|
139
|
-
DEPS_OPTS=""
|
|
140
|
-
[ "$VERBOSE" = "1" ] && DEPS_OPTS="--verbose"
|
|
141
|
-
|
|
142
|
-
if ! bash "$SCRIPT_DIR/install-python-deps.sh" "$PLUGIN_PATH" $DEPS_OPTS; then
|
|
143
|
-
exit 1
|
|
144
|
-
fi
|
|
145
|
-
else
|
|
146
|
-
log_warn "插件未正确安装(缺少 requirements.txt)"
|
|
147
|
-
fi
|
|
148
|
-
|
|
149
|
-
# 完成
|
|
150
|
-
echo ""
|
|
151
|
-
if [ -n "$OLD_VERSION" ]; then
|
|
152
|
-
log_ok "=== 升级完成 ($OLD_VERSION → $NEW_VERSION) ==="
|
|
153
|
-
else
|
|
154
|
-
log_ok "=== 安装完成 (v$NEW_VERSION) ==="
|
|
155
|
-
fi
|
|
156
|
-
echo ""
|
|
157
|
-
log_info "执行任意 openclaw 命令(如 openclaw tui)时,Dashboard 会自动启动。"
|
|
158
|
-
log_info "访问地址: http://localhost:38271"
|
|
159
|
-
echo ""
|
|
160
|
-
log_info "若端口被占用,可创建 ~/.openclaw-agent-dashboard/config.json 设置端口:"
|
|
161
|
-
log_info ' {"port": 38271}'
|
|
162
|
-
echo ""
|
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
# Python 依赖安装脚本
|
|
4
|
-
# 用法: ./install-python-deps.sh <plugin_dir> [options]
|
|
5
|
-
#
|
|
6
|
-
# 选项:
|
|
7
|
-
# --verbose 显示详细输出
|
|
8
|
-
# --venv-only 仅使用 venv,不回退 pip
|
|
9
|
-
# --skip-create 跳过创建 venv (已存在)
|
|
10
|
-
#
|
|
11
|
-
# 环境变量:
|
|
12
|
-
# VERBOSE=1 显示详细输出
|
|
13
|
-
#
|
|
14
|
-
set -euo pipefail
|
|
15
|
-
|
|
16
|
-
# ============================================
|
|
17
|
-
# 参数解析
|
|
18
|
-
# ============================================
|
|
19
|
-
|
|
20
|
-
if [ $# -lt 1 ]; then
|
|
21
|
-
echo "用法: $0 <plugin_dir> [--verbose] [--venv-only] [--skip-create]"
|
|
22
|
-
echo ""
|
|
23
|
-
echo "参数:"
|
|
24
|
-
echo " plugin_dir 插件安装目录 (必须)"
|
|
25
|
-
echo ""
|
|
26
|
-
echo "选项:"
|
|
27
|
-
echo " --verbose 显示详细输出"
|
|
28
|
-
echo " --venv-only 仅使用 venv,不回退 pip"
|
|
29
|
-
echo " --skip-create 跳过创建 venv (已存在)"
|
|
30
|
-
exit 1
|
|
31
|
-
fi
|
|
32
|
-
|
|
33
|
-
PLUGIN_DIR="$1"
|
|
34
|
-
shift
|
|
35
|
-
|
|
36
|
-
# 解析选项
|
|
37
|
-
VERBOSE="${VERBOSE:-0}"
|
|
38
|
-
VENV_ONLY=0
|
|
39
|
-
SKIP_CREATE=0
|
|
40
|
-
|
|
41
|
-
while [ $# -gt 0 ]; do
|
|
42
|
-
case "$1" in
|
|
43
|
-
--verbose) VERBOSE=1 ;;
|
|
44
|
-
--venv-only) VENV_ONLY=1 ;;
|
|
45
|
-
--skip-create) SKIP_CREATE=1 ;;
|
|
46
|
-
*) echo "未知选项: $1" >&2; exit 1 ;;
|
|
47
|
-
esac
|
|
48
|
-
shift
|
|
49
|
-
done
|
|
50
|
-
|
|
51
|
-
# ============================================
|
|
52
|
-
# 日志辅助函数
|
|
53
|
-
# ============================================
|
|
54
|
-
|
|
55
|
-
log_info() { echo "$1"; }
|
|
56
|
-
log_ok() { echo "✓ $1"; }
|
|
57
|
-
log_warn() { echo "⚠ $1"; }
|
|
58
|
-
log_error() { echo "❌ $1" >&2; }
|
|
59
|
-
|
|
60
|
-
run_silent() {
|
|
61
|
-
if [ "$VERBOSE" = "1" ]; then
|
|
62
|
-
"$@"
|
|
63
|
-
else
|
|
64
|
-
"$@" 2>/dev/null
|
|
65
|
-
fi
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
# ============================================
|
|
69
|
-
# 系统依赖检测
|
|
70
|
-
# ============================================
|
|
71
|
-
|
|
72
|
-
check_python() {
|
|
73
|
-
if ! command -v python3 &>/dev/null; then
|
|
74
|
-
log_error "未找到 python3 命令"
|
|
75
|
-
echo ""
|
|
76
|
-
echo "请先安装 Python 3:"
|
|
77
|
-
echo " Debian/Ubuntu: sudo apt install python3"
|
|
78
|
-
echo " macOS: brew install python3"
|
|
79
|
-
echo " Windows: 从 https://www.python.org 下载安装"
|
|
80
|
-
return 1
|
|
81
|
-
fi
|
|
82
|
-
return 0
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
check_venv_module() {
|
|
86
|
-
if ! python3 -c "import venv" 2>/dev/null; then
|
|
87
|
-
return 1
|
|
88
|
-
fi
|
|
89
|
-
return 0
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
check_pip_module() {
|
|
93
|
-
if python3 -m pip --version &>/dev/null; then
|
|
94
|
-
return 0
|
|
95
|
-
fi
|
|
96
|
-
if command -v pip3 &>/dev/null; then
|
|
97
|
-
return 0
|
|
98
|
-
fi
|
|
99
|
-
if command -v pip &>/dev/null; then
|
|
100
|
-
return 0
|
|
101
|
-
fi
|
|
102
|
-
return 1
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
# ============================================
|
|
106
|
-
# 验证
|
|
107
|
-
# ============================================
|
|
108
|
-
|
|
109
|
-
REQ_FILE="$PLUGIN_DIR/dashboard/requirements.txt"
|
|
110
|
-
VENV_DIR="$PLUGIN_DIR/dashboard/.venv"
|
|
111
|
-
|
|
112
|
-
if [ ! -f "$REQ_FILE" ]; then
|
|
113
|
-
log_error "未找到 requirements.txt: $REQ_FILE"
|
|
114
|
-
exit 1
|
|
115
|
-
fi
|
|
116
|
-
|
|
117
|
-
# ============================================
|
|
118
|
-
# 安装 Python 依赖
|
|
119
|
-
# ============================================
|
|
120
|
-
|
|
121
|
-
PYTHON_DEPS_OK=""
|
|
122
|
-
|
|
123
|
-
# 策略 1: venv(推荐,不受 PEP 668 影响,跨平台一致)
|
|
124
|
-
if check_venv_module; then
|
|
125
|
-
log_info " 尝试: venv(推荐,不受 PEP 668 影响)"
|
|
126
|
-
|
|
127
|
-
VENV_PYTHON=""
|
|
128
|
-
# 检查现有 venv
|
|
129
|
-
[ -x "$VENV_DIR/bin/python" ] && VENV_PYTHON="$VENV_DIR/bin/python"
|
|
130
|
-
[ -z "$VENV_PYTHON" ] && [ -x "$VENV_DIR/Scripts/python.exe" ] && VENV_PYTHON="$VENV_DIR/Scripts/python.exe"
|
|
131
|
-
|
|
132
|
-
# 创建新 venv
|
|
133
|
-
if [ -z "$VENV_PYTHON" ] && [ "$SKIP_CREATE" != "1" ]; then
|
|
134
|
-
rm -rf "$VENV_DIR"
|
|
135
|
-
if ! python3 -m venv "$VENV_DIR" 2>/dev/null; then
|
|
136
|
-
log_warn " venv 创建失败,尝试其他方式..."
|
|
137
|
-
else
|
|
138
|
-
[ -x "$VENV_DIR/bin/python" ] && VENV_PYTHON="$VENV_DIR/bin/python"
|
|
139
|
-
[ -z "$VENV_PYTHON" ] && [ -x "$VENV_DIR/Scripts/python.exe" ] && VENV_PYTHON="$VENV_DIR/Scripts/python.exe"
|
|
140
|
-
fi
|
|
141
|
-
fi
|
|
142
|
-
|
|
143
|
-
# 安装依赖
|
|
144
|
-
if [ -n "$VENV_PYTHON" ]; then
|
|
145
|
-
if run_silent "$VENV_PYTHON" -m pip install --upgrade pip -q 2>/dev/null; then
|
|
146
|
-
if run_silent "$VENV_PYTHON" -m pip install -r "$REQ_FILE" -q; then
|
|
147
|
-
PYTHON_DEPS_OK="venv"
|
|
148
|
-
fi
|
|
149
|
-
fi
|
|
150
|
-
fi
|
|
151
|
-
fi
|
|
152
|
-
|
|
153
|
-
# 策略 2: pip --user 兜底(Debian 12/Ubuntu 23.04+ 等 PEP 668 环境)
|
|
154
|
-
if [ -z "$PYTHON_DEPS_OK" ] && [ "$VENV_ONLY" != "1" ]; then
|
|
155
|
-
log_info " 尝试: pip --user(PEP 668 兜底)"
|
|
156
|
-
|
|
157
|
-
if run_silent python3 -m pip install -r "$REQ_FILE" -q --user; then
|
|
158
|
-
PYTHON_DEPS_OK="pip --user"
|
|
159
|
-
elif run_silent python3 -m pip install -r "$REQ_FILE" -q; then
|
|
160
|
-
PYTHON_DEPS_OK="pip"
|
|
161
|
-
elif run_silent pip install -r "$REQ_FILE" -q --user; then
|
|
162
|
-
PYTHON_DEPS_OK="pip --user"
|
|
163
|
-
elif run_silent pip3 install -r "$REQ_FILE" -q --user; then
|
|
164
|
-
PYTHON_DEPS_OK="pip3 --user"
|
|
165
|
-
fi
|
|
166
|
-
fi
|
|
167
|
-
|
|
168
|
-
# ============================================
|
|
169
|
-
# 结果
|
|
170
|
-
# ============================================
|
|
171
|
-
|
|
172
|
-
if [ -n "$PYTHON_DEPS_OK" ]; then
|
|
173
|
-
log_ok "Python 依赖已就绪 ($PYTHON_DEPS_OK)"
|
|
174
|
-
exit 0
|
|
175
|
-
else
|
|
176
|
-
log_error "Python 依赖安装失败"
|
|
177
|
-
echo ""
|
|
178
|
-
echo "========================================"
|
|
179
|
-
echo "请检查以下系统依赖是否已安装:"
|
|
180
|
-
echo "========================================"
|
|
181
|
-
echo ""
|
|
182
|
-
|
|
183
|
-
# 检测系统并给出针对性建议
|
|
184
|
-
if [ -f /etc/debian_version ]; then
|
|
185
|
-
echo "检测到 Debian/Ubuntu 系统,请执行:"
|
|
186
|
-
echo ""
|
|
187
|
-
echo " sudo apt update"
|
|
188
|
-
echo " sudo apt install python3 python3-pip python3-venv"
|
|
189
|
-
echo ""
|
|
190
|
-
elif [ -f /etc/redhat-release ]; then
|
|
191
|
-
echo "检测到 RedHat/CentOS/Fedora 系统,请执行:"
|
|
192
|
-
echo ""
|
|
193
|
-
echo " sudo dnf install python3 python3-pip"
|
|
194
|
-
echo ""
|
|
195
|
-
elif [[ "$(uname -s)" == "Darwin" ]]; then
|
|
196
|
-
echo "检测到 macOS 系统,请执行:"
|
|
197
|
-
echo ""
|
|
198
|
-
echo " brew install python3"
|
|
199
|
-
echo ""
|
|
200
|
-
else
|
|
201
|
-
echo "请确保已安装:"
|
|
202
|
-
echo " - Python 3"
|
|
203
|
-
echo " - pip (python3-pip)"
|
|
204
|
-
echo " - venv 模块 (python3-venv,Linux 通常需要单独安装)"
|
|
205
|
-
echo ""
|
|
206
|
-
fi
|
|
207
|
-
|
|
208
|
-
echo "========================================"
|
|
209
|
-
echo "安装系统依赖后,重新执行:"
|
|
210
|
-
echo "========================================"
|
|
211
|
-
echo ""
|
|
212
|
-
echo " npm run deploy"
|
|
213
|
-
echo ""
|
|
214
|
-
echo "或手动安装 Python 依赖:"
|
|
215
|
-
echo ""
|
|
216
|
-
echo " python3 -m pip install -r $REQ_FILE --user"
|
|
217
|
-
echo ""
|
|
218
|
-
echo "========================================"
|
|
219
|
-
echo "调试模式:"
|
|
220
|
-
echo "========================================"
|
|
221
|
-
echo ""
|
|
222
|
-
echo " VERBOSE=1 npm run deploy"
|
|
223
|
-
echo ""
|
|
224
|
-
|
|
225
|
-
exit 1
|
|
226
|
-
fi
|