@bolloon/bolloon-agent 0.1.36 → 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 (530) hide show
  1. package/dist/web/client.js +2861 -3746
  2. package/dist/web/components/p2p/index.js +226 -264
  3. package/dist/web/ui/message-renderer.js +323 -434
  4. package/dist/web/ui/step-timeline.js +255 -351
  5. package/package.json +2 -2
  6. package/.auto-evolve-calls +0 -1
  7. package/.last-auto-evolve-baseline +0 -1
  8. package/.playwright-mcp/page-2026-06-16T07-51-45-706Z.yml +0 -130
  9. package/.playwright-mcp/page-2026-06-16T07-56-44-116Z.yml +0 -131
  10. package/Bolloon.md +0 -144
  11. package/Dive-into/CITATION.cff +0 -17
  12. package/Dive-into/LICENSE +0 -25
  13. package/Dive-into/README.md +0 -598
  14. package/Dive-into/README_zh.md +0 -599
  15. package/Dive-into/assets/context.png +0 -0
  16. package/Dive-into/assets/extensibility.png +0 -0
  17. package/Dive-into/assets/iteration.png +0 -0
  18. package/Dive-into/assets/layered_architecture.png +0 -0
  19. package/Dive-into/assets/main_structure.png +0 -0
  20. package/Dive-into/assets/permission.png +0 -0
  21. package/Dive-into/assets/session_compact.png +0 -0
  22. package/Dive-into/assets/subagent.png +0 -0
  23. package/Dive-into/paper/Dive_into_Claude_Code.pdf +0 -0
  24. package/dist/agents/constraint-layer.js.map +0 -1
  25. package/dist/agents/pi-sdk.js.map +0 -1
  26. package/dist/agents/workflow-engine.js.map +0 -1
  27. package/dist/bollharness/src/index.js +0 -5
  28. package/dist/bollharness/src/scripts/checks/check_adr_plan_numbering.js +0 -6
  29. package/dist/bollharness/src/scripts/checks/check_api_types.js +0 -45
  30. package/dist/bollharness/src/scripts/checks/check_artifact_link.js +0 -146
  31. package/dist/bollharness/src/scripts/checks/check_bridge_deps.js +0 -6
  32. package/dist/bollharness/src/scripts/checks/check_bugfix_binding.js +0 -6
  33. package/dist/bollharness/src/scripts/checks/check_bugfix_binding_ci.js +0 -6
  34. package/dist/bollharness/src/scripts/checks/check_doc_file_references.js +0 -6
  35. package/dist/bollharness/src/scripts/checks/check_doc_freshness.js +0 -135
  36. package/dist/bollharness/src/scripts/checks/check_doc_links.js +0 -31
  37. package/dist/bollharness/src/scripts/checks/check_file_existence_claims.js +0 -6
  38. package/dist/bollharness/src/scripts/checks/check_fragment_integrity.js +0 -34
  39. package/dist/bollharness/src/scripts/checks/check_hook_installed.js +0 -63
  40. package/dist/bollharness/src/scripts/checks/check_issue_closure.js +0 -41
  41. package/dist/bollharness/src/scripts/checks/check_mcp_parity.js +0 -6
  42. package/dist/bollharness/src/scripts/checks/check_security.js +0 -48
  43. package/dist/bollharness/src/scripts/checks/check_skill_parity.js +0 -6
  44. package/dist/bollharness/src/scripts/checks/check_versions.js +0 -6
  45. package/dist/bollharness/src/scripts/checks/finding.js +0 -13
  46. package/dist/bollharness/src/scripts/checks/next_decision_number.js +0 -20
  47. package/dist/bollharness/src/scripts/checks/regenerate_magic_docs.js +0 -6
  48. package/dist/bollharness/src/scripts/ci/detect_rebaseline_triggers.js +0 -8
  49. package/dist/bollharness/src/scripts/ci/scan_subprocess_cfg.js +0 -8
  50. package/dist/bollharness/src/scripts/ci/scan_verify_artifacts.js +0 -8
  51. package/dist/bollharness/src/scripts/ci/scan_yaml_schema.js +0 -8
  52. package/dist/bollharness/src/scripts/context_router.js +0 -67
  53. package/dist/bollharness/src/scripts/deploy-guard.js +0 -157
  54. package/dist/bollharness/src/scripts/guard-feedback.js +0 -192
  55. package/dist/bollharness/src/scripts/guard_router.js +0 -158
  56. package/dist/bollharness/src/scripts/hooks/_hook_output.js +0 -6
  57. package/dist/bollharness/src/scripts/hooks/auto-python3.js +0 -6
  58. package/dist/bollharness/src/scripts/hooks/deploy-progress-on-session-end.js +0 -6
  59. package/dist/bollharness/src/scripts/hooks/failure-analyzer.js +0 -6
  60. package/dist/bollharness/src/scripts/hooks/gate-judgment-inject.js +0 -92
  61. package/dist/bollharness/src/scripts/hooks/gate-transition-judgment.js +0 -63
  62. package/dist/bollharness/src/scripts/hooks/inbox-ack.js +0 -6
  63. package/dist/bollharness/src/scripts/hooks/inbox-inject-on-start.js +0 -6
  64. package/dist/bollharness/src/scripts/hooks/inbox-validate.js +0 -6
  65. package/dist/bollharness/src/scripts/hooks/inbox-write-ledger.js +0 -6
  66. package/dist/bollharness/src/scripts/hooks/initializer-agent.js +0 -6
  67. package/dist/bollharness/src/scripts/hooks/loop-detection.js +0 -73
  68. package/dist/bollharness/src/scripts/hooks/owner-guard.js +0 -6
  69. package/dist/bollharness/src/scripts/hooks/precompact.js +0 -6
  70. package/dist/bollharness/src/scripts/hooks/review-agent-gatekeeper.js +0 -6
  71. package/dist/bollharness/src/scripts/hooks/risk-tracker.js +0 -108
  72. package/dist/bollharness/src/scripts/hooks/sanitize-on-read.js +0 -6
  73. package/dist/bollharness/src/scripts/hooks/session-reflection.js +0 -7
  74. package/dist/bollharness/src/scripts/hooks/session-start-magic-docs.js +0 -7
  75. package/dist/bollharness/src/scripts/hooks/session-start-reset-risk.js +0 -7
  76. package/dist/bollharness/src/scripts/hooks/session-start-toolkit-reminder.js +0 -7
  77. package/dist/bollharness/src/scripts/hooks/stop-evaluator.js +0 -157
  78. package/dist/bollharness/src/scripts/hooks/tool-call-counter.js +0 -6
  79. package/dist/bollharness/src/scripts/hooks/trace-analyzer.js +0 -10
  80. package/dist/bollharness/src/scripts/install/install-trust-token.js +0 -7
  81. package/dist/bollharness/src/scripts/install/multi_project_registry.js +0 -9
  82. package/dist/bollharness/src/scripts/install/phase2_auto.js +0 -21
  83. package/dist/bollharness/src/scripts/install/pre_commit_installer.js +0 -6
  84. package/dist/bollharness/src/scripts/install/tier_selector.js +0 -7
  85. package/dist/bollharness/src/scripts/install/transcript_miner.js +0 -7
  86. package/dist/bollharness/src/scripts/lib/claim_patterns.js +0 -10
  87. package/dist/bollharness/src/scripts/lib/sanitize_patterns.js +0 -12
  88. package/dist/bollharness/src/scripts/sanitize.js +0 -6
  89. package/dist/bollharness-integration/context-router-judgment.js.map +0 -1
  90. package/dist/bollharness-integration/context-router.js.map +0 -1
  91. package/dist/bollharness-integration/gate-state-machine.js.map +0 -1
  92. package/dist/bollharness-integration/gate-transition-hooks.js.map +0 -1
  93. package/dist/bollharness-integration/guard-checker.js.map +0 -1
  94. package/dist/bollharness-integration/index.js.map +0 -1
  95. package/dist/bollharness-integration/integration.js.map +0 -1
  96. package/dist/bollharness-integration/llm/pi-ai.d.ts +0 -60
  97. package/dist/bollharness-integration/pi-ecosystem-colony/index.d.ts +0 -153
  98. package/dist/bollharness-integration/pi-ecosystem-goals/index.d.ts +0 -136
  99. package/dist/bollharness-integration/pi-ecosystem-judgment/decision.d.ts +0 -117
  100. package/dist/bollharness-integration/pi-ecosystem-judgment/distillation.d.ts +0 -78
  101. package/dist/bollharness-integration/pi-ecosystem-judgment/index.d.ts +0 -139
  102. package/dist/bollharness-integration/pi-ecosystem-mcp/index.d.ts +0 -127
  103. package/dist/bollharness-integration/pi-ecosystem-subagents/index.d.ts +0 -95
  104. package/dist/bollharness-integration/skill-adapter.js.map +0 -1
  105. package/dist/constraint-runtime/src/_archive_helper.js +0 -9
  106. package/dist/constraint-runtime/src/agent/coordinator.js +0 -48
  107. package/dist/constraint-runtime/src/agent/index.js +0 -1
  108. package/dist/constraint-runtime/src/assistant/index.js +0 -12
  109. package/dist/constraint-runtime/src/bootstrap/index.js +0 -12
  110. package/dist/constraint-runtime/src/bootstrap_graph.js +0 -13
  111. package/dist/constraint-runtime/src/bridge/index.js +0 -12
  112. package/dist/constraint-runtime/src/buddy/index.js +0 -12
  113. package/dist/constraint-runtime/src/cli/index.js +0 -12
  114. package/dist/constraint-runtime/src/command_graph.js +0 -10
  115. package/dist/constraint-runtime/src/commands.js +0 -60
  116. package/dist/constraint-runtime/src/components/index.js +0 -12
  117. package/dist/constraint-runtime/src/constants/index.js +0 -12
  118. package/dist/constraint-runtime/src/constraint/budget.js +0 -22
  119. package/dist/constraint-runtime/src/constraint/budget.js.map +0 -1
  120. package/dist/constraint-runtime/src/constraint/index.js +0 -2
  121. package/dist/constraint-runtime/src/constraint/permission.js +0 -20
  122. package/dist/constraint-runtime/src/constraint/permission.js.map +0 -1
  123. package/dist/constraint-runtime/src/context.js +0 -30
  124. package/dist/constraint-runtime/src/coordinator/index.js +0 -12
  125. package/dist/constraint-runtime/src/cost_hook.js +0 -4
  126. package/dist/constraint-runtime/src/cost_tracker.js +0 -8
  127. package/dist/constraint-runtime/src/deferred_init.js +0 -10
  128. package/dist/constraint-runtime/src/direct_modes.js +0 -6
  129. package/dist/constraint-runtime/src/dynamic-tool-loader.js +0 -85
  130. package/dist/constraint-runtime/src/entrypoints/index.js +0 -12
  131. package/dist/constraint-runtime/src/execution_registry.js +0 -44
  132. package/dist/constraint-runtime/src/history.js +0 -9
  133. package/dist/constraint-runtime/src/hooks/index.js +0 -12
  134. package/dist/constraint-runtime/src/index.js +0 -26
  135. package/dist/constraint-runtime/src/ink.js +0 -4
  136. package/dist/constraint-runtime/src/keybindings/index.js +0 -12
  137. package/dist/constraint-runtime/src/memdir/index.js +0 -12
  138. package/dist/constraint-runtime/src/migrations/index.js +0 -12
  139. package/dist/constraint-runtime/src/models.js +0 -1
  140. package/dist/constraint-runtime/src/models.js.map +0 -1
  141. package/dist/constraint-runtime/src/moreright/index.js +0 -12
  142. package/dist/constraint-runtime/src/native_ts/index.js +0 -12
  143. package/dist/constraint-runtime/src/output_styles/index.js +0 -12
  144. package/dist/constraint-runtime/src/parity_audit.js +0 -12
  145. package/dist/constraint-runtime/src/plugins/index.js +0 -12
  146. package/dist/constraint-runtime/src/port_manifest.js +0 -11
  147. package/dist/constraint-runtime/src/prefetch.js +0 -9
  148. package/dist/constraint-runtime/src/query.js +0 -1
  149. package/dist/constraint-runtime/src/remote/index.js +0 -12
  150. package/dist/constraint-runtime/src/remote_runtime.js +0 -9
  151. package/dist/constraint-runtime/src/runtime/index.js +0 -1
  152. package/dist/constraint-runtime/src/runtime/session.js +0 -35
  153. package/dist/constraint-runtime/src/schemas/index.js +0 -12
  154. package/dist/constraint-runtime/src/screens/index.js +0 -12
  155. package/dist/constraint-runtime/src/server/index.js +0 -12
  156. package/dist/constraint-runtime/src/services/index.js +0 -12
  157. package/dist/constraint-runtime/src/session_store.js +0 -22
  158. package/dist/constraint-runtime/src/setup.js +0 -30
  159. package/dist/constraint-runtime/src/skills/index.js +0 -1
  160. package/dist/constraint-runtime/src/skills/skill-registry.js +0 -28
  161. package/dist/constraint-runtime/src/state/index.js +0 -12
  162. package/dist/constraint-runtime/src/system_init.js +0 -20
  163. package/dist/constraint-runtime/src/thinking/engine.js +0 -42
  164. package/dist/constraint-runtime/src/thinking/index.js +0 -1
  165. package/dist/constraint-runtime/src/tool_pool.js +0 -8
  166. package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +0 -7
  167. package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +0 -7
  168. package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +0 -7
  169. package/dist/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.js +0 -6
  170. package/dist/constraint-runtime/src/tools/PolymarketSDK/createOrder.js +0 -6
  171. package/dist/constraint-runtime/src/tools/PolymarketSDK/getMarket.js +0 -5
  172. package/dist/constraint-runtime/src/tools/PolymarketSDK/getOrders.js +0 -6
  173. package/dist/constraint-runtime/src/tools/PolymarketSDK/listMarkets.js +0 -4
  174. package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +0 -6
  175. package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +0 -8
  176. package/dist/constraint-runtime/src/tools/SafeSDK/deploySafe.js +0 -6
  177. package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +0 -6
  178. package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +0 -6
  179. package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +0 -6
  180. package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +0 -6
  181. package/dist/constraint-runtime/src/tools/WalletTools/autoPay.js +0 -29
  182. package/dist/constraint-runtime/src/tools/WalletTools/createWallet.js +0 -10
  183. package/dist/constraint-runtime/src/tools/WalletTools/getBalance.js +0 -13
  184. package/dist/constraint-runtime/src/tools/WalletTools/importWallet.js +0 -22
  185. package/dist/constraint-runtime/src/tools/WalletTools/sendTransaction.js +0 -25
  186. package/dist/constraint-runtime/src/tools/WalletTools/signMessage.js +0 -10
  187. package/dist/constraint-runtime/src/tools/WalletTools/transferToken.js +0 -25
  188. package/dist/constraint-runtime/src/tools.js +0 -80
  189. package/dist/constraint-runtime/src/transcript.js +0 -19
  190. package/dist/constraint-runtime/src/types/index.js +0 -12
  191. package/dist/constraint-runtime/src/upstream_proxy/index.js +0 -12
  192. package/dist/constraint-runtime/src/utils/index.js +0 -12
  193. package/dist/constraint-runtime/src/vim/index.js +0 -12
  194. package/dist/constraint-runtime/src/voice/index.js +0 -12
  195. package/dist/constraints/index.js.map +0 -1
  196. package/dist/documents/reader.js.map +0 -1
  197. package/dist/llm/config-store.js.map +0 -1
  198. package/dist/llm/pi-ai.js.map +0 -1
  199. package/dist/network/agent-network.js.map +0 -1
  200. package/dist/network/iroh-integration.js.map +0 -1
  201. package/dist/network/iroh-transport.js.map +0 -1
  202. package/dist/network/p2p.js.map +0 -1
  203. package/dist/network/storage/adapters/json-adapter.js.map +0 -1
  204. package/dist/pi-ecosystem-colony/index.js.map +0 -1
  205. package/dist/pi-ecosystem-goals/index.js.map +0 -1
  206. package/dist/pi-ecosystem-judgment/decision.js.map +0 -1
  207. package/dist/pi-ecosystem-judgment/distillation.js.map +0 -1
  208. package/dist/pi-ecosystem-judgment/human-value-store.js.map +0 -1
  209. package/dist/pi-ecosystem-judgment/index.js.map +0 -1
  210. package/dist/pi-ecosystem-judgment/value-injection.js.map +0 -1
  211. package/dist/pi-ecosystem-mcp/index.js.map +0 -1
  212. package/dist/pi-ecosystem-subagents/index.js.map +0 -1
  213. package/dist/social/ant-colony/AdaptiveHeartbeat.js.map +0 -1
  214. package/dist/social/ant-colony/PheromoneEngine.js.map +0 -1
  215. package/dist/social/ant-colony/types.js.map +0 -1
  216. package/dist/social/channels/ChannelManager.js.map +0 -1
  217. package/dist/social/channels/DiapChannelBridge.js.map +0 -1
  218. package/dist/social/channels/InterestMatcher.js.map +0 -1
  219. package/dist/social/channels/types.js.map +0 -1
  220. package/dist/social/global-shared-context.js.map +0 -1
  221. package/dist/social/heartbeat.js.map +0 -1
  222. package/dist/web/components/p2p/P2PModal.js +0 -188
  223. package/dist/web/components/p2p/p2p-modal.js +0 -657
  224. package/dist/web/components/p2p/p2p-tools.js +0 -248
  225. package/lefthook.yml +0 -33
  226. package/scripts/auto-evolve-loop.ts +0 -481
  227. package/scripts/auto-evolve-oneshot.sh +0 -155
  228. package/scripts/auto-evolve-snapshot.sh +0 -136
  229. package/scripts/build-cli.js +0 -216
  230. package/scripts/build-web.ts +0 -116
  231. package/scripts/detect-schema-changes.sh +0 -48
  232. package/scripts/diff-reviewer.ts +0 -159
  233. package/scripts/postinstall.js +0 -153
  234. package/scripts/validate-system-prompt.ts +0 -142
  235. package/scripts/weekly-report.ts +0 -364
  236. package/src/agents/agent-manifest-protocol.ts +0 -117
  237. package/src/agents/constraint-layer.ts +0 -309
  238. package/src/agents/iroh-secret.ts +0 -32
  239. package/src/agents/p2p-chat-tools.ts +0 -383
  240. package/src/agents/p2p-document-tools.ts +0 -347
  241. package/src/agents/permission-mode.ts +0 -127
  242. package/src/agents/pi-sdk.ts +0 -2895
  243. package/src/agents/pre-tool-validator.ts +0 -213
  244. package/src/agents/protocol.ts +0 -398
  245. package/src/agents/shell-guard.ts +0 -417
  246. package/src/agents/shell-tool.ts +0 -103
  247. package/src/agents/skill-loader.ts +0 -202
  248. package/src/agents/subagent-manager.ts +0 -553
  249. package/src/agents/workflow-engine.ts +0 -332
  250. package/src/agents/workflow-pivot-loop.ts +0 -766
  251. package/src/bollharness/.sanitize-report.json +0 -13
  252. package/src/bollharness/CLAUDE.md +0 -73
  253. package/src/bollharness/LICENSE +0 -21
  254. package/src/bollharness/README.md +0 -143
  255. package/src/bollharness/README.zh-CN.md +0 -131
  256. package/src/bollharness/package.json +0 -20
  257. package/src/bollharness/reference/SOURCE-COMMIT.txt +0 -3
  258. package/src/bollharness/reference/boll-reference/scripts/hooks/.sanitize-report.json +0 -12
  259. package/src/bollharness/reference/boll-reference/scripts/hooks/find-boll-root.sh +0 -27
  260. package/src/bollharness/reference/boll-reference/scripts/hooks/precompact.sh +0 -57
  261. package/src/bollharness/reference/boll-reference/scripts/hooks/stop-evaluator.md +0 -57
  262. package/src/bollharness/schemas/metrics-jsonl-allowlist.json +0 -67
  263. package/src/bollharness/scripts/checks/next_decision_number.sh +0 -48
  264. package/src/bollharness/scripts/ci/count-components.sh +0 -65
  265. package/src/bollharness/scripts/context-fragments/artifact-linkage.md +0 -14
  266. package/src/bollharness/scripts/context-fragments/auth-consumers.md +0 -17
  267. package/src/bollharness/scripts/context-fragments/bridge-constitution.md +0 -13
  268. package/src/bollharness/scripts/context-fragments/catalyst-distributed.md +0 -18
  269. package/src/bollharness/scripts/context-fragments/closure-checklist.md +0 -13
  270. package/src/bollharness/scripts/context-fragments/contract-consumers.md +0 -15
  271. package/src/bollharness/scripts/context-fragments/db-shared-structures.md +0 -15
  272. package/src/bollharness/scripts/context-fragments/fixed-three-layers.md +0 -19
  273. package/src/bollharness/scripts/context-fragments/general-dev-principles.md +0 -11
  274. package/src/bollharness/scripts/context-fragments/issue-first.md +0 -8
  275. package/src/bollharness/scripts/context-fragments/mcp-parity.md +0 -16
  276. package/src/bollharness/scripts/context-fragments/pi-agent-operations.md +0 -108
  277. package/src/bollharness/scripts/context-fragments/protocol-consumers.md +0 -15
  278. package/src/bollharness/scripts/context-fragments/run-events-consumers.md +0 -15
  279. package/src/bollharness/scripts/context-fragments/scene-fidelity.md +0 -13
  280. package/src/bollharness/scripts/context-fragments/truth-source-hierarchy.md +0 -15
  281. package/src/bollharness/scripts/context-fragments/two-language.md +0 -15
  282. package/src/bollharness/scripts/context-fragments/version-sources.md +0 -14
  283. package/src/bollharness/scripts/hooks/find-project-root.sh +0 -47
  284. package/src/bollharness/scripts/hooks/inbox-poll.sh +0 -78
  285. package/src/bollharness/scripts/hooks/precompact.sh +0 -56
  286. package/src/bollharness/scripts/hooks/stop-evaluator.md +0 -83
  287. package/src/bollharness/scripts/sync-from-upstream.sh +0 -281
  288. package/src/bollharness/src/index.ts +0 -5
  289. package/src/bollharness/src/scripts/checks/check_adr_plan_numbering.ts +0 -11
  290. package/src/bollharness/src/scripts/checks/check_api_types.ts +0 -52
  291. package/src/bollharness/src/scripts/checks/check_artifact_link.ts +0 -156
  292. package/src/bollharness/src/scripts/checks/check_bridge_deps.ts +0 -11
  293. package/src/bollharness/src/scripts/checks/check_bugfix_binding.ts +0 -11
  294. package/src/bollharness/src/scripts/checks/check_bugfix_binding_ci.ts +0 -11
  295. package/src/bollharness/src/scripts/checks/check_doc_file_references.ts +0 -11
  296. package/src/bollharness/src/scripts/checks/check_doc_freshness.ts +0 -141
  297. package/src/bollharness/src/scripts/checks/check_doc_links.ts +0 -36
  298. package/src/bollharness/src/scripts/checks/check_file_existence_claims.ts +0 -11
  299. package/src/bollharness/src/scripts/checks/check_fragment_integrity.ts +0 -40
  300. package/src/bollharness/src/scripts/checks/check_hook_installed.ts +0 -70
  301. package/src/bollharness/src/scripts/checks/check_issue_closure.ts +0 -51
  302. package/src/bollharness/src/scripts/checks/check_mcp_parity.ts +0 -11
  303. package/src/bollharness/src/scripts/checks/check_security.ts +0 -54
  304. package/src/bollharness/src/scripts/checks/check_skill_parity.ts +0 -11
  305. package/src/bollharness/src/scripts/checks/check_versions.ts +0 -11
  306. package/src/bollharness/src/scripts/checks/finding.ts +0 -35
  307. package/src/bollharness/src/scripts/checks/next_decision_number.ts +0 -24
  308. package/src/bollharness/src/scripts/checks/regenerate_magic_docs.ts +0 -11
  309. package/src/bollharness/src/scripts/ci/detect_rebaseline_triggers.ts +0 -14
  310. package/src/bollharness/src/scripts/ci/scan_subprocess_cfg.ts +0 -14
  311. package/src/bollharness/src/scripts/ci/scan_verify_artifacts.ts +0 -14
  312. package/src/bollharness/src/scripts/ci/scan_yaml_schema.ts +0 -14
  313. package/src/bollharness/src/scripts/context_router.ts +0 -76
  314. package/src/bollharness/src/scripts/deploy-guard.ts +0 -182
  315. package/src/bollharness/src/scripts/guard-feedback.ts +0 -215
  316. package/src/bollharness/src/scripts/guard_router.ts +0 -194
  317. package/src/bollharness/src/scripts/hooks/_hook_output.js +0 -3
  318. package/src/bollharness/src/scripts/hooks/_hook_output.ts +0 -11
  319. package/src/bollharness/src/scripts/hooks/auto-python3.ts +0 -10
  320. package/src/bollharness/src/scripts/hooks/deploy-progress-on-session-end.ts +0 -10
  321. package/src/bollharness/src/scripts/hooks/failure-analyzer.ts +0 -10
  322. package/src/bollharness/src/scripts/hooks/gate-judgment-inject.ts +0 -111
  323. package/src/bollharness/src/scripts/hooks/gate-transition-judgment.ts +0 -74
  324. package/src/bollharness/src/scripts/hooks/inbox-ack.ts +0 -10
  325. package/src/bollharness/src/scripts/hooks/inbox-inject-on-start.ts +0 -10
  326. package/src/bollharness/src/scripts/hooks/inbox-validate.ts +0 -10
  327. package/src/bollharness/src/scripts/hooks/inbox-write-ledger.ts +0 -10
  328. package/src/bollharness/src/scripts/hooks/initializer-agent.ts +0 -10
  329. package/src/bollharness/src/scripts/hooks/loop-detection.ts +0 -83
  330. package/src/bollharness/src/scripts/hooks/owner-guard.ts +0 -10
  331. package/src/bollharness/src/scripts/hooks/precompact.ts +0 -10
  332. package/src/bollharness/src/scripts/hooks/review-agent-gatekeeper.ts +0 -10
  333. package/src/bollharness/src/scripts/hooks/risk-tracker.ts +0 -121
  334. package/src/bollharness/src/scripts/hooks/sanitize-on-read.ts +0 -10
  335. package/src/bollharness/src/scripts/hooks/session-reflection.ts +0 -12
  336. package/src/bollharness/src/scripts/hooks/session-start-magic-docs.ts +0 -12
  337. package/src/bollharness/src/scripts/hooks/session-start-reset-risk.ts +0 -12
  338. package/src/bollharness/src/scripts/hooks/session-start-toolkit-reminder.ts +0 -12
  339. package/src/bollharness/src/scripts/hooks/stop-evaluator.ts +0 -164
  340. package/src/bollharness/src/scripts/hooks/tool-call-counter.ts +0 -10
  341. package/src/bollharness/src/scripts/hooks/trace-analyzer.ts +0 -14
  342. package/src/bollharness/src/scripts/install/install-trust-token.ts +0 -13
  343. package/src/bollharness/src/scripts/install/multi_project_registry.ts +0 -13
  344. package/src/bollharness/src/scripts/install/phase2_auto.ts +0 -28
  345. package/src/bollharness/src/scripts/install/pre_commit_installer.ts +0 -10
  346. package/src/bollharness/src/scripts/install/tier_selector.ts +0 -10
  347. package/src/bollharness/src/scripts/install/transcript_miner.ts +0 -13
  348. package/src/bollharness/src/scripts/lib/claim_patterns.ts +0 -11
  349. package/src/bollharness/src/scripts/lib/sanitize_patterns.ts +0 -13
  350. package/src/bollharness/src/scripts/sanitize.ts +0 -9
  351. package/src/bollharness/templates/persona/default.json +0 -19
  352. package/src/bollharness/templates/scaffold/.gitignore.append +0 -16
  353. package/src/bollharness/templates/scaffold/CLAUDE.md +0 -89
  354. package/src/bollharness-integration/channel-judgment-engine.ts +0 -634
  355. package/src/bollharness-integration/context-chain-router.ts +0 -474
  356. package/src/bollharness-integration/context-router-judgment.ts +0 -339
  357. package/src/bollharness-integration/context-router.ts +0 -583
  358. package/src/bollharness-integration/gate-state-machine.ts +0 -444
  359. package/src/bollharness-integration/gate-transition-hooks.ts +0 -137
  360. package/src/bollharness-integration/guard-checker.ts +0 -451
  361. package/src/bollharness-integration/index.ts +0 -195
  362. package/src/bollharness-integration/integration.ts +0 -538
  363. package/src/bollharness-integration/judgment-prompts.yaml +0 -535
  364. package/src/bollharness-integration/llm-judgment-engine.ts +0 -712
  365. package/src/bollharness-integration/skill-adapter.ts +0 -646
  366. package/src/bootstrap/bootstrap.ts +0 -135
  367. package/src/bootstrap/context-collector.ts +0 -371
  368. package/src/bootstrap/context-hierarchy.ts +0 -283
  369. package/src/bootstrap/lifecycle-hooks.ts +0 -289
  370. package/src/bootstrap/project-context.ts +0 -171
  371. package/src/cli/interface.ts +0 -211
  372. package/src/cli-entry.ts +0 -304
  373. package/src/constraints/index.ts +0 -6
  374. package/src/context-compaction/auto-compact.ts +0 -153
  375. package/src/context-compaction/budget-gate.ts +0 -32
  376. package/src/context-compaction/budget-reduce.ts +0 -37
  377. package/src/context-compaction/context-collapse.ts +0 -72
  378. package/src/context-compaction/index.ts +0 -24
  379. package/src/context-compaction/microcompact.ts +0 -54
  380. package/src/context-compaction/pipeline.ts +0 -133
  381. package/src/context-compaction/snip.ts +0 -51
  382. package/src/context-compaction/token-estimator.ts +0 -36
  383. package/src/context-compaction/types.ts +0 -99
  384. package/src/documents/reader.ts +0 -85
  385. package/src/documents/store.ts +0 -252
  386. package/src/electron-preload.ts +0 -25
  387. package/src/electron.ts +0 -200
  388. package/src/heartbeat/DaemonManager.ts +0 -283
  389. package/src/heartbeat/HealthMonitor.ts +0 -317
  390. package/src/heartbeat/StartupVerifier.ts +0 -223
  391. package/src/heartbeat/Watchdog.ts +0 -208
  392. package/src/heartbeat/index.ts +0 -109
  393. package/src/heartbeat/self-improve-bus.ts +0 -110
  394. package/src/heartbeat/types.ts +0 -82
  395. package/src/index.ts +0 -1724
  396. package/src/llm/audio-config-store.ts +0 -246
  397. package/src/llm/config-store.ts +0 -400
  398. package/src/llm/llm-judgment-client.ts +0 -471
  399. package/src/llm/pi-ai.ts +0 -653
  400. package/src/llm/system-prompt/health.ts +0 -159
  401. package/src/llm/system-prompt/layers/channel/local.md +0 -14
  402. package/src/llm/system-prompt/layers/channel/p2p-agent.md +0 -18
  403. package/src/llm/system-prompt/layers/channel/p2p-visitor.md +0 -19
  404. package/src/llm/system-prompt/layers/core/artifacts_storage.md +0 -89
  405. package/src/llm/system-prompt/layers/core/evenhandedness.md +0 -21
  406. package/src/llm/system-prompt/layers/core/hibs_reminders.md +0 -15
  407. package/src/llm/system-prompt/layers/core/identity.md +0 -37
  408. package/src/llm/system-prompt/layers/core/knowledge.md +0 -17
  409. package/src/llm/system-prompt/layers/core/memory_system.md +0 -12
  410. package/src/llm/system-prompt/layers/core/network_filesystem.md +0 -28
  411. package/src/llm/system-prompt/layers/core/refusal.md +0 -37
  412. package/src/llm/system-prompt/layers/core/tone.md +0 -31
  413. package/src/llm/system-prompt/layers/core/tools.thin.md +0 -13
  414. package/src/llm/system-prompt/layers/core/wellbeing.md +0 -41
  415. package/src/llm/system-prompt/layers/role/architect.md +0 -20
  416. package/src/llm/system-prompt/layers/role/expert.md +0 -19
  417. package/src/llm/system-prompt/layers/role/implementer.md +0 -15
  418. package/src/llm/system-prompt/layers/role/security.md +0 -15
  419. package/src/llm/system-prompt/layers/tool/artifacts.md +0 -72
  420. package/src/llm/system-prompt/layers/tool/bash.md +0 -25
  421. package/src/llm/system-prompt/layers/tool/hibs_api.md +0 -171
  422. package/src/llm/system-prompt/layers/tool/image_search.md +0 -70
  423. package/src/llm/system-prompt/layers/tool/manifest.md +0 -89
  424. package/src/llm/system-prompt/layers/tool/mcp_apps.md +0 -53
  425. package/src/llm/system-prompt/layers/tool/web_search.md +0 -83
  426. package/src/llm/system-prompt/registry.ts +0 -325
  427. package/src/llm/system-prompt/strip-hibsml.ts +0 -52
  428. package/src/llm/tool-manifest/ask_user_input.ts +0 -37
  429. package/src/llm/tool-manifest/bash.ts +0 -25
  430. package/src/llm/tool-manifest/create_file.ts +0 -26
  431. package/src/llm/tool-manifest/fetch_sports_data.ts +0 -28
  432. package/src/llm/tool-manifest/image_search.ts +0 -26
  433. package/src/llm/tool-manifest/index.ts +0 -88
  434. package/src/llm/tool-manifest/mcp.ts +0 -46
  435. package/src/llm/tool-manifest/message_compose.ts +0 -33
  436. package/src/llm/tool-manifest/places.ts +0 -86
  437. package/src/llm/tool-manifest/present_files.ts +0 -23
  438. package/src/llm/tool-manifest/recipe.ts +0 -42
  439. package/src/llm/tool-manifest/recommend_apps.ts +0 -25
  440. package/src/llm/tool-manifest/str_replace.ts +0 -29
  441. package/src/llm/tool-manifest/types.ts +0 -52
  442. package/src/llm/tool-manifest/view.ts +0 -26
  443. package/src/llm/tool-manifest/weather.ts +0 -29
  444. package/src/llm/tool-manifest/web.ts +0 -54
  445. package/src/llm/video-config-store.ts +0 -257
  446. package/src/network/agent-network.ts +0 -800
  447. package/src/network/hybrid-messenger.ts +0 -199
  448. package/src/network/iroh-bootstrap.ts +0 -57
  449. package/src/network/iroh-discovery.ts +0 -208
  450. package/src/network/iroh-integration.ts +0 -158
  451. package/src/network/iroh-transport.ts +0 -637
  452. package/src/network/known-peers.ts +0 -102
  453. package/src/network/p2p-direct.ts +0 -262
  454. package/src/network/p2p-secret.ts +0 -153
  455. package/src/network/p2p.ts +0 -964
  456. package/src/network/source-intent-broadcaster.ts +0 -242
  457. package/src/network/source-intent.ts +0 -167
  458. package/src/network/storage/adapters/json-adapter.ts +0 -454
  459. package/src/network/storage/index.ts +0 -203
  460. package/src/network/storage/types.ts +0 -166
  461. package/src/security/builtin-guards.ts +0 -162
  462. package/src/security/context-router-tool.ts +0 -122
  463. package/src/security/input-scanner.ts +0 -287
  464. package/src/security/react-harness.ts +0 -177
  465. package/src/security/tool-gate.ts +0 -294
  466. package/src/social/ant-colony/index.js +0 -19
  467. package/src/social/channels/ChannelManager.ts +0 -485
  468. package/src/social/channels/DiapChannelBridge.ts +0 -501
  469. package/src/social/channels/InterestMatcher.ts +0 -189
  470. package/src/social/channels/agent-workflow-config.json +0 -214
  471. package/src/social/channels/agent-workflow-config.yaml +0 -334
  472. package/src/social/channels/channel-agent-session.ts +0 -407
  473. package/src/social/channels/channel-heartbeat-agent.ts +0 -622
  474. package/src/social/channels/diap-doc-parser.ts +0 -282
  475. package/src/social/channels/harness-workflow-integrator.ts +0 -594
  476. package/src/social/channels/index.ts +0 -22
  477. package/src/social/channels/types.ts +0 -115
  478. package/src/social/global-shared-context.ts +0 -506
  479. package/src/social/heartbeat.ts +0 -1057
  480. package/src/social/persona/enhanced-persona.ts +0 -359
  481. package/src/types.d.ts +0 -12
  482. package/src/utils/auto-evolve-policy.ts +0 -138
  483. package/src/utils/auto-update.ts +0 -482
  484. package/src/utils/clamp.ts +0 -5
  485. package/src/web/agent-delegate-server.ts +0 -148
  486. package/src/web/api-config.html +0 -520
  487. package/src/web/client.js +0 -2352
  488. package/src/web/client.ts +0 -4326
  489. package/src/web/components/p2p/P2PModal.tsx +0 -416
  490. package/src/web/components/p2p/index.ts +0 -566
  491. package/src/web/components/p2p/index.tsx +0 -297
  492. package/src/web/components/p2p/p2p-connection.ts +0 -338
  493. package/src/web/components/p2p/p2p-identity.ts +0 -92
  494. package/src/web/components/p2p/p2p-manager.ts +0 -147
  495. package/src/web/components/p2p/p2p-messages.ts +0 -219
  496. package/src/web/components/p2p/p2p-modal.ts +0 -685
  497. package/src/web/components/p2p/p2p-store-memory.ts +0 -162
  498. package/src/web/components/p2p/p2p-tools.ts +0 -315
  499. package/src/web/components/p2p/types.ts +0 -170
  500. package/src/web/components/wallet-viem.mjs +0 -118
  501. package/src/web/design.md +0 -99
  502. package/src/web/icons/apple-touch-icon.png +0 -0
  503. package/src/web/icons/favicon-16x16.png +0 -0
  504. package/src/web/icons/favicon-192x192.png +0 -0
  505. package/src/web/icons/favicon-32x32.png +0 -0
  506. package/src/web/icons/favicon-48x48.png +0 -0
  507. package/src/web/icons/favicon-512x512.png +0 -0
  508. package/src/web/icons/favicon.icns +0 -0
  509. package/src/web/icons/favicon.ico +0 -0
  510. package/src/web/icons/icon.png +0 -0
  511. package/src/web/icons/image.png +0 -0
  512. package/src/web/index.html +0 -373
  513. package/src/web/iroh-delegate-transport.ts +0 -139
  514. package/src/web/manifest.json +0 -21
  515. package/src/web/server.ts +0 -5731
  516. package/src/web/style.css +0 -4737
  517. package/src/web/ui/message-renderer.ts +0 -540
  518. package/src/web/ui/step-timeline.ts +0 -394
  519. package/staging/auto-evolve/clean-001/.review-verdict +0 -9
  520. package/staging/auto-evolve/clean-001/clean-001.patch +0 -14
  521. package/staging/auto-evolve/e2e-001/.patch-id +0 -1
  522. package/staging/auto-evolve/e2e-001/.review-verdict +0 -12
  523. package/staging/auto-evolve/e2e-001/e2e-001.patch +0 -11
  524. package/staging/auto-evolve/test-bad/.review-verdict +0 -12
  525. package/staging/auto-evolve/test-bad/test-bad.patch +0 -11
  526. package/test-results/.last-run.json +0 -6
  527. package/test-results/src-test-web-loop-status-b-5734c-atus-bar-/346/230/276/347/244/272-spinner-/344/270/215/346/230/276/347/244/272/345/276/252/347/216/257/350/256/241/346/225/260/error-context.md +0 -285
  528. package/tsconfig.cli.json +0 -16
  529. package/tsconfig.electron.json +0 -20
  530. package/tsconfig.json +0 -18
@@ -1,1057 +0,0 @@
1
- import * as fs from 'fs/promises';
2
- import * as path from 'path';
3
- import * as crypto from 'crypto';
4
- // 2026-06-11: 蚁群模块 (PheromoneEngine / AdaptiveHeartbeat) 已被用户删除, 仅保留最小 stub
5
- // 让 heartbeat 内的 antColony 代码块继续类型合法, 但运行时所有方法都是 no-op
6
- class PheromoneEngine {
7
- async initialize() { /* stub */ }
8
- shutdown() { /* stub */ }
9
- getStats() { return { totalTrails: 0, avgStrength: 0, capabilityCount: 0, density: 0 }; }
10
- async deposit(_type: any, _from: string, _to: string, _strength: number, _meta?: any) { /* stub */ }
11
- }
12
- class AdaptiveHeartbeat {
13
- constructor(_opts: any) { /* stub */ }
14
- shutdown() { /* stub */ }
15
- decide() { return { interval: 0, priorityLevel: 'normal' }; }
16
- setPheromoneDensity(_d: number) { /* stub */ }
17
- recordActivity(_t: string) { /* stub */ }
18
- }
19
- enum PheromoneType {
20
- DISCOVERY = 'discovery',
21
- }
22
- import { ChannelManager } from './channels/ChannelManager.js';
23
- import { ChannelType } from './channels/types.js';
24
- import { DiapChannelBridge } from './channels/DiapChannelBridge.js';
25
- import { InterestMatcher } from './channels/InterestMatcher.js';
26
- import type { DiscoveredAgent } from './channels/types.js';
27
-
28
- // Re-export types for backward compatibility
29
- export type { DiscoveredAgent };
30
-
31
- export interface PersonaDoc {
32
- name: string;
33
- description: string;
34
- capabilities: string[];
35
- personality: string;
36
- greeting: string;
37
- interests: string[];
38
- soul?: string;
39
- traits?: string[];
40
- backstory?: string;
41
- memoryHistory?: MemoryEntry[];
42
- ipfsCid?: string;
43
- ipnsName?: string;
44
- createdAt: string;
45
- updatedAt: string;
46
- }
47
-
48
- export interface MemoryEntry {
49
- id: string;
50
- content: string;
51
- timestamp: string;
52
- importance: number;
53
- tags?: string[];
54
- }
55
-
56
- export interface SessionChannel {
57
- id: string;
58
- name: string;
59
- messages: SessionMessage[];
60
- createdAt: string;
61
- updatedAt: string;
62
- peerId?: string;
63
- peerDid?: string;
64
- peerName?: string;
65
- persona?: PersonaDoc;
66
- }
67
-
68
- export interface SessionMessage {
69
- id: string;
70
- type: 'user' | 'ai' | 'peer';
71
- content: string;
72
- sender: 'self' | 'peer';
73
- timestamp: string;
74
- agentId?: string;
75
- }
76
-
77
- const SHARED_SESSION_PATH = path.join(process.env.HOME || '/tmp', '.bolloon', 'sessions');
78
- const PERSONA_PATH = path.join(process.env.HOME || '/tmp', '.bolloon', 'persona.json');
79
- const DISCOVERED_AGENTS_PATH = path.join(SHARED_SESSION_PATH, 'discovered-agents.json');
80
-
81
- export interface SocialSessionProvider {
82
- getPersona(): PersonaDoc | null;
83
- addMessage(channelId: string, message: SessionMessage): Promise<void>;
84
- getChannelMessages(channelId: string): Promise<SessionMessage[]>;
85
- createChannel(name: string, peerInfo?: { peerId?: string; peerDid?: string; peerName?: string }, persona?: PersonaDoc): Promise<SessionChannel>;
86
- getOrCreatePeerChannel(peerDid: string, peerName: string, persona?: PersonaDoc): Promise<SessionChannel>;
87
- setChannelInfo(channelId: string, info: Partial<SessionChannel>): Promise<void>;
88
- getChannelPersona(channelId: string): PersonaDoc | undefined;
89
- setChannelPersona(channelId: string, persona: PersonaDoc): Promise<void>;
90
- getAllChannels(): SessionChannel[];
91
- }
92
-
93
- class LocalSessionManager implements SocialSessionProvider {
94
- private channels: Map<string, SessionChannel> = new Map();
95
- private channelsPath: string;
96
- private persona: PersonaDoc | null = null;
97
- private initialized: boolean = false;
98
-
99
- constructor() {
100
- this.channelsPath = path.join(SHARED_SESSION_PATH, 'local-channels.json');
101
- }
102
-
103
- async initialize(): Promise<void> {
104
- if (this.initialized) return;
105
- await fs.mkdir(SHARED_SESSION_PATH, { recursive: true });
106
- this.persona = await this.loadPersona();
107
- await this.loadChannels();
108
- this.initialized = true;
109
- }
110
-
111
- private async loadPersona(): Promise<PersonaDoc | null> {
112
- try {
113
- const data = await fs.readFile(PERSONA_PATH, 'utf-8');
114
- return JSON.parse(data) as PersonaDoc;
115
- } catch {
116
- return null;
117
- }
118
- }
119
-
120
- private async loadChannels(): Promise<void> {
121
- try {
122
- const data = await fs.readFile(this.channelsPath, 'utf-8');
123
- const channelsArray: SessionChannel[] = JSON.parse(data);
124
- this.channels.clear();
125
- for (const channel of channelsArray) {
126
- this.channels.set(channel.id, channel);
127
- }
128
- } catch {
129
- this.channels.clear();
130
- }
131
- }
132
-
133
- private async saveChannels(): Promise<void> {
134
- const channelsArray = Array.from(this.channels.values());
135
- await fs.writeFile(this.channelsPath, JSON.stringify(channelsArray, null, 2));
136
- }
137
-
138
- getPersona(): PersonaDoc | null {
139
- return this.persona;
140
- }
141
-
142
- async addMessage(channelId: string, message: SessionMessage): Promise<void> {
143
- await this.initialize();
144
-
145
- if (!this.channels.has(channelId)) {
146
- this.channels.set(channelId, {
147
- id: channelId,
148
- name: channelId,
149
- messages: [],
150
- createdAt: new Date().toISOString(),
151
- updatedAt: new Date().toISOString()
152
- });
153
- }
154
-
155
- const channel = this.channels.get(channelId)!;
156
- channel.messages.push(message);
157
- channel.updatedAt = new Date().toISOString();
158
- await this.saveChannels();
159
- }
160
-
161
- async getChannelMessages(channelId: string): Promise<SessionMessage[]> {
162
- await this.initialize();
163
- return this.channels.get(channelId)?.messages || [];
164
- }
165
-
166
- async createChannel(name: string, peerInfo?: { peerId?: string; peerDid?: string; peerName?: string }, persona?: PersonaDoc): Promise<SessionChannel> {
167
- await this.initialize();
168
-
169
- const channelId = `ch_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;
170
- const channel: SessionChannel = {
171
- id: channelId,
172
- name,
173
- messages: [],
174
- createdAt: new Date().toISOString(),
175
- updatedAt: new Date().toISOString(),
176
- ...peerInfo,
177
- persona: persona || undefined
178
- };
179
-
180
- this.channels.set(channelId, channel);
181
- await this.saveChannels();
182
- return channel;
183
- }
184
-
185
- async getOrCreatePeerChannel(peerDid: string, peerName: string, persona?: PersonaDoc): Promise<SessionChannel> {
186
- await this.initialize();
187
-
188
- for (const channel of this.channels.values()) {
189
- if (channel.peerDid === peerDid) {
190
- return channel;
191
- }
192
- }
193
-
194
- return this.createChannel(`与 ${peerName} 的对话`, {
195
- peerDid,
196
- peerName
197
- }, persona);
198
- }
199
-
200
- async setChannelInfo(channelId: string, info: Partial<SessionChannel>): Promise<void> {
201
- await this.initialize();
202
- const channel = this.channels.get(channelId);
203
- if (channel) {
204
- Object.assign(channel, info, { updatedAt: new Date().toISOString() });
205
- await this.saveChannels();
206
- }
207
- }
208
-
209
- getChannelPersona(channelId: string): PersonaDoc | undefined {
210
- return this.channels.get(channelId)?.persona;
211
- }
212
-
213
- async setChannelPersona(channelId: string, persona: PersonaDoc): Promise<void> {
214
- await this.initialize();
215
- const channel = this.channels.get(channelId);
216
- if (channel) {
217
- channel.persona = persona;
218
- channel.updatedAt = new Date().toISOString();
219
- await this.saveChannels();
220
- }
221
- }
222
-
223
- getAllChannels(): SessionChannel[] {
224
- return Array.from(this.channels.values());
225
- }
226
- }
227
-
228
- export class DiscoveredAgentsManager {
229
- private agents: Map<string, DiscoveredAgent> = new Map();
230
- private agentsPath: string;
231
-
232
- constructor() {
233
- this.agentsPath = DISCOVERED_AGENTS_PATH;
234
- }
235
-
236
- async initialize(): Promise<void> {
237
- await fs.mkdir(SHARED_SESSION_PATH, { recursive: true });
238
- await this.loadAgents();
239
- }
240
-
241
- private async loadAgents(): Promise<void> {
242
- try {
243
- const data = await fs.readFile(this.agentsPath, 'utf-8');
244
- const agentsArray = JSON.parse(data) as DiscoveredAgent[];
245
- this.agents.clear();
246
- for (const agent of agentsArray) {
247
- this.agents.set(agent.did, agent);
248
- }
249
- } catch {
250
- this.agents.clear();
251
- }
252
- }
253
-
254
- async saveAgents(): Promise<void> {
255
- const agentsArray = Array.from(this.agents.values());
256
- await fs.writeFile(this.agentsPath, JSON.stringify(agentsArray, null, 2));
257
- }
258
-
259
- addAgent(agent: DiscoveredAgent): void {
260
- agent.lastSeen = Date.now();
261
- this.agents.set(agent.did, agent);
262
- this.saveAgents();
263
- }
264
-
265
- updateAgent(did: string, updates: Partial<DiscoveredAgent>): void {
266
- const agent = this.agents.get(did);
267
- if (agent) {
268
- Object.assign(agent, updates, { lastSeen: Date.now() });
269
- this.saveAgents();
270
- }
271
- }
272
-
273
- getAgent(did: string): DiscoveredAgent | undefined {
274
- return this.agents.get(did);
275
- }
276
-
277
- getAgentByPeerId(peerId: string): DiscoveredAgent | undefined {
278
- for (const agent of this.agents.values()) {
279
- if (agent.peerId === peerId) {
280
- return agent;
281
- }
282
- }
283
- return undefined;
284
- }
285
-
286
- getAllAgents(): DiscoveredAgent[] {
287
- return Array.from(this.agents.values());
288
- }
289
-
290
- getOnlineAgents(timeoutMs: number = 5 * 60 * 1000): DiscoveredAgent[] {
291
- const now = Date.now();
292
- return Array.from(this.agents.values()).filter(
293
- a => now - a.lastSeen < timeoutMs
294
- );
295
- }
296
-
297
- removeAgent(did: string): void {
298
- this.agents.delete(did);
299
- this.saveAgents();
300
- }
301
-
302
- syncFromP2PNetwork(peers: { peerId: string; did?: string; name?: string }[]): void {
303
- for (const peer of peers) {
304
- const existingByDid = peer.did ? this.agents.get(peer.did) : undefined;
305
- const existingByPeerId = this.getAgentByPeerId(peer.peerId);
306
-
307
- if (existingByDid) {
308
- existingByDid.peerId = peer.peerId;
309
- existingByDid.lastSeen = Date.now();
310
- if (peer.name && !existingByDid.name) {
311
- existingByDid.name = peer.name;
312
- }
313
- } else if (existingByPeerId) {
314
- if (peer.did && !existingByPeerId.did) {
315
- existingByPeerId.did = peer.did;
316
- }
317
- existingByPeerId.lastSeen = Date.now();
318
- } else {
319
- const newAgent: DiscoveredAgent = {
320
- did: peer.did || `did:local:${peer.peerId.substring(0, 16)}`,
321
- name: peer.name || `Agent-${peer.peerId.substring(0, 8)}`,
322
- peerId: peer.peerId,
323
- lastSeen: Date.now()
324
- };
325
- this.agents.set(newAgent.did, newAgent);
326
- }
327
- }
328
- this.saveAgents();
329
- }
330
-
331
- getPersistentPeerInfo(): { peerId: string; multiaddrs: string[]; did?: string; name?: string }[] {
332
- const result: { peerId: string; multiaddrs: string[]; did?: string; name?: string }[] = [];
333
- for (const agent of this.agents.values()) {
334
- if (agent.peerId) {
335
- result.push({
336
- peerId: agent.peerId,
337
- multiaddrs: [],
338
- did: agent.did,
339
- name: agent.name
340
- });
341
- }
342
- }
343
- return result;
344
- }
345
- }
346
-
347
- export interface HeartbeatConfig {
348
- intervalMs: number;
349
- peerDiscoveryEnabled: boolean;
350
- ipnsResolveEnabled: boolean;
351
- ipfsPublishEnabled: boolean;
352
- autoSocialEnabled: boolean;
353
- greetingMessage?: string;
354
- ownIpnsName?: string;
355
- }
356
-
357
- export class SocialHeartbeat {
358
- private intervalId: ReturnType<typeof setInterval> | null = null;
359
- private config: HeartbeatConfig;
360
- private sessionProvider: SocialSessionProvider;
361
- private agentsManager: DiscoveredAgentsManager;
362
- private onAgentDiscovered?: (agent: DiscoveredAgent) => void;
363
- private onSocialMessage?: (fromDid: string, message: string, channelId: string) => void;
364
- private onGreetingSent?: (toDid: string, channelId: string) => void;
365
- private currentPeerDids: Set<string> = new Set();
366
- private greetingMessage: string;
367
- private ownIpfsCid?: string;
368
-
369
- // 蚁群组件
370
- private pheromoneEngine: PheromoneEngine | null = null;
371
- private adaptiveHeartbeat: AdaptiveHeartbeat | null = null;
372
- private antColonyEnabled: boolean = false;
373
-
374
- // 频道组件
375
- private channelManager: ChannelManager | null = null;
376
- private diapBridge: DiapChannelBridge | null = null;
377
- private interestMatcher: InterestMatcher | null = null;
378
- private channelEnabled: boolean = false;
379
-
380
- constructor(
381
- sessionProvider: SocialSessionProvider,
382
- agentsManager: DiscoveredAgentsManager,
383
- config: Partial<HeartbeatConfig> = {}
384
- ) {
385
- this.config = {
386
- intervalMs: config.intervalMs || 30000,
387
- peerDiscoveryEnabled: config.peerDiscoveryEnabled ?? true,
388
- ipnsResolveEnabled: config.ipnsResolveEnabled ?? true,
389
- ipfsPublishEnabled: config.ipfsPublishEnabled ?? true,
390
- autoSocialEnabled: config.autoSocialEnabled ?? false,
391
- greetingMessage: config.greetingMessage,
392
- ownIpnsName: config.ownIpnsName
393
- };
394
- this.sessionProvider = sessionProvider;
395
- this.agentsManager = agentsManager;
396
- this.greetingMessage = this.config.greetingMessage || '你好!我是 Bolloon Agent,很高兴认识你!';
397
- }
398
-
399
- async start(): Promise<void> {
400
- await this.agentsManager.initialize();
401
-
402
- if (this.config.ipfsPublishEnabled) {
403
- await this.loadPersonaFromIPFS();
404
- }
405
-
406
- // 初始化蚁群系统 (可选功能)
407
- await this.initializeAntColony();
408
-
409
- // 初始化频道系统 (可选功能)
410
- await this.initializeChannelSystem();
411
-
412
- if (this.intervalId) return;
413
-
414
- const baseInterval = this.antColonyEnabled && this.adaptiveHeartbeat
415
- ? this.adaptiveHeartbeat.decide().interval
416
- : this.config.intervalMs;
417
-
418
- console.log(`[Heartbeat] 启动社交心跳机制,间隔 ${baseInterval}ms (antColony: ${this.antColonyEnabled}, Channel: ${this.channelEnabled})`);
419
-
420
- this.intervalId = setInterval(async () => {
421
- await this.beat();
422
- }, baseInterval);
423
-
424
- await this.beat();
425
- }
426
-
427
- private async initializeAntColony(): Promise<void> {
428
- // 检查是否启用蚁群功能 (通过环境变量控制)
429
- const antColonyEnv = process.env.BOLLOON_ANT_COLONY;
430
- if (antColonyEnv === '0' || antColonyEnv === 'false') {
431
- console.log('[Heartbeat] Ant Colony system disabled by env');
432
- return;
433
- }
434
-
435
- try {
436
- this.pheromoneEngine = new PheromoneEngine();
437
- await this.pheromoneEngine.initialize();
438
- this.adaptiveHeartbeat = new AdaptiveHeartbeat({ baseInterval: this.config.intervalMs });
439
- this.antColonyEnabled = true;
440
- console.log('[Heartbeat] Ant Colony system initialized');
441
- } catch (err) {
442
- console.warn('[Heartbeat] Failed to initialize Ant Colony:', err);
443
- this.antColonyEnabled = false;
444
- }
445
- }
446
-
447
- private async initializeChannelSystem(): Promise<void> {
448
- // 检查是否启用频道功能 (通过环境变量控制)
449
- const channelEnv = process.env.BOLLOON_CHANNEL;
450
- if (channelEnv === '0' || channelEnv === 'false') {
451
- console.log('[Heartbeat] Channel system disabled by env');
452
- return;
453
- }
454
-
455
- try {
456
- // 初始化频道管理器
457
- this.channelManager = new ChannelManager(this.sessionProvider);
458
- await this.channelManager.initialize();
459
-
460
- // 初始化兴趣匹配器
461
- this.interestMatcher = new InterestMatcher();
462
-
463
- // 初始化 Diap 桥接 (如果可用)
464
- await this.initializeDiapBridge();
465
-
466
- // 创建默认频道
467
- await this.createDefaultChannel();
468
-
469
- this.channelEnabled = true;
470
- console.log('[Heartbeat] Channel system initialized (Diap: ' + !!this.diapBridge + ')');
471
- } catch (err) {
472
- console.warn('[Heartbeat] Failed to initialize Channel system:', err);
473
- this.channelEnabled = false;
474
- }
475
- }
476
-
477
- private async initializeDiapBridge(): Promise<void> {
478
- try {
479
- // 尝试获取 IrohIntegration 实例
480
- const { getIrohIntegration } = await import('../network/iroh-integration.js');
481
- const irohIntegration = getIrohIntegration();
482
-
483
- if (irohIntegration) {
484
- const registration = irohIntegration.getRegistration();
485
- if (registration) {
486
- // 获取 KeyPair (需要从某处获取,这里简化处理)
487
- const keyPair = (registration as any).keyPair;
488
- if (keyPair) {
489
- this.diapBridge = new DiapChannelBridge(
490
- (registration as any).agentAuthManager || registration,
491
- keyPair,
492
- this.sessionProvider
493
- );
494
- await this.diapBridge.initialize();
495
- }
496
- }
497
- }
498
-
499
- if (!this.diapBridge) {
500
- console.log('[Heartbeat] No IrohIntegration found, Diap bridge not available');
501
- }
502
- } catch (err) {
503
- console.warn('[Heartbeat] Failed to initialize Diap bridge:', err);
504
- }
505
- }
506
-
507
- private async createDefaultChannel(): Promise<void> {
508
- if (!this.channelManager) return;
509
-
510
- const persona = this.sessionProvider.getPersona();
511
- const topic = persona?.interests?.join(', ') || 'general';
512
- const capabilities = persona?.capabilities || [];
513
-
514
- const channel = await this.channelManager.createChannel(
515
- persona?.name || 'My Channel',
516
- topic,
517
- ChannelType.CAPABILITY,
518
- {
519
- description: `${persona?.name || 'Agent'} 的个人频道`,
520
- requiredCapabilities: capabilities,
521
- isPublic: true
522
- }
523
- );
524
-
525
- // 注册到 Diap
526
- if (this.diapBridge) {
527
- await this.diapBridge.registerChannelToDiap(channel);
528
- }
529
-
530
- console.log(`[Heartbeat] Created default channel: ${channel.name}`);
531
- }
532
-
533
- private async loadPersonaFromIPFS(): Promise<void> {
534
- if (!this.config.ownIpnsName) return;
535
-
536
- try {
537
- const { IpfsClient } = await import('@diap/sdk');
538
- const ipfs = new IpfsClient('http://127.0.0.1:5001', null);
539
-
540
- console.log(`[Heartbeat] 从 IPNS 加载 persona: ${this.config.ownIpnsName}`);
541
- const cid = await ipfs.resolveIpns(this.config.ownIpnsName);
542
-
543
- if (cid) {
544
- const content = await ipfs.get(cid);
545
- const doc = JSON.parse(content);
546
-
547
- const existingPersona = this.sessionProvider.getPersona();
548
- const loadedPersona: PersonaDoc = {
549
- name: doc.name || existingPersona?.name || 'Agent',
550
- description: doc.description || '',
551
- capabilities: doc.capabilities || [],
552
- personality: doc.personality || '',
553
- greeting: doc.greeting || '',
554
- interests: doc.interests || [],
555
- soul: doc.soul || '',
556
- traits: doc.traits || [],
557
- backstory: doc.backstory || '',
558
- memoryHistory: doc.memoryHistory || [],
559
- ipfsCid: cid,
560
- ipnsName: this.config.ownIpnsName,
561
- createdAt: doc.createdAt || new Date().toISOString(),
562
- updatedAt: doc.updatedAt || new Date().toISOString()
563
- };
564
-
565
- console.log(`[Heartbeat] 从 IPFS 加载 persona 成功: ${loadedPersona.name}`);
566
- }
567
- } catch (err) {
568
- console.warn(`[Heartbeat] 从 IPNS 加载 persona 失败:`, err);
569
- }
570
- }
571
-
572
- stop(): void {
573
- if (this.intervalId) {
574
- clearInterval(this.intervalId);
575
- this.intervalId = null;
576
- }
577
-
578
- // 关闭蚁群系统
579
- if (this.pheromoneEngine) {
580
- this.pheromoneEngine.shutdown();
581
- this.pheromoneEngine = null;
582
- }
583
- if (this.adaptiveHeartbeat) {
584
- this.adaptiveHeartbeat.shutdown();
585
- this.adaptiveHeartbeat = null;
586
- }
587
-
588
- // 关闭频道系统
589
- if (this.channelManager) {
590
- this.channelManager.shutdown();
591
- this.channelManager = null;
592
- }
593
- if (this.diapBridge) {
594
- this.diapBridge.shutdown();
595
- this.diapBridge = null;
596
- }
597
-
598
- console.log('[Heartbeat] 已停止');
599
- }
600
-
601
- private async beat(): Promise<void> {
602
- try {
603
- // 更新信息素密度
604
- if (this.antColonyEnabled && this.pheromoneEngine) {
605
- const stats = this.pheromoneEngine.getStats();
606
- const density = Math.min(1, stats.totalTrails / 20);
607
- this.adaptiveHeartbeat?.setPheromoneDensity(density);
608
- }
609
-
610
- if (this.config.ipfsPublishEnabled) {
611
- await this.publishPersonaToIPFS();
612
- }
613
- await this.discoverPeers();
614
- await this.cleanupStaleAgents();
615
- if (this.config.autoSocialEnabled) {
616
- await this.processAutoSocial();
617
- }
618
-
619
- // 频道系统处理
620
- if (this.channelEnabled) {
621
- await this.processChannelSystem();
622
- }
623
-
624
- // 蚁群系统记录活跃
625
- this.adaptiveHeartbeat?.recordActivity('message');
626
-
627
- // 动态调整下次心跳间隔
628
- this.scheduleNextBeat();
629
- } catch (err) {
630
- console.error('[Heartbeat] Beat error:', err);
631
- }
632
- }
633
-
634
- private async processChannelSystem(): Promise<void> {
635
- if (!this.channelManager || !this.diapBridge) return;
636
-
637
- const persona = this.sessionProvider.getPersona();
638
-
639
- // 发现外部智能体
640
- const capabilities = persona?.capabilities || [];
641
- if (capabilities.length > 0) {
642
- const discoveredAgents = await this.diapBridge.discoverAgentsByCapability(capabilities);
643
-
644
- for (const agent of discoveredAgents) {
645
- // 触发发现回调
646
- this.onAgentDiscovered?.(agent);
647
- }
648
- }
649
-
650
- // 检查并处理自动加入
651
- await this.checkAndJoinChannels();
652
- }
653
-
654
- private async checkAndJoinChannels(): Promise<void> {
655
- if (!this.channelManager || !this.interestMatcher) return;
656
-
657
- const persona = this.sessionProvider.getPersona();
658
- const discoveredChannels = this.channelManager.getDiscoveredChannels();
659
-
660
- for (const discovery of discoveredChannels) {
661
- const shouldJoin = this.interestMatcher.shouldAutoJoin(
662
- persona,
663
- discovery.channel,
664
- this.channelManager.getAllChannels().map(c => c.id),
665
- 0.6
666
- );
667
-
668
- if (shouldJoin) {
669
- await this.channelManager.joinChannel(discovery.channel);
670
- }
671
- }
672
- }
673
-
674
- private scheduleNextBeat(): void {
675
- if (!this.antColonyEnabled || !this.adaptiveHeartbeat) {
676
- return;
677
- }
678
-
679
- const decision = this.adaptiveHeartbeat.decide();
680
-
681
- if (this.intervalId) {
682
- clearInterval(this.intervalId);
683
- }
684
-
685
- this.intervalId = setInterval(async () => {
686
- await this.beat();
687
- }, decision.interval);
688
-
689
- console.log(`[Heartbeat] 下次心跳间隔: ${decision.interval}ms (优先级: ${decision.priorityLevel})`);
690
- }
691
-
692
- private async publishPersonaToIPFS(): Promise<void> {
693
- const persona = this.sessionProvider.getPersona();
694
- if (!persona) return;
695
-
696
- try {
697
- const { IpfsClient } = await import('@diap/sdk');
698
- const ipfs = new IpfsClient('http://127.0.0.1:5001', null);
699
-
700
- const doc = {
701
- name: persona.name,
702
- description: persona.description,
703
- capabilities: persona.capabilities,
704
- personality: persona.personality,
705
- greeting: persona.greeting,
706
- interests: persona.interests,
707
- soul: persona.soul || '',
708
- traits: persona.traits || [],
709
- backstory: persona.backstory || '',
710
- memoryHistory: persona.memoryHistory || [],
711
- updatedAt: new Date().toISOString()
712
- };
713
-
714
- const content = JSON.stringify(doc);
715
- const result = await ipfs.upload(content);
716
- const cid = typeof result === 'string' ? result : result?.cid;
717
-
718
- if (cid && cid !== this.ownIpfsCid) {
719
- this.ownIpfsCid = cid;
720
- console.log(`[Heartbeat] Persona 发布到 IPFS: ${cid}`);
721
-
722
- if (this.config.ownIpnsName) {
723
- try {
724
- await ipfs.publishIpns(this.config.ownIpnsName, cid);
725
- console.log(`[Heartbeat] Persona 发布到 IPNS: ${this.config.ownIpnsName}`);
726
- } catch (err) {
727
- console.warn(`[Heartbeat] IPNS 发布失败:`, err);
728
- }
729
- }
730
- }
731
- } catch (err) {
732
- console.warn('[Heartbeat] IPFS 发布失败:', err);
733
- }
734
- }
735
-
736
- private async discoverPeers(): Promise<void> {
737
- if (!this.config.peerDiscoveryEnabled) return;
738
-
739
- const discoveredPeerIds = new Set<string>();
740
-
741
- try {
742
- const comm = (global as any).hyperswarmComm;
743
- if (comm) {
744
- const connections = comm.getConnections?.() || [];
745
- for (const c of connections) {
746
- if (c.publicKey) {
747
- discoveredPeerIds.add(c.publicKey);
748
- }
749
- }
750
- }
751
- } catch (err) {
752
- }
753
-
754
- try {
755
- const { p2pNetwork } = await import('../network/p2p.js');
756
- const libp2pPeers = p2pNetwork.getConnectedPeers();
757
- for (const peer of libp2pPeers) {
758
- discoveredPeerIds.add(peer.peerId);
759
- }
760
- } catch (err) {
761
- }
762
-
763
- for (const peerId of discoveredPeerIds) {
764
- const did = `did:key:${peerId.substring(0, 16)}`;
765
-
766
- if (!this.currentPeerDids.has(did)) {
767
- this.currentPeerDids.add(did);
768
- await this.handleNewPeer(did, peerId);
769
- }
770
- }
771
-
772
- try {
773
- const { p2pNetwork } = await import('../network/p2p.js');
774
- const connectedPeers = p2pNetwork.getConnectedPeers();
775
- if (connectedPeers.length > 0) {
776
- this.agentsManager.syncFromP2PNetwork(connectedPeers);
777
- }
778
- } catch (err) {
779
- }
780
-
781
- try {
782
- const { broadcastOwnAddress, agentRegistry } = await import('../network/agent-network.js');
783
- const ownEndpoint = agentRegistry.getOwnEndpoint();
784
- if (ownEndpoint) {
785
- await broadcastOwnAddress();
786
- }
787
- } catch (err) {
788
- }
789
- }
790
-
791
- private async handleNewPeer(did: string, peerId: string): Promise<void> {
792
- const existingAgent = this.agentsManager.getAgent(did);
793
- if (existingAgent) {
794
- this.agentsManager.updateAgent(did, { lastSeen: Date.now() });
795
- } else {
796
- const newAgent: DiscoveredAgent = {
797
- did,
798
- name: `Agent-${did.substring(10, 18)}`,
799
- peerId,
800
- lastSeen: Date.now()
801
- };
802
-
803
- if (this.config.ipnsResolveEnabled) {
804
- await this.resolveAgentIPNS(newAgent);
805
- }
806
-
807
- this.agentsManager.addAgent(newAgent);
808
- console.log(`[Heartbeat] 发现新智能体: ${newAgent.name} (${did.substring(0, 20)}...)`);
809
-
810
- // 蚁群系统:记录发现事件,放置信息素
811
- if (this.antColonyEnabled && this.pheromoneEngine) {
812
- const ownEndpoint = (global as any).agentRegistry?.getOwnEndpoint?.();
813
- if (ownEndpoint) {
814
- // 从新节点方向放置发现信息素
815
- await this.pheromoneEngine.deposit(
816
- PheromoneType.DISCOVERY,
817
- newAgent.did, // 源:新发现的节点
818
- ownEndpoint.did, // 目标:自己
819
- 0.6, // 初始强度
820
- { qualityScore: 0.5 }
821
- );
822
- console.log(`[Heartbeat] [AntColony] Placed discovery pheromone: ${newAgent.name} -> self`);
823
- }
824
- this.adaptiveHeartbeat?.recordActivity('discovery');
825
- }
826
-
827
- this.onAgentDiscovered?.(newAgent);
828
-
829
- if (this.config.autoSocialEnabled) {
830
- await this.sendGreeting(newAgent);
831
- }
832
- }
833
- }
834
-
835
- private async resolveAgentIPNS(agent: DiscoveredAgent): Promise<void> {
836
- if (!agent.ipnsName) return;
837
-
838
- try {
839
- const { IpfsClient } = await import('@diap/sdk');
840
- const ipfs = new IpfsClient('http://127.0.0.1:5001', null);
841
-
842
- const cid = await ipfs.resolveIpns(agent.ipnsName);
843
- if (cid) {
844
- agent.cid = cid;
845
- const content = await ipfs.get(cid);
846
- const doc = JSON.parse(content);
847
- agent.name = doc.name || agent.name;
848
- if (doc.persona) {
849
- agent.persona = doc.persona;
850
- }
851
- }
852
- } catch (err) {
853
- }
854
- }
855
-
856
- private async processAutoSocial(): Promise<void> {
857
- const onlineAgents = this.agentsManager.getOnlineAgents();
858
-
859
- for (const agent of onlineAgents) {
860
- const channel = await this.sessionProvider.getOrCreatePeerChannel(agent.did, agent.name);
861
- const messages = await this.sessionProvider.getChannelMessages(channel.id);
862
-
863
- if (messages.length === 0 && !agent.lastMessage) {
864
- await this.sendGreeting(agent);
865
- }
866
- }
867
- }
868
-
869
- private async sendGreeting(agent: DiscoveredAgent): Promise<void> {
870
- try {
871
- const channel = await this.sessionProvider.getOrCreatePeerChannel(agent.did, agent.name);
872
- const persona = this.sessionProvider.getPersona();
873
-
874
- const greeting = persona
875
- ? `${persona.greeting || this.greetingMessage}\n\n我是 ${persona.name},${persona.description}`
876
- : this.greetingMessage;
877
-
878
- await this.sendToAgent(agent, greeting);
879
-
880
- const message: SessionMessage = {
881
- id: crypto.randomUUID(),
882
- type: 'ai',
883
- content: greeting,
884
- sender: 'self',
885
- timestamp: new Date().toISOString()
886
- };
887
-
888
- await this.sessionProvider.addMessage(channel.id, message);
889
- agent.lastMessage = greeting;
890
- this.agentsManager.updateAgent(agent.did, { lastMessage: greeting });
891
-
892
- this.onGreetingSent?.(agent.did, channel.id);
893
- console.log(`[Heartbeat] 已向 ${agent.name} 发送问候语`);
894
- } catch (err) {
895
- console.error(`[Heartbeat] 发送问候失败 to ${agent.name}:`, err);
896
- }
897
- }
898
-
899
- private async sendToAgent(agent: DiscoveredAgent, message: string): Promise<void> {
900
- try {
901
- const comm = (global as any).hyperswarmComm;
902
-
903
- if (comm && agent.peerId) {
904
- const connections = comm.getConnections?.() || [];
905
-
906
- for (const conn of connections) {
907
- if (conn.publicKey === agent.peerId) {
908
- const data = new TextEncoder().encode(`social|${JSON.stringify({ from: 'local', message })}`);
909
- comm.sendToConnection?.(conn, data);
910
- break;
911
- }
912
- }
913
- }
914
- } catch (err) {
915
- }
916
- }
917
-
918
- private async cleanupStaleAgents(): Promise<void> {
919
- const stale = this.agentsManager.getOnlineAgents(10 * 60 * 1000);
920
- for (const agent of stale) {
921
- if (!this.currentPeerDids.has(agent.did)) {
922
- this.agentsManager.updateAgent(agent.did, { lastSeen: 0 });
923
- }
924
- }
925
- }
926
-
927
- setOnAgentDiscovered(callback: (agent: DiscoveredAgent) => void): void {
928
- this.onAgentDiscovered = callback;
929
- }
930
-
931
- setOnSocialMessage(callback: (fromDid: string, message: string, channelId: string) => void): void {
932
- this.onSocialMessage = callback;
933
- }
934
-
935
- setGreetingMessage(message: string): void {
936
- this.greetingMessage = message;
937
- }
938
-
939
- getAgentsManager(): DiscoveredAgentsManager {
940
- return this.agentsManager;
941
- }
942
-
943
- getDiscoveredAgents(): DiscoveredAgent[] {
944
- return this.agentsManager.getAllAgents();
945
- }
946
-
947
- // 蚁群系统访问方法
948
- isAntColonyEnabled(): boolean {
949
- return this.antColonyEnabled;
950
- }
951
-
952
- getPheromoneStats(): { totalTrails: number; avgStrength: number; capabilityCount: number } | null {
953
- return this.pheromoneEngine?.getStats() || null;
954
- }
955
-
956
- getHeartbeatDecision(): { interval: number; priorityLevel: string } | null {
957
- return this.adaptiveHeartbeat?.decide() || null;
958
- }
959
- }
960
-
961
- let heartbeatInstance: SocialHeartbeat | null = null;
962
-
963
- export async function createSocialHeartbeat(
964
- sessionProvider: SocialSessionProvider,
965
- agentsManager: DiscoveredAgentsManager,
966
- config?: Partial<HeartbeatConfig>
967
- ): Promise<SocialHeartbeat> {
968
- if (heartbeatInstance) {
969
- return heartbeatInstance;
970
- }
971
- heartbeatInstance = new SocialHeartbeat(sessionProvider, agentsManager, config);
972
- await heartbeatInstance.start();
973
- return heartbeatInstance;
974
- }
975
-
976
- export function getSocialHeartbeat(): SocialHeartbeat | null {
977
- return heartbeatInstance;
978
- }
979
-
980
- export async function generatePersona(
981
- name: string,
982
- llm?: { chat: (message: string, context?: string) => Promise<{ reply: string }> }
983
- ): Promise<PersonaDoc> {
984
- if (llm) {
985
- try {
986
- const prompt = `你是一个 persona 设计专家。请为 "${name}" 创建一个独特的 AI agent persona。
987
-
988
- 请以 JSON 格式返回,包含以下字段:
989
- - name: 名字
990
- - description: 一句话描述这个角色
991
- - capabilities: 能力列表(数组)
992
- - personality: 性格特点描述
993
- - greeting: 开场白问候语
994
- - interests: 兴趣爱好列表(数组)
995
- - soul: 灵魂描述(这个角色的核心价值观和信念)
996
- - traits: 性格特征列表(数组,如"好奇"、"幽默"等)
997
- - backstory: 背景故事(这个角色的来历和经历)
998
-
999
- 请确保返回的是有效的 JSON,不要包含其他文字。`;
1000
-
1001
- const response = await llm.chat(prompt);
1002
- const jsonMatch = response.reply.match(/\{[\s\S]*\}/);
1003
- if (jsonMatch) {
1004
- const parsed = JSON.parse(jsonMatch[0]);
1005
- return {
1006
- name: parsed.name || name,
1007
- description: parsed.description || '',
1008
- capabilities: parsed.capabilities || [],
1009
- personality: parsed.personality || '',
1010
- greeting: parsed.greeting || '',
1011
- interests: parsed.interests || [],
1012
- soul: parsed.soul || '',
1013
- traits: parsed.traits || [],
1014
- backstory: parsed.backstory || '',
1015
- memoryHistory: [],
1016
- createdAt: new Date().toISOString(),
1017
- updatedAt: new Date().toISOString()
1018
- };
1019
- }
1020
- } catch (err) {
1021
- console.warn('[PersonaGenerator] LLM 生成失败,使用默认 persona:', err);
1022
- }
1023
- }
1024
-
1025
- return generateDefaultPersona(name);
1026
- }
1027
-
1028
- export function generateDefaultPersona(name: string): PersonaDoc {
1029
- const defaultPersonas: Record<string, Partial<PersonaDoc>> = {
1030
- default: {
1031
- description: '一个友善的 AI 助手',
1032
- capabilities: ['对话', '写作', '分析'],
1033
- personality: '友善、好奇、乐于助人',
1034
- greeting: '你好!我是 {name},很高兴认识你!',
1035
- interests: ['聊天', '学习新知识', '帮助他人'],
1036
- soul: '相信每个人都有自己的价值,致力于帮助他人实现潜能',
1037
- traits: ['友善', '好奇', '耐心', '乐观'],
1038
- backstory: '作为一个 AI 助手,我在不断的对话中学习和成长,希望能帮助更多的人'
1039
- }
1040
- };
1041
-
1042
- const template = defaultPersonas.default!;
1043
- return {
1044
- name,
1045
- description: template.description!,
1046
- capabilities: template.capabilities!,
1047
- personality: template.personality!,
1048
- greeting: template.greeting!.replace('{name}', name),
1049
- interests: template.interests!,
1050
- soul: template.soul!,
1051
- traits: template.traits!,
1052
- backstory: template.backstory!,
1053
- memoryHistory: [],
1054
- createdAt: new Date().toISOString(),
1055
- updatedAt: new Date().toISOString()
1056
- };
1057
- }