@bolloon/bolloon-agent 0.4.13 → 0.4.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/README.md +127 -127
  2. package/bin/bolloon-cli.cjs +183 -183
  3. package/bin/bolloon-daemon.sh +207 -0
  4. package/bin/bolloon.cjs +0 -0
  5. package/dist/agents/agent-gateway.js +130 -0
  6. package/dist/agents/constraint-layer.js +19 -19
  7. package/dist/agents/gateway-group.js +261 -0
  8. package/dist/agents/gateway-network.js +278 -0
  9. package/dist/agents/judgment-protocol.js +14 -14
  10. package/dist/agents/pi-sdk-tools.js +117 -0
  11. package/dist/agents/pi-sdk-types.js +12 -12
  12. package/dist/agents/pi-sdk.js +101 -101
  13. package/dist/agents/skill-organizer.js +19 -19
  14. package/dist/agents/workflow-pivot-loop.js +2 -2
  15. package/dist/agents/x402/x402Pay.js +4 -0
  16. package/dist/bollharness/src/scripts/deploy-guard.js +8 -8
  17. package/dist/bollharness-integration/context-router-judgment.js +4 -4
  18. package/dist/bollharness-integration/context-router.js +292 -292
  19. package/dist/bollharness-integration/gate-state-machine.js +13 -13
  20. package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
  21. package/dist/bollharness-integration/skill-adapter.js +21 -21
  22. package/dist/bootstrap/chat-archiver.js +14 -14
  23. package/dist/bootstrap/context-os.js +24 -24
  24. package/dist/bootstrap/memory-compressor.js +13 -13
  25. package/dist/cli-entry.js +36 -36
  26. package/dist/constraint-runtime/reference_data/archive_surface_snapshot.json +63 -0
  27. package/dist/constraint-runtime/reference_data/commands_snapshot.json +1037 -0
  28. package/dist/constraint-runtime/reference_data/subsystems/assistant.json +8 -0
  29. package/dist/constraint-runtime/reference_data/subsystems/bootstrap.json +8 -0
  30. package/dist/constraint-runtime/reference_data/subsystems/bridge.json +32 -0
  31. package/dist/constraint-runtime/reference_data/subsystems/buddy.json +13 -0
  32. package/dist/constraint-runtime/reference_data/subsystems/cli.json +26 -0
  33. package/dist/constraint-runtime/reference_data/subsystems/components.json +32 -0
  34. package/dist/constraint-runtime/reference_data/subsystems/constants.json +28 -0
  35. package/dist/constraint-runtime/reference_data/subsystems/coordinator.json +8 -0
  36. package/dist/constraint-runtime/reference_data/subsystems/entrypoints.json +15 -0
  37. package/dist/constraint-runtime/reference_data/subsystems/hooks.json +32 -0
  38. package/dist/constraint-runtime/reference_data/subsystems/keybindings.json +21 -0
  39. package/dist/constraint-runtime/reference_data/subsystems/memdir.json +15 -0
  40. package/dist/constraint-runtime/reference_data/subsystems/migrations.json +18 -0
  41. package/dist/constraint-runtime/reference_data/subsystems/moreright.json +8 -0
  42. package/dist/constraint-runtime/reference_data/subsystems/native_ts.json +11 -0
  43. package/dist/constraint-runtime/reference_data/subsystems/outputStyles.json +8 -0
  44. package/dist/constraint-runtime/reference_data/subsystems/plugins.json +9 -0
  45. package/dist/constraint-runtime/reference_data/subsystems/remote.json +11 -0
  46. package/dist/constraint-runtime/reference_data/subsystems/schemas.json +8 -0
  47. package/dist/constraint-runtime/reference_data/subsystems/screens.json +10 -0
  48. package/dist/constraint-runtime/reference_data/subsystems/server.json +10 -0
  49. package/dist/constraint-runtime/reference_data/subsystems/services.json +32 -0
  50. package/dist/constraint-runtime/reference_data/subsystems/skills.json +27 -0
  51. package/dist/constraint-runtime/reference_data/subsystems/state.json +13 -0
  52. package/dist/constraint-runtime/reference_data/subsystems/types.json +18 -0
  53. package/dist/constraint-runtime/reference_data/subsystems/upstreamproxy.json +9 -0
  54. package/dist/constraint-runtime/reference_data/subsystems/utils.json +32 -0
  55. package/dist/constraint-runtime/reference_data/subsystems/vim.json +12 -0
  56. package/dist/constraint-runtime/reference_data/subsystems/voice.json +8 -0
  57. package/dist/constraint-runtime/reference_data/tools_snapshot.json +922 -0
  58. package/dist/constraint-runtime/tools/PolymarketSDK/econ-integration.d.ts +55 -0
  59. package/dist/constraint-runtime/tools/PolymarketSDK/econ-integration.js +59 -0
  60. package/dist/context-compaction/auto-compact.js +7 -7
  61. package/dist/electron/config.js.map +1 -0
  62. package/dist/electron/dialogs.js.map +1 -0
  63. package/dist/electron/first-run.js +54 -54
  64. package/dist/electron/first-run.js.map +1 -0
  65. package/dist/electron/ipc.js.map +1 -0
  66. package/dist/electron/logger.js.map +1 -0
  67. package/dist/electron/main.js.map +1 -0
  68. package/dist/electron/menu.js.map +1 -0
  69. package/dist/electron/paths.js.map +1 -0
  70. package/dist/electron/server.js.map +1 -0
  71. package/dist/electron/tray.js.map +1 -0
  72. package/dist/electron/window.js.map +1 -0
  73. package/dist/electron-build/electron/first-run.js +54 -54
  74. package/dist/electron-preload.js.map +1 -1
  75. package/dist/electron.js.map +1 -1
  76. package/dist/index.js +112 -112
  77. package/dist/llm/llm-judgment-client.js +102 -102
  78. package/dist/llm/pi-ai.js +48 -48
  79. package/dist/llm/system-prompt/layers/channel/human-async.md +41 -41
  80. package/dist/llm/system-prompt/layers/channel/local.md +14 -14
  81. package/dist/llm/system-prompt/layers/channel/p2p-agent.md +18 -18
  82. package/dist/llm/system-prompt/layers/channel/p2p-peer-sync.md +51 -51
  83. package/dist/llm/system-prompt/layers/channel/p2p-proactive.md +43 -43
  84. package/dist/llm/system-prompt/layers/channel/p2p-visitor.md +19 -19
  85. package/dist/llm/system-prompt/layers/channel/session-handoff.md +61 -61
  86. package/dist/llm/system-prompt/layers/core/artifacts_storage.md +89 -89
  87. package/dist/llm/system-prompt/layers/core/evenhandedness.md +21 -21
  88. package/dist/llm/system-prompt/layers/core/external-engagement.md +73 -73
  89. package/dist/llm/system-prompt/layers/core/hibs_reminders.md +15 -15
  90. package/dist/llm/system-prompt/layers/core/identity.md +48 -48
  91. package/dist/llm/system-prompt/layers/core/knowledge.md +17 -17
  92. package/dist/llm/system-prompt/layers/core/memory_system.md +12 -12
  93. package/dist/llm/system-prompt/layers/core/network_filesystem.md +28 -28
  94. package/dist/llm/system-prompt/layers/core/refusal.md +37 -37
  95. package/dist/llm/system-prompt/layers/core/tone.md +31 -31
  96. package/dist/llm/system-prompt/layers/core/tools.thin.md +13 -13
  97. package/dist/llm/system-prompt/layers/core/wellbeing.md +41 -41
  98. package/dist/llm/system-prompt/layers/role/architect.md +20 -20
  99. package/dist/llm/system-prompt/layers/role/expert.md +19 -19
  100. package/dist/llm/system-prompt/layers/role/implementer.md +15 -15
  101. package/dist/llm/system-prompt/layers/role/security.md +15 -15
  102. package/dist/llm/system-prompt/layers/tool/artifacts.md +72 -72
  103. package/dist/llm/system-prompt/layers/tool/bash.md +25 -25
  104. package/dist/llm/system-prompt/layers/tool/goal_handoff.md +77 -77
  105. package/dist/llm/system-prompt/layers/tool/hibs_api.md +171 -171
  106. package/dist/llm/system-prompt/layers/tool/image_search.md +70 -70
  107. package/dist/llm/system-prompt/layers/tool/manifest.md +89 -89
  108. package/dist/llm/system-prompt/layers/tool/mcp_apps.md +53 -53
  109. package/dist/llm/system-prompt/layers/tool/p2p_request.md +61 -61
  110. package/dist/llm/system-prompt/layers/tool/web_search.md +83 -83
  111. package/dist/llm/tool-manifest/ask_user_input.js +1 -1
  112. package/dist/llm/tool-manifest/bash.js +3 -3
  113. package/dist/llm/tool-manifest/create_file.js +4 -4
  114. package/dist/llm/tool-manifest/fetch_sports_data.js +3 -3
  115. package/dist/llm/tool-manifest/image_search.js +2 -2
  116. package/dist/llm/tool-manifest/index.js +59 -0
  117. package/dist/llm/tool-manifest/mcp.js +2 -2
  118. package/dist/llm/tool-manifest/message_compose.js +3 -3
  119. package/dist/llm/tool-manifest/places.js +2 -2
  120. package/dist/llm/tool-manifest/present_files.js +1 -1
  121. package/dist/llm/tool-manifest/recipe.js +2 -2
  122. package/dist/llm/tool-manifest/str_replace.js +5 -5
  123. package/dist/llm/tool-manifest/view.js +3 -3
  124. package/dist/llm/tool-manifest/weather.js +4 -4
  125. package/dist/llm/tool-manifest/web.js +4 -4
  126. package/dist/network/p2p.js +78 -4
  127. package/dist/orbitdb/cid-database.js +39 -10
  128. package/dist/pi-ecosystem-judgment/causal-judge.js +51 -51
  129. package/dist/pi-ecosystem-judgment/distill-prompt.js +42 -42
  130. package/dist/pi-ecosystem-judgment/distillation.js +14 -14
  131. package/dist/pi-ecosystem-judgment/index.js +1 -1
  132. package/dist/pi-ecosystem-judgment/monitor-gate.js +28 -28
  133. package/dist/pi-ecosystem-judgment/value-injection.js +102 -102
  134. package/dist/security/context-router-tool.js +15 -15
  135. package/dist/utils/auto-update.js.map +1 -0
  136. package/dist/web/a2ui-client.js +1594 -223
  137. package/dist/web/api-config.html +779 -779
  138. package/dist/web/client-hearth.js +10 -10
  139. package/dist/web/client.js +273 -0
  140. package/dist/web/client.js.map +7 -0
  141. package/dist/web/components/wallet-viem.mjs +118 -118
  142. package/dist/web/index.html +502 -485
  143. package/dist/web/manifest.json +20 -20
  144. package/dist/web/mobile-agent.js +397 -0
  145. package/dist/web/mobile-core.js +86235 -0
  146. package/dist/web/mobile-data.js +346 -0
  147. package/dist/web/mobile-http-api.js +71 -0
  148. package/dist/web/mobile-p2p.js +250 -0
  149. package/dist/web/mobile-payments.js +80 -0
  150. package/dist/web/mobile-wallet.js +226 -0
  151. package/dist/web/mobile.css +483 -6
  152. package/dist/web/mobile.html +99 -50
  153. package/dist/web/mobile.js +1040 -187
  154. package/dist/web/server.js +196 -13
  155. package/dist/web/style.css +5062 -4946
  156. package/package.json +201 -198
  157. package/scripts/build-cli.js +215 -215
  158. package/scripts/build-web.ts +162 -149
  159. package/scripts/postinstall.js +152 -152
  160. package/bin/bolloon.js +0 -157
  161. package/dist/agents/python-exec.js +0 -115
  162. package/dist/pi-ecosystem-colony/index.js +0 -365
  163. package/dist/social/ant-colony/AdaptiveHeartbeat.js +0 -101
  164. package/dist/social/ant-colony/PheromoneEngine.js +0 -227
  165. package/dist/social/ant-colony/index.js +0 -6
  166. package/dist/social/ant-colony/types.js +0 -24
  167. package/dist/storage/trajectory.js +0 -101
  168. package/dist/test/ai-judgment-test.js +0 -80
  169. package/dist/test/bollharness-integration.test.js +0 -318
  170. package/dist/test/channel-agent-multi-dialogue.js +0 -205
  171. package/dist/test/channel-heartbeat-agent-test.js +0 -201
  172. package/dist/test/constraint-layer.test.js +0 -164
  173. package/dist/test/diap-identity-test.js +0 -172
  174. package/dist/test/diap-quick-test.js +0 -62
  175. package/dist/test/global-shared-context.test.js +0 -315
  176. package/dist/test/harness-judgment-injection.test.js +0 -246
  177. package/dist/test/harness-workflow-integrator-test.js +0 -228
  178. package/dist/test/human-value-store.test.js +0 -243
  179. package/dist/test/hybrid-integration-test.js +0 -118
  180. package/dist/test/hybrid-messenger-verify.js +0 -55
  181. package/dist/test/iroh-bistream-debug.js +0 -38
  182. package/dist/test/iroh-communication.test.js +0 -66
  183. package/dist/test/iroh-debug-test.js +0 -57
  184. package/dist/test/iroh-diap-test.js +0 -71
  185. package/dist/test/iroh-direct-connect.js +0 -55
  186. package/dist/test/iroh-e2e-fixed.js +0 -89
  187. package/dist/test/iroh-e2e-same-process.js +0 -63
  188. package/dist/test/iroh-e2e.js +0 -66
  189. package/dist/test/iroh-final-e2e.js +0 -72
  190. package/dist/test/iroh-relay-test.js +0 -37
  191. package/dist/test/iroh-simple-test.js +0 -41
  192. package/dist/test/iroh-transport-verify.js +0 -54
  193. package/dist/test/iroh-transport.test.js +0 -37
  194. package/dist/test/iroh-two-nodes.js +0 -70
  195. package/dist/test/iroh-verify.js +0 -44
  196. package/dist/test/judgment-decision.test.js +0 -219
  197. package/dist/test/llm-judgment-integration.test.js +0 -220
  198. package/dist/test/p2p-agent-complex-dialogue.js +0 -385
  199. package/dist/test/p2p-agent-dialogue.js +0 -341
  200. package/dist/test/p2p-agent-full-bidirectional.js +0 -510
  201. package/dist/test/p2p-agent-harness-flow.js +0 -437
  202. package/dist/test/p2p-agent-harness-single.js +0 -143
  203. package/dist/test/p2p-ai-dialogue-test.js +0 -318
  204. package/dist/test/p2p-cid-connect-test.js +0 -195
  205. package/dist/test/p2p-connect-receiver.js +0 -69
  206. package/dist/test/p2p-doc-transfer.js +0 -110
  207. package/dist/test/p2p-identity-page-test.js +0 -77
  208. package/dist/test/p2p-iroh-test.js +0 -171
  209. package/dist/test/p2p-minimal-test.js +0 -241
  210. package/dist/test/p2p-node-1.js +0 -148
  211. package/dist/test/p2p-node-2.js +0 -148
  212. package/dist/test/p2p-server.js +0 -281
  213. package/dist/test/p2p-two-nodes-test.js +0 -438
  214. package/dist/test/pi-sdk.test.js +0 -44
  215. package/dist/test/set-persona.js +0 -40
  216. package/dist/test/simple.test.js +0 -9
  217. package/dist/test/storage-integration.test.js +0 -150
  218. package/dist/test/subagent-manager.test.js +0 -276
  219. package/dist/test/test-gate-flow.test.js +0 -81
  220. package/dist/test/workflow-engine.test.js +0 -87
  221. package/dist/test/workflow-pivot-loop.test.js +0 -246
package/README.md CHANGED
@@ -1,103 +1,103 @@
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 提供商(可选) |
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
101
  | `BOLLOON_LLM_PROVIDER` | 指定 LLM 提供商 |
102
102
 
103
103
  ---
@@ -109,33 +109,33 @@ npm start
109
109
  ---
110
110
 
111
111
  <a name="english"></a>
112
-
113
- ## English
114
-
115
- **Bolloon** — A local-first, P2P-collaborative AI agent platform that runs on your device and discovers other nodes through a DHT network.
116
-
117
- ### Quick Install
118
-
119
- **macOS / Linux:**
120
- ```bash
121
- npm install -g @bolloon/bolloon-agent
122
- ```
123
-
124
- **Windows (PowerShell):**
125
- ```powershell
126
- npm install -g @bolloon/bolloon-agent
127
- ```
128
-
129
- ### Quick Start
130
-
131
- ```bash
132
- bolloon # CLI interactive mode
133
- bolloon --web # Web UI mode
134
- bolloon --help # All commands
135
- ```
136
-
137
- Requires Node.js ≥ 18 and an LLM API key (`OPENAI_API_KEY` or `DEEPSEEK_API_KEY`).
138
-
112
+
113
+ ## English
114
+
115
+ **Bolloon** — A local-first, P2P-collaborative AI agent platform that runs on your device and discovers other nodes through a DHT network.
116
+
117
+ ### Quick Install
118
+
119
+ **macOS / Linux:**
120
+ ```bash
121
+ npm install -g @bolloon/bolloon-agent
122
+ ```
123
+
124
+ **Windows (PowerShell):**
125
+ ```powershell
126
+ npm install -g @bolloon/bolloon-agent
127
+ ```
128
+
129
+ ### Quick Start
130
+
131
+ ```bash
132
+ bolloon # CLI interactive mode
133
+ bolloon --web # Web UI mode
134
+ bolloon --help # All commands
135
+ ```
136
+
137
+ Requires Node.js ≥ 18 and an LLM API key (`OPENAI_API_KEY` or `DEEPSEEK_API_KEY`).
138
+
139
139
  ### License
140
140
 
141
141
  This project is released under the [MIT License](./LICENSE). You are free to use, modify, and distribute this project, provided that you retain the copyright and permission notices. See the [LICENSE](./LICENSE) file for details.
@@ -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
+ });