@bolloon/bolloon-agent 0.1.35 → 0.1.37

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 (502) hide show
  1. package/README.md +1 -1
  2. package/dist/agents/p2p-chat-tools.js +6 -6
  3. package/dist/agents/permission-mode.js +115 -0
  4. package/dist/agents/pi-sdk.js +435 -25
  5. package/dist/agents/pre-tool-validator.js +194 -0
  6. package/dist/agents/workflow-pivot-loop.js +113 -12
  7. package/dist/bollharness-integration/context-router.js +2 -2
  8. package/dist/bollharness-integration/guard-checker.js +1 -1
  9. package/dist/bootstrap/bootstrap.js +3 -0
  10. package/dist/bootstrap/context-collector.js +17 -1
  11. package/dist/bootstrap/context-hierarchy.js +218 -0
  12. package/dist/bootstrap/lifecycle-hooks.js +86 -24
  13. package/dist/bootstrap/project-context.js +10 -3
  14. package/dist/context-compaction/auto-compact.js +144 -0
  15. package/dist/context-compaction/budget-gate.js +28 -0
  16. package/dist/context-compaction/budget-reduce.js +35 -0
  17. package/dist/context-compaction/context-collapse.js +66 -0
  18. package/dist/context-compaction/index.js +21 -0
  19. package/dist/context-compaction/microcompact.js +51 -0
  20. package/dist/context-compaction/pipeline.js +123 -0
  21. package/dist/context-compaction/snip.js +45 -0
  22. package/dist/context-compaction/token-estimator.js +35 -0
  23. package/dist/context-compaction/types.js +19 -0
  24. package/dist/heartbeat/HealthMonitor.js +3 -2
  25. package/dist/index.js +38 -2
  26. package/dist/llm/llm-judgment-client.js +32 -30
  27. package/dist/llm/pi-ai.js +103 -16
  28. package/dist/llm/system-prompt/health.js +129 -0
  29. package/dist/llm/system-prompt/registry.js +246 -0
  30. package/dist/llm/system-prompt/strip-hibsml.js +51 -0
  31. package/dist/llm/tool-manifest/ask_user_input.js +35 -0
  32. package/dist/llm/tool-manifest/bash.js +23 -0
  33. package/dist/llm/tool-manifest/create_file.js +24 -0
  34. package/dist/llm/tool-manifest/fetch_sports_data.js +26 -0
  35. package/dist/llm/tool-manifest/image_search.js +24 -0
  36. package/dist/llm/tool-manifest/index.js +69 -0
  37. package/dist/llm/tool-manifest/mcp.js +43 -0
  38. package/dist/llm/tool-manifest/message_compose.js +31 -0
  39. package/dist/llm/tool-manifest/places.js +83 -0
  40. package/dist/llm/tool-manifest/present_files.js +21 -0
  41. package/dist/llm/tool-manifest/recipe.js +40 -0
  42. package/dist/llm/tool-manifest/recommend_apps.js +23 -0
  43. package/dist/llm/tool-manifest/str_replace.js +27 -0
  44. package/dist/llm/tool-manifest/types.js +7 -0
  45. package/dist/llm/tool-manifest/view.js +24 -0
  46. package/dist/llm/tool-manifest/weather.js +27 -0
  47. package/dist/llm/tool-manifest/web.js +51 -0
  48. package/dist/network/p2p-direct.js +23 -0
  49. package/dist/network/source-intent-broadcaster.js +203 -0
  50. package/dist/network/source-intent.js +100 -0
  51. package/dist/pi-ecosystem-judgment/adaptive-scan.js +48 -0
  52. package/dist/pi-ecosystem-judgment/injection-gate.js +54 -12
  53. package/dist/pi-ecosystem-judgment/value-injection.js +8 -2
  54. package/dist/security/context-router-tool.js +1 -1
  55. package/dist/security/input-scanner.js +223 -0
  56. package/dist/web/client.js +3089 -4458
  57. package/dist/web/index.html +58 -67
  58. package/dist/web/server.js +299 -117
  59. package/dist/web/style.css +531 -249
  60. package/dist/web/ui/message-renderer.js +352 -0
  61. package/dist/web/ui/step-timeline.js +279 -0
  62. package/package.json +2 -2
  63. package/.auto-evolve-calls +0 -1
  64. package/.last-auto-evolve-baseline +0 -1
  65. package/Bolloon.md +0 -103
  66. package/dist/agents/constraint-layer.js.map +0 -1
  67. package/dist/agents/pi-sdk.js.map +0 -1
  68. package/dist/agents/workflow-engine.js.map +0 -1
  69. package/dist/bollharness/src/index.js +0 -5
  70. package/dist/bollharness/src/scripts/checks/check_adr_plan_numbering.js +0 -6
  71. package/dist/bollharness/src/scripts/checks/check_api_types.js +0 -45
  72. package/dist/bollharness/src/scripts/checks/check_artifact_link.js +0 -146
  73. package/dist/bollharness/src/scripts/checks/check_bridge_deps.js +0 -6
  74. package/dist/bollharness/src/scripts/checks/check_bugfix_binding.js +0 -6
  75. package/dist/bollharness/src/scripts/checks/check_bugfix_binding_ci.js +0 -6
  76. package/dist/bollharness/src/scripts/checks/check_doc_file_references.js +0 -6
  77. package/dist/bollharness/src/scripts/checks/check_doc_freshness.js +0 -135
  78. package/dist/bollharness/src/scripts/checks/check_doc_links.js +0 -31
  79. package/dist/bollharness/src/scripts/checks/check_file_existence_claims.js +0 -6
  80. package/dist/bollharness/src/scripts/checks/check_fragment_integrity.js +0 -34
  81. package/dist/bollharness/src/scripts/checks/check_hook_installed.js +0 -63
  82. package/dist/bollharness/src/scripts/checks/check_issue_closure.js +0 -41
  83. package/dist/bollharness/src/scripts/checks/check_mcp_parity.js +0 -6
  84. package/dist/bollharness/src/scripts/checks/check_security.js +0 -48
  85. package/dist/bollharness/src/scripts/checks/check_skill_parity.js +0 -6
  86. package/dist/bollharness/src/scripts/checks/check_versions.js +0 -6
  87. package/dist/bollharness/src/scripts/checks/finding.js +0 -13
  88. package/dist/bollharness/src/scripts/checks/next_decision_number.js +0 -20
  89. package/dist/bollharness/src/scripts/checks/regenerate_magic_docs.js +0 -6
  90. package/dist/bollharness/src/scripts/ci/detect_rebaseline_triggers.js +0 -8
  91. package/dist/bollharness/src/scripts/ci/scan_subprocess_cfg.js +0 -8
  92. package/dist/bollharness/src/scripts/ci/scan_verify_artifacts.js +0 -8
  93. package/dist/bollharness/src/scripts/ci/scan_yaml_schema.js +0 -8
  94. package/dist/bollharness/src/scripts/context_router.js +0 -67
  95. package/dist/bollharness/src/scripts/deploy-guard.js +0 -157
  96. package/dist/bollharness/src/scripts/guard-feedback.js +0 -192
  97. package/dist/bollharness/src/scripts/guard_router.js +0 -158
  98. package/dist/bollharness/src/scripts/hooks/_hook_output.js +0 -6
  99. package/dist/bollharness/src/scripts/hooks/auto-python3.js +0 -6
  100. package/dist/bollharness/src/scripts/hooks/deploy-progress-on-session-end.js +0 -6
  101. package/dist/bollharness/src/scripts/hooks/failure-analyzer.js +0 -6
  102. package/dist/bollharness/src/scripts/hooks/gate-judgment-inject.js +0 -92
  103. package/dist/bollharness/src/scripts/hooks/gate-transition-judgment.js +0 -63
  104. package/dist/bollharness/src/scripts/hooks/inbox-ack.js +0 -6
  105. package/dist/bollharness/src/scripts/hooks/inbox-inject-on-start.js +0 -6
  106. package/dist/bollharness/src/scripts/hooks/inbox-validate.js +0 -6
  107. package/dist/bollharness/src/scripts/hooks/inbox-write-ledger.js +0 -6
  108. package/dist/bollharness/src/scripts/hooks/initializer-agent.js +0 -6
  109. package/dist/bollharness/src/scripts/hooks/loop-detection.js +0 -73
  110. package/dist/bollharness/src/scripts/hooks/owner-guard.js +0 -6
  111. package/dist/bollharness/src/scripts/hooks/precompact.js +0 -6
  112. package/dist/bollharness/src/scripts/hooks/review-agent-gatekeeper.js +0 -6
  113. package/dist/bollharness/src/scripts/hooks/risk-tracker.js +0 -108
  114. package/dist/bollharness/src/scripts/hooks/sanitize-on-read.js +0 -6
  115. package/dist/bollharness/src/scripts/hooks/session-reflection.js +0 -7
  116. package/dist/bollharness/src/scripts/hooks/session-start-magic-docs.js +0 -7
  117. package/dist/bollharness/src/scripts/hooks/session-start-reset-risk.js +0 -7
  118. package/dist/bollharness/src/scripts/hooks/session-start-toolkit-reminder.js +0 -7
  119. package/dist/bollharness/src/scripts/hooks/stop-evaluator.js +0 -157
  120. package/dist/bollharness/src/scripts/hooks/tool-call-counter.js +0 -6
  121. package/dist/bollharness/src/scripts/hooks/trace-analyzer.js +0 -10
  122. package/dist/bollharness/src/scripts/install/install-trust-token.js +0 -7
  123. package/dist/bollharness/src/scripts/install/multi_project_registry.js +0 -9
  124. package/dist/bollharness/src/scripts/install/phase2_auto.js +0 -21
  125. package/dist/bollharness/src/scripts/install/pre_commit_installer.js +0 -6
  126. package/dist/bollharness/src/scripts/install/tier_selector.js +0 -7
  127. package/dist/bollharness/src/scripts/install/transcript_miner.js +0 -7
  128. package/dist/bollharness/src/scripts/lib/claim_patterns.js +0 -10
  129. package/dist/bollharness/src/scripts/lib/sanitize_patterns.js +0 -12
  130. package/dist/bollharness/src/scripts/sanitize.js +0 -6
  131. package/dist/bollharness-integration/context-router-judgment.js.map +0 -1
  132. package/dist/bollharness-integration/context-router.js.map +0 -1
  133. package/dist/bollharness-integration/gate-state-machine.js.map +0 -1
  134. package/dist/bollharness-integration/gate-transition-hooks.js.map +0 -1
  135. package/dist/bollharness-integration/guard-checker.js.map +0 -1
  136. package/dist/bollharness-integration/index.js.map +0 -1
  137. package/dist/bollharness-integration/integration.js.map +0 -1
  138. package/dist/bollharness-integration/llm/pi-ai.d.ts +0 -60
  139. package/dist/bollharness-integration/pi-ecosystem-colony/index.d.ts +0 -153
  140. package/dist/bollharness-integration/pi-ecosystem-goals/index.d.ts +0 -136
  141. package/dist/bollharness-integration/pi-ecosystem-judgment/decision.d.ts +0 -117
  142. package/dist/bollharness-integration/pi-ecosystem-judgment/distillation.d.ts +0 -78
  143. package/dist/bollharness-integration/pi-ecosystem-judgment/index.d.ts +0 -139
  144. package/dist/bollharness-integration/pi-ecosystem-mcp/index.d.ts +0 -127
  145. package/dist/bollharness-integration/pi-ecosystem-subagents/index.d.ts +0 -95
  146. package/dist/bollharness-integration/skill-adapter.js.map +0 -1
  147. package/dist/constraint-runtime/src/_archive_helper.js +0 -9
  148. package/dist/constraint-runtime/src/agent/coordinator.js +0 -48
  149. package/dist/constraint-runtime/src/agent/index.js +0 -1
  150. package/dist/constraint-runtime/src/assistant/index.js +0 -12
  151. package/dist/constraint-runtime/src/bootstrap/index.js +0 -12
  152. package/dist/constraint-runtime/src/bootstrap_graph.js +0 -13
  153. package/dist/constraint-runtime/src/bridge/index.js +0 -12
  154. package/dist/constraint-runtime/src/buddy/index.js +0 -12
  155. package/dist/constraint-runtime/src/cli/index.js +0 -12
  156. package/dist/constraint-runtime/src/command_graph.js +0 -10
  157. package/dist/constraint-runtime/src/commands.js +0 -60
  158. package/dist/constraint-runtime/src/components/index.js +0 -12
  159. package/dist/constraint-runtime/src/constants/index.js +0 -12
  160. package/dist/constraint-runtime/src/constraint/budget.js +0 -22
  161. package/dist/constraint-runtime/src/constraint/budget.js.map +0 -1
  162. package/dist/constraint-runtime/src/constraint/index.js +0 -2
  163. package/dist/constraint-runtime/src/constraint/permission.js +0 -20
  164. package/dist/constraint-runtime/src/constraint/permission.js.map +0 -1
  165. package/dist/constraint-runtime/src/context.js +0 -30
  166. package/dist/constraint-runtime/src/coordinator/index.js +0 -12
  167. package/dist/constraint-runtime/src/cost_hook.js +0 -4
  168. package/dist/constraint-runtime/src/cost_tracker.js +0 -8
  169. package/dist/constraint-runtime/src/deferred_init.js +0 -10
  170. package/dist/constraint-runtime/src/direct_modes.js +0 -6
  171. package/dist/constraint-runtime/src/dynamic-tool-loader.js +0 -85
  172. package/dist/constraint-runtime/src/entrypoints/index.js +0 -12
  173. package/dist/constraint-runtime/src/execution_registry.js +0 -44
  174. package/dist/constraint-runtime/src/history.js +0 -9
  175. package/dist/constraint-runtime/src/hooks/index.js +0 -12
  176. package/dist/constraint-runtime/src/index.js +0 -26
  177. package/dist/constraint-runtime/src/ink.js +0 -4
  178. package/dist/constraint-runtime/src/keybindings/index.js +0 -12
  179. package/dist/constraint-runtime/src/memdir/index.js +0 -12
  180. package/dist/constraint-runtime/src/migrations/index.js +0 -12
  181. package/dist/constraint-runtime/src/models.js +0 -1
  182. package/dist/constraint-runtime/src/models.js.map +0 -1
  183. package/dist/constraint-runtime/src/moreright/index.js +0 -12
  184. package/dist/constraint-runtime/src/native_ts/index.js +0 -12
  185. package/dist/constraint-runtime/src/output_styles/index.js +0 -12
  186. package/dist/constraint-runtime/src/parity_audit.js +0 -12
  187. package/dist/constraint-runtime/src/plugins/index.js +0 -12
  188. package/dist/constraint-runtime/src/port_manifest.js +0 -11
  189. package/dist/constraint-runtime/src/prefetch.js +0 -9
  190. package/dist/constraint-runtime/src/query.js +0 -1
  191. package/dist/constraint-runtime/src/remote/index.js +0 -12
  192. package/dist/constraint-runtime/src/remote_runtime.js +0 -9
  193. package/dist/constraint-runtime/src/runtime/index.js +0 -1
  194. package/dist/constraint-runtime/src/runtime/session.js +0 -35
  195. package/dist/constraint-runtime/src/schemas/index.js +0 -12
  196. package/dist/constraint-runtime/src/screens/index.js +0 -12
  197. package/dist/constraint-runtime/src/server/index.js +0 -12
  198. package/dist/constraint-runtime/src/services/index.js +0 -12
  199. package/dist/constraint-runtime/src/session_store.js +0 -22
  200. package/dist/constraint-runtime/src/setup.js +0 -30
  201. package/dist/constraint-runtime/src/skills/index.js +0 -1
  202. package/dist/constraint-runtime/src/skills/skill-registry.js +0 -28
  203. package/dist/constraint-runtime/src/state/index.js +0 -12
  204. package/dist/constraint-runtime/src/system_init.js +0 -20
  205. package/dist/constraint-runtime/src/thinking/engine.js +0 -42
  206. package/dist/constraint-runtime/src/thinking/index.js +0 -1
  207. package/dist/constraint-runtime/src/tool_pool.js +0 -8
  208. package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +0 -7
  209. package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +0 -7
  210. package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +0 -7
  211. package/dist/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.js +0 -6
  212. package/dist/constraint-runtime/src/tools/PolymarketSDK/createOrder.js +0 -6
  213. package/dist/constraint-runtime/src/tools/PolymarketSDK/getMarket.js +0 -5
  214. package/dist/constraint-runtime/src/tools/PolymarketSDK/getOrders.js +0 -6
  215. package/dist/constraint-runtime/src/tools/PolymarketSDK/listMarkets.js +0 -4
  216. package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +0 -6
  217. package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +0 -8
  218. package/dist/constraint-runtime/src/tools/SafeSDK/deploySafe.js +0 -6
  219. package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +0 -6
  220. package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +0 -6
  221. package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +0 -6
  222. package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +0 -6
  223. package/dist/constraint-runtime/src/tools/WalletTools/autoPay.js +0 -29
  224. package/dist/constraint-runtime/src/tools/WalletTools/createWallet.js +0 -10
  225. package/dist/constraint-runtime/src/tools/WalletTools/getBalance.js +0 -13
  226. package/dist/constraint-runtime/src/tools/WalletTools/importWallet.js +0 -22
  227. package/dist/constraint-runtime/src/tools/WalletTools/sendTransaction.js +0 -25
  228. package/dist/constraint-runtime/src/tools/WalletTools/signMessage.js +0 -10
  229. package/dist/constraint-runtime/src/tools/WalletTools/transferToken.js +0 -25
  230. package/dist/constraint-runtime/src/tools.js +0 -80
  231. package/dist/constraint-runtime/src/transcript.js +0 -19
  232. package/dist/constraint-runtime/src/types/index.js +0 -12
  233. package/dist/constraint-runtime/src/upstream_proxy/index.js +0 -12
  234. package/dist/constraint-runtime/src/utils/index.js +0 -12
  235. package/dist/constraint-runtime/src/vim/index.js +0 -12
  236. package/dist/constraint-runtime/src/voice/index.js +0 -12
  237. package/dist/constraints/index.js.map +0 -1
  238. package/dist/documents/reader.js.map +0 -1
  239. package/dist/llm/config-store.js.map +0 -1
  240. package/dist/llm/pi-ai.js.map +0 -1
  241. package/dist/network/agent-network.js.map +0 -1
  242. package/dist/network/iroh-integration.js.map +0 -1
  243. package/dist/network/iroh-transport.js.map +0 -1
  244. package/dist/network/p2p.js.map +0 -1
  245. package/dist/network/storage/adapters/json-adapter.js.map +0 -1
  246. package/dist/pi-ecosystem-colony/index.js.map +0 -1
  247. package/dist/pi-ecosystem-goals/index.js.map +0 -1
  248. package/dist/pi-ecosystem-judgment/decision.js.map +0 -1
  249. package/dist/pi-ecosystem-judgment/distillation.js.map +0 -1
  250. package/dist/pi-ecosystem-judgment/human-value-store.js.map +0 -1
  251. package/dist/pi-ecosystem-judgment/index.js.map +0 -1
  252. package/dist/pi-ecosystem-judgment/value-injection.js.map +0 -1
  253. package/dist/pi-ecosystem-mcp/index.js.map +0 -1
  254. package/dist/pi-ecosystem-subagents/index.js.map +0 -1
  255. package/dist/social/ant-colony/AdaptiveHeartbeat.js.map +0 -1
  256. package/dist/social/ant-colony/PheromoneEngine.js.map +0 -1
  257. package/dist/social/ant-colony/types.js.map +0 -1
  258. package/dist/social/channels/ChannelManager.js.map +0 -1
  259. package/dist/social/channels/DiapChannelBridge.js.map +0 -1
  260. package/dist/social/channels/InterestMatcher.js.map +0 -1
  261. package/dist/social/channels/types.js.map +0 -1
  262. package/dist/social/global-shared-context.js.map +0 -1
  263. package/dist/social/heartbeat.js.map +0 -1
  264. package/lefthook.yml +0 -29
  265. package/scripts/auto-evolve-loop.ts +0 -376
  266. package/scripts/auto-evolve-oneshot.sh +0 -155
  267. package/scripts/auto-evolve-snapshot.sh +0 -136
  268. package/scripts/build-cli.js +0 -216
  269. package/scripts/build-web.ts +0 -82
  270. package/scripts/detect-schema-changes.sh +0 -48
  271. package/scripts/diff-reviewer.ts +0 -159
  272. package/scripts/postinstall.js +0 -153
  273. package/scripts/weekly-report.ts +0 -364
  274. package/src/agents/agent-manifest-protocol.ts +0 -117
  275. package/src/agents/constraint-layer.ts +0 -309
  276. package/src/agents/iroh-secret.ts +0 -32
  277. package/src/agents/p2p-chat-tools.ts +0 -383
  278. package/src/agents/p2p-document-tools.ts +0 -347
  279. package/src/agents/pi-sdk.ts +0 -2462
  280. package/src/agents/protocol.ts +0 -398
  281. package/src/agents/shell-guard.ts +0 -417
  282. package/src/agents/shell-tool.ts +0 -103
  283. package/src/agents/skill-loader.ts +0 -202
  284. package/src/agents/subagent-manager.ts +0 -553
  285. package/src/agents/workflow-engine.ts +0 -332
  286. package/src/agents/workflow-pivot-loop.ts +0 -675
  287. package/src/bollharness/.sanitize-report.json +0 -13
  288. package/src/bollharness/CLAUDE.md +0 -73
  289. package/src/bollharness/LICENSE +0 -21
  290. package/src/bollharness/README.md +0 -143
  291. package/src/bollharness/README.zh-CN.md +0 -131
  292. package/src/bollharness/package.json +0 -20
  293. package/src/bollharness/reference/SOURCE-COMMIT.txt +0 -3
  294. package/src/bollharness/reference/boll-reference/scripts/hooks/.sanitize-report.json +0 -12
  295. package/src/bollharness/reference/boll-reference/scripts/hooks/find-boll-root.sh +0 -27
  296. package/src/bollharness/reference/boll-reference/scripts/hooks/precompact.sh +0 -57
  297. package/src/bollharness/reference/boll-reference/scripts/hooks/stop-evaluator.md +0 -57
  298. package/src/bollharness/schemas/metrics-jsonl-allowlist.json +0 -67
  299. package/src/bollharness/scripts/checks/next_decision_number.sh +0 -48
  300. package/src/bollharness/scripts/ci/count-components.sh +0 -65
  301. package/src/bollharness/scripts/context-fragments/artifact-linkage.md +0 -14
  302. package/src/bollharness/scripts/context-fragments/auth-consumers.md +0 -17
  303. package/src/bollharness/scripts/context-fragments/bridge-constitution.md +0 -13
  304. package/src/bollharness/scripts/context-fragments/catalyst-distributed.md +0 -18
  305. package/src/bollharness/scripts/context-fragments/closure-checklist.md +0 -13
  306. package/src/bollharness/scripts/context-fragments/contract-consumers.md +0 -15
  307. package/src/bollharness/scripts/context-fragments/db-shared-structures.md +0 -15
  308. package/src/bollharness/scripts/context-fragments/fixed-three-layers.md +0 -19
  309. package/src/bollharness/scripts/context-fragments/general-dev-principles.md +0 -11
  310. package/src/bollharness/scripts/context-fragments/issue-first.md +0 -8
  311. package/src/bollharness/scripts/context-fragments/mcp-parity.md +0 -16
  312. package/src/bollharness/scripts/context-fragments/pi-agent-operations.md +0 -108
  313. package/src/bollharness/scripts/context-fragments/protocol-consumers.md +0 -15
  314. package/src/bollharness/scripts/context-fragments/run-events-consumers.md +0 -15
  315. package/src/bollharness/scripts/context-fragments/scene-fidelity.md +0 -13
  316. package/src/bollharness/scripts/context-fragments/truth-source-hierarchy.md +0 -15
  317. package/src/bollharness/scripts/context-fragments/two-language.md +0 -15
  318. package/src/bollharness/scripts/context-fragments/version-sources.md +0 -14
  319. package/src/bollharness/scripts/hooks/find-project-root.sh +0 -47
  320. package/src/bollharness/scripts/hooks/inbox-poll.sh +0 -78
  321. package/src/bollharness/scripts/hooks/precompact.sh +0 -56
  322. package/src/bollharness/scripts/hooks/stop-evaluator.md +0 -83
  323. package/src/bollharness/scripts/sync-from-upstream.sh +0 -281
  324. package/src/bollharness/src/index.ts +0 -5
  325. package/src/bollharness/src/scripts/checks/check_adr_plan_numbering.ts +0 -11
  326. package/src/bollharness/src/scripts/checks/check_api_types.ts +0 -52
  327. package/src/bollharness/src/scripts/checks/check_artifact_link.ts +0 -156
  328. package/src/bollharness/src/scripts/checks/check_bridge_deps.ts +0 -11
  329. package/src/bollharness/src/scripts/checks/check_bugfix_binding.ts +0 -11
  330. package/src/bollharness/src/scripts/checks/check_bugfix_binding_ci.ts +0 -11
  331. package/src/bollharness/src/scripts/checks/check_doc_file_references.ts +0 -11
  332. package/src/bollharness/src/scripts/checks/check_doc_freshness.ts +0 -141
  333. package/src/bollharness/src/scripts/checks/check_doc_links.ts +0 -36
  334. package/src/bollharness/src/scripts/checks/check_file_existence_claims.ts +0 -11
  335. package/src/bollharness/src/scripts/checks/check_fragment_integrity.ts +0 -40
  336. package/src/bollharness/src/scripts/checks/check_hook_installed.ts +0 -70
  337. package/src/bollharness/src/scripts/checks/check_issue_closure.ts +0 -51
  338. package/src/bollharness/src/scripts/checks/check_mcp_parity.ts +0 -11
  339. package/src/bollharness/src/scripts/checks/check_security.ts +0 -54
  340. package/src/bollharness/src/scripts/checks/check_skill_parity.ts +0 -11
  341. package/src/bollharness/src/scripts/checks/check_versions.ts +0 -11
  342. package/src/bollharness/src/scripts/checks/finding.ts +0 -35
  343. package/src/bollharness/src/scripts/checks/next_decision_number.ts +0 -24
  344. package/src/bollharness/src/scripts/checks/regenerate_magic_docs.ts +0 -11
  345. package/src/bollharness/src/scripts/ci/detect_rebaseline_triggers.ts +0 -14
  346. package/src/bollharness/src/scripts/ci/scan_subprocess_cfg.ts +0 -14
  347. package/src/bollharness/src/scripts/ci/scan_verify_artifacts.ts +0 -14
  348. package/src/bollharness/src/scripts/ci/scan_yaml_schema.ts +0 -14
  349. package/src/bollharness/src/scripts/context_router.ts +0 -76
  350. package/src/bollharness/src/scripts/deploy-guard.ts +0 -182
  351. package/src/bollharness/src/scripts/guard-feedback.ts +0 -215
  352. package/src/bollharness/src/scripts/guard_router.ts +0 -194
  353. package/src/bollharness/src/scripts/hooks/_hook_output.js +0 -3
  354. package/src/bollharness/src/scripts/hooks/_hook_output.ts +0 -11
  355. package/src/bollharness/src/scripts/hooks/auto-python3.ts +0 -10
  356. package/src/bollharness/src/scripts/hooks/deploy-progress-on-session-end.ts +0 -10
  357. package/src/bollharness/src/scripts/hooks/failure-analyzer.ts +0 -10
  358. package/src/bollharness/src/scripts/hooks/gate-judgment-inject.ts +0 -111
  359. package/src/bollharness/src/scripts/hooks/gate-transition-judgment.ts +0 -74
  360. package/src/bollharness/src/scripts/hooks/inbox-ack.ts +0 -10
  361. package/src/bollharness/src/scripts/hooks/inbox-inject-on-start.ts +0 -10
  362. package/src/bollharness/src/scripts/hooks/inbox-validate.ts +0 -10
  363. package/src/bollharness/src/scripts/hooks/inbox-write-ledger.ts +0 -10
  364. package/src/bollharness/src/scripts/hooks/initializer-agent.ts +0 -10
  365. package/src/bollharness/src/scripts/hooks/loop-detection.ts +0 -83
  366. package/src/bollharness/src/scripts/hooks/owner-guard.ts +0 -10
  367. package/src/bollharness/src/scripts/hooks/precompact.ts +0 -10
  368. package/src/bollharness/src/scripts/hooks/review-agent-gatekeeper.ts +0 -10
  369. package/src/bollharness/src/scripts/hooks/risk-tracker.ts +0 -121
  370. package/src/bollharness/src/scripts/hooks/sanitize-on-read.ts +0 -10
  371. package/src/bollharness/src/scripts/hooks/session-reflection.ts +0 -12
  372. package/src/bollharness/src/scripts/hooks/session-start-magic-docs.ts +0 -12
  373. package/src/bollharness/src/scripts/hooks/session-start-reset-risk.ts +0 -12
  374. package/src/bollharness/src/scripts/hooks/session-start-toolkit-reminder.ts +0 -12
  375. package/src/bollharness/src/scripts/hooks/stop-evaluator.ts +0 -164
  376. package/src/bollharness/src/scripts/hooks/tool-call-counter.ts +0 -10
  377. package/src/bollharness/src/scripts/hooks/trace-analyzer.ts +0 -14
  378. package/src/bollharness/src/scripts/install/install-trust-token.ts +0 -13
  379. package/src/bollharness/src/scripts/install/multi_project_registry.ts +0 -13
  380. package/src/bollharness/src/scripts/install/phase2_auto.ts +0 -28
  381. package/src/bollharness/src/scripts/install/pre_commit_installer.ts +0 -10
  382. package/src/bollharness/src/scripts/install/tier_selector.ts +0 -10
  383. package/src/bollharness/src/scripts/install/transcript_miner.ts +0 -13
  384. package/src/bollharness/src/scripts/lib/claim_patterns.ts +0 -11
  385. package/src/bollharness/src/scripts/lib/sanitize_patterns.ts +0 -13
  386. package/src/bollharness/src/scripts/sanitize.ts +0 -9
  387. package/src/bollharness/templates/persona/default.json +0 -19
  388. package/src/bollharness/templates/scaffold/.gitignore.append +0 -16
  389. package/src/bollharness/templates/scaffold/CLAUDE.md +0 -89
  390. package/src/bollharness-integration/channel-judgment-engine.ts +0 -634
  391. package/src/bollharness-integration/context-chain-router.ts +0 -474
  392. package/src/bollharness-integration/context-router-judgment.ts +0 -339
  393. package/src/bollharness-integration/context-router.ts +0 -583
  394. package/src/bollharness-integration/gate-state-machine.ts +0 -444
  395. package/src/bollharness-integration/gate-transition-hooks.ts +0 -137
  396. package/src/bollharness-integration/guard-checker.ts +0 -451
  397. package/src/bollharness-integration/index.ts +0 -195
  398. package/src/bollharness-integration/integration.ts +0 -538
  399. package/src/bollharness-integration/judgment-prompts.yaml +0 -535
  400. package/src/bollharness-integration/llm-judgment-engine.ts +0 -712
  401. package/src/bollharness-integration/skill-adapter.ts +0 -646
  402. package/src/bootstrap/bootstrap.ts +0 -132
  403. package/src/bootstrap/context-collector.ts +0 -342
  404. package/src/bootstrap/lifecycle-hooks.ts +0 -176
  405. package/src/bootstrap/project-context.ts +0 -163
  406. package/src/cli/interface.ts +0 -211
  407. package/src/cli-entry.ts +0 -304
  408. package/src/constraints/index.ts +0 -6
  409. package/src/documents/reader.ts +0 -85
  410. package/src/documents/store.ts +0 -252
  411. package/src/electron-preload.ts +0 -25
  412. package/src/electron.ts +0 -200
  413. package/src/heartbeat/DaemonManager.ts +0 -283
  414. package/src/heartbeat/HealthMonitor.ts +0 -316
  415. package/src/heartbeat/StartupVerifier.ts +0 -223
  416. package/src/heartbeat/Watchdog.ts +0 -208
  417. package/src/heartbeat/index.ts +0 -109
  418. package/src/heartbeat/self-improve-bus.ts +0 -110
  419. package/src/heartbeat/types.ts +0 -82
  420. package/src/index.ts +0 -1690
  421. package/src/llm/audio-config-store.ts +0 -246
  422. package/src/llm/config-store.ts +0 -400
  423. package/src/llm/llm-judgment-client.ts +0 -470
  424. package/src/llm/pi-ai.ts +0 -558
  425. package/src/llm/video-config-store.ts +0 -257
  426. package/src/network/agent-network.ts +0 -800
  427. package/src/network/hybrid-messenger.ts +0 -199
  428. package/src/network/iroh-bootstrap.ts +0 -57
  429. package/src/network/iroh-discovery.ts +0 -208
  430. package/src/network/iroh-integration.ts +0 -158
  431. package/src/network/iroh-transport.ts +0 -637
  432. package/src/network/known-peers.ts +0 -102
  433. package/src/network/p2p-direct.ts +0 -240
  434. package/src/network/p2p-secret.ts +0 -153
  435. package/src/network/p2p.ts +0 -964
  436. package/src/network/storage/adapters/json-adapter.ts +0 -454
  437. package/src/network/storage/index.ts +0 -203
  438. package/src/network/storage/types.ts +0 -166
  439. package/src/security/builtin-guards.ts +0 -162
  440. package/src/security/context-router-tool.ts +0 -122
  441. package/src/security/react-harness.ts +0 -177
  442. package/src/security/tool-gate.ts +0 -294
  443. package/src/social/ant-colony/index.js +0 -19
  444. package/src/social/channels/ChannelManager.ts +0 -485
  445. package/src/social/channels/DiapChannelBridge.ts +0 -501
  446. package/src/social/channels/InterestMatcher.ts +0 -189
  447. package/src/social/channels/agent-workflow-config.json +0 -214
  448. package/src/social/channels/agent-workflow-config.yaml +0 -334
  449. package/src/social/channels/channel-agent-session.ts +0 -407
  450. package/src/social/channels/channel-heartbeat-agent.ts +0 -622
  451. package/src/social/channels/diap-doc-parser.ts +0 -282
  452. package/src/social/channels/harness-workflow-integrator.ts +0 -594
  453. package/src/social/channels/index.ts +0 -22
  454. package/src/social/channels/types.ts +0 -115
  455. package/src/social/global-shared-context.ts +0 -506
  456. package/src/social/heartbeat.ts +0 -1057
  457. package/src/social/persona/enhanced-persona.ts +0 -359
  458. package/src/types.d.ts +0 -12
  459. package/src/utils/auto-evolve-policy.ts +0 -138
  460. package/src/utils/auto-update.ts +0 -482
  461. package/src/utils/clamp.ts +0 -5
  462. package/src/web/agent-delegate-server.ts +0 -148
  463. package/src/web/api-config.html +0 -520
  464. package/src/web/client.js +0 -4898
  465. package/src/web/components/p2p/P2PModal.tsx +0 -416
  466. package/src/web/components/p2p/index.ts +0 -566
  467. package/src/web/components/p2p/index.tsx +0 -297
  468. package/src/web/components/p2p/p2p-connection.ts +0 -338
  469. package/src/web/components/p2p/p2p-identity.ts +0 -92
  470. package/src/web/components/p2p/p2p-manager.ts +0 -147
  471. package/src/web/components/p2p/p2p-messages.ts +0 -219
  472. package/src/web/components/p2p/p2p-modal.ts +0 -685
  473. package/src/web/components/p2p/p2p-store-memory.ts +0 -162
  474. package/src/web/components/p2p/p2p-tools.ts +0 -315
  475. package/src/web/components/p2p/types.ts +0 -170
  476. package/src/web/components/wallet-viem.mjs +0 -118
  477. package/src/web/design.md +0 -99
  478. package/src/web/icons/apple-touch-icon.png +0 -0
  479. package/src/web/icons/favicon-16x16.png +0 -0
  480. package/src/web/icons/favicon-192x192.png +0 -0
  481. package/src/web/icons/favicon-32x32.png +0 -0
  482. package/src/web/icons/favicon-48x48.png +0 -0
  483. package/src/web/icons/favicon-512x512.png +0 -0
  484. package/src/web/icons/favicon.icns +0 -0
  485. package/src/web/icons/favicon.ico +0 -0
  486. package/src/web/icons/icon.png +0 -0
  487. package/src/web/icons/image.png +0 -0
  488. package/src/web/index.html +0 -382
  489. package/src/web/iroh-delegate-transport.ts +0 -139
  490. package/src/web/manifest.json +0 -21
  491. package/src/web/server.ts +0 -5571
  492. package/src/web/style.css +0 -4455
  493. package/staging/auto-evolve/clean-001/.review-verdict +0 -9
  494. package/staging/auto-evolve/clean-001/clean-001.patch +0 -14
  495. package/staging/auto-evolve/e2e-001/.patch-id +0 -1
  496. package/staging/auto-evolve/e2e-001/.review-verdict +0 -12
  497. package/staging/auto-evolve/e2e-001/e2e-001.patch +0 -11
  498. package/staging/auto-evolve/test-bad/.review-verdict +0 -12
  499. package/staging/auto-evolve/test-bad/test-bad.patch +0 -11
  500. package/tsconfig.cli.json +0 -16
  501. package/tsconfig.electron.json +0 -20
  502. package/tsconfig.json +0 -18
@@ -1,102 +0,0 @@
1
- /**
2
- * known-peers.ts — 持久化 P2P 好友列表, 启动自动重连
3
- *
4
- * 文件位置: ~/.bolloon/known_peers.json
5
- * 格式: { version: 1, peers: { [name]: { publicKey, addedAt, lastConnected } } }
6
- *
7
- * 设计原则:
8
- * - publicKey 持久化 (peerId 等同于 P2PDirect publicKey = 32 字节 hex = 64 chars)
9
- * - name 是用户给的好友备注 (不参与 P2P 协议, 仅 UI 显示)
10
- * - 不存 ip/port, hyperswarm DHT 自动重发现
11
- * - 不存 lastConnected 详细信息, 只存时间戳 (供 UI 显示)
12
- */
13
- import * as fs from 'fs/promises';
14
- import * as path from 'path';
15
- import * as os from 'os';
16
-
17
- const SECRET_DIR = process.env.BOLLOON_HOME || path.join(os.homedir(), '.bolloon');
18
- const KNOWN_PEERS_FILE = path.join(SECRET_DIR, 'known_peers.json');
19
-
20
- export interface KnownPeer {
21
- publicKey: string; // 64 char hex
22
- name?: string; // 用户给的备注
23
- addedAt: string; // ISO timestamp
24
- lastConnectedAt?: string; // ISO timestamp, 最近一次 joinPeer 成功
25
- notes?: string; // 用户备注
26
- }
27
-
28
- interface KnownPeersFile {
29
- version: 1;
30
- peers: Record<string, KnownPeer>;
31
- }
32
-
33
- async function ensureDir(): Promise<void> {
34
- await fs.mkdir(SECRET_DIR, { recursive: true });
35
- }
36
-
37
- async function readFile(): Promise<KnownPeersFile> {
38
- try {
39
- const raw = await fs.readFile(KNOWN_PEERS_FILE, 'utf-8');
40
- return JSON.parse(raw);
41
- } catch {
42
- return { version: 1, peers: {} };
43
- }
44
- }
45
-
46
- async function writeFile(data: KnownPeersFile): Promise<void> {
47
- await ensureDir();
48
- await fs.writeFile(KNOWN_PEERS_FILE, JSON.stringify(data, null, 2), 'utf-8');
49
- }
50
-
51
- /** 添加或更新一个 known peer (key 用 name) */
52
- export async function addOrUpdatePeer(name: string | null | undefined, publicKey: string, notes?: string): Promise<void> {
53
- const safeName = (name && name.length > 0) ? name : `peer-${publicKey.substring(0, 8)}`;
54
- const data = await readFile();
55
- const existing = data.peers[safeName];
56
- data.peers[safeName] = {
57
- publicKey,
58
- name: safeName,
59
- addedAt: existing?.addedAt || new Date().toISOString(),
60
- lastConnectedAt: existing?.lastConnectedAt,
61
- notes: notes || existing?.notes
62
- };
63
- await writeFile(data);
64
- console.log(`[known-peers] 添加/更新: ${safeName} = ${publicKey.substring(0, 12)}...`);
65
- }
66
-
67
- /** 删除 known peer */
68
- export async function removePeer(name: string): Promise<void> {
69
- const data = await readFile();
70
- if (data.peers[name]) {
71
- delete data.peers[name];
72
- await writeFile(data);
73
- console.log(`[known-peers] 删除: ${name}`);
74
- }
75
- }
76
-
77
- /** 标记连接成功 (更新 lastConnectedAt) */
78
- export async function markConnected(name: string): Promise<void> {
79
- const data = await readFile();
80
- if (data.peers[name]) {
81
- data.peers[name].lastConnectedAt = new Date().toISOString();
82
- await writeFile(data);
83
- }
84
- }
85
-
86
- /** 列出所有 known peers */
87
- export async function listPeers(): Promise<KnownPeer[]> {
88
- const data = await readFile();
89
- return Object.values(data.peers);
90
- }
91
-
92
- /** 通过 publicKey 找 name (用于自动标记 lastConnectedAt) */
93
- export async function findNameByPublicKey(publicKey: string): Promise<string | null> {
94
- const data = await readFile();
95
- for (const [name, p] of Object.entries(data.peers)) {
96
- if (p.publicKey === publicKey) return name;
97
- }
98
- return null;
99
- }
100
-
101
- /** 完整文件路径 (供 web server 暴露) */
102
- export const KNOWN_PEERS_PATH = KNOWN_PEERS_FILE;
@@ -1,240 +0,0 @@
1
- /**
2
- * p2p-direct.ts — 薄包装 hyperswarm (纯 TS, npm 包, 不改 binding)
3
- *
4
- * 为什么: @diap/sdk 的 HyperswarmCommunicator.sendToConnection 是 stub (只更新 bytesSent 计数器, 不真发).
5
- * 这层薄包装直接用 hyperswarm 库, 真正把数据写到 socket.
6
- *
7
- * 用法:
8
- * const p2p = new P2PDirect({ name: 'bolloon' });
9
- * await p2p.start();
10
- * await p2p.joinTopic(Buffer.from('bolloon-agent-harness'));
11
- * p2p.on('data', (data, fromPublicKey) => { ... });
12
- * p2p.broadcast(Buffer.from('hello'));
13
- * await p2p.stop();
14
- */
15
- // @ts-ignore — hyperswarm 没官方 .d.ts
16
- import Hyperswarm from 'hyperswarm';
17
- import crypto from 'crypto';
18
- import { EventEmitter } from 'events';
19
- // @ts-ignore — b4a 没官方 .d.ts
20
- import b4a from 'b4a';
21
- import { loadOrCreateKeyPair, writebackPublicKey } from './p2p-secret.js';
22
-
23
- export interface P2PDirectOptions {
24
- /** 节点标识 (用于日志) */
25
- name?: string;
26
- /**
27
- * 角色标识 (对应 ~/.bolloon/p2p-direct-secret-{role}.json).
28
- * 留空时, P2PDirect 自动从 IROH_ROLE / BOLLOON_ROLE / 'default' 选.
29
- *
30
- * 同一台机器同一 role → 同一 publicKey (持久化 secretKey)
31
- * 不同 role → 独立身份 (例: nodeA 和 nodeB 同机开发, 不冲突)
32
- */
33
- role?: string;
34
- /**
35
- * 跳过持久化 secret 加载, 完全随机 keyPair.
36
- * (调试 / 测试用, 真实环境应保持默认 false)
37
- */
38
- ephemeral?: boolean;
39
- }
40
-
41
- export interface DataEvent {
42
- data: Buffer;
43
- fromPublicKey: string; // hex
44
- remoteAddress?: string; // 暂时没用到
45
- }
46
-
47
- export class P2PDirect extends EventEmitter {
48
- private swarm: Hyperswarm | null = null;
49
- private name: string;
50
- private role: string;
51
- private joinedTopics: Set<string> = new Set();
52
- // 维护: 远端 publicKey -> conn (用于主动 send)
53
- private conns: Map<string, any> = new Map();
54
- private started: boolean = false;
55
- private ephemeral: boolean;
56
-
57
- constructor(opts: P2PDirectOptions = {}) {
58
- super();
59
- this.name = opts.name || 'p2p-direct';
60
- this.role = opts.role || (process.env.IROH_ROLE || process.env.BOLLOON_ROLE || 'default');
61
- this.ephemeral = !!opts.ephemeral;
62
- }
63
-
64
- async start(): Promise<void> {
65
- if (this.started) return;
66
-
67
- // 1. 加载/生成持久化 keyPair (同一 role 跨重启同一 publicKey)
68
- if (this.ephemeral) {
69
- console.log(`[P2PDirect:${this.name}] ephemeral 模式, 不持久化`);
70
- this.swarm = new Hyperswarm();
71
- } else {
72
- const kp = await loadOrCreateKeyPair(this.role);
73
- // hyperswarm 4.x 支持 `seed` 选项, DHT.keyPair(seed) 内部派生稳定 publicKey
74
- this.swarm = new Hyperswarm({
75
- seed: Buffer.from(kp.secretKey, 'hex'), // 32-byte ed25519/X25519 seed
76
- });
77
- // 验证 / 写回 publicKey (首次启动时文件里是空)
78
- const realPub = b4a.toString(this.swarm.keyPair.publicKey, 'hex');
79
- if (kp.publicKey !== realPub) {
80
- await writebackPublicKey(this.role, kp.secretKey, realPub);
81
- }
82
- }
83
-
84
- this.swarm.on('connection', (conn: any, info: any) => {
85
- const remotePubKeyHex = b4a.toString(info.publicKey, 'hex');
86
- console.log(`[P2PDirect:${this.name}] 新连接: ${remotePubKeyHex.substring(0, 12)}... (inbound=${info.inbound || false}, type=${typeof conn}, hasWrite=${typeof conn?.write})`);
87
-
88
- // 双向记录 (inbound + outbound 都能拿到)
89
- this.conns.set(remotePubKeyHex, conn);
90
-
91
- // 收到数据时 → 触发 'data' 事件
92
- // 注意: data 监听器必须在 emit('connection') 之前注册,
93
- // 否则 server 的 connection handler 发送消息后, 对端回复可能在 data 监听器就绪前到达
94
- conn.on('data', (chunk: Buffer | Uint8Array) => {
95
- const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
96
- console.log(`[P2PDirect:${this.name}] 收到数据 from ${remotePubKeyHex.substring(0,12)}... (${buf.length} bytes)`);
97
- this.emit('data', {
98
- data: buf,
99
- fromPublicKey: remotePubKeyHex,
100
- } as DataEvent);
101
- });
102
-
103
- conn.on('error', (err: Error) => {
104
- console.error(`[P2PDirect:${this.name}] 连接错误 (${remotePubKeyHex.substring(0,12)}...):`, err.message);
105
- });
106
-
107
- conn.on('close', () => {
108
- this.conns.delete(remotePubKeyHex);
109
- });
110
-
111
- // v3: 触发 'connection' 事件, 上层 (web server) 可以主动给新连接发消息
112
- // 注意: 放在 data/error/close 监听器之后, 确保 server 的 connection handler 不会先于 data 就绪
113
- this.emit('connection', { remotePublicKey: remotePubKeyHex, conn });
114
- });
115
-
116
- await this.swarm.listen(); // server 模式
117
- this.started = true;
118
- console.log(`[P2PDirect:${this.name}] 启动 OK, publicKey: ${b4a.toString(this.swarm.keyPair.publicKey, 'hex').substring(0, 12)}...`);
119
- }
120
-
121
- async joinTopic(topic: Buffer | string): Promise<void> {
122
- if (!this.swarm) throw new Error('P2PDirect not started');
123
- const topicBuf = typeof topic === 'string' ? Buffer.from(topic) : topic;
124
- const topicHex = b4a.toString(topicBuf, 'hex');
125
- if (this.joinedTopics.has(topicHex)) return;
126
- const discovery = this.swarm.join(topicBuf, { server: true, client: true });
127
- await discovery.flushed();
128
- this.joinedTopics.add(topicHex);
129
- console.log(`[P2PDirect:${this.name}] 加入 topic: ${topicHex.substring(0, 16)}...`);
130
- }
131
-
132
- /** 广播数据给所有连接 */
133
- broadcast(data: Buffer | string): void {
134
- if (!this.swarm) return;
135
- const buf = typeof data === 'string' ? Buffer.from(data) : data;
136
- let count = 0;
137
- for (const conn of this.conns.values()) {
138
- try {
139
- if (!conn.destroyed) {
140
- conn.write(buf);
141
- count++;
142
- }
143
- } catch (err) {
144
- // 忽略单条连接错误, 不影响广播
145
- }
146
- }
147
- if (count > 0) {
148
- console.log(`[P2PDirect:${this.name}] broadcast 写到 ${count} 个连接 (${buf.length} bytes)`);
149
- }
150
- }
151
-
152
- /** 主动 send 给单个 peer (已知 publicKey hex) */
153
- sendTo(publicKeyHex: string, data: Buffer | string): boolean {
154
- const conn = this.conns.get(publicKeyHex);
155
- if (!conn || conn.destroyed) return false;
156
- const buf = typeof data === 'string' ? Buffer.from(data) : data;
157
- try {
158
- conn.write(buf);
159
- return true;
160
- } catch {
161
- return false;
162
- }
163
- }
164
-
165
- /**
166
- * 2026-06-10: 真"主动发, 等握手完成"版本 — 修复好友申请 fire-and-forget bug.
167
- *
168
- * 之前的问题: server.ts:2914 `await swarm.joinPeer(...)` 只触发握手, conn 还没 push 进 this.conns,
169
- * 立即调 sendTo 找不到 conn → 静默返回 false → 消息扔进虚空.
170
- *
171
- * 现在: sendToWithWait 监听 'connection' 事件, 等到 targetPublicKey 真正出现在 this.conns,
172
- * 才 write; 超时返回 NO_CONN; 写失败返回 WRITE_FAIL; 成功返回 SENT.
173
- *
174
- * 上层调用: const r = await p2p.sendToWithWait(pk, rpc, 5000);
175
- * if (r !== 'SENT') return 502 给前端.
176
- */
177
- async sendToWithWait(
178
- publicKeyHex: string,
179
- data: Buffer | string,
180
- timeoutMs: number = 5000
181
- ): Promise<'SENT' | 'NO_CONN' | 'WRITE_FAIL'> {
182
- // 2026-06-11: 先主动触发 joinPeer, 否则 DHT 上对面可能没 push conn
183
- if (this.swarm) {
184
- try { await this.swarm.joinPeer(Buffer.from(publicKeyHex, 'hex')); } catch {}
185
- }
186
- // 1) 已有 conn → 立即试
187
- let conn = this.conns.get(publicKeyHex);
188
- if (!conn || conn.destroyed) {
189
- // 2) 等 'connection' 事件 (this.emit('connection', { remotePublicKey, conn }))
190
- const waitResult = await new Promise<'READY' | 'TIMEOUT'>((resolve) => {
191
- const timer = setTimeout(() => {
192
- this.off('connection', onConn);
193
- resolve('TIMEOUT');
194
- }, timeoutMs);
195
- const onConn = (evt: { remotePublicKey: string; conn: any }) => {
196
- if (evt.remotePublicKey === publicKeyHex) {
197
- clearTimeout(timer);
198
- this.off('connection', onConn);
199
- resolve('READY');
200
- }
201
- };
202
- this.on('connection', onConn);
203
- });
204
- if (waitResult === 'TIMEOUT') return 'NO_CONN';
205
- conn = this.conns.get(publicKeyHex);
206
- if (!conn || conn.destroyed) return 'NO_CONN'; // 双保险
207
- }
208
- const buf = typeof data === 'string' ? Buffer.from(data) : data;
209
- try {
210
- conn.write(buf);
211
- return 'SENT';
212
- } catch (err) {
213
- console.error(`[P2PDirect:${this.name}] sendToWithWait 写失败 (${publicKeyHex.substring(0,12)}...):`, (err as Error).message);
214
- return 'WRITE_FAIL';
215
- }
216
- }
217
-
218
- getPublicKey(): string {
219
- if (!this.swarm) return '';
220
- return b4a.toString(this.swarm.keyPair.publicKey, 'hex');
221
- }
222
-
223
- /** 当前 P2PDirect 用的 role (对应 secret 文件名) */
224
- getRole(): string {
225
- return this.role;
226
- }
227
-
228
- getConnectionCount(): number {
229
- return this.conns.size;
230
- }
231
-
232
- async stop(): Promise<void> {
233
- if (!this.swarm) return;
234
- await this.swarm.destroy();
235
- this.swarm = null;
236
- this.conns.clear();
237
- this.started = false;
238
- console.log(`[P2PDirect:${this.name}] 已停止`);
239
- }
240
- }
@@ -1,153 +0,0 @@
1
- /**
2
- * p2p-secret.ts — 持久化 P2PDirect 的 32-byte secretKey
3
- *
4
- * 为什么: hyperswarm 4.x 的 `new Hyperswarm()` 每次启动生成新 keyPair,
5
- * 导致 publicKey 变化, known_peers.json 里的 publicKey 全部失效.
6
- *
7
- * 修法: 把 32-byte secretKey 存到 ~/.bolloon/p2p-direct-secret-{role}.json,
8
- * 下次启动读出来, 用 noise-keypair 风格构造 { publicKey, secretKey } 喂给 Hyperswarm.
9
- * → 同一台机器 + 同一 role = 永远同一 publicKey.
10
- *
11
- * 文件格式: { version: 1, role, secretKey: hex64, publicKey: hex64, createdAt, lastUsedAt }
12
- *
13
- * role 来源: process.env.IROH_ROLE 或 process.env.BOLLOON_ROLE 或 'default'
14
- */
15
- import * as fs from 'fs/promises';
16
- import * as path from 'path';
17
- import * as os from 'os';
18
- import * as crypto from 'crypto';
19
-
20
- const SECRET_DIR = process.env.BOLLOON_HOME || path.join(os.homedir(), '.bolloon');
21
-
22
- export interface P2PSecret {
23
- version: 1;
24
- role: string;
25
- secretKey: string; // 64 char hex (32 bytes) — noise-keypair seed
26
- publicKey: string; // 64 char hex (32 bytes) — 由 hyperswarm 算出后写回
27
- createdAt: string;
28
- lastUsedAt: string;
29
- }
30
-
31
- function resolveRole(): string {
32
- return (
33
- process.env.IROH_ROLE ||
34
- process.env.BOLLOON_ROLE ||
35
- 'default'
36
- );
37
- }
38
-
39
- function fileForRole(role: string): string {
40
- return path.join(SECRET_DIR, `p2p-direct-secret-${role}.json`);
41
- }
42
-
43
- async function ensureDir(): Promise<void> {
44
- await fs.mkdir(SECRET_DIR, { recursive: true });
45
- }
46
-
47
- /**
48
- * 读取/生成 持久化的 keyPair.
49
- *
50
- * 首次启动 → 生成 32 字节随机 secretKey, 存盘 (publicKey 留空, 待 P2PDirect 写回)
51
- * 之后启动 → 读 secretKey, 信任文件里存的 publicKey
52
- *
53
- * @param roleOverride 可显式覆盖 role (不传时读 IROH_ROLE)
54
- * @returns { publicKey, secretKey, role } 全部 hex string
55
- */
56
- export async function loadOrCreateKeyPair(roleOverride?: string): Promise<{
57
- publicKey: string;
58
- secretKey: string;
59
- role: string;
60
- }> {
61
- const role = roleOverride || resolveRole();
62
- const file = fileForRole(role);
63
-
64
- try {
65
- const raw = await fs.readFile(file, 'utf-8');
66
- const existing: P2PSecret = JSON.parse(raw);
67
- if (
68
- existing.version === 1 &&
69
- typeof existing.secretKey === 'string' &&
70
- existing.secretKey.length === 64
71
- ) {
72
- const sk = Buffer.from(existing.secretKey, 'hex');
73
- if (sk.length === 32) {
74
- existing.lastUsedAt = new Date().toISOString();
75
- await ensureDir();
76
- await fs.writeFile(file, JSON.stringify(existing, null, 2), 'utf-8');
77
- return {
78
- publicKey: existing.publicKey || '',
79
- secretKey: existing.secretKey,
80
- role: existing.role,
81
- };
82
- }
83
- }
84
- console.warn(`[p2p-secret] ${file} 格式无效, 重新生成`);
85
- } catch (err: any) {
86
- if (err.code !== 'ENOENT') {
87
- console.warn(`[p2p-secret] 读 ${file} 失败: ${err.message}, 重新生成`);
88
- }
89
- }
90
-
91
- // 首次生成 — publicKey 留空, 等 P2PDirect.start() 拿到真公钥后写回
92
- const secretKeyBuf = crypto.randomBytes(32);
93
- const now = new Date().toISOString();
94
- const fresh: P2PSecret = {
95
- version: 1,
96
- role,
97
- secretKey: secretKeyBuf.toString('hex'),
98
- publicKey: '', // P2PDirect.start() 后由 writebackPublicKey 填
99
- createdAt: now,
100
- lastUsedAt: now,
101
- };
102
- await ensureDir();
103
- await fs.writeFile(file, JSON.stringify(fresh, null, 2), 'utf-8');
104
- console.log(`[p2p-secret] 新生成 keyPair (role=${role}, publicKey 待算), 存到 ${file}`);
105
- return { publicKey: fresh.publicKey, secretKey: fresh.secretKey, role };
106
- }
107
-
108
- /**
109
- * P2PDirect 启动后, 把 hyperswarm 算出的真实 publicKey 写回文件
110
- * (因为我们用 noise-keypair 风格 seed, 真正的公钥只能 Hyperswarm 算).
111
- */
112
- export async function writebackPublicKey(
113
- role: string,
114
- secretKey: string,
115
- realPublicKey: string
116
- ): Promise<void> {
117
- const file = fileForRole(role);
118
- let existing: P2PSecret | null = null;
119
- try {
120
- const raw = await fs.readFile(file, 'utf-8');
121
- existing = JSON.parse(raw);
122
- } catch {}
123
- const data: P2PSecret = existing && existing.version === 1 && existing.secretKey === secretKey
124
- ? { ...existing, publicKey: realPublicKey, lastUsedAt: new Date().toISOString() }
125
- : {
126
- version: 1,
127
- role,
128
- secretKey,
129
- publicKey: realPublicKey,
130
- createdAt: new Date().toISOString(),
131
- lastUsedAt: new Date().toISOString(),
132
- };
133
- await ensureDir();
134
- await fs.writeFile(file, JSON.stringify(data, null, 2), 'utf-8');
135
- console.log(`[p2p-secret] (${role}) publicKey 写回: ${realPublicKey.substring(0, 12)}...`);
136
- }
137
-
138
- /** 删掉 (供调试 / "重置身份" 用) */
139
- export async function resetSecret(roleOverride?: string): Promise<void> {
140
- const role = roleOverride || resolveRole();
141
- const file = fileForRole(role);
142
- try {
143
- await fs.unlink(file);
144
- console.log(`[p2p-secret] 删除 ${file}`);
145
- } catch (err: any) {
146
- if (err.code !== 'ENOENT') throw err;
147
- }
148
- }
149
-
150
- /** 当前 role 对应的 secret 文件路径 (供 server 暴露) */
151
- export function secretPathForRole(roleOverride?: string): string {
152
- return fileForRole(roleOverride || resolveRole());
153
- }