opc-agent 4.0.44 → 4.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.md +20 -20
- package/.github/ISSUE_TEMPLATE/feature_request.md +14 -14
- package/.github/PULL_REQUEST_TEMPLATE.md +13 -13
- package/CHANGELOG.md +48 -48
- package/CONTRIBUTING.md +36 -36
- package/README.zh-CN.md +497 -497
- package/dist/channels/wechat.js +6 -6
- package/dist/cli.js +2 -2
- package/dist/core/runtime.js +18 -0
- package/dist/deploy/index.js +56 -56
- package/dist/providers/index.js +39 -13
- package/dist/studio/server.js +211 -20
- package/dist/studio-ui/index.html +279 -24
- package/dist/ui/components.js +105 -105
- package/examples/README.md +22 -22
- package/examples/basic-agent.ts +90 -90
- package/examples/brain-integration.ts +71 -71
- package/examples/multi-channel.ts +74 -74
- package/fix-sidebar.mjs +188 -188
- package/install.ps1 +154 -154
- package/install.sh +164 -164
- package/package.json +1 -1
- package/scripts/install.ps1 +31 -31
- package/scripts/install.sh +40 -40
- package/serve-studio.js +13 -13
- package/serve-test.js +25 -25
- package/src/channels/dingtalk.ts +46 -46
- package/src/channels/email.ts +351 -351
- package/src/channels/feishu.ts +349 -349
- package/src/channels/googlechat.ts +42 -42
- package/src/channels/imessage.ts +31 -31
- package/src/channels/irc.ts +82 -82
- package/src/channels/line.ts +32 -32
- package/src/channels/matrix.ts +33 -33
- package/src/channels/mattermost.ts +57 -57
- package/src/channels/msteams.ts +32 -32
- package/src/channels/nostr.ts +32 -32
- package/src/channels/qq.ts +33 -33
- package/src/channels/signal.ts +32 -32
- package/src/channels/sms.ts +33 -33
- package/src/channels/telegram.ts +616 -616
- package/src/channels/twitch.ts +65 -65
- package/src/channels/voice-call.ts +100 -100
- package/src/channels/websocket.ts +399 -399
- package/src/channels/wechat.ts +329 -329
- package/src/channels/whatsapp.ts +32 -32
- package/src/cli/chat.ts +99 -99
- package/src/cli/setup.ts +314 -314
- package/src/cli.ts +2 -2
- package/src/core/agent.ts +476 -476
- package/src/core/api-server.ts +277 -277
- package/src/core/audio.ts +98 -98
- package/src/core/collaboration.ts +275 -275
- package/src/core/context-discovery.ts +85 -85
- package/src/core/context-refs.ts +140 -140
- package/src/core/gateway.ts +106 -106
- package/src/core/heartbeat.ts +51 -51
- package/src/core/hooks.ts +105 -105
- package/src/core/ide-bridge.ts +133 -133
- package/src/core/node-network.ts +86 -86
- package/src/core/profiles.ts +122 -122
- package/src/core/runtime.ts +18 -0
- package/src/core/scheduler.ts +187 -187
- package/src/core/session-manager.ts +137 -137
- package/src/core/subagent.ts +98 -98
- package/src/core/vision.ts +180 -180
- package/src/core/workflow-graph.ts +365 -365
- package/src/daemon.ts +96 -96
- package/src/deploy/index.ts +255 -255
- package/src/doctor.ts +156 -156
- package/src/eval/index.ts +211 -211
- package/src/eval/suites/basic.json +16 -16
- package/src/eval/suites/memory.json +12 -12
- package/src/eval/suites/safety.json +14 -14
- package/src/hub/brain-seed.ts +54 -54
- package/src/hub/client.ts +60 -60
- package/src/mcp/servers/calculator-mcp.ts +65 -65
- package/src/mcp/servers/crypto-mcp.ts +73 -73
- package/src/mcp/servers/database-mcp.ts +72 -72
- package/src/mcp/servers/datetime-mcp.ts +69 -69
- package/src/mcp/servers/filesystem.ts +66 -66
- package/src/mcp/servers/github-mcp.ts +58 -58
- package/src/mcp/servers/index.ts +63 -63
- package/src/mcp/servers/json-mcp.ts +102 -102
- package/src/mcp/servers/memory-mcp.ts +56 -56
- package/src/mcp/servers/regex-mcp.ts +53 -53
- package/src/mcp/servers/web-mcp.ts +49 -49
- package/src/memory/context-compressor.ts +189 -189
- package/src/memory/seed-loader.ts +212 -212
- package/src/memory/user-profiler.ts +215 -215
- package/src/plugins/content-filter.ts +23 -23
- package/src/plugins/logger.ts +18 -18
- package/src/plugins/rate-limiter.ts +38 -38
- package/src/protocols/a2a/client.ts +132 -132
- package/src/protocols/a2a/index.ts +8 -8
- package/src/protocols/a2a/server.ts +333 -333
- package/src/protocols/a2a/types.ts +88 -88
- package/src/protocols/a2a/utils.ts +50 -50
- package/src/protocols/agui/client.ts +83 -83
- package/src/protocols/agui/index.ts +4 -4
- package/src/protocols/agui/server.ts +218 -218
- package/src/protocols/agui/types.ts +153 -153
- package/src/protocols/index.ts +2 -2
- package/src/protocols/mcp/agent-tools.ts +134 -134
- package/src/protocols/mcp/index.ts +8 -8
- package/src/protocols/mcp/server.ts +262 -262
- package/src/protocols/mcp/types.ts +69 -69
- package/src/providers/index.ts +632 -608
- package/src/publish/index.ts +376 -376
- package/src/scheduler/cron-engine.ts +191 -191
- package/src/scheduler/index.ts +2 -2
- package/src/schema/oad.ts +217 -217
- package/src/security/approval.ts +131 -131
- package/src/security/approvals.ts +143 -143
- package/src/security/elevated.ts +105 -105
- package/src/security/guardrails.ts +248 -248
- package/src/security/index.ts +9 -9
- package/src/security/keys.ts +87 -87
- package/src/security/secrets.ts +129 -129
- package/src/skills/builtin/index.ts +408 -408
- package/src/skills/marketplace.ts +113 -113
- package/src/skills/types.ts +42 -42
- package/src/studio/server.ts +209 -22
- package/src/studio/templates-data.ts +178 -178
- package/src/studio-ui/index.html +279 -24
- package/src/telemetry/index.ts +324 -324
- package/src/tools/builtin/browser.ts +299 -299
- package/src/tools/builtin/datetime.ts +41 -41
- package/src/tools/builtin/file.ts +107 -107
- package/src/tools/builtin/home-assistant.ts +116 -116
- package/src/tools/builtin/rl-tools.ts +243 -243
- package/src/tools/builtin/shell.ts +43 -43
- package/src/tools/builtin/vision.ts +64 -64
- package/src/tools/builtin/web-search.ts +126 -126
- package/src/tools/builtin/web.ts +35 -35
- package/src/tools/document-processor.ts +213 -213
- package/src/tools/image-generator.ts +150 -150
- package/src/tools/integrations/calendar.ts +73 -73
- package/src/tools/integrations/code-exec.ts +39 -39
- package/src/tools/integrations/csv-analyzer.ts +92 -92
- package/src/tools/integrations/database.ts +44 -44
- package/src/tools/integrations/email-send.ts +76 -76
- package/src/tools/integrations/git-tool.ts +42 -42
- package/src/tools/integrations/github-tool.ts +76 -76
- package/src/tools/integrations/image-gen.ts +56 -56
- package/src/tools/integrations/index.ts +92 -92
- package/src/tools/integrations/jira.ts +83 -83
- package/src/tools/integrations/notion.ts +71 -71
- package/src/tools/integrations/npm-tool.ts +48 -48
- package/src/tools/integrations/pdf-reader.ts +58 -58
- package/src/tools/integrations/slack.ts +65 -65
- package/src/tools/integrations/summarizer.ts +49 -49
- package/src/tools/integrations/translator.ts +48 -48
- package/src/tools/integrations/trello.ts +60 -60
- package/src/tools/integrations/vector-search.ts +42 -42
- package/src/tools/integrations/web-scraper.ts +47 -47
- package/src/tools/integrations/web-search.ts +58 -58
- package/src/tools/integrations/webhook.ts +38 -38
- package/src/tools/mcp-client.ts +131 -131
- package/src/tools/web-scraper.ts +179 -179
- package/src/tools/web-search.ts +180 -180
- package/src/ui/components.ts +127 -127
- package/srv-out.txt +1 -1
- package/templates/ecommerce-assistant/README.md +45 -45
- package/templates/ecommerce-assistant/oad.yaml +47 -47
- package/templates/tech-support/README.md +43 -43
- package/templates/tech-support/oad.yaml +45 -45
- package/test-agent/Dockerfile +9 -9
- package/test-agent/README.md +50 -50
- package/test-agent/agent.yaml +23 -23
- package/test-agent/docker-compose.yml +11 -11
- package/test-agent/oad.yaml +31 -31
- package/test-agent/package-lock.json +1492 -1492
- package/test-agent/package.json +17 -17
- package/test-agent/src/index.ts +24 -24
- package/test-agent/src/skills/echo.ts +15 -15
- package/test-agent/tsconfig.json +24 -24
- package/test-full.js +43 -43
- package/test-sidebar.js +22 -22
- package/test-studio3.js +75 -75
- package/test-studio4.js +41 -41
- package/tests/a2a-protocol.test.ts +285 -285
- package/tests/agui-protocol.test.ts +246 -246
- package/tests/api-server.test.ts +148 -148
- package/tests/approvals.test.ts +89 -89
- package/tests/audio.test.ts +40 -40
- package/tests/brain-seed-extended.test.ts +490 -490
- package/tests/brain-seed.test.ts +239 -239
- package/tests/browser.test.ts +179 -179
- package/tests/channels/discord.test.ts +79 -79
- package/tests/channels/email.test.ts +148 -148
- package/tests/channels/feishu.test.ts +123 -123
- package/tests/channels/telegram.test.ts +129 -129
- package/tests/channels/websocket.test.ts +53 -53
- package/tests/channels/wechat.test.ts +170 -170
- package/tests/channels-extra.test.ts +45 -45
- package/tests/chat-cli.test.ts +160 -160
- package/tests/cli.test.ts +46 -46
- package/tests/context-compressor.test.ts +172 -172
- package/tests/context-refs.test.ts +121 -121
- package/tests/cron-engine.test.ts +101 -101
- package/tests/daemon.test.ts +135 -135
- package/tests/deepbrain-wire.test.ts +234 -234
- package/tests/deploy-and-dag.test.ts +196 -196
- package/tests/doctor.test.ts +38 -38
- package/tests/document-processor.test.ts +69 -69
- package/tests/e2e-nocode.test.ts +442 -442
- package/tests/elevated.test.ts +69 -69
- package/tests/eval.test.ts +173 -173
- package/tests/gateway.test.ts +63 -63
- package/tests/guardrails.test.ts +177 -177
- package/tests/home-assistant.test.ts +40 -40
- package/tests/hooks.test.ts +79 -79
- package/tests/ide-bridge.test.ts +38 -38
- package/tests/image-generator.test.ts +84 -84
- package/tests/init-role.test.ts +124 -124
- package/tests/integrations.test.ts +249 -249
- package/tests/mcp-client.test.ts +92 -92
- package/tests/mcp-server.test.ts +178 -178
- package/tests/mcp-servers.test.ts +260 -260
- package/tests/node-network.test.ts +74 -74
- package/tests/plugin-a2a-enhanced.test.ts +230 -230
- package/tests/profiles.test.ts +61 -61
- package/tests/publish.test.ts +231 -231
- package/tests/rl-tools.test.ts +93 -93
- package/tests/sandbox-manager.test.ts +46 -46
- package/tests/scheduler.test.ts +200 -200
- package/tests/secrets.test.ts +107 -107
- package/tests/security-enhanced.test.ts +233 -233
- package/tests/settings-api.test.ts +148 -148
- package/tests/setup.test.ts +73 -73
- package/tests/subagent.test.ts +193 -193
- package/tests/telegram-discord.test.ts +60 -60
- package/tests/telemetry.test.ts +186 -186
- package/tests/user-profiler.test.ts +169 -169
- package/tests/v090-features.test.ts +254 -254
- package/tests/vision.test.ts +61 -61
- package/tests/voice-call.test.ts +47 -47
- package/tests/voice-enhanced.test.ts +169 -169
- package/tests/voice-interaction.test.ts +38 -38
- package/tests/web-search.test.ts +155 -155
- package/tests/workflow-graph.test.ts +279 -279
- package/tutorial/customer-service-agent/README.md +612 -612
- package/tutorial/customer-service-agent/SOUL.md +26 -26
- package/tutorial/customer-service-agent/agent.yaml +63 -63
- package/tutorial/customer-service-agent/package.json +19 -19
- package/tutorial/customer-service-agent/src/index.ts +69 -69
- package/tutorial/customer-service-agent/src/skills/faq.ts +27 -27
- package/tutorial/customer-service-agent/src/skills/ticket.ts +22 -22
- package/tutorial/customer-service-agent/tsconfig.json +14 -14
package/install.ps1
CHANGED
|
@@ -1,154 +1,154 @@
|
|
|
1
|
-
# ============================================================================
|
|
2
|
-
# OPC Agent 一键安装脚本 for Windows
|
|
3
|
-
# 用法: irm https://raw.githubusercontent.com/Deepleaper/opc-agent/main/install.ps1 | iex
|
|
4
|
-
# 高级: $env:OPC_YES='1'; $env:OPC_NO_OLLAMA='1'; irm ... | iex
|
|
5
|
-
# ============================================================================
|
|
6
|
-
|
|
7
|
-
$ErrorActionPreference = "Stop"
|
|
8
|
-
|
|
9
|
-
# ── 颜色输出 ──────────────────────────────────────────────────
|
|
10
|
-
function Write-Step($msg) { Write-Host "`n━━━ $msg ━━━" -ForegroundColor Blue }
|
|
11
|
-
function Write-Ok($msg) { Write-Host "✅ $msg" -ForegroundColor Green }
|
|
12
|
-
function Write-Warn($msg) { Write-Host "⚠️ $msg" -ForegroundColor Yellow }
|
|
13
|
-
function Write-Err($msg) { Write-Host "❌ $msg" -ForegroundColor Red }
|
|
14
|
-
function Write-Info($msg) { Write-Host "ℹ️ $msg" -ForegroundColor Cyan }
|
|
15
|
-
|
|
16
|
-
$AutoYes = $env:OPC_YES -eq '1'
|
|
17
|
-
$SkipOllama = $env:OPC_NO_OLLAMA -eq '1'
|
|
18
|
-
|
|
19
|
-
function Confirm-Action($prompt) {
|
|
20
|
-
if ($AutoYes) { return $true }
|
|
21
|
-
$choice = Read-Host "❓ $prompt [Y/n]"
|
|
22
|
-
return ($choice -ne 'n' -and $choice -ne 'N' -and $choice -ne 'no')
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
# ── 检测操作系统 ──────────────────────────────────────────────
|
|
26
|
-
Write-Step "🔍 检测操作系统 / Detecting OS"
|
|
27
|
-
Write-Ok "Windows $([System.Environment]::OSVersion.Version) detected"
|
|
28
|
-
|
|
29
|
-
# ── 检测 & 安装 Node.js ──────────────────────────────────────
|
|
30
|
-
Write-Step "📦 检测 Node.js / Checking Node.js"
|
|
31
|
-
$NeedNode = $false
|
|
32
|
-
|
|
33
|
-
try {
|
|
34
|
-
$nodeVer = (node -v) -replace 'v','' -split '\.' | Select-Object -First 1
|
|
35
|
-
if ([int]$nodeVer -ge 18) {
|
|
36
|
-
Write-Ok "Node.js $(node -v) 已安装 / installed"
|
|
37
|
-
} else {
|
|
38
|
-
Write-Warn "Node.js $(node -v) 版本过低,需要 18+ / version too old"
|
|
39
|
-
$NeedNode = $true
|
|
40
|
-
}
|
|
41
|
-
} catch {
|
|
42
|
-
Write-Warn "未检测到 Node.js / Node.js not found"
|
|
43
|
-
$NeedNode = $true
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
if ($NeedNode) {
|
|
47
|
-
Write-Info "将安装 Node.js 22 LTS / Installing Node.js 22 LTS"
|
|
48
|
-
if (Confirm-Action "安装 Node.js 22? / Install Node.js 22?") {
|
|
49
|
-
$installed = $false
|
|
50
|
-
# 尝试 winget
|
|
51
|
-
try {
|
|
52
|
-
winget install OpenJS.NodeJS.LTS --accept-package-agreements --accept-source-agreements
|
|
53
|
-
$installed = $true
|
|
54
|
-
Write-Ok "Node.js 通过 winget 安装成功 / installed via winget"
|
|
55
|
-
} catch {}
|
|
56
|
-
|
|
57
|
-
# 尝试 choco
|
|
58
|
-
if (-not $installed) {
|
|
59
|
-
try {
|
|
60
|
-
choco install nodejs-lts -y
|
|
61
|
-
$installed = $true
|
|
62
|
-
Write-Ok "Node.js 通过 Chocolatey 安装成功 / installed via Chocolatey"
|
|
63
|
-
} catch {}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (-not $installed) {
|
|
67
|
-
Write-Err "自动安装失败 / Auto-install failed"
|
|
68
|
-
Write-Info "请手动下载安装 / Please download manually: https://nodejs.org/"
|
|
69
|
-
Start-Process "https://nodejs.org/en/download/"
|
|
70
|
-
exit 1
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
# 刷新 PATH
|
|
74
|
-
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
|
|
75
|
-
} else {
|
|
76
|
-
Write-Err "Node.js 是必需的 / Node.js is required"
|
|
77
|
-
Write-Info "下载地址 / Download: https://nodejs.org/"
|
|
78
|
-
exit 1
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
# ── 安装 OPC Agent ────────────────────────────────────────────
|
|
83
|
-
Write-Step "🚀 安装 OPC Agent / Installing OPC Agent"
|
|
84
|
-
Write-Info "npm install -g opc-agent ..."
|
|
85
|
-
npm install -g opc-agent
|
|
86
|
-
Write-Ok "OPC Agent 安装成功 / installed"
|
|
87
|
-
|
|
88
|
-
# ── Ollama(可选)─────────────────────────────────────────────
|
|
89
|
-
if (-not $SkipOllama) {
|
|
90
|
-
Write-Step "🦙 检测 Ollama / Checking Ollama"
|
|
91
|
-
|
|
92
|
-
$hasOllama = $false
|
|
93
|
-
try { ollama --version 2>$null; $hasOllama = $true } catch {}
|
|
94
|
-
|
|
95
|
-
if ($hasOllama) {
|
|
96
|
-
Write-Ok "Ollama 已安装 / installed"
|
|
97
|
-
} else {
|
|
98
|
-
Write-Warn "未检测到 Ollama / Ollama not found"
|
|
99
|
-
Write-Info "Ollama 可让你在本地运行 AI 模型(免费、数据不出门)"
|
|
100
|
-
Write-Info "Ollama lets you run AI models locally (free, private)"
|
|
101
|
-
|
|
102
|
-
if (Confirm-Action "安装 Ollama? / Install Ollama?") {
|
|
103
|
-
try {
|
|
104
|
-
winget install Ollama.Ollama --accept-package-agreements --accept-source-agreements
|
|
105
|
-
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
|
|
106
|
-
Write-Ok "Ollama 安装成功 / installed"
|
|
107
|
-
$hasOllama = $true
|
|
108
|
-
} catch {
|
|
109
|
-
Write-Warn "winget 安装失败,请手动下载 / Please download manually: https://ollama.com/download"
|
|
110
|
-
Start-Process "https://ollama.com/download"
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
# 拉取推荐模型
|
|
116
|
-
if ($hasOllama) {
|
|
117
|
-
Write-Step "🧠 推荐模型 / Recommended Models"
|
|
118
|
-
Write-Info "推荐拉取以下模型用于本地 Agent:"
|
|
119
|
-
Write-Info " • qwen2.5:7b — 中英文对话(4.7GB)"
|
|
120
|
-
Write-Info " • nomic-embed-text — 文本向量化(274MB)"
|
|
121
|
-
|
|
122
|
-
if (Confirm-Action "拉取推荐模型? / Pull recommended models?") {
|
|
123
|
-
Write-Info "拉取 qwen2.5:7b ... (可能需要几分钟)"
|
|
124
|
-
try { ollama pull qwen2.5:7b; Write-Ok "qwen2.5:7b ✓" } catch { Write-Warn "拉取失败,可稍后手动: ollama pull qwen2.5:7b" }
|
|
125
|
-
|
|
126
|
-
Write-Info "拉取 nomic-embed-text ..."
|
|
127
|
-
try { ollama pull nomic-embed-text; Write-Ok "nomic-embed-text ✓" } catch { Write-Warn "拉取失败,可稍后手动: ollama pull nomic-embed-text" }
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
# ── 完成 ──────────────────────────────────────────────────────
|
|
133
|
-
Write-Step "🎉 安装完成!/ Installation Complete!"
|
|
134
|
-
Write-Host ""
|
|
135
|
-
Write-Host "┌─────────────────────────────────────────────────┐" -ForegroundColor Green
|
|
136
|
-
Write-Host "│ OPC Agent 已安装成功! │" -ForegroundColor Green
|
|
137
|
-
Write-Host "│ OPC Agent installed successfully! │" -ForegroundColor Green
|
|
138
|
-
Write-Host "│ │" -ForegroundColor Green
|
|
139
|
-
Write-Host "│ 快速开始 / Quick Start: │" -ForegroundColor Green
|
|
140
|
-
Write-Host "│ opc init my-agent # 创建 Agent │" -ForegroundColor Green
|
|
141
|
-
Write-Host "│ cd my-agent; npm i │" -ForegroundColor Green
|
|
142
|
-
Write-Host "│ opc chat # 开始对话 │" -ForegroundColor Green
|
|
143
|
-
Write-Host "│ │" -ForegroundColor Green
|
|
144
|
-
Write-Host "│ 可视化面板 / Dashboard: │" -ForegroundColor Green
|
|
145
|
-
Write-Host "│ opc studio │" -ForegroundColor Green
|
|
146
|
-
Write-Host "│ │" -ForegroundColor Green
|
|
147
|
-
Write-Host "│
|
|
148
|
-
Write-Host "│ opc
|
|
149
|
-
Write-Host "└─────────────────────────────────────────────────┘" -ForegroundColor Green
|
|
150
|
-
Write-Host ""
|
|
151
|
-
|
|
152
|
-
if (Confirm-Action "现在打开 OPC Studio? / Open OPC Studio now?") {
|
|
153
|
-
opc studio
|
|
154
|
-
}
|
|
1
|
+
# ============================================================================
|
|
2
|
+
# OPC Agent 一键安装脚本 for Windows
|
|
3
|
+
# 用法: irm https://raw.githubusercontent.com/Deepleaper/opc-agent/main/install.ps1 | iex
|
|
4
|
+
# 高级: $env:OPC_YES='1'; $env:OPC_NO_OLLAMA='1'; irm ... | iex
|
|
5
|
+
# ============================================================================
|
|
6
|
+
|
|
7
|
+
$ErrorActionPreference = "Stop"
|
|
8
|
+
|
|
9
|
+
# ── 颜色输出 ──────────────────────────────────────────────────
|
|
10
|
+
function Write-Step($msg) { Write-Host "`n━━━ $msg ━━━" -ForegroundColor Blue }
|
|
11
|
+
function Write-Ok($msg) { Write-Host "✅ $msg" -ForegroundColor Green }
|
|
12
|
+
function Write-Warn($msg) { Write-Host "⚠️ $msg" -ForegroundColor Yellow }
|
|
13
|
+
function Write-Err($msg) { Write-Host "❌ $msg" -ForegroundColor Red }
|
|
14
|
+
function Write-Info($msg) { Write-Host "ℹ️ $msg" -ForegroundColor Cyan }
|
|
15
|
+
|
|
16
|
+
$AutoYes = $env:OPC_YES -eq '1'
|
|
17
|
+
$SkipOllama = $env:OPC_NO_OLLAMA -eq '1'
|
|
18
|
+
|
|
19
|
+
function Confirm-Action($prompt) {
|
|
20
|
+
if ($AutoYes) { return $true }
|
|
21
|
+
$choice = Read-Host "❓ $prompt [Y/n]"
|
|
22
|
+
return ($choice -ne 'n' -and $choice -ne 'N' -and $choice -ne 'no')
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
# ── 检测操作系统 ──────────────────────────────────────────────
|
|
26
|
+
Write-Step "🔍 检测操作系统 / Detecting OS"
|
|
27
|
+
Write-Ok "Windows $([System.Environment]::OSVersion.Version) detected"
|
|
28
|
+
|
|
29
|
+
# ── 检测 & 安装 Node.js ──────────────────────────────────────
|
|
30
|
+
Write-Step "📦 检测 Node.js / Checking Node.js"
|
|
31
|
+
$NeedNode = $false
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
$nodeVer = (node -v) -replace 'v','' -split '\.' | Select-Object -First 1
|
|
35
|
+
if ([int]$nodeVer -ge 18) {
|
|
36
|
+
Write-Ok "Node.js $(node -v) 已安装 / installed"
|
|
37
|
+
} else {
|
|
38
|
+
Write-Warn "Node.js $(node -v) 版本过低,需要 18+ / version too old"
|
|
39
|
+
$NeedNode = $true
|
|
40
|
+
}
|
|
41
|
+
} catch {
|
|
42
|
+
Write-Warn "未检测到 Node.js / Node.js not found"
|
|
43
|
+
$NeedNode = $true
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if ($NeedNode) {
|
|
47
|
+
Write-Info "将安装 Node.js 22 LTS / Installing Node.js 22 LTS"
|
|
48
|
+
if (Confirm-Action "安装 Node.js 22? / Install Node.js 22?") {
|
|
49
|
+
$installed = $false
|
|
50
|
+
# 尝试 winget
|
|
51
|
+
try {
|
|
52
|
+
winget install OpenJS.NodeJS.LTS --accept-package-agreements --accept-source-agreements
|
|
53
|
+
$installed = $true
|
|
54
|
+
Write-Ok "Node.js 通过 winget 安装成功 / installed via winget"
|
|
55
|
+
} catch {}
|
|
56
|
+
|
|
57
|
+
# 尝试 choco
|
|
58
|
+
if (-not $installed) {
|
|
59
|
+
try {
|
|
60
|
+
choco install nodejs-lts -y
|
|
61
|
+
$installed = $true
|
|
62
|
+
Write-Ok "Node.js 通过 Chocolatey 安装成功 / installed via Chocolatey"
|
|
63
|
+
} catch {}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (-not $installed) {
|
|
67
|
+
Write-Err "自动安装失败 / Auto-install failed"
|
|
68
|
+
Write-Info "请手动下载安装 / Please download manually: https://nodejs.org/"
|
|
69
|
+
Start-Process "https://nodejs.org/en/download/"
|
|
70
|
+
exit 1
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# 刷新 PATH
|
|
74
|
+
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
|
|
75
|
+
} else {
|
|
76
|
+
Write-Err "Node.js 是必需的 / Node.js is required"
|
|
77
|
+
Write-Info "下载地址 / Download: https://nodejs.org/"
|
|
78
|
+
exit 1
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
# ── 安装 OPC Agent ────────────────────────────────────────────
|
|
83
|
+
Write-Step "🚀 安装 OPC Agent / Installing OPC Agent"
|
|
84
|
+
Write-Info "npm install -g opc-agent ..."
|
|
85
|
+
npm install -g opc-agent
|
|
86
|
+
Write-Ok "OPC Agent 安装成功 / installed"
|
|
87
|
+
|
|
88
|
+
# ── Ollama(可选)─────────────────────────────────────────────
|
|
89
|
+
if (-not $SkipOllama) {
|
|
90
|
+
Write-Step "🦙 检测 Ollama / Checking Ollama"
|
|
91
|
+
|
|
92
|
+
$hasOllama = $false
|
|
93
|
+
try { ollama --version 2>$null; $hasOllama = $true } catch {}
|
|
94
|
+
|
|
95
|
+
if ($hasOllama) {
|
|
96
|
+
Write-Ok "Ollama 已安装 / installed"
|
|
97
|
+
} else {
|
|
98
|
+
Write-Warn "未检测到 Ollama / Ollama not found"
|
|
99
|
+
Write-Info "Ollama 可让你在本地运行 AI 模型(免费、数据不出门)"
|
|
100
|
+
Write-Info "Ollama lets you run AI models locally (free, private)"
|
|
101
|
+
|
|
102
|
+
if (Confirm-Action "安装 Ollama? / Install Ollama?") {
|
|
103
|
+
try {
|
|
104
|
+
winget install Ollama.Ollama --accept-package-agreements --accept-source-agreements
|
|
105
|
+
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
|
|
106
|
+
Write-Ok "Ollama 安装成功 / installed"
|
|
107
|
+
$hasOllama = $true
|
|
108
|
+
} catch {
|
|
109
|
+
Write-Warn "winget 安装失败,请手动下载 / Please download manually: https://ollama.com/download"
|
|
110
|
+
Start-Process "https://ollama.com/download"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
# 拉取推荐模型
|
|
116
|
+
if ($hasOllama) {
|
|
117
|
+
Write-Step "🧠 推荐模型 / Recommended Models"
|
|
118
|
+
Write-Info "推荐拉取以下模型用于本地 Agent:"
|
|
119
|
+
Write-Info " • qwen2.5:7b — 中英文对话(4.7GB)"
|
|
120
|
+
Write-Info " • nomic-embed-text — 文本向量化(274MB)"
|
|
121
|
+
|
|
122
|
+
if (Confirm-Action "拉取推荐模型? / Pull recommended models?") {
|
|
123
|
+
Write-Info "拉取 qwen2.5:7b ... (可能需要几分钟)"
|
|
124
|
+
try { ollama pull qwen2.5:7b; Write-Ok "qwen2.5:7b ✓" } catch { Write-Warn "拉取失败,可稍后手动: ollama pull qwen2.5:7b" }
|
|
125
|
+
|
|
126
|
+
Write-Info "拉取 nomic-embed-text ..."
|
|
127
|
+
try { ollama pull nomic-embed-text; Write-Ok "nomic-embed-text ✓" } catch { Write-Warn "拉取失败,可稍后手动: ollama pull nomic-embed-text" }
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
# ── 完成 ──────────────────────────────────────────────────────
|
|
133
|
+
Write-Step "🎉 安装完成!/ Installation Complete!"
|
|
134
|
+
Write-Host ""
|
|
135
|
+
Write-Host "┌─────────────────────────────────────────────────┐" -ForegroundColor Green
|
|
136
|
+
Write-Host "│ OPC Agent 已安装成功! │" -ForegroundColor Green
|
|
137
|
+
Write-Host "│ OPC Agent installed successfully! │" -ForegroundColor Green
|
|
138
|
+
Write-Host "│ │" -ForegroundColor Green
|
|
139
|
+
Write-Host "│ 快速开始 / Quick Start: │" -ForegroundColor Green
|
|
140
|
+
Write-Host "│ opc init my-agent # 创建 Agent │" -ForegroundColor Green
|
|
141
|
+
Write-Host "│ cd my-agent; npm i │" -ForegroundColor Green
|
|
142
|
+
Write-Host "│ opc chat # 开始对话 │" -ForegroundColor Green
|
|
143
|
+
Write-Host "│ │" -ForegroundColor Green
|
|
144
|
+
Write-Host "│ 可视化面板 / Dashboard: │" -ForegroundColor Green
|
|
145
|
+
Write-Host "│ opc studio │" -ForegroundColor Green
|
|
146
|
+
Write-Host "│ │" -ForegroundColor Green
|
|
147
|
+
Write-Host "│ 帮助 / Help: │" -ForegroundColor Green
|
|
148
|
+
Write-Host "│ opc --help │" -ForegroundColor Green
|
|
149
|
+
Write-Host "└─────────────────────────────────────────────────┘" -ForegroundColor Green
|
|
150
|
+
Write-Host ""
|
|
151
|
+
|
|
152
|
+
if (Confirm-Action "现在打开 OPC Studio? / Open OPC Studio now?") {
|
|
153
|
+
opc studio
|
|
154
|
+
}
|
package/install.sh
CHANGED
|
@@ -1,164 +1,164 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# ============================================================================
|
|
3
|
-
# OPC Agent 一键安装脚本 (macOS / Linux / WSL)
|
|
4
|
-
# 用法: curl -fsSL https://raw.githubusercontent.com/Deepleaper/opc-agent/main/install.sh | bash
|
|
5
|
-
# 高级: curl -fsSL ... | bash -s -- --yes --no-ollama
|
|
6
|
-
# ============================================================================
|
|
7
|
-
|
|
8
|
-
set -e
|
|
9
|
-
|
|
10
|
-
# ── 颜色 & Emoji ──────────────────────────────────────────────
|
|
11
|
-
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; CYAN='\033[0;36m'; NC='\033[0m'
|
|
12
|
-
info() { echo -e "${CYAN}ℹ️ $1${NC}"; }
|
|
13
|
-
ok() { echo -e "${GREEN}✅ $1${NC}"; }
|
|
14
|
-
warn() { echo -e "${YELLOW}⚠️ $1${NC}"; }
|
|
15
|
-
err() { echo -e "${RED}❌ $1${NC}"; }
|
|
16
|
-
step() { echo -e "\n${BLUE}━━━ $1 ━━━${NC}"; }
|
|
17
|
-
|
|
18
|
-
# ── 参数解析 ──────────────────────────────────────────────────
|
|
19
|
-
AUTO_YES=false
|
|
20
|
-
SKIP_OLLAMA=false
|
|
21
|
-
for arg in "$@"; do
|
|
22
|
-
case "$arg" in
|
|
23
|
-
--yes|-y) AUTO_YES=true ;;
|
|
24
|
-
--no-ollama) SKIP_OLLAMA=true ;;
|
|
25
|
-
esac
|
|
26
|
-
done
|
|
27
|
-
|
|
28
|
-
confirm() {
|
|
29
|
-
if $AUTO_YES; then return 0; fi
|
|
30
|
-
read -r -p "$(echo -e "${YELLOW}❓ $1 [Y/n]: ${NC}")" choice
|
|
31
|
-
case "$choice" in n|N|no|NO) return 1 ;; *) return 0 ;; esac
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
# ── 检测操作系统 ──────────────────────────────────────────────
|
|
35
|
-
step "🔍 检测操作系统 / Detecting OS"
|
|
36
|
-
OS="unknown"
|
|
37
|
-
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
38
|
-
OS="macos"
|
|
39
|
-
ok "macOS detected"
|
|
40
|
-
elif grep -qi microsoft /proc/version 2>/dev/null; then
|
|
41
|
-
OS="wsl"
|
|
42
|
-
ok "WSL (Windows Subsystem for Linux) detected"
|
|
43
|
-
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
|
44
|
-
OS="linux"
|
|
45
|
-
ok "Linux detected"
|
|
46
|
-
else
|
|
47
|
-
err "不支持的操作系统 / Unsupported OS: $OSTYPE"
|
|
48
|
-
exit 1
|
|
49
|
-
fi
|
|
50
|
-
|
|
51
|
-
# ── 检测 & 安装 Node.js ──────────────────────────────────────
|
|
52
|
-
step "📦 检测 Node.js / Checking Node.js"
|
|
53
|
-
NEED_NODE=false
|
|
54
|
-
|
|
55
|
-
if command -v node &>/dev/null; then
|
|
56
|
-
NODE_VER=$(node -v | sed 's/v//' | cut -d. -f1)
|
|
57
|
-
if [ "$NODE_VER" -ge 18 ]; then
|
|
58
|
-
ok "Node.js $(node -v) 已安装 / installed"
|
|
59
|
-
else
|
|
60
|
-
warn "Node.js $(node -v) 版本过低,需要 18+ / version too old, need 18+"
|
|
61
|
-
NEED_NODE=true
|
|
62
|
-
fi
|
|
63
|
-
else
|
|
64
|
-
warn "未检测到 Node.js / Node.js not found"
|
|
65
|
-
NEED_NODE=true
|
|
66
|
-
fi
|
|
67
|
-
|
|
68
|
-
if $NEED_NODE; then
|
|
69
|
-
info "将通过 nvm 安装 Node.js 22 LTS / Installing Node.js 22 via nvm"
|
|
70
|
-
if confirm "安装 Node.js 22? / Install Node.js 22?"; then
|
|
71
|
-
if command -v nvm &>/dev/null || [ -s "$HOME/.nvm/nvm.sh" ]; then
|
|
72
|
-
[ -s "$HOME/.nvm/nvm.sh" ] && . "$HOME/.nvm/nvm.sh"
|
|
73
|
-
info "nvm 已存在,安装 Node 22... / nvm found, installing Node 22..."
|
|
74
|
-
else
|
|
75
|
-
info "安装 nvm... / Installing nvm..."
|
|
76
|
-
curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
|
|
77
|
-
export NVM_DIR="$HOME/.nvm"
|
|
78
|
-
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
|
|
79
|
-
fi
|
|
80
|
-
nvm install 22
|
|
81
|
-
nvm use 22
|
|
82
|
-
ok "Node.js $(node -v) 安装成功 / installed successfully"
|
|
83
|
-
else
|
|
84
|
-
err "Node.js 是必需的 / Node.js is required"
|
|
85
|
-
echo "手动安装 / Manual install: https://nodejs.org/"
|
|
86
|
-
exit 1
|
|
87
|
-
fi
|
|
88
|
-
fi
|
|
89
|
-
|
|
90
|
-
# ── 安装 OPC Agent ────────────────────────────────────────────
|
|
91
|
-
step "🚀 安装 OPC Agent / Installing OPC Agent"
|
|
92
|
-
info "npm install -g opc-agent ..."
|
|
93
|
-
npm install -g opc-agent
|
|
94
|
-
ok "OPC Agent $(opc --version 2>/dev/null || echo '') 安装成功 / installed"
|
|
95
|
-
|
|
96
|
-
# ── Ollama(可选)─────────────────────────────────────────────
|
|
97
|
-
if ! $SKIP_OLLAMA; then
|
|
98
|
-
step "🦙 检测 Ollama / Checking Ollama"
|
|
99
|
-
|
|
100
|
-
if command -v ollama &>/dev/null; then
|
|
101
|
-
ok "Ollama 已安装 / installed ($(ollama --version 2>/dev/null || echo 'ok'))"
|
|
102
|
-
else
|
|
103
|
-
warn "未检测到 Ollama / Ollama not found"
|
|
104
|
-
info "Ollama 可让你在本地运行 AI 模型(免费、数据不出门)"
|
|
105
|
-
info "Ollama lets you run AI models locally (free, private)"
|
|
106
|
-
|
|
107
|
-
if confirm "安装 Ollama? / Install Ollama?"; then
|
|
108
|
-
if [ "$OS" = "macos" ]; then
|
|
109
|
-
if command -v brew &>/dev/null; then
|
|
110
|
-
brew install ollama
|
|
111
|
-
else
|
|
112
|
-
info "请从 https://ollama.com/download 下载安装"
|
|
113
|
-
info "Download from https://ollama.com/download"
|
|
114
|
-
open "https://ollama.com/download" 2>/dev/null || true
|
|
115
|
-
fi
|
|
116
|
-
else
|
|
117
|
-
curl -fsSL https://ollama.com/install.sh | sh
|
|
118
|
-
fi
|
|
119
|
-
ok "Ollama 安装成功 / installed"
|
|
120
|
-
else
|
|
121
|
-
info "跳过 Ollama / Skipping Ollama"
|
|
122
|
-
fi
|
|
123
|
-
fi
|
|
124
|
-
|
|
125
|
-
# 拉取推荐模型
|
|
126
|
-
if command -v ollama &>/dev/null; then
|
|
127
|
-
step "🧠 推荐模型 / Recommended Models"
|
|
128
|
-
info "推荐拉取以下模型用于本地 Agent:"
|
|
129
|
-
info " • qwen2.5:7b — 中英文对话(4.7GB)"
|
|
130
|
-
info " • nomic-embed-text — 文本向量化(274MB)"
|
|
131
|
-
|
|
132
|
-
if confirm "拉取推荐模型? / Pull recommended models?"; then
|
|
133
|
-
info "拉取 qwen2.5:7b ... (可能需要几分钟)"
|
|
134
|
-
ollama pull qwen2.5:7b && ok "qwen2.5:7b ✓" || warn "qwen2.5:7b 拉取失败,可稍后手动: ollama pull qwen2.5:7b"
|
|
135
|
-
|
|
136
|
-
info "拉取 nomic-embed-text ..."
|
|
137
|
-
ollama pull nomic-embed-text && ok "nomic-embed-text ✓" || warn "拉取失败,可稍后手动: ollama pull nomic-embed-text"
|
|
138
|
-
fi
|
|
139
|
-
fi
|
|
140
|
-
fi
|
|
141
|
-
|
|
142
|
-
# ── 启动 Studio ───────────────────────────────────────────────
|
|
143
|
-
step "🎉 安装完成!/ Installation Complete!"
|
|
144
|
-
echo ""
|
|
145
|
-
echo -e "${GREEN}┌─────────────────────────────────────────────────┐${NC}"
|
|
146
|
-
echo -e "${GREEN}│ OPC Agent 已安装成功! │${NC}"
|
|
147
|
-
echo -e "${GREEN}│ OPC Agent installed successfully! │${NC}"
|
|
148
|
-
echo -e "${GREEN}│ │${NC}"
|
|
149
|
-
echo -e "${GREEN}│ 快速开始 / Quick Start: │${NC}"
|
|
150
|
-
echo -e "${GREEN}│ opc init my-agent # 创建 Agent │${NC}"
|
|
151
|
-
echo -e "${GREEN}│ cd my-agent && npm i │${NC}"
|
|
152
|
-
echo -e "${GREEN}│ opc chat # 开始对话 │${NC}"
|
|
153
|
-
echo -e "${GREEN}│ │${NC}"
|
|
154
|
-
echo -e "${GREEN}│ 可视化面板 / Dashboard: │${NC}"
|
|
155
|
-
echo -e "${GREEN}│ opc studio │${NC}"
|
|
156
|
-
echo -e "${GREEN}│ │${NC}"
|
|
157
|
-
echo -e "${GREEN}│
|
|
158
|
-
echo -e "${GREEN}│ opc
|
|
159
|
-
echo -e "${GREEN}└─────────────────────────────────────────────────┘${NC}"
|
|
160
|
-
echo ""
|
|
161
|
-
|
|
162
|
-
if confirm "现在打开 OPC Studio? / Open OPC Studio now?"; then
|
|
163
|
-
opc studio
|
|
164
|
-
fi
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ============================================================================
|
|
3
|
+
# OPC Agent 一键安装脚本 (macOS / Linux / WSL)
|
|
4
|
+
# 用法: curl -fsSL https://raw.githubusercontent.com/Deepleaper/opc-agent/main/install.sh | bash
|
|
5
|
+
# 高级: curl -fsSL ... | bash -s -- --yes --no-ollama
|
|
6
|
+
# ============================================================================
|
|
7
|
+
|
|
8
|
+
set -e
|
|
9
|
+
|
|
10
|
+
# ── 颜色 & Emoji ──────────────────────────────────────────────
|
|
11
|
+
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; CYAN='\033[0;36m'; NC='\033[0m'
|
|
12
|
+
info() { echo -e "${CYAN}ℹ️ $1${NC}"; }
|
|
13
|
+
ok() { echo -e "${GREEN}✅ $1${NC}"; }
|
|
14
|
+
warn() { echo -e "${YELLOW}⚠️ $1${NC}"; }
|
|
15
|
+
err() { echo -e "${RED}❌ $1${NC}"; }
|
|
16
|
+
step() { echo -e "\n${BLUE}━━━ $1 ━━━${NC}"; }
|
|
17
|
+
|
|
18
|
+
# ── 参数解析 ──────────────────────────────────────────────────
|
|
19
|
+
AUTO_YES=false
|
|
20
|
+
SKIP_OLLAMA=false
|
|
21
|
+
for arg in "$@"; do
|
|
22
|
+
case "$arg" in
|
|
23
|
+
--yes|-y) AUTO_YES=true ;;
|
|
24
|
+
--no-ollama) SKIP_OLLAMA=true ;;
|
|
25
|
+
esac
|
|
26
|
+
done
|
|
27
|
+
|
|
28
|
+
confirm() {
|
|
29
|
+
if $AUTO_YES; then return 0; fi
|
|
30
|
+
read -r -p "$(echo -e "${YELLOW}❓ $1 [Y/n]: ${NC}")" choice
|
|
31
|
+
case "$choice" in n|N|no|NO) return 1 ;; *) return 0 ;; esac
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
# ── 检测操作系统 ──────────────────────────────────────────────
|
|
35
|
+
step "🔍 检测操作系统 / Detecting OS"
|
|
36
|
+
OS="unknown"
|
|
37
|
+
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
38
|
+
OS="macos"
|
|
39
|
+
ok "macOS detected"
|
|
40
|
+
elif grep -qi microsoft /proc/version 2>/dev/null; then
|
|
41
|
+
OS="wsl"
|
|
42
|
+
ok "WSL (Windows Subsystem for Linux) detected"
|
|
43
|
+
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
|
44
|
+
OS="linux"
|
|
45
|
+
ok "Linux detected"
|
|
46
|
+
else
|
|
47
|
+
err "不支持的操作系统 / Unsupported OS: $OSTYPE"
|
|
48
|
+
exit 1
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
# ── 检测 & 安装 Node.js ──────────────────────────────────────
|
|
52
|
+
step "📦 检测 Node.js / Checking Node.js"
|
|
53
|
+
NEED_NODE=false
|
|
54
|
+
|
|
55
|
+
if command -v node &>/dev/null; then
|
|
56
|
+
NODE_VER=$(node -v | sed 's/v//' | cut -d. -f1)
|
|
57
|
+
if [ "$NODE_VER" -ge 18 ]; then
|
|
58
|
+
ok "Node.js $(node -v) 已安装 / installed"
|
|
59
|
+
else
|
|
60
|
+
warn "Node.js $(node -v) 版本过低,需要 18+ / version too old, need 18+"
|
|
61
|
+
NEED_NODE=true
|
|
62
|
+
fi
|
|
63
|
+
else
|
|
64
|
+
warn "未检测到 Node.js / Node.js not found"
|
|
65
|
+
NEED_NODE=true
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
if $NEED_NODE; then
|
|
69
|
+
info "将通过 nvm 安装 Node.js 22 LTS / Installing Node.js 22 via nvm"
|
|
70
|
+
if confirm "安装 Node.js 22? / Install Node.js 22?"; then
|
|
71
|
+
if command -v nvm &>/dev/null || [ -s "$HOME/.nvm/nvm.sh" ]; then
|
|
72
|
+
[ -s "$HOME/.nvm/nvm.sh" ] && . "$HOME/.nvm/nvm.sh"
|
|
73
|
+
info "nvm 已存在,安装 Node 22... / nvm found, installing Node 22..."
|
|
74
|
+
else
|
|
75
|
+
info "安装 nvm... / Installing nvm..."
|
|
76
|
+
curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
|
|
77
|
+
export NVM_DIR="$HOME/.nvm"
|
|
78
|
+
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
|
|
79
|
+
fi
|
|
80
|
+
nvm install 22
|
|
81
|
+
nvm use 22
|
|
82
|
+
ok "Node.js $(node -v) 安装成功 / installed successfully"
|
|
83
|
+
else
|
|
84
|
+
err "Node.js 是必需的 / Node.js is required"
|
|
85
|
+
echo "手动安装 / Manual install: https://nodejs.org/"
|
|
86
|
+
exit 1
|
|
87
|
+
fi
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
# ── 安装 OPC Agent ────────────────────────────────────────────
|
|
91
|
+
step "🚀 安装 OPC Agent / Installing OPC Agent"
|
|
92
|
+
info "npm install -g opc-agent ..."
|
|
93
|
+
npm install -g opc-agent
|
|
94
|
+
ok "OPC Agent $(opc --version 2>/dev/null || echo '') 安装成功 / installed"
|
|
95
|
+
|
|
96
|
+
# ── Ollama(可选)─────────────────────────────────────────────
|
|
97
|
+
if ! $SKIP_OLLAMA; then
|
|
98
|
+
step "🦙 检测 Ollama / Checking Ollama"
|
|
99
|
+
|
|
100
|
+
if command -v ollama &>/dev/null; then
|
|
101
|
+
ok "Ollama 已安装 / installed ($(ollama --version 2>/dev/null || echo 'ok'))"
|
|
102
|
+
else
|
|
103
|
+
warn "未检测到 Ollama / Ollama not found"
|
|
104
|
+
info "Ollama 可让你在本地运行 AI 模型(免费、数据不出门)"
|
|
105
|
+
info "Ollama lets you run AI models locally (free, private)"
|
|
106
|
+
|
|
107
|
+
if confirm "安装 Ollama? / Install Ollama?"; then
|
|
108
|
+
if [ "$OS" = "macos" ]; then
|
|
109
|
+
if command -v brew &>/dev/null; then
|
|
110
|
+
brew install ollama
|
|
111
|
+
else
|
|
112
|
+
info "请从 https://ollama.com/download 下载安装"
|
|
113
|
+
info "Download from https://ollama.com/download"
|
|
114
|
+
open "https://ollama.com/download" 2>/dev/null || true
|
|
115
|
+
fi
|
|
116
|
+
else
|
|
117
|
+
curl -fsSL https://ollama.com/install.sh | sh
|
|
118
|
+
fi
|
|
119
|
+
ok "Ollama 安装成功 / installed"
|
|
120
|
+
else
|
|
121
|
+
info "跳过 Ollama / Skipping Ollama"
|
|
122
|
+
fi
|
|
123
|
+
fi
|
|
124
|
+
|
|
125
|
+
# 拉取推荐模型
|
|
126
|
+
if command -v ollama &>/dev/null; then
|
|
127
|
+
step "🧠 推荐模型 / Recommended Models"
|
|
128
|
+
info "推荐拉取以下模型用于本地 Agent:"
|
|
129
|
+
info " • qwen2.5:7b — 中英文对话(4.7GB)"
|
|
130
|
+
info " • nomic-embed-text — 文本向量化(274MB)"
|
|
131
|
+
|
|
132
|
+
if confirm "拉取推荐模型? / Pull recommended models?"; then
|
|
133
|
+
info "拉取 qwen2.5:7b ... (可能需要几分钟)"
|
|
134
|
+
ollama pull qwen2.5:7b && ok "qwen2.5:7b ✓" || warn "qwen2.5:7b 拉取失败,可稍后手动: ollama pull qwen2.5:7b"
|
|
135
|
+
|
|
136
|
+
info "拉取 nomic-embed-text ..."
|
|
137
|
+
ollama pull nomic-embed-text && ok "nomic-embed-text ✓" || warn "拉取失败,可稍后手动: ollama pull nomic-embed-text"
|
|
138
|
+
fi
|
|
139
|
+
fi
|
|
140
|
+
fi
|
|
141
|
+
|
|
142
|
+
# ── 启动 Studio ───────────────────────────────────────────────
|
|
143
|
+
step "🎉 安装完成!/ Installation Complete!"
|
|
144
|
+
echo ""
|
|
145
|
+
echo -e "${GREEN}┌─────────────────────────────────────────────────┐${NC}"
|
|
146
|
+
echo -e "${GREEN}│ OPC Agent 已安装成功! │${NC}"
|
|
147
|
+
echo -e "${GREEN}│ OPC Agent installed successfully! │${NC}"
|
|
148
|
+
echo -e "${GREEN}│ │${NC}"
|
|
149
|
+
echo -e "${GREEN}│ 快速开始 / Quick Start: │${NC}"
|
|
150
|
+
echo -e "${GREEN}│ opc init my-agent # 创建 Agent │${NC}"
|
|
151
|
+
echo -e "${GREEN}│ cd my-agent && npm i │${NC}"
|
|
152
|
+
echo -e "${GREEN}│ opc chat # 开始对话 │${NC}"
|
|
153
|
+
echo -e "${GREEN}│ │${NC}"
|
|
154
|
+
echo -e "${GREEN}│ 可视化面板 / Dashboard: │${NC}"
|
|
155
|
+
echo -e "${GREEN}│ opc studio │${NC}"
|
|
156
|
+
echo -e "${GREEN}│ │${NC}"
|
|
157
|
+
echo -e "${GREEN}│ 帮助 / Help: │${NC}"
|
|
158
|
+
echo -e "${GREEN}│ opc --help │${NC}"
|
|
159
|
+
echo -e "${GREEN}└─────────────────────────────────────────────────┘${NC}"
|
|
160
|
+
echo ""
|
|
161
|
+
|
|
162
|
+
if confirm "现在打开 OPC Studio? / Open OPC Studio now?"; then
|
|
163
|
+
opc studio
|
|
164
|
+
fi
|