@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
package/dist/index.js CHANGED
@@ -4,6 +4,7 @@ import { HybridMessenger } from './network/hybrid-messenger.js';
4
4
  import * as ed25519 from '@noble/ed25519';
5
5
  import { sha512 } from '@noble/hashes/sha2.js';
6
6
  import * as fs from 'fs/promises';
7
+ import * as path from 'path';
7
8
  import { documentReader } from './documents/reader.js';
8
9
  import { initMinimax } from './constraints/index.js';
9
10
  import { createAgentSession } from './agents/pi-sdk.js';
@@ -11,6 +12,7 @@ import { createSubAgentManager } from './agents/subagent-manager.js';
11
12
  import { getGlobalSharedContext } from './social/global-shared-context.js';
12
13
  import { createBollharnessIntegration } from './bollharness-integration/index.js';
13
14
  import * as readline from 'readline';
15
+ import { LoadingTUI } from './cli/loading-tui.js';
14
16
  // 启动时自动检查更新已禁用 (改用 --update-check / --update-now 显式触发)
15
17
  const RESET = '\x1b[0m';
16
18
  const BOLD = '\x1b[1m';
@@ -30,10 +32,10 @@ const CLEAR_LINE = '\x1b[2K';
30
32
  const HIDE_CURSOR = '\x1b[?25l';
31
33
  const SHOW_CURSOR = '\x1b[?25h';
32
34
  const s = {
33
- banner: () => console.log(`\n${CYAN}${BOLD}
34
- ╔═══════════════════════════════════════════╗
35
- ║ ${WHITE}🤖 Bolloon ${CYAN} ║
36
- ║ ${WHITE}P2P AI Document Processor${CYAN} ║
35
+ banner: () => console.log(`\n${CYAN}${BOLD}
36
+ ╔═══════════════════════════════════════════╗
37
+ ║ ${WHITE}🤖 Bolloon ${CYAN} ║
38
+ ║ ${WHITE}P2P AI Document Processor${CYAN} ║
37
39
  ╚═══════════════════════════════════════════╝${RESET}\n`),
38
40
  step: (num, total, text, status) => {
39
41
  const check = status === 'ok' ? `${GREEN}✓` :
@@ -576,10 +578,10 @@ async function runToolCommand(tool, args, outputJson, comm) {
576
578
  const running = irohTransport.isRunning();
577
579
  const irohPeers = irohTransport.getPeers();
578
580
  const messenger = hybridMessenger ? 'HybridMessenger 就绪' : 'HybridMessenger 未初始化';
579
- response = `iroh P2P 状态:
580
- 运行中: ${running ? '是' : '否'}
581
- Node ID: ${nodeId ? nodeId.substring(0, 32) + '...' : 'N/A'}
582
- 已知节点: ${irohPeers.length}
581
+ response = `iroh P2P 状态:
582
+ 运行中: ${running ? '是' : '否'}
583
+ Node ID: ${nodeId ? nodeId.substring(0, 32) + '...' : 'N/A'}
584
+ 已知节点: ${irohPeers.length}
583
585
  ${messenger}`;
584
586
  break;
585
587
  }
@@ -750,6 +752,14 @@ async function runToolCommand(tool, args, outputJson, comm) {
750
752
  `已加载 Harness Skills: ${harnessSkills.length}\n\n` +
751
753
  `Skills:\n${skills.map(s => ` - ${s.name}: ${s.description}`).join('\n')}\n\n` +
752
754
  `Gates: 0-8 (8-Gate 工作流)`;
755
+ // Fix 1: write-back 初始化摘要到 AGENTS.md
756
+ try {
757
+ const fs_write = await import('fs');
758
+ const agentMd = path.join(process.cwd(), 'AGENTS.md');
759
+ const entry = `\n<!-- bolloon-init -->\n**Bollharness 初始化**: ${new Date().toISOString().slice(0, 10)} | Skills: ${skills.length} | Gates: 0-8\n`;
760
+ fs_write.appendFileSync(agentMd, entry);
761
+ }
762
+ catch { /* 静默 */ }
753
763
  break;
754
764
  }
755
765
  case 'harness-gate': {
@@ -806,6 +816,14 @@ async function runToolCommand(tool, args, outputJson, comm) {
806
816
  response = `📊 变更分类: ${result.classification}\n` +
807
817
  `最小路径: ${result.minimum_gates}\n` +
808
818
  `快速通道: ${result.fast_track ? '✅ 可用' : '❌ 不可用'}`;
819
+ // Fix 1: write-back 分类结果到 CLAUDE.md
820
+ try {
821
+ const fs_write = await import('fs');
822
+ const agentMd = path.join(process.cwd(), 'CLAUDE.md');
823
+ const entry = `\n<!-- bolloon-classify -->\n**变更分类**: ${result.classification} | ${description} | ${new Date().toISOString().slice(0, 10)}\n`;
824
+ fs_write.appendFileSync(agentMd, entry);
825
+ }
826
+ catch { /* 静默 */ }
809
827
  break;
810
828
  }
811
829
  case 'harness-context': {
@@ -1666,285 +1684,324 @@ function parseArgs() {
1666
1684
  return result;
1667
1685
  }
1668
1686
  function printHelp() {
1669
- console.log(`
1670
- 🤖 Bolloon Agent - AI 可调用文档处理智能体
1671
-
1672
- 用法:
1673
- npx tsx src/index.ts [选项] [参数]
1674
-
1675
- 选项:
1676
- # 文档处理
1677
- --read <file> 读取文档 (txt, md, pdf, docx)
1678
- --summarize <file> [ctx] 总结文档,可选上下文
1679
- --improve <file> <req> 改进文档,req 为改进要求
1680
-
1681
- # P2P 网络
1682
- --peers 列出已连接的对等节点
1683
- --broadcast <msg> 广播消息到所有节点
1684
- --send <peerId> <msg> 向指定节点发送消息
1685
-
1686
- # 智能体
1687
- --identity 显示当前智能体身份
1688
- --logs 显示操作日志
1689
- --search <keyword> 搜索文件
1690
- --tools 显示所有可用工具
1691
-
1692
- # SubAgent 管理
1693
- --agents 列出所有 SubAgent
1694
- --register-agent <name> [cap1] [cap2]... 注册新 SubAgent
1695
- --delegate <任务描述> [能力要求...] 委派任务给最佳 Agent
1696
-
1697
- # 全局共享上下文
1698
- --context 显示全局共享上下文摘要
1699
- --global-agents 显示全局 Agent 注册表
1700
- --add-action <内容> [重要性] 添加用户行动到共享上下文
1701
-
1702
- # Bollharness 治理框架
1703
- --harness-init 初始化 Bollharness 治理框架
1704
- --harness-gate 显示当前 Gate 状态
1705
- --harness-transition [PASS|BLOCK] 执行 Gate 转移
1706
- --harness-skill <name> [action] 执行 Harness Skill
1707
- --harness-classify <描述> 分类变更类型
1708
- --harness-context <file> 获取文件上下文
1709
- --harness-check <file> 执行 Guard 检查
1710
- --harness-archive 归档当前 Session 到 Harness
1711
- --harness-sessions 列出 Session 归档记录
1712
- --harness-session-context [id] 获取 Session 上下文
1713
-
1714
- # 自动更新
1715
- --update-check 检查 npm 包更新
1716
- --update-now [pkg] 更新到最新版本
1717
-
1718
- # 跨机聊天 (commits-as-messages, 共享 GitHub 仓库)
1719
- --chat-init 初始化 .comm/ 目录 (一次性)
1720
- --chat-send "消息正文" 把消息写到 .comm/<role>/, commit + push
1721
- --chat-pull 拉取远端 .comm/ 的新消息并显示
1722
- --chat-list 列出本地所有已同步消息
1723
- --chat-watch [--interval 15s] 后台定时拉取, 有新消息时输出
1724
- --chat-status 一屏查看: role / publicKey / remote / ahead-behind
1725
-
1726
- # 纯 P2P 私聊 (不走 GitHub, 不写 git, 不持久化)
1727
- --chat-p2p-send <peer|publicKey> "消息正文" 通过 P2P 直接发一条
1728
- --chat-p2p-listen 后台监听对方 P2P 私聊消息 (Ctrl-C 退出)
1729
-
1730
- # 跨机 agent 协作 (对方 bolloon --web 起着才能处理, 走 P2P 不经 GitHub)
1731
- --collab <peer|publicKey> "<任务描述>" 派任务给对端 LLM 干活, 等回结果 (90s 超时)
1732
-
1733
- # AI 对话
1734
- --prompt, -p <text> 通用 AI 对话(默认)
1735
- --model <name> 指定使用的模型
1736
-
1737
- # 输出控制
1738
- --json, -j 输出 JSON 格式
1739
- --output, -o <file> 结果保存到文件
1740
- --web 启动 Web UI 模式
1741
- --help, -h 显示帮助信息
1742
-
1743
- 示例:
1744
- # 文档处理
1745
- npx tsx src/index.ts --read 想法.md
1746
- npx tsx src/index.ts --summarize docs/想法.md
1747
- npx tsx src/index.ts --improve docs/README.md "让内容更简洁"
1748
- npx tsx src/index.ts --read 想法.md -o summary.txt
1749
-
1750
- # P2P 网络
1751
- npx tsx src/index.ts --peers
1752
- npx tsx src/index.ts --broadcast "Hello everyone"
1753
- npx tsx src/index.ts --send QmABC... "私信内容"
1754
-
1755
- # AI 对话
1756
- npx tsx src/index.ts --prompt "总结 README.md"
1757
- npx tsx src/index.ts -p "分析这个项目" -j
1758
-
1759
- # 交互模式
1760
- npx tsx src/index.ts
1761
-
1762
- # Web 模式
1763
- npx tsx src/index.ts --web
1764
-
1765
- 环境变量:
1766
- MINIMAX_API_KEY MiniMax API 密钥
1767
- DEEPSEEK_API_KEY DeepSeek API 密钥
1768
- KIMI_API_KEY / MOONSHOT_API_KEY Kimi/Moonshot API 密钥
1769
- GLM_API_KEY / ZHIPU_API_KEY 智谱 GLM API 密钥
1770
- QWEN_API_KEY / DASHSCOPE_API_KEY 通义千问 API 密钥
1771
- OPENAI_API_KEY OpenAI API 密钥(Pi SDK)
1772
- ANTHROPIC_API_KEY Anthropic API 密钥(Pi SDK)
1773
- PORT Web 服务端口(默认 54188)
1687
+ console.log(`
1688
+ 🤖 Bolloon Agent - AI 可调用文档处理智能体
1689
+
1690
+ 用法:
1691
+ npx tsx src/index.ts [选项] [参数]
1692
+
1693
+ 选项:
1694
+ # 文档处理
1695
+ --read <file> 读取文档 (txt, md, pdf, docx)
1696
+ --summarize <file> [ctx] 总结文档,可选上下文
1697
+ --improve <file> <req> 改进文档,req 为改进要求
1698
+
1699
+ # P2P 网络
1700
+ --peers 列出已连接的对等节点
1701
+ --broadcast <msg> 广播消息到所有节点
1702
+ --send <peerId> <msg> 向指定节点发送消息
1703
+
1704
+ # 智能体
1705
+ --identity 显示当前智能体身份
1706
+ --logs 显示操作日志
1707
+ --search <keyword> 搜索文件
1708
+ --tools 显示所有可用工具
1709
+
1710
+ # SubAgent 管理
1711
+ --agents 列出所有 SubAgent
1712
+ --register-agent <name> [cap1] [cap2]... 注册新 SubAgent
1713
+ --delegate <任务描述> [能力要求...] 委派任务给最佳 Agent
1714
+
1715
+ # 全局共享上下文
1716
+ --context 显示全局共享上下文摘要
1717
+ --global-agents 显示全局 Agent 注册表
1718
+ --add-action <内容> [重要性] 添加用户行动到共享上下文
1719
+
1720
+ # Bollharness 治理框架
1721
+ --harness-init 初始化 Bollharness 治理框架
1722
+ --harness-gate 显示当前 Gate 状态
1723
+ --harness-transition [PASS|BLOCK] 执行 Gate 转移
1724
+ --harness-skill <name> [action] 执行 Harness Skill
1725
+ --harness-classify <描述> 分类变更类型
1726
+ --harness-context <file> 获取文件上下文
1727
+ --harness-check <file> 执行 Guard 检查
1728
+ --harness-archive 归档当前 Session 到 Harness
1729
+ --harness-sessions 列出 Session 归档记录
1730
+ --harness-session-context [id] 获取 Session 上下文
1731
+
1732
+ # 自动更新
1733
+ --update-check 检查 npm 包更新
1734
+ --update-now [pkg] 更新到最新版本
1735
+
1736
+ # 跨机聊天 (commits-as-messages, 共享 GitHub 仓库)
1737
+ --chat-init 初始化 .comm/ 目录 (一次性)
1738
+ --chat-send "消息正文" 把消息写到 .comm/<role>/, commit + push
1739
+ --chat-pull 拉取远端 .comm/ 的新消息并显示
1740
+ --chat-list 列出本地所有已同步消息
1741
+ --chat-watch [--interval 15s] 后台定时拉取, 有新消息时输出
1742
+ --chat-status 一屏查看: role / publicKey / remote / ahead-behind
1743
+
1744
+ # 纯 P2P 私聊 (不走 GitHub, 不写 git, 不持久化)
1745
+ --chat-p2p-send <peer|publicKey> "消息正文" 通过 P2P 直接发一条
1746
+ --chat-p2p-listen 后台监听对方 P2P 私聊消息 (Ctrl-C 退出)
1747
+
1748
+ # 跨机 agent 协作 (对方 bolloon --web 起着才能处理, 走 P2P 不经 GitHub)
1749
+ --collab <peer|publicKey> "<任务描述>" 派任务给对端 LLM 干活, 等回结果 (90s 超时)
1750
+
1751
+ # AI 对话
1752
+ --prompt, -p <text> 通用 AI 对话(默认)
1753
+ --model <name> 指定使用的模型
1754
+
1755
+ # 输出控制
1756
+ --json, -j 输出 JSON 格式
1757
+ --output, -o <file> 结果保存到文件
1758
+ --web 启动 Web UI 模式
1759
+ --help, -h 显示帮助信息
1760
+
1761
+ 示例:
1762
+ # 文档处理
1763
+ npx tsx src/index.ts --read 想法.md
1764
+ npx tsx src/index.ts --summarize docs/想法.md
1765
+ npx tsx src/index.ts --improve docs/README.md "让内容更简洁"
1766
+ npx tsx src/index.ts --read 想法.md -o summary.txt
1767
+
1768
+ # P2P 网络
1769
+ npx tsx src/index.ts --peers
1770
+ npx tsx src/index.ts --broadcast "Hello everyone"
1771
+ npx tsx src/index.ts --send QmABC... "私信内容"
1772
+
1773
+ # AI 对话
1774
+ npx tsx src/index.ts --prompt "总结 README.md"
1775
+ npx tsx src/index.ts -p "分析这个项目" -j
1776
+
1777
+ # 交互模式
1778
+ npx tsx src/index.ts
1779
+
1780
+ # Web 模式
1781
+ npx tsx src/index.ts --web
1782
+
1783
+ 环境变量:
1784
+ MINIMAX_API_KEY MiniMax API 密钥
1785
+ DEEPSEEK_API_KEY DeepSeek API 密钥
1786
+ KIMI_API_KEY / MOONSHOT_API_KEY Kimi/Moonshot API 密钥
1787
+ GLM_API_KEY / ZHIPU_API_KEY 智谱 GLM API 密钥
1788
+ QWEN_API_KEY / DASHSCOPE_API_KEY 通义千问 API 密钥
1789
+ OPENAI_API_KEY OpenAI API 密钥(Pi SDK)
1790
+ ANTHROPIC_API_KEY Anthropic API 密钥(Pi SDK)
1791
+ PORT Web 服务端口(默认 54188)
1774
1792
  `);
1775
1793
  }
1776
1794
  // ---------------------------------------------------------------------------
1777
1795
  // Entry point
1778
1796
  // ---------------------------------------------------------------------------
1779
1797
  async function main() {
1780
- const args = parseArgs();
1781
- if (args.help) {
1782
- printHelp();
1783
- process.exit(0);
1784
- }
1785
- // 自动更新已禁用: 启动时不再自动检查/安装更新.
1786
- // 想手动检查: bolloon --update-check
1787
- // 想手动更新: bolloon --update-now [package]
1788
- // 想完全屏蔽 (CI / sandbox): BOLLOON_SKIP_UPDATE=true
1789
- const mode = args.web ? 'web' : 'cli';
1790
- const isNonInteractive = !!(args.tool || args.prompt);
1791
- const isTuiMode = mode === 'cli' && !isNonInteractive && args.tui;
1792
- const originalLog = console.log;
1793
- const originalInfo = console.info;
1794
- const originalStdoutWrite = process.stdout.write.bind(process.stdout);
1795
- const isSdkLog = (msg) => {
1796
- return /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(msg);
1797
- };
1798
- if (isTuiMode) {
1799
- console.log = (...args) => {
1800
- const msg = args.join(' ');
1801
- if (isSdkLog(msg))
1802
- return;
1803
- originalLog.apply(console, args);
1804
- };
1805
- console.info = (...args) => {
1806
- const msg = args.join(' ');
1807
- if (isSdkLog(msg))
1808
- return;
1809
- originalInfo.apply(console, args);
1810
- };
1811
- process.stdout.write = (chunk, ...args) => {
1812
- const msg = String(chunk);
1813
- if (isSdkLog(msg))
1814
- return true;
1815
- return originalStdoutWrite(chunk, ...args);
1798
+ let loading = null;
1799
+ try {
1800
+ const args = parseArgs();
1801
+ if (args.help) {
1802
+ printHelp();
1803
+ process.exit(0);
1804
+ }
1805
+ // 自动更新已禁用: 启动时不再自动检查/安装更新.
1806
+ // 想手动检查: bolloon --update-check
1807
+ // 想手动更新: bolloon --update-now [package]
1808
+ // 想完全屏蔽 (CI / sandbox): BOLLOON_SKIP_UPDATE=true
1809
+ const mode = args.web ? 'web' : 'cli';
1810
+ const isNonInteractive = !!(args.tool || args.prompt);
1811
+ const isTuiMode = mode === 'cli' && !isNonInteractive && args.tui;
1812
+ const originalLog = console.log;
1813
+ const originalInfo = console.info;
1814
+ const originalStdoutWrite = process.stdout.write.bind(process.stdout);
1815
+ const isSdkLog = (msg) => {
1816
+ return /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(msg);
1816
1817
  };
1817
- }
1818
- if (isNonInteractive) {
1819
- console.error = () => { };
1820
- }
1821
- s.banner();
1822
- s.section('系统初始化');
1823
- const hasOpenAI = !!process.env.OPENAI_API_KEY;
1824
- // 2026-06-15: 修复 之前 anthropic 401 是因为 shell env 残留的旧 ANTHROPIC_API_KEY 抢了 provider 选择
1825
- // 用 BOLLOON_LLM_PROVIDER env 显式覆盖, 否则还是按 env hasXxx 顺序自动选
1826
- const hasAnthropic = !!process.env.ANTHROPIC_API_KEY && !process.env.BOLLOON_LLM_PROVIDER;
1827
- const hasMinimax = !!process.env.MINIMAX_API_KEY;
1828
- const hasDeepSeek = !!process.env.DEEPSEEK_API_KEY;
1829
- const hasKimi = !!(process.env.KIMI_API_KEY || process.env.MOONSHOT_API_KEY);
1830
- const hasGlm = !!(process.env.GLM_API_KEY || process.env.ZHIPU_API_KEY);
1831
- const hasQwen = !!(process.env.QWEN_API_KEY || process.env.DASHSCOPE_API_KEY);
1832
- const hasOpenRouter = !!process.env.OPENROUTER_API_KEY;
1833
- const hasGemini = !!process.env.GEMINI_API_KEY;
1834
- const hasOllama = !!process.env.OLLAMA_BASE_URL;
1835
- const llmProvider = hasOpenAI ? 'OpenAI' :
1836
- hasAnthropic ? 'Anthropic' :
1837
- hasOpenRouter ? 'OpenRouter' :
1838
- hasGemini ? 'Gemini' :
1839
- hasOllama ? 'Ollama' :
1840
- hasMinimax ? 'MiniMax' :
1841
- hasDeepSeek ? 'DeepSeek' :
1842
- hasKimi ? 'Kimi' :
1843
- hasGlm ? 'GLM' :
1844
- hasQwen ? 'Qwen' : null;
1845
- if (llmProvider) {
1846
- s.step(0, 4, `LLM: ${llmProvider}`, 'ok');
1847
- initMinimax({ provider: llmProvider.toLowerCase() });
1848
- }
1849
- else {
1850
- s.step(0, 4, 'LLM: 未配置', 'warn');
1818
+ // CLI interactive mode: suppress all startup output, show minimal spinner
1819
+ const isCLIInteractive = mode === 'cli' && !isNonInteractive;
1820
+ loading = isCLIInteractive ? new LoadingTUI() : null;
1821
+ if (loading) {
1822
+ loading.start();
1823
+ console.log = () => { };
1824
+ console.info = () => { };
1825
+ process.stdout.write = () => true;
1826
+ }
1827
+ else if (isTuiMode) {
1828
+ console.log = (...args) => {
1829
+ const msg = args.join(' ');
1830
+ if (isSdkLog(msg))
1831
+ return;
1832
+ originalLog.apply(console, args);
1833
+ };
1834
+ console.info = (...args) => {
1835
+ const msg = args.join(' ');
1836
+ if (isSdkLog(msg))
1837
+ return;
1838
+ originalInfo.apply(console, args);
1839
+ };
1840
+ process.stdout.write = (chunk, ...args) => {
1841
+ const msg = String(chunk);
1842
+ if (isSdkLog(msg))
1843
+ return true;
1844
+ return originalStdoutWrite(chunk, ...args);
1845
+ };
1846
+ }
1851
1847
  if (isNonInteractive) {
1852
- s.warn('未设置任何 LLM API Key,功能受限');
1848
+ console.error = () => { };
1853
1849
  }
1854
- }
1855
- const { keypair, did, name } = await bootstrapIdentity();
1856
- agentIdentity = { did, name, publicKey: Buffer.from(keypair.publicKey).toString('hex') };
1857
- publishDID(name, keypair).then(({ cid, ipnsName }) => {
1858
- if (cid)
1859
- agentIdentity.cid = cid;
1860
- if (ipnsName)
1861
- agentIdentity.ipnsName = ipnsName;
1862
- }).catch(() => { });
1863
- const verifier = createVerificationManager();
1864
- let comm = null;
1865
- try {
1866
- if (mode === 'web') {
1867
- bootstrapP2P(verifier).then(c => {
1868
- comm = c;
1869
- const connections = c.getConnections();
1850
+ s.banner();
1851
+ s.section('系统初始化');
1852
+ const hasOpenAI = !!process.env.OPENAI_API_KEY;
1853
+ // 2026-06-15: 修复 之前 anthropic 401 是因为 shell env 残留的旧 ANTHROPIC_API_KEY 抢了 provider 选择
1854
+ // 用 BOLLOON_LLM_PROVIDER env 显式覆盖, 否则还是按 env hasXxx 顺序自动选
1855
+ const hasAnthropic = !!process.env.ANTHROPIC_API_KEY && !process.env.BOLLOON_LLM_PROVIDER;
1856
+ const hasMinimax = !!process.env.MINIMAX_API_KEY;
1857
+ const hasDeepSeek = !!process.env.DEEPSEEK_API_KEY;
1858
+ const hasKimi = !!(process.env.KIMI_API_KEY || process.env.MOONSHOT_API_KEY);
1859
+ const hasGlm = !!(process.env.GLM_API_KEY || process.env.ZHIPU_API_KEY);
1860
+ const hasQwen = !!(process.env.QWEN_API_KEY || process.env.DASHSCOPE_API_KEY);
1861
+ const hasOpenRouter = !!process.env.OPENROUTER_API_KEY;
1862
+ const hasGemini = !!process.env.GEMINI_API_KEY;
1863
+ const hasOllama = !!process.env.OLLAMA_BASE_URL;
1864
+ const llmProvider = hasOpenAI ? 'OpenAI' :
1865
+ hasAnthropic ? 'Anthropic' :
1866
+ hasOpenRouter ? 'OpenRouter' :
1867
+ hasGemini ? 'Gemini' :
1868
+ hasOllama ? 'Ollama' :
1869
+ hasMinimax ? 'MiniMax' :
1870
+ hasDeepSeek ? 'DeepSeek' :
1871
+ hasKimi ? 'Kimi' :
1872
+ hasGlm ? 'GLM' :
1873
+ hasQwen ? 'Qwen' : null;
1874
+ if (llmProvider) {
1875
+ s.step(0, 4, `LLM: ${llmProvider}`, 'ok');
1876
+ initMinimax({ provider: llmProvider.toLowerCase() });
1877
+ }
1878
+ else {
1879
+ s.step(0, 4, 'LLM: 未配置', 'warn');
1880
+ if (isNonInteractive) {
1881
+ s.warn('未设置任何 LLM API Key,功能受限');
1882
+ }
1883
+ }
1884
+ const { keypair, did, name } = await bootstrapIdentity();
1885
+ agentIdentity = { did, name, publicKey: Buffer.from(keypair.publicKey).toString('hex') };
1886
+ publishDID(name, keypair).then(({ cid, ipnsName }) => {
1887
+ if (cid)
1888
+ agentIdentity.cid = cid;
1889
+ if (ipnsName)
1890
+ agentIdentity.ipnsName = ipnsName;
1891
+ }).catch(() => { });
1892
+ const verifier = createVerificationManager();
1893
+ let comm = null;
1894
+ try {
1895
+ if (mode === 'web') {
1896
+ bootstrapP2P(verifier).then(c => {
1897
+ comm = c;
1898
+ const connections = c.getConnections();
1899
+ if (connections.length > 0) {
1900
+ agentIdentity.peerId = connections[0].publicKey;
1901
+ agentIdentity.p2pChannel = 'bolloon-agent-harness';
1902
+ }
1903
+ }).catch(err => {
1904
+ s.warn(`P2P Web 模式启动失败: ${err.message}`);
1905
+ });
1906
+ }
1907
+ else {
1908
+ comm = await bootstrapP2P(verifier);
1909
+ const connections = comm.getConnections();
1870
1910
  if (connections.length > 0) {
1871
1911
  agentIdentity.peerId = connections[0].publicKey;
1872
1912
  agentIdentity.p2pChannel = 'bolloon-agent-harness';
1873
1913
  }
1874
- }).catch(err => {
1875
- s.warn(`P2P Web 模式启动失败: ${err.message}`);
1876
- });
1877
- }
1878
- else {
1879
- comm = await bootstrapP2P(verifier);
1880
- const connections = comm.getConnections();
1881
- if (connections.length > 0) {
1882
- agentIdentity.peerId = connections[0].publicKey;
1883
- agentIdentity.p2pChannel = 'bolloon-agent-harness';
1884
1914
  }
1885
1915
  }
1886
- }
1887
- catch (err) {
1888
- s.warn(`P2P 初始化失败: ${err.message}`);
1889
- s.warn('将使用无 P2P 模式运行');
1890
- }
1891
- await bootstrapIroh(keypair, name);
1892
- // Bolloon Bootstrap: 启动扫描 + Context 收集 + 挂定时任务
1893
- // 失败静默 (主流程不被阻塞)
1894
- try {
1895
- const { bootstrapBolloon } = await import('./pi-ecosystem-judgment/human-value-pipeline.js');
1896
- s.info('正在 bootstrap bolloon 上下文...');
1897
- const bs = await bootstrapBolloon({ cwd: process.cwd() });
1898
- s.info(`Bootstrap 完成 (${bs.durationMs}ms, ${bs.errors.length} 个非致命错误)`);
1899
- }
1900
- catch (err) {
1901
- s.warn(`Bootstrap 失败 (非致命, 主流程继续): ${err.message}`);
1902
- }
1903
- s.divider();
1904
- if (mode === 'web') {
1905
- const port = parseInt(process.env.PORT || '54188');
1906
- // 2026-06-16: BOLLOON_DEV_MODE=1 或 selfImprove=true 启动项 → 开发者模式, 启用自迭代 (健康监控+自改总线)
1907
- // 默认用户模式: 不自迭代, 自改卡片不自动出现, 仍可 POST /api/self-improve/trigger 手动触发
1908
- const selfImprove = process.env.BOLLOON_DEV_MODE === '1' || process.env.BOLLOON_DEV_MODE === 'true';
1909
- if (selfImprove) {
1910
- console.log('[startup] BOLLOON_DEV_MODE=1, 开发者模式: 自迭代已启用');
1916
+ catch (err) {
1917
+ s.warn(`P2P 初始化失败: ${err.message}`);
1918
+ s.warn('将使用无 P2P 模式运行');
1911
1919
  }
1912
- const { createWebServer, openBrowser } = await import('./web/server.js');
1913
- s.info(`启动 Web 服务端口 ${port}...`);
1914
- const { port: actualPort } = await createWebServer(port, { selfImprove });
1915
- s.success(`浏览器已打开 → http://localhost:${actualPort}`);
1916
- openBrowser(`http://localhost:${actualPort}`);
1917
- }
1918
- else if (isNonInteractive) {
1919
- console.log = originalLog;
1920
- console.info = originalInfo;
1921
- process.stdout.write = originalStdoutWrite;
1922
- s.info('执行命令...');
1923
- console.log();
1924
- await runNonInteractive(args, comm);
1925
- comm?.stop();
1926
- // chat-watch / chat-p2p-listen 是长循环, 不会自然 return, 走 SIGINT 自然退出
1927
- if (!args.chatWatch && args.tool !== 'chat-p2p-listen') {
1928
- process.exit(0);
1920
+ await bootstrapIroh(keypair, name);
1921
+ // Bolloon Bootstrap: 启动扫描 + Context 收集 + 挂定时任务
1922
+ // 失败静默 (主流程不被阻塞)
1923
+ try {
1924
+ const { bootstrapBolloon } = await import('./pi-ecosystem-judgment/human-value-pipeline.js');
1925
+ s.info('正在 bootstrap bolloon 上下文...');
1926
+ const bs = await bootstrapBolloon({ cwd: process.cwd() });
1927
+ s.info(`Bootstrap 完成 (${bs.durationMs}ms, ${bs.errors.length} 个非致命错误)`);
1929
1928
  }
1930
- }
1931
- else {
1932
- s.section('对话模式');
1933
- console.log(`${GRAY}输入命令即可开始对话,示例:${RESET}\n`);
1934
- console.log(` ${CYAN}读取 想法.md${RESET} ${GRAY}- 读取文档${RESET}`);
1935
- console.log(` ${CYAN}总结 文档.md${RESET} ${GRAY}- 总结文档${RESET}`);
1936
- console.log(` ${CYAN}--agents${RESET} ${GRAY}- 查看 SubAgent${RESET}`);
1937
- console.log(` ${CYAN}--context${RESET} ${GRAY}- 查看全局上下文${RESET}`);
1938
- console.log(` ${CYAN}--delegate 任务 coding${RESET} ${GRAY}- 委派任务${RESET}`);
1939
- console.log(` ${CYAN}peers${RESET} ${GRAY}- 查看 P2P 节点${RESET}`);
1940
- console.log(` ${CYAN}iroh${RESET} ${GRAY}- 查看 iroh 状态${RESET}`);
1941
- console.log(` ${CYAN}退出${RESET} ${GRAY}- 结束对话${RESET}\n`);
1942
- if (!isTuiMode) {
1929
+ catch (err) {
1930
+ s.warn(`Bootstrap 失败 (非致命, 主流程继续): ${err.message}`);
1931
+ }
1932
+ s.divider();
1933
+ if (mode === 'web') {
1934
+ const port = parseInt(process.env.PORT || '54188');
1935
+ // 2026-06-16: BOLLOON_DEV_MODE=1 或 selfImprove=true 启动项 → 开发者模式, 启用自迭代 (健康监控+自改总线)
1936
+ // 默认用户模式: 不自迭代, 自改卡片不自动出现, 仍可 POST /api/self-improve/trigger 手动触发
1937
+ const selfImprove = process.env.BOLLOON_DEV_MODE === '1' || process.env.BOLLOON_DEV_MODE === 'true';
1938
+ if (selfImprove) {
1939
+ console.log('[startup] BOLLOON_DEV_MODE=1, 开发者模式: 自迭代已启用');
1940
+ }
1941
+ const { createWebServer, openBrowser } = await import('./web/server.js');
1942
+ s.info(`启动 Web 服务端口 ${port}...`);
1943
+ // 2026-06-24: CLI 默认 loopback bind (安全), LAN 访问需 BOLLOON_HOST=0.0.0.0
1944
+ const bindHost = process.env.BOLLOON_HOST;
1945
+ const { port: actualPort } = await createWebServer(port, { selfImprove, ...(bindHost ? { host: bindHost } : {}) });
1946
+ const displayHost = bindHost ?? '127.0.0.1';
1947
+ s.success(`浏览器已打开 → http://${displayHost}:${actualPort}`);
1948
+ openBrowser(`http://${displayHost}:${actualPort}`);
1949
+ }
1950
+ else if (isNonInteractive) {
1943
1951
  console.log = originalLog;
1944
1952
  console.info = originalInfo;
1945
1953
  process.stdout.write = originalStdoutWrite;
1954
+ s.info('执行命令...');
1955
+ console.log();
1956
+ await runNonInteractive(args, comm);
1957
+ comm?.stop();
1958
+ // chat-watch / chat-p2p-listen 是长循环, 不会自然 return, 走 SIGINT 自然退出
1959
+ if (!args.chatWatch && args.tool !== 'chat-p2p-listen') {
1960
+ process.exit(0);
1961
+ }
1962
+ }
1963
+ else {
1964
+ // Restore logging and stop loading spinner
1965
+ if (loading) {
1966
+ console.log = originalLog;
1967
+ console.info = originalInfo;
1968
+ process.stdout.write = originalStdoutWrite;
1969
+ loading.stop(true);
1970
+ }
1971
+ else {
1972
+ // For non-loading TUI CLI mode: apply SDK filtering if needed
1973
+ if (isTuiMode) {
1974
+ console.log = (...args) => {
1975
+ const msg = args.join(' ');
1976
+ if (isSdkLog(msg))
1977
+ return;
1978
+ originalLog.apply(console, args);
1979
+ };
1980
+ console.info = (...args) => {
1981
+ const msg = args.join(' ');
1982
+ if (isSdkLog(msg))
1983
+ return;
1984
+ originalInfo.apply(console, args);
1985
+ };
1986
+ process.stdout.write = (chunk, ...args) => {
1987
+ const msg = String(chunk);
1988
+ if (isSdkLog(msg))
1989
+ return true;
1990
+ return originalStdoutWrite(chunk, ...args);
1991
+ };
1992
+ }
1993
+ else {
1994
+ console.log = originalLog;
1995
+ console.info = originalInfo;
1996
+ process.stdout.write = originalStdoutWrite;
1997
+ }
1998
+ }
1999
+ startCLI(comm);
1946
2000
  }
1947
- startCLI(comm);
2001
+ }
2002
+ catch (e) {
2003
+ loading?.stop(false);
2004
+ throw e;
1948
2005
  }
1949
2006
  }
1950
2007
  main().catch(e => { console.error('Fatal:', e); process.exit(1); });