@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.
- package/README.md +495 -467
- package/bin/bolloon-cli.cjs +183 -183
- package/bin/bolloon-daemon.sh +207 -0
- package/bin/bolloon.cjs +0 -0
- package/bin/ipfs +0 -0
- package/dist/agents/agent-manifest-protocol.js +52 -0
- package/dist/agents/chat-segmenter.js +298 -0
- package/dist/agents/constraint-layer.js +19 -19
- package/dist/agents/judgment-protocol.js +479 -0
- package/dist/agents/parse-tool-call.js +304 -0
- package/dist/agents/peer-manifest-loader.js +210 -0
- package/dist/agents/pi-sdk-session-factory.js +110 -0
- package/dist/agents/pi-sdk-session-manager.js +297 -0
- package/dist/agents/pi-sdk-tools.js +1288 -0
- package/dist/agents/pi-sdk-types.js +13 -0
- package/dist/agents/pi-sdk.js +553 -1306
- package/dist/agents/react-loop.js +120 -0
- package/dist/agents/session-store.js +171 -0
- package/dist/agents/shell-guard.js +2 -2
- package/dist/agents/tool-registry.js +136 -0
- package/dist/agents/workflow-pivot-loop.js +200 -22
- package/dist/bollharness/src/scripts/context_router.js +7 -0
- package/dist/bollharness/src/scripts/deploy-guard.js +8 -8
- package/dist/bollharness-integration/context-router-judgment.js +4 -4
- package/dist/bollharness-integration/context-router.js +292 -292
- package/dist/bollharness-integration/gate-state-machine.js +26 -13
- package/dist/bollharness-integration/integration.js +71 -0
- package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
- package/dist/bollharness-integration/skill-adapter.js +57 -127
- package/dist/bootstrap/chat-archiver.js +276 -0
- package/dist/bootstrap/context-collector.js +6 -3
- package/dist/bootstrap/event-log.js +160 -0
- package/dist/bootstrap/lifecycle-hooks.js +15 -1
- package/dist/bootstrap/memory-compressor.js +170 -0
- package/dist/bootstrap/persona-loader.js +94 -0
- package/dist/bootstrap/project-state.js +159 -0
- package/dist/bootstrap/remote-mirror.js +97 -0
- package/dist/bootstrap/session-window.js +121 -0
- package/dist/bootstrap/vector-index.js +248 -0
- package/dist/cli/loading-tui.js +40 -0
- package/dist/cli-entry.js +41 -37
- package/dist/context-compaction/auto-compact.js +7 -7
- package/dist/electron/config.js +21 -0
- package/dist/electron/config.js.map +1 -0
- package/dist/electron/dialogs.js +108 -0
- package/dist/electron/dialogs.js.map +1 -0
- package/dist/electron/first-run.js +170 -0
- package/dist/electron/first-run.js.map +1 -0
- package/dist/electron/ipc.js +20 -0
- package/dist/electron/ipc.js.map +1 -0
- package/dist/electron/logger.js +114 -0
- package/dist/electron/logger.js.map +1 -0
- package/dist/electron/main.js +63 -0
- package/dist/electron/main.js.map +1 -0
- package/dist/electron/menu.js +145 -0
- package/dist/electron/menu.js.map +1 -0
- package/dist/electron/paths.js +75 -0
- package/dist/electron/paths.js.map +1 -0
- package/dist/electron/server.js +119 -0
- package/dist/electron/server.js.map +1 -0
- package/dist/electron/tray.js +111 -0
- package/dist/electron/tray.js.map +1 -0
- package/dist/electron/window.js +111 -0
- package/dist/electron/window.js.map +1 -0
- package/dist/electron-preload.js +26 -6
- package/dist/electron-preload.js.map +1 -1
- package/dist/electron.js +6 -168
- package/dist/electron.js.map +1 -1
- package/dist/index.js +323 -266
- package/dist/llm/config-store.js +24 -8
- package/dist/llm/llm-judgment-client.js +102 -102
- package/dist/llm/pi-ai.js +137 -85
- package/dist/llm/system-prompt/layers/channel/local.md +14 -14
- package/dist/llm/system-prompt/layers/channel/p2p-agent.md +18 -18
- package/dist/llm/system-prompt/layers/channel/p2p-visitor.md +19 -19
- package/dist/llm/system-prompt/layers/core/artifacts_storage.md +89 -89
- package/dist/llm/system-prompt/layers/core/evenhandedness.md +21 -21
- package/dist/llm/system-prompt/layers/core/hibs_reminders.md +15 -15
- package/dist/llm/system-prompt/layers/core/identity.md +37 -37
- package/dist/llm/system-prompt/layers/core/knowledge.md +17 -17
- package/dist/llm/system-prompt/layers/core/memory_system.md +12 -12
- package/dist/llm/system-prompt/layers/core/network_filesystem.md +28 -28
- package/dist/llm/system-prompt/layers/core/refusal.md +37 -37
- package/dist/llm/system-prompt/layers/core/tone.md +31 -31
- package/dist/llm/system-prompt/layers/core/tools.thin.md +13 -13
- package/dist/llm/system-prompt/layers/core/wellbeing.md +41 -41
- package/dist/llm/system-prompt/layers/role/architect.md +20 -20
- package/dist/llm/system-prompt/layers/role/expert.md +19 -19
- package/dist/llm/system-prompt/layers/role/implementer.md +15 -15
- package/dist/llm/system-prompt/layers/role/security.md +15 -15
- package/dist/llm/system-prompt/layers/tool/artifacts.md +72 -72
- package/dist/llm/system-prompt/layers/tool/bash.md +25 -25
- package/dist/llm/system-prompt/layers/tool/hibs_api.md +171 -171
- package/dist/llm/system-prompt/layers/tool/image_search.md +70 -70
- package/dist/llm/system-prompt/layers/tool/manifest.md +89 -89
- package/dist/llm/system-prompt/layers/tool/mcp_apps.md +53 -53
- package/dist/llm/system-prompt/layers/tool/web_search.md +83 -83
- package/dist/llm/tool-manifest/ask_user_input.js +1 -1
- package/dist/llm/tool-manifest/bash.js +3 -3
- package/dist/llm/tool-manifest/create_file.js +4 -4
- package/dist/llm/tool-manifest/fetch_sports_data.js +3 -3
- package/dist/llm/tool-manifest/image_search.js +2 -2
- package/dist/llm/tool-manifest/mcp.js +2 -2
- package/dist/llm/tool-manifest/message_compose.js +3 -3
- package/dist/llm/tool-manifest/places.js +2 -2
- package/dist/llm/tool-manifest/present_files.js +1 -1
- package/dist/llm/tool-manifest/recipe.js +2 -2
- package/dist/llm/tool-manifest/str_replace.js +5 -5
- package/dist/llm/tool-manifest/view.js +3 -3
- package/dist/llm/tool-manifest/weather.js +4 -4
- package/dist/llm/tool-manifest/web.js +4 -4
- package/dist/network/local-inbox-bus.js +73 -0
- package/dist/network/p2p-outbox.js +161 -0
- package/dist/network/peer-fs.js +420 -0
- package/dist/network/peer-resource-bridge.js +216 -0
- package/dist/pi-ecosystem-judgment/causal-judge.js +51 -51
- package/dist/pi-ecosystem-judgment/cleanup.js +126 -0
- package/dist/pi-ecosystem-judgment/distill-prompt.js +42 -42
- package/dist/pi-ecosystem-judgment/distillation.js +14 -14
- package/dist/pi-ecosystem-judgment/human-value-store.js +45 -11
- package/dist/pi-ecosystem-judgment/monitor-gate.js +28 -28
- package/dist/pi-ecosystem-judgment/value-injection.js +102 -102
- package/dist/security/context-router-tool.js +15 -15
- package/dist/security/tool-gate.js +11 -0
- package/dist/web/api-config.html +520 -520
- package/dist/web/client-loop-status.js +220 -0
- package/dist/web/client.js +22 -5
- package/dist/web/client.js.map +7 -0
- package/dist/web/components/wallet-viem.mjs +118 -118
- package/dist/web/index.html +375 -375
- package/dist/web/input-validator.js +103 -0
- package/dist/web/manifest.json +20 -20
- package/dist/web/routes-judgments.js +738 -0
- package/dist/web/routes-llm-config.js +279 -0
- package/dist/web/routes-tasks.js +222 -0
- package/dist/web/server-sse.js +121 -0
- package/dist/web/server-storage.js +154 -0
- package/dist/web/server-types.js +15 -0
- package/dist/web/server-v3-p2p.js +224 -0
- package/dist/web/server.js +1070 -1307
- package/dist/web/style.css +4742 -4742
- package/dist/web/util/safe-name.js +32 -0
- package/package.json +162 -160
- package/scripts/build-cli.js +215 -215
- package/scripts/build-web.ts +130 -130
- package/scripts/postinstall.js +152 -152
- package/bin/bolloon.js +0 -157
- package/dist/constraint-runtime/src/_archive_helper.js +0 -9
- package/dist/constraint-runtime/src/agent/coordinator.js +0 -48
- package/dist/constraint-runtime/src/agent/index.js +0 -1
- package/dist/constraint-runtime/src/assistant/index.js +0 -12
- package/dist/constraint-runtime/src/bootstrap/index.js +0 -12
- package/dist/constraint-runtime/src/bootstrap_graph.js +0 -13
- package/dist/constraint-runtime/src/bridge/index.js +0 -12
- package/dist/constraint-runtime/src/buddy/index.js +0 -12
- package/dist/constraint-runtime/src/cli/index.js +0 -12
- package/dist/constraint-runtime/src/command_graph.js +0 -10
- package/dist/constraint-runtime/src/commands.js +0 -60
- package/dist/constraint-runtime/src/components/index.js +0 -12
- package/dist/constraint-runtime/src/constants/index.js +0 -12
- package/dist/constraint-runtime/src/constraint/budget.js +0 -22
- package/dist/constraint-runtime/src/constraint/index.js +0 -2
- package/dist/constraint-runtime/src/constraint/permission.js +0 -20
- package/dist/constraint-runtime/src/context.js +0 -30
- package/dist/constraint-runtime/src/coordinator/index.js +0 -12
- package/dist/constraint-runtime/src/cost_hook.js +0 -4
- package/dist/constraint-runtime/src/cost_tracker.js +0 -8
- package/dist/constraint-runtime/src/deferred_init.js +0 -10
- package/dist/constraint-runtime/src/direct_modes.js +0 -6
- package/dist/constraint-runtime/src/dynamic-tool-loader.js +0 -85
- package/dist/constraint-runtime/src/entrypoints/index.js +0 -12
- package/dist/constraint-runtime/src/execution_registry.js +0 -44
- package/dist/constraint-runtime/src/history.js +0 -9
- package/dist/constraint-runtime/src/hooks/index.js +0 -12
- package/dist/constraint-runtime/src/index.js +0 -26
- package/dist/constraint-runtime/src/ink.js +0 -4
- package/dist/constraint-runtime/src/keybindings/index.js +0 -12
- package/dist/constraint-runtime/src/memdir/index.js +0 -12
- package/dist/constraint-runtime/src/migrations/index.js +0 -12
- package/dist/constraint-runtime/src/models.js +0 -1
- package/dist/constraint-runtime/src/moreright/index.js +0 -12
- package/dist/constraint-runtime/src/native_ts/index.js +0 -12
- package/dist/constraint-runtime/src/output_styles/index.js +0 -12
- package/dist/constraint-runtime/src/parity_audit.js +0 -12
- package/dist/constraint-runtime/src/plugins/index.js +0 -12
- package/dist/constraint-runtime/src/port_manifest.js +0 -11
- package/dist/constraint-runtime/src/prefetch.js +0 -9
- package/dist/constraint-runtime/src/query.js +0 -1
- package/dist/constraint-runtime/src/remote/index.js +0 -12
- package/dist/constraint-runtime/src/remote_runtime.js +0 -9
- package/dist/constraint-runtime/src/runtime/index.js +0 -1
- package/dist/constraint-runtime/src/runtime/session.js +0 -35
- package/dist/constraint-runtime/src/schemas/index.js +0 -12
- package/dist/constraint-runtime/src/screens/index.js +0 -12
- package/dist/constraint-runtime/src/server/index.js +0 -12
- package/dist/constraint-runtime/src/services/index.js +0 -12
- package/dist/constraint-runtime/src/session_store.js +0 -22
- package/dist/constraint-runtime/src/setup.js +0 -30
- package/dist/constraint-runtime/src/skills/index.js +0 -1
- package/dist/constraint-runtime/src/skills/skill-registry.js +0 -28
- package/dist/constraint-runtime/src/state/index.js +0 -12
- package/dist/constraint-runtime/src/system_init.js +0 -20
- package/dist/constraint-runtime/src/thinking/engine.js +0 -42
- package/dist/constraint-runtime/src/thinking/index.js +0 -1
- package/dist/constraint-runtime/src/tool_pool.js +0 -8
- package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +0 -7
- package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +0 -7
- package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +0 -7
- package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +0 -6
- package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +0 -8
- package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +0 -6
- package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +0 -6
- package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +0 -6
- package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +0 -6
- package/dist/constraint-runtime/src/tools.js +0 -80
- package/dist/constraint-runtime/src/transcript.js +0 -19
- package/dist/constraint-runtime/src/types/index.js +0 -12
- package/dist/constraint-runtime/src/upstream_proxy/index.js +0 -12
- package/dist/constraint-runtime/src/utils/index.js +0 -12
- package/dist/constraint-runtime/src/vim/index.js +0 -12
- package/dist/constraint-runtime/src/voice/index.js +0 -12
- package/dist/constraint-runtime/tests/agent.test.js +0 -16
- package/dist/constraint-runtime/tests/constraint.test.js +0 -41
- package/dist/constraint-runtime/tests/skill.test.js +0 -19
- package/dist/constraint-runtime/tests/thinking.test.js +0 -22
- package/dist/pi-ecosystem-colony/index.js +0 -365
- package/dist/social/ant-colony/AdaptiveHeartbeat.js +0 -101
- package/dist/social/ant-colony/PheromoneEngine.js +0 -227
- package/dist/social/ant-colony/index.js +0 -6
- package/dist/social/ant-colony/types.js +0 -24
- package/dist/test/ai-judgment-test.js +0 -80
- package/dist/test/bollharness-integration.test.js +0 -318
- package/dist/test/channel-agent-multi-dialogue.js +0 -205
- package/dist/test/channel-heartbeat-agent-test.js +0 -201
- package/dist/test/constraint-layer.test.js +0 -164
- package/dist/test/diap-identity-test.js +0 -172
- package/dist/test/diap-quick-test.js +0 -62
- package/dist/test/global-shared-context.test.js +0 -315
- package/dist/test/harness-judgment-injection.test.js +0 -246
- package/dist/test/harness-workflow-integrator-test.js +0 -228
- package/dist/test/human-value-store.test.js +0 -243
- package/dist/test/hybrid-integration-test.js +0 -118
- package/dist/test/hybrid-messenger-verify.js +0 -55
- package/dist/test/iroh-bistream-debug.js +0 -38
- package/dist/test/iroh-communication.test.js +0 -66
- package/dist/test/iroh-debug-test.js +0 -57
- package/dist/test/iroh-diap-test.js +0 -71
- package/dist/test/iroh-direct-connect.js +0 -55
- package/dist/test/iroh-e2e-fixed.js +0 -89
- package/dist/test/iroh-e2e-same-process.js +0 -63
- package/dist/test/iroh-e2e.js +0 -66
- package/dist/test/iroh-final-e2e.js +0 -72
- package/dist/test/iroh-relay-test.js +0 -37
- package/dist/test/iroh-simple-test.js +0 -41
- package/dist/test/iroh-transport-verify.js +0 -54
- package/dist/test/iroh-transport.test.js +0 -37
- package/dist/test/iroh-two-nodes.js +0 -70
- package/dist/test/iroh-verify.js +0 -44
- package/dist/test/judgment-decision.test.js +0 -219
- package/dist/test/llm-judgment-integration.test.js +0 -220
- package/dist/test/p2p-agent-complex-dialogue.js +0 -385
- package/dist/test/p2p-agent-dialogue.js +0 -341
- package/dist/test/p2p-agent-full-bidirectional.js +0 -510
- package/dist/test/p2p-agent-harness-flow.js +0 -437
- package/dist/test/p2p-agent-harness-single.js +0 -143
- package/dist/test/p2p-ai-dialogue-test.js +0 -318
- package/dist/test/p2p-cid-connect-test.js +0 -195
- package/dist/test/p2p-connect-receiver.js +0 -69
- package/dist/test/p2p-doc-transfer.js +0 -110
- package/dist/test/p2p-identity-page-test.js +0 -77
- package/dist/test/p2p-iroh-test.js +0 -171
- package/dist/test/p2p-minimal-test.js +0 -241
- package/dist/test/p2p-node-1.js +0 -148
- package/dist/test/p2p-node-2.js +0 -148
- package/dist/test/p2p-server.js +0 -281
- package/dist/test/p2p-two-nodes-test.js +0 -438
- package/dist/test/pi-sdk.test.js +0 -44
- package/dist/test/set-persona.js +0 -40
- package/dist/test/simple.test.js +0 -9
- package/dist/test/storage-integration.test.js +0 -150
- package/dist/test/subagent-manager.test.js +0 -276
- package/dist/test/test-gate-flow.test.js +0 -81
- package/dist/test/workflow-engine.test.js +0 -87
- 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
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
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
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
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
|
-
|
|
1848
|
+
console.error = () => { };
|
|
1853
1849
|
}
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
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
|
-
|
|
1888
|
-
|
|
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
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
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
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
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
|
-
|
|
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); });
|