@bolloon/bolloon-agent 0.2.11 → 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 +1677 -244
  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 -374
  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 -4737
  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 -125
  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,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
+ });
@@ -0,0 +1,207 @@
1
+ #!/bin/bash
2
+ # Bolloon Daemon - 守护进程启动脚本
3
+ # 支持自动重启、日志轮转、PID 管理
4
+
5
+ set -e
6
+
7
+ APP_NAME="bolloon"
8
+ APP_DIR="$(cd "$(dirname "$0")/.." && pwd)"
9
+ PID_FILE="$HOME/.bolloon/daemon.pid"
10
+ LOG_FILE="$HOME/.bolloon/daemon.log"
11
+ MAX_RESTARTS=5
12
+ RESTART_DELAY=5
13
+
14
+ # 颜色输出
15
+ RED='\033[0;31m'
16
+ GREEN='\033[0;32m'
17
+ YELLOW='\033[1;33m'
18
+ NC='\033[0m' # No Color
19
+
20
+ log() {
21
+ echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1"
22
+ }
23
+
24
+ warn() {
25
+ echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] WARN:${NC} $1"
26
+ }
27
+
28
+ error() {
29
+ echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ERROR:${NC} $1"
30
+ }
31
+
32
+ # 获取 PID
33
+ get_pid() {
34
+ if [ -f "$PID_FILE" ]; then
35
+ cat "$PID_FILE"
36
+ fi
37
+ }
38
+
39
+ # 检查进程是否运行
40
+ is_running() {
41
+ local pid=$(get_pid)
42
+ if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then
43
+ return 0
44
+ fi
45
+ return 1
46
+ }
47
+
48
+ # 启动守护进程
49
+ start() {
50
+ if is_running; then
51
+ log "Bolloon 已在运行 (PID: $(get_pid))"
52
+ return 0
53
+ fi
54
+
55
+ log "启动 Bolloon 守护进程..."
56
+
57
+ # 确保日志目录存在
58
+ mkdir -p "$(dirname "$LOG_FILE")"
59
+
60
+ # 启动进程
61
+ cd "$APP_DIR"
62
+ nohup npx tsx src/index.ts >> "$LOG_FILE" 2>&1 &
63
+ local pid=$!
64
+
65
+ # 保存 PID
66
+ echo "$pid" > "$PID_FILE"
67
+ log "Bolloon 已启动 (PID: $pid)"
68
+ log "日志文件: $LOG_FILE"
69
+ }
70
+
71
+ # 停止守护进程
72
+ stop() {
73
+ local pid=$(get_pid)
74
+
75
+ if [ -z "$pid" ]; then
76
+ warn "Bolloon 未运行"
77
+ return 0
78
+ fi
79
+
80
+ log "停止 Bolloon (PID: $pid)..."
81
+
82
+ # 发送 SIGTERM
83
+ kill -TERM "$pid" 2>/dev/null || true
84
+
85
+ # 等待进程退出
86
+ local count=0
87
+ while kill -0 "$pid" 2>/dev/null && [ $count -lt 10 ]; do
88
+ sleep 1
89
+ count=$((count + 1))
90
+ done
91
+
92
+ # 如果还在运行,强制终止
93
+ if kill -0 "$pid" 2>/dev/null; then
94
+ warn "进程未响应,发送 SIGKILL..."
95
+ kill -KILL "$pid" 2>/dev/null || true
96
+ fi
97
+
98
+ # 清理 PID 文件
99
+ rm -f "$PID_FILE"
100
+ log "Bolloon 已停止"
101
+ }
102
+
103
+ # 重启守护进程
104
+ restart() {
105
+ log "重启 Bolloon..."
106
+ stop
107
+ sleep 2
108
+ start
109
+ }
110
+
111
+ # 查看状态
112
+ status() {
113
+ if is_running; then
114
+ log "Bolloon 运行中 (PID: $(get_pid))"
115
+ # 显示资源使用
116
+ local pid=$(get_pid)
117
+ if [ -n "$pid" ]; then
118
+ ps -p "$pid" -o %cpu,%mem,etime 2>/dev/null | tail -1 || true
119
+ fi
120
+ else
121
+ warn "Bolloon 未运行"
122
+ fi
123
+ }
124
+
125
+ # 查看日志
126
+ logs() {
127
+ if [ -f "$LOG_FILE" ]; then
128
+ tail -100 "$LOG_FILE"
129
+ else
130
+ warn "日志文件不存在: $LOG_FILE"
131
+ fi
132
+ }
133
+
134
+ # 健康检查
135
+ health() {
136
+ local port=${PORT:-54188}
137
+ local response=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:$port/api/health" 2>/dev/null || echo "000")
138
+
139
+ if [ "$response" = "200" ]; then
140
+ log "健康检查通过"
141
+ curl -s "http://localhost:$port/api/health" 2>/dev/null | head -5
142
+ else
143
+ error "健康检查失败 (HTTP $response)"
144
+ return 1
145
+ fi
146
+ }
147
+
148
+ # 清理日志
149
+ clean_logs() {
150
+ if [ -f "$LOG_FILE" ]; then
151
+ local size=$(du -h "$LOG_FILE" | cut -f1)
152
+ log "当前日志大小: $size"
153
+ > "$LOG_FILE"
154
+ log "日志已清空"
155
+ fi
156
+ }
157
+
158
+ # 显示帮助
159
+ show_help() {
160
+ echo "Bolloon Daemon 守护进程管理脚本"
161
+ echo ""
162
+ echo "用法: $0 [命令]"
163
+ echo ""
164
+ echo "命令:"
165
+ echo " start 启动 Bolloon 守护进程"
166
+ echo " stop 停止 Bolloon 守护进程"
167
+ echo " restart 重启 Bolloon 守护进程"
168
+ echo " status 查看运行状态"
169
+ echo " logs 查看最近日志"
170
+ echo " health 健康检查"
171
+ echo " clean 清空日志"
172
+ echo " help 显示帮助"
173
+ echo ""
174
+ }
175
+
176
+ # 主逻辑
177
+ case "${1:-help}" in
178
+ start)
179
+ start
180
+ ;;
181
+ stop)
182
+ stop
183
+ ;;
184
+ restart)
185
+ restart
186
+ ;;
187
+ status)
188
+ status
189
+ ;;
190
+ logs)
191
+ logs
192
+ ;;
193
+ health)
194
+ health
195
+ ;;
196
+ clean)
197
+ clean_logs
198
+ ;;
199
+ help|--help|-h)
200
+ show_help
201
+ ;;
202
+ *)
203
+ error "未知命令: $1"
204
+ show_help
205
+ exit 1
206
+ ;;
207
+ esac
package/bin/bolloon.cjs CHANGED
File without changes
package/bin/ipfs ADDED
Binary file
@@ -44,6 +44,16 @@ const localManifest = {
44
44
  };
45
45
  export function setLocalManifest(m) {
46
46
  Object.assign(localManifest, m, { publishedAt: Date.now() });
47
+ // 2026-07-05: 显式重置 v2 数组字段 — Partial merge 不会清空未提供的 key,
48
+ // 但调用者通常期望"整片替换", 所以这里强制对齐 (避免测试间泄漏).
49
+ if (!('groups' in m))
50
+ localManifest.groups = [];
51
+ if (!('functions' in m))
52
+ localManifest.functions = [];
53
+ if (!('exportments' in m))
54
+ localManifest.exportments = [];
55
+ if (!('sciences' in m))
56
+ localManifest.sciences = [];
47
57
  return localManifest;
48
58
  }
49
59
  export function getLocalManifest() {
@@ -58,6 +68,48 @@ export function addLocalAgent(agent) {
58
68
  localManifest.publishedAt = Date.now();
59
69
  return localManifest;
60
70
  }
71
+ // ============== 2026-07-05: 4 类资源 setter (groups/function/exportment/science) ==============
72
+ // 默认 localManifest 不带这些字段; 一旦调用就 patch 进去. 不强制覆盖旧值.
73
+ export function addLocalGroup(g) {
74
+ localManifest.groups = localManifest.groups || [];
75
+ const idx = localManifest.groups.findIndex((x) => x.id === g.id);
76
+ if (idx >= 0)
77
+ localManifest.groups[idx] = { ...localManifest.groups[idx], ...g };
78
+ else
79
+ localManifest.groups.push(g);
80
+ localManifest.publishedAt = Date.now();
81
+ return localManifest;
82
+ }
83
+ export function addLocalFunction(f) {
84
+ localManifest.functions = localManifest.functions || [];
85
+ const idx = localManifest.functions.findIndex((x) => x.capability === f.capability);
86
+ if (idx >= 0)
87
+ localManifest.functions[idx] = { ...localManifest.functions[idx], ...f };
88
+ else
89
+ localManifest.functions.push(f);
90
+ localManifest.publishedAt = Date.now();
91
+ return localManifest;
92
+ }
93
+ export function addLocalExportment(e) {
94
+ localManifest.exportments = localManifest.exportments || [];
95
+ const idx = localManifest.exportments.findIndex((x) => x.name === e.name);
96
+ if (idx >= 0)
97
+ localManifest.exportments[idx] = { ...localManifest.exportments[idx], ...e };
98
+ else
99
+ localManifest.exportments.push(e);
100
+ localManifest.publishedAt = Date.now();
101
+ return localManifest;
102
+ }
103
+ export function addLocalScience(s) {
104
+ localManifest.sciences = localManifest.sciences || [];
105
+ const idx = localManifest.sciences.findIndex((x) => x.id === s.id);
106
+ if (idx >= 0)
107
+ localManifest.sciences[idx] = { ...localManifest.sciences[idx], ...s };
108
+ else
109
+ localManifest.sciences.push(s);
110
+ localManifest.publishedAt = Date.now();
111
+ return localManifest;
112
+ }
61
113
  // ============== 远端 manifest 缓存 ==============
62
114
  const remoteManifests = new Map(); // key = ownerPublicKey
63
115
  export function cacheRemoteManifest(m) {