@bolloon/bolloon-agent 0.2.12 → 0.2.13

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 (284) hide show
  1. package/README.md +495 -467
  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/bin/ipfs +0 -0
  6. package/dist/agents/agent-manifest-protocol.js +52 -0
  7. package/dist/agents/chat-segmenter.js +298 -0
  8. package/dist/agents/constraint-layer.js +19 -19
  9. package/dist/agents/judgment-protocol.js +479 -0
  10. package/dist/agents/parse-tool-call.js +304 -0
  11. package/dist/agents/peer-manifest-loader.js +210 -0
  12. package/dist/agents/pi-sdk-session-factory.js +110 -0
  13. package/dist/agents/pi-sdk-session-manager.js +297 -0
  14. package/dist/agents/pi-sdk-tools.js +1288 -0
  15. package/dist/agents/pi-sdk-types.js +13 -0
  16. package/dist/agents/pi-sdk.js +553 -1306
  17. package/dist/agents/react-loop.js +120 -0
  18. package/dist/agents/session-store.js +171 -0
  19. package/dist/agents/shell-guard.js +2 -2
  20. package/dist/agents/tool-registry.js +136 -0
  21. package/dist/agents/workflow-pivot-loop.js +200 -22
  22. package/dist/bollharness/src/scripts/context_router.js +7 -0
  23. package/dist/bollharness/src/scripts/deploy-guard.js +8 -8
  24. package/dist/bollharness-integration/context-router-judgment.js +4 -4
  25. package/dist/bollharness-integration/context-router.js +292 -292
  26. package/dist/bollharness-integration/gate-state-machine.js +26 -13
  27. package/dist/bollharness-integration/integration.js +71 -0
  28. package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
  29. package/dist/bollharness-integration/skill-adapter.js +57 -127
  30. package/dist/bootstrap/chat-archiver.js +276 -0
  31. package/dist/bootstrap/context-collector.js +6 -3
  32. package/dist/bootstrap/event-log.js +160 -0
  33. package/dist/bootstrap/lifecycle-hooks.js +15 -1
  34. package/dist/bootstrap/memory-compressor.js +170 -0
  35. package/dist/bootstrap/persona-loader.js +94 -0
  36. package/dist/bootstrap/project-state.js +159 -0
  37. package/dist/bootstrap/remote-mirror.js +97 -0
  38. package/dist/bootstrap/session-window.js +121 -0
  39. package/dist/bootstrap/vector-index.js +248 -0
  40. package/dist/cli/loading-tui.js +40 -0
  41. package/dist/cli-entry.js +41 -37
  42. package/dist/context-compaction/auto-compact.js +7 -7
  43. package/dist/electron/config.js +21 -0
  44. package/dist/electron/config.js.map +1 -0
  45. package/dist/electron/dialogs.js +108 -0
  46. package/dist/electron/dialogs.js.map +1 -0
  47. package/dist/electron/first-run.js +170 -0
  48. package/dist/electron/first-run.js.map +1 -0
  49. package/dist/electron/ipc.js +20 -0
  50. package/dist/electron/ipc.js.map +1 -0
  51. package/dist/electron/logger.js +114 -0
  52. package/dist/electron/logger.js.map +1 -0
  53. package/dist/electron/main.js +63 -0
  54. package/dist/electron/main.js.map +1 -0
  55. package/dist/electron/menu.js +145 -0
  56. package/dist/electron/menu.js.map +1 -0
  57. package/dist/electron/paths.js +75 -0
  58. package/dist/electron/paths.js.map +1 -0
  59. package/dist/electron/server.js +119 -0
  60. package/dist/electron/server.js.map +1 -0
  61. package/dist/electron/tray.js +111 -0
  62. package/dist/electron/tray.js.map +1 -0
  63. package/dist/electron/window.js +111 -0
  64. package/dist/electron/window.js.map +1 -0
  65. package/dist/electron-preload.js +26 -6
  66. package/dist/electron-preload.js.map +1 -1
  67. package/dist/electron.js +6 -168
  68. package/dist/electron.js.map +1 -1
  69. package/dist/index.js +323 -266
  70. package/dist/llm/config-store.js +24 -8
  71. package/dist/llm/llm-judgment-client.js +102 -102
  72. package/dist/llm/pi-ai.js +137 -85
  73. package/dist/llm/system-prompt/layers/channel/local.md +14 -14
  74. package/dist/llm/system-prompt/layers/channel/p2p-agent.md +18 -18
  75. package/dist/llm/system-prompt/layers/channel/p2p-visitor.md +19 -19
  76. package/dist/llm/system-prompt/layers/core/artifacts_storage.md +89 -89
  77. package/dist/llm/system-prompt/layers/core/evenhandedness.md +21 -21
  78. package/dist/llm/system-prompt/layers/core/hibs_reminders.md +15 -15
  79. package/dist/llm/system-prompt/layers/core/identity.md +37 -37
  80. package/dist/llm/system-prompt/layers/core/knowledge.md +17 -17
  81. package/dist/llm/system-prompt/layers/core/memory_system.md +12 -12
  82. package/dist/llm/system-prompt/layers/core/network_filesystem.md +28 -28
  83. package/dist/llm/system-prompt/layers/core/refusal.md +37 -37
  84. package/dist/llm/system-prompt/layers/core/tone.md +31 -31
  85. package/dist/llm/system-prompt/layers/core/tools.thin.md +13 -13
  86. package/dist/llm/system-prompt/layers/core/wellbeing.md +41 -41
  87. package/dist/llm/system-prompt/layers/role/architect.md +20 -20
  88. package/dist/llm/system-prompt/layers/role/expert.md +19 -19
  89. package/dist/llm/system-prompt/layers/role/implementer.md +15 -15
  90. package/dist/llm/system-prompt/layers/role/security.md +15 -15
  91. package/dist/llm/system-prompt/layers/tool/artifacts.md +72 -72
  92. package/dist/llm/system-prompt/layers/tool/bash.md +25 -25
  93. package/dist/llm/system-prompt/layers/tool/hibs_api.md +171 -171
  94. package/dist/llm/system-prompt/layers/tool/image_search.md +70 -70
  95. package/dist/llm/system-prompt/layers/tool/manifest.md +89 -89
  96. package/dist/llm/system-prompt/layers/tool/mcp_apps.md +53 -53
  97. package/dist/llm/system-prompt/layers/tool/web_search.md +83 -83
  98. package/dist/llm/tool-manifest/ask_user_input.js +1 -1
  99. package/dist/llm/tool-manifest/bash.js +3 -3
  100. package/dist/llm/tool-manifest/create_file.js +4 -4
  101. package/dist/llm/tool-manifest/fetch_sports_data.js +3 -3
  102. package/dist/llm/tool-manifest/image_search.js +2 -2
  103. package/dist/llm/tool-manifest/mcp.js +2 -2
  104. package/dist/llm/tool-manifest/message_compose.js +3 -3
  105. package/dist/llm/tool-manifest/places.js +2 -2
  106. package/dist/llm/tool-manifest/present_files.js +1 -1
  107. package/dist/llm/tool-manifest/recipe.js +2 -2
  108. package/dist/llm/tool-manifest/str_replace.js +5 -5
  109. package/dist/llm/tool-manifest/view.js +3 -3
  110. package/dist/llm/tool-manifest/weather.js +4 -4
  111. package/dist/llm/tool-manifest/web.js +4 -4
  112. package/dist/network/local-inbox-bus.js +73 -0
  113. package/dist/network/p2p-outbox.js +161 -0
  114. package/dist/network/peer-fs.js +420 -0
  115. package/dist/network/peer-resource-bridge.js +216 -0
  116. package/dist/pi-ecosystem-judgment/causal-judge.js +51 -51
  117. package/dist/pi-ecosystem-judgment/cleanup.js +126 -0
  118. package/dist/pi-ecosystem-judgment/distill-prompt.js +42 -42
  119. package/dist/pi-ecosystem-judgment/distillation.js +14 -14
  120. package/dist/pi-ecosystem-judgment/human-value-store.js +45 -11
  121. package/dist/pi-ecosystem-judgment/monitor-gate.js +28 -28
  122. package/dist/pi-ecosystem-judgment/value-injection.js +102 -102
  123. package/dist/security/context-router-tool.js +15 -15
  124. package/dist/security/tool-gate.js +11 -0
  125. package/dist/web/api-config.html +520 -520
  126. package/dist/web/client-loop-status.js +220 -0
  127. package/dist/web/client.js +22 -5
  128. package/dist/web/client.js.map +7 -0
  129. package/dist/web/components/wallet-viem.mjs +118 -118
  130. package/dist/web/index.html +375 -375
  131. package/dist/web/input-validator.js +103 -0
  132. package/dist/web/manifest.json +20 -20
  133. package/dist/web/routes-judgments.js +738 -0
  134. package/dist/web/routes-llm-config.js +279 -0
  135. package/dist/web/routes-tasks.js +222 -0
  136. package/dist/web/server-sse.js +121 -0
  137. package/dist/web/server-storage.js +154 -0
  138. package/dist/web/server-types.js +15 -0
  139. package/dist/web/server-v3-p2p.js +224 -0
  140. package/dist/web/server.js +1070 -1307
  141. package/dist/web/style.css +4742 -4742
  142. package/dist/web/util/safe-name.js +32 -0
  143. package/package.json +162 -160
  144. package/scripts/build-cli.js +215 -215
  145. package/scripts/build-web.ts +130 -130
  146. package/scripts/postinstall.js +152 -152
  147. package/bin/bolloon.js +0 -157
  148. package/dist/constraint-runtime/src/_archive_helper.js +0 -9
  149. package/dist/constraint-runtime/src/agent/coordinator.js +0 -48
  150. package/dist/constraint-runtime/src/agent/index.js +0 -1
  151. package/dist/constraint-runtime/src/assistant/index.js +0 -12
  152. package/dist/constraint-runtime/src/bootstrap/index.js +0 -12
  153. package/dist/constraint-runtime/src/bootstrap_graph.js +0 -13
  154. package/dist/constraint-runtime/src/bridge/index.js +0 -12
  155. package/dist/constraint-runtime/src/buddy/index.js +0 -12
  156. package/dist/constraint-runtime/src/cli/index.js +0 -12
  157. package/dist/constraint-runtime/src/command_graph.js +0 -10
  158. package/dist/constraint-runtime/src/commands.js +0 -60
  159. package/dist/constraint-runtime/src/components/index.js +0 -12
  160. package/dist/constraint-runtime/src/constants/index.js +0 -12
  161. package/dist/constraint-runtime/src/constraint/budget.js +0 -22
  162. package/dist/constraint-runtime/src/constraint/index.js +0 -2
  163. package/dist/constraint-runtime/src/constraint/permission.js +0 -20
  164. package/dist/constraint-runtime/src/context.js +0 -30
  165. package/dist/constraint-runtime/src/coordinator/index.js +0 -12
  166. package/dist/constraint-runtime/src/cost_hook.js +0 -4
  167. package/dist/constraint-runtime/src/cost_tracker.js +0 -8
  168. package/dist/constraint-runtime/src/deferred_init.js +0 -10
  169. package/dist/constraint-runtime/src/direct_modes.js +0 -6
  170. package/dist/constraint-runtime/src/dynamic-tool-loader.js +0 -85
  171. package/dist/constraint-runtime/src/entrypoints/index.js +0 -12
  172. package/dist/constraint-runtime/src/execution_registry.js +0 -44
  173. package/dist/constraint-runtime/src/history.js +0 -9
  174. package/dist/constraint-runtime/src/hooks/index.js +0 -12
  175. package/dist/constraint-runtime/src/index.js +0 -26
  176. package/dist/constraint-runtime/src/ink.js +0 -4
  177. package/dist/constraint-runtime/src/keybindings/index.js +0 -12
  178. package/dist/constraint-runtime/src/memdir/index.js +0 -12
  179. package/dist/constraint-runtime/src/migrations/index.js +0 -12
  180. package/dist/constraint-runtime/src/models.js +0 -1
  181. package/dist/constraint-runtime/src/moreright/index.js +0 -12
  182. package/dist/constraint-runtime/src/native_ts/index.js +0 -12
  183. package/dist/constraint-runtime/src/output_styles/index.js +0 -12
  184. package/dist/constraint-runtime/src/parity_audit.js +0 -12
  185. package/dist/constraint-runtime/src/plugins/index.js +0 -12
  186. package/dist/constraint-runtime/src/port_manifest.js +0 -11
  187. package/dist/constraint-runtime/src/prefetch.js +0 -9
  188. package/dist/constraint-runtime/src/query.js +0 -1
  189. package/dist/constraint-runtime/src/remote/index.js +0 -12
  190. package/dist/constraint-runtime/src/remote_runtime.js +0 -9
  191. package/dist/constraint-runtime/src/runtime/index.js +0 -1
  192. package/dist/constraint-runtime/src/runtime/session.js +0 -35
  193. package/dist/constraint-runtime/src/schemas/index.js +0 -12
  194. package/dist/constraint-runtime/src/screens/index.js +0 -12
  195. package/dist/constraint-runtime/src/server/index.js +0 -12
  196. package/dist/constraint-runtime/src/services/index.js +0 -12
  197. package/dist/constraint-runtime/src/session_store.js +0 -22
  198. package/dist/constraint-runtime/src/setup.js +0 -30
  199. package/dist/constraint-runtime/src/skills/index.js +0 -1
  200. package/dist/constraint-runtime/src/skills/skill-registry.js +0 -28
  201. package/dist/constraint-runtime/src/state/index.js +0 -12
  202. package/dist/constraint-runtime/src/system_init.js +0 -20
  203. package/dist/constraint-runtime/src/thinking/engine.js +0 -42
  204. package/dist/constraint-runtime/src/thinking/index.js +0 -1
  205. package/dist/constraint-runtime/src/tool_pool.js +0 -8
  206. package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +0 -7
  207. package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +0 -7
  208. package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +0 -7
  209. package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +0 -6
  210. package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +0 -8
  211. package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +0 -6
  212. package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +0 -6
  213. package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +0 -6
  214. package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +0 -6
  215. package/dist/constraint-runtime/src/tools.js +0 -80
  216. package/dist/constraint-runtime/src/transcript.js +0 -19
  217. package/dist/constraint-runtime/src/types/index.js +0 -12
  218. package/dist/constraint-runtime/src/upstream_proxy/index.js +0 -12
  219. package/dist/constraint-runtime/src/utils/index.js +0 -12
  220. package/dist/constraint-runtime/src/vim/index.js +0 -12
  221. package/dist/constraint-runtime/src/voice/index.js +0 -12
  222. package/dist/constraint-runtime/tests/agent.test.js +0 -16
  223. package/dist/constraint-runtime/tests/constraint.test.js +0 -41
  224. package/dist/constraint-runtime/tests/skill.test.js +0 -19
  225. package/dist/constraint-runtime/tests/thinking.test.js +0 -22
  226. package/dist/pi-ecosystem-colony/index.js +0 -365
  227. package/dist/social/ant-colony/AdaptiveHeartbeat.js +0 -101
  228. package/dist/social/ant-colony/PheromoneEngine.js +0 -227
  229. package/dist/social/ant-colony/index.js +0 -6
  230. package/dist/social/ant-colony/types.js +0 -24
  231. package/dist/test/ai-judgment-test.js +0 -80
  232. package/dist/test/bollharness-integration.test.js +0 -318
  233. package/dist/test/channel-agent-multi-dialogue.js +0 -205
  234. package/dist/test/channel-heartbeat-agent-test.js +0 -201
  235. package/dist/test/constraint-layer.test.js +0 -164
  236. package/dist/test/diap-identity-test.js +0 -172
  237. package/dist/test/diap-quick-test.js +0 -62
  238. package/dist/test/global-shared-context.test.js +0 -315
  239. package/dist/test/harness-judgment-injection.test.js +0 -246
  240. package/dist/test/harness-workflow-integrator-test.js +0 -228
  241. package/dist/test/human-value-store.test.js +0 -243
  242. package/dist/test/hybrid-integration-test.js +0 -118
  243. package/dist/test/hybrid-messenger-verify.js +0 -55
  244. package/dist/test/iroh-bistream-debug.js +0 -38
  245. package/dist/test/iroh-communication.test.js +0 -66
  246. package/dist/test/iroh-debug-test.js +0 -57
  247. package/dist/test/iroh-diap-test.js +0 -71
  248. package/dist/test/iroh-direct-connect.js +0 -55
  249. package/dist/test/iroh-e2e-fixed.js +0 -89
  250. package/dist/test/iroh-e2e-same-process.js +0 -63
  251. package/dist/test/iroh-e2e.js +0 -66
  252. package/dist/test/iroh-final-e2e.js +0 -72
  253. package/dist/test/iroh-relay-test.js +0 -37
  254. package/dist/test/iroh-simple-test.js +0 -41
  255. package/dist/test/iroh-transport-verify.js +0 -54
  256. package/dist/test/iroh-transport.test.js +0 -37
  257. package/dist/test/iroh-two-nodes.js +0 -70
  258. package/dist/test/iroh-verify.js +0 -44
  259. package/dist/test/judgment-decision.test.js +0 -219
  260. package/dist/test/llm-judgment-integration.test.js +0 -220
  261. package/dist/test/p2p-agent-complex-dialogue.js +0 -385
  262. package/dist/test/p2p-agent-dialogue.js +0 -341
  263. package/dist/test/p2p-agent-full-bidirectional.js +0 -510
  264. package/dist/test/p2p-agent-harness-flow.js +0 -437
  265. package/dist/test/p2p-agent-harness-single.js +0 -143
  266. package/dist/test/p2p-ai-dialogue-test.js +0 -318
  267. package/dist/test/p2p-cid-connect-test.js +0 -195
  268. package/dist/test/p2p-connect-receiver.js +0 -69
  269. package/dist/test/p2p-doc-transfer.js +0 -110
  270. package/dist/test/p2p-identity-page-test.js +0 -77
  271. package/dist/test/p2p-iroh-test.js +0 -171
  272. package/dist/test/p2p-minimal-test.js +0 -241
  273. package/dist/test/p2p-node-1.js +0 -148
  274. package/dist/test/p2p-node-2.js +0 -148
  275. package/dist/test/p2p-server.js +0 -281
  276. package/dist/test/p2p-two-nodes-test.js +0 -438
  277. package/dist/test/pi-sdk.test.js +0 -44
  278. package/dist/test/set-persona.js +0 -40
  279. package/dist/test/simple.test.js +0 -9
  280. package/dist/test/storage-integration.test.js +0 -150
  281. package/dist/test/subagent-manager.test.js +0 -276
  282. package/dist/test/test-gate-flow.test.js +0 -81
  283. package/dist/test/workflow-engine.test.js +0 -87
  284. package/dist/test/workflow-pivot-loop.test.js +0 -246
@@ -1,216 +1,216 @@
1
- /**
2
- * CLI 构建脚本
3
- *
4
- * 生成 bin/bolloon.js 和 bin/bolloon.cmd 入口文件
5
- */
6
-
7
- import * as fs from 'fs';
8
- import * as path from 'path';
9
- import { fileURLToPath } from 'url';
10
-
11
- const __filename = fileURLToPath(import.meta.url);
12
- const __dirname = path.dirname(__filename);
13
- const rootDir = path.join(__dirname, '..');
14
-
15
- const binDir = path.join(rootDir, 'bin');
16
- if (!fs.existsSync(binDir)) {
17
- fs.mkdirSync(binDir, { recursive: true });
18
- }
19
-
20
- // Windows 批处理入口
21
- const winContent = `@echo off
22
- set "BOLLOON_ROOT=%~dp0"
23
- set "BOLLOON_ROOT=%BOLLOON_ROOT:~0,-1%"
24
-
25
- REM 确定入口文件
26
- set "ENTRY=%BOLLOON_ROOT%\\dist\\index.js"
27
- if not exist "%ENTRY%" (
28
- set "ENTRY=%BOLLOON_ROOT%\\src\\index.ts"
29
- )
30
-
31
- node "%ENTRY%" %*
32
- `;
33
-
34
- fs.writeFileSync(path.join(binDir, 'bolloon.cmd'), winContent);
35
-
36
- // Unix/Linux/Mac 入口脚本
37
- const unixContent = `#!/usr/bin/env node
38
- const path = require("path");
39
- const { spawn } = require("child_process");
40
- const fs = require("fs");
41
-
42
- const RESET = "\\x1b[0m";
43
- const BOLD = "\\x1b[1m";
44
- const CYAN = "\\x1b[36m";
45
- const GREEN = "\\x1b[32m";
46
- const MAGENTA = "\\x1b[35m";
47
-
48
- function log(msg, color) {
49
- console.log((color || RESET) + msg + RESET);
50
- }
51
-
52
- function printBanner() {
53
- console.log("\\n" + CYAN + BOLD + [
54
- " ╔═══════════════════════════════════════════╗",
55
- " ║ 🤖 Bolloon Agent ║",
56
- " ║ P2P AI Document Processor ║",
57
- " ╚═══════════════════════════════════════════╝"
58
- ].join("\\n") + RESET + "\\n");
59
- }
60
-
61
- function getMainEntry() {
62
- const distDir = path.dirname(require.main.filename);
63
- const distIndex = path.join(distDir, "index.js");
64
- if (fs.existsSync(distIndex)) {
65
- return distIndex;
66
- }
67
- return path.join(process.cwd(), "src", "index.ts");
68
- }
69
-
70
- function parseArgs() {
71
- const args = process.argv.slice(2);
72
- if (args.length === 0) {
73
- return { mode: "gui", args: [] };
74
- }
75
- const first = args[0];
76
- switch (first) {
77
- case "-v":
78
- case "--version":
79
- return { mode: "version", args: [] };
80
- case "-h":
81
- case "--help":
82
- return { mode: "help", args: [] };
83
- case "-g":
84
- case "--gui":
85
- return { mode: "gui", args: args.slice(1) };
86
- case "-w":
87
- case "--web":
88
- return { mode: "web", args: args.slice(1) };
89
- case "-c":
90
- case "--cli":
91
- return { mode: "cli", args: args.slice(1) };
92
- default:
93
- return { mode: "passthrough", args };
94
- }
95
- }
96
-
97
- async function startElectron(additionalArgs) {
98
- try {
99
- const electron = require("electron");
100
- const distDir = path.dirname(require.main.filename);
101
- let mainPath = path.join(distDir, "electron.js");
102
- if (!fs.existsSync(mainPath)) {
103
- mainPath = path.join(process.cwd(), "src", "electron.ts");
104
- }
105
- log("启动 Electron...", CYAN);
106
- const child = spawn(electron, [mainPath, ...additionalArgs], {
107
- stdio: "inherit",
108
- env: { ...process.env, NODE_ENV: "development" }
109
- });
110
- child.on("error", (err) => {
111
- log("Electron 启动失败: " + err.message, MAGENTA);
112
- process.exit(1);
113
- });
114
- child.on("exit", (code) => process.exit(code || 0));
115
- } catch (err) {
116
- log("Electron 不可用,切换到 Web 模式...", CYAN);
117
- await startWebServer(additionalArgs);
118
- }
119
- }
120
-
121
- async function startWebServer(additionalArgs) {
122
- const mainPath = getMainEntry();
123
- const webArgs = ["--web", ...additionalArgs];
124
- log("启动 Web 服务...", CYAN);
125
- const child = spawn(process.execPath, [mainPath, ...webArgs], { stdio: "inherit" });
126
- child.on("error", (err) => {
127
- log("Web 服务启动失败: " + err.message, MAGENTA);
128
- process.exit(1);
129
- });
130
- child.on("exit", (code) => process.exit(code || 0));
131
- }
132
-
133
- async function startCLI(additionalArgs) {
134
- const mainPath = getMainEntry();
135
- log("启动命令行界面...", CYAN);
136
- const child = spawn(process.execPath, [mainPath, ...additionalArgs], { stdio: "inherit" });
137
- child.on("error", (err) => {
138
- log("CLI 启动失败: " + err.message, MAGENTA);
139
- process.exit(1);
140
- });
141
- child.on("exit", (code) => process.exit(code || 0));
142
- }
143
-
144
- async function main() {
145
- const { mode, args } = parseArgs();
146
- switch (mode) {
147
- case "version":
148
- console.log("Bolloon Agent v0.1.1");
149
- break;
150
- case "help":
151
- printBanner();
152
- console.log(BOLD + "用法:" + RESET + " bolloon [选项] [命令] [参数]");
153
- console.log(BOLD + "选项:" + RESET + " --gui, -g 启动图形界面");
154
- console.log(" --web, -w 启动 Web UI");
155
- console.log(" --cli, -c 启动命令行界面");
156
- console.log(" --version, -v 显示版本");
157
- console.log(" --help, -h 显示帮助");
158
- console.log(BOLD + "示例:" + RESET + " bolloon # 启动图形界面");
159
- console.log(" bolloon --web # 启动 Web UI");
160
- console.log(" bolloon --read file # 读取文档");
161
- break;
162
- case "gui":
163
- printBanner();
164
- await startElectron(args);
165
- break;
166
- case "web":
167
- printBanner();
168
- await startWebServer(args);
169
- break;
170
- case "cli":
171
- await startCLI(args);
172
- break;
173
- case "passthrough":
174
- const mainPath = getMainEntry();
175
- const child = spawn(process.execPath, [mainPath, ...args], { stdio: "inherit" });
176
- child.on("error", (err) => {
177
- log("执行失败: " + err.message, MAGENTA);
178
- process.exit(1);
179
- });
180
- child.on("exit", (code) => process.exit(code || 0));
181
- break;
182
- default:
183
- log("未知模式: " + mode, MAGENTA);
184
- printBanner();
185
- console.log("输入 --help 查看帮助");
186
- process.exit(1);
187
- }
188
- }
189
-
190
- main().catch((err) => {
191
- console.error("Fatal error:", err);
192
- process.exit(1);
193
- });
194
- `;
195
-
196
- fs.writeFileSync(path.join(binDir, 'bolloon.cjs'), unixContent);
197
-
198
- // 确保 bin/bolloon.js 存在(npm link 需要)
199
- // 优先用符号链接(POSIX),Windows 上若权限不足则退化为复制文件
200
- const jsSymlink = path.join(binDir, 'bolloon.js');
201
- if (fs.existsSync(jsSymlink)) fs.unlinkSync(jsSymlink);
202
- try {
203
- fs.symlinkSync('bolloon.cjs', jsSymlink);
204
- } catch (err) {
205
- if (err && err.code === 'EPERM') {
206
- fs.copyFileSync(path.join(binDir, 'bolloon.cjs'), jsSymlink);
207
- console.warn(' ⚠ symlink 不支持(Windows),已退化为文件复制');
208
- } else {
209
- throw err;
210
- }
211
- }
212
-
213
- console.log("✓ CLI 构建完成");
214
- console.log(" bin/bolloon.cjs - CommonJS 入口");
215
- console.log(" bin/bolloon.js - 符号链接 -> bolloon.cjs");
1
+ /**
2
+ * CLI 构建脚本
3
+ *
4
+ * 生成 bin/bolloon.js 和 bin/bolloon.cmd 入口文件
5
+ */
6
+
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import { fileURLToPath } from 'url';
10
+
11
+ const __filename = fileURLToPath(import.meta.url);
12
+ const __dirname = path.dirname(__filename);
13
+ const rootDir = path.join(__dirname, '..');
14
+
15
+ const binDir = path.join(rootDir, 'bin');
16
+ if (!fs.existsSync(binDir)) {
17
+ fs.mkdirSync(binDir, { recursive: true });
18
+ }
19
+
20
+ // Windows 批处理入口
21
+ const winContent = `@echo off
22
+ set "BOLLOON_ROOT=%~dp0"
23
+ set "BOLLOON_ROOT=%BOLLOON_ROOT:~0,-1%"
24
+
25
+ REM 确定入口文件
26
+ set "ENTRY=%BOLLOON_ROOT%\\dist\\index.js"
27
+ if not exist "%ENTRY%" (
28
+ set "ENTRY=%BOLLOON_ROOT%\\src\\index.ts"
29
+ )
30
+
31
+ node "%ENTRY%" %*
32
+ `;
33
+
34
+ fs.writeFileSync(path.join(binDir, 'bolloon.cmd'), winContent);
35
+
36
+ // Unix/Linux/Mac 入口脚本
37
+ const unixContent = `#!/usr/bin/env node
38
+ const path = require("path");
39
+ const { spawn } = require("child_process");
40
+ const fs = require("fs");
41
+
42
+ const RESET = "\\x1b[0m";
43
+ const BOLD = "\\x1b[1m";
44
+ const CYAN = "\\x1b[36m";
45
+ const GREEN = "\\x1b[32m";
46
+ const MAGENTA = "\\x1b[35m";
47
+
48
+ function log(msg, color) {
49
+ console.log((color || RESET) + msg + RESET);
50
+ }
51
+
52
+ function printBanner() {
53
+ console.log("\\n" + CYAN + BOLD + [
54
+ " ╔═══════════════════════════════════════════╗",
55
+ " ║ 🤖 Bolloon Agent ║",
56
+ " ║ P2P AI Document Processor ║",
57
+ " ╚═══════════════════════════════════════════╝"
58
+ ].join("\\n") + RESET + "\\n");
59
+ }
60
+
61
+ function getMainEntry() {
62
+ const distDir = path.dirname(require.main.filename);
63
+ const distIndex = path.join(distDir, "index.js");
64
+ if (fs.existsSync(distIndex)) {
65
+ return distIndex;
66
+ }
67
+ return path.join(process.cwd(), "src", "index.ts");
68
+ }
69
+
70
+ function parseArgs() {
71
+ const args = process.argv.slice(2);
72
+ if (args.length === 0) {
73
+ return { mode: "gui", args: [] };
74
+ }
75
+ const first = args[0];
76
+ switch (first) {
77
+ case "-v":
78
+ case "--version":
79
+ return { mode: "version", args: [] };
80
+ case "-h":
81
+ case "--help":
82
+ return { mode: "help", args: [] };
83
+ case "-g":
84
+ case "--gui":
85
+ return { mode: "gui", args: args.slice(1) };
86
+ case "-w":
87
+ case "--web":
88
+ return { mode: "web", args: args.slice(1) };
89
+ case "-c":
90
+ case "--cli":
91
+ return { mode: "cli", args: args.slice(1) };
92
+ default:
93
+ return { mode: "passthrough", args };
94
+ }
95
+ }
96
+
97
+ async function startElectron(additionalArgs) {
98
+ try {
99
+ const electron = require("electron");
100
+ const distDir = path.dirname(require.main.filename);
101
+ let mainPath = path.join(distDir, "electron.js");
102
+ if (!fs.existsSync(mainPath)) {
103
+ mainPath = path.join(process.cwd(), "src", "electron.ts");
104
+ }
105
+ log("启动 Electron...", CYAN);
106
+ const child = spawn(electron, [mainPath, ...additionalArgs], {
107
+ stdio: "inherit",
108
+ env: { ...process.env, NODE_ENV: "development" }
109
+ });
110
+ child.on("error", (err) => {
111
+ log("Electron 启动失败: " + err.message, MAGENTA);
112
+ process.exit(1);
113
+ });
114
+ child.on("exit", (code) => process.exit(code || 0));
115
+ } catch (err) {
116
+ log("Electron 不可用,切换到 Web 模式...", CYAN);
117
+ await startWebServer(additionalArgs);
118
+ }
119
+ }
120
+
121
+ async function startWebServer(additionalArgs) {
122
+ const mainPath = getMainEntry();
123
+ const webArgs = ["--web", ...additionalArgs];
124
+ log("启动 Web 服务...", CYAN);
125
+ const child = spawn(process.execPath, [mainPath, ...webArgs], { stdio: "inherit" });
126
+ child.on("error", (err) => {
127
+ log("Web 服务启动失败: " + err.message, MAGENTA);
128
+ process.exit(1);
129
+ });
130
+ child.on("exit", (code) => process.exit(code || 0));
131
+ }
132
+
133
+ async function startCLI(additionalArgs) {
134
+ const mainPath = getMainEntry();
135
+ log("启动命令行界面...", CYAN);
136
+ const child = spawn(process.execPath, [mainPath, ...additionalArgs], { stdio: "inherit" });
137
+ child.on("error", (err) => {
138
+ log("CLI 启动失败: " + err.message, MAGENTA);
139
+ process.exit(1);
140
+ });
141
+ child.on("exit", (code) => process.exit(code || 0));
142
+ }
143
+
144
+ async function main() {
145
+ const { mode, args } = parseArgs();
146
+ switch (mode) {
147
+ case "version":
148
+ console.log("Bolloon Agent v0.1.1");
149
+ break;
150
+ case "help":
151
+ printBanner();
152
+ console.log(BOLD + "用法:" + RESET + " bolloon [选项] [命令] [参数]");
153
+ console.log(BOLD + "选项:" + RESET + " --gui, -g 启动图形界面");
154
+ console.log(" --web, -w 启动 Web UI");
155
+ console.log(" --cli, -c 启动命令行界面");
156
+ console.log(" --version, -v 显示版本");
157
+ console.log(" --help, -h 显示帮助");
158
+ console.log(BOLD + "示例:" + RESET + " bolloon # 启动图形界面");
159
+ console.log(" bolloon --web # 启动 Web UI");
160
+ console.log(" bolloon --read file # 读取文档");
161
+ break;
162
+ case "gui":
163
+ printBanner();
164
+ await startElectron(args);
165
+ break;
166
+ case "web":
167
+ printBanner();
168
+ await startWebServer(args);
169
+ break;
170
+ case "cli":
171
+ await startCLI(args);
172
+ break;
173
+ case "passthrough":
174
+ const mainPath = getMainEntry();
175
+ const child = spawn(process.execPath, [mainPath, ...args], { stdio: "inherit" });
176
+ child.on("error", (err) => {
177
+ log("执行失败: " + err.message, MAGENTA);
178
+ process.exit(1);
179
+ });
180
+ child.on("exit", (code) => process.exit(code || 0));
181
+ break;
182
+ default:
183
+ log("未知模式: " + mode, MAGENTA);
184
+ printBanner();
185
+ console.log("输入 --help 查看帮助");
186
+ process.exit(1);
187
+ }
188
+ }
189
+
190
+ main().catch((err) => {
191
+ console.error("Fatal error:", err);
192
+ process.exit(1);
193
+ });
194
+ `;
195
+
196
+ fs.writeFileSync(path.join(binDir, 'bolloon.cjs'), unixContent);
197
+
198
+ // 确保 bin/bolloon.js 存在(npm link 需要)
199
+ // 优先用符号链接(POSIX),Windows 上若权限不足则退化为复制文件
200
+ const jsSymlink = path.join(binDir, 'bolloon.js');
201
+ if (fs.existsSync(jsSymlink)) fs.unlinkSync(jsSymlink);
202
+ try {
203
+ fs.symlinkSync('bolloon.cjs', jsSymlink);
204
+ } catch (err) {
205
+ if (err && err.code === 'EPERM') {
206
+ fs.copyFileSync(path.join(binDir, 'bolloon.cjs'), jsSymlink);
207
+ console.warn(' ⚠ symlink 不支持(Windows),已退化为文件复制');
208
+ } else {
209
+ throw err;
210
+ }
211
+ }
212
+
213
+ console.log("✓ CLI 构建完成");
214
+ console.log(" bin/bolloon.cjs - CommonJS 入口");
215
+ console.log(" bin/bolloon.js - 符号链接 -> bolloon.cjs");
216
216
  console.log(" bin/bolloon.cmd - Windows 入口");