@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,800 +0,0 @@
1
- import * as fs from 'fs/promises';
2
- import * as path from 'path';
3
- import { multiaddr as createMultiaddr } from '@multiformats/multiaddr';
4
- import { KeyManager } from '@diap/sdk';
5
- import { p2pNetwork, type PersistentPeerInfo } from './p2p.js';
6
-
7
- const AGENT_REGISTRY_PATH = path.join(process.env.HOME || '/tmp', '.bolloon', 'agent-registry.json');
8
- const KEY_PAIR_PATH = path.join(process.env.HOME || '/tmp', '.bolloon', 'keypair.json');
9
-
10
- export interface KeyPair {
11
- privateKey: Uint8Array;
12
- publicKey: Uint8Array;
13
- did: string;
14
- }
15
-
16
- export interface AgentEndpoint {
17
- did: string;
18
- name: string;
19
- peerId: string;
20
- multiaddrs: string[];
21
- lastSeen?: number;
22
- publicKey?: string;
23
- signature?: string;
24
- }
25
-
26
- export interface AgentRegistryEntry {
27
- did: string;
28
- name: string;
29
- peerId: string;
30
- multiaddrs: string[];
31
- registeredAt: number;
32
- lastSeen: number;
33
- lastBroadcast: number;
34
- publicKey: string;
35
- relayAddr?: string;
36
- canRelay?: boolean;
37
- }
38
-
39
- export interface SignedMessage {
40
- type: string;
41
- from: string;
42
- name: string;
43
- payload: string;
44
- timestamp: number;
45
- signature: string;
46
- }
47
-
48
- export interface AddressBroadcast {
49
- type: 'address_broadcast';
50
- from: string;
51
- name: string;
52
- peerId: string;
53
- multiaddrs: string[];
54
- relayAddr?: string;
55
- canRelay?: boolean;
56
- timestamp: number;
57
- signature: string;
58
- }
59
-
60
- export interface DiscoveryMessage {
61
- type: 'discovery';
62
- from: string;
63
- name: string;
64
- capability: string[];
65
- timestamp: number;
66
- signature: string;
67
- }
68
-
69
- const ADDRESS_BROADCAST_INTERVAL = 5 * 60 * 1000;
70
- const RELAY_RETRY_INTERVAL = 30000;
71
- const MAX_RELAY_HOPS = 3;
72
- const MESSAGE_TIMESTAMP_TOLERANCE = 24 * 60 * 60 * 1000;
73
- const SIGNED_MESSAGE_TYPES = ['task', 'response', 'discovery', 'address_broadcast'] as const;
74
-
75
- export class AgentRegistry {
76
- private agents: Map<string, AgentRegistryEntry> = new Map();
77
- private registryPath: string;
78
- private ownEndpoint: AgentEndpoint | null = null;
79
- private keyPair: KeyPair | null = null;
80
- private keyPairPath: string;
81
- private relayMode: boolean = false;
82
- private pendingRelayMessages: Map<string, { data: Uint8Array; hops: number }[]> = new Map();
83
-
84
- constructor() {
85
- this.registryPath = AGENT_REGISTRY_PATH;
86
- this.keyPairPath = KEY_PAIR_PATH;
87
- }
88
-
89
- async initialize(): Promise<void> {
90
- await fs.mkdir(path.dirname(this.registryPath), { recursive: true });
91
- await this.loadRegistry();
92
- await this.loadOrCreateKeyPair();
93
- }
94
-
95
- private async loadOrCreateKeyPair(): Promise<void> {
96
- try {
97
- const data = await fs.readFile(this.keyPairPath, 'utf-8');
98
- const keyFile = JSON.parse(data);
99
- this.keyPair = {
100
- privateKey: Buffer.from(keyFile.privateKey, 'hex'),
101
- publicKey: Buffer.from(keyFile.publicKey, 'hex'),
102
- did: keyFile.did
103
- };
104
- console.log(`[Registry] Loaded keypair: ${this.keyPair.did.substring(0, 20)}...`);
105
- } catch {
106
- console.log(`[Registry] Generating new keypair...`);
107
- const kp = KeyManager.generate();
108
- this.keyPair = {
109
- privateKey: kp.privateKey,
110
- publicKey: kp.publicKey,
111
- did: kp.did
112
- };
113
- await this.saveKeyPair();
114
- console.log(`[Registry] New keypair created: ${this.keyPair.did.substring(0, 20)}...`);
115
- }
116
- }
117
-
118
- private async saveKeyPair(): Promise<void> {
119
- if (!this.keyPair) return;
120
- const keyFile = {
121
- privateKey: Buffer.from(this.keyPair.privateKey).toString('hex'),
122
- publicKey: Buffer.from(this.keyPair.publicKey).toString('hex'),
123
- did: this.keyPair.did,
124
- createdAt: new Date().toISOString()
125
- };
126
- await fs.writeFile(this.keyPairPath, JSON.stringify(keyFile, null, 2));
127
- }
128
-
129
- getKeyPair(): KeyPair | null {
130
- return this.keyPair;
131
- }
132
-
133
- async loadRegistry(): Promise<void> {
134
- try {
135
- const data = await fs.readFile(this.registryPath, 'utf-8');
136
- const entries: AgentRegistryEntry[] = JSON.parse(data);
137
- for (const entry of entries) {
138
- this.agents.set(entry.did, entry);
139
- }
140
- console.log(`[Registry] Loaded ${entries.length} known agents`);
141
- } catch {
142
- console.log(`[Registry] No existing registry found`);
143
- }
144
- }
145
-
146
- private async saveRegistry(): Promise<void> {
147
- try {
148
- const entries = Array.from(this.agents.values());
149
- await fs.writeFile(this.registryPath, JSON.stringify(entries, null, 2));
150
- } catch (e) {
151
- console.warn(`[Registry] Failed to save:`, e);
152
- }
153
- }
154
-
155
- setOwnEndpoint(endpoint: AgentEndpoint): void {
156
- this.ownEndpoint = endpoint;
157
- if (this.keyPair) {
158
- endpoint.did = this.keyPair.did;
159
- endpoint.publicKey = Buffer.from(this.keyPair.publicKey).toString('hex');
160
- }
161
- this.registerAgent(endpoint);
162
- }
163
-
164
- getOwnEndpoint(): AgentEndpoint | null {
165
- return this.ownEndpoint;
166
- }
167
-
168
- async signMessage(data: string): Promise<Uint8Array | null> {
169
- if (!this.keyPair) {
170
- console.warn(`[Registry] No keypair available for signing`);
171
- return null;
172
- }
173
- try {
174
- const signature = await KeyManager.sign(this.keyPair, new TextEncoder().encode(data));
175
- return signature;
176
- } catch (e) {
177
- console.warn(`[Registry] Signing failed:`, e);
178
- return null;
179
- }
180
- }
181
-
182
- async verifySignature(did: string, data: string, signature: Uint8Array): Promise<boolean> {
183
- try {
184
- const agent = this.agents.get(did);
185
- if (!agent || !agent.publicKey) {
186
- console.warn(`[Registry] Unknown agent or missing public key: ${did.substring(0, 20)}`);
187
- return false;
188
- }
189
-
190
- const publicKey = Buffer.from(agent.publicKey, 'hex');
191
- const keyPair = { privateKey: new Uint8Array(32), publicKey, did };
192
- const isValid = await KeyManager.verify(keyPair, new TextEncoder().encode(data), signature);
193
-
194
- if (!isValid) {
195
- console.warn(`[Registry] Invalid signature from ${did.substring(0, 20)}`);
196
- }
197
-
198
- return isValid;
199
- } catch (e) {
200
- console.warn(`[Registry] Verification failed:`, e);
201
- return false;
202
- }
203
- }
204
-
205
- registerAgent(endpoint: AgentEndpoint): void {
206
- const entry: AgentRegistryEntry = {
207
- did: endpoint.did,
208
- name: endpoint.name,
209
- peerId: endpoint.peerId,
210
- multiaddrs: endpoint.multiaddrs,
211
- registeredAt: Date.now(),
212
- lastSeen: Date.now(),
213
- lastBroadcast: 0,
214
- publicKey: endpoint.publicKey || ''
215
- };
216
-
217
- const existing = this.agents.get(endpoint.did);
218
- if (existing) {
219
- entry.registeredAt = existing.registeredAt;
220
- entry.lastBroadcast = existing.lastBroadcast;
221
- if (endpoint.publicKey && !existing.publicKey) {
222
- entry.publicKey = endpoint.publicKey;
223
- }
224
- }
225
-
226
- this.agents.set(endpoint.did, entry);
227
- this.saveRegistry();
228
- console.log(`[Registry] Registered agent: ${endpoint.name} (${endpoint.did.substring(0, 20)}...)`);
229
- }
230
-
231
- getAgent(did: string): AgentRegistryEntry | undefined {
232
- return this.agents.get(did);
233
- }
234
-
235
- getAgentByPeerId(peerId: string): AgentRegistryEntry | undefined {
236
- for (const agent of this.agents.values()) {
237
- if (agent.peerId === peerId) {
238
- return agent;
239
- }
240
- }
241
- return undefined;
242
- }
243
-
244
- getAllAgents(): AgentRegistryEntry[] {
245
- return Array.from(this.agents.values());
246
- }
247
-
248
- getOnlineAgents(timeoutMs: number = 10 * 60 * 1000): AgentRegistryEntry[] {
249
- const now = Date.now();
250
- return Array.from(this.agents.values()).filter(
251
- a => now - a.lastSeen < timeoutMs
252
- );
253
- }
254
-
255
- updateLastSeen(did: string): void {
256
- const agent = this.agents.get(did);
257
- if (agent) {
258
- agent.lastSeen = Date.now();
259
- this.saveRegistry();
260
- }
261
- }
262
-
263
- removeAgent(did: string): void {
264
- this.agents.delete(did);
265
- this.saveRegistry();
266
- }
267
-
268
- async createSignedBroadcast(): Promise<AddressBroadcast | null> {
269
- if (!this.ownEndpoint || !this.keyPair) return null;
270
-
271
- const now = Date.now();
272
- const entry = this.agents.get(this.ownEndpoint.did);
273
- if (entry && now - entry.lastBroadcast < ADDRESS_BROADCAST_INTERVAL) {
274
- return null;
275
- }
276
-
277
- const relayAddr = (p2pNetwork as any).getRelayAddress?.() || null;
278
-
279
- const broadcastData = JSON.stringify({
280
- type: 'address_broadcast',
281
- from: this.keyPair.did,
282
- name: this.ownEndpoint.name,
283
- peerId: this.ownEndpoint.peerId,
284
- multiaddrs: this.ownEndpoint.multiaddrs,
285
- relayAddr: relayAddr || undefined,
286
- canRelay: relayAddr ? true : false,
287
- timestamp: now
288
- });
289
-
290
- const signature = await this.signMessage(broadcastData);
291
- if (!signature) return null;
292
-
293
- const broadcast: AddressBroadcast = {
294
- type: 'address_broadcast',
295
- from: this.keyPair.did,
296
- name: this.ownEndpoint.name,
297
- peerId: this.ownEndpoint.peerId,
298
- multiaddrs: this.ownEndpoint.multiaddrs,
299
- relayAddr: relayAddr || undefined,
300
- canRelay: relayAddr ? true : false,
301
- timestamp: now,
302
- signature: Buffer.from(signature).toString('hex')
303
- };
304
-
305
- if (entry) {
306
- entry.lastBroadcast = now;
307
- }
308
-
309
- return broadcast;
310
- }
311
-
312
- async handleAddressBroadcast(broadcast: AddressBroadcast): Promise<boolean> {
313
- if (!this.keyPair || broadcast.from === this.keyPair.did) {
314
- return false;
315
- }
316
-
317
- if (Math.abs(broadcast.timestamp - Date.now()) > MESSAGE_TIMESTAMP_TOLERANCE) {
318
- console.log(`[Registry] Stale broadcast from ${broadcast.from.substring(0, 20)}`);
319
- return false;
320
- }
321
-
322
- const broadcastData = JSON.stringify({
323
- type: 'address_broadcast',
324
- from: broadcast.from,
325
- name: broadcast.name,
326
- peerId: broadcast.peerId,
327
- multiaddrs: broadcast.multiaddrs,
328
- relayAddr: broadcast.relayAddr,
329
- canRelay: broadcast.canRelay,
330
- timestamp: broadcast.timestamp
331
- });
332
-
333
- const signature = Buffer.from(broadcast.signature, 'hex');
334
- const isValid = await this.verifySignature(broadcast.from, broadcastData, signature);
335
- if (!isValid) {
336
- console.warn(`[Registry] Invalid broadcast signature from ${broadcast.from.substring(0, 20)}`);
337
- return false;
338
- }
339
-
340
- const entry: AgentRegistryEntry = {
341
- did: broadcast.from,
342
- name: broadcast.name,
343
- peerId: broadcast.peerId,
344
- multiaddrs: broadcast.multiaddrs,
345
- registeredAt: Date.now(),
346
- lastSeen: broadcast.timestamp,
347
- lastBroadcast: 0,
348
- publicKey: Buffer.from(this.keyPair.publicKey).toString('hex'),
349
- relayAddr: broadcast.relayAddr,
350
- canRelay: broadcast.canRelay
351
- };
352
-
353
- const existing = this.agents.get(broadcast.from);
354
- if (existing) {
355
- entry.registeredAt = existing.registeredAt;
356
- entry.lastBroadcast = existing.lastBroadcast;
357
- if (!existing.publicKey) {
358
- existing.publicKey = entry.publicKey;
359
- }
360
- }
361
-
362
- this.agents.set(broadcast.from, entry);
363
- this.saveRegistry();
364
-
365
- console.log(`[Registry] Verified broadcast from: ${broadcast.name} (${broadcast.from.substring(0, 20)}...) ${broadcast.canRelay ? '[Relay Capable]' : ''}`);
366
- return true;
367
- }
368
-
369
- async createSignedMessage(type: string, payload: string): Promise<SignedMessage | null> {
370
- if (!this.keyPair || !this.ownEndpoint) return null;
371
-
372
- const messageData = JSON.stringify({
373
- type,
374
- from: this.keyPair.did,
375
- name: this.ownEndpoint.name,
376
- payload,
377
- timestamp: Date.now()
378
- });
379
-
380
- const signature = await this.signMessage(messageData);
381
- if (!signature) return null;
382
-
383
- return {
384
- type,
385
- from: this.keyPair.did,
386
- name: this.ownEndpoint.name,
387
- payload,
388
- timestamp: Date.now(),
389
- signature: Buffer.from(signature).toString('hex')
390
- };
391
- }
392
-
393
- async verifySignedMessage(msg: SignedMessage): Promise<boolean> {
394
- if (!this.keyPair || msg.from === this.keyPair.did) {
395
- return false;
396
- }
397
-
398
- if (Math.abs(msg.timestamp - Date.now()) > MESSAGE_TIMESTAMP_TOLERANCE) {
399
- console.log(`[Registry] Stale message from ${msg.from.substring(0, 20)}`);
400
- return false;
401
- }
402
-
403
- const messageData = JSON.stringify({
404
- type: msg.type,
405
- from: msg.from,
406
- name: msg.name,
407
- payload: msg.payload,
408
- timestamp: msg.timestamp
409
- });
410
-
411
- const signature = Buffer.from(msg.signature, 'hex');
412
- return this.verifySignature(msg.from, messageData, signature);
413
- }
414
-
415
- async connectToAgent(did: string): Promise<boolean> {
416
- const agent = this.agents.get(did);
417
- if (!agent) {
418
- console.log(`[Registry] Unknown agent: ${did}`);
419
- return false;
420
- }
421
-
422
- if (!agent.multiaddrs || agent.multiaddrs.length === 0) {
423
- console.log(`[Registry] No addresses for agent: ${agent.name}`);
424
- if (!agent.relayAddr) {
425
- return false;
426
- }
427
- console.log(`[Registry] Agent has relay address, will try relay connection`);
428
- }
429
-
430
- let connected = false;
431
-
432
- if (agent.multiaddrs && agent.multiaddrs.length > 0) {
433
- for (const addr of agent.multiaddrs) {
434
- try {
435
- const ma = createMultiaddr(addr);
436
- const node = (p2pNetwork as any).node;
437
- if (node) {
438
- await node.dial(ma);
439
- connected = true;
440
- console.log(`[Registry] Direct connection to ${agent.name} at ${addr}`);
441
- break;
442
- }
443
- } catch (e) {
444
- console.warn(`[Registry] Failed to connect directly to ${addr}:`, e);
445
- }
446
- }
447
- }
448
-
449
- if (!connected && agent.relayAddr) {
450
- console.log(`[Registry] Trying relay connection to ${agent.name} via ${agent.relayAddr}`);
451
- try {
452
- const node = (p2pNetwork as any).node;
453
- if (node) {
454
- const ma = createMultiaddr(`${agent.relayAddr}/p2p/${agent.peerId}`);
455
- await node.dial(ma);
456
- connected = true;
457
- console.log(`[Registry] Relay connection to ${agent.name} established`);
458
- }
459
- } catch (e) {
460
- console.warn(`[Registry] Failed to connect via relay:`, e);
461
- }
462
- }
463
-
464
- if (!connected && agent.canRelay) {
465
- const relayPeers = this.findRelayPeers();
466
- for (const relay of relayPeers) {
467
- if (relay.peerId === agent.peerId) continue;
468
- try {
469
- console.log(`[Registry] Trying to relay via ${relay.name} (${relay.peerId.substring(0, 12)}...)`);
470
- const relayAddr = relay.relayAddr || relay.multiaddrs?.[0];
471
- if (relayAddr) {
472
- const node = (p2pNetwork as any).node;
473
- if (node) {
474
- const ma = createMultiaddr(`${relayAddr}/p2p/${agent.peerId}`);
475
- await node.dial(ma);
476
- connected = true;
477
- console.log(`[Registry] Connection to ${agent.name} via relay ${relay.name}`);
478
- break;
479
- }
480
- }
481
- } catch (e) {
482
- console.warn(`[Registry] Failed to relay via ${relay.name}:`, e);
483
- }
484
- }
485
- }
486
-
487
- if (connected) {
488
- this.updateLastSeen(did);
489
- p2pNetwork.addPersistentPeer({
490
- peerId: agent.peerId,
491
- multiaddrs: agent.multiaddrs,
492
- did: agent.did,
493
- name: agent.name,
494
- relayAddr: agent.relayAddr,
495
- canRelay: agent.canRelay
496
- });
497
- }
498
-
499
- return connected;
500
- }
501
-
502
- private findRelayPeers(): AgentRegistryEntry[] {
503
- const now = Date.now();
504
- return Array.from(this.agents.values()).filter(
505
- a => a.canRelay && a.relayAddr && now - a.lastSeen < 30 * 60 * 1000
506
- );
507
- }
508
-
509
- async relayMessage(toDid: string, data: Uint8Array, fromDid: string, hops = 0): Promise<boolean> {
510
- if (hops >= MAX_RELAY_HOPS) {
511
- console.log(`[Registry] Max relay hops reached for ${toDid}`);
512
- return false;
513
- }
514
-
515
- const targetAgent = this.agents.get(toDid);
516
- if (!targetAgent) {
517
- console.log(`[Registry] Unknown relay target: ${toDid}`);
518
- return false;
519
- }
520
-
521
- try {
522
- const peerId = targetAgent.peerId;
523
- const relayMsg = new TextEncoder().encode(
524
- `RELAY:${fromDid}|${hops + 1}|${new TextDecoder().decode(data)}`
525
- );
526
- await p2pNetwork.sendMessage(peerId, 'relay', new TextDecoder().decode(relayMsg));
527
- return true;
528
- } catch (e) {
529
- console.warn(`[Registry] Relay failed to ${toDid}:`, e);
530
- return false;
531
- }
532
- }
533
-
534
- getConnectionInfo(): { did: string; name: string; peerId: string; multiaddrs: string[] } | null {
535
- if (!this.ownEndpoint) return null;
536
- return {
537
- did: this.ownEndpoint.did,
538
- name: this.ownEndpoint.name,
539
- peerId: this.ownEndpoint.peerId,
540
- multiaddrs: this.ownEndpoint.multiaddrs
541
- };
542
- }
543
- }
544
-
545
- export const agentRegistry = new AgentRegistry();
546
-
547
- export class AgentMessaging {
548
- private registry: AgentRegistry;
549
- private messageHandlers: Map<string, (msg: Uint8Array, from: string, did?: string) => void> = new Map();
550
-
551
- constructor(registry: AgentRegistry) {
552
- this.registry = registry;
553
- }
554
-
555
- registerHandler(type: string, handler: (msg: Uint8Array, from: string, did?: string) => void): void {
556
- this.messageHandlers.set(type, handler);
557
- }
558
-
559
- async sendSignedToAgent(did: string, type: string, payload: string): Promise<boolean> {
560
- const agent = this.registry.getAgent(did);
561
- if (!agent) {
562
- console.log(`[Messaging] Unknown agent: ${did}`);
563
- return false;
564
- }
565
-
566
- const signedMsg = await this.registry.createSignedMessage(type, payload);
567
- if (!signedMsg) {
568
- console.warn(`[Messaging] Failed to create signed message`);
569
- return false;
570
- }
571
-
572
- try {
573
- const messageStr = JSON.stringify(signedMsg);
574
- await p2pNetwork.sendMessage(agent.peerId, 'signed', messageStr);
575
- return true;
576
- } catch (e) {
577
- console.warn(`[Messaging] Failed to send to ${did}:`, e);
578
- return false;
579
- }
580
- }
581
-
582
- async sendToAgent(did: string, type: string, payload: string): Promise<boolean> {
583
- const agent = this.registry.getAgent(did);
584
- if (!agent) {
585
- console.log(`[Messaging] Unknown agent: ${did}`);
586
- return false;
587
- }
588
-
589
- const message = `${type}:${payload}`;
590
-
591
- try {
592
- await p2pNetwork.sendMessage(agent.peerId, type, payload);
593
- return true;
594
- } catch (e) {
595
- console.warn(`[Messaging] Failed to send to ${did}:`, e);
596
- return false;
597
- }
598
- }
599
-
600
- async broadcastToAll(type: string, payload: string): Promise<void> {
601
- const agents = this.registry.getOnlineAgents();
602
- const ownEndpoint = this.registry.getOwnEndpoint();
603
-
604
- for (const agent of agents) {
605
- if (agent.did === ownEndpoint?.did) continue;
606
-
607
- try {
608
- await p2pNetwork.sendMessage(agent.peerId, type, payload);
609
- } catch (e) {
610
- console.warn(`[Messaging] Broadcast failed to ${agent.name}:`, e);
611
- }
612
- }
613
- }
614
-
615
- parseMessage(data: Uint8Array): { type: string; payload: string; did?: string; isRelay?: boolean; relayHops?: number } | null {
616
- const messageStr = new TextDecoder().decode(data);
617
-
618
- if (messageStr.startsWith('RELAY:')) {
619
- const parts = messageStr.substring(6).split('|');
620
- if (parts.length >= 3) {
621
- const fromDid = parts[0];
622
- const hops = parseInt(parts[1], 10);
623
- const innerMessage = parts.slice(2).join('|');
624
- return this.parseInnerMessage(innerMessage, fromDid, true, hops);
625
- }
626
- }
627
-
628
- return this.parseInnerMessage(messageStr, undefined, false);
629
- }
630
-
631
- private parseInnerMessage(messageStr: string, relayFrom?: string, isRelay = false, relayHops = 0): { type: string; payload: string; did?: string; isRelay?: boolean; relayHops?: number } | null {
632
- if (messageStr.startsWith('DID:')) {
633
- const didEndIdx = messageStr.indexOf('|');
634
- if (didEndIdx > 0) {
635
- const did = messageStr.substring(4, didEndIdx);
636
- const afterDid = messageStr.substring(didEndIdx + 1);
637
- const colonIdx = afterDid.indexOf(':');
638
- if (colonIdx > 0) {
639
- return {
640
- type: afterDid.substring(0, colonIdx),
641
- payload: afterDid.substring(colonIdx + 1),
642
- did: relayFrom || did,
643
- isRelay,
644
- relayHops
645
- };
646
- }
647
- return { type: afterDid, payload: '', did: relayFrom || did, isRelay, relayHops };
648
- }
649
- }
650
-
651
- const colonIdx = messageStr.indexOf(':');
652
- if (colonIdx > 0) {
653
- return {
654
- type: messageStr.substring(0, colonIdx),
655
- payload: messageStr.substring(colonIdx + 1),
656
- did: relayFrom,
657
- isRelay,
658
- relayHops
659
- };
660
- }
661
- return { type: messageStr, payload: '', did: relayFrom, isRelay, relayHops };
662
- }
663
-
664
- async dispatchSignedMessage(data: Uint8Array, fromPeerId: string): Promise<boolean> {
665
- try {
666
- const messageStr = new TextDecoder().decode(data);
667
- const signedMsg: SignedMessage = JSON.parse(messageStr);
668
-
669
- if (!signedMsg.type || !signedMsg.from || !signedMsg.signature) {
670
- console.warn(`[Messaging] Invalid signed message format`);
671
- return false;
672
- }
673
-
674
- const isValid = await this.registry.verifySignedMessage(signedMsg);
675
- if (!isValid) {
676
- console.warn(`[Messaging] Signature verification failed for ${signedMsg.from.substring(0, 20)}`);
677
- return false;
678
- }
679
-
680
- const handler = this.messageHandlers.get(signedMsg.type);
681
- if (handler) {
682
- handler(data, fromPeerId, signedMsg.from);
683
- }
684
-
685
- return true;
686
- } catch (e) {
687
- console.warn(`[Messaging] Failed to dispatch signed message:`, e);
688
- return false;
689
- }
690
- }
691
-
692
- dispatchMessage(data: Uint8Array, fromPeerId: string): void {
693
- const parsed = this.parseMessage(data);
694
- if (!parsed) return;
695
-
696
- const handler = this.messageHandlers.get(parsed.type);
697
- if (handler) {
698
- handler(data, fromPeerId, parsed.did);
699
- }
700
- }
701
- }
702
-
703
- export const agentMessaging = new AgentMessaging(agentRegistry);
704
-
705
- export async function initializeAgentNetwork(
706
- ownDid: string,
707
- ownName: string,
708
- peerId: string,
709
- multiaddrs: string[]
710
- ): Promise<void> {
711
- await agentRegistry.initialize();
712
-
713
- const keyPair = agentRegistry.getKeyPair();
714
- const publicKeyHex = keyPair ? Buffer.from(keyPair.publicKey).toString('hex') : undefined;
715
-
716
- agentRegistry.setOwnEndpoint({
717
- did: keyPair?.did || ownDid,
718
- name: ownName,
719
- peerId,
720
- multiaddrs,
721
- publicKey: publicKeyHex
722
- });
723
-
724
- p2pNetwork.setOwnDid(keyPair?.did || ownDid);
725
-
726
- p2pNetwork.onMessage('signed', async (data, from, did) => {
727
- await agentMessaging.dispatchSignedMessage(data, from);
728
- });
729
-
730
- p2pNetwork.onMessage('address_broadcast', async (data, from, did) => {
731
- try {
732
- const messageStr = new TextDecoder().decode(data);
733
- const broadcast: AddressBroadcast = JSON.parse(messageStr);
734
- if (broadcast.type === 'address_broadcast') {
735
- await agentRegistry.handleAddressBroadcast(broadcast);
736
- }
737
- } catch (e) {
738
- console.warn(`[AgentNetwork] Failed to handle address broadcast:`, e);
739
- }
740
- });
741
-
742
- p2pNetwork.onMessage('relay', (data, from, did) => {
743
- try {
744
- const relayMsg = new TextDecoder().decode(data);
745
- const relayMatch = relayMsg.match(/^RELAY:(.+?)\|(\d+)\|(.+)$/);
746
- if (relayMatch) {
747
- const [, targetDid, hopsStr, innerData] = relayMatch;
748
- const hops = parseInt(hopsStr, 10);
749
-
750
- if (hops < MAX_RELAY_HOPS) {
751
- agentRegistry.relayMessage(targetDid, new TextEncoder().encode(innerData), did || from, hops);
752
- }
753
- }
754
- } catch (e) {
755
- console.warn(`[AgentNetwork] Failed to handle relay:`, e);
756
- }
757
- });
758
-
759
- p2pNetwork.onMessage('discovery', async (data, from, did) => {
760
- try {
761
- const messageStr = new TextDecoder().decode(data);
762
- const discovery: DiscoveryMessage = JSON.parse(messageStr);
763
- if (discovery.type === 'discovery') {
764
- const isValid = await agentRegistry.verifySignature(
765
- discovery.from,
766
- JSON.stringify({ ...discovery, signature: undefined }),
767
- Buffer.from(discovery.signature, 'hex')
768
- );
769
- if (isValid) {
770
- console.log(`[AgentNetwork] Verified discovery from: ${discovery.name}`);
771
- }
772
- }
773
- } catch (e) {
774
- console.warn(`[AgentNetwork] Failed to handle discovery:`, e);
775
- }
776
- });
777
-
778
- console.log(`[AgentNetwork] Initialized with DID: ${keyPair?.did.substring(0, 20) || ownDid.substring(0, 20)}...`);
779
- }
780
-
781
- export async function broadcastOwnAddress(): Promise<void> {
782
- const broadcast = await agentRegistry.createSignedBroadcast();
783
- if (broadcast) {
784
- const data = JSON.stringify(broadcast);
785
- await p2pNetwork.broadcast('address_broadcast', data);
786
- console.log(`[AgentNetwork] Broadcast signed address to network`);
787
- }
788
- }
789
-
790
- export async function findAndConnectToAgent(did: string): Promise<boolean> {
791
- return agentRegistry.connectToAgent(did);
792
- }
793
-
794
- export async function sendMessageToAgent(did: string, type: string, payload: string): Promise<boolean> {
795
- return agentMessaging.sendSignedToAgent(did, type, payload);
796
- }
797
-
798
- export async function sendUnverifiedMessageToAgent(did: string, type: string, payload: string): Promise<boolean> {
799
- return agentMessaging.sendToAgent(did, type, payload);
800
- }