@bolloon/bolloon-agent 0.2.8 → 0.2.10

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 (268) hide show
  1. package/README.md +467 -467
  2. package/bin/bolloon-cli.cjs +183 -183
  3. package/bin/bolloon.cjs +0 -0
  4. package/bin/bolloon.js +157 -0
  5. package/dist/agents/agent-manifest-protocol.js +0 -52
  6. package/dist/agents/constraint-layer.js +19 -19
  7. package/dist/agents/pi-sdk.js +287 -1213
  8. package/dist/agents/shell-guard.js +2 -2
  9. package/dist/agents/workflow-pivot-loop.js +2 -81
  10. package/dist/bollharness/src/scripts/deploy-guard.js +8 -8
  11. package/dist/bollharness-integration/context-router-judgment.js +4 -4
  12. package/dist/bollharness-integration/context-router.js +292 -292
  13. package/dist/bollharness-integration/gate-state-machine.js +13 -26
  14. package/dist/bollharness-integration/integration.js +0 -71
  15. package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
  16. package/dist/bollharness-integration/skill-adapter.js +127 -52
  17. package/dist/bootstrap/context-collector.js +3 -6
  18. package/dist/bootstrap/lifecycle-hooks.js +1 -15
  19. package/dist/cli-entry.js +35 -39
  20. package/dist/constraint-runtime/src/_archive_helper.js +9 -0
  21. package/dist/constraint-runtime/src/agent/coordinator.js +48 -0
  22. package/dist/constraint-runtime/src/agent/index.js +1 -0
  23. package/dist/constraint-runtime/src/assistant/index.js +12 -0
  24. package/dist/constraint-runtime/src/bootstrap/index.js +12 -0
  25. package/dist/constraint-runtime/src/bootstrap_graph.js +13 -0
  26. package/dist/constraint-runtime/src/bridge/index.js +12 -0
  27. package/dist/constraint-runtime/src/buddy/index.js +12 -0
  28. package/dist/constraint-runtime/src/cli/index.js +12 -0
  29. package/dist/constraint-runtime/src/command_graph.js +10 -0
  30. package/dist/constraint-runtime/src/commands.js +60 -0
  31. package/dist/constraint-runtime/src/components/index.js +12 -0
  32. package/dist/constraint-runtime/src/constants/index.js +12 -0
  33. package/dist/constraint-runtime/src/constraint/budget.js +22 -0
  34. package/dist/constraint-runtime/src/constraint/index.js +2 -0
  35. package/dist/constraint-runtime/src/constraint/permission.js +20 -0
  36. package/dist/constraint-runtime/src/context.js +30 -0
  37. package/dist/constraint-runtime/src/coordinator/index.js +12 -0
  38. package/dist/constraint-runtime/src/cost_hook.js +4 -0
  39. package/dist/constraint-runtime/src/cost_tracker.js +8 -0
  40. package/dist/constraint-runtime/src/deferred_init.js +10 -0
  41. package/dist/constraint-runtime/src/direct_modes.js +6 -0
  42. package/dist/constraint-runtime/src/dynamic-tool-loader.js +85 -0
  43. package/dist/constraint-runtime/src/entrypoints/index.js +12 -0
  44. package/dist/constraint-runtime/src/execution_registry.js +44 -0
  45. package/dist/constraint-runtime/src/history.js +9 -0
  46. package/dist/constraint-runtime/src/hooks/index.js +12 -0
  47. package/dist/constraint-runtime/src/index.js +26 -0
  48. package/dist/constraint-runtime/src/ink.js +4 -0
  49. package/dist/constraint-runtime/src/keybindings/index.js +12 -0
  50. package/dist/constraint-runtime/src/memdir/index.js +12 -0
  51. package/dist/constraint-runtime/src/migrations/index.js +12 -0
  52. package/dist/constraint-runtime/src/models.js +1 -0
  53. package/dist/constraint-runtime/src/moreright/index.js +12 -0
  54. package/dist/constraint-runtime/src/native_ts/index.js +12 -0
  55. package/dist/constraint-runtime/src/output_styles/index.js +12 -0
  56. package/dist/constraint-runtime/src/parity_audit.js +12 -0
  57. package/dist/constraint-runtime/src/plugins/index.js +12 -0
  58. package/dist/constraint-runtime/src/port_manifest.js +11 -0
  59. package/dist/constraint-runtime/src/prefetch.js +9 -0
  60. package/dist/constraint-runtime/src/query.js +1 -0
  61. package/dist/constraint-runtime/src/remote/index.js +12 -0
  62. package/dist/constraint-runtime/src/remote_runtime.js +9 -0
  63. package/dist/constraint-runtime/src/runtime/index.js +1 -0
  64. package/dist/constraint-runtime/src/runtime/session.js +35 -0
  65. package/dist/constraint-runtime/src/schemas/index.js +12 -0
  66. package/dist/constraint-runtime/src/screens/index.js +12 -0
  67. package/dist/constraint-runtime/src/server/index.js +12 -0
  68. package/dist/constraint-runtime/src/services/index.js +12 -0
  69. package/dist/constraint-runtime/src/session_store.js +22 -0
  70. package/dist/constraint-runtime/src/setup.js +30 -0
  71. package/dist/constraint-runtime/src/skills/index.js +1 -0
  72. package/dist/constraint-runtime/src/skills/skill-registry.js +28 -0
  73. package/dist/constraint-runtime/src/state/index.js +12 -0
  74. package/dist/constraint-runtime/src/system_init.js +20 -0
  75. package/dist/constraint-runtime/src/thinking/engine.js +42 -0
  76. package/dist/constraint-runtime/src/thinking/index.js +1 -0
  77. package/dist/constraint-runtime/src/tool_pool.js +8 -0
  78. package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +7 -0
  79. package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +7 -0
  80. package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +7 -0
  81. package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +6 -0
  82. package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +8 -0
  83. package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +6 -0
  84. package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +6 -0
  85. package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +6 -0
  86. package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +6 -0
  87. package/dist/constraint-runtime/src/tools.js +80 -0
  88. package/dist/constraint-runtime/src/transcript.js +19 -0
  89. package/dist/constraint-runtime/src/types/index.js +12 -0
  90. package/dist/constraint-runtime/src/upstream_proxy/index.js +12 -0
  91. package/dist/constraint-runtime/src/utils/index.js +12 -0
  92. package/dist/constraint-runtime/src/vim/index.js +12 -0
  93. package/dist/constraint-runtime/src/voice/index.js +12 -0
  94. package/dist/constraint-runtime/tests/agent.test.js +16 -0
  95. package/dist/constraint-runtime/tests/constraint.test.js +41 -0
  96. package/dist/constraint-runtime/tests/skill.test.js +19 -0
  97. package/dist/constraint-runtime/tests/thinking.test.js +22 -0
  98. package/dist/context-compaction/auto-compact.js +7 -7
  99. package/dist/electron-preload.js +1 -18
  100. package/dist/electron-preload.js.map +1 -1
  101. package/dist/electron.js +168 -3
  102. package/dist/electron.js.map +1 -1
  103. package/dist/index.js +116 -136
  104. package/dist/llm/config-store.js +8 -24
  105. package/dist/llm/llm-judgment-client.js +102 -102
  106. package/dist/llm/pi-ai.js +85 -126
  107. package/dist/llm/system-prompt/layers/channel/local.md +14 -14
  108. package/dist/llm/system-prompt/layers/channel/p2p-agent.md +18 -18
  109. package/dist/llm/system-prompt/layers/channel/p2p-visitor.md +19 -19
  110. package/dist/llm/system-prompt/layers/core/artifacts_storage.md +89 -89
  111. package/dist/llm/system-prompt/layers/core/evenhandedness.md +21 -21
  112. package/dist/llm/system-prompt/layers/core/hibs_reminders.md +15 -15
  113. package/dist/llm/system-prompt/layers/core/identity.md +37 -37
  114. package/dist/llm/system-prompt/layers/core/knowledge.md +17 -17
  115. package/dist/llm/system-prompt/layers/core/memory_system.md +12 -12
  116. package/dist/llm/system-prompt/layers/core/network_filesystem.md +28 -28
  117. package/dist/llm/system-prompt/layers/core/refusal.md +37 -37
  118. package/dist/llm/system-prompt/layers/core/tone.md +31 -31
  119. package/dist/llm/system-prompt/layers/core/tools.thin.md +13 -13
  120. package/dist/llm/system-prompt/layers/core/wellbeing.md +41 -41
  121. package/dist/llm/system-prompt/layers/role/architect.md +20 -20
  122. package/dist/llm/system-prompt/layers/role/expert.md +19 -19
  123. package/dist/llm/system-prompt/layers/role/implementer.md +15 -15
  124. package/dist/llm/system-prompt/layers/role/security.md +15 -15
  125. package/dist/llm/system-prompt/layers/tool/artifacts.md +72 -72
  126. package/dist/llm/system-prompt/layers/tool/bash.md +25 -25
  127. package/dist/llm/system-prompt/layers/tool/hibs_api.md +171 -171
  128. package/dist/llm/system-prompt/layers/tool/image_search.md +70 -70
  129. package/dist/llm/system-prompt/layers/tool/manifest.md +89 -89
  130. package/dist/llm/system-prompt/layers/tool/mcp_apps.md +53 -53
  131. package/dist/llm/system-prompt/layers/tool/web_search.md +83 -83
  132. package/dist/llm/tool-manifest/ask_user_input.js +1 -1
  133. package/dist/llm/tool-manifest/bash.js +3 -3
  134. package/dist/llm/tool-manifest/create_file.js +4 -4
  135. package/dist/llm/tool-manifest/fetch_sports_data.js +3 -3
  136. package/dist/llm/tool-manifest/image_search.js +2 -2
  137. package/dist/llm/tool-manifest/mcp.js +2 -2
  138. package/dist/llm/tool-manifest/message_compose.js +3 -3
  139. package/dist/llm/tool-manifest/places.js +2 -2
  140. package/dist/llm/tool-manifest/present_files.js +1 -1
  141. package/dist/llm/tool-manifest/recipe.js +2 -2
  142. package/dist/llm/tool-manifest/str_replace.js +5 -5
  143. package/dist/llm/tool-manifest/view.js +3 -3
  144. package/dist/llm/tool-manifest/weather.js +4 -4
  145. package/dist/llm/tool-manifest/web.js +4 -4
  146. package/dist/pi-ecosystem-colony/index.js +365 -0
  147. package/dist/pi-ecosystem-judgment/causal-judge.js +51 -51
  148. package/dist/pi-ecosystem-judgment/distill-prompt.js +42 -42
  149. package/dist/pi-ecosystem-judgment/distillation.js +14 -14
  150. package/dist/pi-ecosystem-judgment/monitor-gate.js +28 -28
  151. package/dist/pi-ecosystem-judgment/value-injection.js +102 -102
  152. package/dist/security/context-router-tool.js +15 -15
  153. package/dist/security/tool-gate.js +0 -11
  154. package/dist/social/ant-colony/AdaptiveHeartbeat.js +101 -0
  155. package/dist/social/ant-colony/PheromoneEngine.js +227 -0
  156. package/dist/social/ant-colony/index.js +6 -0
  157. package/dist/social/ant-colony/types.js +24 -0
  158. package/dist/test/ai-judgment-test.js +80 -0
  159. package/dist/test/bollharness-integration.test.js +318 -0
  160. package/dist/test/channel-agent-multi-dialogue.js +205 -0
  161. package/dist/test/channel-heartbeat-agent-test.js +201 -0
  162. package/dist/test/constraint-layer.test.js +164 -0
  163. package/dist/test/diap-identity-test.js +172 -0
  164. package/dist/test/diap-quick-test.js +62 -0
  165. package/dist/test/global-shared-context.test.js +315 -0
  166. package/dist/test/harness-judgment-injection.test.js +246 -0
  167. package/dist/test/harness-workflow-integrator-test.js +228 -0
  168. package/dist/test/human-value-store.test.js +243 -0
  169. package/dist/test/hybrid-integration-test.js +118 -0
  170. package/dist/test/hybrid-messenger-verify.js +55 -0
  171. package/dist/test/iroh-bistream-debug.js +38 -0
  172. package/dist/test/iroh-communication.test.js +66 -0
  173. package/dist/test/iroh-debug-test.js +57 -0
  174. package/dist/test/iroh-diap-test.js +71 -0
  175. package/dist/test/iroh-direct-connect.js +55 -0
  176. package/dist/test/iroh-e2e-fixed.js +89 -0
  177. package/dist/test/iroh-e2e-same-process.js +63 -0
  178. package/dist/test/iroh-e2e.js +66 -0
  179. package/dist/test/iroh-final-e2e.js +72 -0
  180. package/dist/test/iroh-relay-test.js +37 -0
  181. package/dist/test/iroh-simple-test.js +41 -0
  182. package/dist/test/iroh-transport-verify.js +54 -0
  183. package/dist/test/iroh-transport.test.js +37 -0
  184. package/dist/test/iroh-two-nodes.js +70 -0
  185. package/dist/test/iroh-verify.js +44 -0
  186. package/dist/test/judgment-decision.test.js +219 -0
  187. package/dist/test/llm-judgment-integration.test.js +220 -0
  188. package/dist/test/p2p-agent-complex-dialogue.js +385 -0
  189. package/dist/test/p2p-agent-dialogue.js +341 -0
  190. package/dist/test/p2p-agent-full-bidirectional.js +510 -0
  191. package/dist/test/p2p-agent-harness-flow.js +437 -0
  192. package/dist/test/p2p-agent-harness-single.js +143 -0
  193. package/dist/test/p2p-ai-dialogue-test.js +318 -0
  194. package/dist/test/p2p-cid-connect-test.js +195 -0
  195. package/dist/test/p2p-connect-receiver.js +69 -0
  196. package/dist/test/p2p-doc-transfer.js +110 -0
  197. package/dist/test/p2p-identity-page-test.js +77 -0
  198. package/dist/test/p2p-iroh-test.js +171 -0
  199. package/dist/test/p2p-minimal-test.js +241 -0
  200. package/dist/test/p2p-node-1.js +148 -0
  201. package/dist/test/p2p-node-2.js +148 -0
  202. package/dist/test/p2p-server.js +281 -0
  203. package/dist/test/p2p-two-nodes-test.js +438 -0
  204. package/dist/test/pi-sdk.test.js +44 -0
  205. package/dist/test/set-persona.js +40 -0
  206. package/dist/test/simple.test.js +9 -0
  207. package/dist/test/storage-integration.test.js +150 -0
  208. package/dist/test/subagent-manager.test.js +276 -0
  209. package/dist/test/test-gate-flow.test.js +81 -0
  210. package/dist/test/workflow-engine.test.js +87 -0
  211. package/dist/test/workflow-pivot-loop.test.js +246 -0
  212. package/dist/web/api-config.html +520 -520
  213. package/dist/web/client.js +2917 -3791
  214. package/dist/web/components/p2p/index.js +234 -276
  215. package/dist/web/components/wallet-viem.mjs +118 -118
  216. package/dist/web/index.html +374 -373
  217. package/dist/web/manifest.json +20 -20
  218. package/dist/web/server.js +23 -775
  219. package/dist/web/style.css +4737 -4737
  220. package/dist/web/ui/message-renderer.js +373 -451
  221. package/dist/web/ui/step-timeline.js +255 -351
  222. package/package.json +160 -157
  223. package/scripts/build-cli.js +216 -0
  224. package/scripts/build-web.ts +125 -0
  225. package/scripts/postinstall.js +153 -0
  226. package/bin/bolloon-daemon.sh +0 -207
  227. package/bin/ipfs +0 -0
  228. package/dist/agents/chat-segmenter.js +0 -298
  229. package/dist/agents/judgment-protocol.js +0 -479
  230. package/dist/agents/parse-tool-call.js +0 -304
  231. package/dist/agents/peer-manifest-loader.js +0 -210
  232. package/dist/agents/react-loop.js +0 -120
  233. package/dist/agents/session-store.js +0 -171
  234. package/dist/agents/tool-registry.js +0 -136
  235. package/dist/bootstrap/chat-archiver.js +0 -276
  236. package/dist/bootstrap/memory-compressor.js +0 -170
  237. package/dist/bootstrap/persona-loader.js +0 -94
  238. package/dist/electron/config.js +0 -16
  239. package/dist/electron/config.js.map +0 -1
  240. package/dist/electron/dialogs.js +0 -71
  241. package/dist/electron/dialogs.js.map +0 -1
  242. package/dist/electron/first-run.js +0 -129
  243. package/dist/electron/first-run.js.map +0 -1
  244. package/dist/electron/ipc.js +0 -16
  245. package/dist/electron/ipc.js.map +0 -1
  246. package/dist/electron/logger.js +0 -77
  247. package/dist/electron/logger.js.map +0 -1
  248. package/dist/electron/main.js +0 -60
  249. package/dist/electron/main.js.map +0 -1
  250. package/dist/electron/menu.js +0 -140
  251. package/dist/electron/menu.js.map +0 -1
  252. package/dist/electron/paths.js +0 -33
  253. package/dist/electron/paths.js.map +0 -1
  254. package/dist/electron/server.js +0 -74
  255. package/dist/electron/server.js.map +0 -1
  256. package/dist/electron/tray.js +0 -73
  257. package/dist/electron/tray.js.map +0 -1
  258. package/dist/electron/window.js +0 -69
  259. package/dist/electron/window.js.map +0 -1
  260. package/dist/network/local-inbox-bus.js +0 -73
  261. package/dist/network/p2p-outbox.js +0 -161
  262. package/dist/network/peer-fs.js +0 -420
  263. package/dist/network/peer-resource-bridge.js +0 -216
  264. package/dist/web/components/p2p/P2PModal.js +0 -188
  265. package/dist/web/components/p2p/p2p-modal.js +0 -664
  266. package/dist/web/components/p2p/p2p-tools.js +0 -248
  267. package/dist/web/input-validator.js +0 -103
  268. package/dist/web/util/safe-name.js +0 -32
package/package.json CHANGED
@@ -1,157 +1,160 @@
1
- {
2
- "name": "@bolloon/bolloon-agent",
3
- "version": "0.2.8",
4
- "type": "module",
5
- "description": "P2P AI Document Agent - 全局安装后执行 `bolloon` 启动产品",
6
- "main": "dist/cli-entry.js",
7
- "author": "Bolloon Leo",
8
- "repository": {
9
- "type": "git",
10
- "url": "https://github.com/logos-42/bolloon.git"
11
- },
12
- "license": "MIT",
13
- "files": [
14
- "dist",
15
- "bin"
16
- ],
17
- "bin": {
18
- "bolloon": "./bin/bolloon-cli.cjs"
19
- },
20
- "scripts": {
21
- "build": "npm run build --workspaces --if-present",
22
- "build:main": "tsc",
23
- "build:cli": "node scripts/build-cli.js",
24
- "build:web": "npx tsx scripts/build-web.ts",
25
- "build:electron": "tsc -p tsconfig.electron.json",
26
- "build:all": "npm run build:main && npm run build:web && npm run build:electron && npm run build:cli",
27
- "start": "node dist/index.js",
28
- "dev": "tsx -r dotenv/config src/index.ts",
29
- "dev:web": "npm run build:web && tsx -r dotenv/config src/index.ts --web",
30
- "dev:electron": "npm run build:electron && npm run electron:start",
31
- "electron:start": "NODE_ENV=development electron dist/electron.js",
32
- "electron:dev": "concurrently \"npm run dev:web\" \"npm run electron:start\"",
33
- "electron:build": "npm run build:electron && electron-builder",
34
- "electron:pack": "electron-builder --dir",
35
- "app:bundle": "node scripts/build-app-bundle.cjs",
36
- "app:bundle:open": "node scripts/build-app-bundle.cjs && open \"release/mac-arm64/Bolloon Agent.app\"",
37
- "test": "vitest run",
38
- "test:watch": "vitest",
39
- "test:pi-sdk": "tsx src/test/pi-sdk.test.ts",
40
- "postinstall": "node scripts/postinstall.js"
41
- },
42
- "workspaces": [
43
- "src/constraint-runtime"
44
- ],
45
- "dependencies": {
46
- "@bolloon/bolloon-agent": "^0.1.36",
47
- "@bolloon/constraint-runtime": "0.1.0",
48
- "@capacitor/core": "^8.4.1",
49
- "@capacitor/ios": "^8.4.1",
50
- "@chainsafe/libp2p-noise": "^17.0.0",
51
- "@chainsafe/libp2p-yamux": "^8.0.1",
52
- "@diap/sdk": "^0.1.10",
53
- "@libp2p/autonat": "^3.0.20",
54
- "@libp2p/circuit-relay-v2": "^4.2.5",
55
- "@libp2p/dcutr": "^3.0.20",
56
- "@libp2p/identify": "^4.1.6",
57
- "@libp2p/kad-dht": "^16.2.6",
58
- "@libp2p/tcp": "^11.0.20",
59
- "@libp2p/upnp-nat": "^4.0.20",
60
- "@multiformats/multiaddr": "^13.0.3",
61
- "@noble/hashes": "^1.3.0",
62
- "@rayhanadev/iroh": "^0.1.1",
63
- "b4a": "^1.8.1",
64
- "dotenv": "^17.4.2",
65
- "esbuild": "^0.24.0",
66
- "express": "^5.2.1",
67
- "libp2p": "^3.3.0",
68
- "mammoth": "^1.6.0",
69
- "pdf-parse": "^1.1.4",
70
- "platform": "^1.3.6",
71
- "react": "^18.3.0",
72
- "react-dom": "^18.3.0",
73
- "viem": "^2.52.0"
74
- },
75
- "devDependencies": {
76
- "@capacitor/cli": "^8.4.1",
77
- "@playwright/test": "^1.60.0",
78
- "@types/express": "^5.0.6",
79
- "@types/node": "^25.9.1",
80
- "@types/pdf-parse": "^1.1.5",
81
- "@types/react": "^18.3.0",
82
- "@types/react-dom": "^18.3.0",
83
- "concurrently": "^9.2.1",
84
- "electron": "^42.3.0",
85
- "electron-builder": "^26.15.5",
86
- "lefthook": "^2.1.9",
87
- "playwright": "^1.60.0",
88
- "tsx": "^4.0.0",
89
- "typescript": "^5.0.0",
90
- "vitest": "^4.1.6"
91
- },
92
- "build": {
93
- "appId": "com.bolloon.agent",
94
- "productName": "Bolloon Agent",
95
- "directories": {
96
- "output": "release",
97
- "buildResources": "build"
98
- },
99
- "files": [
100
- "dist/**/*",
101
- "bin/**/*",
102
- "package.json"
103
- ],
104
- "npmRebuild": false,
105
- "buildDependenciesFromSource": false,
106
- "extraResources": [
107
- {
108
- "from": "build",
109
- "to": "build",
110
- "filter": [
111
- "**/*"
112
- ]
113
- }
114
- ],
115
- "extraMetadata": {
116
- "main": "dist/electron.js",
117
- "type": "commonjs"
118
- },
119
- "win": {
120
- "target": [
121
- {
122
- "target": "nsis",
123
- "arch": [
124
- "x64"
125
- ]
126
- }
127
- ],
128
- "icon": "build/icon.ico"
129
- },
130
- "mac": {
131
- "target": [
132
- "dmg"
133
- ],
134
- "icon": "build/icon.icns"
135
- },
136
- "linux": {
137
- "target": [
138
- "AppImage"
139
- ],
140
- "icon": "build/icon.png"
141
- },
142
- "nsis": {
143
- "oneClick": false,
144
- "perMachine": false,
145
- "allowToChangeInstallationDirectory": true,
146
- "createDesktopShortcut": true,
147
- "createStartMenuShortcut": true
148
- },
149
- "asar": true,
150
- "asarUnpack": [
151
- "node_modules/@diap/**/*",
152
- "node_modules/@rayhanadev/**/*",
153
- "node_modules/libp2p/**/*",
154
- "node_modules/@libp2p/**/*"
155
- ]
156
- }
157
- }
1
+ {
2
+ "name": "@bolloon/bolloon-agent",
3
+ "version": "0.2.10",
4
+ "type": "module",
5
+ "description": "P2P AI Document Agent - 全局安装后执行 `bolloon` 启动产品",
6
+ "main": "dist/cli-entry.js",
7
+ "author": "Bolloon Leo",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/logos-42/bolloon.git"
11
+ },
12
+ "license": "MIT",
13
+ "files": [
14
+ "dist",
15
+ "bin",
16
+ "scripts/postinstall.js",
17
+ "scripts/build-cli.js",
18
+ "scripts/build-web.ts"
19
+ ],
20
+ "bin": {
21
+ "bolloon": "./bin/bolloon-cli.cjs"
22
+ },
23
+ "scripts": {
24
+ "build": "npm run build --workspaces --if-present",
25
+ "build:main": "tsc",
26
+ "build:cli": "node scripts/build-cli.js",
27
+ "build:web": "npx tsx scripts/build-web.ts",
28
+ "build:electron": "tsc -p tsconfig.electron.json",
29
+ "build:all": "npm run build:main && npm run build:web && npm run build:electron && npm run build:cli",
30
+ "start": "node dist/index.js",
31
+ "dev": "tsx -r dotenv/config src/index.ts",
32
+ "dev:web": "npm run build:web && tsx -r dotenv/config src/index.ts --web",
33
+ "dev:electron": "npm run build:electron && npm run electron:start",
34
+ "electron:start": "NODE_ENV=development electron dist/electron.js",
35
+ "electron:dev": "concurrently \"npm run dev:web\" \"npm run electron:start\"",
36
+ "electron:build": "npm run build:electron && electron-builder",
37
+ "electron:pack": "electron-builder --dir",
38
+ "app:bundle": "node scripts/build-app-bundle.cjs",
39
+ "app:bundle:open": "node scripts/build-app-bundle.cjs && open \"release/mac-arm64/Bolloon Agent.app\"",
40
+ "test": "vitest run",
41
+ "test:watch": "vitest",
42
+ "test:pi-sdk": "tsx src/test/pi-sdk.test.ts",
43
+ "postinstall": "node scripts/postinstall.js"
44
+ },
45
+ "workspaces": [
46
+ "src/constraint-runtime"
47
+ ],
48
+ "dependencies": {
49
+ "@bolloon/bolloon-agent": "^0.1.36",
50
+ "@bolloon/constraint-runtime": "0.1.0",
51
+ "@capacitor/core": "^8.4.1",
52
+ "@capacitor/ios": "^8.4.1",
53
+ "@chainsafe/libp2p-noise": "^17.0.0",
54
+ "@chainsafe/libp2p-yamux": "^8.0.1",
55
+ "@diap/sdk": "^0.1.10",
56
+ "@libp2p/autonat": "^3.0.20",
57
+ "@libp2p/circuit-relay-v2": "^4.2.5",
58
+ "@libp2p/dcutr": "^3.0.20",
59
+ "@libp2p/identify": "^4.1.6",
60
+ "@libp2p/kad-dht": "^16.2.6",
61
+ "@libp2p/tcp": "^11.0.20",
62
+ "@libp2p/upnp-nat": "^4.0.20",
63
+ "@multiformats/multiaddr": "^13.0.3",
64
+ "@noble/hashes": "^1.3.0",
65
+ "@rayhanadev/iroh": "^0.1.1",
66
+ "b4a": "^1.8.1",
67
+ "dotenv": "^17.4.2",
68
+ "esbuild": "^0.24.0",
69
+ "express": "^5.2.1",
70
+ "libp2p": "^3.3.0",
71
+ "mammoth": "^1.6.0",
72
+ "pdf-parse": "^1.1.4",
73
+ "platform": "^1.3.6",
74
+ "react": "^18.3.0",
75
+ "react-dom": "^18.3.0",
76
+ "viem": "^2.52.0"
77
+ },
78
+ "devDependencies": {
79
+ "@capacitor/cli": "^8.4.1",
80
+ "@playwright/test": "^1.60.0",
81
+ "@types/express": "^5.0.6",
82
+ "@types/node": "^25.9.1",
83
+ "@types/pdf-parse": "^1.1.5",
84
+ "@types/react": "^18.3.0",
85
+ "@types/react-dom": "^18.3.0",
86
+ "concurrently": "^9.2.1",
87
+ "electron": "^42.3.0",
88
+ "electron-builder": "^26.15.5",
89
+ "lefthook": "^2.1.9",
90
+ "playwright": "^1.60.0",
91
+ "tsx": "^4.0.0",
92
+ "typescript": "^5.0.0",
93
+ "vitest": "^4.1.6"
94
+ },
95
+ "build": {
96
+ "appId": "com.bolloon.agent",
97
+ "productName": "Bolloon Agent",
98
+ "directories": {
99
+ "output": "release",
100
+ "buildResources": "build"
101
+ },
102
+ "files": [
103
+ "dist/**/*",
104
+ "bin/**/*",
105
+ "package.json"
106
+ ],
107
+ "npmRebuild": false,
108
+ "buildDependenciesFromSource": false,
109
+ "extraResources": [
110
+ {
111
+ "from": "build",
112
+ "to": "build",
113
+ "filter": [
114
+ "**/*"
115
+ ]
116
+ }
117
+ ],
118
+ "extraMetadata": {
119
+ "main": "dist/electron.js",
120
+ "type": "commonjs"
121
+ },
122
+ "win": {
123
+ "target": [
124
+ {
125
+ "target": "nsis",
126
+ "arch": [
127
+ "x64"
128
+ ]
129
+ }
130
+ ],
131
+ "icon": "build/icon.ico"
132
+ },
133
+ "mac": {
134
+ "target": [
135
+ "dmg"
136
+ ],
137
+ "icon": "build/icon.icns"
138
+ },
139
+ "linux": {
140
+ "target": [
141
+ "AppImage"
142
+ ],
143
+ "icon": "build/icon.png"
144
+ },
145
+ "nsis": {
146
+ "oneClick": false,
147
+ "perMachine": false,
148
+ "allowToChangeInstallationDirectory": true,
149
+ "createDesktopShortcut": true,
150
+ "createStartMenuShortcut": true
151
+ },
152
+ "asar": true,
153
+ "asarUnpack": [
154
+ "node_modules/@diap/**/*",
155
+ "node_modules/@rayhanadev/**/*",
156
+ "node_modules/libp2p/**/*",
157
+ "node_modules/@libp2p/**/*"
158
+ ]
159
+ }
160
+ }
@@ -0,0 +1,216 @@
1
+ /**
2
+ * CLI 构建脚本
3
+ *
4
+ * 生成 bin/bolloon.js 和 bin/bolloon.cmd 入口文件
5
+ */
6
+
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import { fileURLToPath } from 'url';
10
+
11
+ const __filename = fileURLToPath(import.meta.url);
12
+ const __dirname = path.dirname(__filename);
13
+ const rootDir = path.join(__dirname, '..');
14
+
15
+ const binDir = path.join(rootDir, 'bin');
16
+ if (!fs.existsSync(binDir)) {
17
+ fs.mkdirSync(binDir, { recursive: true });
18
+ }
19
+
20
+ // Windows 批处理入口
21
+ const winContent = `@echo off
22
+ set "BOLLOON_ROOT=%~dp0"
23
+ set "BOLLOON_ROOT=%BOLLOON_ROOT:~0,-1%"
24
+
25
+ REM 确定入口文件
26
+ set "ENTRY=%BOLLOON_ROOT%\\dist\\index.js"
27
+ if not exist "%ENTRY%" (
28
+ set "ENTRY=%BOLLOON_ROOT%\\src\\index.ts"
29
+ )
30
+
31
+ node "%ENTRY%" %*
32
+ `;
33
+
34
+ fs.writeFileSync(path.join(binDir, 'bolloon.cmd'), winContent);
35
+
36
+ // Unix/Linux/Mac 入口脚本
37
+ const unixContent = `#!/usr/bin/env node
38
+ const path = require("path");
39
+ const { spawn } = require("child_process");
40
+ const fs = require("fs");
41
+
42
+ const RESET = "\\x1b[0m";
43
+ const BOLD = "\\x1b[1m";
44
+ const CYAN = "\\x1b[36m";
45
+ const GREEN = "\\x1b[32m";
46
+ const MAGENTA = "\\x1b[35m";
47
+
48
+ function log(msg, color) {
49
+ console.log((color || RESET) + msg + RESET);
50
+ }
51
+
52
+ function printBanner() {
53
+ console.log("\\n" + CYAN + BOLD + [
54
+ " ╔═══════════════════════════════════════════╗",
55
+ " ║ 🤖 Bolloon Agent ║",
56
+ " ║ P2P AI Document Processor ║",
57
+ " ╚═══════════════════════════════════════════╝"
58
+ ].join("\\n") + RESET + "\\n");
59
+ }
60
+
61
+ function getMainEntry() {
62
+ const distDir = path.dirname(require.main.filename);
63
+ const distIndex = path.join(distDir, "index.js");
64
+ if (fs.existsSync(distIndex)) {
65
+ return distIndex;
66
+ }
67
+ return path.join(process.cwd(), "src", "index.ts");
68
+ }
69
+
70
+ function parseArgs() {
71
+ const args = process.argv.slice(2);
72
+ if (args.length === 0) {
73
+ return { mode: "gui", args: [] };
74
+ }
75
+ const first = args[0];
76
+ switch (first) {
77
+ case "-v":
78
+ case "--version":
79
+ return { mode: "version", args: [] };
80
+ case "-h":
81
+ case "--help":
82
+ return { mode: "help", args: [] };
83
+ case "-g":
84
+ case "--gui":
85
+ return { mode: "gui", args: args.slice(1) };
86
+ case "-w":
87
+ case "--web":
88
+ return { mode: "web", args: args.slice(1) };
89
+ case "-c":
90
+ case "--cli":
91
+ return { mode: "cli", args: args.slice(1) };
92
+ default:
93
+ return { mode: "passthrough", args };
94
+ }
95
+ }
96
+
97
+ async function startElectron(additionalArgs) {
98
+ try {
99
+ const electron = require("electron");
100
+ const distDir = path.dirname(require.main.filename);
101
+ let mainPath = path.join(distDir, "electron.js");
102
+ if (!fs.existsSync(mainPath)) {
103
+ mainPath = path.join(process.cwd(), "src", "electron.ts");
104
+ }
105
+ log("启动 Electron...", CYAN);
106
+ const child = spawn(electron, [mainPath, ...additionalArgs], {
107
+ stdio: "inherit",
108
+ env: { ...process.env, NODE_ENV: "development" }
109
+ });
110
+ child.on("error", (err) => {
111
+ log("Electron 启动失败: " + err.message, MAGENTA);
112
+ process.exit(1);
113
+ });
114
+ child.on("exit", (code) => process.exit(code || 0));
115
+ } catch (err) {
116
+ log("Electron 不可用,切换到 Web 模式...", CYAN);
117
+ await startWebServer(additionalArgs);
118
+ }
119
+ }
120
+
121
+ async function startWebServer(additionalArgs) {
122
+ const mainPath = getMainEntry();
123
+ const webArgs = ["--web", ...additionalArgs];
124
+ log("启动 Web 服务...", CYAN);
125
+ const child = spawn(process.execPath, [mainPath, ...webArgs], { stdio: "inherit" });
126
+ child.on("error", (err) => {
127
+ log("Web 服务启动失败: " + err.message, MAGENTA);
128
+ process.exit(1);
129
+ });
130
+ child.on("exit", (code) => process.exit(code || 0));
131
+ }
132
+
133
+ async function startCLI(additionalArgs) {
134
+ const mainPath = getMainEntry();
135
+ log("启动命令行界面...", CYAN);
136
+ const child = spawn(process.execPath, [mainPath, ...additionalArgs], { stdio: "inherit" });
137
+ child.on("error", (err) => {
138
+ log("CLI 启动失败: " + err.message, MAGENTA);
139
+ process.exit(1);
140
+ });
141
+ child.on("exit", (code) => process.exit(code || 0));
142
+ }
143
+
144
+ async function main() {
145
+ const { mode, args } = parseArgs();
146
+ switch (mode) {
147
+ case "version":
148
+ console.log("Bolloon Agent v0.1.1");
149
+ break;
150
+ case "help":
151
+ printBanner();
152
+ console.log(BOLD + "用法:" + RESET + " bolloon [选项] [命令] [参数]");
153
+ console.log(BOLD + "选项:" + RESET + " --gui, -g 启动图形界面");
154
+ console.log(" --web, -w 启动 Web UI");
155
+ console.log(" --cli, -c 启动命令行界面");
156
+ console.log(" --version, -v 显示版本");
157
+ console.log(" --help, -h 显示帮助");
158
+ console.log(BOLD + "示例:" + RESET + " bolloon # 启动图形界面");
159
+ console.log(" bolloon --web # 启动 Web UI");
160
+ console.log(" bolloon --read file # 读取文档");
161
+ break;
162
+ case "gui":
163
+ printBanner();
164
+ await startElectron(args);
165
+ break;
166
+ case "web":
167
+ printBanner();
168
+ await startWebServer(args);
169
+ break;
170
+ case "cli":
171
+ await startCLI(args);
172
+ break;
173
+ case "passthrough":
174
+ const mainPath = getMainEntry();
175
+ const child = spawn(process.execPath, [mainPath, ...args], { stdio: "inherit" });
176
+ child.on("error", (err) => {
177
+ log("执行失败: " + err.message, MAGENTA);
178
+ process.exit(1);
179
+ });
180
+ child.on("exit", (code) => process.exit(code || 0));
181
+ break;
182
+ default:
183
+ log("未知模式: " + mode, MAGENTA);
184
+ printBanner();
185
+ console.log("输入 --help 查看帮助");
186
+ process.exit(1);
187
+ }
188
+ }
189
+
190
+ main().catch((err) => {
191
+ console.error("Fatal error:", err);
192
+ process.exit(1);
193
+ });
194
+ `;
195
+
196
+ fs.writeFileSync(path.join(binDir, 'bolloon.cjs'), unixContent);
197
+
198
+ // 确保 bin/bolloon.js 存在(npm link 需要)
199
+ // 优先用符号链接(POSIX),Windows 上若权限不足则退化为复制文件
200
+ const jsSymlink = path.join(binDir, 'bolloon.js');
201
+ if (fs.existsSync(jsSymlink)) fs.unlinkSync(jsSymlink);
202
+ try {
203
+ fs.symlinkSync('bolloon.cjs', jsSymlink);
204
+ } catch (err) {
205
+ if (err && err.code === 'EPERM') {
206
+ fs.copyFileSync(path.join(binDir, 'bolloon.cjs'), jsSymlink);
207
+ console.warn(' ⚠ symlink 不支持(Windows),已退化为文件复制');
208
+ } else {
209
+ throw err;
210
+ }
211
+ }
212
+
213
+ console.log("✓ CLI 构建完成");
214
+ console.log(" bin/bolloon.cjs - CommonJS 入口");
215
+ console.log(" bin/bolloon.js - 符号链接 -> bolloon.cjs");
216
+ console.log(" bin/bolloon.cmd - Windows 入口");
@@ -0,0 +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);