@bolloon/bolloon-agent 0.2.9 → 0.2.11

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 (268) hide show
  1. package/README.md +467 -467
  2. package/bin/bolloon-cli.cjs +183 -183
  3. package/bin/bolloon.cjs +0 -0
  4. package/bin/bolloon.js +157 -0
  5. package/dist/agents/agent-manifest-protocol.js +0 -52
  6. package/dist/agents/constraint-layer.js +19 -19
  7. package/dist/agents/pi-sdk.js +287 -1213
  8. package/dist/agents/shell-guard.js +2 -2
  9. package/dist/agents/workflow-pivot-loop.js +2 -81
  10. package/dist/bollharness/src/scripts/deploy-guard.js +8 -8
  11. package/dist/bollharness-integration/context-router-judgment.js +4 -4
  12. package/dist/bollharness-integration/context-router.js +292 -292
  13. package/dist/bollharness-integration/gate-state-machine.js +13 -26
  14. package/dist/bollharness-integration/integration.js +0 -71
  15. package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
  16. package/dist/bollharness-integration/skill-adapter.js +127 -52
  17. package/dist/bootstrap/context-collector.js +3 -6
  18. package/dist/bootstrap/lifecycle-hooks.js +1 -15
  19. package/dist/cli-entry.js +35 -39
  20. package/dist/constraint-runtime/src/_archive_helper.js +9 -0
  21. package/dist/constraint-runtime/src/agent/coordinator.js +48 -0
  22. package/dist/constraint-runtime/src/agent/index.js +1 -0
  23. package/dist/constraint-runtime/src/assistant/index.js +12 -0
  24. package/dist/constraint-runtime/src/bootstrap/index.js +12 -0
  25. package/dist/constraint-runtime/src/bootstrap_graph.js +13 -0
  26. package/dist/constraint-runtime/src/bridge/index.js +12 -0
  27. package/dist/constraint-runtime/src/buddy/index.js +12 -0
  28. package/dist/constraint-runtime/src/cli/index.js +12 -0
  29. package/dist/constraint-runtime/src/command_graph.js +10 -0
  30. package/dist/constraint-runtime/src/commands.js +60 -0
  31. package/dist/constraint-runtime/src/components/index.js +12 -0
  32. package/dist/constraint-runtime/src/constants/index.js +12 -0
  33. package/dist/constraint-runtime/src/constraint/budget.js +22 -0
  34. package/dist/constraint-runtime/src/constraint/index.js +2 -0
  35. package/dist/constraint-runtime/src/constraint/permission.js +20 -0
  36. package/dist/constraint-runtime/src/context.js +30 -0
  37. package/dist/constraint-runtime/src/coordinator/index.js +12 -0
  38. package/dist/constraint-runtime/src/cost_hook.js +4 -0
  39. package/dist/constraint-runtime/src/cost_tracker.js +8 -0
  40. package/dist/constraint-runtime/src/deferred_init.js +10 -0
  41. package/dist/constraint-runtime/src/direct_modes.js +6 -0
  42. package/dist/constraint-runtime/src/dynamic-tool-loader.js +85 -0
  43. package/dist/constraint-runtime/src/entrypoints/index.js +12 -0
  44. package/dist/constraint-runtime/src/execution_registry.js +44 -0
  45. package/dist/constraint-runtime/src/history.js +9 -0
  46. package/dist/constraint-runtime/src/hooks/index.js +12 -0
  47. package/dist/constraint-runtime/src/index.js +26 -0
  48. package/dist/constraint-runtime/src/ink.js +4 -0
  49. package/dist/constraint-runtime/src/keybindings/index.js +12 -0
  50. package/dist/constraint-runtime/src/memdir/index.js +12 -0
  51. package/dist/constraint-runtime/src/migrations/index.js +12 -0
  52. package/dist/constraint-runtime/src/models.js +1 -0
  53. package/dist/constraint-runtime/src/moreright/index.js +12 -0
  54. package/dist/constraint-runtime/src/native_ts/index.js +12 -0
  55. package/dist/constraint-runtime/src/output_styles/index.js +12 -0
  56. package/dist/constraint-runtime/src/parity_audit.js +12 -0
  57. package/dist/constraint-runtime/src/plugins/index.js +12 -0
  58. package/dist/constraint-runtime/src/port_manifest.js +11 -0
  59. package/dist/constraint-runtime/src/prefetch.js +9 -0
  60. package/dist/constraint-runtime/src/query.js +1 -0
  61. package/dist/constraint-runtime/src/remote/index.js +12 -0
  62. package/dist/constraint-runtime/src/remote_runtime.js +9 -0
  63. package/dist/constraint-runtime/src/runtime/index.js +1 -0
  64. package/dist/constraint-runtime/src/runtime/session.js +35 -0
  65. package/dist/constraint-runtime/src/schemas/index.js +12 -0
  66. package/dist/constraint-runtime/src/screens/index.js +12 -0
  67. package/dist/constraint-runtime/src/server/index.js +12 -0
  68. package/dist/constraint-runtime/src/services/index.js +12 -0
  69. package/dist/constraint-runtime/src/session_store.js +22 -0
  70. package/dist/constraint-runtime/src/setup.js +30 -0
  71. package/dist/constraint-runtime/src/skills/index.js +1 -0
  72. package/dist/constraint-runtime/src/skills/skill-registry.js +28 -0
  73. package/dist/constraint-runtime/src/state/index.js +12 -0
  74. package/dist/constraint-runtime/src/system_init.js +20 -0
  75. package/dist/constraint-runtime/src/thinking/engine.js +42 -0
  76. package/dist/constraint-runtime/src/thinking/index.js +1 -0
  77. package/dist/constraint-runtime/src/tool_pool.js +8 -0
  78. package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +7 -0
  79. package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +7 -0
  80. package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +7 -0
  81. package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +6 -0
  82. package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +8 -0
  83. package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +6 -0
  84. package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +6 -0
  85. package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +6 -0
  86. package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +6 -0
  87. package/dist/constraint-runtime/src/tools.js +80 -0
  88. package/dist/constraint-runtime/src/transcript.js +19 -0
  89. package/dist/constraint-runtime/src/types/index.js +12 -0
  90. package/dist/constraint-runtime/src/upstream_proxy/index.js +12 -0
  91. package/dist/constraint-runtime/src/utils/index.js +12 -0
  92. package/dist/constraint-runtime/src/vim/index.js +12 -0
  93. package/dist/constraint-runtime/src/voice/index.js +12 -0
  94. package/dist/constraint-runtime/tests/agent.test.js +16 -0
  95. package/dist/constraint-runtime/tests/constraint.test.js +41 -0
  96. package/dist/constraint-runtime/tests/skill.test.js +19 -0
  97. package/dist/constraint-runtime/tests/thinking.test.js +22 -0
  98. package/dist/context-compaction/auto-compact.js +7 -7
  99. package/dist/electron-preload.js +1 -18
  100. package/dist/electron-preload.js.map +1 -1
  101. package/dist/electron.js +168 -3
  102. package/dist/electron.js.map +1 -1
  103. package/dist/index.js +116 -136
  104. package/dist/llm/config-store.js +8 -24
  105. package/dist/llm/llm-judgment-client.js +102 -102
  106. package/dist/llm/pi-ai.js +85 -126
  107. package/dist/llm/system-prompt/layers/channel/local.md +14 -14
  108. package/dist/llm/system-prompt/layers/channel/p2p-agent.md +18 -18
  109. package/dist/llm/system-prompt/layers/channel/p2p-visitor.md +19 -19
  110. package/dist/llm/system-prompt/layers/core/artifacts_storage.md +89 -89
  111. package/dist/llm/system-prompt/layers/core/evenhandedness.md +21 -21
  112. package/dist/llm/system-prompt/layers/core/hibs_reminders.md +15 -15
  113. package/dist/llm/system-prompt/layers/core/identity.md +37 -37
  114. package/dist/llm/system-prompt/layers/core/knowledge.md +17 -17
  115. package/dist/llm/system-prompt/layers/core/memory_system.md +12 -12
  116. package/dist/llm/system-prompt/layers/core/network_filesystem.md +28 -28
  117. package/dist/llm/system-prompt/layers/core/refusal.md +37 -37
  118. package/dist/llm/system-prompt/layers/core/tone.md +31 -31
  119. package/dist/llm/system-prompt/layers/core/tools.thin.md +13 -13
  120. package/dist/llm/system-prompt/layers/core/wellbeing.md +41 -41
  121. package/dist/llm/system-prompt/layers/role/architect.md +20 -20
  122. package/dist/llm/system-prompt/layers/role/expert.md +19 -19
  123. package/dist/llm/system-prompt/layers/role/implementer.md +15 -15
  124. package/dist/llm/system-prompt/layers/role/security.md +15 -15
  125. package/dist/llm/system-prompt/layers/tool/artifacts.md +72 -72
  126. package/dist/llm/system-prompt/layers/tool/bash.md +25 -25
  127. package/dist/llm/system-prompt/layers/tool/hibs_api.md +171 -171
  128. package/dist/llm/system-prompt/layers/tool/image_search.md +70 -70
  129. package/dist/llm/system-prompt/layers/tool/manifest.md +89 -89
  130. package/dist/llm/system-prompt/layers/tool/mcp_apps.md +53 -53
  131. package/dist/llm/system-prompt/layers/tool/web_search.md +83 -83
  132. package/dist/llm/tool-manifest/ask_user_input.js +1 -1
  133. package/dist/llm/tool-manifest/bash.js +3 -3
  134. package/dist/llm/tool-manifest/create_file.js +4 -4
  135. package/dist/llm/tool-manifest/fetch_sports_data.js +3 -3
  136. package/dist/llm/tool-manifest/image_search.js +2 -2
  137. package/dist/llm/tool-manifest/mcp.js +2 -2
  138. package/dist/llm/tool-manifest/message_compose.js +3 -3
  139. package/dist/llm/tool-manifest/places.js +2 -2
  140. package/dist/llm/tool-manifest/present_files.js +1 -1
  141. package/dist/llm/tool-manifest/recipe.js +2 -2
  142. package/dist/llm/tool-manifest/str_replace.js +5 -5
  143. package/dist/llm/tool-manifest/view.js +3 -3
  144. package/dist/llm/tool-manifest/weather.js +4 -4
  145. package/dist/llm/tool-manifest/web.js +4 -4
  146. package/dist/pi-ecosystem-colony/index.js +365 -0
  147. package/dist/pi-ecosystem-judgment/causal-judge.js +51 -51
  148. package/dist/pi-ecosystem-judgment/distill-prompt.js +42 -42
  149. package/dist/pi-ecosystem-judgment/distillation.js +14 -14
  150. package/dist/pi-ecosystem-judgment/monitor-gate.js +28 -28
  151. package/dist/pi-ecosystem-judgment/value-injection.js +102 -102
  152. package/dist/security/context-router-tool.js +15 -15
  153. package/dist/security/tool-gate.js +0 -11
  154. package/dist/social/ant-colony/AdaptiveHeartbeat.js +101 -0
  155. package/dist/social/ant-colony/PheromoneEngine.js +227 -0
  156. package/dist/social/ant-colony/index.js +6 -0
  157. package/dist/social/ant-colony/types.js +24 -0
  158. package/dist/test/ai-judgment-test.js +80 -0
  159. package/dist/test/bollharness-integration.test.js +318 -0
  160. package/dist/test/channel-agent-multi-dialogue.js +205 -0
  161. package/dist/test/channel-heartbeat-agent-test.js +201 -0
  162. package/dist/test/constraint-layer.test.js +164 -0
  163. package/dist/test/diap-identity-test.js +172 -0
  164. package/dist/test/diap-quick-test.js +62 -0
  165. package/dist/test/global-shared-context.test.js +315 -0
  166. package/dist/test/harness-judgment-injection.test.js +246 -0
  167. package/dist/test/harness-workflow-integrator-test.js +228 -0
  168. package/dist/test/human-value-store.test.js +243 -0
  169. package/dist/test/hybrid-integration-test.js +118 -0
  170. package/dist/test/hybrid-messenger-verify.js +55 -0
  171. package/dist/test/iroh-bistream-debug.js +38 -0
  172. package/dist/test/iroh-communication.test.js +66 -0
  173. package/dist/test/iroh-debug-test.js +57 -0
  174. package/dist/test/iroh-diap-test.js +71 -0
  175. package/dist/test/iroh-direct-connect.js +55 -0
  176. package/dist/test/iroh-e2e-fixed.js +89 -0
  177. package/dist/test/iroh-e2e-same-process.js +63 -0
  178. package/dist/test/iroh-e2e.js +66 -0
  179. package/dist/test/iroh-final-e2e.js +72 -0
  180. package/dist/test/iroh-relay-test.js +37 -0
  181. package/dist/test/iroh-simple-test.js +41 -0
  182. package/dist/test/iroh-transport-verify.js +54 -0
  183. package/dist/test/iroh-transport.test.js +37 -0
  184. package/dist/test/iroh-two-nodes.js +70 -0
  185. package/dist/test/iroh-verify.js +44 -0
  186. package/dist/test/judgment-decision.test.js +219 -0
  187. package/dist/test/llm-judgment-integration.test.js +220 -0
  188. package/dist/test/p2p-agent-complex-dialogue.js +385 -0
  189. package/dist/test/p2p-agent-dialogue.js +341 -0
  190. package/dist/test/p2p-agent-full-bidirectional.js +510 -0
  191. package/dist/test/p2p-agent-harness-flow.js +437 -0
  192. package/dist/test/p2p-agent-harness-single.js +143 -0
  193. package/dist/test/p2p-ai-dialogue-test.js +318 -0
  194. package/dist/test/p2p-cid-connect-test.js +195 -0
  195. package/dist/test/p2p-connect-receiver.js +69 -0
  196. package/dist/test/p2p-doc-transfer.js +110 -0
  197. package/dist/test/p2p-identity-page-test.js +77 -0
  198. package/dist/test/p2p-iroh-test.js +171 -0
  199. package/dist/test/p2p-minimal-test.js +241 -0
  200. package/dist/test/p2p-node-1.js +148 -0
  201. package/dist/test/p2p-node-2.js +148 -0
  202. package/dist/test/p2p-server.js +281 -0
  203. package/dist/test/p2p-two-nodes-test.js +438 -0
  204. package/dist/test/pi-sdk.test.js +44 -0
  205. package/dist/test/set-persona.js +40 -0
  206. package/dist/test/simple.test.js +9 -0
  207. package/dist/test/storage-integration.test.js +150 -0
  208. package/dist/test/subagent-manager.test.js +276 -0
  209. package/dist/test/test-gate-flow.test.js +81 -0
  210. package/dist/test/workflow-engine.test.js +87 -0
  211. package/dist/test/workflow-pivot-loop.test.js +246 -0
  212. package/dist/web/api-config.html +520 -520
  213. package/dist/web/client.js +2917 -3791
  214. package/dist/web/components/p2p/index.js +234 -276
  215. package/dist/web/components/wallet-viem.mjs +118 -118
  216. package/dist/web/index.html +374 -373
  217. package/dist/web/manifest.json +20 -20
  218. package/dist/web/server.js +23 -775
  219. package/dist/web/style.css +4737 -4737
  220. package/dist/web/ui/message-renderer.js +373 -451
  221. package/dist/web/ui/step-timeline.js +255 -351
  222. package/package.json +160 -160
  223. package/scripts/build-cli.js +215 -215
  224. package/scripts/build-web.ts +125 -125
  225. package/scripts/postinstall.js +152 -152
  226. package/bin/bolloon-daemon.sh +0 -207
  227. package/bin/ipfs +0 -0
  228. package/dist/agents/chat-segmenter.js +0 -298
  229. package/dist/agents/judgment-protocol.js +0 -479
  230. package/dist/agents/parse-tool-call.js +0 -304
  231. package/dist/agents/peer-manifest-loader.js +0 -210
  232. package/dist/agents/react-loop.js +0 -120
  233. package/dist/agents/session-store.js +0 -171
  234. package/dist/agents/tool-registry.js +0 -136
  235. package/dist/bootstrap/chat-archiver.js +0 -276
  236. package/dist/bootstrap/memory-compressor.js +0 -170
  237. package/dist/bootstrap/persona-loader.js +0 -94
  238. package/dist/electron/config.js +0 -16
  239. package/dist/electron/config.js.map +0 -1
  240. package/dist/electron/dialogs.js +0 -71
  241. package/dist/electron/dialogs.js.map +0 -1
  242. package/dist/electron/first-run.js +0 -129
  243. package/dist/electron/first-run.js.map +0 -1
  244. package/dist/electron/ipc.js +0 -16
  245. package/dist/electron/ipc.js.map +0 -1
  246. package/dist/electron/logger.js +0 -77
  247. package/dist/electron/logger.js.map +0 -1
  248. package/dist/electron/main.js +0 -60
  249. package/dist/electron/main.js.map +0 -1
  250. package/dist/electron/menu.js +0 -140
  251. package/dist/electron/menu.js.map +0 -1
  252. package/dist/electron/paths.js +0 -33
  253. package/dist/electron/paths.js.map +0 -1
  254. package/dist/electron/server.js +0 -74
  255. package/dist/electron/server.js.map +0 -1
  256. package/dist/electron/tray.js +0 -73
  257. package/dist/electron/tray.js.map +0 -1
  258. package/dist/electron/window.js +0 -69
  259. package/dist/electron/window.js.map +0 -1
  260. package/dist/network/local-inbox-bus.js +0 -73
  261. package/dist/network/p2p-outbox.js +0 -161
  262. package/dist/network/peer-fs.js +0 -420
  263. package/dist/network/peer-resource-bridge.js +0 -216
  264. package/dist/web/components/p2p/P2PModal.js +0 -188
  265. package/dist/web/components/p2p/p2p-modal.js +0 -664
  266. package/dist/web/components/p2p/p2p-tools.js +0 -248
  267. package/dist/web/input-validator.js +0 -103
  268. package/dist/web/util/safe-name.js +0 -32
@@ -0,0 +1,341 @@
1
+ /**
2
+ * P2P Agent Multi-Turn Dialogue (单向发送模式)
3
+ * 模拟真实场景:Alice 发送消息,Bob 处理并回复
4
+ *
5
+ * 运行: npx tsx src/test/p2p-agent-dialogue.ts
6
+ */
7
+ import { config } from 'dotenv';
8
+ import express from 'express';
9
+ import { createServer } from 'http';
10
+ import crypto from 'crypto';
11
+ config();
12
+ const PORT_ALICE = 7001;
13
+ const PORT_BOB = 7002;
14
+ class JudgmentEngine {
15
+ context = [];
16
+ gateHistory = [];
17
+ decide(message) {
18
+ this.context.push(message);
19
+ // 根据消息内容和历史上下文判断
20
+ const history = this.context.join(' ').toLowerCase();
21
+ const current = message.toLowerCase();
22
+ // 上下文敏感的判断
23
+ if (current.includes('架构') || current.includes('设计') || current.includes('方案')) {
24
+ this.gateHistory.push(1);
25
+ return {
26
+ called: true,
27
+ gate: 1,
28
+ skills: ['arch', 'lead'],
29
+ result: '[Gate 1 - 架构设计] 建议采用三层架构:表现层、业务层、数据层分离'
30
+ };
31
+ }
32
+ if (current.includes('review') || current.includes('检查') || current.includes('审核')) {
33
+ this.gateHistory.push(2);
34
+ return {
35
+ called: true,
36
+ gate: 2,
37
+ skills: ['arch', 'guardian-fixer'],
38
+ result: '[Gate 2 - 代码审查] 建议添加输入验证和错误处理'
39
+ };
40
+ }
41
+ if (current.includes('安全') || current.includes('权限') || current.includes('认证')) {
42
+ this.gateHistory.push(4);
43
+ return {
44
+ called: true,
45
+ gate: 4,
46
+ skills: ['arch', 'guardian-fixer'],
47
+ result: '[Gate 4 - 安全检查] 建议实现 JWT token 过期和刷新机制'
48
+ };
49
+ }
50
+ if (current.includes('任务') || current.includes('分解') || current.includes('计划')) {
51
+ this.gateHistory.push(5);
52
+ return {
53
+ called: true,
54
+ gate: 5,
55
+ skills: ['task-arch', 'crystal-learn'],
56
+ result: '[Gate 5 - 任务分解] 已分解为 4 个子任务:1)登录 2)注册 3)权限 4)测试'
57
+ };
58
+ }
59
+ if (current.includes('实现') || current.includes('写代码') || current.includes('优化')) {
60
+ this.gateHistory.push(7);
61
+ return {
62
+ called: true,
63
+ gate: 7,
64
+ skills: ['harness-eng', 'crystal-learn'],
65
+ result: '[Gate 7 - 代码实现] 建议使用策略模式重构业务逻辑'
66
+ };
67
+ }
68
+ if (current.includes('测试') || current.includes('验证')) {
69
+ this.gateHistory.push(8);
70
+ return {
71
+ called: true,
72
+ gate: 8,
73
+ skills: ['harness-eng', 'harness-eng-test'],
74
+ result: '[Gate 8 - 测试验证] 测试覆盖率目标 80%,优先测试核心业务'
75
+ };
76
+ }
77
+ return { called: false, gate: 0, skills: [], result: '' };
78
+ }
79
+ getLastGate() {
80
+ return this.gateHistory.length > 0 ? this.gateHistory[this.gateHistory.length - 1] : 0;
81
+ }
82
+ clear() {
83
+ this.context = [];
84
+ this.gateHistory = [];
85
+ }
86
+ }
87
+ class Agent {
88
+ id = crypto.randomUUID();
89
+ name;
90
+ port;
91
+ judgment = new JudgmentEngine();
92
+ history = [];
93
+ constructor(name, port) {
94
+ this.name = name;
95
+ this.port = port;
96
+ }
97
+ async start() {
98
+ const app = express();
99
+ app.use(express.json());
100
+ app.get('/health', (req, res) => {
101
+ res.json({ id: this.id, name: this.name, port: this.port, historyCount: this.history.length });
102
+ });
103
+ app.get('/discovery', (req, res) => {
104
+ res.json({ id: this.id, name: this.name, port: this.port });
105
+ });
106
+ app.get('/history', (req, res) => {
107
+ res.json(this.history);
108
+ });
109
+ // 接收消息并生成回复
110
+ app.post('/receive', async (req, res) => {
111
+ const { fromName, content } = req.body;
112
+ console.log(`\n📨 [${this.name}] 收到 [${fromName}]: "${content.substring(0, 50)}..."`);
113
+ // 判断是否需要 Harness
114
+ const decision = this.judgment.decide(content);
115
+ let response;
116
+ if (decision.called) {
117
+ console.log(`🧠 [${this.name}] 调用 Harness: Gate ${decision.gate}`);
118
+ console.log(` Skills: ${decision.skills.join(', ')}`);
119
+ console.log(` ${decision.result}`);
120
+ // 根据 Gate 生成回复
121
+ response = this.generateResponse(decision, fromName);
122
+ }
123
+ else {
124
+ console.log(`🧠 [${this.name}] 普通回复 (无需 Harness)`);
125
+ response = this.generateNaturalResponse(content, fromName);
126
+ }
127
+ // 记录对话
128
+ this.history.push({
129
+ id: crypto.randomUUID(),
130
+ speaker: fromName,
131
+ message: content,
132
+ timestamp: Date.now(),
133
+ harnessCalled: decision.called,
134
+ gate: decision.gate || undefined
135
+ });
136
+ this.history.push({
137
+ id: crypto.randomUUID(),
138
+ speaker: this.name,
139
+ message: response,
140
+ timestamp: Date.now(),
141
+ harnessCalled: decision.called,
142
+ gate: decision.gate || undefined
143
+ });
144
+ console.log(`📤 [${this.name}] 回复: "${response.substring(0, 50)}..."`);
145
+ res.json({
146
+ ok: true,
147
+ response,
148
+ harnessCalled: decision.called,
149
+ gate: decision.gate
150
+ });
151
+ });
152
+ const server = createServer(app);
153
+ return new Promise(resolve => {
154
+ server.listen(this.port, () => {
155
+ console.log(`✓ [${this.name}] 监听 port ${this.port}`);
156
+ resolve();
157
+ });
158
+ });
159
+ }
160
+ }
161
+ // ============================================================================
162
+ // 响应生成
163
+ // ============================================================================
164
+ const responses = {
165
+ 1: [
166
+ '关于架构设计,Harness 分析建议采用分层架构,将表现层、业务逻辑和数据访问层分离。这样可以提高代码的可维护性和可测试性。',
167
+ 'Harness Gate 1 分析完成。建议使用依赖注入来降低模块间的耦合,这样更利于单元测试。',
168
+ ],
169
+ 2: [
170
+ '代码审查完成,Harness 建议添加输入验证和错误边界处理。特别是 API 接口,需要统一错误响应格式。',
171
+ 'Gate 2 审查结果:建议为每个函数添加 JSDoc 注释,并使用 ESLint 统一代码风格。',
172
+ ],
173
+ 4: [
174
+ '安全检查完成。建议实现 JWT token 的过期机制和刷新策略,同时添加 IP 白名单功能。',
175
+ 'Harness Gate 4 建议:使用 HTTPS 加密传输,对敏感操作添加二次验证。',
176
+ ],
177
+ 5: [
178
+ '任务已分解为 4 个子任务:\n1. 用户登录模块 (优先级:高)\n2. 用户注册模块 (优先级:高)\n3. 权限管理 (优先级:中)\n4. 集成测试 (优先级:中)\n建议按顺序执行。',
179
+ 'Harness Gate 5 分解完成。每个子任务都有明确的完成标准和验收条件。',
180
+ ],
181
+ 7: [
182
+ '代码实现中,Harness 建议使用策略模式重构条件判断逻辑,这样更容易扩展新的验证规则。',
183
+ 'Gate 7 分析:建议在服务层添加缓存机制,提高响应速度。',
184
+ ],
185
+ 8: [
186
+ '测试策略制定完成。目标覆盖率 80%,优先测试核心业务逻辑和边界情况。',
187
+ 'Harness Gate 8:建议先写单元测试,再写集成测试,最后进行 E2E 测试。',
188
+ ],
189
+ };
190
+ function generateNaturalResponses() {
191
+ return [
192
+ '好的,明白。',
193
+ '我理解了,继续。',
194
+ '没问题,我们继续。',
195
+ '明白,让我看看...',
196
+ '收到,我会处理的。',
197
+ '好的,这个信息很有用。',
198
+ '明白了,还有其他需要讨论的吗?',
199
+ ];
200
+ }
201
+ class ResponseGenerator {
202
+ responseIndex = 0;
203
+ generate(decision, fromName) {
204
+ if (!decision.called) {
205
+ const responses = generateNaturalResponses();
206
+ return responses[this.responseIndex++ % responses.length];
207
+ }
208
+ const gateResponses = responses[decision.gate] || ['已记录你的请求。'];
209
+ return gateResponses[this.responseIndex++ % gateResponses.length];
210
+ }
211
+ }
212
+ // ============================================================================
213
+ // 测试场景
214
+ // ============================================================================
215
+ async function runDialogue() {
216
+ console.log('\n========================================');
217
+ console.log(' P2P Agent 多轮对话测试');
218
+ console.log(' 场景: 完成一个用户认证系统的需求讨论');
219
+ console.log('========================================\n');
220
+ const alice = new Agent('Alice', PORT_ALICE);
221
+ const bob = new Agent('Bob', PORT_BOB);
222
+ await alice.start();
223
+ await bob.start();
224
+ // 对话脚本 (Alice 发送,Bob 接收并回复)
225
+ const script = [
226
+ 'Bob,我们需要设计一个用户认证系统。',
227
+ '好的,具体需要哪些功能?',
228
+ '需要登录、注册、找回密码,还要支持社交登录。',
229
+ '明白了。这个系统需要什么级别的安全性?',
230
+ '需要处理金融数据,所以安全性很重要。帮我分析一下架构。',
231
+ '我来分析架构设计。',
232
+ '架构看起来不错。帮我 review 一下登录模块的实现。',
233
+ '好的,检查登录代码...',
234
+ 'Review 完成,发现了一些命名规范问题。',
235
+ '好的,我们需要优化错误处理。',
236
+ '同意,现在分解任务吧。',
237
+ '我来把任务分解成可执行的小块。',
238
+ '任务分解得很好。我们开始实现第一个任务。',
239
+ '好的,开始实现登录模块。',
240
+ '实现完成,帮我验证一下代码质量。',
241
+ '运行测试中...',
242
+ '测试通过了!继续下一个任务。',
243
+ '好的,继续实现注册模块。',
244
+ '注册模块也完成了。',
245
+ '测试通过,项目进展顺利!',
246
+ ];
247
+ const responseGen = new ResponseGenerator();
248
+ console.log('━━━ 开始对话 ━━━\n');
249
+ for (let i = 0; i < script.length; i++) {
250
+ const isAliceSending = i % 2 === 0;
251
+ const speaker = isAliceSending ? 'Alice' : 'Bob';
252
+ const content = script[i];
253
+ // Alice 发送消息给 Bob
254
+ console.log(`[${speaker}] >>> ${content}`);
255
+ if (isAliceSending) {
256
+ // Alice -> Bob
257
+ try {
258
+ const resp = await fetch(`http://localhost:${PORT_BOB}/receive`, {
259
+ method: 'POST',
260
+ headers: { 'Content-Type': 'application/json' },
261
+ body: JSON.stringify({ fromName: 'Alice', content })
262
+ });
263
+ const result = await resp.json();
264
+ if (result.harnessCalled) {
265
+ console.log(`🧠 [Bob] Harness: Gate ${result.gate}`);
266
+ }
267
+ else {
268
+ console.log(`🧠 [Bob] 普通回复`);
269
+ }
270
+ console.log(`📤 [Bob] >>> ${result.response?.substring(0, 60)}...`);
271
+ }
272
+ catch (err) {
273
+ console.log(`❌ 发送失败:`, err);
274
+ }
275
+ }
276
+ else {
277
+ // Bob -> Alice
278
+ try {
279
+ const resp = await fetch(`http://localhost:${PORT_ALICE}/receive`, {
280
+ method: 'POST',
281
+ headers: { 'Content-Type': 'application/json' },
282
+ body: JSON.stringify({ fromName: 'Bob', content })
283
+ });
284
+ const result = await resp.json();
285
+ if (result.harnessCalled) {
286
+ console.log(`🧠 [Alice] Harness: Gate ${result.gate}`);
287
+ }
288
+ else {
289
+ console.log(`🧠 [Alice] 普通回复`);
290
+ }
291
+ console.log(`📤 [Alice] >>> ${result.response?.substring(0, 60)}...`);
292
+ }
293
+ catch (err) {
294
+ console.log(`❌ 发送失败:`, err);
295
+ }
296
+ }
297
+ await new Promise(r => setTimeout(r, 400));
298
+ }
299
+ // 结果汇总
300
+ console.log('\n━━━ 结果汇总 ━━━\n');
301
+ const aliceHistory = alice.history;
302
+ const bobHistory = bob.history;
303
+ console.log(`[Alice] 对话记录: ${aliceHistory.length} 条`);
304
+ console.log(`[Bob] 对话记录: ${bobHistory.length} 条`);
305
+ const harnessCalls = [...aliceHistory, ...bobHistory].filter(e => e.harnessCalled);
306
+ console.log(`\nHarness 调用次数: ${harnessCalls.length}`);
307
+ // Gate 统计
308
+ const gateStats = new Map();
309
+ for (const call of harnessCalls) {
310
+ if (call.gate) {
311
+ gateStats.set(call.gate, (gateStats.get(call.gate) || 0) + 1);
312
+ }
313
+ }
314
+ console.log('\nGate 统计:');
315
+ for (const [gate, count] of gateStats) {
316
+ console.log(` Gate ${gate}: ${count} 次`);
317
+ }
318
+ // 对话流程
319
+ console.log('\n━━━ 对话流程 ━━━\n');
320
+ for (let i = 0; i < aliceHistory.length; i++) {
321
+ const entry = aliceHistory[i];
322
+ const icon = entry.harnessCalled ? '🧠' : ' ';
323
+ const gateInfo = entry.harnessCalled ? ` [Gate ${entry.gate}]` : '';
324
+ console.log(`${icon} [${entry.speaker}]${gateInfo}: ${entry.message.substring(0, 50)}...`);
325
+ }
326
+ // 健康检查
327
+ console.log('\n━━━ 最终状态 ━━━\n');
328
+ const aliceHealth = await fetch(`http://localhost:${PORT_ALICE}/health`).then(r => r.json());
329
+ const bobHealth = await fetch(`http://localhost:${PORT_BOB}/health`).then(r => r.json());
330
+ console.log(`[Alice] ID: ${aliceHealth.id.substring(0, 16)}...`);
331
+ console.log(`[Bob] ID: ${bobHealth.id.substring(0, 16)}...`);
332
+ console.log(`\n对话总数: ${aliceHistory.length + bobHistory.length}`);
333
+ console.log(`Harness 调用: ${harnessCalls.length} 次`);
334
+ const success = harnessCalls.length >= 5;
335
+ console.log(`\n${success ? '✅' : '⚠️'} ${success ? '测试成功' : '测试部分成功'}`);
336
+ console.log('\n========================================\n');
337
+ }
338
+ runDialogue().catch(err => {
339
+ console.error('测试失败:', err);
340
+ process.exit(1);
341
+ });