@bolloon/bolloon-agent 0.1.0 → 0.1.2

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 (581) hide show
  1. package/bin/bolloon-cli.cjs +157 -0
  2. package/bin/bolloon-daemon.sh +207 -0
  3. package/bin/bolloon.cmd +11 -0
  4. package/dist/agents/constraint-layer.js +10 -15
  5. package/dist/agents/pi-sdk.js +433 -106
  6. package/dist/agents/protocol.js +82 -1
  7. package/dist/agents/subagent-manager.js +2 -2
  8. package/dist/agents/workflow-engine.js +15 -20
  9. package/dist/agents/workflow-pivot-loop.js +541 -0
  10. package/dist/bollharness/src/index.js +5 -0
  11. package/dist/bollharness/src/scripts/checks/check_adr_plan_numbering.js +6 -0
  12. package/dist/bollharness/src/scripts/checks/check_api_types.js +45 -0
  13. package/dist/bollharness/src/scripts/checks/check_artifact_link.js +146 -0
  14. package/dist/bollharness/src/scripts/checks/check_bridge_deps.js +6 -0
  15. package/dist/bollharness/src/scripts/checks/check_bugfix_binding.js +6 -0
  16. package/dist/bollharness/src/scripts/checks/check_bugfix_binding_ci.js +6 -0
  17. package/dist/bollharness/src/scripts/checks/check_doc_file_references.js +6 -0
  18. package/dist/bollharness/src/scripts/checks/check_doc_freshness.js +135 -0
  19. package/dist/bollharness/src/scripts/checks/check_doc_links.js +31 -0
  20. package/dist/bollharness/src/scripts/checks/check_file_existence_claims.js +6 -0
  21. package/dist/bollharness/src/scripts/checks/check_fragment_integrity.js +34 -0
  22. package/dist/bollharness/src/scripts/checks/check_hook_installed.js +63 -0
  23. package/dist/bollharness/src/scripts/checks/check_issue_closure.js +41 -0
  24. package/dist/bollharness/src/scripts/checks/check_mcp_parity.js +6 -0
  25. package/dist/bollharness/src/scripts/checks/check_security.js +48 -0
  26. package/dist/bollharness/src/scripts/checks/check_skill_parity.js +6 -0
  27. package/dist/bollharness/src/scripts/checks/check_versions.js +6 -0
  28. package/dist/bollharness/src/scripts/checks/finding.js +13 -0
  29. package/dist/bollharness/src/scripts/checks/next_decision_number.js +20 -0
  30. package/dist/bollharness/src/scripts/checks/regenerate_magic_docs.js +6 -0
  31. package/dist/bollharness/src/scripts/ci/detect_rebaseline_triggers.js +8 -0
  32. package/dist/bollharness/src/scripts/ci/scan_subprocess_cfg.js +8 -0
  33. package/dist/bollharness/src/scripts/ci/scan_verify_artifacts.js +8 -0
  34. package/dist/bollharness/src/scripts/ci/scan_yaml_schema.js +8 -0
  35. package/dist/bollharness/src/scripts/context_router.js +67 -0
  36. package/dist/bollharness/src/scripts/deploy-guard.js +157 -0
  37. package/dist/bollharness/src/scripts/guard-feedback.js +192 -0
  38. package/dist/bollharness/src/scripts/guard_router.js +158 -0
  39. package/dist/bollharness/src/scripts/hooks/_hook_output.js +6 -0
  40. package/dist/bollharness/src/scripts/hooks/auto-python3.js +6 -0
  41. package/dist/bollharness/src/scripts/hooks/deploy-progress-on-session-end.js +6 -0
  42. package/dist/bollharness/src/scripts/hooks/failure-analyzer.js +6 -0
  43. package/dist/bollharness/src/scripts/hooks/gate-judgment-inject.js +92 -0
  44. package/dist/bollharness/src/scripts/hooks/gate-transition-judgment.js +63 -0
  45. package/dist/bollharness/src/scripts/hooks/inbox-ack.js +6 -0
  46. package/dist/bollharness/src/scripts/hooks/inbox-inject-on-start.js +6 -0
  47. package/dist/bollharness/src/scripts/hooks/inbox-validate.js +6 -0
  48. package/dist/bollharness/src/scripts/hooks/inbox-write-ledger.js +6 -0
  49. package/dist/bollharness/src/scripts/hooks/initializer-agent.js +6 -0
  50. package/dist/bollharness/src/scripts/hooks/loop-detection.js +73 -0
  51. package/dist/bollharness/src/scripts/hooks/owner-guard.js +6 -0
  52. package/dist/bollharness/src/scripts/hooks/precompact.js +6 -0
  53. package/dist/bollharness/src/scripts/hooks/review-agent-gatekeeper.js +6 -0
  54. package/dist/bollharness/src/scripts/hooks/risk-tracker.js +108 -0
  55. package/dist/bollharness/src/scripts/hooks/sanitize-on-read.js +6 -0
  56. package/dist/bollharness/src/scripts/hooks/session-reflection.js +7 -0
  57. package/dist/bollharness/src/scripts/hooks/session-start-magic-docs.js +7 -0
  58. package/dist/bollharness/src/scripts/hooks/session-start-reset-risk.js +7 -0
  59. package/dist/bollharness/src/scripts/hooks/session-start-toolkit-reminder.js +7 -0
  60. package/dist/bollharness/src/scripts/hooks/stop-evaluator.js +157 -0
  61. package/dist/bollharness/src/scripts/hooks/tool-call-counter.js +6 -0
  62. package/dist/bollharness/src/scripts/hooks/trace-analyzer.js +10 -0
  63. package/dist/bollharness/src/scripts/install/install-trust-token.js +7 -0
  64. package/dist/bollharness/src/scripts/install/multi_project_registry.js +9 -0
  65. package/dist/bollharness/src/scripts/install/phase2_auto.js +21 -0
  66. package/dist/bollharness/src/scripts/install/pre_commit_installer.js +6 -0
  67. package/dist/bollharness/src/scripts/install/tier_selector.js +7 -0
  68. package/dist/bollharness/src/scripts/install/transcript_miner.js +7 -0
  69. package/dist/bollharness/src/scripts/lib/claim_patterns.js +10 -0
  70. package/dist/bollharness/src/scripts/lib/sanitize_patterns.js +12 -0
  71. package/dist/bollharness/src/scripts/sanitize.js +6 -0
  72. package/dist/bollharness-integration/channel-judgment-engine.js +530 -0
  73. package/dist/bollharness-integration/context-chain-router.js +383 -0
  74. package/dist/bollharness-integration/context-router-judgment.js +13 -21
  75. package/dist/bollharness-integration/context-router.js +22 -64
  76. package/dist/bollharness-integration/gate-state-machine.js +14 -19
  77. package/dist/bollharness-integration/gate-transition-hooks.js +16 -61
  78. package/dist/bollharness-integration/guard-checker.js +21 -68
  79. package/dist/bollharness-integration/index.js +14 -124
  80. package/dist/bollharness-integration/integration.js +13 -20
  81. package/dist/bollharness-integration/llm-judgment-engine.js +569 -0
  82. package/dist/bollharness-integration/skill-adapter.js +18 -64
  83. package/dist/cli-entry.js +261 -0
  84. package/dist/constraint-runtime/src/commands.js +17 -7
  85. package/dist/constraint-runtime/src/constraint/budget.js +1 -6
  86. package/dist/constraint-runtime/src/constraint/permission.js +1 -6
  87. package/dist/constraint-runtime/src/models.js +1 -3
  88. package/dist/constraint-runtime/src/tools.js +17 -7
  89. package/dist/constraints/index.js +1 -7
  90. package/dist/documents/reader.js +8 -49
  91. package/dist/heartbeat/DaemonManager.js +242 -0
  92. package/dist/heartbeat/HealthMonitor.js +285 -0
  93. package/dist/heartbeat/StartupVerifier.js +205 -0
  94. package/dist/heartbeat/Watchdog.js +168 -0
  95. package/dist/heartbeat/index.js +84 -0
  96. package/dist/heartbeat/types.js +5 -0
  97. package/dist/index.js +381 -28
  98. package/dist/llm/config-store.js +31 -57
  99. package/dist/llm/llm-judgment-client.js +389 -0
  100. package/dist/llm/pi-ai.js +9 -52
  101. package/dist/network/agent-network.js +46 -90
  102. package/dist/network/hybrid-messenger.js +125 -0
  103. package/dist/network/iroh-bootstrap.js +38 -0
  104. package/dist/network/iroh-discovery.js +145 -0
  105. package/dist/network/iroh-integration.js +9 -16
  106. package/dist/network/iroh-transport.js +10 -48
  107. package/dist/network/p2p.js +23 -62
  108. package/dist/network/storage/adapters/json-adapter.js +4 -42
  109. package/dist/network/storage/index.js +147 -0
  110. package/dist/network/storage/types.js +14 -0
  111. package/dist/pi-ecosystem/index.js +233 -0
  112. package/dist/pi-ecosystem-colony/index.js +29 -90
  113. package/dist/pi-ecosystem-goals/index.js +20 -74
  114. package/dist/pi-ecosystem-judgment/decision.js +29 -47
  115. package/dist/pi-ecosystem-judgment/distillation.js +16 -29
  116. package/dist/pi-ecosystem-judgment/human-value-store.js +13 -60
  117. package/dist/pi-ecosystem-judgment/index.js +21 -74
  118. package/dist/pi-ecosystem-judgment/value-injection.js +26 -72
  119. package/dist/pi-ecosystem-mcp/index.js +24 -78
  120. package/dist/pi-ecosystem-subagents/index.js +20 -69
  121. package/dist/social/ant-colony/AdaptiveHeartbeat.js +3 -8
  122. package/dist/social/ant-colony/PheromoneEngine.js +11 -49
  123. package/dist/social/ant-colony/index.js +6 -0
  124. package/dist/social/ant-colony/types.js +4 -8
  125. package/dist/social/channels/ChannelManager.js +8 -46
  126. package/dist/social/channels/DiapChannelBridge.js +9 -47
  127. package/dist/social/channels/InterestMatcher.js +2 -7
  128. package/dist/social/channels/channel-agent-session.js +309 -0
  129. package/dist/social/channels/channel-heartbeat-agent.js +494 -0
  130. package/dist/social/channels/diap-doc-parser.js +204 -0
  131. package/dist/social/channels/harness-workflow-integrator.js +446 -0
  132. package/dist/social/channels/index.js +9 -0
  133. package/dist/social/channels/types.js +3 -7
  134. package/dist/social/global-shared-context.js +6 -47
  135. package/dist/social/heartbeat.js +29 -72
  136. package/dist/social/persona/enhanced-persona.js +299 -0
  137. package/dist/web/client.js +302 -136
  138. package/dist/web/components/p2p/index.js +159 -9
  139. package/dist/web/components/p2p/p2p-connection.js +136 -0
  140. package/dist/web/components/p2p/p2p-manager.js +24 -0
  141. package/dist/web/components/p2p/p2p-store-memory.js +1 -1
  142. package/dist/web/components/p2p/types.js +7 -0
  143. package/dist/web/index.html +5 -0
  144. package/dist/web/style.css +118 -0
  145. package/package.json +12 -6
  146. package/scripts/build-cli.js +206 -0
  147. package/scripts/postinstall.js +153 -0
  148. package/src/agents/pi-sdk.ts +347 -28
  149. package/src/agents/protocol.ts +95 -1
  150. package/src/agents/workflow-pivot-loop.ts +674 -0
  151. package/src/bollharness/scripts/context-fragments/pi-agent-operations.md +34 -0
  152. package/src/cli-entry.ts +304 -0
  153. package/src/heartbeat/DaemonManager.ts +283 -0
  154. package/src/heartbeat/HealthMonitor.ts +316 -0
  155. package/src/heartbeat/StartupVerifier.ts +223 -0
  156. package/src/heartbeat/Watchdog.ts +198 -0
  157. package/src/heartbeat/index.ts +108 -0
  158. package/src/heartbeat/types.ts +82 -0
  159. package/src/llm/config-store.ts +23 -5
  160. package/src/network/iroh-transport.ts +3 -3
  161. package/src/web/client.js +302 -136
  162. package/src/web/components/p2p/P2PModal.tsx +91 -3
  163. package/src/web/components/p2p/index.ts +171 -9
  164. package/src/web/components/p2p/p2p-connection.ts +153 -1
  165. package/src/web/components/p2p/p2p-manager.ts +39 -1
  166. package/src/web/components/p2p/p2p-store-memory.ts +1 -1
  167. package/src/web/components/p2p/p2p-tools.ts +315 -0
  168. package/src/web/components/p2p/types.ts +58 -0
  169. package/src/web/index.html +5 -0
  170. package/src/web/server.ts +353 -36
  171. package/src/web/style.css +118 -0
  172. package/tsconfig.cli.json +16 -0
  173. package/tsconfig.electron.json +1 -1
  174. package/tsconfig.json +1 -2
  175. package/dist/constraint-runtime/tests/agent.test.js +0 -16
  176. package/dist/constraint-runtime/tests/constraint.test.js +0 -41
  177. package/dist/constraint-runtime/tests/skill.test.js +0 -19
  178. package/dist/constraint-runtime/tests/thinking.test.js +0 -22
  179. package/dist/electron-preload.js +0 -15
  180. package/dist/electron-preload.js.map +0 -1
  181. package/dist/electron.js +0 -206
  182. package/dist/electron.js.map +0 -1
  183. package/dist/test/constraint-layer.test.js +0 -164
  184. package/dist/test/global-shared-context.test.js +0 -315
  185. package/dist/test/pi-sdk.test.js +0 -47
  186. package/dist/test/set-persona.test.js +0 -38
  187. package/dist/test/subagent-manager.test.js +0 -276
  188. package/dist/test/workflow-engine.test.js +0 -87
  189. package/dist/web/server.js +0 -1647
  190. package/dist/web/server.js.map +0 -1
  191. package/dist/workflows/collaboration.js +0 -374
  192. package/dist/workflows/index.js +0 -54
  193. package/docs/agent-communication.md +0 -333
  194. package/docs/plans/2026-05-15-document-agent-design.md +0 -479
  195. package/docs/plans/2026-05-15-document-agent-implementation-plan.md +0 -792
  196. package/docs/plans/2026-05-16-chat-ui-design.md +0 -86
  197. package/docs/plans/2026-05-16-constraint-runtime-design.md +0 -106
  198. package/docs/plans/2026-05-16-constraint-runtime-implementation.md +0 -441
  199. package/docs//346/225/260/345/255/246/350/276/205/345/212/251/346/231/272/350/203/275/344/275/223-/346/240/270/345/277/203/346/225/210/346/236/234/345/256/232/344/271/211.md +0 -287
  200. package/src/bollharness/.boll/CLAUDE.md.template +0 -34
  201. package/src/bollharness/.boll/MANIFEST.yaml +0 -213
  202. package/src/bollharness/.boll/active-review-agents/.gitkeep +0 -0
  203. package/src/bollharness/.boll/agents/review-base.yaml +0 -108
  204. package/src/bollharness/.boll/deploy-allowlist.yaml +0 -38
  205. package/src/bollharness/.boll/inbox/schema/message-v1.json +0 -99
  206. package/src/bollharness/.boll/install-staging/.gitkeep +0 -0
  207. package/src/bollharness/.boll/issue-adapter.yaml +0 -31
  208. package/src/bollharness/.boll/plugins/boll-mode-toolkit/contracts/mode-contract.md +0 -85
  209. package/src/bollharness/.boll/plugins/boll-review-toolkit/contracts/evidence-packet-schema.json +0 -102
  210. package/src/bollharness/.boll/plugins/boll-review-toolkit/contracts/review-contract.yaml +0 -247
  211. package/src/bollharness/.boll/rules/backend-routes.md +0 -31
  212. package/src/bollharness/.boll/rules/closure-semantics.md +0 -30
  213. package/src/bollharness/.boll/rules/env-vars.md +0 -32
  214. package/src/bollharness/.boll/rules/hanis-protocol.md +0 -145
  215. package/src/bollharness/.boll/rules/repo-structure.md +0 -42
  216. package/src/bollharness/.boll/rules/review-agent-isolation.md +0 -73
  217. package/src/bollharness/.boll/rules/source-of-truth.md +0 -33
  218. package/src/bollharness/.boll/settings.json +0 -180
  219. package/src/bollharness/.boll/settings.json.template +0 -31
  220. package/src/bollharness/.boll/skills/arch/SKILL.md +0 -372
  221. package/src/bollharness/.boll/skills/bug-pipeline/SKILL.md +0 -168
  222. package/src/bollharness/.boll/skills/bug-triage/SKILL.md +0 -161
  223. package/src/bollharness/.boll/skills/context-chains/SKILL.md +0 -250
  224. package/src/bollharness/.boll/skills/context-chains/context-chain-index.md +0 -48
  225. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/code_change_extractor.ts +0 -142
  226. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/debugging_extractor.ts +0 -126
  227. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/design_extractor.ts +0 -148
  228. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/planning_extractor.ts +0 -162
  229. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/question_extractor.ts +0 -116
  230. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/review_extractor.ts +0 -136
  231. package/src/bollharness/.boll/skills/crystal-learn/SKILL.md +0 -93
  232. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-0.md +0 -34
  233. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-1.md +0 -34
  234. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-2.md +0 -35
  235. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-3.md +0 -34
  236. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-4.md +0 -43
  237. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-5.md +0 -34
  238. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-6.md +0 -37
  239. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-7.md +0 -46
  240. package/src/bollharness/.boll/skills/guardian-fixer/PROMPT.md +0 -415
  241. package/src/bollharness/.boll/skills/guardian-fixer/SKILL.md +0 -320
  242. package/src/bollharness/.boll/skills/harness-dev/SKILL.md +0 -93
  243. package/src/bollharness/.boll/skills/harness-dev/examples/README.md +0 -227
  244. package/src/bollharness/.boll/skills/harness-dev-handoff/SKILL.md +0 -165
  245. package/src/bollharness/.boll/skills/harness-eng/SKILL.md +0 -110
  246. package/src/bollharness/.boll/skills/harness-eng-test/SKILL.md +0 -79
  247. package/src/bollharness/.boll/skills/harness-lab/SKILL.md +0 -170
  248. package/src/bollharness/.boll/skills/harness-ops/SKILL.md +0 -57
  249. package/src/bollharness/.boll/skills/harness-voice/SKILL.md +0 -183
  250. package/src/bollharness/.boll/skills/judgment/SKILL.md +0 -115
  251. package/src/bollharness/.boll/skills/lead/SKILL.md +0 -245
  252. package/src/bollharness/.boll/skills/lead/install-wow-harness.md +0 -77
  253. package/src/bollharness/.boll/skills/lead/ref-review-sop.md +0 -91
  254. package/src/bollharness/.boll/skills/lead/ref-stages.md +0 -129
  255. package/src/bollharness/.boll/skills/skill-discovery/SKILL.md +0 -169
  256. package/src/bollharness/.boll/skills/task-arch/SKILL.md +0 -106
  257. package/src/bollharness/.boll/skills/toolkit/SKILL.md +0 -57
  258. package/src/bollharness/.boll/tasks/.gitkeep +0 -0
  259. package/src/bollharness/.boll/toolkit-index.yaml +0 -112
  260. package/src/bollharness/.claude/agents/review-base.yaml +0 -108
  261. package/src/bollharness/.claude/plugins/boll-mode-toolkit/.claude-plugin/plugin.json +0 -44
  262. package/src/bollharness/.claude/plugins/boll-review-toolkit/.claude-plugin/plugin.json +0 -24
  263. package/src/bollharness/.claude/plugins/boll-review-toolkit/contracts/evidence-packet-schema.json +0 -102
  264. package/src/bollharness/.claude/plugins/boll-review-toolkit/contracts/review-contract.yaml +0 -247
  265. package/src/bollharness/.claude/settings.json +0 -157
  266. package/src/bollharness/.claude/skills/arch/SKILL.md +0 -64
  267. package/src/bollharness/.claude/skills/crystal-learn/SKILL.md +0 -93
  268. package/src/bollharness/.claude/skills/guardian-fixer/PROMPT.md +0 -44
  269. package/src/bollharness/.claude/skills/guardian-fixer/SKILL.md +0 -324
  270. package/src/bollharness/.claude/skills/harness-dev/SKILL.md +0 -93
  271. package/src/bollharness/.claude/skills/harness-dev/examples/README.md +0 -17
  272. package/src/bollharness/.claude/skills/harness-dev-handoff/SKILL.md +0 -165
  273. package/src/bollharness/.claude/skills/harness-eng/SKILL.md +0 -183
  274. package/src/bollharness/.claude/skills/harness-eng-test/SKILL.md +0 -57
  275. package/src/bollharness/.claude/skills/harness-ops/SKILL.md +0 -57
  276. package/src/bollharness/.claude/skills/harness-voice/SKILL.md +0 -84
  277. package/src/bollharness/.claude/skills/lead/INDEX.md +0 -28
  278. package/src/bollharness/.claude/skills/lead/SKILL.md +0 -24
  279. package/src/bollharness/.claude/skills/lead/install-wow-harness.md +0 -77
  280. package/src/bollharness/.claude/skills/lead/ref-review-sop.md +0 -48
  281. package/src/bollharness/.claude/skills/lead/ref-stages.md +0 -58
  282. package/src/bollharness/.claude/skills/plan-lock/SKILL.md +0 -74
  283. package/src/bollharness/.claude/skills/skill-discovery/SKILL.md +0 -120
  284. package/src/bollharness/.claude/skills/task-arch/SKILL.md +0 -106
  285. package/src/bollharness/.claude/skills/toolkit/SKILL.md +0 -57
  286. package/src/bollharness/.claude/skills/toolkit/list.sh +0 -92
  287. package/src/bollharness/.githooks/pre-commit +0 -21
  288. package/src/bollharness/.github/workflows/ci.yml +0 -88
  289. package/src/bollharness/docs/decisions/ADR-030-guard-signal-protocol-and-governance-reload.md +0 -1076
  290. package/src/bollharness/docs/decisions/ADR-038-harness-optimization-strategy.md +0 -2039
  291. package/src/bollharness/docs/decisions/ADR-041-codex-claude-code-division-of-labor.md +0 -128
  292. package/src/bollharness/docs/decisions/ADR-H1-crystal-learn-revival.md +0 -188
  293. package/src/bollharness/docs/decisions/ADR-H2-identity-isolation.md +0 -183
  294. package/src/bollharness/docs/decisions/ADR-H3-memory-scope.md +0 -133
  295. package/src/bollharness/docs/decisions/ADR-H4-prompt-governance.md +0 -146
  296. package/src/bollharness/docs/decisions/ADR-H5-gate-quantization.md +0 -212
  297. package/src/bollharness/docs/decisions/ADR-H6-state-file-health.md +0 -211
  298. package/src/bollharness/docs/decisions/ADR-H8-issue-and-doc-compliance.md +0 -202
  299. package/src/bollharness/docs/decisions/ADR-H9-mailbox.md +0 -231
  300. package/src/bollharness/docs/decisions/PLAN-H1-crystal-learn-revival.md +0 -270
  301. package/src/bollharness/docs/decisions/PLAN-H2-identity-isolation.md +0 -291
  302. package/src/bollharness/docs/decisions/PLAN-H3-memory-scope.md +0 -228
  303. package/src/bollharness/docs/decisions/PLAN-H4-prompt-governance.md +0 -227
  304. package/src/bollharness/docs/decisions/PLAN-H5-gate-quantization.md +0 -239
  305. package/src/bollharness/docs/decisions/PLAN-H6-state-file-health.md +0 -325
  306. package/src/bollharness/docs/decisions/PLAN-H8-issue-and-doc-compliance.md +0 -242
  307. package/src/bollharness/docs/decisions/PLAN-H9-mailbox.md +0 -378
  308. package/src/bollharness/docs/launch-article-en.md +0 -276
  309. package/src/bollharness/docs/launch-article-zh.md +0 -305
  310. package/src/bollharness/docs/practice.html +0 -356
  311. package/src/bollharness/docs/practice.md +0 -82
  312. package/src/bollharness/docs/research/round-1/README.md +0 -11
  313. package/src/bollharness/docs/research/round-2/README.md +0 -11
  314. package/src/bollharness/docs/research/round-3/README.md +0 -11
  315. package/src/bollharness/docs/research/round-4/README.md +0 -11
  316. package/src/bollharness/docs/research/round-5/README.md +0 -11
  317. package/src/bollharness/docs/research/round-6/README.md +0 -11
  318. package/src/bollharness/package-lock.json +0 -48
  319. package/src/bollharness/reference/boll-reference/.claude/rules/backend-routes.md +0 -268
  320. package/src/bollharness/reference/boll-reference/.claude/rules/bridge.md +0 -20
  321. package/src/bollharness/reference/boll-reference/.claude/rules/closure-semantics.md +0 -30
  322. package/src/bollharness/reference/boll-reference/.claude/rules/coaching.md +0 -13
  323. package/src/bollharness/reference/boll-reference/.claude/rules/env-vars.md +0 -50
  324. package/src/bollharness/reference/boll-reference/.claude/rules/hackathon.md +0 -12
  325. package/src/bollharness/reference/boll-reference/.claude/rules/repo-structure.md +0 -184
  326. package/src/bollharness/reference/boll-reference/.claude/rules/review-agent-isolation.md +0 -112
  327. package/src/bollharness/reference/boll-reference/.claude/rules/scenes.md +0 -12
  328. package/src/bollharness/reference/boll-reference/.claude/skills/arch/SKILL.md +0 -551
  329. package/src/bollharness/reference/boll-reference/.claude/skills/boll-animation/SKILL.md +0 -26
  330. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/SKILL.md +0 -227
  331. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/agents/openai.yaml +0 -4
  332. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/references/bridge-failure-taxonomy.md +0 -142
  333. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/references/bridge-validation-ladder.md +0 -107
  334. package/src/bollharness/reference/boll-reference/.claude/skills/boll-crystal/SKILL.md +0 -893
  335. package/src/bollharness/reference/boll-reference/.claude/skills/boll-crystal-learn/SKILL.md +0 -89
  336. package/src/bollharness/reference/boll-reference/.claude/skills/boll-dev/SKILL.md +0 -93
  337. package/src/bollharness/reference/boll-reference/.claude/skills/boll-dev/examples/README.md +0 -209
  338. package/src/bollharness/reference/boll-reference/.claude/skills/boll-dev-handoff/SKILL.md +0 -165
  339. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng/SKILL.md +0 -110
  340. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-frontend/SKILL.md +0 -203
  341. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-hdc/SKILL.md +0 -27
  342. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-orchestrator/SKILL.md +0 -28
  343. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-prompt/SKILL.md +0 -27
  344. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-test/SKILL.md +0 -79
  345. package/src/bollharness/reference/boll-reference/.claude/skills/boll-lab/SKILL.md +0 -372
  346. package/src/bollharness/reference/boll-reference/.claude/skills/boll-run/SKILL.md +0 -437
  347. package/src/bollharness/reference/boll-reference/.claude/skills/boll-ux-appstore/SKILL.md +0 -27
  348. package/src/bollharness/reference/boll-reference/.claude/skills/boll-voice/SKILL.md +0 -442
  349. package/src/bollharness/reference/boll-reference/.claude/skills/guardian-fixer/PROMPT.md +0 -421
  350. package/src/bollharness/reference/boll-reference/.claude/skills/guardian-fixer/SKILL.md +0 -326
  351. package/src/bollharness/reference/boll-reference/.claude/skills/lead/SKILL.md +0 -155
  352. package/src/bollharness/reference/boll-reference/.claude/skills/lead/ref-review-sop.md +0 -91
  353. package/src/bollharness/reference/boll-reference/.claude/skills/lead/ref-stages.md +0 -129
  354. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-preview.png +0 -0
  355. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-v2.png +0 -0
  356. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-v3.png +0 -0
  357. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-v4.png +0 -0
  358. package/src/bollharness/reference/boll-reference/.claude/skills/plan-lock/SKILL.md +0 -425
  359. package/src/bollharness/reference/boll-reference/.claude/skills/plan-lock/ref-three-checks.md +0 -62
  360. package/src/bollharness/reference/boll-reference/.claude/skills/plan-lock/ref-wp-templates.md +0 -78
  361. package/src/bollharness/reference/boll-reference/.claude/skills/task-arch/SKILL.md +0 -76
  362. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-graph/SKILL.md +0 -57
  363. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-graph/beads-graph.sh +0 -153
  364. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-init/SKILL.md +0 -52
  365. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-init/beads-auto-link.sh +0 -76
  366. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-sync/SKILL.md +0 -50
  367. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-sync/beads-sync-proj.sh +0 -108
  368. package/src/bollharness/reference/boll-reference/docs/architecture/AGENT-PROFILE.md +0 -151
  369. package/src/bollharness/reference/boll-reference/docs/architecture/COST-STRUCTURE.md +0 -56
  370. package/src/bollharness/reference/boll-reference/docs/architecture/INDEX.md +0 -76
  371. package/src/bollharness/reference/boll-reference/docs/architecture/MODULE1-INTENT-FIELD.md +0 -116
  372. package/src/bollharness/reference/boll-reference/docs/architecture/MODULE2-CRYSTALLIZATION.md +0 -200
  373. package/src/bollharness/reference/boll-reference/docs/architecture/PRINCIPLES.md +0 -84
  374. package/src/bollharness/reference/boll-reference/docs/architecture/PROTOCOL-CORE.md +0 -209
  375. package/src/bollharness/reference/boll-reference/docs/architecture/VISION.md +0 -181
  376. package/src/bollharness/reference/boll-reference/docs/architecture/discussions/D-01-MARKET-SCENE-PROTOCOL.md +0 -754
  377. package/src/bollharness/templates/scaffold/.boll/guard/.gitkeep +0 -0
  378. package/src/bollharness/templates/scaffold/.boll/metrics/.gitkeep +0 -0
  379. package/src/bollharness/templates/scaffold/.boll/state/.gitkeep +0 -0
  380. package/src/bollharness/templates/scaffold/docs/INDEX.md +0 -3
  381. package/src/bollharness/templates/scaffold/docs/decisions/ADR_TEMPLATE.md +0 -38
  382. package/src/bollharness/templates/scaffold/docs/decisions/PLAN_TEMPLATE.md +0 -45
  383. package/src/bollharness/templates/scaffold/docs/decisions/tasks/.gitkeep +0 -2
  384. package/src/bollharness/templates/scaffold/docs/issues/.gitkeep +0 -0
  385. package/src/bollharness/templates/scaffold/docs/issues/GUARD_ISSUE_TEMPLATE.md +0 -35
  386. package/src/bollharness/templates/scaffold/docs/issues/ISSUE_TEMPLATE.md +0 -51
  387. package/src/bollharness/tsconfig.json +0 -26
  388. package/src/constraint-runtime/package-lock.json +0 -48
  389. package/src/constraint-runtime/package.json +0 -34
  390. package/src/constraint-runtime/src/_archive_helper.ts +0 -16
  391. package/src/constraint-runtime/src/agent/coordinator.ts +0 -71
  392. package/src/constraint-runtime/src/agent/index.ts +0 -1
  393. package/src/constraint-runtime/src/assistant/index.ts +0 -15
  394. package/src/constraint-runtime/src/bootstrap/index.ts +0 -15
  395. package/src/constraint-runtime/src/bootstrap_graph.ts +0 -17
  396. package/src/constraint-runtime/src/bridge/index.ts +0 -15
  397. package/src/constraint-runtime/src/buddy/index.ts +0 -15
  398. package/src/constraint-runtime/src/cli/index.ts +0 -15
  399. package/src/constraint-runtime/src/command_graph.ts +0 -20
  400. package/src/constraint-runtime/src/commands.ts +0 -83
  401. package/src/constraint-runtime/src/components/index.ts +0 -15
  402. package/src/constraint-runtime/src/constants/index.ts +0 -15
  403. package/src/constraint-runtime/src/constraint/budget.ts +0 -25
  404. package/src/constraint-runtime/src/constraint/index.ts +0 -3
  405. package/src/constraint-runtime/src/constraint/permission.ts +0 -28
  406. package/src/constraint-runtime/src/context.ts +0 -45
  407. package/src/constraint-runtime/src/coordinator/index.ts +0 -15
  408. package/src/constraint-runtime/src/cost_hook.ts +0 -6
  409. package/src/constraint-runtime/src/cost_tracker.ts +0 -9
  410. package/src/constraint-runtime/src/deferred_init.ts +0 -18
  411. package/src/constraint-runtime/src/direct_modes.ts +0 -13
  412. package/src/constraint-runtime/src/dynamic-tool-loader.ts +0 -115
  413. package/src/constraint-runtime/src/entrypoints/index.ts +0 -15
  414. package/src/constraint-runtime/src/execution_registry.ts +0 -41
  415. package/src/constraint-runtime/src/history.ts +0 -16
  416. package/src/constraint-runtime/src/hooks/index.ts +0 -15
  417. package/src/constraint-runtime/src/index.ts +0 -28
  418. package/src/constraint-runtime/src/ink.ts +0 -4
  419. package/src/constraint-runtime/src/keybindings/index.ts +0 -15
  420. package/src/constraint-runtime/src/memdir/index.ts +0 -15
  421. package/src/constraint-runtime/src/migrations/index.ts +0 -15
  422. package/src/constraint-runtime/src/models.ts +0 -49
  423. package/src/constraint-runtime/src/moreright/index.ts +0 -15
  424. package/src/constraint-runtime/src/native_ts/index.ts +0 -15
  425. package/src/constraint-runtime/src/output_styles/index.ts +0 -15
  426. package/src/constraint-runtime/src/parity_audit.ts +0 -23
  427. package/src/constraint-runtime/src/plugins/index.ts +0 -15
  428. package/src/constraint-runtime/src/port_manifest.ts +0 -20
  429. package/src/constraint-runtime/src/prefetch.ts +0 -17
  430. package/src/constraint-runtime/src/query.ts +0 -7
  431. package/src/constraint-runtime/src/reference_data/archive_surface_snapshot.json +0 -63
  432. package/src/constraint-runtime/src/reference_data/commands_snapshot.json +0 -1037
  433. package/src/constraint-runtime/src/reference_data/subsystems/OpenCLI.json +0 -10
  434. package/src/constraint-runtime/src/reference_data/subsystems/PolymarketSDK.json +0 -12
  435. package/src/constraint-runtime/src/reference_data/subsystems/SafeSDK.json +0 -14
  436. package/src/constraint-runtime/src/reference_data/subsystems/assistant.json +0 -8
  437. package/src/constraint-runtime/src/reference_data/subsystems/bootstrap.json +0 -8
  438. package/src/constraint-runtime/src/reference_data/subsystems/bridge.json +0 -32
  439. package/src/constraint-runtime/src/reference_data/subsystems/buddy.json +0 -13
  440. package/src/constraint-runtime/src/reference_data/subsystems/cli.json +0 -26
  441. package/src/constraint-runtime/src/reference_data/subsystems/components.json +0 -32
  442. package/src/constraint-runtime/src/reference_data/subsystems/constants.json +0 -28
  443. package/src/constraint-runtime/src/reference_data/subsystems/coordinator.json +0 -8
  444. package/src/constraint-runtime/src/reference_data/subsystems/entrypoints.json +0 -15
  445. package/src/constraint-runtime/src/reference_data/subsystems/hooks.json +0 -32
  446. package/src/constraint-runtime/src/reference_data/subsystems/keybindings.json +0 -21
  447. package/src/constraint-runtime/src/reference_data/subsystems/memdir.json +0 -15
  448. package/src/constraint-runtime/src/reference_data/subsystems/migrations.json +0 -18
  449. package/src/constraint-runtime/src/reference_data/subsystems/moreright.json +0 -8
  450. package/src/constraint-runtime/src/reference_data/subsystems/native_ts.json +0 -11
  451. package/src/constraint-runtime/src/reference_data/subsystems/outputStyles.json +0 -8
  452. package/src/constraint-runtime/src/reference_data/subsystems/plugins.json +0 -9
  453. package/src/constraint-runtime/src/reference_data/subsystems/remote.json +0 -11
  454. package/src/constraint-runtime/src/reference_data/subsystems/schemas.json +0 -8
  455. package/src/constraint-runtime/src/reference_data/subsystems/screens.json +0 -10
  456. package/src/constraint-runtime/src/reference_data/subsystems/server.json +0 -10
  457. package/src/constraint-runtime/src/reference_data/subsystems/services.json +0 -32
  458. package/src/constraint-runtime/src/reference_data/subsystems/skills.json +0 -27
  459. package/src/constraint-runtime/src/reference_data/subsystems/state.json +0 -13
  460. package/src/constraint-runtime/src/reference_data/subsystems/types.json +0 -18
  461. package/src/constraint-runtime/src/reference_data/subsystems/upstreamproxy.json +0 -9
  462. package/src/constraint-runtime/src/reference_data/subsystems/utils.json +0 -32
  463. package/src/constraint-runtime/src/reference_data/subsystems/vim.json +0 -12
  464. package/src/constraint-runtime/src/reference_data/subsystems/voice.json +0 -8
  465. package/src/constraint-runtime/src/reference_data/tools_snapshot.json +0 -1042
  466. package/src/constraint-runtime/src/remote/index.ts +0 -15
  467. package/src/constraint-runtime/src/remote_runtime.ts +0 -17
  468. package/src/constraint-runtime/src/runtime/index.ts +0 -1
  469. package/src/constraint-runtime/src/runtime/session.ts +0 -42
  470. package/src/constraint-runtime/src/schemas/index.ts +0 -15
  471. package/src/constraint-runtime/src/screens/index.ts +0 -15
  472. package/src/constraint-runtime/src/server/index.ts +0 -15
  473. package/src/constraint-runtime/src/services/index.ts +0 -15
  474. package/src/constraint-runtime/src/session_store.ts +0 -32
  475. package/src/constraint-runtime/src/setup.ts +0 -50
  476. package/src/constraint-runtime/src/skills/index.ts +0 -1
  477. package/src/constraint-runtime/src/skills/skill-registry.ts +0 -40
  478. package/src/constraint-runtime/src/state/index.ts +0 -15
  479. package/src/constraint-runtime/src/system_init.ts +0 -21
  480. package/src/constraint-runtime/src/thinking/engine.ts +0 -61
  481. package/src/constraint-runtime/src/thinking/index.ts +0 -1
  482. package/src/constraint-runtime/src/tool_pool.ts +0 -20
  483. package/src/constraint-runtime/src/tools/OpenCLI/execAdapter.ts +0 -12
  484. package/src/constraint-runtime/src/tools/OpenCLI/listAdapters.ts +0 -12
  485. package/src/constraint-runtime/src/tools/OpenCLI/runCommand.ts +0 -13
  486. package/src/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.ts +0 -10
  487. package/src/constraint-runtime/src/tools/PolymarketSDK/createOrder.ts +0 -13
  488. package/src/constraint-runtime/src/tools/PolymarketSDK/getMarket.ts +0 -14
  489. package/src/constraint-runtime/src/tools/PolymarketSDK/getOrders.ts +0 -10
  490. package/src/constraint-runtime/src/tools/PolymarketSDK/listMarkets.ts +0 -24
  491. package/src/constraint-runtime/src/tools/SafeSDK/confirmTransaction.ts +0 -13
  492. package/src/constraint-runtime/src/tools/SafeSDK/createTransaction.ts +0 -23
  493. package/src/constraint-runtime/src/tools/SafeSDK/deploySafe.ts +0 -12
  494. package/src/constraint-runtime/src/tools/SafeSDK/executeTransaction.ts +0 -12
  495. package/src/constraint-runtime/src/tools/SafeSDK/getBalance.ts +0 -10
  496. package/src/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.ts +0 -10
  497. package/src/constraint-runtime/src/tools/SafeSDK/proposeTransaction.ts +0 -14
  498. package/src/constraint-runtime/src/tools/WalletTools/autoPay.ts +0 -58
  499. package/src/constraint-runtime/src/tools/WalletTools/createWallet.ts +0 -19
  500. package/src/constraint-runtime/src/tools/WalletTools/getBalance.ts +0 -28
  501. package/src/constraint-runtime/src/tools/WalletTools/importWallet.ts +0 -34
  502. package/src/constraint-runtime/src/tools/WalletTools/sendTransaction.ts +0 -50
  503. package/src/constraint-runtime/src/tools/WalletTools/signMessage.ts +0 -23
  504. package/src/constraint-runtime/src/tools/WalletTools/transferToken.ts +0 -49
  505. package/src/constraint-runtime/src/tools.ts +0 -100
  506. package/src/constraint-runtime/src/transcript.ts +0 -23
  507. package/src/constraint-runtime/src/types/index.ts +0 -15
  508. package/src/constraint-runtime/src/upstream_proxy/index.ts +0 -15
  509. package/src/constraint-runtime/src/utils/index.ts +0 -15
  510. package/src/constraint-runtime/src/vim/index.ts +0 -15
  511. package/src/constraint-runtime/src/voice/index.ts +0 -15
  512. package/src/constraint-runtime/tests/agent.test.ts +0 -20
  513. package/src/constraint-runtime/tests/constraint.test.ts +0 -47
  514. package/src/constraint-runtime/tests/skill.test.ts +0 -23
  515. package/src/constraint-runtime/tests/thinking.test.ts +0 -28
  516. package/src/constraint-runtime/tsconfig.json +0 -13
  517. package/src/pi-ecosystem/index.ts +0 -453
  518. package/src/pi-ecosystem-colony/index.ts +0 -482
  519. package/src/pi-ecosystem-goals/index.ts +0 -585
  520. package/src/pi-ecosystem-judgment/decision.ts +0 -431
  521. package/src/pi-ecosystem-judgment/distillation.ts +0 -398
  522. package/src/pi-ecosystem-judgment/human-value-store.ts +0 -580
  523. package/src/pi-ecosystem-judgment/index.ts +0 -678
  524. package/src/pi-ecosystem-judgment/value-injection.ts +0 -744
  525. package/src/pi-ecosystem-mcp/index.ts +0 -427
  526. package/src/pi-ecosystem-subagents/index.ts +0 -408
  527. package/src/test/ai-judgment-test.ts +0 -92
  528. package/src/test/bollharness-integration.test.ts +0 -398
  529. package/src/test/channel-agent-multi-dialogue.ts +0 -265
  530. package/src/test/channel-heartbeat-agent-test.ts +0 -244
  531. package/src/test/constraint-layer.test.ts +0 -191
  532. package/src/test/diap-identity-test.ts +0 -222
  533. package/src/test/diap-quick-test.ts +0 -73
  534. package/src/test/global-shared-context.test.ts +0 -393
  535. package/src/test/harness-judgment-injection.test.ts +0 -353
  536. package/src/test/harness-workflow-integrator-test.ts +0 -285
  537. package/src/test/human-value-store.test.ts +0 -316
  538. package/src/test/hybrid-integration-test.ts +0 -126
  539. package/src/test/hybrid-messenger-verify.ts +0 -68
  540. package/src/test/iroh-bistream-debug.ts +0 -50
  541. package/src/test/iroh-communication.test.ts +0 -81
  542. package/src/test/iroh-debug-test.ts +0 -69
  543. package/src/test/iroh-diap-test.ts +0 -90
  544. package/src/test/iroh-direct-connect.ts +0 -65
  545. package/src/test/iroh-e2e-fixed.ts +0 -106
  546. package/src/test/iroh-e2e-same-process.ts +0 -83
  547. package/src/test/iroh-e2e.ts +0 -83
  548. package/src/test/iroh-final-e2e.ts +0 -84
  549. package/src/test/iroh-relay-test.ts +0 -46
  550. package/src/test/iroh-simple-test.ts +0 -49
  551. package/src/test/iroh-transport-verify.ts +0 -60
  552. package/src/test/iroh-transport.test.ts +0 -47
  553. package/src/test/iroh-two-nodes.ts +0 -87
  554. package/src/test/iroh-verify.ts +0 -55
  555. package/src/test/judgment-decision.test.ts +0 -373
  556. package/src/test/llm-judgment-integration.test.ts +0 -257
  557. package/src/test/p2p-agent-complex-dialogue.ts +0 -490
  558. package/src/test/p2p-agent-dialogue.ts +0 -423
  559. package/src/test/p2p-agent-full-bidirectional.ts +0 -686
  560. package/src/test/p2p-agent-harness-flow.ts +0 -562
  561. package/src/test/p2p-agent-harness-single.ts +0 -175
  562. package/src/test/p2p-ai-dialogue-test.ts +0 -374
  563. package/src/test/p2p-cid-connect-test.ts +0 -245
  564. package/src/test/p2p-connect-receiver.ts +0 -85
  565. package/src/test/p2p-iroh-test.ts +0 -214
  566. package/src/test/p2p-minimal-test.ts +0 -264
  567. package/src/test/p2p-node-1.ts +0 -172
  568. package/src/test/p2p-node-2.ts +0 -172
  569. package/src/test/p2p-server.ts +0 -335
  570. package/src/test/p2p-two-nodes-test.ts +0 -542
  571. package/src/test/pi-sdk.test.ts +0 -47
  572. package/src/test/set-persona.ts +0 -56
  573. package/src/test/simple.test.ts +0 -11
  574. package/src/test/storage-integration.test.ts +0 -191
  575. package/src/test/subagent-manager.test.ts +0 -392
  576. package/src/test/test-gate-flow.test.ts +0 -92
  577. package/src/test/workflow-engine.test.ts +0 -101
  578. package/src/workflows/collaboration.ts +0 -455
  579. package/src/workflows/index.ts +0 -64
  580. package/vitest.config.ts +0 -12
  581. package//346/203/263/346/263/225.md +0 -79
@@ -1,6 +1,12 @@
1
1
  import { useState, useEffect, useCallback } from 'react';
2
2
  import { p2pManager } from './p2p-manager.js';
3
- import type { P2PIdentity, P2PMessage, ConnectionHistoryEntry, ConnectProgress } from './types.js';
3
+ import type {
4
+ P2PIdentity,
5
+ P2PMessage,
6
+ ConnectionHistoryEntry,
7
+ ConnectProgress,
8
+ PersistentConnection
9
+ } from './types.js';
4
10
 
5
11
  type Tab = 'identity' | 'connect' | 'history' | 'messages';
6
12
  type Status = 'idle' | 'connecting' | 'online' | 'error';
@@ -24,10 +30,16 @@ export function P2PModal({ visible, onClose }: P2PModalProps) {
24
30
  const [messages, setMessages] = useState<P2PMessage[]>([]);
25
31
  const [unreadCount, setUnreadCount] = useState(0);
26
32
  const [peers, setPeers] = useState<{ nodeId: string; info: any }[]>([]);
33
+ const [persistentConnections, setPersistentConnections] = useState<PersistentConnection[]>([]);
27
34
  const [toast, setToast] = useState<string | null>(null);
28
35
 
29
36
  useEffect(() => {
30
37
  if (visible && !initialized) {
38
+ console.log('[P2P Modal] visible=true, initialized=false, calling initP2P');
39
+ initP2P();
40
+ } else if (visible && initialized && !identity) {
41
+ // 已初始化但没有identity,可能是首次未触发
42
+ console.log('[P2P Modal] visible=true, initialized=true, but no identity, calling initP2P again');
31
43
  initP2P();
32
44
  }
33
45
  }, [visible, initialized]);
@@ -64,6 +76,7 @@ export function P2PModal({ visible, onClose }: P2PModalProps) {
64
76
  break;
65
77
  case 'connect':
66
78
  loadPeers();
79
+ loadPersistentConnections();
67
80
  break;
68
81
  }
69
82
  }
@@ -93,6 +106,38 @@ export function P2PModal({ visible, onClose }: P2PModalProps) {
93
106
  setPeers(connectedPeers);
94
107
  }
95
108
 
109
+ async function loadPersistentConnections() {
110
+ try {
111
+ const connections = await p2pManager.getPersistentConnections();
112
+ setPersistentConnections(connections);
113
+ } catch (e) {
114
+ console.error('[P2P Modal] 加载持久连接失败:', e);
115
+ }
116
+ }
117
+
118
+ async function handleToggleConnection(connection: PersistentConnection) {
119
+ const newStatus = connection.status === 'connected' ? 'disconnected' : 'connected';
120
+ const enable = newStatus === 'connected';
121
+
122
+ try {
123
+ const success = await p2pManager.toggleConnection(connection, enable);
124
+ if (success) {
125
+ await loadPersistentConnections();
126
+ loadPeers();
127
+ showToast(enable ? '正在连接...' : '已断开');
128
+ } else {
129
+ showToast('操作失败');
130
+ }
131
+ } catch (e) {
132
+ showToast('操作失败');
133
+ }
134
+ }
135
+
136
+ async function handleOpenChannel(channelId: string) {
137
+ showToast(`打开通道: ${channelId}`);
138
+ onClose();
139
+ }
140
+
96
141
  async function handleConnect() {
97
142
  if (!connectInput.trim()) return;
98
143
 
@@ -101,13 +146,14 @@ export function P2PModal({ visible, onClose }: P2PModalProps) {
101
146
  setConnectResult(null);
102
147
 
103
148
  try {
104
- const result = await p2pManager.connect(connectInput, (p) => setProgress(p));
149
+ const result = await p2pManager.connectAndCreateChannel(connectInput, (p) => setProgress(p));
105
150
 
106
151
  if (result.success) {
107
152
  setConnectResult({ type: 'success', text: `已连接到 ${result.name || '节点'}` });
108
153
  setConnectInput('');
109
154
  await loadHistory();
110
155
  loadPeers();
156
+ loadPersistentConnections();
111
157
  } else {
112
158
  setConnectResult({ type: 'error', text: result.error || '连接失败' });
113
159
  }
@@ -248,8 +294,50 @@ export function P2PModal({ visible, onClose }: P2PModalProps) {
248
294
  </div>
249
295
  )}
250
296
 
297
+ {/* 持久连接列表 */}
298
+ <div className="persistent-peers-section">
299
+ <h4>持久连接 ({persistentConnections.length})</h4>
300
+ {persistentConnections.length === 0 ? (
301
+ <div className="empty-hint">暂无持久连接</div>
302
+ ) : (
303
+ persistentConnections.map((conn) => (
304
+ <div key={conn.id} className={`persistent-peer-item ${conn.status}`}>
305
+ <div className="peer-status-indicator">
306
+ <span className={`dot ${conn.status === 'connected' ? 'online' : 'offline'}`}></span>
307
+ </div>
308
+ <div className="peer-info">
309
+ <div className="peer-name">
310
+ {conn.peerName || 'Unknown'}
311
+ {conn.isAutoConnect && <span className="auto-badge">自动</span>}
312
+ </div>
313
+ <div className="peer-meta">
314
+ <span>DID: {conn.peerDid?.substring(0, 16)}...</span>
315
+ <span>状态: {conn.status === 'connected' ? '已连接' : '未连接'}</span>
316
+ </div>
317
+ </div>
318
+ <div className="peer-actions">
319
+ <button
320
+ className={`btn-sm ${conn.status === 'connected' ? 'btn-danger' : 'btn-primary'}`}
321
+ onClick={() => handleToggleConnection(conn)}
322
+ >
323
+ {conn.status === 'connected' ? '断开' : '连接'}
324
+ </button>
325
+ {conn.channelId && (
326
+ <button
327
+ className="btn-sm btn-secondary"
328
+ onClick={() => handleOpenChannel(conn.channelId!)}
329
+ >
330
+ 对话
331
+ </button>
332
+ )}
333
+ </div>
334
+ </div>
335
+ ))
336
+ )}
337
+ </div>
338
+
251
339
  <div className="peers-section">
252
- <h4>已连接节点 ({peers.length})</h4>
340
+ <h4>当前连接 ({peers.length})</h4>
253
341
  <div id="p2p-peers-list">
254
342
  {peers.length === 0 && <div className="empty-hint">暂无连接</div>}
255
343
  {peers.map((peer, i) => (
@@ -5,6 +5,7 @@
5
5
  class P2PModalUI {
6
6
  private modal: HTMLElement | null = null;
7
7
  private overlay: HTMLElement | null = null;
8
+ private connectedPeers: Map<string, { nodeId: string; name: string; time: number }> = new Map();
8
9
 
9
10
  constructor() {
10
11
  this.createModal();
@@ -53,23 +54,54 @@ class P2PModalUI {
53
54
  private async render(): Promise<void> {
54
55
  if (!this.modal) return;
55
56
 
57
+ // 加载连接历史
58
+ await this.loadConnectionHistory();
59
+
56
60
  // 获取身份信息
57
61
  let identityHtml = '<div class="p2p-loading">加载中...</div>';
62
+ let identityData: any = { name: '未知', did: '未知', cid: '未知' };
58
63
  try {
59
- const resp = await fetch('/api/identity');
60
- const data = await resp.json();
64
+ // 尝试获取 iroh 身份(包含 CID)
65
+ const irohResp = await fetch('/api/iroh/init', { method: 'POST' });
66
+ const irohData = await irohResp.json();
67
+ if (irohData.cid) {
68
+ identityData = {
69
+ name: irohData.name || irohData.name?.split('-').slice(-1)[0] || 'Bolloon',
70
+ did: irohData.did || '未知',
71
+ cid: irohData.cid || '未知',
72
+ nodeId: irohData.irohNodeId ? irohData.irohNodeId.substring(0, 20) + '...' : '未知'
73
+ };
74
+ } else {
75
+ // 回退到 /api/identity
76
+ const resp = await fetch('/api/identity');
77
+ identityData = await resp.json();
78
+ identityData.cid = identityData.cid || '未初始化';
79
+ identityData.nodeId = identityData.nodeId || '未知';
80
+ }
61
81
  identityHtml = `
62
82
  <div class="p2p-section">
63
83
  <h3>身份信息</h3>
64
84
  <div class="p2p-info-row">
65
85
  <span class="label">名称:</span>
66
- <span class="value">${this.escapeHtml(data.name || '未知')}</span>
86
+ <span class="value">${this.escapeHtml(identityData.name || '未知')}</span>
87
+ </div>
88
+ <div class="p2p-info-row">
89
+ <span class="label">CID:</span>
90
+ <span class="value mono">${this.escapeHtml(identityData.cid || '未知')}</span>
67
91
  </div>
68
92
  <div class="p2p-info-row">
69
93
  <span class="label">DID:</span>
70
- <span class="value mono">${this.escapeHtml(data.did || '未知')}</span>
94
+ <span class="value mono">${this.escapeHtml(identityData.did || '未知')}</span>
95
+ </div>
96
+ <div class="p2p-info-row">
97
+ <span class="label">Node ID:</span>
98
+ <span class="value mono">${this.escapeHtml(identityData.nodeId || '未知')}</span>
99
+ </div>
100
+ <div class="p2p-actions">
101
+ <button class="p2p-btn-secondary" id="p2p-copy-cid-btn">复制 CID</button>
102
+ <button class="p2p-btn-secondary" id="p2p-copy-did-btn">复制 DID</button>
103
+ <button class="p2p-btn-secondary" id="p2p-copy-nodeid-btn">复制 Node ID</button>
71
104
  </div>
72
- <button class="p2p-btn-primary" id="p2p-copy-btn">复制 DID</button>
73
105
  </div>
74
106
  `;
75
107
  } catch {
@@ -99,6 +131,12 @@ class P2PModalUI {
99
131
  </div>
100
132
  <div id="p2p-connect-result" class="p2p-result"></div>
101
133
  </div>
134
+ <div class="p2p-section">
135
+ <h3>已连接的节点</h3>
136
+ <div id="p2p-connected-peers" class="p2p-connected-peers">
137
+ 暂无连接
138
+ </div>
139
+ </div>
102
140
  </div>
103
141
  <div class="p2p-tab-content" data-tab="messages">
104
142
  <div class="p2p-section">
@@ -131,12 +169,27 @@ class P2PModalUI {
131
169
  });
132
170
  });
133
171
 
172
+ // 复制 CID
173
+ const copyCidBtn = this.modal.querySelector('#p2p-copy-cid-btn');
174
+ copyCidBtn?.addEventListener('click', async () => {
175
+ try {
176
+ const irohResp = await fetch('/api/iroh/init', { method: 'POST' });
177
+ const data = await irohResp.json();
178
+ if (data.cid) {
179
+ await navigator.clipboard.writeText(data.cid);
180
+ this.showToast('CID 已复制到剪贴板');
181
+ }
182
+ } catch (e) {
183
+ console.error('复制失败:', e);
184
+ }
185
+ });
186
+
134
187
  // 复制 DID
135
- const copyBtn = this.modal.querySelector('#p2p-copy-btn');
136
- copyBtn?.addEventListener('click', async () => {
188
+ const copyDidBtn = this.modal.querySelector('#p2p-copy-did-btn');
189
+ copyDidBtn?.addEventListener('click', async () => {
137
190
  try {
138
- const resp = await fetch('/api/identity');
139
- const data = await resp.json();
191
+ const irohResp = await fetch('/api/iroh/init', { method: 'POST' });
192
+ const data = await irohResp.json();
140
193
  if (data.did) {
141
194
  await navigator.clipboard.writeText(data.did);
142
195
  this.showToast('DID 已复制到剪贴板');
@@ -146,6 +199,21 @@ class P2PModalUI {
146
199
  }
147
200
  });
148
201
 
202
+ // 复制 Node ID
203
+ const copyNodeIdBtn = this.modal.querySelector('#p2p-copy-nodeid-btn');
204
+ copyNodeIdBtn?.addEventListener('click', async () => {
205
+ try {
206
+ const irohResp = await fetch('/api/iroh/init', { method: 'POST' });
207
+ const data = await irohResp.json();
208
+ if (data.irohNodeId) {
209
+ await navigator.clipboard.writeText(data.irohNodeId);
210
+ this.showToast('Node ID 已复制到剪贴板');
211
+ }
212
+ } catch (e) {
213
+ console.error('复制失败:', e);
214
+ }
215
+ });
216
+
149
217
  // 连接按钮
150
218
  const connectBtn = this.modal.querySelector('#p2p-connect-btn');
151
219
  connectBtn?.addEventListener('click', () => this.handleConnect());
@@ -185,6 +253,23 @@ class P2PModalUI {
185
253
  if (data.ok) {
186
254
  result.innerHTML = `<div class="p2p-success">连接成功!节点: ${this.escapeHtml(data.nodeName || cid.substring(0, 16))}...</div>`;
187
255
  result.className = 'p2p-result success';
256
+ // 清空输入框
257
+ input.value = '';
258
+ // 保存已连接节点到后端
259
+ try {
260
+ await fetch('/api/p2p/history', {
261
+ method: 'POST',
262
+ headers: { 'Content-Type': 'application/json' },
263
+ body: JSON.stringify({
264
+ cid: cid, // 输入的 CID 或 Node ID
265
+ irohNodeId: data.targetNodeId,
266
+ did: data.targetNodeId, // 用 Node ID 作为 DID
267
+ name: data.nodeName || cid.substring(0, 16)
268
+ })
269
+ });
270
+ } catch (e) {
271
+ console.error('保存连接失败:', e);
272
+ }
188
273
  } else {
189
274
  result.innerHTML = `<div class="p2p-error">${this.escapeHtml(data.error || '连接失败')}</div>`;
190
275
  result.className = 'p2p-result error';
@@ -196,6 +281,48 @@ class P2PModalUI {
196
281
  }
197
282
  }
198
283
 
284
+ private async loadConnectionHistory(): Promise<void> {
285
+ try {
286
+ const resp = await fetch('/api/p2p/history');
287
+ const history = await resp.json();
288
+ this.connectedPeers.clear();
289
+ for (const entry of history) {
290
+ this.connectedPeers.set(entry.irohNodeId || entry.did, {
291
+ nodeId: entry.irohNodeId || entry.did,
292
+ name: entry.name || 'Unknown',
293
+ time: entry.lastConnectedAt || Date.now()
294
+ });
295
+ }
296
+ this.updateConnectedPeersDisplay();
297
+ } catch (e) {
298
+ console.error('加载连接历史失败:', e);
299
+ }
300
+ }
301
+
302
+ private updateConnectedPeersDisplay(): void {
303
+ const container = document.getElementById('p2p-connected-peers');
304
+ if (!container) return;
305
+
306
+ if (this.connectedPeers.size === 0) {
307
+ container.innerHTML = '<div class="p2p-empty">暂无连接</div>';
308
+ return;
309
+ }
310
+
311
+ let html = '';
312
+ for (const [nodeId, info] of this.connectedPeers) {
313
+ const shortId = nodeId.substring(0, 16) + '...';
314
+ const time = new Date(info.time).toLocaleTimeString();
315
+ html += `
316
+ <div class="p2p-peer-item">
317
+ <span class="p2p-peer-name">${this.escapeHtml(info.name || shortId)}</span>
318
+ <span class="p2p-peer-id">${shortId}</span>
319
+ <span class="p2p-peer-time">${time}</span>
320
+ </div>
321
+ `;
322
+ }
323
+ container.innerHTML = html;
324
+ }
325
+
199
326
  private escapeHtml(str: string): string {
200
327
  const div = document.createElement('div');
201
328
  div.textContent = str;
@@ -390,6 +517,41 @@ style.textContent = `
390
517
  color: var(--text-muted, #606058);
391
518
  }
392
519
  .p2p-error { color: var(--error, #ef4444); }
520
+ .p2p-connected-peers {
521
+ background: var(--bg, #1a1a18);
522
+ border: 1px solid var(--border, #3a3a36);
523
+ border-radius: 8px;
524
+ overflow: hidden;
525
+ }
526
+ .p2p-connected-peers .p2p-empty {
527
+ padding: 16px;
528
+ text-align: center;
529
+ color: var(--text-muted, #606058);
530
+ font-size: 14px;
531
+ }
532
+ .p2p-peer-item {
533
+ display: flex;
534
+ align-items: center;
535
+ gap: 8px;
536
+ padding: 12px 16px;
537
+ border-bottom: 1px solid var(--border, #3a3a36);
538
+ }
539
+ .p2p-peer-item:last-child { border-bottom: none; }
540
+ .p2p-peer-name {
541
+ font-size: 14px;
542
+ color: var(--text, #d8d8c8);
543
+ min-width: 80px;
544
+ }
545
+ .p2p-peer-id {
546
+ flex: 1;
547
+ font-family: 'JetBrains Mono', monospace;
548
+ font-size: 12px;
549
+ color: var(--text-secondary, #909088);
550
+ }
551
+ .p2p-peer-time {
552
+ font-size: 12px;
553
+ color: var(--text-muted, #606058);
554
+ }
393
555
  `;
394
556
  document.head.appendChild(style);
395
557
 
@@ -2,7 +2,15 @@
2
2
  * P2P 连接管理
3
3
  */
4
4
 
5
- import type { ConnectResult, ConnectProgress, ParsedInput, ConnectedPeer } from './types.js';
5
+ import type {
6
+ ConnectResult,
7
+ ConnectProgress,
8
+ ParsedInput,
9
+ ConnectedPeer,
10
+ PersistentConnection,
11
+ CIDResolveResult,
12
+ PersistentConnectionStatus
13
+ } from './types.js';
6
14
  import { ConnectionStatus } from './types.js';
7
15
  import { p2pStore } from './p2p-store-memory.js';
8
16
 
@@ -181,6 +189,150 @@ export class P2PConnectionManager {
181
189
  this.reconnectTimers.clear();
182
190
  this.peers.clear();
183
191
  }
192
+
193
+ // 从 CID 解析身份
194
+ async resolveFromCID(cid: string): Promise<CIDResolveResult> {
195
+ try {
196
+ const res = await fetch('/api/p2p/resolve-cid', {
197
+ method: 'POST',
198
+ headers: { 'Content-Type': 'application/json' },
199
+ body: JSON.stringify({ cid })
200
+ });
201
+
202
+ if (res.ok) {
203
+ const data = await res.json();
204
+ return {
205
+ success: true,
206
+ did: data.doc?.id || data.doc?.did,
207
+ cid: cid,
208
+ name: data.doc?.name,
209
+ peerId: data.doc?.peerId
210
+ };
211
+ } else {
212
+ return { success: false, error: 'CID 解析失败' };
213
+ }
214
+ } catch (e) {
215
+ return { success: false, error: (e as Error).message };
216
+ }
217
+ }
218
+
219
+ // 获取所有持久连接
220
+ async getPersistentConnections(): Promise<PersistentConnection[]> {
221
+ try {
222
+ const res = await fetch('/api/p2p/persistent-connections');
223
+ if (res.ok) {
224
+ return await res.json();
225
+ }
226
+ return [];
227
+ } catch {
228
+ return [];
229
+ }
230
+ }
231
+
232
+ // 切换连接状态
233
+ async toggleConnection(connection: PersistentConnection, enable: boolean): Promise<boolean> {
234
+ try {
235
+ if (enable) {
236
+ // 建立连接
237
+ const result = await this.connect(connection.cid);
238
+ if (result.success) {
239
+ await fetch('/api/p2p/connection-status', {
240
+ method: 'POST',
241
+ headers: { 'Content-Type': 'application/json' },
242
+ body: JSON.stringify({
243
+ id: connection.id,
244
+ status: 'connected',
245
+ channelId: connection.channelId
246
+ })
247
+ });
248
+ return true;
249
+ }
250
+ return false;
251
+ } else {
252
+ // 断开连接
253
+ if (connection.peerId) {
254
+ await this.disconnect(connection.peerId);
255
+ }
256
+ await fetch('/api/p2p/connection-status', {
257
+ method: 'POST',
258
+ headers: { 'Content-Type': 'application/json' },
259
+ body: JSON.stringify({
260
+ id: connection.id,
261
+ status: 'disconnected'
262
+ })
263
+ });
264
+ return true;
265
+ }
266
+ } catch {
267
+ return false;
268
+ }
269
+ }
270
+
271
+ // 连接并创建对话通道
272
+ async connectAndCreateChannel(
273
+ input: string,
274
+ onProgress?: (progress: ConnectProgress) => void
275
+ ): Promise<ConnectResult> {
276
+ const parsed = this.parseInput(input);
277
+ if (parsed.type === 'invalid') {
278
+ return { success: false, error: parsed.error };
279
+ }
280
+
281
+ onProgress?.({ stage: 'validating', percent: 10, message: '验证输入格式...' });
282
+
283
+ let cid = '';
284
+ let did = '';
285
+ const value = parsed.value;
286
+
287
+ if (parsed.type === 'link' && typeof value !== 'string') {
288
+ cid = (value as { did?: string; cid?: string }).cid || '';
289
+ did = (value as { did?: string; cid?: string }).did || '';
290
+ } else if (parsed.type === 'cid' && typeof value === 'string') {
291
+ cid = value;
292
+ } else if (parsed.type === 'diapDoc' && typeof value !== 'string') {
293
+ cid = (value as { id?: string; did?: string; cid?: string }).cid || '';
294
+ did = (value as { id?: string; did?: string }).id || (value as { id?: string; did?: string }).did || '';
295
+ }
296
+
297
+ if (!cid) {
298
+ return { success: false, error: '未找到 CID' };
299
+ }
300
+
301
+ // 如果没有 DID,从 CID 解析
302
+ if (!did) {
303
+ onProgress?.({ stage: 'resolving', percent: 30, message: '从 IPFS 解析身份...' });
304
+ const resolveResult = await this.resolveFromCID(cid);
305
+ if (resolveResult.success) {
306
+ did = resolveResult.did || '';
307
+ onProgress?.({ stage: 'identity_resolved', percent: 50, message: `身份解析完成: ${resolveResult.name}` });
308
+ }
309
+ }
310
+
311
+ // 创建对话通道
312
+ onProgress?.({ stage: 'creating_channel', percent: 60, message: '创建对话通道...' });
313
+ try {
314
+ const channelRes = await fetch('/api/p2p/create-channel', {
315
+ method: 'POST',
316
+ headers: { 'Content-Type': 'application/json' },
317
+ body: JSON.stringify({
318
+ peerDid: did,
319
+ peerName: did.substring(0, 16),
320
+ cid: cid,
321
+ peerId: ''
322
+ })
323
+ });
324
+
325
+ if (!channelRes.ok) {
326
+ return { success: false, error: '创建对话通道失败' };
327
+ }
328
+ } catch (e) {
329
+ return { success: false, error: (e as Error).message };
330
+ }
331
+
332
+ // 执行连接
333
+ onProgress?.({ stage: 'connecting', percent: 80, message: '建立 P2P 连接...' });
334
+ return this.connect(input, onProgress);
335
+ }
184
336
  }
185
337
 
186
338
  export const p2pConnection = new P2PConnectionManager();
@@ -11,7 +11,9 @@ import type {
11
11
  ConnectResult,
12
12
  ConnectProgress,
13
13
  P2PMessage,
14
- ConnectionHistoryEntry
14
+ ConnectionHistoryEntry,
15
+ PersistentConnection,
16
+ CIDResolveResult
15
17
  } from './types.js';
16
18
 
17
19
  export class P2PManager {
@@ -96,6 +98,42 @@ export class P2PManager {
96
98
  this.connection.destroy();
97
99
  this.messages.destroy();
98
100
  }
101
+
102
+ // 获取持久连接列表
103
+ async getPersistentConnections(): Promise<PersistentConnection[]> {
104
+ return this.connection.getPersistentConnections();
105
+ }
106
+
107
+ // 更新连接状态
108
+ async updateConnectionStatus(
109
+ id: string,
110
+ status: string,
111
+ channelId?: string
112
+ ): Promise<void> {
113
+ await fetch('/api/p2p/connection-status', {
114
+ method: 'POST',
115
+ headers: { 'Content-Type': 'application/json' },
116
+ body: JSON.stringify({ id, status, channelId })
117
+ });
118
+ }
119
+
120
+ // 切换连接状态
121
+ async toggleConnection(connection: PersistentConnection, enable: boolean): Promise<boolean> {
122
+ return this.connection.toggleConnection(connection, enable);
123
+ }
124
+
125
+ // CID 解析
126
+ async resolveFromCID(cid: string): Promise<CIDResolveResult> {
127
+ return this.connection.resolveFromCID(cid);
128
+ }
129
+
130
+ // 连接并创建对话通道
131
+ async connectAndCreateChannel(
132
+ input: string,
133
+ onProgress?: (progress: ConnectProgress) => void
134
+ ): Promise<ConnectResult> {
135
+ return this.connection.connectAndCreateChannel(input, onProgress);
136
+ }
99
137
  }
100
138
 
101
139
  // 全局单例
@@ -27,7 +27,7 @@ export class P2PStoreMemory {
27
27
  // ==================== 连接历史 ====================
28
28
 
29
29
  async addToHistory(entry: Omit<ConnectionHistoryEntry, 'id'>): Promise<string> {
30
- const existingIndex = this.history.findIndex(h => h.did === entry.did);
30
+ const existingIndex = this.history.findIndex(h => h.cid === entry.cid);
31
31
 
32
32
  if (existingIndex >= 0) {
33
33
  this.history[existingIndex] = {