@bolloon/bolloon-agent 0.3.52 → 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.
Files changed (217) hide show
  1. package/README.md +135 -135
  2. package/bin/bolloon-cli.cjs +183 -183
  3. package/bin/bolloon.cjs +0 -0
  4. package/bin/bolloon.js +157 -0
  5. package/dist/agents/constraint-layer.js +19 -19
  6. package/dist/agents/judgment-protocol.js +14 -14
  7. package/dist/agents/loop-review.js +21 -0
  8. package/dist/agents/pi-sdk-tools.js +86 -2
  9. package/dist/agents/pi-sdk-types.js +12 -12
  10. package/dist/agents/pi-sdk.js +90 -90
  11. package/dist/agents/shell-guard.js +22 -1
  12. package/dist/agents/skill-organizer.js +19 -19
  13. package/dist/agents/verify-recipe.js +84 -0
  14. package/dist/agents/workflow-pivot-loop.js +101 -13
  15. package/dist/bollharness/src/scripts/deploy-guard.js +8 -8
  16. package/dist/bollharness-integration/context-router-judgment.js +4 -4
  17. package/dist/bollharness-integration/context-router.js +292 -292
  18. package/dist/bollharness-integration/gate-state-machine.js +13 -13
  19. package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
  20. package/dist/bollharness-integration/skill-adapter.js +21 -21
  21. package/dist/bootstrap/chat-archiver.js +14 -14
  22. package/dist/bootstrap/context-os.js +50 -40
  23. package/dist/bootstrap/memory-compressor.js +13 -13
  24. package/dist/cli-entry.js +36 -36
  25. package/dist/context-compaction/auto-compact.js +7 -7
  26. package/dist/electron/first-run.js +54 -54
  27. package/dist/electron-build/electron/first-run.js +54 -54
  28. package/dist/electron-preload.js.map +1 -1
  29. package/dist/electron.js.map +1 -1
  30. package/dist/external-engines/delegate-handle.js +70 -0
  31. package/dist/external-engines/delegate.js +24 -3
  32. package/dist/index.js +112 -112
  33. package/dist/llm/error-lessons.js +53 -0
  34. package/dist/llm/llm-judgment-client.js +102 -102
  35. package/dist/llm/pi-ai.js +61 -48
  36. package/dist/llm/system-prompt/layers/channel/human-async.md +41 -41
  37. package/dist/llm/system-prompt/layers/channel/local.md +14 -14
  38. package/dist/llm/system-prompt/layers/channel/p2p-agent.md +18 -18
  39. package/dist/llm/system-prompt/layers/channel/p2p-peer-sync.md +51 -51
  40. package/dist/llm/system-prompt/layers/channel/p2p-proactive.md +43 -43
  41. package/dist/llm/system-prompt/layers/channel/p2p-visitor.md +19 -19
  42. package/dist/llm/system-prompt/layers/channel/session-handoff.md +61 -61
  43. package/dist/llm/system-prompt/layers/core/artifacts_storage.md +89 -89
  44. package/dist/llm/system-prompt/layers/core/evenhandedness.md +21 -21
  45. package/dist/llm/system-prompt/layers/core/external-engagement.md +73 -73
  46. package/dist/llm/system-prompt/layers/core/hibs_reminders.md +15 -15
  47. package/dist/llm/system-prompt/layers/core/identity.md +48 -48
  48. package/dist/llm/system-prompt/layers/core/knowledge.md +17 -17
  49. package/dist/llm/system-prompt/layers/core/memory_system.md +12 -12
  50. package/dist/llm/system-prompt/layers/core/network_filesystem.md +28 -28
  51. package/dist/llm/system-prompt/layers/core/refusal.md +37 -37
  52. package/dist/llm/system-prompt/layers/core/tone.md +31 -31
  53. package/dist/llm/system-prompt/layers/core/tools.thin.md +13 -13
  54. package/dist/llm/system-prompt/layers/core/wellbeing.md +41 -41
  55. package/dist/llm/system-prompt/layers/role/architect.md +20 -20
  56. package/dist/llm/system-prompt/layers/role/expert.md +19 -19
  57. package/dist/llm/system-prompt/layers/role/implementer.md +15 -15
  58. package/dist/llm/system-prompt/layers/role/security.md +15 -15
  59. package/dist/llm/system-prompt/layers/tool/artifacts.md +72 -72
  60. package/dist/llm/system-prompt/layers/tool/bash.md +25 -25
  61. package/dist/llm/system-prompt/layers/tool/goal_handoff.md +77 -77
  62. package/dist/llm/system-prompt/layers/tool/hibs_api.md +171 -171
  63. package/dist/llm/system-prompt/layers/tool/image_search.md +70 -70
  64. package/dist/llm/system-prompt/layers/tool/manifest.md +89 -89
  65. package/dist/llm/system-prompt/layers/tool/mcp_apps.md +53 -53
  66. package/dist/llm/system-prompt/layers/tool/p2p_request.md +61 -61
  67. package/dist/llm/system-prompt/layers/tool/web_search.md +83 -83
  68. package/dist/llm/system-prompt/registry.js +9 -1
  69. package/dist/llm/tool-manifest/ask_user_input.js +1 -1
  70. package/dist/llm/tool-manifest/bash.js +3 -3
  71. package/dist/llm/tool-manifest/create_file.js +4 -4
  72. package/dist/llm/tool-manifest/fetch_sports_data.js +3 -3
  73. package/dist/llm/tool-manifest/image_search.js +2 -2
  74. package/dist/llm/tool-manifest/index.js +0 -59
  75. package/dist/llm/tool-manifest/mcp.js +2 -2
  76. package/dist/llm/tool-manifest/message_compose.js +3 -3
  77. package/dist/llm/tool-manifest/places.js +2 -2
  78. package/dist/llm/tool-manifest/present_files.js +1 -1
  79. package/dist/llm/tool-manifest/recipe.js +2 -2
  80. package/dist/llm/tool-manifest/str_replace.js +5 -5
  81. package/dist/llm/tool-manifest/view.js +3 -3
  82. package/dist/llm/tool-manifest/weather.js +4 -4
  83. package/dist/llm/tool-manifest/web.js +4 -4
  84. package/dist/locales/en.js +28 -0
  85. package/dist/locales/zh.js +26 -0
  86. package/dist/pi-ecosystem-colony/index.js +365 -0
  87. package/dist/pi-ecosystem-judgment/causal-judge.js +51 -51
  88. package/dist/pi-ecosystem-judgment/distill-prompt.js +42 -42
  89. package/dist/pi-ecosystem-judgment/distillation.js +14 -14
  90. package/dist/pi-ecosystem-judgment/monitor-gate.js +28 -28
  91. package/dist/pi-ecosystem-judgment/value-injection.js +102 -102
  92. package/dist/security/context-router-tool.js +15 -15
  93. package/dist/social/ant-colony/AdaptiveHeartbeat.js +101 -0
  94. package/dist/social/ant-colony/PheromoneEngine.js +227 -0
  95. package/dist/social/ant-colony/index.js +6 -0
  96. package/dist/social/ant-colony/types.js +24 -0
  97. package/dist/storage/trajectory.js +101 -0
  98. package/dist/test/ai-judgment-test.js +80 -0
  99. package/dist/test/bollharness-integration.test.js +318 -0
  100. package/dist/test/channel-agent-multi-dialogue.js +205 -0
  101. package/dist/test/channel-heartbeat-agent-test.js +201 -0
  102. package/dist/test/constraint-layer.test.js +164 -0
  103. package/dist/test/diap-identity-test.js +172 -0
  104. package/dist/test/diap-quick-test.js +62 -0
  105. package/dist/test/global-shared-context.test.js +315 -0
  106. package/dist/test/harness-judgment-injection.test.js +246 -0
  107. package/dist/test/harness-workflow-integrator-test.js +228 -0
  108. package/dist/test/human-value-store.test.js +243 -0
  109. package/dist/test/hybrid-integration-test.js +118 -0
  110. package/dist/test/hybrid-messenger-verify.js +55 -0
  111. package/dist/test/iroh-bistream-debug.js +38 -0
  112. package/dist/test/iroh-communication.test.js +66 -0
  113. package/dist/test/iroh-debug-test.js +57 -0
  114. package/dist/test/iroh-diap-test.js +71 -0
  115. package/dist/test/iroh-direct-connect.js +55 -0
  116. package/dist/test/iroh-e2e-fixed.js +89 -0
  117. package/dist/test/iroh-e2e-same-process.js +63 -0
  118. package/dist/test/iroh-e2e.js +66 -0
  119. package/dist/test/iroh-final-e2e.js +72 -0
  120. package/dist/test/iroh-relay-test.js +37 -0
  121. package/dist/test/iroh-simple-test.js +41 -0
  122. package/dist/test/iroh-transport-verify.js +54 -0
  123. package/dist/test/iroh-transport.test.js +37 -0
  124. package/dist/test/iroh-two-nodes.js +70 -0
  125. package/dist/test/iroh-verify.js +44 -0
  126. package/dist/test/judgment-decision.test.js +219 -0
  127. package/dist/test/llm-judgment-integration.test.js +220 -0
  128. package/dist/test/p2p-agent-complex-dialogue.js +385 -0
  129. package/dist/test/p2p-agent-dialogue.js +341 -0
  130. package/dist/test/p2p-agent-full-bidirectional.js +510 -0
  131. package/dist/test/p2p-agent-harness-flow.js +437 -0
  132. package/dist/test/p2p-agent-harness-single.js +143 -0
  133. package/dist/test/p2p-ai-dialogue-test.js +318 -0
  134. package/dist/test/p2p-cid-connect-test.js +195 -0
  135. package/dist/test/p2p-connect-receiver.js +69 -0
  136. package/dist/test/p2p-doc-transfer.js +110 -0
  137. package/dist/test/p2p-identity-page-test.js +77 -0
  138. package/dist/test/p2p-iroh-test.js +171 -0
  139. package/dist/test/p2p-minimal-test.js +241 -0
  140. package/dist/test/p2p-node-1.js +148 -0
  141. package/dist/test/p2p-node-2.js +148 -0
  142. package/dist/test/p2p-server.js +281 -0
  143. package/dist/test/p2p-two-nodes-test.js +438 -0
  144. package/dist/test/pi-sdk.test.js +44 -0
  145. package/dist/test/set-persona.js +40 -0
  146. package/dist/test/simple.test.js +9 -0
  147. package/dist/test/storage-integration.test.js +150 -0
  148. package/dist/test/subagent-manager.test.js +276 -0
  149. package/dist/test/test-gate-flow.test.js +81 -0
  150. package/dist/test/workflow-engine.test.js +87 -0
  151. package/dist/test/workflow-pivot-loop.test.js +246 -0
  152. package/dist/web/api-config.html +779 -779
  153. package/dist/web/client-hearth.js +10 -10
  154. package/dist/web/components/wallet-viem.mjs +118 -118
  155. package/dist/web/delivery-ledger.js +103 -0
  156. package/dist/web/i18n.js +104 -0
  157. package/dist/web/index.html +472 -472
  158. package/dist/web/manifest.json +20 -20
  159. package/dist/web/routes-tasks.js +242 -24
  160. package/dist/web/server-storage.js +111 -0
  161. package/dist/web/server.js +55 -26
  162. package/dist/web/style.css +4946 -4946
  163. package/dist/web/task-breaker.js +18 -0
  164. package/dist/web/task-cancel.js +35 -0
  165. package/dist/web/task-deps.js +36 -0
  166. package/dist/web/task-review.js +27 -0
  167. package/dist/web/task-verify.js +60 -0
  168. package/package.json +196 -196
  169. package/scripts/build-cli.js +215 -215
  170. package/scripts/build-web.ts +130 -130
  171. package/scripts/postinstall.js +152 -152
  172. package/bin/bolloon-daemon.sh +0 -207
  173. package/dist/constraint-runtime/reference_data/archive_surface_snapshot.json +0 -63
  174. package/dist/constraint-runtime/reference_data/commands_snapshot.json +0 -1037
  175. package/dist/constraint-runtime/reference_data/subsystems/assistant.json +0 -8
  176. package/dist/constraint-runtime/reference_data/subsystems/bootstrap.json +0 -8
  177. package/dist/constraint-runtime/reference_data/subsystems/bridge.json +0 -32
  178. package/dist/constraint-runtime/reference_data/subsystems/buddy.json +0 -13
  179. package/dist/constraint-runtime/reference_data/subsystems/cli.json +0 -26
  180. package/dist/constraint-runtime/reference_data/subsystems/components.json +0 -32
  181. package/dist/constraint-runtime/reference_data/subsystems/constants.json +0 -28
  182. package/dist/constraint-runtime/reference_data/subsystems/coordinator.json +0 -8
  183. package/dist/constraint-runtime/reference_data/subsystems/entrypoints.json +0 -15
  184. package/dist/constraint-runtime/reference_data/subsystems/hooks.json +0 -32
  185. package/dist/constraint-runtime/reference_data/subsystems/keybindings.json +0 -21
  186. package/dist/constraint-runtime/reference_data/subsystems/memdir.json +0 -15
  187. package/dist/constraint-runtime/reference_data/subsystems/migrations.json +0 -18
  188. package/dist/constraint-runtime/reference_data/subsystems/moreright.json +0 -8
  189. package/dist/constraint-runtime/reference_data/subsystems/native_ts.json +0 -11
  190. package/dist/constraint-runtime/reference_data/subsystems/outputStyles.json +0 -8
  191. package/dist/constraint-runtime/reference_data/subsystems/plugins.json +0 -9
  192. package/dist/constraint-runtime/reference_data/subsystems/remote.json +0 -11
  193. package/dist/constraint-runtime/reference_data/subsystems/schemas.json +0 -8
  194. package/dist/constraint-runtime/reference_data/subsystems/screens.json +0 -10
  195. package/dist/constraint-runtime/reference_data/subsystems/server.json +0 -10
  196. package/dist/constraint-runtime/reference_data/subsystems/services.json +0 -32
  197. package/dist/constraint-runtime/reference_data/subsystems/skills.json +0 -27
  198. package/dist/constraint-runtime/reference_data/subsystems/state.json +0 -13
  199. package/dist/constraint-runtime/reference_data/subsystems/types.json +0 -18
  200. package/dist/constraint-runtime/reference_data/subsystems/upstreamproxy.json +0 -9
  201. package/dist/constraint-runtime/reference_data/subsystems/utils.json +0 -32
  202. package/dist/constraint-runtime/reference_data/subsystems/vim.json +0 -12
  203. package/dist/constraint-runtime/reference_data/subsystems/voice.json +0 -8
  204. package/dist/constraint-runtime/reference_data/tools_snapshot.json +0 -922
  205. package/dist/electron/config.js.map +0 -1
  206. package/dist/electron/dialogs.js.map +0 -1
  207. package/dist/electron/first-run.js.map +0 -1
  208. package/dist/electron/ipc.js.map +0 -1
  209. package/dist/electron/logger.js.map +0 -1
  210. package/dist/electron/main.js.map +0 -1
  211. package/dist/electron/menu.js.map +0 -1
  212. package/dist/electron/paths.js.map +0 -1
  213. package/dist/electron/server.js.map +0 -1
  214. package/dist/electron/tray.js.map +0 -1
  215. package/dist/electron/window.js.map +0 -1
  216. package/dist/utils/auto-update.js.map +0 -1
  217. 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
@@ -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