@bolloon/bolloon-agent 0.3.51 → 0.4.0
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 +135 -135
- package/bin/bolloon-cli.cjs +183 -183
- package/bin/bolloon.cjs +0 -0
- package/bin/bolloon.js +157 -0
- package/dist/agents/constraint-layer.js +19 -19
- package/dist/agents/judgment-protocol.js +14 -14
- package/dist/agents/loop-review.js +21 -0
- package/dist/agents/pi-sdk-tools.js +86 -2
- package/dist/agents/pi-sdk-types.js +12 -12
- package/dist/agents/pi-sdk.js +90 -90
- package/dist/agents/shell-guard.js +22 -1
- package/dist/agents/skill-organizer.js +19 -19
- package/dist/agents/verify-recipe.js +84 -0
- package/dist/agents/workflow-pivot-loop.js +101 -13
- package/dist/bollharness/src/scripts/deploy-guard.js +8 -8
- package/dist/bollharness-integration/context-router-judgment.js +4 -4
- package/dist/bollharness-integration/context-router.js +292 -292
- package/dist/bollharness-integration/gate-state-machine.js +13 -13
- package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
- package/dist/bollharness-integration/skill-adapter.js +21 -21
- package/dist/bootstrap/chat-archiver.js +14 -14
- package/dist/bootstrap/context-os.js +50 -40
- package/dist/bootstrap/memory-compressor.js +13 -13
- package/dist/cli-entry.js +36 -36
- package/dist/context-compaction/auto-compact.js +7 -7
- package/dist/electron/first-run.js +54 -54
- package/dist/electron-build/electron/first-run.js +54 -54
- package/dist/electron-preload.js.map +1 -1
- package/dist/electron.js.map +1 -1
- package/dist/external-engines/delegate-handle.js +70 -0
- package/dist/external-engines/delegate.js +24 -3
- package/dist/index.js +112 -112
- package/dist/llm/error-lessons.js +53 -0
- package/dist/llm/llm-judgment-client.js +102 -102
- package/dist/llm/pi-ai.js +61 -48
- package/dist/llm/system-prompt/layers/channel/human-async.md +41 -41
- package/dist/llm/system-prompt/layers/channel/local.md +14 -14
- package/dist/llm/system-prompt/layers/channel/p2p-agent.md +18 -18
- package/dist/llm/system-prompt/layers/channel/p2p-peer-sync.md +51 -51
- package/dist/llm/system-prompt/layers/channel/p2p-proactive.md +43 -43
- package/dist/llm/system-prompt/layers/channel/p2p-visitor.md +19 -19
- package/dist/llm/system-prompt/layers/channel/session-handoff.md +61 -61
- package/dist/llm/system-prompt/layers/core/artifacts_storage.md +89 -89
- package/dist/llm/system-prompt/layers/core/evenhandedness.md +21 -21
- package/dist/llm/system-prompt/layers/core/external-engagement.md +73 -73
- package/dist/llm/system-prompt/layers/core/hibs_reminders.md +15 -15
- package/dist/llm/system-prompt/layers/core/identity.md +48 -48
- package/dist/llm/system-prompt/layers/core/knowledge.md +17 -17
- package/dist/llm/system-prompt/layers/core/memory_system.md +12 -12
- package/dist/llm/system-prompt/layers/core/network_filesystem.md +28 -28
- package/dist/llm/system-prompt/layers/core/refusal.md +37 -37
- package/dist/llm/system-prompt/layers/core/tone.md +31 -31
- package/dist/llm/system-prompt/layers/core/tools.thin.md +13 -13
- package/dist/llm/system-prompt/layers/core/wellbeing.md +41 -41
- package/dist/llm/system-prompt/layers/role/architect.md +20 -20
- package/dist/llm/system-prompt/layers/role/expert.md +19 -19
- package/dist/llm/system-prompt/layers/role/implementer.md +15 -15
- package/dist/llm/system-prompt/layers/role/security.md +15 -15
- package/dist/llm/system-prompt/layers/tool/artifacts.md +72 -72
- package/dist/llm/system-prompt/layers/tool/bash.md +25 -25
- package/dist/llm/system-prompt/layers/tool/goal_handoff.md +77 -77
- package/dist/llm/system-prompt/layers/tool/hibs_api.md +171 -171
- package/dist/llm/system-prompt/layers/tool/image_search.md +70 -70
- package/dist/llm/system-prompt/layers/tool/manifest.md +89 -89
- package/dist/llm/system-prompt/layers/tool/mcp_apps.md +53 -53
- package/dist/llm/system-prompt/layers/tool/p2p_request.md +61 -61
- package/dist/llm/system-prompt/layers/tool/web_search.md +83 -83
- package/dist/llm/system-prompt/registry.js +9 -1
- package/dist/llm/tool-manifest/ask_user_input.js +1 -1
- package/dist/llm/tool-manifest/bash.js +3 -3
- package/dist/llm/tool-manifest/create_file.js +4 -4
- package/dist/llm/tool-manifest/fetch_sports_data.js +3 -3
- package/dist/llm/tool-manifest/image_search.js +2 -2
- package/dist/llm/tool-manifest/index.js +0 -59
- package/dist/llm/tool-manifest/mcp.js +2 -2
- package/dist/llm/tool-manifest/message_compose.js +3 -3
- package/dist/llm/tool-manifest/places.js +2 -2
- package/dist/llm/tool-manifest/present_files.js +1 -1
- package/dist/llm/tool-manifest/recipe.js +2 -2
- package/dist/llm/tool-manifest/str_replace.js +5 -5
- package/dist/llm/tool-manifest/view.js +3 -3
- package/dist/llm/tool-manifest/weather.js +4 -4
- package/dist/llm/tool-manifest/web.js +4 -4
- package/dist/locales/en.js +28 -0
- package/dist/locales/zh.js +26 -0
- package/dist/pi-ecosystem-colony/index.js +365 -0
- package/dist/pi-ecosystem-judgment/causal-judge.js +51 -51
- package/dist/pi-ecosystem-judgment/distill-prompt.js +42 -42
- package/dist/pi-ecosystem-judgment/distillation.js +14 -14
- package/dist/pi-ecosystem-judgment/monitor-gate.js +28 -28
- package/dist/pi-ecosystem-judgment/value-injection.js +102 -102
- package/dist/security/context-router-tool.js +15 -15
- package/dist/social/ant-colony/AdaptiveHeartbeat.js +101 -0
- package/dist/social/ant-colony/PheromoneEngine.js +227 -0
- package/dist/social/ant-colony/index.js +6 -0
- package/dist/social/ant-colony/types.js +24 -0
- package/dist/storage/trajectory.js +101 -0
- package/dist/test/ai-judgment-test.js +80 -0
- package/dist/test/bollharness-integration.test.js +318 -0
- package/dist/test/channel-agent-multi-dialogue.js +205 -0
- package/dist/test/channel-heartbeat-agent-test.js +201 -0
- package/dist/test/constraint-layer.test.js +164 -0
- package/dist/test/diap-identity-test.js +172 -0
- package/dist/test/diap-quick-test.js +62 -0
- package/dist/test/global-shared-context.test.js +315 -0
- package/dist/test/harness-judgment-injection.test.js +246 -0
- package/dist/test/harness-workflow-integrator-test.js +228 -0
- package/dist/test/human-value-store.test.js +243 -0
- package/dist/test/hybrid-integration-test.js +118 -0
- package/dist/test/hybrid-messenger-verify.js +55 -0
- package/dist/test/iroh-bistream-debug.js +38 -0
- package/dist/test/iroh-communication.test.js +66 -0
- package/dist/test/iroh-debug-test.js +57 -0
- package/dist/test/iroh-diap-test.js +71 -0
- package/dist/test/iroh-direct-connect.js +55 -0
- package/dist/test/iroh-e2e-fixed.js +89 -0
- package/dist/test/iroh-e2e-same-process.js +63 -0
- package/dist/test/iroh-e2e.js +66 -0
- package/dist/test/iroh-final-e2e.js +72 -0
- package/dist/test/iroh-relay-test.js +37 -0
- package/dist/test/iroh-simple-test.js +41 -0
- package/dist/test/iroh-transport-verify.js +54 -0
- package/dist/test/iroh-transport.test.js +37 -0
- package/dist/test/iroh-two-nodes.js +70 -0
- package/dist/test/iroh-verify.js +44 -0
- package/dist/test/judgment-decision.test.js +219 -0
- package/dist/test/llm-judgment-integration.test.js +220 -0
- package/dist/test/p2p-agent-complex-dialogue.js +385 -0
- package/dist/test/p2p-agent-dialogue.js +341 -0
- package/dist/test/p2p-agent-full-bidirectional.js +510 -0
- package/dist/test/p2p-agent-harness-flow.js +437 -0
- package/dist/test/p2p-agent-harness-single.js +143 -0
- package/dist/test/p2p-ai-dialogue-test.js +318 -0
- package/dist/test/p2p-cid-connect-test.js +195 -0
- package/dist/test/p2p-connect-receiver.js +69 -0
- package/dist/test/p2p-doc-transfer.js +110 -0
- package/dist/test/p2p-identity-page-test.js +77 -0
- package/dist/test/p2p-iroh-test.js +171 -0
- package/dist/test/p2p-minimal-test.js +241 -0
- package/dist/test/p2p-node-1.js +148 -0
- package/dist/test/p2p-node-2.js +148 -0
- package/dist/test/p2p-server.js +281 -0
- package/dist/test/p2p-two-nodes-test.js +438 -0
- package/dist/test/pi-sdk.test.js +44 -0
- package/dist/test/set-persona.js +40 -0
- package/dist/test/simple.test.js +9 -0
- package/dist/test/storage-integration.test.js +150 -0
- package/dist/test/subagent-manager.test.js +276 -0
- package/dist/test/test-gate-flow.test.js +81 -0
- package/dist/test/workflow-engine.test.js +87 -0
- package/dist/test/workflow-pivot-loop.test.js +246 -0
- package/dist/web/api-config.html +779 -779
- package/dist/web/client-hearth.js +10 -10
- package/dist/web/client.js +54 -0
- package/dist/web/components/wallet-viem.mjs +118 -118
- package/dist/web/delivery-ledger.js +103 -0
- package/dist/web/i18n.js +104 -0
- package/dist/web/index.html +472 -472
- package/dist/web/manifest.json +20 -20
- package/dist/web/routes-tasks.js +242 -24
- package/dist/web/server-storage.js +111 -0
- package/dist/web/server.js +55 -26
- package/dist/web/style.css +4946 -4946
- package/dist/web/task-breaker.js +18 -0
- package/dist/web/task-cancel.js +35 -0
- package/dist/web/task-deps.js +36 -0
- package/dist/web/task-review.js +27 -0
- package/dist/web/task-verify.js +60 -0
- package/package.json +196 -193
- package/scripts/build-cli.js +215 -215
- package/scripts/build-web.ts +130 -130
- package/scripts/postinstall.js +152 -152
- package/bin/bolloon-daemon.sh +0 -207
- package/dist/constraint-runtime/reference_data/archive_surface_snapshot.json +0 -63
- package/dist/constraint-runtime/reference_data/commands_snapshot.json +0 -1037
- package/dist/constraint-runtime/reference_data/subsystems/assistant.json +0 -8
- package/dist/constraint-runtime/reference_data/subsystems/bootstrap.json +0 -8
- package/dist/constraint-runtime/reference_data/subsystems/bridge.json +0 -32
- package/dist/constraint-runtime/reference_data/subsystems/buddy.json +0 -13
- package/dist/constraint-runtime/reference_data/subsystems/cli.json +0 -26
- package/dist/constraint-runtime/reference_data/subsystems/components.json +0 -32
- package/dist/constraint-runtime/reference_data/subsystems/constants.json +0 -28
- package/dist/constraint-runtime/reference_data/subsystems/coordinator.json +0 -8
- package/dist/constraint-runtime/reference_data/subsystems/entrypoints.json +0 -15
- package/dist/constraint-runtime/reference_data/subsystems/hooks.json +0 -32
- package/dist/constraint-runtime/reference_data/subsystems/keybindings.json +0 -21
- package/dist/constraint-runtime/reference_data/subsystems/memdir.json +0 -15
- package/dist/constraint-runtime/reference_data/subsystems/migrations.json +0 -18
- package/dist/constraint-runtime/reference_data/subsystems/moreright.json +0 -8
- package/dist/constraint-runtime/reference_data/subsystems/native_ts.json +0 -11
- package/dist/constraint-runtime/reference_data/subsystems/outputStyles.json +0 -8
- package/dist/constraint-runtime/reference_data/subsystems/plugins.json +0 -9
- package/dist/constraint-runtime/reference_data/subsystems/remote.json +0 -11
- package/dist/constraint-runtime/reference_data/subsystems/schemas.json +0 -8
- package/dist/constraint-runtime/reference_data/subsystems/screens.json +0 -10
- package/dist/constraint-runtime/reference_data/subsystems/server.json +0 -10
- package/dist/constraint-runtime/reference_data/subsystems/services.json +0 -32
- package/dist/constraint-runtime/reference_data/subsystems/skills.json +0 -27
- package/dist/constraint-runtime/reference_data/subsystems/state.json +0 -13
- package/dist/constraint-runtime/reference_data/subsystems/types.json +0 -18
- package/dist/constraint-runtime/reference_data/subsystems/upstreamproxy.json +0 -9
- package/dist/constraint-runtime/reference_data/subsystems/utils.json +0 -32
- package/dist/constraint-runtime/reference_data/subsystems/vim.json +0 -12
- package/dist/constraint-runtime/reference_data/subsystems/voice.json +0 -8
- package/dist/constraint-runtime/reference_data/tools_snapshot.json +0 -922
- package/dist/electron/config.js.map +0 -1
- package/dist/electron/dialogs.js.map +0 -1
- package/dist/electron/first-run.js.map +0 -1
- package/dist/electron/ipc.js.map +0 -1
- package/dist/electron/logger.js.map +0 -1
- package/dist/electron/main.js.map +0 -1
- package/dist/electron/menu.js.map +0 -1
- package/dist/electron/paths.js.map +0 -1
- package/dist/electron/server.js.map +0 -1
- package/dist/electron/tray.js.map +0 -1
- package/dist/electron/window.js.map +0 -1
- package/dist/utils/auto-update.js.map +0 -1
- package/dist/web/client.js.map +0 -7
package/README.md
CHANGED
|
@@ -1,135 +1,135 @@
|
|
|
1
|
-
# Bolloon — P2P AI 智能体平台
|
|
2
|
-
|
|
3
|
-
Bolloon 是一个本地优先、P2P 协作的 AI 智能体平台。它在你的设备上运行,通过 DHT 网络发现并连接其他节点。
|
|
4
|
-
|
|
5
|
-
> 中文 · [English](#english)
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 快速安装
|
|
10
|
-
|
|
11
|
-
### macOS / Linux
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
# 方式一:npm(需 Node.js ≥ 18)
|
|
15
|
-
npm install -g @bolloon/bolloon-agent
|
|
16
|
-
|
|
17
|
-
# 方式二:一键脚本
|
|
18
|
-
curl -fsSL https://raw.githubusercontent.com/logos-42/bolloon/master/scripts/install.sh | sh
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
### Windows
|
|
22
|
-
|
|
23
|
-
```powershell
|
|
24
|
-
# 方式一:npm(需 Node.js ≥ 18)
|
|
25
|
-
npm install -g @bolloon/bolloon-agent
|
|
26
|
-
|
|
27
|
-
# 方式二:一键脚本
|
|
28
|
-
# 以管理员身份运行 PowerShell:
|
|
29
|
-
iwr -useb https://raw.githubusercontent.com/logos-42/bolloon/master/scripts/install.ps1 | iex
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
> **Node.js 安装**:如果尚未安装,访问 [nodejs.org](https://nodejs.org) 下载 LTS 版本,或使用包管理器:
|
|
33
|
-
> - macOS: `brew install node`
|
|
34
|
-
> - Windows: `winget install -e --id OpenJS.NodeJS.LTS`
|
|
35
|
-
> - Linux: `sudo apt install -y nodejs npm`
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## 快速启动
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
bolloon # CLI 交互模式(默认)
|
|
43
|
-
bolloon --web # Web UI 模式(浏览器)
|
|
44
|
-
bolloon --cli # 强制 CLI 模式
|
|
45
|
-
bolloon --help # 查看所有命令
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
首次启动会自动配置 LLM(需要 `OPENAI_API_KEY` 或 `DEEPSEEK_API_KEY` 环境变量)。
|
|
49
|
-
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
## 功能概览
|
|
53
|
-
|
|
54
|
-
| 功能 | 描述 |
|
|
55
|
-
|------|------|
|
|
56
|
-
| 🤖 AI 对话 | 本地运行的智能体,支持多轮对话 |
|
|
57
|
-
| 🌐 P2P 网络 | 自动发现并连接其他 Bolloon 节点 |
|
|
58
|
-
| 📄 文档处理 | 接收和管理文档,支持 DID 签名验证 |
|
|
59
|
-
| 🔧 工具调用 | shell 命令、文件操作、代码分析等 |
|
|
60
|
-
| 🔄 自我改进 | 自动检查更新、质量门控 |
|
|
61
|
-
|
|
62
|
-
---
|
|
63
|
-
|
|
64
|
-
## 项目结构
|
|
65
|
-
|
|
66
|
-
```
|
|
67
|
-
bolloon/
|
|
68
|
-
├── src/
|
|
69
|
-
│ ├── agents/ # 智能体核心(pi-sdk、工具、session)
|
|
70
|
-
│ ├── cli/ # CLI 界面(Ink TUI 渲染引擎)
|
|
71
|
-
│ ├── network/ # P2P 网络(Hyperswarm / DIAP)
|
|
72
|
-
│ ├── security/ # 安全层(工具闸门、守卫)
|
|
73
|
-
│ ├── llm/ # LLM 接入层
|
|
74
|
-
│ └── web/ # Web UI
|
|
75
|
-
├── dist/ # 编译输出
|
|
76
|
-
├── docs/ # 文档
|
|
77
|
-
└── scripts/ # 构建和安装脚本
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
---
|
|
81
|
-
|
|
82
|
-
## 从源码构建
|
|
83
|
-
|
|
84
|
-
```bash
|
|
85
|
-
git clone https://github.com/logos-42/bolloon.git
|
|
86
|
-
cd bolloon
|
|
87
|
-
npm install
|
|
88
|
-
npm run build:all
|
|
89
|
-
npm start
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
## 环境变量
|
|
95
|
-
|
|
96
|
-
| 变量 | 说明 |
|
|
97
|
-
|------|------|
|
|
98
|
-
| `OPENAI_API_KEY` | OpenAI 提供商(可选) |
|
|
99
|
-
| `DEEPSEEK_API_KEY` | DeepSeek 提供商(可选) |
|
|
100
|
-
| `ANTHROPIC_API_KEY` | Anthropic 提供商(可选) |
|
|
101
|
-
| `BOLLOON_LLM_PROVIDER` | 指定 LLM 提供商 |
|
|
102
|
-
|
|
103
|
-
---
|
|
104
|
-
|
|
105
|
-
<a name="english"></a>
|
|
106
|
-
|
|
107
|
-
## English
|
|
108
|
-
|
|
109
|
-
**Bolloon** — A local-first, P2P-collaborative AI agent platform that runs on your device and discovers other nodes through a DHT network.
|
|
110
|
-
|
|
111
|
-
### Quick Install
|
|
112
|
-
|
|
113
|
-
**macOS / Linux:**
|
|
114
|
-
```bash
|
|
115
|
-
npm install -g @bolloon/bolloon-agent
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
**Windows (PowerShell):**
|
|
119
|
-
```powershell
|
|
120
|
-
npm install -g @bolloon/bolloon-agent
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
### Quick Start
|
|
124
|
-
|
|
125
|
-
```bash
|
|
126
|
-
bolloon # CLI interactive mode
|
|
127
|
-
bolloon --web # Web UI mode
|
|
128
|
-
bolloon --help # All commands
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
Requires Node.js ≥ 18 and an LLM API key (`OPENAI_API_KEY` or `DEEPSEEK_API_KEY`).
|
|
132
|
-
|
|
133
|
-
### License
|
|
134
|
-
|
|
135
|
-
MIT
|
|
1
|
+
# Bolloon — P2P AI 智能体平台
|
|
2
|
+
|
|
3
|
+
Bolloon 是一个本地优先、P2P 协作的 AI 智能体平台。它在你的设备上运行,通过 DHT 网络发现并连接其他节点。
|
|
4
|
+
|
|
5
|
+
> 中文 · [English](#english)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 快速安装
|
|
10
|
+
|
|
11
|
+
### macOS / Linux
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# 方式一:npm(需 Node.js ≥ 18)
|
|
15
|
+
npm install -g @bolloon/bolloon-agent
|
|
16
|
+
|
|
17
|
+
# 方式二:一键脚本
|
|
18
|
+
curl -fsSL https://raw.githubusercontent.com/logos-42/bolloon/master/scripts/install.sh | sh
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Windows
|
|
22
|
+
|
|
23
|
+
```powershell
|
|
24
|
+
# 方式一:npm(需 Node.js ≥ 18)
|
|
25
|
+
npm install -g @bolloon/bolloon-agent
|
|
26
|
+
|
|
27
|
+
# 方式二:一键脚本
|
|
28
|
+
# 以管理员身份运行 PowerShell:
|
|
29
|
+
iwr -useb https://raw.githubusercontent.com/logos-42/bolloon/master/scripts/install.ps1 | iex
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
> **Node.js 安装**:如果尚未安装,访问 [nodejs.org](https://nodejs.org) 下载 LTS 版本,或使用包管理器:
|
|
33
|
+
> - macOS: `brew install node`
|
|
34
|
+
> - Windows: `winget install -e --id OpenJS.NodeJS.LTS`
|
|
35
|
+
> - Linux: `sudo apt install -y nodejs npm`
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 快速启动
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
bolloon # CLI 交互模式(默认)
|
|
43
|
+
bolloon --web # Web UI 模式(浏览器)
|
|
44
|
+
bolloon --cli # 强制 CLI 模式
|
|
45
|
+
bolloon --help # 查看所有命令
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
首次启动会自动配置 LLM(需要 `OPENAI_API_KEY` 或 `DEEPSEEK_API_KEY` 环境变量)。
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 功能概览
|
|
53
|
+
|
|
54
|
+
| 功能 | 描述 |
|
|
55
|
+
|------|------|
|
|
56
|
+
| 🤖 AI 对话 | 本地运行的智能体,支持多轮对话 |
|
|
57
|
+
| 🌐 P2P 网络 | 自动发现并连接其他 Bolloon 节点 |
|
|
58
|
+
| 📄 文档处理 | 接收和管理文档,支持 DID 签名验证 |
|
|
59
|
+
| 🔧 工具调用 | shell 命令、文件操作、代码分析等 |
|
|
60
|
+
| 🔄 自我改进 | 自动检查更新、质量门控 |
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 项目结构
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
bolloon/
|
|
68
|
+
├── src/
|
|
69
|
+
│ ├── agents/ # 智能体核心(pi-sdk、工具、session)
|
|
70
|
+
│ ├── cli/ # CLI 界面(Ink TUI 渲染引擎)
|
|
71
|
+
│ ├── network/ # P2P 网络(Hyperswarm / DIAP)
|
|
72
|
+
│ ├── security/ # 安全层(工具闸门、守卫)
|
|
73
|
+
│ ├── llm/ # LLM 接入层
|
|
74
|
+
│ └── web/ # Web UI
|
|
75
|
+
├── dist/ # 编译输出
|
|
76
|
+
├── docs/ # 文档
|
|
77
|
+
└── scripts/ # 构建和安装脚本
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 从源码构建
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
git clone https://github.com/logos-42/bolloon.git
|
|
86
|
+
cd bolloon
|
|
87
|
+
npm install
|
|
88
|
+
npm run build:all
|
|
89
|
+
npm start
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 环境变量
|
|
95
|
+
|
|
96
|
+
| 变量 | 说明 |
|
|
97
|
+
|------|------|
|
|
98
|
+
| `OPENAI_API_KEY` | OpenAI 提供商(可选) |
|
|
99
|
+
| `DEEPSEEK_API_KEY` | DeepSeek 提供商(可选) |
|
|
100
|
+
| `ANTHROPIC_API_KEY` | Anthropic 提供商(可选) |
|
|
101
|
+
| `BOLLOON_LLM_PROVIDER` | 指定 LLM 提供商 |
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
<a name="english"></a>
|
|
106
|
+
|
|
107
|
+
## English
|
|
108
|
+
|
|
109
|
+
**Bolloon** — A local-first, P2P-collaborative AI agent platform that runs on your device and discovers other nodes through a DHT network.
|
|
110
|
+
|
|
111
|
+
### Quick Install
|
|
112
|
+
|
|
113
|
+
**macOS / Linux:**
|
|
114
|
+
```bash
|
|
115
|
+
npm install -g @bolloon/bolloon-agent
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Windows (PowerShell):**
|
|
119
|
+
```powershell
|
|
120
|
+
npm install -g @bolloon/bolloon-agent
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Quick Start
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
bolloon # CLI interactive mode
|
|
127
|
+
bolloon --web # Web UI mode
|
|
128
|
+
bolloon --help # All commands
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Requires Node.js ≥ 18 and an LLM API key (`OPENAI_API_KEY` or `DEEPSEEK_API_KEY`).
|
|
132
|
+
|
|
133
|
+
### License
|
|
134
|
+
|
|
135
|
+
MIT
|
package/bin/bolloon-cli.cjs
CHANGED
|
@@ -1,183 +1,183 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
const path = require("path");
|
|
3
|
-
const { spawn } = require("child_process");
|
|
4
|
-
const fs = require("fs");
|
|
5
|
-
|
|
6
|
-
const RESET = "\x1b[0m";
|
|
7
|
-
const BOLD = "\x1b[1m";
|
|
8
|
-
const CYAN = "\x1b[36m";
|
|
9
|
-
const GREEN = "\x1b[32m";
|
|
10
|
-
const MAGENTA = "\x1b[35m";
|
|
11
|
-
|
|
12
|
-
function log(msg, color) {
|
|
13
|
-
console.log((color || RESET) + msg + RESET);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function printBanner() {
|
|
17
|
-
console.log("\n" + CYAN + BOLD + [
|
|
18
|
-
" ╔═══════════════════════════════════════════╗",
|
|
19
|
-
" ║ 🤖 Bolloon Agent ║",
|
|
20
|
-
" ║ P2P AI Document Processor ║",
|
|
21
|
-
" ╚═══════════════════════════════════════════╝"
|
|
22
|
-
].join("\n") + RESET + "\n");
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function getMainEntry() {
|
|
26
|
-
// bin is in: node_modules/.bin/bolloon
|
|
27
|
-
// package is in: node_modules/@bolloon/bolloon-agent/
|
|
28
|
-
// dist is in: node_modules/@bolloon/bolloon-agent/dist/
|
|
29
|
-
const binPath = require.main.filename; // /tmp/node_modules/.bin/bolloon
|
|
30
|
-
const binDir = path.dirname(binPath); // /tmp/node_modules/.bin
|
|
31
|
-
const packageDir = path.dirname(binDir); // /tmp/node_modules/@bolloon/bolloon-agent
|
|
32
|
-
// 优先用 package.json 'main' 字段 (v0.2.3+ 指向 dist/cli-entry.js).
|
|
33
|
-
// 真实 npm 安装用户拿到的是编译后的 dist, 不该再依赖 tsx.
|
|
34
|
-
const pkgJsonPath = path.join(packageDir, "package.json");
|
|
35
|
-
if (fs.existsSync(pkgJsonPath)) {
|
|
36
|
-
try {
|
|
37
|
-
const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8"));
|
|
38
|
-
if (pkg.main) {
|
|
39
|
-
const mainPath = path.join(packageDir, pkg.main);
|
|
40
|
-
if (fs.existsSync(mainPath)) return mainPath;
|
|
41
|
-
}
|
|
42
|
-
} catch {}
|
|
43
|
-
}
|
|
44
|
-
// fallback: 兼容老版本 (dist/index.js 是之前默认)
|
|
45
|
-
const distIndex = path.join(packageDir, "dist", "index.js");
|
|
46
|
-
if (fs.existsSync(distIndex)) return distIndex;
|
|
47
|
-
// 最后才 fallback 到 src (开发环境)
|
|
48
|
-
return path.join(packageDir, "src", "index.ts");
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function parseArgs() {
|
|
52
|
-
const args = process.argv.slice(2);
|
|
53
|
-
if (args.length === 0) {
|
|
54
|
-
return { mode: "gui", args: [] };
|
|
55
|
-
}
|
|
56
|
-
const first = args[0];
|
|
57
|
-
switch (first) {
|
|
58
|
-
case "-v":
|
|
59
|
-
case "--version":
|
|
60
|
-
return { mode: "version", args: [] };
|
|
61
|
-
case "-h":
|
|
62
|
-
case "--help":
|
|
63
|
-
return { mode: "help", args: [] };
|
|
64
|
-
case "-g":
|
|
65
|
-
case "--gui":
|
|
66
|
-
return { mode: "gui", args: args.slice(1) };
|
|
67
|
-
case "-w":
|
|
68
|
-
case "--web":
|
|
69
|
-
return { mode: "web", args: args.slice(1) };
|
|
70
|
-
case "-c":
|
|
71
|
-
case "--cli":
|
|
72
|
-
return { mode: "cli", args: args.slice(1) };
|
|
73
|
-
default:
|
|
74
|
-
return { mode: "passthrough", args };
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
async function startElectron(additionalArgs) {
|
|
79
|
-
try {
|
|
80
|
-
const electron = require("electron");
|
|
81
|
-
const binPath = require.main.filename;
|
|
82
|
-
const binDir = path.dirname(binPath);
|
|
83
|
-
const packageDir = path.dirname(binDir);
|
|
84
|
-
let mainPath = path.join(packageDir, "dist", "electron.js");
|
|
85
|
-
if (!fs.existsSync(mainPath)) {
|
|
86
|
-
mainPath = path.join(packageDir, "src", "electron.ts");
|
|
87
|
-
}
|
|
88
|
-
log("启动 Electron...", CYAN);
|
|
89
|
-
const child = spawn(electron, [mainPath, ...additionalArgs], {
|
|
90
|
-
stdio: "inherit",
|
|
91
|
-
env: { ...process.env, NODE_ENV: "development" }
|
|
92
|
-
});
|
|
93
|
-
child.on("error", (err) => {
|
|
94
|
-
log("Electron 启动失败: " + err.message, MAGENTA);
|
|
95
|
-
process.exit(1);
|
|
96
|
-
});
|
|
97
|
-
child.on("exit", (code) => process.exit(code || 0));
|
|
98
|
-
} catch (err) {
|
|
99
|
-
log("Electron 不可用,切换到 Web 模式...", CYAN);
|
|
100
|
-
await startWebServer(additionalArgs);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
async function startWebServer(additionalArgs) {
|
|
105
|
-
const mainPath = getMainEntry();
|
|
106
|
-
const webArgs = ["--web", ...additionalArgs];
|
|
107
|
-
log("启动 Web 服务...", CYAN);
|
|
108
|
-
const child = spawn(process.execPath, [mainPath, ...webArgs], { stdio: "inherit" });
|
|
109
|
-
child.on("error", (err) => {
|
|
110
|
-
log("Web 服务启动失败: " + err.message, MAGENTA);
|
|
111
|
-
process.exit(1);
|
|
112
|
-
});
|
|
113
|
-
child.on("exit", (code) => process.exit(code || 0));
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
async function startCLI(additionalArgs) {
|
|
117
|
-
const mainPath = getMainEntry();
|
|
118
|
-
log("启动命令行界面...", CYAN);
|
|
119
|
-
const child = spawn(process.execPath, [mainPath, ...additionalArgs], { stdio: "inherit" });
|
|
120
|
-
child.on("error", (err) => {
|
|
121
|
-
log("CLI 启动失败: " + err.message, MAGENTA);
|
|
122
|
-
process.exit(1);
|
|
123
|
-
});
|
|
124
|
-
child.on("exit", (code) => process.exit(code || 0));
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
async function main() {
|
|
128
|
-
// Get version from package.json
|
|
129
|
-
const binPath = require.main.filename;
|
|
130
|
-
const binDir = path.dirname(binPath);
|
|
131
|
-
const packageDir = path.dirname(binDir);
|
|
132
|
-
const packageJson = JSON.parse(fs.readFileSync(path.join(packageDir, "package.json"), "utf-8"));
|
|
133
|
-
const version = packageJson.version;
|
|
134
|
-
|
|
135
|
-
const { mode, args } = parseArgs();
|
|
136
|
-
switch (mode) {
|
|
137
|
-
case "version":
|
|
138
|
-
console.log("Bolloon Agent v" + version);
|
|
139
|
-
break;
|
|
140
|
-
case "help":
|
|
141
|
-
printBanner();
|
|
142
|
-
console.log(BOLD + "用法:" + RESET + " bolloon [选项] [命令] [参数]");
|
|
143
|
-
console.log(BOLD + "选项:" + RESET + " --gui, -g 启动图形界面");
|
|
144
|
-
console.log(" --web, -w 启动 Web UI");
|
|
145
|
-
console.log(" --cli, -c 启动命令行界面");
|
|
146
|
-
console.log(" --version, -v 显示版本");
|
|
147
|
-
console.log(" --help, -h 显示帮助");
|
|
148
|
-
console.log(BOLD + "示例:" + RESET + " bolloon # 启动图形界面");
|
|
149
|
-
console.log(" bolloon --web # 启动 Web UI");
|
|
150
|
-
console.log(" bolloon --read file # 读取文档");
|
|
151
|
-
break;
|
|
152
|
-
case "gui":
|
|
153
|
-
printBanner();
|
|
154
|
-
await startElectron(args);
|
|
155
|
-
break;
|
|
156
|
-
case "web":
|
|
157
|
-
printBanner();
|
|
158
|
-
await startWebServer(args);
|
|
159
|
-
break;
|
|
160
|
-
case "cli":
|
|
161
|
-
await startCLI(args);
|
|
162
|
-
break;
|
|
163
|
-
case "passthrough":
|
|
164
|
-
const mainPath = getMainEntry();
|
|
165
|
-
const child = spawn(process.execPath, [mainPath, ...args], { stdio: "inherit" });
|
|
166
|
-
child.on("error", (err) => {
|
|
167
|
-
log("执行失败: " + err.message, MAGENTA);
|
|
168
|
-
process.exit(1);
|
|
169
|
-
});
|
|
170
|
-
child.on("exit", (code) => process.exit(code || 0));
|
|
171
|
-
break;
|
|
172
|
-
default:
|
|
173
|
-
log("未知模式: " + mode, MAGENTA);
|
|
174
|
-
printBanner();
|
|
175
|
-
console.log("输入 --help 查看帮助");
|
|
176
|
-
process.exit(1);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
main().catch((err) => {
|
|
181
|
-
console.error("Fatal error:", err);
|
|
182
|
-
process.exit(1);
|
|
183
|
-
});
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const path = require("path");
|
|
3
|
+
const { spawn } = require("child_process");
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
|
|
6
|
+
const RESET = "\x1b[0m";
|
|
7
|
+
const BOLD = "\x1b[1m";
|
|
8
|
+
const CYAN = "\x1b[36m";
|
|
9
|
+
const GREEN = "\x1b[32m";
|
|
10
|
+
const MAGENTA = "\x1b[35m";
|
|
11
|
+
|
|
12
|
+
function log(msg, color) {
|
|
13
|
+
console.log((color || RESET) + msg + RESET);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function printBanner() {
|
|
17
|
+
console.log("\n" + CYAN + BOLD + [
|
|
18
|
+
" ╔═══════════════════════════════════════════╗",
|
|
19
|
+
" ║ 🤖 Bolloon Agent ║",
|
|
20
|
+
" ║ P2P AI Document Processor ║",
|
|
21
|
+
" ╚═══════════════════════════════════════════╝"
|
|
22
|
+
].join("\n") + RESET + "\n");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function getMainEntry() {
|
|
26
|
+
// bin is in: node_modules/.bin/bolloon
|
|
27
|
+
// package is in: node_modules/@bolloon/bolloon-agent/
|
|
28
|
+
// dist is in: node_modules/@bolloon/bolloon-agent/dist/
|
|
29
|
+
const binPath = require.main.filename; // /tmp/node_modules/.bin/bolloon
|
|
30
|
+
const binDir = path.dirname(binPath); // /tmp/node_modules/.bin
|
|
31
|
+
const packageDir = path.dirname(binDir); // /tmp/node_modules/@bolloon/bolloon-agent
|
|
32
|
+
// 优先用 package.json 'main' 字段 (v0.2.3+ 指向 dist/cli-entry.js).
|
|
33
|
+
// 真实 npm 安装用户拿到的是编译后的 dist, 不该再依赖 tsx.
|
|
34
|
+
const pkgJsonPath = path.join(packageDir, "package.json");
|
|
35
|
+
if (fs.existsSync(pkgJsonPath)) {
|
|
36
|
+
try {
|
|
37
|
+
const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8"));
|
|
38
|
+
if (pkg.main) {
|
|
39
|
+
const mainPath = path.join(packageDir, pkg.main);
|
|
40
|
+
if (fs.existsSync(mainPath)) return mainPath;
|
|
41
|
+
}
|
|
42
|
+
} catch {}
|
|
43
|
+
}
|
|
44
|
+
// fallback: 兼容老版本 (dist/index.js 是之前默认)
|
|
45
|
+
const distIndex = path.join(packageDir, "dist", "index.js");
|
|
46
|
+
if (fs.existsSync(distIndex)) return distIndex;
|
|
47
|
+
// 最后才 fallback 到 src (开发环境)
|
|
48
|
+
return path.join(packageDir, "src", "index.ts");
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function parseArgs() {
|
|
52
|
+
const args = process.argv.slice(2);
|
|
53
|
+
if (args.length === 0) {
|
|
54
|
+
return { mode: "gui", args: [] };
|
|
55
|
+
}
|
|
56
|
+
const first = args[0];
|
|
57
|
+
switch (first) {
|
|
58
|
+
case "-v":
|
|
59
|
+
case "--version":
|
|
60
|
+
return { mode: "version", args: [] };
|
|
61
|
+
case "-h":
|
|
62
|
+
case "--help":
|
|
63
|
+
return { mode: "help", args: [] };
|
|
64
|
+
case "-g":
|
|
65
|
+
case "--gui":
|
|
66
|
+
return { mode: "gui", args: args.slice(1) };
|
|
67
|
+
case "-w":
|
|
68
|
+
case "--web":
|
|
69
|
+
return { mode: "web", args: args.slice(1) };
|
|
70
|
+
case "-c":
|
|
71
|
+
case "--cli":
|
|
72
|
+
return { mode: "cli", args: args.slice(1) };
|
|
73
|
+
default:
|
|
74
|
+
return { mode: "passthrough", args };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async function startElectron(additionalArgs) {
|
|
79
|
+
try {
|
|
80
|
+
const electron = require("electron");
|
|
81
|
+
const binPath = require.main.filename;
|
|
82
|
+
const binDir = path.dirname(binPath);
|
|
83
|
+
const packageDir = path.dirname(binDir);
|
|
84
|
+
let mainPath = path.join(packageDir, "dist", "electron.js");
|
|
85
|
+
if (!fs.existsSync(mainPath)) {
|
|
86
|
+
mainPath = path.join(packageDir, "src", "electron.ts");
|
|
87
|
+
}
|
|
88
|
+
log("启动 Electron...", CYAN);
|
|
89
|
+
const child = spawn(electron, [mainPath, ...additionalArgs], {
|
|
90
|
+
stdio: "inherit",
|
|
91
|
+
env: { ...process.env, NODE_ENV: "development" }
|
|
92
|
+
});
|
|
93
|
+
child.on("error", (err) => {
|
|
94
|
+
log("Electron 启动失败: " + err.message, MAGENTA);
|
|
95
|
+
process.exit(1);
|
|
96
|
+
});
|
|
97
|
+
child.on("exit", (code) => process.exit(code || 0));
|
|
98
|
+
} catch (err) {
|
|
99
|
+
log("Electron 不可用,切换到 Web 模式...", CYAN);
|
|
100
|
+
await startWebServer(additionalArgs);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async function startWebServer(additionalArgs) {
|
|
105
|
+
const mainPath = getMainEntry();
|
|
106
|
+
const webArgs = ["--web", ...additionalArgs];
|
|
107
|
+
log("启动 Web 服务...", CYAN);
|
|
108
|
+
const child = spawn(process.execPath, [mainPath, ...webArgs], { stdio: "inherit" });
|
|
109
|
+
child.on("error", (err) => {
|
|
110
|
+
log("Web 服务启动失败: " + err.message, MAGENTA);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
});
|
|
113
|
+
child.on("exit", (code) => process.exit(code || 0));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async function startCLI(additionalArgs) {
|
|
117
|
+
const mainPath = getMainEntry();
|
|
118
|
+
log("启动命令行界面...", CYAN);
|
|
119
|
+
const child = spawn(process.execPath, [mainPath, ...additionalArgs], { stdio: "inherit" });
|
|
120
|
+
child.on("error", (err) => {
|
|
121
|
+
log("CLI 启动失败: " + err.message, MAGENTA);
|
|
122
|
+
process.exit(1);
|
|
123
|
+
});
|
|
124
|
+
child.on("exit", (code) => process.exit(code || 0));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async function main() {
|
|
128
|
+
// Get version from package.json
|
|
129
|
+
const binPath = require.main.filename;
|
|
130
|
+
const binDir = path.dirname(binPath);
|
|
131
|
+
const packageDir = path.dirname(binDir);
|
|
132
|
+
const packageJson = JSON.parse(fs.readFileSync(path.join(packageDir, "package.json"), "utf-8"));
|
|
133
|
+
const version = packageJson.version;
|
|
134
|
+
|
|
135
|
+
const { mode, args } = parseArgs();
|
|
136
|
+
switch (mode) {
|
|
137
|
+
case "version":
|
|
138
|
+
console.log("Bolloon Agent v" + version);
|
|
139
|
+
break;
|
|
140
|
+
case "help":
|
|
141
|
+
printBanner();
|
|
142
|
+
console.log(BOLD + "用法:" + RESET + " bolloon [选项] [命令] [参数]");
|
|
143
|
+
console.log(BOLD + "选项:" + RESET + " --gui, -g 启动图形界面");
|
|
144
|
+
console.log(" --web, -w 启动 Web UI");
|
|
145
|
+
console.log(" --cli, -c 启动命令行界面");
|
|
146
|
+
console.log(" --version, -v 显示版本");
|
|
147
|
+
console.log(" --help, -h 显示帮助");
|
|
148
|
+
console.log(BOLD + "示例:" + RESET + " bolloon # 启动图形界面");
|
|
149
|
+
console.log(" bolloon --web # 启动 Web UI");
|
|
150
|
+
console.log(" bolloon --read file # 读取文档");
|
|
151
|
+
break;
|
|
152
|
+
case "gui":
|
|
153
|
+
printBanner();
|
|
154
|
+
await startElectron(args);
|
|
155
|
+
break;
|
|
156
|
+
case "web":
|
|
157
|
+
printBanner();
|
|
158
|
+
await startWebServer(args);
|
|
159
|
+
break;
|
|
160
|
+
case "cli":
|
|
161
|
+
await startCLI(args);
|
|
162
|
+
break;
|
|
163
|
+
case "passthrough":
|
|
164
|
+
const mainPath = getMainEntry();
|
|
165
|
+
const child = spawn(process.execPath, [mainPath, ...args], { stdio: "inherit" });
|
|
166
|
+
child.on("error", (err) => {
|
|
167
|
+
log("执行失败: " + err.message, MAGENTA);
|
|
168
|
+
process.exit(1);
|
|
169
|
+
});
|
|
170
|
+
child.on("exit", (code) => process.exit(code || 0));
|
|
171
|
+
break;
|
|
172
|
+
default:
|
|
173
|
+
log("未知模式: " + mode, MAGENTA);
|
|
174
|
+
printBanner();
|
|
175
|
+
console.log("输入 --help 查看帮助");
|
|
176
|
+
process.exit(1);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
main().catch((err) => {
|
|
181
|
+
console.error("Fatal error:", err);
|
|
182
|
+
process.exit(1);
|
|
183
|
+
});
|
package/bin/bolloon.cjs
CHANGED
|
File without changes
|