@bolloon/bolloon-agent 0.2.9 → 0.2.11
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 +467 -467
- package/bin/bolloon-cli.cjs +183 -183
- package/bin/bolloon.cjs +0 -0
- package/bin/bolloon.js +157 -0
- package/dist/agents/agent-manifest-protocol.js +0 -52
- package/dist/agents/constraint-layer.js +19 -19
- package/dist/agents/pi-sdk.js +287 -1213
- package/dist/agents/shell-guard.js +2 -2
- package/dist/agents/workflow-pivot-loop.js +2 -81
- 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 +13 -26
- package/dist/bollharness-integration/integration.js +0 -71
- package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
- package/dist/bollharness-integration/skill-adapter.js +127 -52
- package/dist/bootstrap/context-collector.js +3 -6
- package/dist/bootstrap/lifecycle-hooks.js +1 -15
- package/dist/cli-entry.js +35 -39
- package/dist/constraint-runtime/src/_archive_helper.js +9 -0
- package/dist/constraint-runtime/src/agent/coordinator.js +48 -0
- package/dist/constraint-runtime/src/agent/index.js +1 -0
- package/dist/constraint-runtime/src/assistant/index.js +12 -0
- package/dist/constraint-runtime/src/bootstrap/index.js +12 -0
- package/dist/constraint-runtime/src/bootstrap_graph.js +13 -0
- package/dist/constraint-runtime/src/bridge/index.js +12 -0
- package/dist/constraint-runtime/src/buddy/index.js +12 -0
- package/dist/constraint-runtime/src/cli/index.js +12 -0
- package/dist/constraint-runtime/src/command_graph.js +10 -0
- package/dist/constraint-runtime/src/commands.js +60 -0
- package/dist/constraint-runtime/src/components/index.js +12 -0
- package/dist/constraint-runtime/src/constants/index.js +12 -0
- package/dist/constraint-runtime/src/constraint/budget.js +22 -0
- package/dist/constraint-runtime/src/constraint/index.js +2 -0
- package/dist/constraint-runtime/src/constraint/permission.js +20 -0
- package/dist/constraint-runtime/src/context.js +30 -0
- package/dist/constraint-runtime/src/coordinator/index.js +12 -0
- package/dist/constraint-runtime/src/cost_hook.js +4 -0
- package/dist/constraint-runtime/src/cost_tracker.js +8 -0
- package/dist/constraint-runtime/src/deferred_init.js +10 -0
- package/dist/constraint-runtime/src/direct_modes.js +6 -0
- package/dist/constraint-runtime/src/dynamic-tool-loader.js +85 -0
- package/dist/constraint-runtime/src/entrypoints/index.js +12 -0
- package/dist/constraint-runtime/src/execution_registry.js +44 -0
- package/dist/constraint-runtime/src/history.js +9 -0
- package/dist/constraint-runtime/src/hooks/index.js +12 -0
- package/dist/constraint-runtime/src/index.js +26 -0
- package/dist/constraint-runtime/src/ink.js +4 -0
- package/dist/constraint-runtime/src/keybindings/index.js +12 -0
- package/dist/constraint-runtime/src/memdir/index.js +12 -0
- package/dist/constraint-runtime/src/migrations/index.js +12 -0
- package/dist/constraint-runtime/src/models.js +1 -0
- package/dist/constraint-runtime/src/moreright/index.js +12 -0
- package/dist/constraint-runtime/src/native_ts/index.js +12 -0
- package/dist/constraint-runtime/src/output_styles/index.js +12 -0
- package/dist/constraint-runtime/src/parity_audit.js +12 -0
- package/dist/constraint-runtime/src/plugins/index.js +12 -0
- package/dist/constraint-runtime/src/port_manifest.js +11 -0
- package/dist/constraint-runtime/src/prefetch.js +9 -0
- package/dist/constraint-runtime/src/query.js +1 -0
- package/dist/constraint-runtime/src/remote/index.js +12 -0
- package/dist/constraint-runtime/src/remote_runtime.js +9 -0
- package/dist/constraint-runtime/src/runtime/index.js +1 -0
- package/dist/constraint-runtime/src/runtime/session.js +35 -0
- package/dist/constraint-runtime/src/schemas/index.js +12 -0
- package/dist/constraint-runtime/src/screens/index.js +12 -0
- package/dist/constraint-runtime/src/server/index.js +12 -0
- package/dist/constraint-runtime/src/services/index.js +12 -0
- package/dist/constraint-runtime/src/session_store.js +22 -0
- package/dist/constraint-runtime/src/setup.js +30 -0
- package/dist/constraint-runtime/src/skills/index.js +1 -0
- package/dist/constraint-runtime/src/skills/skill-registry.js +28 -0
- package/dist/constraint-runtime/src/state/index.js +12 -0
- package/dist/constraint-runtime/src/system_init.js +20 -0
- package/dist/constraint-runtime/src/thinking/engine.js +42 -0
- package/dist/constraint-runtime/src/thinking/index.js +1 -0
- package/dist/constraint-runtime/src/tool_pool.js +8 -0
- package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +7 -0
- package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +7 -0
- package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +7 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +6 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +8 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +6 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +6 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +6 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +6 -0
- package/dist/constraint-runtime/src/tools.js +80 -0
- package/dist/constraint-runtime/src/transcript.js +19 -0
- package/dist/constraint-runtime/src/types/index.js +12 -0
- package/dist/constraint-runtime/src/upstream_proxy/index.js +12 -0
- package/dist/constraint-runtime/src/utils/index.js +12 -0
- package/dist/constraint-runtime/src/vim/index.js +12 -0
- package/dist/constraint-runtime/src/voice/index.js +12 -0
- package/dist/constraint-runtime/tests/agent.test.js +16 -0
- package/dist/constraint-runtime/tests/constraint.test.js +41 -0
- package/dist/constraint-runtime/tests/skill.test.js +19 -0
- package/dist/constraint-runtime/tests/thinking.test.js +22 -0
- package/dist/context-compaction/auto-compact.js +7 -7
- package/dist/electron-preload.js +1 -18
- package/dist/electron-preload.js.map +1 -1
- package/dist/electron.js +168 -3
- package/dist/electron.js.map +1 -1
- package/dist/index.js +116 -136
- package/dist/llm/config-store.js +8 -24
- package/dist/llm/llm-judgment-client.js +102 -102
- package/dist/llm/pi-ai.js +85 -126
- 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/pi-ecosystem-colony/index.js +365 -0
- package/dist/pi-ecosystem-judgment/causal-judge.js +51 -51
- package/dist/pi-ecosystem-judgment/distill-prompt.js +42 -42
- package/dist/pi-ecosystem-judgment/distillation.js +14 -14
- 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 +0 -11
- package/dist/social/ant-colony/AdaptiveHeartbeat.js +101 -0
- package/dist/social/ant-colony/PheromoneEngine.js +227 -0
- package/dist/social/ant-colony/index.js +6 -0
- package/dist/social/ant-colony/types.js +24 -0
- package/dist/test/ai-judgment-test.js +80 -0
- package/dist/test/bollharness-integration.test.js +318 -0
- package/dist/test/channel-agent-multi-dialogue.js +205 -0
- package/dist/test/channel-heartbeat-agent-test.js +201 -0
- package/dist/test/constraint-layer.test.js +164 -0
- package/dist/test/diap-identity-test.js +172 -0
- package/dist/test/diap-quick-test.js +62 -0
- package/dist/test/global-shared-context.test.js +315 -0
- package/dist/test/harness-judgment-injection.test.js +246 -0
- package/dist/test/harness-workflow-integrator-test.js +228 -0
- package/dist/test/human-value-store.test.js +243 -0
- package/dist/test/hybrid-integration-test.js +118 -0
- package/dist/test/hybrid-messenger-verify.js +55 -0
- package/dist/test/iroh-bistream-debug.js +38 -0
- package/dist/test/iroh-communication.test.js +66 -0
- package/dist/test/iroh-debug-test.js +57 -0
- package/dist/test/iroh-diap-test.js +71 -0
- package/dist/test/iroh-direct-connect.js +55 -0
- package/dist/test/iroh-e2e-fixed.js +89 -0
- package/dist/test/iroh-e2e-same-process.js +63 -0
- package/dist/test/iroh-e2e.js +66 -0
- package/dist/test/iroh-final-e2e.js +72 -0
- package/dist/test/iroh-relay-test.js +37 -0
- package/dist/test/iroh-simple-test.js +41 -0
- package/dist/test/iroh-transport-verify.js +54 -0
- package/dist/test/iroh-transport.test.js +37 -0
- package/dist/test/iroh-two-nodes.js +70 -0
- package/dist/test/iroh-verify.js +44 -0
- package/dist/test/judgment-decision.test.js +219 -0
- package/dist/test/llm-judgment-integration.test.js +220 -0
- package/dist/test/p2p-agent-complex-dialogue.js +385 -0
- package/dist/test/p2p-agent-dialogue.js +341 -0
- package/dist/test/p2p-agent-full-bidirectional.js +510 -0
- package/dist/test/p2p-agent-harness-flow.js +437 -0
- package/dist/test/p2p-agent-harness-single.js +143 -0
- package/dist/test/p2p-ai-dialogue-test.js +318 -0
- package/dist/test/p2p-cid-connect-test.js +195 -0
- package/dist/test/p2p-connect-receiver.js +69 -0
- package/dist/test/p2p-doc-transfer.js +110 -0
- package/dist/test/p2p-identity-page-test.js +77 -0
- package/dist/test/p2p-iroh-test.js +171 -0
- package/dist/test/p2p-minimal-test.js +241 -0
- package/dist/test/p2p-node-1.js +148 -0
- package/dist/test/p2p-node-2.js +148 -0
- package/dist/test/p2p-server.js +281 -0
- package/dist/test/p2p-two-nodes-test.js +438 -0
- package/dist/test/pi-sdk.test.js +44 -0
- package/dist/test/set-persona.js +40 -0
- package/dist/test/simple.test.js +9 -0
- package/dist/test/storage-integration.test.js +150 -0
- package/dist/test/subagent-manager.test.js +276 -0
- package/dist/test/test-gate-flow.test.js +81 -0
- package/dist/test/workflow-engine.test.js +87 -0
- package/dist/test/workflow-pivot-loop.test.js +246 -0
- package/dist/web/api-config.html +520 -520
- package/dist/web/client.js +2917 -3791
- package/dist/web/components/p2p/index.js +234 -276
- package/dist/web/components/wallet-viem.mjs +118 -118
- package/dist/web/index.html +374 -373
- package/dist/web/manifest.json +20 -20
- package/dist/web/server.js +23 -775
- package/dist/web/style.css +4737 -4737
- package/dist/web/ui/message-renderer.js +373 -451
- package/dist/web/ui/step-timeline.js +255 -351
- package/package.json +160 -160
- package/scripts/build-cli.js +215 -215
- package/scripts/build-web.ts +125 -125
- package/scripts/postinstall.js +152 -152
- package/bin/bolloon-daemon.sh +0 -207
- package/bin/ipfs +0 -0
- package/dist/agents/chat-segmenter.js +0 -298
- package/dist/agents/judgment-protocol.js +0 -479
- package/dist/agents/parse-tool-call.js +0 -304
- package/dist/agents/peer-manifest-loader.js +0 -210
- package/dist/agents/react-loop.js +0 -120
- package/dist/agents/session-store.js +0 -171
- package/dist/agents/tool-registry.js +0 -136
- package/dist/bootstrap/chat-archiver.js +0 -276
- package/dist/bootstrap/memory-compressor.js +0 -170
- package/dist/bootstrap/persona-loader.js +0 -94
- package/dist/electron/config.js +0 -16
- package/dist/electron/config.js.map +0 -1
- package/dist/electron/dialogs.js +0 -71
- package/dist/electron/dialogs.js.map +0 -1
- package/dist/electron/first-run.js +0 -129
- package/dist/electron/first-run.js.map +0 -1
- package/dist/electron/ipc.js +0 -16
- package/dist/electron/ipc.js.map +0 -1
- package/dist/electron/logger.js +0 -77
- package/dist/electron/logger.js.map +0 -1
- package/dist/electron/main.js +0 -60
- package/dist/electron/main.js.map +0 -1
- package/dist/electron/menu.js +0 -140
- package/dist/electron/menu.js.map +0 -1
- package/dist/electron/paths.js +0 -33
- package/dist/electron/paths.js.map +0 -1
- package/dist/electron/server.js +0 -74
- package/dist/electron/server.js.map +0 -1
- package/dist/electron/tray.js +0 -73
- package/dist/electron/tray.js.map +0 -1
- package/dist/electron/window.js +0 -69
- package/dist/electron/window.js.map +0 -1
- package/dist/network/local-inbox-bus.js +0 -73
- package/dist/network/p2p-outbox.js +0 -161
- package/dist/network/peer-fs.js +0 -420
- package/dist/network/peer-resource-bridge.js +0 -216
- package/dist/web/components/p2p/P2PModal.js +0 -188
- package/dist/web/components/p2p/p2p-modal.js +0 -664
- package/dist/web/components/p2p/p2p-tools.js +0 -248
- package/dist/web/input-validator.js +0 -103
- package/dist/web/util/safe-name.js +0 -32
package/scripts/build-web.ts
CHANGED
|
@@ -1,125 +1,125 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Web 构建脚本
|
|
3
|
-
*/
|
|
4
|
-
import * as fs from 'fs/promises';
|
|
5
|
-
import * as path from 'path';
|
|
6
|
-
import { execSync } from 'child_process';
|
|
7
|
-
import * as esbuild from 'esbuild';
|
|
8
|
-
|
|
9
|
-
const ROOT = path.resolve(import.meta.dirname, '..');
|
|
10
|
-
const DIST_WEB = path.join(ROOT, 'dist', 'web');
|
|
11
|
-
|
|
12
|
-
async function main() {
|
|
13
|
-
console.log('[build-web] 开始构建...');
|
|
14
|
-
|
|
15
|
-
// 重要: 不能 rm -rf 整个 dist/web/, 否则会删掉 build:main 编译出来的
|
|
16
|
-
// dist/web/server.js. 只清理 web 静态资源, 保留 server.js.
|
|
17
|
-
for (const f of ['index.html', 'api-config.html', 'style.css', 'client.js', 'components']) {
|
|
18
|
-
await fs.rm(path.join(DIST_WEB, f), { recursive: true, force: true });
|
|
19
|
-
}
|
|
20
|
-
await fs.mkdir(DIST_WEB, { recursive: true });
|
|
21
|
-
await fs.mkdir(path.join(DIST_WEB, 'components', 'p2p'), { recursive: true });
|
|
22
|
-
|
|
23
|
-
// 编译 TypeScript 模块
|
|
24
|
-
console.log('[build-web] 编译 TypeScript 模块...');
|
|
25
|
-
const moduleFiles = [
|
|
26
|
-
'src/web/components/p2p/types.ts',
|
|
27
|
-
'src/web/components/p2p/p2p-store-memory.ts',
|
|
28
|
-
'src/web/components/p2p/p2p-identity.ts',
|
|
29
|
-
'src/web/components/p2p/p2p-connection.ts',
|
|
30
|
-
'src/web/components/p2p/p2p-messages.ts',
|
|
31
|
-
'src/web/components/p2p/p2p-manager.ts',
|
|
32
|
-
];
|
|
33
|
-
|
|
34
|
-
try {
|
|
35
|
-
execSync(`npx tsc --outDir dist/web/components/p2p --declaration false --skipLibCheck --target ES2022 --module ESNext --moduleResolution bundler ${moduleFiles.join(' ')}`, {
|
|
36
|
-
cwd: ROOT,
|
|
37
|
-
stdio: 'inherit'
|
|
38
|
-
});
|
|
39
|
-
} catch {
|
|
40
|
-
console.log('[build-web] TypeScript 编译有警告,继续...');
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// 编译 P2P Modal UI(esbuild)
|
|
44
|
-
console.log('[build-web] 编译 P2P Modal UI...');
|
|
45
|
-
await esbuild.build({
|
|
46
|
-
entryPoints: [path.join(ROOT, 'src/web/components/p2p/index.ts')],
|
|
47
|
-
outfile: path.join(DIST_WEB, 'components/p2p/index.js'),
|
|
48
|
-
format: 'esm',
|
|
49
|
-
target: 'es2022',
|
|
50
|
-
platform: 'browser',
|
|
51
|
-
minify: false,
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
// 2026-06-15: 编译 message-renderer.ts (对话显示 UI 模块)
|
|
55
|
-
// esbuild 编译 .ts → dist/web/ui/message-renderer.js (ESM, 浏览器侧 <script type="module"> 加载)
|
|
56
|
-
console.log('[build-web] 编译 message-renderer.ts...');
|
|
57
|
-
await fs.mkdir(path.join(DIST_WEB, 'ui'), { recursive: true });
|
|
58
|
-
await esbuild.build({
|
|
59
|
-
entryPoints: [path.join(ROOT, 'src/web/ui/message-renderer.ts')],
|
|
60
|
-
outfile: path.join(DIST_WEB, 'ui/message-renderer.js'),
|
|
61
|
-
format: 'esm',
|
|
62
|
-
target: 'es2022',
|
|
63
|
-
platform: 'browser',
|
|
64
|
-
minify: false,
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
// 2026-06-15: 编译 step-timeline.ts (气泡内 4 状态步骤条)
|
|
68
|
-
console.log('[build-web] 编译 step-timeline.ts...');
|
|
69
|
-
await esbuild.build({
|
|
70
|
-
entryPoints: [path.join(ROOT, 'src/web/ui/step-timeline.ts')],
|
|
71
|
-
outfile: path.join(DIST_WEB, 'ui/step-timeline.js'),
|
|
72
|
-
format: 'esm',
|
|
73
|
-
target: 'es2022',
|
|
74
|
-
platform: 'browser',
|
|
75
|
-
minify: false,
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
// 编译主客户端入口 (classic script, 非 module; 由 index.html 以 /client.js 加载)
|
|
79
|
-
console.log('[build-web] 编译 client.ts...');
|
|
80
|
-
await esbuild.build({
|
|
81
|
-
entryPoints: [path.join(ROOT, 'src/web/client.ts')],
|
|
82
|
-
outfile: path.join(DIST_WEB, 'client.js'),
|
|
83
|
-
format: 'iife',
|
|
84
|
-
target: 'es2022',
|
|
85
|
-
platform: 'browser',
|
|
86
|
-
minify: false,
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
// 复制静态文件
|
|
90
|
-
console.log('[build-web] 复制静态文件...');
|
|
91
|
-
await fs.copyFile(path.join(ROOT, 'src/web/index.html'), path.join(DIST_WEB, 'index.html'));
|
|
92
|
-
await fs.copyFile(path.join(ROOT, 'src/web/api-config.html'), path.join(DIST_WEB, 'api-config.html'));
|
|
93
|
-
await fs.copyFile(path.join(ROOT, 'src/web/style.css'), path.join(DIST_WEB, 'style.css'));
|
|
94
|
-
// 复制 PWA manifest (index.html 里有 <link rel="manifest">, 否则浏览器会 404)
|
|
95
|
-
await fs.copyFile(path.join(ROOT, 'src/web/manifest.json'), path.join(DIST_WEB, 'manifest.json'));
|
|
96
|
-
// 复制 icons 目录 (manifest.json 里引用了 favicon 等)
|
|
97
|
-
await fs.cp(path.join(ROOT, 'src/web/icons'), path.join(DIST_WEB, 'icons'), { recursive: true });
|
|
98
|
-
|
|
99
|
-
// 复制 system-prompt layer .md 文件到 dist/llm/system-prompt/layers/
|
|
100
|
-
// 原因: tsc 不复制 .md, src/llm/system-prompt/layers/{core,role,channel,tool}/*.md
|
|
101
|
-
// 在 dist 里完全不存在, registry.ts 用 __dirname + 'layers' 读它们时 100% ENOENT.
|
|
102
|
-
// 这里全量复制 25 个 .md, 不过滤 'never' 层 — registry.matchesContext 已做过滤.
|
|
103
|
-
const srcLayers = path.join(ROOT, 'src/llm/system-prompt/layers');
|
|
104
|
-
const dstLayers = path.join(ROOT, 'dist/llm/system-prompt/layers');
|
|
105
|
-
await fs.cp(srcLayers, dstLayers, { recursive: true });
|
|
106
|
-
console.log('[build-web] system-prompt layers copied →', path.relative(ROOT, dstLayers));
|
|
107
|
-
|
|
108
|
-
// 复制 components/ 下的独立 ESM 模块 (非 p2p 那些, 已被 esbuild 单独编译)
|
|
109
|
-
// 例如 wallet-viem.mjs: 浏览器侧 viem 封装, 被 index.html 引用
|
|
110
|
-
const extraComponentsDir = path.join(ROOT, 'src/web/components');
|
|
111
|
-
for (const entry of await fs.readdir(extraComponentsDir)) {
|
|
112
|
-
if (entry === 'p2p') continue;
|
|
113
|
-
const src = path.join(extraComponentsDir, entry);
|
|
114
|
-
const dest = path.join(DIST_WEB, 'components', entry);
|
|
115
|
-
const stat = await fs.stat(src);
|
|
116
|
-
if (stat.isFile()) {
|
|
117
|
-
await fs.mkdir(path.dirname(dest), { recursive: true });
|
|
118
|
-
await fs.copyFile(src, dest);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
console.log('[build-web] 完成!');
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
main().catch(console.error);
|
|
1
|
+
/**
|
|
2
|
+
* Web 构建脚本
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'fs/promises';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import { execSync } from 'child_process';
|
|
7
|
+
import * as esbuild from 'esbuild';
|
|
8
|
+
|
|
9
|
+
const ROOT = path.resolve(import.meta.dirname, '..');
|
|
10
|
+
const DIST_WEB = path.join(ROOT, 'dist', 'web');
|
|
11
|
+
|
|
12
|
+
async function main() {
|
|
13
|
+
console.log('[build-web] 开始构建...');
|
|
14
|
+
|
|
15
|
+
// 重要: 不能 rm -rf 整个 dist/web/, 否则会删掉 build:main 编译出来的
|
|
16
|
+
// dist/web/server.js. 只清理 web 静态资源, 保留 server.js.
|
|
17
|
+
for (const f of ['index.html', 'api-config.html', 'style.css', 'client.js', 'components']) {
|
|
18
|
+
await fs.rm(path.join(DIST_WEB, f), { recursive: true, force: true });
|
|
19
|
+
}
|
|
20
|
+
await fs.mkdir(DIST_WEB, { recursive: true });
|
|
21
|
+
await fs.mkdir(path.join(DIST_WEB, 'components', 'p2p'), { recursive: true });
|
|
22
|
+
|
|
23
|
+
// 编译 TypeScript 模块
|
|
24
|
+
console.log('[build-web] 编译 TypeScript 模块...');
|
|
25
|
+
const moduleFiles = [
|
|
26
|
+
'src/web/components/p2p/types.ts',
|
|
27
|
+
'src/web/components/p2p/p2p-store-memory.ts',
|
|
28
|
+
'src/web/components/p2p/p2p-identity.ts',
|
|
29
|
+
'src/web/components/p2p/p2p-connection.ts',
|
|
30
|
+
'src/web/components/p2p/p2p-messages.ts',
|
|
31
|
+
'src/web/components/p2p/p2p-manager.ts',
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
execSync(`npx tsc --outDir dist/web/components/p2p --declaration false --skipLibCheck --target ES2022 --module ESNext --moduleResolution bundler ${moduleFiles.join(' ')}`, {
|
|
36
|
+
cwd: ROOT,
|
|
37
|
+
stdio: 'inherit'
|
|
38
|
+
});
|
|
39
|
+
} catch {
|
|
40
|
+
console.log('[build-web] TypeScript 编译有警告,继续...');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 编译 P2P Modal UI(esbuild)
|
|
44
|
+
console.log('[build-web] 编译 P2P Modal UI...');
|
|
45
|
+
await esbuild.build({
|
|
46
|
+
entryPoints: [path.join(ROOT, 'src/web/components/p2p/index.ts')],
|
|
47
|
+
outfile: path.join(DIST_WEB, 'components/p2p/index.js'),
|
|
48
|
+
format: 'esm',
|
|
49
|
+
target: 'es2022',
|
|
50
|
+
platform: 'browser',
|
|
51
|
+
minify: false,
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// 2026-06-15: 编译 message-renderer.ts (对话显示 UI 模块)
|
|
55
|
+
// esbuild 编译 .ts → dist/web/ui/message-renderer.js (ESM, 浏览器侧 <script type="module"> 加载)
|
|
56
|
+
console.log('[build-web] 编译 message-renderer.ts...');
|
|
57
|
+
await fs.mkdir(path.join(DIST_WEB, 'ui'), { recursive: true });
|
|
58
|
+
await esbuild.build({
|
|
59
|
+
entryPoints: [path.join(ROOT, 'src/web/ui/message-renderer.ts')],
|
|
60
|
+
outfile: path.join(DIST_WEB, 'ui/message-renderer.js'),
|
|
61
|
+
format: 'esm',
|
|
62
|
+
target: 'es2022',
|
|
63
|
+
platform: 'browser',
|
|
64
|
+
minify: false,
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// 2026-06-15: 编译 step-timeline.ts (气泡内 4 状态步骤条)
|
|
68
|
+
console.log('[build-web] 编译 step-timeline.ts...');
|
|
69
|
+
await esbuild.build({
|
|
70
|
+
entryPoints: [path.join(ROOT, 'src/web/ui/step-timeline.ts')],
|
|
71
|
+
outfile: path.join(DIST_WEB, 'ui/step-timeline.js'),
|
|
72
|
+
format: 'esm',
|
|
73
|
+
target: 'es2022',
|
|
74
|
+
platform: 'browser',
|
|
75
|
+
minify: false,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// 编译主客户端入口 (classic script, 非 module; 由 index.html 以 /client.js 加载)
|
|
79
|
+
console.log('[build-web] 编译 client.ts...');
|
|
80
|
+
await esbuild.build({
|
|
81
|
+
entryPoints: [path.join(ROOT, 'src/web/client.ts')],
|
|
82
|
+
outfile: path.join(DIST_WEB, 'client.js'),
|
|
83
|
+
format: 'iife',
|
|
84
|
+
target: 'es2022',
|
|
85
|
+
platform: 'browser',
|
|
86
|
+
minify: false,
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// 复制静态文件
|
|
90
|
+
console.log('[build-web] 复制静态文件...');
|
|
91
|
+
await fs.copyFile(path.join(ROOT, 'src/web/index.html'), path.join(DIST_WEB, 'index.html'));
|
|
92
|
+
await fs.copyFile(path.join(ROOT, 'src/web/api-config.html'), path.join(DIST_WEB, 'api-config.html'));
|
|
93
|
+
await fs.copyFile(path.join(ROOT, 'src/web/style.css'), path.join(DIST_WEB, 'style.css'));
|
|
94
|
+
// 复制 PWA manifest (index.html 里有 <link rel="manifest">, 否则浏览器会 404)
|
|
95
|
+
await fs.copyFile(path.join(ROOT, 'src/web/manifest.json'), path.join(DIST_WEB, 'manifest.json'));
|
|
96
|
+
// 复制 icons 目录 (manifest.json 里引用了 favicon 等)
|
|
97
|
+
await fs.cp(path.join(ROOT, 'src/web/icons'), path.join(DIST_WEB, 'icons'), { recursive: true });
|
|
98
|
+
|
|
99
|
+
// 复制 system-prompt layer .md 文件到 dist/llm/system-prompt/layers/
|
|
100
|
+
// 原因: tsc 不复制 .md, src/llm/system-prompt/layers/{core,role,channel,tool}/*.md
|
|
101
|
+
// 在 dist 里完全不存在, registry.ts 用 __dirname + 'layers' 读它们时 100% ENOENT.
|
|
102
|
+
// 这里全量复制 25 个 .md, 不过滤 'never' 层 — registry.matchesContext 已做过滤.
|
|
103
|
+
const srcLayers = path.join(ROOT, 'src/llm/system-prompt/layers');
|
|
104
|
+
const dstLayers = path.join(ROOT, 'dist/llm/system-prompt/layers');
|
|
105
|
+
await fs.cp(srcLayers, dstLayers, { recursive: true });
|
|
106
|
+
console.log('[build-web] system-prompt layers copied →', path.relative(ROOT, dstLayers));
|
|
107
|
+
|
|
108
|
+
// 复制 components/ 下的独立 ESM 模块 (非 p2p 那些, 已被 esbuild 单独编译)
|
|
109
|
+
// 例如 wallet-viem.mjs: 浏览器侧 viem 封装, 被 index.html 引用
|
|
110
|
+
const extraComponentsDir = path.join(ROOT, 'src/web/components');
|
|
111
|
+
for (const entry of await fs.readdir(extraComponentsDir)) {
|
|
112
|
+
if (entry === 'p2p') continue;
|
|
113
|
+
const src = path.join(extraComponentsDir, entry);
|
|
114
|
+
const dest = path.join(DIST_WEB, 'components', entry);
|
|
115
|
+
const stat = await fs.stat(src);
|
|
116
|
+
if (stat.isFile()) {
|
|
117
|
+
await fs.mkdir(path.dirname(dest), { recursive: true });
|
|
118
|
+
await fs.copyFile(src, dest);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
console.log('[build-web] 完成!');
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
main().catch(console.error);
|
package/scripts/postinstall.js
CHANGED
|
@@ -1,153 +1,153 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Postinstall 脚本
|
|
3
|
-
* npm 安装后自动执行
|
|
4
|
-
*
|
|
5
|
-
* 主要任务:
|
|
6
|
-
* 1. 确保 bin 目录存在且可执行
|
|
7
|
-
* 2. 初始化本地配置
|
|
8
|
-
* 3. 检查依赖完整性
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import * as fs from 'fs';
|
|
12
|
-
import * as path from 'path';
|
|
13
|
-
import { fileURLToPath } from 'url';
|
|
14
|
-
|
|
15
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
16
|
-
const __dirname = path.dirname(__filename);
|
|
17
|
-
const rootDir = path.join(__dirname, '..');
|
|
18
|
-
|
|
19
|
-
const RESET = '\x1b[0m';
|
|
20
|
-
const GREEN = '\x1b[32m';
|
|
21
|
-
const YELLOW = '\x1b[33m';
|
|
22
|
-
const CYAN = '\x1b[36m';
|
|
23
|
-
|
|
24
|
-
function log(msg, color = RESET) {
|
|
25
|
-
console.log(color + msg + RESET);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function initUserDirs() {
|
|
29
|
-
// 创建用户数据目录
|
|
30
|
-
const home = process.env.HOME || process.env.USERPROFILE || '/tmp';
|
|
31
|
-
const bolloonDir = path.join(home, '.bolloon');
|
|
32
|
-
|
|
33
|
-
const dirs = [
|
|
34
|
-
bolloonDir,
|
|
35
|
-
path.join(bolloonDir, 'sessions'),
|
|
36
|
-
path.join(bolloonDir, 'peer-store'),
|
|
37
|
-
];
|
|
38
|
-
|
|
39
|
-
for (const dir of dirs) {
|
|
40
|
-
if (!fs.existsSync(dir)) {
|
|
41
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
42
|
-
log(` ✓ 创建目录: ${dir}`, GREEN);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// 初始化配置文件
|
|
47
|
-
const configPath = path.join(bolloonDir, 'config.json');
|
|
48
|
-
if (!fs.existsSync(configPath)) {
|
|
49
|
-
const defaultConfig = {
|
|
50
|
-
version: '0.1.12',
|
|
51
|
-
initializedAt: new Date().toISOString(),
|
|
52
|
-
defaults: {
|
|
53
|
-
port: 54188,
|
|
54
|
-
theme: 'dark',
|
|
55
|
-
autoConnect: true,
|
|
56
|
-
},
|
|
57
|
-
providers: {
|
|
58
|
-
minimax: { enabled: false },
|
|
59
|
-
openai: { enabled: false },
|
|
60
|
-
anthropic: { enabled: false },
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
fs.writeFileSync(configPath, JSON.stringify(defaultConfig, null, 2));
|
|
64
|
-
log(` ✓ 创建配置: ${configPath}`, GREEN);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return bolloonDir;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function checkNativeDeps() {
|
|
71
|
-
// 检查必要的原生依赖
|
|
72
|
-
const nativeDeps = [
|
|
73
|
-
'libp2p',
|
|
74
|
-
'@diap/sdk',
|
|
75
|
-
];
|
|
76
|
-
|
|
77
|
-
let allOk = true;
|
|
78
|
-
|
|
79
|
-
for (const dep of nativeDeps) {
|
|
80
|
-
const depPath = path.join(rootDir, 'node_modules', dep);
|
|
81
|
-
if (!fs.existsSync(depPath)) {
|
|
82
|
-
log(` ⚠ 缺少依赖: ${dep}`, YELLOW);
|
|
83
|
-
allOk = false;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
return allOk;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
function setupPlatform() {
|
|
91
|
-
const platform = process.platform;
|
|
92
|
-
|
|
93
|
-
log(`\n 平台: ${platform}`, CYAN);
|
|
94
|
-
|
|
95
|
-
if (platform === 'win32') {
|
|
96
|
-
// Windows: 确保 .cmd 文件存在
|
|
97
|
-
const binDir = path.join(rootDir, 'bin');
|
|
98
|
-
const cmdPath = path.join(binDir, 'bolloon.cmd');
|
|
99
|
-
|
|
100
|
-
if (fs.existsSync(binDir) && !fs.existsSync(cmdPath)) {
|
|
101
|
-
const cmdContent = `@echo off
|
|
102
|
-
node "%~dp0..\\dist\\cli.js" %*
|
|
103
|
-
`;
|
|
104
|
-
fs.writeFileSync(cmdPath, cmdContent);
|
|
105
|
-
log(' ✓ Windows 入口已创建', GREEN);
|
|
106
|
-
}
|
|
107
|
-
} else {
|
|
108
|
-
// Unix/Linux/Mac: 确保 bin 文件可执行
|
|
109
|
-
const binDir = path.join(rootDir, 'bin');
|
|
110
|
-
const binPath = path.join(binDir, 'bolloon.js');
|
|
111
|
-
|
|
112
|
-
if (fs.existsSync(binPath)) {
|
|
113
|
-
try {
|
|
114
|
-
fs.chmodSync(binPath, 0o755);
|
|
115
|
-
log(' ✓ bin/bolloon.js 已设为可执行', GREEN);
|
|
116
|
-
} catch (err) {
|
|
117
|
-
log(` ⚠ 无法设置执行权限: ${err.message}`, YELLOW);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
function main() {
|
|
124
|
-
console.log('\n📦 Bolloon 安装后处理...\n');
|
|
125
|
-
|
|
126
|
-
try {
|
|
127
|
-
// 1. 初始化用户目录
|
|
128
|
-
const bolloonDir = initUserDirs();
|
|
129
|
-
log(` ✓ 用户数据目录: ${bolloonDir}`, GREEN);
|
|
130
|
-
|
|
131
|
-
// 2. 检查依赖
|
|
132
|
-
const depsOk = checkNativeDeps();
|
|
133
|
-
if (!depsOk) {
|
|
134
|
-
log('\n ⚠ 部分依赖缺失,建议运行: npm install', YELLOW);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// 3. 平台特定设置
|
|
138
|
-
setupPlatform();
|
|
139
|
-
|
|
140
|
-
console.log('\n✅ 安装完成!\n');
|
|
141
|
-
console.log(' 使用方式:');
|
|
142
|
-
console.log(' bolloon # 启动 GUI');
|
|
143
|
-
console.log(' bolloon --web # 启动 Web UI');
|
|
144
|
-
console.log(' bolloon --cli # 命令行模式');
|
|
145
|
-
console.log(' bolloon --help # 显示帮助\n');
|
|
146
|
-
console.log(` 配置文件: ${path.join(bolloonDir, 'config.json')}\n`);
|
|
147
|
-
} catch (err) {
|
|
148
|
-
console.error('\n❌ 安装后处理失败:', err.message);
|
|
149
|
-
console.error(' 这通常不影响基本功能,继续安装...\n');
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Postinstall 脚本
|
|
3
|
+
* npm 安装后自动执行
|
|
4
|
+
*
|
|
5
|
+
* 主要任务:
|
|
6
|
+
* 1. 确保 bin 目录存在且可执行
|
|
7
|
+
* 2. 初始化本地配置
|
|
8
|
+
* 3. 检查依赖完整性
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import * as fs from 'fs';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
import { fileURLToPath } from 'url';
|
|
14
|
+
|
|
15
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
16
|
+
const __dirname = path.dirname(__filename);
|
|
17
|
+
const rootDir = path.join(__dirname, '..');
|
|
18
|
+
|
|
19
|
+
const RESET = '\x1b[0m';
|
|
20
|
+
const GREEN = '\x1b[32m';
|
|
21
|
+
const YELLOW = '\x1b[33m';
|
|
22
|
+
const CYAN = '\x1b[36m';
|
|
23
|
+
|
|
24
|
+
function log(msg, color = RESET) {
|
|
25
|
+
console.log(color + msg + RESET);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function initUserDirs() {
|
|
29
|
+
// 创建用户数据目录
|
|
30
|
+
const home = process.env.HOME || process.env.USERPROFILE || '/tmp';
|
|
31
|
+
const bolloonDir = path.join(home, '.bolloon');
|
|
32
|
+
|
|
33
|
+
const dirs = [
|
|
34
|
+
bolloonDir,
|
|
35
|
+
path.join(bolloonDir, 'sessions'),
|
|
36
|
+
path.join(bolloonDir, 'peer-store'),
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
for (const dir of dirs) {
|
|
40
|
+
if (!fs.existsSync(dir)) {
|
|
41
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
42
|
+
log(` ✓ 创建目录: ${dir}`, GREEN);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// 初始化配置文件
|
|
47
|
+
const configPath = path.join(bolloonDir, 'config.json');
|
|
48
|
+
if (!fs.existsSync(configPath)) {
|
|
49
|
+
const defaultConfig = {
|
|
50
|
+
version: '0.1.12',
|
|
51
|
+
initializedAt: new Date().toISOString(),
|
|
52
|
+
defaults: {
|
|
53
|
+
port: 54188,
|
|
54
|
+
theme: 'dark',
|
|
55
|
+
autoConnect: true,
|
|
56
|
+
},
|
|
57
|
+
providers: {
|
|
58
|
+
minimax: { enabled: false },
|
|
59
|
+
openai: { enabled: false },
|
|
60
|
+
anthropic: { enabled: false },
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
fs.writeFileSync(configPath, JSON.stringify(defaultConfig, null, 2));
|
|
64
|
+
log(` ✓ 创建配置: ${configPath}`, GREEN);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return bolloonDir;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function checkNativeDeps() {
|
|
71
|
+
// 检查必要的原生依赖
|
|
72
|
+
const nativeDeps = [
|
|
73
|
+
'libp2p',
|
|
74
|
+
'@diap/sdk',
|
|
75
|
+
];
|
|
76
|
+
|
|
77
|
+
let allOk = true;
|
|
78
|
+
|
|
79
|
+
for (const dep of nativeDeps) {
|
|
80
|
+
const depPath = path.join(rootDir, 'node_modules', dep);
|
|
81
|
+
if (!fs.existsSync(depPath)) {
|
|
82
|
+
log(` ⚠ 缺少依赖: ${dep}`, YELLOW);
|
|
83
|
+
allOk = false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return allOk;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function setupPlatform() {
|
|
91
|
+
const platform = process.platform;
|
|
92
|
+
|
|
93
|
+
log(`\n 平台: ${platform}`, CYAN);
|
|
94
|
+
|
|
95
|
+
if (platform === 'win32') {
|
|
96
|
+
// Windows: 确保 .cmd 文件存在
|
|
97
|
+
const binDir = path.join(rootDir, 'bin');
|
|
98
|
+
const cmdPath = path.join(binDir, 'bolloon.cmd');
|
|
99
|
+
|
|
100
|
+
if (fs.existsSync(binDir) && !fs.existsSync(cmdPath)) {
|
|
101
|
+
const cmdContent = `@echo off
|
|
102
|
+
node "%~dp0..\\dist\\cli.js" %*
|
|
103
|
+
`;
|
|
104
|
+
fs.writeFileSync(cmdPath, cmdContent);
|
|
105
|
+
log(' ✓ Windows 入口已创建', GREEN);
|
|
106
|
+
}
|
|
107
|
+
} else {
|
|
108
|
+
// Unix/Linux/Mac: 确保 bin 文件可执行
|
|
109
|
+
const binDir = path.join(rootDir, 'bin');
|
|
110
|
+
const binPath = path.join(binDir, 'bolloon.js');
|
|
111
|
+
|
|
112
|
+
if (fs.existsSync(binPath)) {
|
|
113
|
+
try {
|
|
114
|
+
fs.chmodSync(binPath, 0o755);
|
|
115
|
+
log(' ✓ bin/bolloon.js 已设为可执行', GREEN);
|
|
116
|
+
} catch (err) {
|
|
117
|
+
log(` ⚠ 无法设置执行权限: ${err.message}`, YELLOW);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function main() {
|
|
124
|
+
console.log('\n📦 Bolloon 安装后处理...\n');
|
|
125
|
+
|
|
126
|
+
try {
|
|
127
|
+
// 1. 初始化用户目录
|
|
128
|
+
const bolloonDir = initUserDirs();
|
|
129
|
+
log(` ✓ 用户数据目录: ${bolloonDir}`, GREEN);
|
|
130
|
+
|
|
131
|
+
// 2. 检查依赖
|
|
132
|
+
const depsOk = checkNativeDeps();
|
|
133
|
+
if (!depsOk) {
|
|
134
|
+
log('\n ⚠ 部分依赖缺失,建议运行: npm install', YELLOW);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// 3. 平台特定设置
|
|
138
|
+
setupPlatform();
|
|
139
|
+
|
|
140
|
+
console.log('\n✅ 安装完成!\n');
|
|
141
|
+
console.log(' 使用方式:');
|
|
142
|
+
console.log(' bolloon # 启动 GUI');
|
|
143
|
+
console.log(' bolloon --web # 启动 Web UI');
|
|
144
|
+
console.log(' bolloon --cli # 命令行模式');
|
|
145
|
+
console.log(' bolloon --help # 显示帮助\n');
|
|
146
|
+
console.log(` 配置文件: ${path.join(bolloonDir, 'config.json')}\n`);
|
|
147
|
+
} catch (err) {
|
|
148
|
+
console.error('\n❌ 安装后处理失败:', err.message);
|
|
149
|
+
console.error(' 这通常不影响基本功能,继续安装...\n');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
153
|
main();
|