@bolloon/bolloon-agent 0.1.0

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 (808) hide show
  1. package/README.md +462 -0
  2. package/dist/agents/constraint-layer.js +211 -0
  3. package/dist/agents/constraint-layer.js.map +1 -0
  4. package/dist/agents/pi-sdk.js +1199 -0
  5. package/dist/agents/pi-sdk.js.map +1 -0
  6. package/dist/agents/protocol.js +229 -0
  7. package/dist/agents/subagent-manager.js +361 -0
  8. package/dist/agents/workflow-engine.js +222 -0
  9. package/dist/agents/workflow-engine.js.map +1 -0
  10. package/dist/bollharness-integration/bollharness-integration/context-router-judgment.d.ts +48 -0
  11. package/dist/bollharness-integration/bollharness-integration/context-router-judgment.js +261 -0
  12. package/dist/bollharness-integration/bollharness-integration/context-router.d.ts +110 -0
  13. package/dist/bollharness-integration/bollharness-integration/context-router.js +542 -0
  14. package/dist/bollharness-integration/bollharness-integration/gate-state-machine.d.ts +87 -0
  15. package/dist/bollharness-integration/bollharness-integration/gate-state-machine.js +231 -0
  16. package/dist/bollharness-integration/bollharness-integration/gate-transition-hooks.d.ts +30 -0
  17. package/dist/bollharness-integration/bollharness-integration/gate-transition-hooks.js +91 -0
  18. package/dist/bollharness-integration/bollharness-integration/guard-checker.d.ts +105 -0
  19. package/dist/bollharness-integration/bollharness-integration/guard-checker.js +353 -0
  20. package/dist/bollharness-integration/bollharness-integration/index.d.ts +66 -0
  21. package/dist/bollharness-integration/bollharness-integration/index.js +32 -0
  22. package/dist/bollharness-integration/bollharness-integration/integration.d.ts +219 -0
  23. package/dist/bollharness-integration/bollharness-integration/integration.js +420 -0
  24. package/dist/bollharness-integration/bollharness-integration/skill-adapter.d.ts +151 -0
  25. package/dist/bollharness-integration/bollharness-integration/skill-adapter.js +518 -0
  26. package/dist/bollharness-integration/context-router-judgment.js +269 -0
  27. package/dist/bollharness-integration/context-router-judgment.js.map +1 -0
  28. package/dist/bollharness-integration/context-router.js +584 -0
  29. package/dist/bollharness-integration/context-router.js.map +1 -0
  30. package/dist/bollharness-integration/gate-state-machine.js +349 -0
  31. package/dist/bollharness-integration/gate-state-machine.js.map +1 -0
  32. package/dist/bollharness-integration/gate-transition-hooks.js +136 -0
  33. package/dist/bollharness-integration/gate-transition-hooks.js.map +1 -0
  34. package/dist/bollharness-integration/guard-checker.js +400 -0
  35. package/dist/bollharness-integration/guard-checker.js.map +1 -0
  36. package/dist/bollharness-integration/index.js +142 -0
  37. package/dist/bollharness-integration/index.js.map +1 -0
  38. package/dist/bollharness-integration/integration.js +427 -0
  39. package/dist/bollharness-integration/integration.js.map +1 -0
  40. package/dist/bollharness-integration/llm/pi-ai.d.ts +60 -0
  41. package/dist/bollharness-integration/llm/pi-ai.js +397 -0
  42. package/dist/bollharness-integration/pi-ecosystem-colony/index.d.ts +153 -0
  43. package/dist/bollharness-integration/pi-ecosystem-colony/index.js +365 -0
  44. package/dist/bollharness-integration/pi-ecosystem-goals/index.d.ts +136 -0
  45. package/dist/bollharness-integration/pi-ecosystem-goals/index.js +458 -0
  46. package/dist/bollharness-integration/pi-ecosystem-judgment/decision.d.ts +117 -0
  47. package/dist/bollharness-integration/pi-ecosystem-judgment/decision.js +300 -0
  48. package/dist/bollharness-integration/pi-ecosystem-judgment/distillation.d.ts +78 -0
  49. package/dist/bollharness-integration/pi-ecosystem-judgment/distillation.js +291 -0
  50. package/dist/bollharness-integration/pi-ecosystem-judgment/index.d.ts +139 -0
  51. package/dist/bollharness-integration/pi-ecosystem-judgment/index.js +445 -0
  52. package/dist/bollharness-integration/pi-ecosystem-mcp/index.d.ts +127 -0
  53. package/dist/bollharness-integration/pi-ecosystem-mcp/index.js +331 -0
  54. package/dist/bollharness-integration/pi-ecosystem-subagents/index.d.ts +95 -0
  55. package/dist/bollharness-integration/pi-ecosystem-subagents/index.js +303 -0
  56. package/dist/bollharness-integration/skill-adapter.js +564 -0
  57. package/dist/bollharness-integration/skill-adapter.js.map +1 -0
  58. package/dist/cli/interface.js +181 -0
  59. package/dist/constraint-runtime/src/_archive_helper.js +9 -0
  60. package/dist/constraint-runtime/src/agent/coordinator.js +48 -0
  61. package/dist/constraint-runtime/src/agent/index.js +1 -0
  62. package/dist/constraint-runtime/src/assistant/index.js +12 -0
  63. package/dist/constraint-runtime/src/bootstrap/index.js +12 -0
  64. package/dist/constraint-runtime/src/bootstrap_graph.js +13 -0
  65. package/dist/constraint-runtime/src/bridge/index.js +12 -0
  66. package/dist/constraint-runtime/src/buddy/index.js +12 -0
  67. package/dist/constraint-runtime/src/cli/index.js +12 -0
  68. package/dist/constraint-runtime/src/command_graph.js +10 -0
  69. package/dist/constraint-runtime/src/commands.js +50 -0
  70. package/dist/constraint-runtime/src/components/index.js +12 -0
  71. package/dist/constraint-runtime/src/constants/index.js +12 -0
  72. package/dist/constraint-runtime/src/constraint/budget.js +27 -0
  73. package/dist/constraint-runtime/src/constraint/budget.js.map +1 -0
  74. package/dist/constraint-runtime/src/constraint/index.js +2 -0
  75. package/dist/constraint-runtime/src/constraint/permission.js +25 -0
  76. package/dist/constraint-runtime/src/constraint/permission.js.map +1 -0
  77. package/dist/constraint-runtime/src/context.js +30 -0
  78. package/dist/constraint-runtime/src/coordinator/index.js +12 -0
  79. package/dist/constraint-runtime/src/cost_hook.js +4 -0
  80. package/dist/constraint-runtime/src/cost_tracker.js +8 -0
  81. package/dist/constraint-runtime/src/deferred_init.js +10 -0
  82. package/dist/constraint-runtime/src/direct_modes.js +6 -0
  83. package/dist/constraint-runtime/src/dynamic-tool-loader.js +85 -0
  84. package/dist/constraint-runtime/src/entrypoints/index.js +12 -0
  85. package/dist/constraint-runtime/src/execution_registry.js +44 -0
  86. package/dist/constraint-runtime/src/history.js +9 -0
  87. package/dist/constraint-runtime/src/hooks/index.js +12 -0
  88. package/dist/constraint-runtime/src/index.js +26 -0
  89. package/dist/constraint-runtime/src/ink.js +4 -0
  90. package/dist/constraint-runtime/src/keybindings/index.js +12 -0
  91. package/dist/constraint-runtime/src/memdir/index.js +12 -0
  92. package/dist/constraint-runtime/src/migrations/index.js +12 -0
  93. package/dist/constraint-runtime/src/models.js +3 -0
  94. package/dist/constraint-runtime/src/models.js.map +1 -0
  95. package/dist/constraint-runtime/src/moreright/index.js +12 -0
  96. package/dist/constraint-runtime/src/native_ts/index.js +12 -0
  97. package/dist/constraint-runtime/src/output_styles/index.js +12 -0
  98. package/dist/constraint-runtime/src/parity_audit.js +12 -0
  99. package/dist/constraint-runtime/src/plugins/index.js +12 -0
  100. package/dist/constraint-runtime/src/port_manifest.js +11 -0
  101. package/dist/constraint-runtime/src/prefetch.js +9 -0
  102. package/dist/constraint-runtime/src/query.js +1 -0
  103. package/dist/constraint-runtime/src/remote/index.js +12 -0
  104. package/dist/constraint-runtime/src/remote_runtime.js +9 -0
  105. package/dist/constraint-runtime/src/runtime/index.js +1 -0
  106. package/dist/constraint-runtime/src/runtime/session.js +35 -0
  107. package/dist/constraint-runtime/src/schemas/index.js +12 -0
  108. package/dist/constraint-runtime/src/screens/index.js +12 -0
  109. package/dist/constraint-runtime/src/server/index.js +12 -0
  110. package/dist/constraint-runtime/src/services/index.js +12 -0
  111. package/dist/constraint-runtime/src/session_store.js +22 -0
  112. package/dist/constraint-runtime/src/setup.js +30 -0
  113. package/dist/constraint-runtime/src/skills/index.js +1 -0
  114. package/dist/constraint-runtime/src/skills/skill-registry.js +28 -0
  115. package/dist/constraint-runtime/src/state/index.js +12 -0
  116. package/dist/constraint-runtime/src/system_init.js +20 -0
  117. package/dist/constraint-runtime/src/thinking/engine.js +42 -0
  118. package/dist/constraint-runtime/src/thinking/index.js +1 -0
  119. package/dist/constraint-runtime/src/tool_pool.js +8 -0
  120. package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +7 -0
  121. package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +7 -0
  122. package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +7 -0
  123. package/dist/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.js +6 -0
  124. package/dist/constraint-runtime/src/tools/PolymarketSDK/createOrder.js +6 -0
  125. package/dist/constraint-runtime/src/tools/PolymarketSDK/getMarket.js +5 -0
  126. package/dist/constraint-runtime/src/tools/PolymarketSDK/getOrders.js +6 -0
  127. package/dist/constraint-runtime/src/tools/PolymarketSDK/listMarkets.js +4 -0
  128. package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +6 -0
  129. package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +8 -0
  130. package/dist/constraint-runtime/src/tools/SafeSDK/deploySafe.js +6 -0
  131. package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +6 -0
  132. package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +6 -0
  133. package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +6 -0
  134. package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +6 -0
  135. package/dist/constraint-runtime/src/tools/WalletTools/autoPay.js +29 -0
  136. package/dist/constraint-runtime/src/tools/WalletTools/createWallet.js +10 -0
  137. package/dist/constraint-runtime/src/tools/WalletTools/getBalance.js +13 -0
  138. package/dist/constraint-runtime/src/tools/WalletTools/importWallet.js +22 -0
  139. package/dist/constraint-runtime/src/tools/WalletTools/sendTransaction.js +25 -0
  140. package/dist/constraint-runtime/src/tools/WalletTools/signMessage.js +10 -0
  141. package/dist/constraint-runtime/src/tools/WalletTools/transferToken.js +25 -0
  142. package/dist/constraint-runtime/src/tools.js +70 -0
  143. package/dist/constraint-runtime/src/transcript.js +19 -0
  144. package/dist/constraint-runtime/src/types/index.js +12 -0
  145. package/dist/constraint-runtime/src/upstream_proxy/index.js +12 -0
  146. package/dist/constraint-runtime/src/utils/index.js +12 -0
  147. package/dist/constraint-runtime/src/vim/index.js +12 -0
  148. package/dist/constraint-runtime/src/voice/index.js +12 -0
  149. package/dist/constraint-runtime/tests/agent.test.js +16 -0
  150. package/dist/constraint-runtime/tests/constraint.test.js +41 -0
  151. package/dist/constraint-runtime/tests/skill.test.js +19 -0
  152. package/dist/constraint-runtime/tests/thinking.test.js +22 -0
  153. package/dist/constraints/commands.js +100 -0
  154. package/dist/constraints/index.js +11 -0
  155. package/dist/constraints/index.js.map +1 -0
  156. package/dist/constraints/permissions.js +37 -0
  157. package/dist/constraints/runtime.js +135 -0
  158. package/dist/constraints/session.js +48 -0
  159. package/dist/constraints/system-init.js +51 -0
  160. package/dist/constraints/tools.js +104 -0
  161. package/dist/documents/reader.js +104 -0
  162. package/dist/documents/reader.js.map +1 -0
  163. package/dist/electron-preload.js +15 -0
  164. package/dist/electron-preload.js.map +1 -0
  165. package/dist/electron.js +206 -0
  166. package/dist/electron.js.map +1 -0
  167. package/dist/index.js +1053 -0
  168. package/dist/llm/config-store.js +301 -0
  169. package/dist/llm/config-store.js.map +1 -0
  170. package/dist/llm/minimax-provider.js +46 -0
  171. package/dist/llm/minimax.js +45 -0
  172. package/dist/llm/pi-ai.js +471 -0
  173. package/dist/llm/pi-ai.js.map +1 -0
  174. package/dist/network/agent-network.js +692 -0
  175. package/dist/network/agent-network.js.map +1 -0
  176. package/dist/network/iroh-integration.js +117 -0
  177. package/dist/network/iroh-integration.js.map +1 -0
  178. package/dist/network/iroh-transport.js +506 -0
  179. package/dist/network/iroh-transport.js.map +1 -0
  180. package/dist/network/p2p.js +864 -0
  181. package/dist/network/p2p.js.map +1 -0
  182. package/dist/network/storage/adapters/json-adapter.js +401 -0
  183. package/dist/network/storage/adapters/json-adapter.js.map +1 -0
  184. package/dist/pi-ecosystem-colony/index.js +426 -0
  185. package/dist/pi-ecosystem-colony/index.js.map +1 -0
  186. package/dist/pi-ecosystem-goals/index.js +512 -0
  187. package/dist/pi-ecosystem-goals/index.js.map +1 -0
  188. package/dist/pi-ecosystem-judgment/decision.js +318 -0
  189. package/dist/pi-ecosystem-judgment/decision.js.map +1 -0
  190. package/dist/pi-ecosystem-judgment/distillation.js +304 -0
  191. package/dist/pi-ecosystem-judgment/distillation.js.map +1 -0
  192. package/dist/pi-ecosystem-judgment/human-value-store.js +463 -0
  193. package/dist/pi-ecosystem-judgment/human-value-store.js.map +1 -0
  194. package/dist/pi-ecosystem-judgment/index.js +581 -0
  195. package/dist/pi-ecosystem-judgment/index.js.map +1 -0
  196. package/dist/pi-ecosystem-judgment/value-injection.js +592 -0
  197. package/dist/pi-ecosystem-judgment/value-injection.js.map +1 -0
  198. package/dist/pi-ecosystem-mcp/index.js +385 -0
  199. package/dist/pi-ecosystem-mcp/index.js.map +1 -0
  200. package/dist/pi-ecosystem-subagents/index.js +352 -0
  201. package/dist/pi-ecosystem-subagents/index.js.map +1 -0
  202. package/dist/runtime/context/minimax-prompt.js +178 -0
  203. package/dist/runtime/context/sys-prompt.js +1 -0
  204. package/dist/social/ant-colony/AdaptiveHeartbeat.js +106 -0
  205. package/dist/social/ant-colony/AdaptiveHeartbeat.js.map +1 -0
  206. package/dist/social/ant-colony/PheromoneEngine.js +265 -0
  207. package/dist/social/ant-colony/PheromoneEngine.js.map +1 -0
  208. package/dist/social/ant-colony/types.js +28 -0
  209. package/dist/social/ant-colony/types.js.map +1 -0
  210. package/dist/social/channels/ChannelManager.js +444 -0
  211. package/dist/social/channels/ChannelManager.js.map +1 -0
  212. package/dist/social/channels/DiapChannelBridge.js +451 -0
  213. package/dist/social/channels/DiapChannelBridge.js.map +1 -0
  214. package/dist/social/channels/InterestMatcher.js +135 -0
  215. package/dist/social/channels/InterestMatcher.js.map +1 -0
  216. package/dist/social/channels/types.js +21 -0
  217. package/dist/social/channels/types.js.map +1 -0
  218. package/dist/social/global-shared-context.js +368 -0
  219. package/dist/social/global-shared-context.js.map +1 -0
  220. package/dist/social/heartbeat.js +865 -0
  221. package/dist/social/heartbeat.js.map +1 -0
  222. package/dist/test/constraint-layer.test.js +164 -0
  223. package/dist/test/global-shared-context.test.js +315 -0
  224. package/dist/test/pi-sdk.test.js +47 -0
  225. package/dist/test/set-persona.test.js +38 -0
  226. package/dist/test/subagent-manager.test.js +276 -0
  227. package/dist/test/workflow-engine.test.js +87 -0
  228. package/dist/web/api-config.html +265 -0
  229. package/dist/web/client.js +1401 -0
  230. package/dist/web/components/p2p/index.js +357 -0
  231. package/dist/web/components/p2p/p2p-connection.js +161 -0
  232. package/dist/web/components/p2p/p2p-identity.js +78 -0
  233. package/dist/web/components/p2p/p2p-manager.js +82 -0
  234. package/dist/web/components/p2p/p2p-messages.js +186 -0
  235. package/dist/web/components/p2p/p2p-store-memory.js +129 -0
  236. package/dist/web/components/p2p/types.js +23 -0
  237. package/dist/web/index.html +192 -0
  238. package/dist/web/server.js +1647 -0
  239. package/dist/web/server.js.map +1 -0
  240. package/dist/web/style.css +3260 -0
  241. package/dist/workflows/collaboration.js +374 -0
  242. package/dist/workflows/index.js +54 -0
  243. package/docs/agent-communication.md +333 -0
  244. package/docs/plans/2026-05-15-document-agent-design.md +479 -0
  245. package/docs/plans/2026-05-15-document-agent-implementation-plan.md +792 -0
  246. package/docs/plans/2026-05-16-chat-ui-design.md +86 -0
  247. package/docs/plans/2026-05-16-constraint-runtime-design.md +106 -0
  248. package/docs/plans/2026-05-16-constraint-runtime-implementation.md +441 -0
  249. 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 +287 -0
  250. package/package.json +121 -0
  251. package/scripts/build-web.ts +61 -0
  252. package/src/agents/constraint-layer.ts +309 -0
  253. package/src/agents/pi-sdk.ts +1591 -0
  254. package/src/agents/protocol.ts +304 -0
  255. package/src/agents/subagent-manager.ts +553 -0
  256. package/src/agents/workflow-engine.ts +332 -0
  257. package/src/bollharness/.boll/CLAUDE.md.template +34 -0
  258. package/src/bollharness/.boll/MANIFEST.yaml +213 -0
  259. package/src/bollharness/.boll/active-review-agents/.gitkeep +0 -0
  260. package/src/bollharness/.boll/agents/review-base.yaml +108 -0
  261. package/src/bollharness/.boll/deploy-allowlist.yaml +38 -0
  262. package/src/bollharness/.boll/inbox/schema/message-v1.json +99 -0
  263. package/src/bollharness/.boll/install-staging/.gitkeep +0 -0
  264. package/src/bollharness/.boll/issue-adapter.yaml +31 -0
  265. package/src/bollharness/.boll/plugins/boll-mode-toolkit/contracts/mode-contract.md +85 -0
  266. package/src/bollharness/.boll/plugins/boll-review-toolkit/contracts/evidence-packet-schema.json +102 -0
  267. package/src/bollharness/.boll/plugins/boll-review-toolkit/contracts/review-contract.yaml +247 -0
  268. package/src/bollharness/.boll/rules/backend-routes.md +31 -0
  269. package/src/bollharness/.boll/rules/closure-semantics.md +30 -0
  270. package/src/bollharness/.boll/rules/env-vars.md +32 -0
  271. package/src/bollharness/.boll/rules/hanis-protocol.md +145 -0
  272. package/src/bollharness/.boll/rules/repo-structure.md +42 -0
  273. package/src/bollharness/.boll/rules/review-agent-isolation.md +73 -0
  274. package/src/bollharness/.boll/rules/source-of-truth.md +33 -0
  275. package/src/bollharness/.boll/settings.json +180 -0
  276. package/src/bollharness/.boll/settings.json.template +31 -0
  277. package/src/bollharness/.boll/skills/arch/SKILL.md +372 -0
  278. package/src/bollharness/.boll/skills/bug-pipeline/SKILL.md +168 -0
  279. package/src/bollharness/.boll/skills/bug-triage/SKILL.md +161 -0
  280. package/src/bollharness/.boll/skills/context-chains/SKILL.md +250 -0
  281. package/src/bollharness/.boll/skills/context-chains/context-chain-index.md +48 -0
  282. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/code_change_extractor.ts +142 -0
  283. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/debugging_extractor.ts +126 -0
  284. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/design_extractor.ts +148 -0
  285. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/planning_extractor.ts +162 -0
  286. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/question_extractor.ts +116 -0
  287. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/review_extractor.ts +136 -0
  288. package/src/bollharness/.boll/skills/crystal-learn/SKILL.md +93 -0
  289. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-0.md +34 -0
  290. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-1.md +34 -0
  291. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-2.md +35 -0
  292. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-3.md +34 -0
  293. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-4.md +43 -0
  294. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-5.md +34 -0
  295. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-6.md +37 -0
  296. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-7.md +46 -0
  297. package/src/bollharness/.boll/skills/guardian-fixer/PROMPT.md +415 -0
  298. package/src/bollharness/.boll/skills/guardian-fixer/SKILL.md +320 -0
  299. package/src/bollharness/.boll/skills/harness-dev/SKILL.md +93 -0
  300. package/src/bollharness/.boll/skills/harness-dev/examples/README.md +227 -0
  301. package/src/bollharness/.boll/skills/harness-dev-handoff/SKILL.md +165 -0
  302. package/src/bollharness/.boll/skills/harness-eng/SKILL.md +110 -0
  303. package/src/bollharness/.boll/skills/harness-eng-test/SKILL.md +79 -0
  304. package/src/bollharness/.boll/skills/harness-lab/SKILL.md +170 -0
  305. package/src/bollharness/.boll/skills/harness-ops/SKILL.md +57 -0
  306. package/src/bollharness/.boll/skills/harness-voice/SKILL.md +183 -0
  307. package/src/bollharness/.boll/skills/judgment/SKILL.md +115 -0
  308. package/src/bollharness/.boll/skills/lead/SKILL.md +245 -0
  309. package/src/bollharness/.boll/skills/lead/install-wow-harness.md +77 -0
  310. package/src/bollharness/.boll/skills/lead/ref-review-sop.md +91 -0
  311. package/src/bollharness/.boll/skills/lead/ref-stages.md +129 -0
  312. package/src/bollharness/.boll/skills/skill-discovery/SKILL.md +169 -0
  313. package/src/bollharness/.boll/skills/task-arch/SKILL.md +106 -0
  314. package/src/bollharness/.boll/skills/toolkit/SKILL.md +57 -0
  315. package/src/bollharness/.boll/tasks/.gitkeep +0 -0
  316. package/src/bollharness/.boll/toolkit-index.yaml +112 -0
  317. package/src/bollharness/.claude/agents/review-base.yaml +108 -0
  318. package/src/bollharness/.claude/plugins/boll-mode-toolkit/.claude-plugin/plugin.json +44 -0
  319. package/src/bollharness/.claude/plugins/boll-review-toolkit/.claude-plugin/plugin.json +24 -0
  320. package/src/bollharness/.claude/plugins/boll-review-toolkit/contracts/evidence-packet-schema.json +102 -0
  321. package/src/bollharness/.claude/plugins/boll-review-toolkit/contracts/review-contract.yaml +247 -0
  322. package/src/bollharness/.claude/settings.json +157 -0
  323. package/src/bollharness/.claude/skills/arch/SKILL.md +64 -0
  324. package/src/bollharness/.claude/skills/crystal-learn/SKILL.md +93 -0
  325. package/src/bollharness/.claude/skills/guardian-fixer/PROMPT.md +44 -0
  326. package/src/bollharness/.claude/skills/guardian-fixer/SKILL.md +324 -0
  327. package/src/bollharness/.claude/skills/harness-dev/SKILL.md +93 -0
  328. package/src/bollharness/.claude/skills/harness-dev/examples/README.md +17 -0
  329. package/src/bollharness/.claude/skills/harness-dev-handoff/SKILL.md +165 -0
  330. package/src/bollharness/.claude/skills/harness-eng/SKILL.md +183 -0
  331. package/src/bollharness/.claude/skills/harness-eng-test/SKILL.md +57 -0
  332. package/src/bollharness/.claude/skills/harness-ops/SKILL.md +57 -0
  333. package/src/bollharness/.claude/skills/harness-voice/SKILL.md +84 -0
  334. package/src/bollharness/.claude/skills/lead/INDEX.md +28 -0
  335. package/src/bollharness/.claude/skills/lead/SKILL.md +24 -0
  336. package/src/bollharness/.claude/skills/lead/install-wow-harness.md +77 -0
  337. package/src/bollharness/.claude/skills/lead/ref-review-sop.md +48 -0
  338. package/src/bollharness/.claude/skills/lead/ref-stages.md +58 -0
  339. package/src/bollharness/.claude/skills/plan-lock/SKILL.md +74 -0
  340. package/src/bollharness/.claude/skills/skill-discovery/SKILL.md +120 -0
  341. package/src/bollharness/.claude/skills/task-arch/SKILL.md +106 -0
  342. package/src/bollharness/.claude/skills/toolkit/SKILL.md +57 -0
  343. package/src/bollharness/.claude/skills/toolkit/list.sh +92 -0
  344. package/src/bollharness/.githooks/pre-commit +21 -0
  345. package/src/bollharness/.github/workflows/ci.yml +88 -0
  346. package/src/bollharness/.sanitize-report.json +13 -0
  347. package/src/bollharness/CLAUDE.md +73 -0
  348. package/src/bollharness/LICENSE +21 -0
  349. package/src/bollharness/README.md +143 -0
  350. package/src/bollharness/README.zh-CN.md +131 -0
  351. package/src/bollharness/docs/decisions/ADR-030-guard-signal-protocol-and-governance-reload.md +1076 -0
  352. package/src/bollharness/docs/decisions/ADR-038-harness-optimization-strategy.md +2039 -0
  353. package/src/bollharness/docs/decisions/ADR-041-codex-claude-code-division-of-labor.md +128 -0
  354. package/src/bollharness/docs/decisions/ADR-H1-crystal-learn-revival.md +188 -0
  355. package/src/bollharness/docs/decisions/ADR-H2-identity-isolation.md +183 -0
  356. package/src/bollharness/docs/decisions/ADR-H3-memory-scope.md +133 -0
  357. package/src/bollharness/docs/decisions/ADR-H4-prompt-governance.md +146 -0
  358. package/src/bollharness/docs/decisions/ADR-H5-gate-quantization.md +212 -0
  359. package/src/bollharness/docs/decisions/ADR-H6-state-file-health.md +211 -0
  360. package/src/bollharness/docs/decisions/ADR-H8-issue-and-doc-compliance.md +202 -0
  361. package/src/bollharness/docs/decisions/ADR-H9-mailbox.md +231 -0
  362. package/src/bollharness/docs/decisions/PLAN-H1-crystal-learn-revival.md +270 -0
  363. package/src/bollharness/docs/decisions/PLAN-H2-identity-isolation.md +291 -0
  364. package/src/bollharness/docs/decisions/PLAN-H3-memory-scope.md +228 -0
  365. package/src/bollharness/docs/decisions/PLAN-H4-prompt-governance.md +227 -0
  366. package/src/bollharness/docs/decisions/PLAN-H5-gate-quantization.md +239 -0
  367. package/src/bollharness/docs/decisions/PLAN-H6-state-file-health.md +325 -0
  368. package/src/bollharness/docs/decisions/PLAN-H8-issue-and-doc-compliance.md +242 -0
  369. package/src/bollharness/docs/decisions/PLAN-H9-mailbox.md +378 -0
  370. package/src/bollharness/docs/launch-article-en.md +276 -0
  371. package/src/bollharness/docs/launch-article-zh.md +305 -0
  372. package/src/bollharness/docs/practice.html +356 -0
  373. package/src/bollharness/docs/practice.md +82 -0
  374. package/src/bollharness/docs/research/round-1/README.md +11 -0
  375. package/src/bollharness/docs/research/round-2/README.md +11 -0
  376. package/src/bollharness/docs/research/round-3/README.md +11 -0
  377. package/src/bollharness/docs/research/round-4/README.md +11 -0
  378. package/src/bollharness/docs/research/round-5/README.md +11 -0
  379. package/src/bollharness/docs/research/round-6/README.md +11 -0
  380. package/src/bollharness/package-lock.json +48 -0
  381. package/src/bollharness/package.json +20 -0
  382. package/src/bollharness/reference/SOURCE-COMMIT.txt +3 -0
  383. package/src/bollharness/reference/boll-reference/.claude/rules/backend-routes.md +268 -0
  384. package/src/bollharness/reference/boll-reference/.claude/rules/bridge.md +20 -0
  385. package/src/bollharness/reference/boll-reference/.claude/rules/closure-semantics.md +30 -0
  386. package/src/bollharness/reference/boll-reference/.claude/rules/coaching.md +13 -0
  387. package/src/bollharness/reference/boll-reference/.claude/rules/env-vars.md +50 -0
  388. package/src/bollharness/reference/boll-reference/.claude/rules/hackathon.md +12 -0
  389. package/src/bollharness/reference/boll-reference/.claude/rules/repo-structure.md +184 -0
  390. package/src/bollharness/reference/boll-reference/.claude/rules/review-agent-isolation.md +112 -0
  391. package/src/bollharness/reference/boll-reference/.claude/rules/scenes.md +12 -0
  392. package/src/bollharness/reference/boll-reference/.claude/skills/arch/SKILL.md +551 -0
  393. package/src/bollharness/reference/boll-reference/.claude/skills/boll-animation/SKILL.md +26 -0
  394. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/SKILL.md +227 -0
  395. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/agents/openai.yaml +4 -0
  396. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/references/bridge-failure-taxonomy.md +142 -0
  397. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/references/bridge-validation-ladder.md +107 -0
  398. package/src/bollharness/reference/boll-reference/.claude/skills/boll-crystal/SKILL.md +893 -0
  399. package/src/bollharness/reference/boll-reference/.claude/skills/boll-crystal-learn/SKILL.md +89 -0
  400. package/src/bollharness/reference/boll-reference/.claude/skills/boll-dev/SKILL.md +93 -0
  401. package/src/bollharness/reference/boll-reference/.claude/skills/boll-dev/examples/README.md +209 -0
  402. package/src/bollharness/reference/boll-reference/.claude/skills/boll-dev-handoff/SKILL.md +165 -0
  403. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng/SKILL.md +110 -0
  404. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-frontend/SKILL.md +203 -0
  405. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-hdc/SKILL.md +27 -0
  406. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-orchestrator/SKILL.md +28 -0
  407. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-prompt/SKILL.md +27 -0
  408. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-test/SKILL.md +79 -0
  409. package/src/bollharness/reference/boll-reference/.claude/skills/boll-lab/SKILL.md +372 -0
  410. package/src/bollharness/reference/boll-reference/.claude/skills/boll-run/SKILL.md +437 -0
  411. package/src/bollharness/reference/boll-reference/.claude/skills/boll-ux-appstore/SKILL.md +27 -0
  412. package/src/bollharness/reference/boll-reference/.claude/skills/boll-voice/SKILL.md +442 -0
  413. package/src/bollharness/reference/boll-reference/.claude/skills/guardian-fixer/PROMPT.md +421 -0
  414. package/src/bollharness/reference/boll-reference/.claude/skills/guardian-fixer/SKILL.md +326 -0
  415. package/src/bollharness/reference/boll-reference/.claude/skills/lead/SKILL.md +155 -0
  416. package/src/bollharness/reference/boll-reference/.claude/skills/lead/ref-review-sop.md +91 -0
  417. package/src/bollharness/reference/boll-reference/.claude/skills/lead/ref-stages.md +129 -0
  418. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-preview.png +0 -0
  419. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-v2.png +0 -0
  420. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-v3.png +0 -0
  421. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-v4.png +0 -0
  422. package/src/bollharness/reference/boll-reference/.claude/skills/plan-lock/SKILL.md +425 -0
  423. package/src/bollharness/reference/boll-reference/.claude/skills/plan-lock/ref-three-checks.md +62 -0
  424. package/src/bollharness/reference/boll-reference/.claude/skills/plan-lock/ref-wp-templates.md +78 -0
  425. package/src/bollharness/reference/boll-reference/.claude/skills/task-arch/SKILL.md +76 -0
  426. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-graph/SKILL.md +57 -0
  427. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-graph/beads-graph.sh +153 -0
  428. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-init/SKILL.md +52 -0
  429. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-init/beads-auto-link.sh +76 -0
  430. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-sync/SKILL.md +50 -0
  431. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-sync/beads-sync-proj.sh +108 -0
  432. package/src/bollharness/reference/boll-reference/docs/architecture/AGENT-PROFILE.md +151 -0
  433. package/src/bollharness/reference/boll-reference/docs/architecture/COST-STRUCTURE.md +56 -0
  434. package/src/bollharness/reference/boll-reference/docs/architecture/INDEX.md +76 -0
  435. package/src/bollharness/reference/boll-reference/docs/architecture/MODULE1-INTENT-FIELD.md +116 -0
  436. package/src/bollharness/reference/boll-reference/docs/architecture/MODULE2-CRYSTALLIZATION.md +200 -0
  437. package/src/bollharness/reference/boll-reference/docs/architecture/PRINCIPLES.md +84 -0
  438. package/src/bollharness/reference/boll-reference/docs/architecture/PROTOCOL-CORE.md +209 -0
  439. package/src/bollharness/reference/boll-reference/docs/architecture/VISION.md +181 -0
  440. package/src/bollharness/reference/boll-reference/docs/architecture/discussions/D-01-MARKET-SCENE-PROTOCOL.md +754 -0
  441. package/src/bollharness/reference/boll-reference/scripts/hooks/.sanitize-report.json +12 -0
  442. package/src/bollharness/reference/boll-reference/scripts/hooks/find-boll-root.sh +27 -0
  443. package/src/bollharness/reference/boll-reference/scripts/hooks/precompact.sh +57 -0
  444. package/src/bollharness/reference/boll-reference/scripts/hooks/stop-evaluator.md +57 -0
  445. package/src/bollharness/schemas/metrics-jsonl-allowlist.json +67 -0
  446. package/src/bollharness/scripts/checks/next_decision_number.sh +48 -0
  447. package/src/bollharness/scripts/ci/count-components.sh +65 -0
  448. package/src/bollharness/scripts/context-fragments/artifact-linkage.md +14 -0
  449. package/src/bollharness/scripts/context-fragments/auth-consumers.md +17 -0
  450. package/src/bollharness/scripts/context-fragments/bridge-constitution.md +13 -0
  451. package/src/bollharness/scripts/context-fragments/catalyst-distributed.md +18 -0
  452. package/src/bollharness/scripts/context-fragments/closure-checklist.md +13 -0
  453. package/src/bollharness/scripts/context-fragments/contract-consumers.md +15 -0
  454. package/src/bollharness/scripts/context-fragments/db-shared-structures.md +15 -0
  455. package/src/bollharness/scripts/context-fragments/fixed-three-layers.md +19 -0
  456. package/src/bollharness/scripts/context-fragments/general-dev-principles.md +11 -0
  457. package/src/bollharness/scripts/context-fragments/issue-first.md +8 -0
  458. package/src/bollharness/scripts/context-fragments/mcp-parity.md +16 -0
  459. package/src/bollharness/scripts/context-fragments/pi-agent-operations.md +74 -0
  460. package/src/bollharness/scripts/context-fragments/protocol-consumers.md +15 -0
  461. package/src/bollharness/scripts/context-fragments/run-events-consumers.md +15 -0
  462. package/src/bollharness/scripts/context-fragments/scene-fidelity.md +13 -0
  463. package/src/bollharness/scripts/context-fragments/truth-source-hierarchy.md +15 -0
  464. package/src/bollharness/scripts/context-fragments/two-language.md +15 -0
  465. package/src/bollharness/scripts/context-fragments/version-sources.md +14 -0
  466. package/src/bollharness/scripts/hooks/find-project-root.sh +47 -0
  467. package/src/bollharness/scripts/hooks/inbox-poll.sh +78 -0
  468. package/src/bollharness/scripts/hooks/precompact.sh +56 -0
  469. package/src/bollharness/scripts/hooks/stop-evaluator.md +83 -0
  470. package/src/bollharness/scripts/sync-from-upstream.sh +281 -0
  471. package/src/bollharness/src/index.ts +5 -0
  472. package/src/bollharness/src/scripts/checks/check_adr_plan_numbering.ts +11 -0
  473. package/src/bollharness/src/scripts/checks/check_api_types.ts +52 -0
  474. package/src/bollharness/src/scripts/checks/check_artifact_link.ts +156 -0
  475. package/src/bollharness/src/scripts/checks/check_bridge_deps.ts +11 -0
  476. package/src/bollharness/src/scripts/checks/check_bugfix_binding.ts +11 -0
  477. package/src/bollharness/src/scripts/checks/check_bugfix_binding_ci.ts +11 -0
  478. package/src/bollharness/src/scripts/checks/check_doc_file_references.ts +11 -0
  479. package/src/bollharness/src/scripts/checks/check_doc_freshness.ts +141 -0
  480. package/src/bollharness/src/scripts/checks/check_doc_links.ts +36 -0
  481. package/src/bollharness/src/scripts/checks/check_file_existence_claims.ts +11 -0
  482. package/src/bollharness/src/scripts/checks/check_fragment_integrity.ts +40 -0
  483. package/src/bollharness/src/scripts/checks/check_hook_installed.ts +70 -0
  484. package/src/bollharness/src/scripts/checks/check_issue_closure.ts +51 -0
  485. package/src/bollharness/src/scripts/checks/check_mcp_parity.ts +11 -0
  486. package/src/bollharness/src/scripts/checks/check_security.ts +54 -0
  487. package/src/bollharness/src/scripts/checks/check_skill_parity.ts +11 -0
  488. package/src/bollharness/src/scripts/checks/check_versions.ts +11 -0
  489. package/src/bollharness/src/scripts/checks/finding.ts +35 -0
  490. package/src/bollharness/src/scripts/checks/next_decision_number.ts +24 -0
  491. package/src/bollharness/src/scripts/checks/regenerate_magic_docs.ts +11 -0
  492. package/src/bollharness/src/scripts/ci/detect_rebaseline_triggers.ts +14 -0
  493. package/src/bollharness/src/scripts/ci/scan_subprocess_cfg.ts +14 -0
  494. package/src/bollharness/src/scripts/ci/scan_verify_artifacts.ts +14 -0
  495. package/src/bollharness/src/scripts/ci/scan_yaml_schema.ts +14 -0
  496. package/src/bollharness/src/scripts/context_router.ts +76 -0
  497. package/src/bollharness/src/scripts/deploy-guard.ts +182 -0
  498. package/src/bollharness/src/scripts/guard-feedback.ts +215 -0
  499. package/src/bollharness/src/scripts/guard_router.ts +194 -0
  500. package/src/bollharness/src/scripts/hooks/_hook_output.js +3 -0
  501. package/src/bollharness/src/scripts/hooks/_hook_output.ts +11 -0
  502. package/src/bollharness/src/scripts/hooks/auto-python3.ts +10 -0
  503. package/src/bollharness/src/scripts/hooks/deploy-progress-on-session-end.ts +10 -0
  504. package/src/bollharness/src/scripts/hooks/failure-analyzer.ts +10 -0
  505. package/src/bollharness/src/scripts/hooks/gate-judgment-inject.ts +111 -0
  506. package/src/bollharness/src/scripts/hooks/gate-transition-judgment.ts +74 -0
  507. package/src/bollharness/src/scripts/hooks/inbox-ack.ts +10 -0
  508. package/src/bollharness/src/scripts/hooks/inbox-inject-on-start.ts +10 -0
  509. package/src/bollharness/src/scripts/hooks/inbox-validate.ts +10 -0
  510. package/src/bollharness/src/scripts/hooks/inbox-write-ledger.ts +10 -0
  511. package/src/bollharness/src/scripts/hooks/initializer-agent.ts +10 -0
  512. package/src/bollharness/src/scripts/hooks/loop-detection.ts +83 -0
  513. package/src/bollharness/src/scripts/hooks/owner-guard.ts +10 -0
  514. package/src/bollharness/src/scripts/hooks/precompact.ts +10 -0
  515. package/src/bollharness/src/scripts/hooks/review-agent-gatekeeper.ts +10 -0
  516. package/src/bollharness/src/scripts/hooks/risk-tracker.ts +121 -0
  517. package/src/bollharness/src/scripts/hooks/sanitize-on-read.ts +10 -0
  518. package/src/bollharness/src/scripts/hooks/session-reflection.ts +12 -0
  519. package/src/bollharness/src/scripts/hooks/session-start-magic-docs.ts +12 -0
  520. package/src/bollharness/src/scripts/hooks/session-start-reset-risk.ts +12 -0
  521. package/src/bollharness/src/scripts/hooks/session-start-toolkit-reminder.ts +12 -0
  522. package/src/bollharness/src/scripts/hooks/stop-evaluator.ts +164 -0
  523. package/src/bollharness/src/scripts/hooks/tool-call-counter.ts +10 -0
  524. package/src/bollharness/src/scripts/hooks/trace-analyzer.ts +14 -0
  525. package/src/bollharness/src/scripts/install/install-trust-token.ts +13 -0
  526. package/src/bollharness/src/scripts/install/multi_project_registry.ts +13 -0
  527. package/src/bollharness/src/scripts/install/phase2_auto.ts +28 -0
  528. package/src/bollharness/src/scripts/install/pre_commit_installer.ts +10 -0
  529. package/src/bollharness/src/scripts/install/tier_selector.ts +10 -0
  530. package/src/bollharness/src/scripts/install/transcript_miner.ts +13 -0
  531. package/src/bollharness/src/scripts/lib/claim_patterns.ts +11 -0
  532. package/src/bollharness/src/scripts/lib/sanitize_patterns.ts +13 -0
  533. package/src/bollharness/src/scripts/sanitize.ts +9 -0
  534. package/src/bollharness/templates/persona/default.json +19 -0
  535. package/src/bollharness/templates/scaffold/.boll/guard/.gitkeep +0 -0
  536. package/src/bollharness/templates/scaffold/.boll/metrics/.gitkeep +0 -0
  537. package/src/bollharness/templates/scaffold/.boll/state/.gitkeep +0 -0
  538. package/src/bollharness/templates/scaffold/.gitignore.append +16 -0
  539. package/src/bollharness/templates/scaffold/CLAUDE.md +89 -0
  540. package/src/bollharness/templates/scaffold/docs/INDEX.md +3 -0
  541. package/src/bollharness/templates/scaffold/docs/decisions/ADR_TEMPLATE.md +38 -0
  542. package/src/bollharness/templates/scaffold/docs/decisions/PLAN_TEMPLATE.md +45 -0
  543. package/src/bollharness/templates/scaffold/docs/decisions/tasks/.gitkeep +2 -0
  544. package/src/bollharness/templates/scaffold/docs/issues/.gitkeep +0 -0
  545. package/src/bollharness/templates/scaffold/docs/issues/GUARD_ISSUE_TEMPLATE.md +35 -0
  546. package/src/bollharness/templates/scaffold/docs/issues/ISSUE_TEMPLATE.md +51 -0
  547. package/src/bollharness/tsconfig.json +26 -0
  548. package/src/bollharness-integration/channel-judgment-engine.ts +634 -0
  549. package/src/bollharness-integration/context-chain-router.ts +474 -0
  550. package/src/bollharness-integration/context-router-judgment.ts +339 -0
  551. package/src/bollharness-integration/context-router.ts +583 -0
  552. package/src/bollharness-integration/gate-state-machine.ts +444 -0
  553. package/src/bollharness-integration/gate-transition-hooks.ts +137 -0
  554. package/src/bollharness-integration/guard-checker.ts +451 -0
  555. package/src/bollharness-integration/index.ts +219 -0
  556. package/src/bollharness-integration/integration.ts +538 -0
  557. package/src/bollharness-integration/judgment-prompts.yaml +535 -0
  558. package/src/bollharness-integration/llm-judgment-engine.ts +712 -0
  559. package/src/bollharness-integration/skill-adapter.ts +646 -0
  560. package/src/cli/interface.ts +211 -0
  561. package/src/constraint-runtime/package-lock.json +48 -0
  562. package/src/constraint-runtime/package.json +34 -0
  563. package/src/constraint-runtime/src/_archive_helper.ts +16 -0
  564. package/src/constraint-runtime/src/agent/coordinator.ts +71 -0
  565. package/src/constraint-runtime/src/agent/index.ts +1 -0
  566. package/src/constraint-runtime/src/assistant/index.ts +15 -0
  567. package/src/constraint-runtime/src/bootstrap/index.ts +15 -0
  568. package/src/constraint-runtime/src/bootstrap_graph.ts +17 -0
  569. package/src/constraint-runtime/src/bridge/index.ts +15 -0
  570. package/src/constraint-runtime/src/buddy/index.ts +15 -0
  571. package/src/constraint-runtime/src/cli/index.ts +15 -0
  572. package/src/constraint-runtime/src/command_graph.ts +20 -0
  573. package/src/constraint-runtime/src/commands.ts +83 -0
  574. package/src/constraint-runtime/src/components/index.ts +15 -0
  575. package/src/constraint-runtime/src/constants/index.ts +15 -0
  576. package/src/constraint-runtime/src/constraint/budget.ts +25 -0
  577. package/src/constraint-runtime/src/constraint/index.ts +3 -0
  578. package/src/constraint-runtime/src/constraint/permission.ts +28 -0
  579. package/src/constraint-runtime/src/context.ts +45 -0
  580. package/src/constraint-runtime/src/coordinator/index.ts +15 -0
  581. package/src/constraint-runtime/src/cost_hook.ts +6 -0
  582. package/src/constraint-runtime/src/cost_tracker.ts +9 -0
  583. package/src/constraint-runtime/src/deferred_init.ts +18 -0
  584. package/src/constraint-runtime/src/direct_modes.ts +13 -0
  585. package/src/constraint-runtime/src/dynamic-tool-loader.ts +115 -0
  586. package/src/constraint-runtime/src/entrypoints/index.ts +15 -0
  587. package/src/constraint-runtime/src/execution_registry.ts +41 -0
  588. package/src/constraint-runtime/src/history.ts +16 -0
  589. package/src/constraint-runtime/src/hooks/index.ts +15 -0
  590. package/src/constraint-runtime/src/index.ts +28 -0
  591. package/src/constraint-runtime/src/ink.ts +4 -0
  592. package/src/constraint-runtime/src/keybindings/index.ts +15 -0
  593. package/src/constraint-runtime/src/memdir/index.ts +15 -0
  594. package/src/constraint-runtime/src/migrations/index.ts +15 -0
  595. package/src/constraint-runtime/src/models.ts +49 -0
  596. package/src/constraint-runtime/src/moreright/index.ts +15 -0
  597. package/src/constraint-runtime/src/native_ts/index.ts +15 -0
  598. package/src/constraint-runtime/src/output_styles/index.ts +15 -0
  599. package/src/constraint-runtime/src/parity_audit.ts +23 -0
  600. package/src/constraint-runtime/src/plugins/index.ts +15 -0
  601. package/src/constraint-runtime/src/port_manifest.ts +20 -0
  602. package/src/constraint-runtime/src/prefetch.ts +17 -0
  603. package/src/constraint-runtime/src/query.ts +7 -0
  604. package/src/constraint-runtime/src/reference_data/archive_surface_snapshot.json +63 -0
  605. package/src/constraint-runtime/src/reference_data/commands_snapshot.json +1037 -0
  606. package/src/constraint-runtime/src/reference_data/subsystems/OpenCLI.json +10 -0
  607. package/src/constraint-runtime/src/reference_data/subsystems/PolymarketSDK.json +12 -0
  608. package/src/constraint-runtime/src/reference_data/subsystems/SafeSDK.json +14 -0
  609. package/src/constraint-runtime/src/reference_data/subsystems/assistant.json +8 -0
  610. package/src/constraint-runtime/src/reference_data/subsystems/bootstrap.json +8 -0
  611. package/src/constraint-runtime/src/reference_data/subsystems/bridge.json +32 -0
  612. package/src/constraint-runtime/src/reference_data/subsystems/buddy.json +13 -0
  613. package/src/constraint-runtime/src/reference_data/subsystems/cli.json +26 -0
  614. package/src/constraint-runtime/src/reference_data/subsystems/components.json +32 -0
  615. package/src/constraint-runtime/src/reference_data/subsystems/constants.json +28 -0
  616. package/src/constraint-runtime/src/reference_data/subsystems/coordinator.json +8 -0
  617. package/src/constraint-runtime/src/reference_data/subsystems/entrypoints.json +15 -0
  618. package/src/constraint-runtime/src/reference_data/subsystems/hooks.json +32 -0
  619. package/src/constraint-runtime/src/reference_data/subsystems/keybindings.json +21 -0
  620. package/src/constraint-runtime/src/reference_data/subsystems/memdir.json +15 -0
  621. package/src/constraint-runtime/src/reference_data/subsystems/migrations.json +18 -0
  622. package/src/constraint-runtime/src/reference_data/subsystems/moreright.json +8 -0
  623. package/src/constraint-runtime/src/reference_data/subsystems/native_ts.json +11 -0
  624. package/src/constraint-runtime/src/reference_data/subsystems/outputStyles.json +8 -0
  625. package/src/constraint-runtime/src/reference_data/subsystems/plugins.json +9 -0
  626. package/src/constraint-runtime/src/reference_data/subsystems/remote.json +11 -0
  627. package/src/constraint-runtime/src/reference_data/subsystems/schemas.json +8 -0
  628. package/src/constraint-runtime/src/reference_data/subsystems/screens.json +10 -0
  629. package/src/constraint-runtime/src/reference_data/subsystems/server.json +10 -0
  630. package/src/constraint-runtime/src/reference_data/subsystems/services.json +32 -0
  631. package/src/constraint-runtime/src/reference_data/subsystems/skills.json +27 -0
  632. package/src/constraint-runtime/src/reference_data/subsystems/state.json +13 -0
  633. package/src/constraint-runtime/src/reference_data/subsystems/types.json +18 -0
  634. package/src/constraint-runtime/src/reference_data/subsystems/upstreamproxy.json +9 -0
  635. package/src/constraint-runtime/src/reference_data/subsystems/utils.json +32 -0
  636. package/src/constraint-runtime/src/reference_data/subsystems/vim.json +12 -0
  637. package/src/constraint-runtime/src/reference_data/subsystems/voice.json +8 -0
  638. package/src/constraint-runtime/src/reference_data/tools_snapshot.json +1042 -0
  639. package/src/constraint-runtime/src/remote/index.ts +15 -0
  640. package/src/constraint-runtime/src/remote_runtime.ts +17 -0
  641. package/src/constraint-runtime/src/runtime/index.ts +1 -0
  642. package/src/constraint-runtime/src/runtime/session.ts +42 -0
  643. package/src/constraint-runtime/src/schemas/index.ts +15 -0
  644. package/src/constraint-runtime/src/screens/index.ts +15 -0
  645. package/src/constraint-runtime/src/server/index.ts +15 -0
  646. package/src/constraint-runtime/src/services/index.ts +15 -0
  647. package/src/constraint-runtime/src/session_store.ts +32 -0
  648. package/src/constraint-runtime/src/setup.ts +50 -0
  649. package/src/constraint-runtime/src/skills/index.ts +1 -0
  650. package/src/constraint-runtime/src/skills/skill-registry.ts +40 -0
  651. package/src/constraint-runtime/src/state/index.ts +15 -0
  652. package/src/constraint-runtime/src/system_init.ts +21 -0
  653. package/src/constraint-runtime/src/thinking/engine.ts +61 -0
  654. package/src/constraint-runtime/src/thinking/index.ts +1 -0
  655. package/src/constraint-runtime/src/tool_pool.ts +20 -0
  656. package/src/constraint-runtime/src/tools/OpenCLI/execAdapter.ts +12 -0
  657. package/src/constraint-runtime/src/tools/OpenCLI/listAdapters.ts +12 -0
  658. package/src/constraint-runtime/src/tools/OpenCLI/runCommand.ts +13 -0
  659. package/src/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.ts +10 -0
  660. package/src/constraint-runtime/src/tools/PolymarketSDK/createOrder.ts +13 -0
  661. package/src/constraint-runtime/src/tools/PolymarketSDK/getMarket.ts +14 -0
  662. package/src/constraint-runtime/src/tools/PolymarketSDK/getOrders.ts +10 -0
  663. package/src/constraint-runtime/src/tools/PolymarketSDK/listMarkets.ts +24 -0
  664. package/src/constraint-runtime/src/tools/SafeSDK/confirmTransaction.ts +13 -0
  665. package/src/constraint-runtime/src/tools/SafeSDK/createTransaction.ts +23 -0
  666. package/src/constraint-runtime/src/tools/SafeSDK/deploySafe.ts +12 -0
  667. package/src/constraint-runtime/src/tools/SafeSDK/executeTransaction.ts +12 -0
  668. package/src/constraint-runtime/src/tools/SafeSDK/getBalance.ts +10 -0
  669. package/src/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.ts +10 -0
  670. package/src/constraint-runtime/src/tools/SafeSDK/proposeTransaction.ts +14 -0
  671. package/src/constraint-runtime/src/tools/WalletTools/autoPay.ts +58 -0
  672. package/src/constraint-runtime/src/tools/WalletTools/createWallet.ts +19 -0
  673. package/src/constraint-runtime/src/tools/WalletTools/getBalance.ts +28 -0
  674. package/src/constraint-runtime/src/tools/WalletTools/importWallet.ts +34 -0
  675. package/src/constraint-runtime/src/tools/WalletTools/sendTransaction.ts +50 -0
  676. package/src/constraint-runtime/src/tools/WalletTools/signMessage.ts +23 -0
  677. package/src/constraint-runtime/src/tools/WalletTools/transferToken.ts +49 -0
  678. package/src/constraint-runtime/src/tools.ts +100 -0
  679. package/src/constraint-runtime/src/transcript.ts +23 -0
  680. package/src/constraint-runtime/src/types/index.ts +15 -0
  681. package/src/constraint-runtime/src/upstream_proxy/index.ts +15 -0
  682. package/src/constraint-runtime/src/utils/index.ts +15 -0
  683. package/src/constraint-runtime/src/vim/index.ts +15 -0
  684. package/src/constraint-runtime/src/voice/index.ts +15 -0
  685. package/src/constraint-runtime/tests/agent.test.ts +20 -0
  686. package/src/constraint-runtime/tests/constraint.test.ts +47 -0
  687. package/src/constraint-runtime/tests/skill.test.ts +23 -0
  688. package/src/constraint-runtime/tests/thinking.test.ts +28 -0
  689. package/src/constraint-runtime/tsconfig.json +13 -0
  690. package/src/constraints/index.ts +6 -0
  691. package/src/documents/reader.ts +80 -0
  692. package/src/electron-preload.ts +25 -0
  693. package/src/electron.ts +200 -0
  694. package/src/index.ts +1606 -0
  695. package/src/llm/config-store.ts +312 -0
  696. package/src/llm/llm-judgment-client.ts +470 -0
  697. package/src/llm/pi-ai.ts +522 -0
  698. package/src/network/agent-network.ts +800 -0
  699. package/src/network/hybrid-messenger.ts +199 -0
  700. package/src/network/iroh-bootstrap.ts +57 -0
  701. package/src/network/iroh-discovery.ts +207 -0
  702. package/src/network/iroh-integration.ts +158 -0
  703. package/src/network/iroh-transport.ts +594 -0
  704. package/src/network/p2p.ts +963 -0
  705. package/src/network/storage/adapters/json-adapter.ts +439 -0
  706. package/src/network/storage/index.ts +187 -0
  707. package/src/network/storage/types.ts +166 -0
  708. package/src/pi-ecosystem/index.ts +453 -0
  709. package/src/pi-ecosystem-colony/index.ts +482 -0
  710. package/src/pi-ecosystem-goals/index.ts +585 -0
  711. package/src/pi-ecosystem-judgment/decision.ts +431 -0
  712. package/src/pi-ecosystem-judgment/distillation.ts +398 -0
  713. package/src/pi-ecosystem-judgment/human-value-store.ts +580 -0
  714. package/src/pi-ecosystem-judgment/index.ts +678 -0
  715. package/src/pi-ecosystem-judgment/value-injection.ts +744 -0
  716. package/src/pi-ecosystem-mcp/index.ts +427 -0
  717. package/src/pi-ecosystem-subagents/index.ts +408 -0
  718. package/src/social/ant-colony/AdaptiveHeartbeat.ts +131 -0
  719. package/src/social/ant-colony/PheromoneEngine.ts +302 -0
  720. package/src/social/ant-colony/index.ts +18 -0
  721. package/src/social/ant-colony/types.ts +94 -0
  722. package/src/social/channels/ChannelManager.ts +485 -0
  723. package/src/social/channels/DiapChannelBridge.ts +501 -0
  724. package/src/social/channels/InterestMatcher.ts +189 -0
  725. package/src/social/channels/agent-workflow-config.json +214 -0
  726. package/src/social/channels/agent-workflow-config.yaml +334 -0
  727. package/src/social/channels/channel-agent-session.ts +407 -0
  728. package/src/social/channels/channel-heartbeat-agent.ts +622 -0
  729. package/src/social/channels/diap-doc-parser.ts +282 -0
  730. package/src/social/channels/harness-workflow-integrator.ts +594 -0
  731. package/src/social/channels/index.ts +22 -0
  732. package/src/social/channels/types.ts +115 -0
  733. package/src/social/global-shared-context.ts +506 -0
  734. package/src/social/heartbeat.ts +1041 -0
  735. package/src/social/persona/enhanced-persona.ts +359 -0
  736. package/src/test/ai-judgment-test.ts +92 -0
  737. package/src/test/bollharness-integration.test.ts +398 -0
  738. package/src/test/channel-agent-multi-dialogue.ts +265 -0
  739. package/src/test/channel-heartbeat-agent-test.ts +244 -0
  740. package/src/test/constraint-layer.test.ts +191 -0
  741. package/src/test/diap-identity-test.ts +222 -0
  742. package/src/test/diap-quick-test.ts +73 -0
  743. package/src/test/global-shared-context.test.ts +393 -0
  744. package/src/test/harness-judgment-injection.test.ts +353 -0
  745. package/src/test/harness-workflow-integrator-test.ts +285 -0
  746. package/src/test/human-value-store.test.ts +316 -0
  747. package/src/test/hybrid-integration-test.ts +126 -0
  748. package/src/test/hybrid-messenger-verify.ts +68 -0
  749. package/src/test/iroh-bistream-debug.ts +50 -0
  750. package/src/test/iroh-communication.test.ts +81 -0
  751. package/src/test/iroh-debug-test.ts +69 -0
  752. package/src/test/iroh-diap-test.ts +90 -0
  753. package/src/test/iroh-direct-connect.ts +65 -0
  754. package/src/test/iroh-e2e-fixed.ts +106 -0
  755. package/src/test/iroh-e2e-same-process.ts +83 -0
  756. package/src/test/iroh-e2e.ts +83 -0
  757. package/src/test/iroh-final-e2e.ts +84 -0
  758. package/src/test/iroh-relay-test.ts +46 -0
  759. package/src/test/iroh-simple-test.ts +49 -0
  760. package/src/test/iroh-transport-verify.ts +60 -0
  761. package/src/test/iroh-transport.test.ts +47 -0
  762. package/src/test/iroh-two-nodes.ts +87 -0
  763. package/src/test/iroh-verify.ts +55 -0
  764. package/src/test/judgment-decision.test.ts +373 -0
  765. package/src/test/llm-judgment-integration.test.ts +257 -0
  766. package/src/test/p2p-agent-complex-dialogue.ts +490 -0
  767. package/src/test/p2p-agent-dialogue.ts +423 -0
  768. package/src/test/p2p-agent-full-bidirectional.ts +686 -0
  769. package/src/test/p2p-agent-harness-flow.ts +562 -0
  770. package/src/test/p2p-agent-harness-single.ts +175 -0
  771. package/src/test/p2p-ai-dialogue-test.ts +374 -0
  772. package/src/test/p2p-cid-connect-test.ts +245 -0
  773. package/src/test/p2p-connect-receiver.ts +85 -0
  774. package/src/test/p2p-iroh-test.ts +214 -0
  775. package/src/test/p2p-minimal-test.ts +264 -0
  776. package/src/test/p2p-node-1.ts +172 -0
  777. package/src/test/p2p-node-2.ts +172 -0
  778. package/src/test/p2p-server.ts +335 -0
  779. package/src/test/p2p-two-nodes-test.ts +542 -0
  780. package/src/test/pi-sdk.test.ts +47 -0
  781. package/src/test/set-persona.ts +56 -0
  782. package/src/test/simple.test.ts +11 -0
  783. package/src/test/storage-integration.test.ts +191 -0
  784. package/src/test/subagent-manager.test.ts +392 -0
  785. package/src/test/test-gate-flow.test.ts +92 -0
  786. package/src/test/workflow-engine.test.ts +101 -0
  787. package/src/web/api-config.html +265 -0
  788. package/src/web/client.js +1401 -0
  789. package/src/web/components/p2p/P2PModal.tsx +328 -0
  790. package/src/web/components/p2p/index.ts +404 -0
  791. package/src/web/components/p2p/index.tsx +297 -0
  792. package/src/web/components/p2p/p2p-connection.ts +186 -0
  793. package/src/web/components/p2p/p2p-identity.ts +92 -0
  794. package/src/web/components/p2p/p2p-manager.ts +109 -0
  795. package/src/web/components/p2p/p2p-messages.ts +219 -0
  796. package/src/web/components/p2p/p2p-modal.ts +685 -0
  797. package/src/web/components/p2p/p2p-store-memory.ts +162 -0
  798. package/src/web/components/p2p/types.ts +112 -0
  799. package/src/web/design.md +99 -0
  800. package/src/web/index.html +192 -0
  801. package/src/web/server.ts +1878 -0
  802. package/src/web/style.css +3260 -0
  803. package/src/workflows/collaboration.ts +455 -0
  804. package/src/workflows/index.ts +64 -0
  805. package/tsconfig.electron.json +20 -0
  806. package/tsconfig.json +19 -0
  807. package/vitest.config.ts +12 -0
  808. package//346/203/263/346/263/225.md +79 -0
package/src/index.ts ADDED
@@ -0,0 +1,1606 @@
1
+ import {
2
+ HyperswarmCommunicator,
3
+ createHyperswarmCommunicator,
4
+ createTopic,
5
+ KeyManager,
6
+ AgentAuthManager,
7
+ AgentVerificationManager,
8
+ createVerificationManager,
9
+ type P2PMessage,
10
+ type P2PConnection,
11
+ } from '@diap/sdk';
12
+ import { irohTransport } from './network/iroh-transport.js';
13
+ import { HybridMessenger } from './network/hybrid-messenger.js';
14
+ import * as ed25519 from '@noble/ed25519';
15
+ import { sha512 } from '@noble/hashes/sha2.js';
16
+ import * as fs from 'fs/promises';
17
+ import * as path from 'path';
18
+ import { documentReader } from './documents/reader.js';
19
+ import { initMinimax } from './constraints/index.js';
20
+ import { createAgentSession } from './agents/pi-sdk.js';
21
+ import { createSubAgentManager } from './agents/subagent-manager.js';
22
+ import { getGlobalSharedContext } from './social/global-shared-context.js';
23
+ import { BollharnessIntegration, createBollharnessIntegration } from './bollharness-integration/index.js';
24
+ import * as readline from 'readline';
25
+
26
+ const RESET = '\x1b[0m';
27
+ const BOLD = '\x1b[1m';
28
+ const DIM = '\x1b[2m';
29
+ const CYAN = '\x1b[36m';
30
+ const GREEN = '\x1b[32m';
31
+ const YELLOW = '\x1b[33m';
32
+ const BLUE = '\x1b[34m';
33
+ const MAGENTA = '\x1b[35m';
34
+ const WHITE = '\x1b[37m';
35
+ const GRAY = '\x1b[90m';
36
+ const BG_WHITE = '\x1b[47m';
37
+ const BG_BLUE = '\x1b[44m';
38
+ const BLACK = '\x1b[30m';
39
+ const MOVE_UP = '\x1b[A';
40
+ const CLEAR_LINE = '\x1b[2K';
41
+ const HIDE_CURSOR = '\x1b[?25l';
42
+ const SHOW_CURSOR = '\x1b[?25h';
43
+
44
+ const s = {
45
+ banner: () => console.log(`\n${CYAN}${BOLD}
46
+ ╔═══════════════════════════════════════════╗
47
+ ║ ${WHITE}🤖 Bolloon ${CYAN} ║
48
+ ║ ${WHITE}P2P AI Document Processor${CYAN} ║
49
+ ╚═══════════════════════════════════════════╝${RESET}\n`),
50
+
51
+ step: (num: number, total: number, text: string, status?: 'ok' | 'loading' | 'warn' | 'error') => {
52
+ const check = status === 'ok' ? `${GREEN}✓` :
53
+ status === 'loading' ? `${YELLOW}⟳` :
54
+ status === 'warn' ? `${YELLOW}⚠` :
55
+ status === 'error' ? `${MAGENTA}✗` :
56
+ `${CYAN}●`;
57
+ console.log(` ${check} ${WHITE}[${num}/${total}]${GRAY} ${text}${RESET}`);
58
+ },
59
+
60
+ success: (text: string) => console.log(` ${GREEN}✓${RESET} ${text}`),
61
+ warn: (text: string) => console.log(` ${YELLOW}⚠${RESET} ${text}`),
62
+ error: (text: string) => console.log(` ${MAGENTA}✗${RESET} ${text}`),
63
+ info: (text: string) => console.log(` ${CYAN}●${RESET} ${text}`),
64
+
65
+ section: (title: string) => {
66
+ console.log(`\n${BLUE}━━━ ${WHITE}${BOLD}${title}${RESET} ${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}`);
67
+ },
68
+
69
+ divider: () => console.log(`\n${GRAY}${'─'.repeat(50)}${RESET}\n`),
70
+
71
+ prompt: (text: string) => console.log(`\n${CYAN}❯ ${WHITE}${text}${RESET}`),
72
+
73
+ response: (label: string, content: string) => {
74
+ console.log(`\n${GREEN}${label}${RESET}\n${content}\n`);
75
+ },
76
+
77
+ agentCard: (agent: { name: string; id: string; status: string; capabilities: string[]; did?: string }) => {
78
+ const statusColor = agent.status === 'active' ? GREEN :
79
+ agent.status === 'idle' ? YELLOW :
80
+ agent.status === 'busy' ? MAGENTA : GRAY;
81
+ console.log(` ${WHITE}${BOLD}${agent.name}${RESET}`);
82
+ console.log(` ${GRAY}ID:${RESET} ${agent.id}`);
83
+ console.log(` ${GRAY}状态:${RESET} ${statusColor}${agent.status}${RESET}`);
84
+ console.log(` ${GRAY}能力:${RESET} ${agent.capabilities.join(', ')}`);
85
+ if (agent.did) console.log(` ${GRAY}DID:${RESET} ${agent.did}`);
86
+ console.log();
87
+ },
88
+
89
+ Thinking: () => {
90
+ const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
91
+ let i = 0;
92
+ return setInterval(() => {
93
+ process.stdout.write(`\r ${YELLOW}${frames[i++ % frames.length]} 思考中...${RESET} `);
94
+ }, 80);
95
+ },
96
+
97
+ clearThinking: (interval: ReturnType<typeof setInterval>) => {
98
+ clearInterval(interval);
99
+ process.stdout.write('\r' + ' '.repeat(30) + '\r');
100
+ },
101
+
102
+ dialog: async (title: string, promptText: string): Promise<string> => {
103
+ return new Promise((resolve) => {
104
+ const rl = readline.createInterface({
105
+ input: process.stdin,
106
+ output: process.stdout
107
+ });
108
+
109
+ rl.question(`${CYAN}❯ ${RESET}`, (input) => {
110
+ rl.close();
111
+ resolve(input.trim());
112
+ });
113
+ });
114
+ }
115
+ };
116
+
117
+ // @ts-ignore - noble/ed25519 v3 requires sha512 to be set
118
+ (ed25519.hashes as any).sha512 = sha512;
119
+
120
+ // ---------------------------------------------------------------------------
121
+ // Message envelope
122
+ // Sender wraps: DID:<hex_did>|{"id":"...","type":"summarize|improve","documentPath":"...","requirements":"..."}
123
+ // So receiver can verify identity before dispatching
124
+ // ---------------------------------------------------------------------------
125
+
126
+ type TaskType = 'summarize' | 'improve';
127
+
128
+ interface RpcTask {
129
+ id: string;
130
+ type: TaskType;
131
+ documentPath?: string;
132
+ requirements?: string;
133
+ from: string; // DID of sender, extracted from message prefix
134
+ }
135
+
136
+ // ---------------------------------------------------------------------------
137
+ // Harness loop ─ poll-free event-driven (Hyperswarm DHT 自动推送)
138
+ // ---------------------------------------------------------------------------
139
+
140
+ /** 原始 Hyperswarm stream 缓存; HyperswarmCommunicator.sendToConnection 只打日志不写流 */
141
+ const rawStreams = new Map<string, any>();
142
+
143
+ function sendRawMsg(conn: P2PConnection, text: string): void {
144
+ const raw = rawStreams.get(conn as any);
145
+ if (raw && raw.writable) raw.write(Buffer.from(text));
146
+ }
147
+
148
+ // ---------------------------------------------------------------------------
149
+ // DIAP 身份初始化 ─ KeyManager → DID → DID Builder → IPFS publish
150
+ // ---------------------------------------------------------------------------
151
+
152
+ function getUserName(): string {
153
+ const home = process.env.HOME || process.env.USERPROFILE || '';
154
+ const match = home.match(/\/Users\/(\w+)/);
155
+ if (match) return match[1];
156
+ const user = process.env.USERNAME || process.env.USER || 'user';
157
+ return user.toLowerCase().replace(/[^a-z0-9]/g, '');
158
+ }
159
+
160
+ async function bootstrapIdentity(): Promise<{ keypair: import('@diap/sdk').KeyPair; did: string; name: string }> {
161
+ s.step(1, 5, '生成 DIAP 身份', 'loading');
162
+ const kp = KeyManager.generate();
163
+ const did = kp.did;
164
+ const username = getUserName();
165
+ const suffix = did.split(':').pop()?.substring(0, 4);
166
+ const name = `blln-${username}-${suffix}`;
167
+ console.log(` ${GRAY}DID:${RESET} ${did}`);
168
+ console.log(` ${GRAY}名称:${RESET} ${name}`);
169
+ s.step(1, 5, '生成 DIAP 身份', 'ok');
170
+ return { keypair: kp, did, name };
171
+ }
172
+
173
+ function publishDID(name: string, kp: import('@diap/sdk').KeyPair): Promise<{ cid?: string; ipnsName?: string }> {
174
+ s.step(2, 5, '发布 DID → IPFS (后台)', 'loading');
175
+
176
+ return new Promise((resolve) => {
177
+ const attempt = async () => {
178
+ let lastLogTime = 0;
179
+ const retryWithBackoff = async (retries: number): Promise<void> => {
180
+ try {
181
+ const auth = await AgentAuthManager.newWithRemoteIpfs('http://127.0.0.1:5001', 'http://127.0.0.1:8080');
182
+ const result = await auth.registerAgent({ name, services: [] }, kp, '');
183
+ s.step(2, 5, '发布 DID → IPFS', 'ok');
184
+ resolve({ cid: result.cid });
185
+ } catch (e: any) {
186
+ const now = Date.now();
187
+ if (now - lastLogTime > 30000) {
188
+ process.stdout.write(` ${YELLOW}⏳ IPNS发布中 (失败${retries}次), 后台重试...${RESET}\r`);
189
+ lastLogTime = now;
190
+ }
191
+ if (retries < 10) {
192
+ setTimeout(() => retryWithBackoff(retries + 1), 60000);
193
+ } else {
194
+ process.stdout.write(` ${YELLOW}⚠ IPNS发布重试结束,本地模式运行${RESET}\n`);
195
+ resolve({});
196
+ }
197
+ }
198
+ };
199
+
200
+ setTimeout(() => retryWithBackoff(1), 100);
201
+ };
202
+
203
+ attempt();
204
+ });
205
+ }
206
+
207
+ // ---------------------------------------------------------------------------
208
+ // P2P 节点初始化
209
+ // ---------------------------------------------------------------------------
210
+
211
+ async function bootstrapP2P(
212
+ verifier: AgentVerificationManager,
213
+ ): Promise<HyperswarmCommunicator> {
214
+ s.step(3, 5, '启动 P2P 网络', 'loading');
215
+ const rawSeed = crypto.getRandomValues(new Uint8Array(32));
216
+ const seed: any = rawSeed;
217
+ const comm = createHyperswarmCommunicator({ server: true, client: true, autoConnect: true, maxConnections: 50, seed });
218
+
219
+ comm.on('connection', (conn: P2PConnection) => {
220
+ const shortId = conn.publicKey.substring(0, 8);
221
+ s.info(`🔌 连接: ${shortId}...`);
222
+ const all: Map<string, P2PConnection> = (comm as any).connections as Map<string, P2PConnection>;
223
+ for (const [k, v] of all) {
224
+ if (v.publicKey === conn.publicKey) {
225
+ rawStreams.set(v['id'], (comm as any)['__pendingStream']);
226
+ break;
227
+ }
228
+ }
229
+ });
230
+
231
+ comm.on('message', async (msg: P2PMessage, conn: P2PConnection) => {
232
+ const content = new TextDecoder().decode(msg.content);
233
+ const shortId = conn.publicKey.substring(0, 8);
234
+ s.prompt(`📩 收到 ${shortId}: ${content.substring(0, 50)}...`);
235
+ const reply = await dispatchTask(content);
236
+ sendRawMsg(conn, reply);
237
+ });
238
+
239
+ await comm.start();
240
+ const topic = createTopic('bolloon-agent-harness') as Buffer;
241
+ await comm.joinTopic(topic);
242
+ console.log(` ${GRAY}主题:${RESET} ${topic.slice(0, 8).toString('hex')}...`);
243
+ s.step(3, 5, '启动 P2P 网络', 'ok');
244
+ return comm;
245
+ }
246
+
247
+ // ---------------------------------------------------------------------------
248
+ // iroh/Hybrid P2P 初始化
249
+ // ---------------------------------------------------------------------------
250
+
251
+ async function bootstrapIroh(keypair: any, name: string): Promise<void> {
252
+ s.step(4, 5, '启动 iroh P2P', 'loading');
253
+
254
+ try {
255
+ const node = await irohTransport.start();
256
+ console.log(` ${GRAY}iroh:${RESET} ${node.nodeId.substring(0, 16)}...`);
257
+
258
+ hybridMessenger = new HybridMessenger({
259
+ preferIrohForLarge: true,
260
+ largeThresholdBytes: 64 * 1024,
261
+ enableRelay: true,
262
+ });
263
+
264
+ hybridMessenger.onMessage('task', async (msg) => {
265
+ console.log(`[iroh] Task from ${msg.from.substring(0, 12)}...: ${new TextDecoder().decode(msg.payload).substring(0, 50)}...`);
266
+ });
267
+
268
+ hybridMessenger.onMessage('blob', async (msg) => {
269
+ console.log(`[iroh] Blob from ${msg.from.substring(0, 12)}...: ${msg.payload.length} bytes`);
270
+ });
271
+
272
+ hybridMessenger.onMessage('response', async (msg) => {
273
+ console.log(`[iroh] Response from ${msg.from.substring(0, 12)}...`);
274
+ });
275
+
276
+ if (agentIdentity) {
277
+ agentIdentity.irohNodeId = node.nodeId;
278
+ }
279
+
280
+ s.step(4, 5, '启动 iroh P2P', 'ok');
281
+ } catch (e: any) {
282
+ s.step(4, 5, '启动 iroh P2P', 'warn');
283
+ console.log(` ${YELLOW}iroh 启动失败: ${e.message}${RESET}`);
284
+ console.log(` ${GRAY}继续使用 Hyperswarm P2P${RESET}`);
285
+ }
286
+ }
287
+
288
+ // ---------------------------------------------------------------------------
289
+ // Agent 懒加载
290
+ // ---------------------------------------------------------------------------
291
+
292
+ let agent: Awaited<ReturnType<typeof createAgentSession>> | null = null;
293
+ let harness: BollharnessIntegration | null = null;
294
+ let hybridMessenger: HybridMessenger | null = null;
295
+ let agentIdentity: {
296
+ did: string;
297
+ name: string;
298
+ publicKey: string;
299
+ peerId?: string;
300
+ p2pChannel?: string;
301
+ cid?: string;
302
+ ipnsName?: string;
303
+ irohNodeId?: string;
304
+ } | null = null;
305
+
306
+ async function getAgent() {
307
+ if (!agent) {
308
+ const identityDoc = agentIdentity ? {
309
+ did: agentIdentity.did,
310
+ name: agentIdentity.name,
311
+ publicKey: agentIdentity.publicKey,
312
+ createdAt: Date.now(),
313
+ peerId: agentIdentity.peerId,
314
+ p2pChannel: agentIdentity.p2pChannel,
315
+ cid: agentIdentity.cid,
316
+ ipnsName: agentIdentity.ipnsName
317
+ } : undefined;
318
+ agent = await createAgentSession({
319
+ cwd: process.cwd(),
320
+ peerId: 'harness',
321
+ identityDoc
322
+ });
323
+ }
324
+ return agent;
325
+ }
326
+
327
+ // ---------------------------------------------------------------------------
328
+ // Dispatch
329
+ // ---------------------------------------------------------------------------
330
+
331
+ async function dispatchTask(raw: string): Promise<string> {
332
+ const body = raw.startsWith('DID:') ? raw.split('|', 1)[1] || '' : raw;
333
+ const task = safeParse<RpcTask>(body);
334
+ if (!task) return `ERR|${JSON.stringify({ code: 'bad_format' })}`;
335
+
336
+ console.log(`\n📥 [${task.type}] from=${task.from?.substring(0, 18)}... id=${task.id}`);
337
+ try {
338
+ switch (task.type) {
339
+ case 'summarize':
340
+ return await handleSummarize(task);
341
+ case 'improve':
342
+ return await handleImprove(task);
343
+ default:
344
+ return `ERR|${JSON.stringify({ code: 'unknown', type: task.type })}`;
345
+ }
346
+ } catch (e: any) {
347
+ return `ERR|${JSON.stringify({ code: 'error', msg: e.message })}`;
348
+ }
349
+ }
350
+
351
+ async function handleSummarize(task: RpcTask): Promise<string> {
352
+ if (!task.documentPath) return `ERR|${JSON.stringify({ code: 'no_path' })}`;
353
+ const a = await getAgent();
354
+ const { summary, qualityScore } = await a.summarizeDocument(task.documentPath);
355
+ console.log(` ✅ 质量=${(qualityScore * 10).toFixed(1)}/10`);
356
+ return `OK|${JSON.stringify({ id: task.id, type: 'summarize', qualityScore, summary })}`;
357
+ }
358
+
359
+ async function handleImprove(task: RpcTask): Promise<string> {
360
+ if (!task.documentPath || !task.requirements) {
361
+ return `ERR|${JSON.stringify({ code: 'no_path_or_req' })}`;
362
+ }
363
+ const a = await getAgent();
364
+ const res = await a.improveDocument({
365
+ originalPath: task.documentPath,
366
+ requirements: task.requirements,
367
+ context: `来自节点: ${task.from}`,
368
+ });
369
+ const ok = res.improved ?? false;
370
+ console.log(` ✅ 改进${ok ? '成功' : '失败'} 质量=${(res.qualityScore * 10).toFixed(1)}/10 自动发送=${res.shouldAutoSend}`);
371
+ return `OK|${JSON.stringify({
372
+ id: task.id, type: 'improve', improved: ok,
373
+ qualityScore: res.qualityScore, shouldAutoSend: res.shouldAutoSend,
374
+ newContent: res.newContent,
375
+ })}`;
376
+ }
377
+
378
+ // ---------------------------------------------------------------------------
379
+ // Utils
380
+ // ---------------------------------------------------------------------------
381
+
382
+ function safeParse<T>(s: string): T | null {
383
+ try { return JSON.parse(s) as T; } catch { return null; }
384
+ }
385
+
386
+ function rpcErr(code: string, msg: string): string {
387
+ return `ERR|${JSON.stringify({ code, msg })}`;
388
+ }
389
+
390
+ // ---------------------------------------------------------------------------
391
+ // CLI with persistent bottom prompt
392
+ // ---------------------------------------------------------------------------
393
+
394
+ const SAVE_CURSOR = '\x1b[s';
395
+ const RESTORE_CURSOR = '\x1b[u';
396
+ const MOVE_TO_BOTTOM = '\x1b[999A';
397
+ const HIDE_CURSOR_SEQ = '\x1b[?25l';
398
+ const SHOW_CURSOR_SEQ = '\x1b[?25h';
399
+ const MOVE_UP_1 = '\x1b[1A';
400
+
401
+ let isRunning = false;
402
+ let currentInput = '';
403
+ let promptVisible = false;
404
+
405
+ function getTermHeight(): number {
406
+ return process.stdout.rows || 24;
407
+ }
408
+
409
+ function moveCursorToBottom(): void {
410
+ const height = getTermHeight();
411
+ process.stdout.write(`\x1b[${height};1H`);
412
+ }
413
+
414
+ function showBottomPrompt(): void {
415
+ if (!isRunning) return;
416
+ promptVisible = true;
417
+ process.stdout.write(SAVE_CURSOR);
418
+ moveCursorToBottom();
419
+ process.stdout.write(`${CYAN}❯ ${RESET}${currentInput}${HIDE_CURSOR_SEQ}`);
420
+ process.stdout.write(RESTORE_CURSOR);
421
+ }
422
+
423
+ function clearPromptLine(): void {
424
+ if (!promptVisible) return;
425
+ process.stdout.write(SAVE_CURSOR);
426
+ moveCursorToBottom();
427
+ process.stdout.write(CLEAR_LINE);
428
+ process.stdout.write(RESTORE_CURSOR);
429
+ promptVisible = false;
430
+ }
431
+
432
+ function startCLI(comm: HyperswarmCommunicator): void {
433
+ isRunning = true;
434
+ currentInput = '';
435
+ promptVisible = false;
436
+
437
+ try {
438
+ (process.stdin as any).setRawMode(true);
439
+ } catch {
440
+ }
441
+ readline.emitKeypressEvents(process.stdin);
442
+
443
+ process.stdout.write(CLEAR_LINE);
444
+ showBottomPrompt();
445
+
446
+ const promptTimer = setInterval(() => {
447
+ if (isRunning && promptVisible) {
448
+ showBottomPrompt();
449
+ }
450
+ }, 500);
451
+
452
+ const handleInput = (chunk: Buffer, key: { name: string; ctrl: boolean }) => {
453
+ if (!isRunning) return;
454
+
455
+ if (key.ctrl && key.name === 'c') {
456
+ clearPromptLine();
457
+ process.stdout.write(`\n${CYAN}👋 再见!${RESET}\n`);
458
+ try { (process.stdin as any).setRawMode(false); } catch {}
459
+ clearInterval(promptTimer);
460
+ process.exit(0);
461
+ return;
462
+ }
463
+
464
+ if (key.name === 'return') {
465
+ const trimmed = currentInput.trim();
466
+ currentInput = '';
467
+ clearPromptLine();
468
+
469
+ if (trimmed) {
470
+ process.stdout.write('\n');
471
+ processInput(trimmed, comm).then(() => {
472
+ if (isRunning) showBottomPrompt();
473
+ });
474
+ } else {
475
+ showBottomPrompt();
476
+ }
477
+ return;
478
+ }
479
+
480
+ if (key.name === 'backspace') {
481
+ if (currentInput.length > 0) {
482
+ currentInput = currentInput.slice(0, -1);
483
+ showBottomPrompt();
484
+ }
485
+ return;
486
+ }
487
+
488
+ if (key.name === 'escape' || (key.ctrl && key.name === 'u')) {
489
+ currentInput = '';
490
+ showBottomPrompt();
491
+ return;
492
+ }
493
+
494
+ if (key.name === 'tab') {
495
+ return;
496
+ }
497
+
498
+ if (key.name && key.name.length === 1) {
499
+ currentInput += chunk.toString();
500
+ showBottomPrompt();
501
+ }
502
+ };
503
+
504
+ process.stdin.on('data', handleInput);
505
+
506
+ process.on('exit', () => {
507
+ isRunning = false;
508
+ process.stdout.write(SHOW_CURSOR_SEQ);
509
+ });
510
+ }
511
+
512
+ async function processInput(input: string, comm: HyperswarmCommunicator): Promise<void> {
513
+ const trimmed = input.trim();
514
+
515
+ if (trimmed === '退出' || trimmed === 'exit' || trimmed === 'quit') {
516
+ clearPromptLine();
517
+ process.stdout.write(`${CYAN}👋 再见!${RESET}\n`);
518
+ isRunning = false;
519
+ process.stdin.destroy();
520
+ comm.stop();
521
+ return;
522
+ }
523
+
524
+ if (trimmed.toLowerCase() === 'peers') {
525
+ const peers = comm.getConnections();
526
+ process.stdout.write(`${GRAY}已连接节点: ${peers.length}${RESET}\n`);
527
+ for (const c of peers) {
528
+ process.stdout.write(` ${GRAY}·${RESET} ${c.publicKey.substring(0, 16)}...\n`);
529
+ }
530
+ return;
531
+ }
532
+
533
+ if (trimmed.toLowerCase() === 'iroh') {
534
+ const nodeId = irohTransport.getNodeId();
535
+ const running = irohTransport.isRunning();
536
+ const peers = irohTransport.getPeers();
537
+ process.stdout.write(`${GRAY}iroh 状态:${RESET}\n`);
538
+ process.stdout.write(` ${GRAY}运行中:${RESET} ${running ? '是' : '否'}\n`);
539
+ process.stdout.write(` ${GRAY}Node ID:${RESET} ${nodeId ? nodeId.substring(0, 24) + '...' : 'N/A'}\n`);
540
+ process.stdout.write(` ${GRAY}已知节点:${RESET} ${peers.length}\n`);
541
+ if (hybridMessenger) {
542
+ process.stdout.write(` ${GRAY}HybridMessenger:${RESET} 就绪\n`);
543
+ }
544
+ return;
545
+ }
546
+
547
+ try {
548
+ const a = await getAgent();
549
+ const thinking = setInterval(() => {
550
+ if (!isRunning) return;
551
+ process.stdout.write('\r \x1b[33m⟳\x1b[0m 思考中... \x1b[?25l');
552
+ }, 80);
553
+ const response = await a.prompt(trimmed);
554
+ clearInterval(thinking);
555
+ process.stdout.write('\r' + ' '.repeat(30) + '\r');
556
+ process.stdout.write(`${response}\n`);
557
+ } catch (e: any) {
558
+ if (!e.message?.includes('ERR_USE_AFTER_CLOSE') && !e.message?.includes('write after end')) {
559
+ process.stdout.write(`${MAGENTA}❌ ${e.message}${RESET}\n`);
560
+ }
561
+ }
562
+ }
563
+
564
+ // ---------------------------------------------------------------------------
565
+ // Non-Interactive Mode (for AI consumption)
566
+ // ---------------------------------------------------------------------------
567
+
568
+ interface NonInteractiveResult {
569
+ success: boolean;
570
+ response?: string;
571
+ error?: string;
572
+ metadata?: {
573
+ duration?: number;
574
+ qualityScore?: number;
575
+ peers?: number;
576
+ file?: string;
577
+ };
578
+ }
579
+
580
+ const AVAILABLE_TOOLS = [
581
+ { name: 'read_document', description: '读取文档 (txt, md, pdf, docx)', example: '--read <file>' },
582
+ { name: 'summarize_document', description: '总结文档内容', example: '--summarize <file>' },
583
+ { name: 'improve_document', description: '改进文档内容', example: '--improve <file> <requirements>' },
584
+ { name: 'list_peers', description: '列出已连接的对等节点', example: '--peers' },
585
+ { name: 'send_message', description: '向对等节点发送消息', example: '--send <peerId> <message>' },
586
+ { name: 'broadcast_message', description: '广播消息到所有节点', example: '--broadcast <message>' },
587
+ { name: 'get_identity', description: '获取当前智能体身份', example: '--identity' },
588
+ { name: 'get_operation_logs', description: '获取操作日志', example: '--logs' },
589
+ { name: 'search_files', description: '搜索文件', example: '--search <keyword>' },
590
+ { name: 'prompt', description: '通用 AI 对话', example: '--prompt <text>' },
591
+ { name: 'list_agents', description: '列出所有 SubAgent', example: '--agents' },
592
+ { name: 'register_agent', description: '注册新 SubAgent', example: '--register-agent <name> [capabilities...]' },
593
+ { name: 'delegate_task', description: '委派任务给最佳 Agent', example: '--delegate <task> [capabilities...]' },
594
+ { name: 'global_context', description: '显示全局共享上下文', example: '--context' },
595
+ { name: 'global_agents', description: '显示全局 Agent 注册表', example: '--global-agents' },
596
+ { name: 'add_action', description: '添加用户行动到共享上下文', example: '--add-action <content> [importance]' },
597
+ { name: 'harness_init', description: '初始化 Bollharness 治理框架', example: '--harness-init' },
598
+ { name: 'harness_gate', description: '显示当前 Gate 状态', example: '--harness-gate' },
599
+ { name: 'harness_transition', description: '执行 Gate 转移', example: '--harness-transition [PASS|BLOCK]' },
600
+ { name: 'harness_skill', description: '执行 Harness Skill', example: '--harness-skill <name> [action]' },
601
+ { name: 'harness_classify', description: '分类变更类型', example: '--harness-classify <description>' },
602
+ { name: 'harness_context', description: '获取文件上下文', example: '--harness-context <file>' },
603
+ { name: 'harness_check', description: '执行 Guard 检查', example: '--harness-check <file>' },
604
+ ];
605
+
606
+ async function runToolCommand(
607
+ tool: string,
608
+ args: string[],
609
+ outputJson: boolean,
610
+ comm: HyperswarmCommunicator
611
+ ): Promise<void> {
612
+ const a = await getAgent();
613
+ const startTime = Date.now();
614
+ let response: string;
615
+ let error: string | undefined;
616
+ let metadata: NonInteractiveResult['metadata'] = {
617
+ peers: comm?.getConnections().length || 0
618
+ };
619
+
620
+ const toolLabels: Record<string, string> = {
621
+ 'read': '读取文档',
622
+ 'summarize': '总结文档',
623
+ 'improve': '改进文档',
624
+ 'prompt': 'AI 对话',
625
+ 'agents': '列出 Agent',
626
+ 'register-agent': '注册 Agent',
627
+ 'delegate': '委派任务',
628
+ 'context': '全局上下文',
629
+ 'global-agents': 'Agent 注册表',
630
+ 'add-action': '添加行动',
631
+ 'peers': '列出节点',
632
+ 'broadcast': '广播消息',
633
+ 'identity': '显示身份',
634
+ 'logs': '操作日志',
635
+ 'tools': '可用工具'
636
+ };
637
+
638
+ const label = toolLabels[tool] || tool;
639
+ const thinking = s.Thinking();
640
+
641
+ try {
642
+ switch (tool) {
643
+ case 'read': {
644
+ const [filePath] = args;
645
+ if (!filePath) {
646
+ response = '错误: 缺少文件路径参数';
647
+ error = response;
648
+ break;
649
+ }
650
+ const content = await documentReader.read(filePath);
651
+ response = `${GREEN}📄 ${content.metadata.filename}${RESET}\n${GRAY}大小: ${content.metadata.size} 字节${RESET}\n\n${content.text}`;
652
+ break;
653
+ }
654
+
655
+ case 'summarize': {
656
+ const [filePath, ...ctx] = args;
657
+ if (!filePath) {
658
+ response = '错误: 缺少文件路径参数';
659
+ error = response;
660
+ break;
661
+ }
662
+ const result = await a.summarizeDocument(filePath, ctx.join(' '));
663
+ response = `📝 摘要:\n${result.summary}\n\n质量评分: ${(result.qualityScore * 10).toFixed(1)}/10`;
664
+ metadata.qualityScore = result.qualityScore;
665
+ break;
666
+ }
667
+
668
+ case 'improve': {
669
+ const [filePath, ...req] = args;
670
+ if (!filePath || req.length === 0) {
671
+ response = '错误: 缺少文件路径或需求参数';
672
+ error = response;
673
+ break;
674
+ }
675
+ const result = await a.improveDocument({
676
+ originalPath: filePath,
677
+ requirements: req.join(' ')
678
+ });
679
+ response = result.newContent || '';
680
+ if (!result.improved) {
681
+ response = '错误: 改进失败';
682
+ error = response;
683
+ }
684
+ metadata.qualityScore = result.qualityScore;
685
+ break;
686
+ }
687
+
688
+ case 'peers': {
689
+ const peers = comm?.getConnections() || [];
690
+ if (peers.length === 0) {
691
+ response = '当前无连接的对等节点';
692
+ } else {
693
+ response = `已连接节点 (${peers.length}):\n${peers.map((c: P2PConnection) => ` · ${c.publicKey.substring(0, 16)}...`).join('\n')}`;
694
+ }
695
+ break;
696
+ }
697
+
698
+ case 'iroh': {
699
+ const nodeId = irohTransport.getNodeId();
700
+ const running = irohTransport.isRunning();
701
+ const irohPeers = irohTransport.getPeers();
702
+ const messenger = hybridMessenger ? 'HybridMessenger 就绪' : 'HybridMessenger 未初始化';
703
+ response = `iroh P2P 状态:
704
+ 运行中: ${running ? '是' : '否'}
705
+ Node ID: ${nodeId ? nodeId.substring(0, 32) + '...' : 'N/A'}
706
+ 已知节点: ${irohPeers.length}
707
+ ${messenger}`;
708
+ break;
709
+ }
710
+
711
+ case 'identity': {
712
+ const identity = a.getIdentity();
713
+ response = JSON.stringify(identity, null, 2);
714
+ break;
715
+ }
716
+
717
+ case 'logs': {
718
+ const logs = (a as any).getOperationLogs?.() || [];
719
+ response = logs.length === 0
720
+ ? '暂无操作日志'
721
+ : logs.map((l: { timestamp: number; status: string; action: string }) => `[${new Date(l.timestamp).toISOString()}] ${l.status}: ${l.action}`).join('\n');
722
+ break;
723
+ }
724
+
725
+ case 'search': {
726
+ const [keyword] = args;
727
+ if (!keyword) {
728
+ response = '错误: 缺少搜索关键词';
729
+ error = response;
730
+ break;
731
+ }
732
+ response = `搜索功能开发中,关键字: ${keyword}`;
733
+ break;
734
+ }
735
+
736
+ case 'broadcast': {
737
+ const [message] = args;
738
+ if (!message) {
739
+ response = '错误: 缺少广播消息内容';
740
+ error = response;
741
+ break;
742
+ }
743
+ await a.broadcast(message);
744
+ response = `广播已发送: ${message.substring(0, 50)}...`;
745
+ break;
746
+ }
747
+
748
+ case 'send': {
749
+ const [peerId, ...messageParts] = args;
750
+ if (!peerId || messageParts.length === 0) {
751
+ response = '错误: 缺少节点ID或消息内容';
752
+ error = response;
753
+ break;
754
+ }
755
+ await a.sendMessage(peerId, messageParts.join(' '));
756
+ response = `消息已发送到 ${peerId.substring(0, 16)}...`;
757
+ break;
758
+ }
759
+
760
+ case 'prompt': {
761
+ const [text] = args;
762
+ if (!text) {
763
+ response = '错误: 缺少 prompt 文本';
764
+ error = response;
765
+ break;
766
+ }
767
+ response = await a.prompt(text);
768
+ break;
769
+ }
770
+
771
+ case 'tools': {
772
+ response = '🛠️ 可用工具:\n\n' + AVAILABLE_TOOLS.map(t =>
773
+ ` ${t.name}\n ${t.description}\n 示例: ${t.example}`
774
+ ).join('\n\n');
775
+ break;
776
+ }
777
+
778
+ // ==================== Bollharness Commands ====================
779
+
780
+ case 'harness-init': {
781
+ harness = createBollharnessIntegration();
782
+ const skills = harness!.listSkills();
783
+ const harnessSkills = harness!.listHarnessSkills();
784
+ response = `✅ Bollharness 初始化成功\n\n` +
785
+ `已加载 Skills: ${skills.length}\n` +
786
+ `已加载 Harness Skills: ${harnessSkills.length}\n\n` +
787
+ `Skills:\n${skills.map(s => ` - ${s.name}: ${s.description}`).join('\n')}\n\n` +
788
+ `Gates: 0-8 (8-Gate 工作流)`;
789
+ break;
790
+ }
791
+
792
+ case 'harness-gate': {
793
+ if (!harness) {
794
+ harness = createBollharnessIntegration();
795
+ }
796
+ const gate = harness!.getCurrentGate();
797
+ const gatePack = harness!.getGatePack();
798
+ const blockers = (gatePack.blockers as string[]) || [];
799
+ response = `🚪 当前 Gate: ${gate}\n\n` +
800
+ `Entry: ${gatePack.entry_satisfied ? '✅ 满足' : '❌ 未满足'}\n` +
801
+ `要求产物: ${gatePack.required_artifact}\n` +
802
+ `下一步 Skill: ${gatePack.required_next_skill}\n` +
803
+ `Blockers: ${blockers.length > 0 ? blockers.join(', ') : '无'}`;
804
+ break;
805
+ }
806
+
807
+ case 'harness-transition': {
808
+ if (!harness) {
809
+ harness = createBollharnessIntegration();
810
+ }
811
+ const [verdict] = args;
812
+ const result = await harness!.transitionGate(
813
+ verdict ? { verdict: verdict as 'PASS' | 'BLOCK', details: '' } : undefined
814
+ );
815
+ const transitionBlockers = (result.transition as { blockers?: string[] })?.blockers || [];
816
+ response = `🔄 Gate 转移: ${result.success ? '✅ 成功' : '❌ 失败'}\n` +
817
+ `Blockers: ${transitionBlockers.length > 0 ? transitionBlockers.join(', ') : '无'}`;
818
+ break;
819
+ }
820
+
821
+ case 'harness-skill': {
822
+ if (!harness) {
823
+ harness = createBollharnessIntegration();
824
+ }
825
+ const [skillName, action] = args;
826
+ if (!skillName) {
827
+ const skills = harness!.listSkills();
828
+ response = `📋 可用 Skills (${skills.length}):\n\n` +
829
+ skills.map(s => ` ${s.name}: ${s.description}`).join('\n');
830
+ break;
831
+ }
832
+ const result = await harness!.executeSkill(skillName, { action: action || 'get_gate' });
833
+ response = `🎯 Skill '${skillName}' 执行结果:\n\n${result.result || result.error}`;
834
+ break;
835
+ }
836
+
837
+ case 'harness-classify': {
838
+ if (!harness) {
839
+ harness = createBollharnessIntegration();
840
+ }
841
+ const [description] = args;
842
+ if (!description) {
843
+ response = '用法: --harness-classify <变更描述>';
844
+ error = response;
845
+ break;
846
+ }
847
+ const result = harness!.classifyChange(description);
848
+ response = `📊 变更分类: ${result.classification}\n` +
849
+ `最小路径: ${result.minimum_gates}\n` +
850
+ `快速通道: ${result.fast_track ? '✅ 可用' : '❌ 不可用'}`;
851
+ break;
852
+ }
853
+
854
+ case 'harness-context': {
855
+ if (!harness) {
856
+ harness = createBollharnessIntegration();
857
+ }
858
+ const [filePath] = args;
859
+ if (!filePath) {
860
+ response = '用法: --harness-context <文件路径>';
861
+ error = response;
862
+ break;
863
+ }
864
+ const context = harness!.getContext(filePath);
865
+ response = `📄 文件: ${filePath}\n\n上下文:\n${context || '无匹配上下文'}`;
866
+ break;
867
+ }
868
+
869
+ case 'harness-check': {
870
+ if (!harness) {
871
+ harness = createBollharnessIntegration();
872
+ }
873
+ const [filePath] = args;
874
+ if (!filePath) {
875
+ response = '用法: --harness-check <文件路径>';
876
+ error = response;
877
+ break;
878
+ }
879
+ const result = await harness!.processFileEdit(filePath);
880
+ response = `🔍 Guard 检查: ${filePath}\n\n` +
881
+ `通过: ${result.success ? '✅' : '❌'}\n` +
882
+ `错误: ${result.errors.length > 0 ? result.errors.join('\n') : '无'}`;
883
+ break;
884
+ }
885
+
886
+ case 'harness-archive': {
887
+ const a = await getAgent();
888
+ const sessionHarness = (a as any).getHarness?.();
889
+ if (sessionHarness) {
890
+ (a as any).archiveToHarness?.();
891
+ response = `📦 Session 已归档到 Pi SDK Harness`;
892
+ } else {
893
+ if (!harness) {
894
+ harness = createBollharnessIntegration();
895
+ }
896
+ const logs = (a as any).getOperationLogs?.() || [];
897
+ const archive = harness.archiveSession(logs);
898
+ response = `📦 Session 已归档:\n` +
899
+ `ID: ${archive.id}\n` +
900
+ `Gate: ${archive.gate}\n` +
901
+ `动作数: ${archive.actionCount}\n` +
902
+ `摘要: ${archive.summary}`;
903
+ }
904
+ break;
905
+ }
906
+
907
+ case 'harness-sessions': {
908
+ const a = await getAgent();
909
+ const sessionHarness = (a as any).getHarness?.();
910
+ if (sessionHarness) {
911
+ harness = sessionHarness;
912
+ }
913
+ if (!harness) {
914
+ harness = createBollharnessIntegration();
915
+ }
916
+ const archives = harness.getSessionArchives();
917
+ if (archives.length === 0) {
918
+ response = '暂无 Session 归档记录';
919
+ break;
920
+ }
921
+ response = `📜 Session 归档记录 (${archives.length}):\n\n`;
922
+ for (const archive of archives.slice(-10)) {
923
+ response += `### ${archive.id}\n`;
924
+ response += `Gate: ${archive.gate} | 动作: ${archive.actionCount}\n`;
925
+ response += `摘要: ${archive.summary}\n\n`;
926
+ }
927
+ break;
928
+ }
929
+
930
+ case 'harness-session-context': {
931
+ const a = await getAgent();
932
+ const sessionHarness = (a as any).getHarness?.();
933
+ if (sessionHarness) {
934
+ const [sessionId] = args;
935
+ const context = sessionHarness.getSessionContext(sessionId || undefined);
936
+ response = `📄 Pi SDK Session 上下文:\n\n${context}`;
937
+ } else {
938
+ if (!harness) {
939
+ harness = createBollharnessIntegration();
940
+ }
941
+ const [sessionId] = args;
942
+ const context = harness.getSessionContext(sessionId || undefined);
943
+ response = `📄 Session 上下文:\n\n${context}`;
944
+ }
945
+ break;
946
+ }
947
+
948
+ case 'agents': {
949
+ const manager = await createSubAgentManager();
950
+ const agents = await manager.getAllAgents();
951
+ if (agents.length === 0) {
952
+ response = '暂无注册的 SubAgent';
953
+ } else {
954
+ response = `📋 已注册 SubAgent (${agents.length}):\n\n`;
955
+ for (const agent of agents) {
956
+ response += ` [${agent.status}] ${agent.name} (${agent.id})\n`;
957
+ response += ` 能力: ${agent.capabilities.join(', ')}\n`;
958
+ response += ` DID: ${agent.did || 'N/A'}\n\n`;
959
+ }
960
+ }
961
+ break;
962
+ }
963
+
964
+ case 'register-agent': {
965
+ const [name, ...capabilities] = args;
966
+ if (!name) {
967
+ response = '用法: --register-agent <name> [capability1] [capability2] ...';
968
+ error = response;
969
+ break;
970
+ }
971
+ const manager = await createSubAgentManager();
972
+ const agent = await manager.registerAgent({
973
+ name,
974
+ capabilities: capabilities.length > 0 ? capabilities : ['general'],
975
+ did: `did:local:${Date.now()}`
976
+ });
977
+ response = `✅ SubAgent 注册成功:\n ID: ${agent.id}\n 名称: ${agent.name}\n 能力: ${agent.capabilities.join(', ')}`;
978
+ break;
979
+ }
980
+
981
+ case 'delegate': {
982
+ const [taskDesc, ...requiredCaps] = args;
983
+ if (!taskDesc) {
984
+ response = '用法: --delegate <任务描述> [能力要求1] [能力要求2] ...';
985
+ error = response;
986
+ break;
987
+ }
988
+ const manager = await createSubAgentManager();
989
+ const a = await getAgent();
990
+ const { task, agent } = await manager.delegateTask(
991
+ 'cli-user',
992
+ taskDesc,
993
+ requiredCaps.length > 0 ? requiredCaps : ['general']
994
+ );
995
+ if (agent) {
996
+ response = `✅ 任务已委派:\n 任务ID: ${task.id}\n 执行Agent: ${agent.name} (${agent.id})\n 状态: ${task.status}`;
997
+ } else {
998
+ response = `⚠️ 未找到合适的Agent,任务已创建:\n 任务ID: ${task.id}\n 状态: ${task.status}`;
999
+ }
1000
+ break;
1001
+ }
1002
+
1003
+ case 'context': {
1004
+ const ctx = await getGlobalSharedContext();
1005
+ response = await ctx.getContextSummary();
1006
+ break;
1007
+ }
1008
+
1009
+ case 'global-agents': {
1010
+ const ctx = await getGlobalSharedContext();
1011
+ const agents = await ctx.getAllAgents();
1012
+ if (agents.length === 0) {
1013
+ response = '全局注册表暂无 Agent';
1014
+ } else {
1015
+ response = `🌐 全局 Agent 注册表 (${agents.length}):\n\n`;
1016
+ for (const agent of agents) {
1017
+ response += ` [${agent.status}] ${agent.name || agent.agentId}\n`;
1018
+ response += ` ID: ${agent.agentId}\n`;
1019
+ response += ` DID: ${agent.did || 'N/A'}\n`;
1020
+ response += ` 能力: ${agent.capabilities.join(', ')}\n\n`;
1021
+ }
1022
+ }
1023
+ break;
1024
+ }
1025
+
1026
+ case 'add-action': {
1027
+ const [content, importance] = args;
1028
+ if (!content) {
1029
+ response = '用法: --add-action <内容> [重要性(1-10)]';
1030
+ error = response;
1031
+ break;
1032
+ }
1033
+ const ctx = await getGlobalSharedContext();
1034
+ await ctx.addUserAction(content, undefined, undefined, parseInt(importance || '5', 10));
1035
+ response = `✅ 已添加用户行动: ${content.substring(0, 50)}...`;
1036
+ break;
1037
+ }
1038
+
1039
+ default:
1040
+ response = `错误: 未知工具 "${tool}"`;
1041
+ error = response;
1042
+ }
1043
+ } catch (e: any) {
1044
+ response = `错误: ${e.message}`;
1045
+ error = response;
1046
+ }
1047
+
1048
+ metadata.duration = Date.now() - startTime;
1049
+
1050
+ s.clearThinking(thinking);
1051
+
1052
+ if (outputJson) {
1053
+ const result: NonInteractiveResult = {
1054
+ success: !error,
1055
+ response,
1056
+ error,
1057
+ metadata
1058
+ };
1059
+ console.log(JSON.stringify(result, null, 2));
1060
+ } else {
1061
+ if (error) {
1062
+ s.divider();
1063
+ console.log(`${MAGENTA}${error}${RESET}\n`);
1064
+ } else {
1065
+ s.divider();
1066
+ console.log(`${response}\n`);
1067
+ }
1068
+ console.log(`${GRAY}耗时: ${metadata.duration}ms${RESET}`);
1069
+ }
1070
+ }
1071
+
1072
+ async function runNonInteractive(
1073
+ args: ParsedArgs,
1074
+ comm: HyperswarmCommunicator
1075
+ ): Promise<void> {
1076
+ const { prompt, json, output, tool, toolArgs } = args;
1077
+
1078
+ if (output) {
1079
+ const originalLog = console.log;
1080
+ let outputBuffer = '';
1081
+ console.log = (...params: any[]) => {
1082
+ outputBuffer += params.join(' ') + '\n';
1083
+ };
1084
+
1085
+ if (tool) {
1086
+ await runToolCommand(tool, toolArgs, false, comm);
1087
+ } else if (prompt) {
1088
+ const a = await getAgent();
1089
+ console.log(await a.prompt(prompt));
1090
+ }
1091
+
1092
+ console.log = originalLog;
1093
+ await fs.writeFile(output, outputBuffer.trim(), 'utf-8');
1094
+ console.log(`✅ 结果已保存到: ${output}`);
1095
+ return;
1096
+ }
1097
+
1098
+ if (tool) {
1099
+ await runToolCommand(tool, toolArgs, !!json, comm);
1100
+ } else if (prompt) {
1101
+ const startTime = Date.now();
1102
+ const a = await getAgent();
1103
+ let response: string;
1104
+ try {
1105
+ response = await a.prompt(prompt);
1106
+ } catch (e: any) {
1107
+ response = `错误: ${e.message}`;
1108
+ }
1109
+
1110
+ const duration = Date.now() - startTime;
1111
+ const peers = comm?.getConnections().length || 0;
1112
+
1113
+ if (json) {
1114
+ const result: NonInteractiveResult = {
1115
+ success: !response.startsWith('错误:'),
1116
+ response,
1117
+ error: response.startsWith('错误:') ? response : undefined,
1118
+ metadata: { duration, peers }
1119
+ };
1120
+ console.log(JSON.stringify(result, null, 2));
1121
+ } else {
1122
+ console.log(response);
1123
+ }
1124
+ }
1125
+ }
1126
+
1127
+ interface ParsedArgs {
1128
+ prompt?: string;
1129
+ json?: boolean;
1130
+ web?: boolean;
1131
+ help?: boolean;
1132
+ tools?: boolean;
1133
+ read?: boolean;
1134
+ summarize?: boolean;
1135
+ improve?: boolean;
1136
+ peers?: boolean;
1137
+ iroh?: boolean;
1138
+ identity?: boolean;
1139
+ logs?: boolean;
1140
+ broadcast?: boolean;
1141
+ send?: boolean;
1142
+ search?: boolean;
1143
+ model?: string;
1144
+ output?: string;
1145
+ tool?: string;
1146
+ toolArgs: string[];
1147
+ agents?: boolean;
1148
+ registerAgent?: boolean;
1149
+ delegate?: boolean;
1150
+ context?: boolean;
1151
+ globalAgents?: boolean;
1152
+ addAction?: boolean;
1153
+ tui?: boolean;
1154
+ }
1155
+
1156
+ function parseArgs(): ParsedArgs {
1157
+ const args = process.argv.slice(2);
1158
+ const result: ParsedArgs = { toolArgs: [] };
1159
+
1160
+ for (let i = 0; i < args.length; i++) {
1161
+ const arg = args[i];
1162
+
1163
+ switch (arg) {
1164
+ case '--prompt':
1165
+ case '-p':
1166
+ result.prompt = args[++i];
1167
+ result.tool = 'prompt';
1168
+ break;
1169
+ case '--json':
1170
+ case '-j':
1171
+ result.json = true;
1172
+ break;
1173
+ case '--web':
1174
+ result.web = true;
1175
+ break;
1176
+ case '--help':
1177
+ case '-h':
1178
+ result.help = true;
1179
+ break;
1180
+ case '--tools':
1181
+ result.tools = true;
1182
+ result.tool = 'tools';
1183
+ break;
1184
+ case '--read':
1185
+ result.read = true;
1186
+ result.tool = 'read';
1187
+ result.toolArgs = [args[++i]].filter(Boolean);
1188
+ break;
1189
+ case '--summarize':
1190
+ result.summarize = true;
1191
+ result.tool = 'summarize';
1192
+ const summarizeArgs: string[] = [];
1193
+ while (i + 1 < args.length && !args[i + 1].startsWith('-')) {
1194
+ summarizeArgs.push(args[++i]);
1195
+ }
1196
+ result.toolArgs = summarizeArgs;
1197
+ break;
1198
+ case '--improve':
1199
+ result.improve = true;
1200
+ result.tool = 'improve';
1201
+ const improveArgs: string[] = [];
1202
+ while (i + 1 < args.length && !args[i + 1].startsWith('-')) {
1203
+ improveArgs.push(args[++i]);
1204
+ }
1205
+ result.toolArgs = improveArgs;
1206
+ break;
1207
+ case '--peers':
1208
+ result.peers = true;
1209
+ result.tool = 'peers';
1210
+ break;
1211
+ case '--iroh':
1212
+ result.iroh = true;
1213
+ result.tool = 'iroh';
1214
+ break;
1215
+ case '--identity':
1216
+ result.identity = true;
1217
+ result.tool = 'identity';
1218
+ break;
1219
+ case '--logs':
1220
+ result.logs = true;
1221
+ result.tool = 'logs';
1222
+ break;
1223
+ case '--broadcast':
1224
+ result.broadcast = true;
1225
+ result.tool = 'broadcast';
1226
+ result.toolArgs = [args[++i]].filter(Boolean);
1227
+ break;
1228
+ case '--send':
1229
+ result.send = true;
1230
+ result.tool = 'send';
1231
+ const sendArgs: string[] = [];
1232
+ while (i + 1 < args.length && !args[i + 1].startsWith('-')) {
1233
+ sendArgs.push(args[++i]);
1234
+ }
1235
+ result.toolArgs = sendArgs;
1236
+ break;
1237
+ case '--search':
1238
+ result.search = true;
1239
+ result.tool = 'search';
1240
+ result.toolArgs = [args[++i]].filter(Boolean);
1241
+ break;
1242
+ case '--agents':
1243
+ result.agents = true;
1244
+ result.tool = 'agents';
1245
+ break;
1246
+ case '--register-agent':
1247
+ result.registerAgent = true;
1248
+ result.tool = 'register-agent';
1249
+ const regArgs: string[] = [];
1250
+ while (i + 1 < args.length && !args[i + 1].startsWith('-')) {
1251
+ regArgs.push(args[++i]);
1252
+ }
1253
+ result.toolArgs = regArgs;
1254
+ break;
1255
+ case '--delegate':
1256
+ result.delegate = true;
1257
+ result.tool = 'delegate';
1258
+ const delArgs: string[] = [];
1259
+ while (i + 1 < args.length && !args[i + 1].startsWith('-')) {
1260
+ delArgs.push(args[++i]);
1261
+ }
1262
+ result.toolArgs = delArgs;
1263
+ break;
1264
+ case '--context':
1265
+ result.context = true;
1266
+ result.tool = 'context';
1267
+ break;
1268
+ case '--global-agents':
1269
+ result.globalAgents = true;
1270
+ result.tool = 'global-agents';
1271
+ break;
1272
+ case '--add-action':
1273
+ result.addAction = true;
1274
+ result.tool = 'add-action';
1275
+ const actionArgs: string[] = [];
1276
+ while (i + 1 < args.length && !args[i + 1].startsWith('-')) {
1277
+ actionArgs.push(args[++i]);
1278
+ }
1279
+ result.toolArgs = actionArgs;
1280
+ break;
1281
+ case '--harness-init':
1282
+ result.tool = 'harness-init';
1283
+ break;
1284
+ case '--harness-gate':
1285
+ result.tool = 'harness-gate';
1286
+ break;
1287
+ case '--harness-transition':
1288
+ result.tool = 'harness-transition';
1289
+ const transitionArgs: string[] = [];
1290
+ while (i + 1 < args.length && !args[i + 1].startsWith('-')) {
1291
+ transitionArgs.push(args[++i]);
1292
+ }
1293
+ result.toolArgs = transitionArgs;
1294
+ break;
1295
+ case '--harness-skill':
1296
+ result.tool = 'harness-skill';
1297
+ const skillArgs: string[] = [];
1298
+ while (i + 1 < args.length && !args[i + 1].startsWith('-')) {
1299
+ skillArgs.push(args[++i]);
1300
+ }
1301
+ result.toolArgs = skillArgs;
1302
+ break;
1303
+ case '--harness-classify':
1304
+ result.tool = 'harness-classify';
1305
+ const classifyArgs: string[] = [];
1306
+ while (i + 1 < args.length && !args[i + 1].startsWith('-')) {
1307
+ classifyArgs.push(args[++i]);
1308
+ }
1309
+ result.toolArgs = classifyArgs;
1310
+ break;
1311
+ case '--harness-context':
1312
+ result.tool = 'harness-context';
1313
+ const contextArgs: string[] = [];
1314
+ while (i + 1 < args.length && !args[i + 1].startsWith('-')) {
1315
+ contextArgs.push(args[++i]);
1316
+ }
1317
+ result.toolArgs = contextArgs;
1318
+ break;
1319
+ case '--harness-check':
1320
+ result.tool = 'harness-check';
1321
+ const checkArgs: string[] = [];
1322
+ while (i + 1 < args.length && !args[i + 1].startsWith('-')) {
1323
+ checkArgs.push(args[++i]);
1324
+ }
1325
+ result.toolArgs = checkArgs;
1326
+ break;
1327
+ case '--harness-archive':
1328
+ result.tool = 'harness-archive';
1329
+ break;
1330
+ case '--harness-sessions':
1331
+ result.tool = 'harness-sessions';
1332
+ break;
1333
+ case '--harness-session-context':
1334
+ result.tool = 'harness-session-context';
1335
+ const sessionArgs: string[] = [];
1336
+ while (i + 1 < args.length && !args[i + 1].startsWith('-')) {
1337
+ sessionArgs.push(args[++i]);
1338
+ }
1339
+ result.toolArgs = sessionArgs;
1340
+ break;
1341
+ case '--tui':
1342
+ result.tui = true;
1343
+ break;
1344
+ case '--model':
1345
+ result.model = args[++i];
1346
+ break;
1347
+ case '--output':
1348
+ case '-o':
1349
+ result.output = args[++i];
1350
+ break;
1351
+ case '--':
1352
+ result.toolArgs = args.slice(i + 1);
1353
+ i = args.length;
1354
+ break;
1355
+ default:
1356
+ if (!arg.startsWith('-') && !result.prompt && !result.tool) {
1357
+ result.prompt = arg;
1358
+ result.tool = 'prompt';
1359
+ }
1360
+ }
1361
+ }
1362
+
1363
+ return result;
1364
+ }
1365
+
1366
+ function printHelp(): void {
1367
+ console.log(`
1368
+ 🤖 Bolloon Agent - AI 可调用文档处理智能体
1369
+
1370
+ 用法:
1371
+ npx tsx src/index.ts [选项] [参数]
1372
+
1373
+ 选项:
1374
+ # 文档处理
1375
+ --read <file> 读取文档 (txt, md, pdf, docx)
1376
+ --summarize <file> [ctx] 总结文档,可选上下文
1377
+ --improve <file> <req> 改进文档,req 为改进要求
1378
+
1379
+ # P2P 网络
1380
+ --peers 列出已连接的对等节点
1381
+ --broadcast <msg> 广播消息到所有节点
1382
+ --send <peerId> <msg> 向指定节点发送消息
1383
+
1384
+ # 智能体
1385
+ --identity 显示当前智能体身份
1386
+ --logs 显示操作日志
1387
+ --search <keyword> 搜索文件
1388
+ --tools 显示所有可用工具
1389
+
1390
+ # SubAgent 管理
1391
+ --agents 列出所有 SubAgent
1392
+ --register-agent <name> [cap1] [cap2]... 注册新 SubAgent
1393
+ --delegate <任务描述> [能力要求...] 委派任务给最佳 Agent
1394
+
1395
+ # 全局共享上下文
1396
+ --context 显示全局共享上下文摘要
1397
+ --global-agents 显示全局 Agent 注册表
1398
+ --add-action <内容> [重要性] 添加用户行动到共享上下文
1399
+
1400
+ # Bollharness 治理框架
1401
+ --harness-init 初始化 Bollharness 治理框架
1402
+ --harness-gate 显示当前 Gate 状态
1403
+ --harness-transition [PASS|BLOCK] 执行 Gate 转移
1404
+ --harness-skill <name> [action] 执行 Harness Skill
1405
+ --harness-classify <描述> 分类变更类型
1406
+ --harness-context <file> 获取文件上下文
1407
+ --harness-check <file> 执行 Guard 检查
1408
+ --harness-archive 归档当前 Session 到 Harness
1409
+ --harness-sessions 列出 Session 归档记录
1410
+ --harness-session-context [id] 获取 Session 上下文
1411
+
1412
+ # AI 对话
1413
+ --prompt, -p <text> 通用 AI 对话(默认)
1414
+ --model <name> 指定使用的模型
1415
+
1416
+ # 输出控制
1417
+ --json, -j 输出 JSON 格式
1418
+ --output, -o <file> 结果保存到文件
1419
+ --web 启动 Web UI 模式
1420
+ --help, -h 显示帮助信息
1421
+
1422
+ 示例:
1423
+ # 文档处理
1424
+ npx tsx src/index.ts --read 想法.md
1425
+ npx tsx src/index.ts --summarize docs/想法.md
1426
+ npx tsx src/index.ts --improve docs/README.md "让内容更简洁"
1427
+ npx tsx src/index.ts --read 想法.md -o summary.txt
1428
+
1429
+ # P2P 网络
1430
+ npx tsx src/index.ts --peers
1431
+ npx tsx src/index.ts --broadcast "Hello everyone"
1432
+ npx tsx src/index.ts --send QmABC... "私信内容"
1433
+
1434
+ # AI 对话
1435
+ npx tsx src/index.ts --prompt "总结 README.md"
1436
+ npx tsx src/index.ts -p "分析这个项目" -j
1437
+
1438
+ # 交互模式
1439
+ npx tsx src/index.ts
1440
+
1441
+ # Web 模式
1442
+ npx tsx src/index.ts --web
1443
+
1444
+ 环境变量:
1445
+ MINIMAX_API_KEY MiniMax API 密钥
1446
+ OPENAI_API_KEY OpenAI API 密钥(Pi SDK)
1447
+ ANTHROPIC_API_KEY Anthropic API 密钥(Pi SDK)
1448
+ PORT Web 服务端口(默认 54188)
1449
+ `);
1450
+ }
1451
+
1452
+ // ---------------------------------------------------------------------------
1453
+ // Entry point
1454
+ // ---------------------------------------------------------------------------
1455
+
1456
+ async function main() {
1457
+ const args = parseArgs();
1458
+
1459
+ if (args.help) {
1460
+ printHelp();
1461
+ process.exit(0);
1462
+ }
1463
+
1464
+ const mode = args.web ? 'web' : 'cli';
1465
+ const isNonInteractive = !!(args.tool || args.prompt);
1466
+ const isTuiMode = mode === 'cli' && !isNonInteractive && args.tui;
1467
+
1468
+ const originalLog = console.log;
1469
+ const originalInfo = console.info;
1470
+ const originalStdoutWrite = process.stdout.write.bind(process.stdout);
1471
+
1472
+ const isSdkLog = (msg: string): boolean => {
1473
+ return /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(msg);
1474
+ };
1475
+
1476
+ if (isTuiMode) {
1477
+ console.log = (...args: any[]) => {
1478
+ const msg = args.join(' ');
1479
+ if (isSdkLog(msg)) return;
1480
+ originalLog.apply(console, args);
1481
+ };
1482
+ console.info = (...args: any[]) => {
1483
+ const msg = args.join(' ');
1484
+ if (isSdkLog(msg)) return;
1485
+ originalInfo.apply(console, args);
1486
+ };
1487
+ process.stdout.write = (chunk: any, ...args: any[]) => {
1488
+ const msg = String(chunk);
1489
+ if (isSdkLog(msg)) return true;
1490
+ return originalStdoutWrite(chunk, ...args);
1491
+ };
1492
+ }
1493
+
1494
+ if (isNonInteractive) {
1495
+ console.error = () => {};
1496
+ }
1497
+
1498
+ s.banner();
1499
+
1500
+ s.section('系统初始化');
1501
+
1502
+ const hasOpenAI = !!process.env.OPENAI_API_KEY;
1503
+ const hasAnthropic = !!process.env.ANTHROPIC_API_KEY;
1504
+ const hasMinimax = !!process.env.MINIMAX_API_KEY;
1505
+ const hasOpenRouter = !!process.env.OPENROUTER_API_KEY;
1506
+ const hasGemini = !!process.env.GEMINI_API_KEY;
1507
+ const hasOllama = !!process.env.OLLAMA_BASE_URL;
1508
+
1509
+ const llmProvider = hasOpenAI ? 'OpenAI' :
1510
+ hasAnthropic ? 'Anthropic' :
1511
+ hasOpenRouter ? 'OpenRouter' :
1512
+ hasGemini ? 'Gemini' :
1513
+ hasOllama ? 'Ollama' :
1514
+ hasMinimax ? 'MiniMax' : null;
1515
+
1516
+ if (llmProvider) {
1517
+ s.step(0, 4, `LLM: ${llmProvider}`, 'ok');
1518
+ initMinimax({ provider: llmProvider.toLowerCase() as any });
1519
+ } else {
1520
+ s.step(0, 4, 'LLM: 未配置', 'warn');
1521
+ if (isNonInteractive) {
1522
+ s.warn('未设置任何 LLM API Key,功能受限');
1523
+ }
1524
+ }
1525
+
1526
+ const { keypair, did, name } = await bootstrapIdentity();
1527
+ agentIdentity = { did, name, publicKey: Buffer.from(keypair.publicKey).toString('hex') };
1528
+
1529
+ publishDID(name, keypair).then(({ cid, ipnsName }) => {
1530
+ if (cid) agentIdentity!.cid = cid;
1531
+ if (ipnsName) agentIdentity!.ipnsName = ipnsName;
1532
+ }).catch(() => {});
1533
+
1534
+ const verifier = createVerificationManager();
1535
+ let comm: HyperswarmCommunicator | null = null;
1536
+
1537
+ try {
1538
+ if (mode === 'web') {
1539
+ bootstrapP2P(verifier).then(c => {
1540
+ comm = c;
1541
+ const connections = c.getConnections();
1542
+ if (connections.length > 0) {
1543
+ agentIdentity!.peerId = connections[0].publicKey;
1544
+ agentIdentity!.p2pChannel = 'bolloon-agent-harness';
1545
+ }
1546
+ }).catch(err => {
1547
+ s.warn(`P2P Web 模式启动失败: ${err.message}`);
1548
+ });
1549
+ } else {
1550
+ comm = await bootstrapP2P(verifier);
1551
+ const connections = comm.getConnections();
1552
+ if (connections.length > 0) {
1553
+ agentIdentity.peerId = connections[0].publicKey;
1554
+ agentIdentity.p2pChannel = 'bolloon-agent-harness';
1555
+ }
1556
+ }
1557
+ } catch (err: any) {
1558
+ s.warn(`P2P 初始化失败: ${err.message}`);
1559
+ s.warn('将使用无 P2P 模式运行');
1560
+ }
1561
+
1562
+ await bootstrapIroh(keypair, name);
1563
+
1564
+ s.divider();
1565
+
1566
+ if (mode === 'web') {
1567
+ const port = parseInt(process.env.PORT || '54188');
1568
+ const { createWebServer, openBrowser } = await import('./web/server.js');
1569
+
1570
+ s.info(`启动 Web 服务端口 ${port}...`);
1571
+ await createWebServer(port);
1572
+
1573
+ s.success(`浏览器已打开 → http://localhost:${port}`);
1574
+ openBrowser(`http://localhost:${port}`);
1575
+ } else if (isNonInteractive) {
1576
+ console.log = originalLog;
1577
+ console.info = originalInfo;
1578
+ process.stdout.write = originalStdoutWrite;
1579
+ s.info('执行命令...');
1580
+ console.log();
1581
+ await runNonInteractive(args, comm!);
1582
+ comm?.stop();
1583
+ process.exit(0);
1584
+ } else {
1585
+ s.section('对话模式');
1586
+ console.log(`${GRAY}输入命令即可开始对话,示例:${RESET}\n`);
1587
+ console.log(` ${CYAN}读取 想法.md${RESET} ${GRAY}- 读取文档${RESET}`);
1588
+ console.log(` ${CYAN}总结 文档.md${RESET} ${GRAY}- 总结文档${RESET}`);
1589
+ console.log(` ${CYAN}--agents${RESET} ${GRAY}- 查看 SubAgent${RESET}`);
1590
+ console.log(` ${CYAN}--context${RESET} ${GRAY}- 查看全局上下文${RESET}`);
1591
+ console.log(` ${CYAN}--delegate 任务 coding${RESET} ${GRAY}- 委派任务${RESET}`);
1592
+ console.log(` ${CYAN}peers${RESET} ${GRAY}- 查看 P2P 节点${RESET}`);
1593
+ console.log(` ${CYAN}iroh${RESET} ${GRAY}- 查看 iroh 状态${RESET}`);
1594
+ console.log(` ${CYAN}退出${RESET} ${GRAY}- 结束对话${RESET}\n`);
1595
+
1596
+ if (!isTuiMode) {
1597
+ console.log = originalLog;
1598
+ console.info = originalInfo;
1599
+ process.stdout.write = originalStdoutWrite;
1600
+ }
1601
+
1602
+ startCLI(comm!);
1603
+ }
1604
+ }
1605
+
1606
+ main().catch(e => { console.error('Fatal:', e); process.exit(1); });