@bolloon/bolloon-agent 0.4.14 โ†’ 0.4.15

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 (213) hide show
  1. package/README.md +127 -127
  2. package/bin/bolloon-cli.cjs +183 -183
  3. package/bin/bolloon-daemon.sh +207 -0
  4. package/bin/bolloon.cjs +0 -0
  5. package/dist/agents/constraint-layer.js +19 -19
  6. package/dist/agents/judgment-protocol.js +14 -14
  7. package/dist/agents/pi-sdk-types.js +12 -12
  8. package/dist/agents/pi-sdk.js +101 -101
  9. package/dist/agents/skill-organizer.js +19 -19
  10. package/dist/agents/workflow-pivot-loop.js +2 -2
  11. package/dist/agents/x402/x402Pay.js +4 -0
  12. package/dist/bollharness/src/scripts/deploy-guard.js +8 -8
  13. package/dist/bollharness-integration/context-router-judgment.js +4 -4
  14. package/dist/bollharness-integration/context-router.js +292 -292
  15. package/dist/bollharness-integration/gate-state-machine.js +13 -13
  16. package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
  17. package/dist/bollharness-integration/skill-adapter.js +21 -21
  18. package/dist/bootstrap/chat-archiver.js +14 -14
  19. package/dist/bootstrap/context-os.js +24 -24
  20. package/dist/bootstrap/memory-compressor.js +13 -13
  21. package/dist/cli-entry.js +36 -36
  22. package/dist/constraint-runtime/reference_data/archive_surface_snapshot.json +63 -0
  23. package/dist/constraint-runtime/reference_data/commands_snapshot.json +1037 -0
  24. package/dist/constraint-runtime/reference_data/subsystems/assistant.json +8 -0
  25. package/dist/constraint-runtime/reference_data/subsystems/bootstrap.json +8 -0
  26. package/dist/constraint-runtime/reference_data/subsystems/bridge.json +32 -0
  27. package/dist/constraint-runtime/reference_data/subsystems/buddy.json +13 -0
  28. package/dist/constraint-runtime/reference_data/subsystems/cli.json +26 -0
  29. package/dist/constraint-runtime/reference_data/subsystems/components.json +32 -0
  30. package/dist/constraint-runtime/reference_data/subsystems/constants.json +28 -0
  31. package/dist/constraint-runtime/reference_data/subsystems/coordinator.json +8 -0
  32. package/dist/constraint-runtime/reference_data/subsystems/entrypoints.json +15 -0
  33. package/dist/constraint-runtime/reference_data/subsystems/hooks.json +32 -0
  34. package/dist/constraint-runtime/reference_data/subsystems/keybindings.json +21 -0
  35. package/dist/constraint-runtime/reference_data/subsystems/memdir.json +15 -0
  36. package/dist/constraint-runtime/reference_data/subsystems/migrations.json +18 -0
  37. package/dist/constraint-runtime/reference_data/subsystems/moreright.json +8 -0
  38. package/dist/constraint-runtime/reference_data/subsystems/native_ts.json +11 -0
  39. package/dist/constraint-runtime/reference_data/subsystems/outputStyles.json +8 -0
  40. package/dist/constraint-runtime/reference_data/subsystems/plugins.json +9 -0
  41. package/dist/constraint-runtime/reference_data/subsystems/remote.json +11 -0
  42. package/dist/constraint-runtime/reference_data/subsystems/schemas.json +8 -0
  43. package/dist/constraint-runtime/reference_data/subsystems/screens.json +10 -0
  44. package/dist/constraint-runtime/reference_data/subsystems/server.json +10 -0
  45. package/dist/constraint-runtime/reference_data/subsystems/services.json +32 -0
  46. package/dist/constraint-runtime/reference_data/subsystems/skills.json +27 -0
  47. package/dist/constraint-runtime/reference_data/subsystems/state.json +13 -0
  48. package/dist/constraint-runtime/reference_data/subsystems/types.json +18 -0
  49. package/dist/constraint-runtime/reference_data/subsystems/upstreamproxy.json +9 -0
  50. package/dist/constraint-runtime/reference_data/subsystems/utils.json +32 -0
  51. package/dist/constraint-runtime/reference_data/subsystems/vim.json +12 -0
  52. package/dist/constraint-runtime/reference_data/subsystems/voice.json +8 -0
  53. package/dist/constraint-runtime/reference_data/tools_snapshot.json +922 -0
  54. package/dist/context-compaction/auto-compact.js +7 -7
  55. package/dist/electron/config.js.map +1 -0
  56. package/dist/electron/dialogs.js.map +1 -0
  57. package/dist/electron/first-run.js +54 -54
  58. package/dist/electron/first-run.js.map +1 -0
  59. package/dist/electron/ipc.js.map +1 -0
  60. package/dist/electron/logger.js.map +1 -0
  61. package/dist/electron/main.js.map +1 -0
  62. package/dist/electron/menu.js.map +1 -0
  63. package/dist/electron/paths.js.map +1 -0
  64. package/dist/electron/server.js.map +1 -0
  65. package/dist/electron/tray.js.map +1 -0
  66. package/dist/electron/window.js.map +1 -0
  67. package/dist/electron-build/electron/first-run.js +54 -54
  68. package/dist/electron-preload.js.map +1 -1
  69. package/dist/electron.js.map +1 -1
  70. package/dist/index.js +112 -112
  71. package/dist/llm/llm-judgment-client.js +102 -102
  72. package/dist/llm/pi-ai.js +48 -48
  73. package/dist/llm/system-prompt/layers/channel/human-async.md +41 -41
  74. package/dist/llm/system-prompt/layers/channel/local.md +14 -14
  75. package/dist/llm/system-prompt/layers/channel/p2p-agent.md +18 -18
  76. package/dist/llm/system-prompt/layers/channel/p2p-peer-sync.md +51 -51
  77. package/dist/llm/system-prompt/layers/channel/p2p-proactive.md +43 -43
  78. package/dist/llm/system-prompt/layers/channel/p2p-visitor.md +19 -19
  79. package/dist/llm/system-prompt/layers/channel/session-handoff.md +61 -61
  80. package/dist/llm/system-prompt/layers/core/artifacts_storage.md +89 -89
  81. package/dist/llm/system-prompt/layers/core/evenhandedness.md +21 -21
  82. package/dist/llm/system-prompt/layers/core/external-engagement.md +73 -73
  83. package/dist/llm/system-prompt/layers/core/hibs_reminders.md +15 -15
  84. package/dist/llm/system-prompt/layers/core/identity.md +48 -48
  85. package/dist/llm/system-prompt/layers/core/knowledge.md +17 -17
  86. package/dist/llm/system-prompt/layers/core/memory_system.md +12 -12
  87. package/dist/llm/system-prompt/layers/core/network_filesystem.md +28 -28
  88. package/dist/llm/system-prompt/layers/core/refusal.md +37 -37
  89. package/dist/llm/system-prompt/layers/core/tone.md +31 -31
  90. package/dist/llm/system-prompt/layers/core/tools.thin.md +13 -13
  91. package/dist/llm/system-prompt/layers/core/wellbeing.md +41 -41
  92. package/dist/llm/system-prompt/layers/role/architect.md +20 -20
  93. package/dist/llm/system-prompt/layers/role/expert.md +19 -19
  94. package/dist/llm/system-prompt/layers/role/implementer.md +15 -15
  95. package/dist/llm/system-prompt/layers/role/security.md +15 -15
  96. package/dist/llm/system-prompt/layers/tool/artifacts.md +72 -72
  97. package/dist/llm/system-prompt/layers/tool/bash.md +25 -25
  98. package/dist/llm/system-prompt/layers/tool/goal_handoff.md +77 -77
  99. package/dist/llm/system-prompt/layers/tool/hibs_api.md +171 -171
  100. package/dist/llm/system-prompt/layers/tool/image_search.md +70 -70
  101. package/dist/llm/system-prompt/layers/tool/manifest.md +89 -89
  102. package/dist/llm/system-prompt/layers/tool/mcp_apps.md +53 -53
  103. package/dist/llm/system-prompt/layers/tool/p2p_request.md +61 -61
  104. package/dist/llm/system-prompt/layers/tool/web_search.md +83 -83
  105. package/dist/llm/tool-manifest/ask_user_input.js +1 -1
  106. package/dist/llm/tool-manifest/bash.js +3 -3
  107. package/dist/llm/tool-manifest/create_file.js +4 -4
  108. package/dist/llm/tool-manifest/fetch_sports_data.js +3 -3
  109. package/dist/llm/tool-manifest/image_search.js +2 -2
  110. package/dist/llm/tool-manifest/index.js +59 -0
  111. package/dist/llm/tool-manifest/mcp.js +2 -2
  112. package/dist/llm/tool-manifest/message_compose.js +3 -3
  113. package/dist/llm/tool-manifest/places.js +2 -2
  114. package/dist/llm/tool-manifest/present_files.js +1 -1
  115. package/dist/llm/tool-manifest/recipe.js +2 -2
  116. package/dist/llm/tool-manifest/str_replace.js +5 -5
  117. package/dist/llm/tool-manifest/view.js +3 -3
  118. package/dist/llm/tool-manifest/weather.js +4 -4
  119. package/dist/llm/tool-manifest/web.js +4 -4
  120. package/dist/network/p2p.js +78 -4
  121. package/dist/pi-ecosystem-judgment/causal-judge.js +51 -51
  122. package/dist/pi-ecosystem-judgment/distill-prompt.js +42 -42
  123. package/dist/pi-ecosystem-judgment/distillation.js +14 -14
  124. package/dist/pi-ecosystem-judgment/index.js +1 -1
  125. package/dist/pi-ecosystem-judgment/monitor-gate.js +28 -28
  126. package/dist/pi-ecosystem-judgment/value-injection.js +102 -102
  127. package/dist/security/context-router-tool.js +15 -15
  128. package/dist/utils/auto-update.js.map +1 -0
  129. package/dist/web/a2ui-client.js +1594 -223
  130. package/dist/web/api-config.html +779 -779
  131. package/dist/web/client-hearth.js +10 -10
  132. package/dist/web/client.js.map +7 -0
  133. package/dist/web/components/wallet-viem.mjs +118 -118
  134. package/dist/web/index.html +502 -502
  135. package/dist/web/manifest.json +20 -20
  136. package/dist/web/mobile-agent.js +397 -0
  137. package/dist/web/mobile-core.js +86235 -0
  138. package/dist/web/mobile-data.js +346 -0
  139. package/dist/web/mobile-http-api.js +71 -0
  140. package/dist/web/mobile-p2p.js +250 -0
  141. package/dist/web/mobile-payments.js +80 -0
  142. package/dist/web/mobile-wallet.js +226 -0
  143. package/dist/web/mobile.css +483 -6
  144. package/dist/web/mobile.html +99 -50
  145. package/dist/web/mobile.js +1040 -187
  146. package/dist/web/server.js +13 -13
  147. package/dist/web/style.css +4946 -4946
  148. package/package.json +201 -198
  149. package/scripts/build-cli.js +215 -215
  150. package/scripts/build-web.ts +162 -149
  151. package/scripts/postinstall.js +152 -152
  152. package/bin/bolloon.js +0 -157
  153. package/dist/agents/python-exec.js +0 -115
  154. package/dist/pi-ecosystem-colony/index.js +0 -365
  155. package/dist/social/ant-colony/AdaptiveHeartbeat.js +0 -101
  156. package/dist/social/ant-colony/PheromoneEngine.js +0 -227
  157. package/dist/social/ant-colony/index.js +0 -6
  158. package/dist/social/ant-colony/types.js +0 -24
  159. package/dist/storage/trajectory.js +0 -101
  160. package/dist/test/ai-judgment-test.js +0 -80
  161. package/dist/test/bollharness-integration.test.js +0 -318
  162. package/dist/test/channel-agent-multi-dialogue.js +0 -205
  163. package/dist/test/channel-heartbeat-agent-test.js +0 -201
  164. package/dist/test/constraint-layer.test.js +0 -164
  165. package/dist/test/diap-identity-test.js +0 -172
  166. package/dist/test/diap-quick-test.js +0 -62
  167. package/dist/test/global-shared-context.test.js +0 -315
  168. package/dist/test/harness-judgment-injection.test.js +0 -246
  169. package/dist/test/harness-workflow-integrator-test.js +0 -228
  170. package/dist/test/human-value-store.test.js +0 -243
  171. package/dist/test/hybrid-integration-test.js +0 -118
  172. package/dist/test/hybrid-messenger-verify.js +0 -55
  173. package/dist/test/iroh-bistream-debug.js +0 -38
  174. package/dist/test/iroh-communication.test.js +0 -66
  175. package/dist/test/iroh-debug-test.js +0 -57
  176. package/dist/test/iroh-diap-test.js +0 -71
  177. package/dist/test/iroh-direct-connect.js +0 -55
  178. package/dist/test/iroh-e2e-fixed.js +0 -89
  179. package/dist/test/iroh-e2e-same-process.js +0 -63
  180. package/dist/test/iroh-e2e.js +0 -66
  181. package/dist/test/iroh-final-e2e.js +0 -72
  182. package/dist/test/iroh-relay-test.js +0 -37
  183. package/dist/test/iroh-simple-test.js +0 -41
  184. package/dist/test/iroh-transport-verify.js +0 -54
  185. package/dist/test/iroh-transport.test.js +0 -37
  186. package/dist/test/iroh-two-nodes.js +0 -70
  187. package/dist/test/iroh-verify.js +0 -44
  188. package/dist/test/judgment-decision.test.js +0 -219
  189. package/dist/test/llm-judgment-integration.test.js +0 -220
  190. package/dist/test/p2p-agent-complex-dialogue.js +0 -385
  191. package/dist/test/p2p-agent-dialogue.js +0 -341
  192. package/dist/test/p2p-agent-full-bidirectional.js +0 -510
  193. package/dist/test/p2p-agent-harness-flow.js +0 -437
  194. package/dist/test/p2p-agent-harness-single.js +0 -143
  195. package/dist/test/p2p-ai-dialogue-test.js +0 -318
  196. package/dist/test/p2p-cid-connect-test.js +0 -195
  197. package/dist/test/p2p-connect-receiver.js +0 -69
  198. package/dist/test/p2p-doc-transfer.js +0 -110
  199. package/dist/test/p2p-identity-page-test.js +0 -77
  200. package/dist/test/p2p-iroh-test.js +0 -171
  201. package/dist/test/p2p-minimal-test.js +0 -241
  202. package/dist/test/p2p-node-1.js +0 -148
  203. package/dist/test/p2p-node-2.js +0 -148
  204. package/dist/test/p2p-server.js +0 -281
  205. package/dist/test/p2p-two-nodes-test.js +0 -438
  206. package/dist/test/pi-sdk.test.js +0 -44
  207. package/dist/test/set-persona.js +0 -40
  208. package/dist/test/simple.test.js +0 -9
  209. package/dist/test/storage-integration.test.js +0 -150
  210. package/dist/test/subagent-manager.test.js +0 -276
  211. package/dist/test/test-gate-flow.test.js +0 -81
  212. package/dist/test/workflow-engine.test.js +0 -87
  213. package/dist/test/workflow-pivot-loop.test.js +0 -246
@@ -1,318 +0,0 @@
1
- /**
2
- * P2P AI ๅฏน่ฏๆต‹่ฏ• - ็ป“ๅˆๅˆคๆ–ญๅŠ›ๆณจๅ…ฅ็š„ๆ™บ่ƒฝไฝ“ๅฏน่ฏ
3
- *
4
- * ๅŠŸ่ƒฝ:
5
- * 1. ้€š่ฟ‡ iroh P2P ๆŽฅๆ”ถๆถˆๆฏ
6
- * 2. ่ฐƒ็”จ AI ็”Ÿๆˆๅ›žๅค๏ผˆๅธฆๅˆคๆ–ญๅŠ›ๆณจๅ…ฅ๏ผ‰
7
- * 3. ้€š่ฟ‡ iroh ๅ‘้€ๅ›žๅค
8
- *
9
- * ๆต็จ‹:
10
- * ็”ต่„‘ A: npx tsx src/test/p2p-ai-dialogue-test.ts --publish
11
- * ็”ต่„‘ B: npx tsx src/test/p2p-ai-dialogue-test.ts --cid=<A็š„CID>
12
- */
13
- import { irohTransport } from '../network/iroh-transport.js';
14
- import { KeyManager } from '@diap/sdk';
15
- import { createAgentSession } from '../agents/pi-sdk.js';
16
- import { generateValueInjection } from '../pi-ecosystem-judgment/value-injection.js';
17
- import { storeHumanJudgment, initializeValueStore } from '../pi-ecosystem-judgment/human-value-store.js';
18
- const IPFS_ENDPOINT = 'http://127.0.0.1:5001';
19
- // ๅ…จๅฑ€็Šถๆ€
20
- let agentSession = null;
21
- let messageHistory = [];
22
- let ownNodeId = '';
23
- // ============================================================
24
- // AI ๅฏน่ฏๆ ธๅฟƒ
25
- // ============================================================
26
- async function initAgentSession() {
27
- console.log('\n[AI] ๅˆๅง‹ๅŒ– Agent Session...');
28
- const session = await createAgentSession({
29
- cwd: process.cwd()
30
- });
31
- console.log(' โœ… Agent Session ๅฐฑ็ปช');
32
- return session;
33
- }
34
- async function generateAIResponse(userInput, context) {
35
- if (!agentSession) {
36
- agentSession = await initAgentSession();
37
- }
38
- console.log('\n[AI] ๅค„็†่พ“ๅ…ฅ...');
39
- console.log(` ๐Ÿ“ฅ ็”จๆˆท: ${userInput.substring(0, 50)}...`);
40
- // 1. ็”Ÿๆˆๅˆคๆ–ญๅŠ›ๆณจๅ…ฅ
41
- console.log('\n[Judgment] ็”Ÿๆˆไปทๅ€ผ่ง‚ๆณจๅ…ฅ...');
42
- let valueInjection = '';
43
- try {
44
- const injection = await generateValueInjection(context || userInput, {
45
- mode: 'standard',
46
- maxTokens: 500,
47
- includeExamples: true,
48
- includeRules: true
49
- });
50
- valueInjection = injection;
51
- if (injection) {
52
- console.log(' โœ… ไปทๅ€ผ่ง‚ๆณจๅ…ฅๅทฒ็”Ÿๆˆ');
53
- }
54
- else {
55
- console.log(' โ„น๏ธ ๆ— ๅކๅฒไปทๅ€ผ่ง‚ๆ•ฐๆฎ');
56
- }
57
- }
58
- catch (e) {
59
- console.log(` โš ๏ธ ไปทๅ€ผ่ง‚ๆณจๅ…ฅๅคฑ่ดฅ: ${e.message}`);
60
- }
61
- // 2. ๆž„ๅปบๅธฆๅˆคๆ–ญๅŠ›็š„ prompt
62
- const fullPrompt = buildPromptWithJudgments(userInput, valueInjection);
63
- // 3. ่ฐƒ็”จ AI
64
- console.log('\n[AI] ่ฐƒ็”จ่ฏญ่จ€ๆจกๅž‹...');
65
- try {
66
- const response = await agentSession.prompt(fullPrompt);
67
- console.log(' โœ… AI ๅ›žๅคๅทฒ็”Ÿๆˆ');
68
- // ไฟๅญ˜ๅฏน่ฏๅކๅฒ
69
- messageHistory.push({
70
- from: 'user',
71
- content: userInput,
72
- type: 'user',
73
- timestamp: Date.now()
74
- });
75
- messageHistory.push({
76
- from: 'ai',
77
- content: response,
78
- type: 'ai',
79
- timestamp: Date.now()
80
- });
81
- return response;
82
- }
83
- catch (e) {
84
- console.error(' โŒ AI ่ฐƒ็”จๅคฑ่ดฅ:', e);
85
- return `ๆŠฑๆญ‰๏ผŒAI ๆœๅŠกๆš‚ๆ—ถไธๅฏ็”จ: ${e.message}`;
86
- }
87
- }
88
- function buildPromptWithJudgments(userInput, valueInjection) {
89
- // ๆž„ๅปบๅŒ…ๅซๅˆคๆ–ญๅŠ›ๆณจๅ…ฅ็š„ prompt
90
- let prompt = '';
91
- if (valueInjection) {
92
- prompt = `${valueInjection}
93
-
94
- ---
95
-
96
- ใ€ๅฝ“ๅ‰ๅฏน่ฏใ€‘
97
- ็”จๆˆท: ${userInput}
98
-
99
- ่ฏทๅŸบไบŽไปฅไธŠไปทๅ€ผ่ง‚ๅ’ŒไธŠไธ‹ๆ–‡ๅ›žๅค็”จๆˆทใ€‚`;
100
- }
101
- else {
102
- prompt = `ไฝ ๆ˜ฏไธ€ไธชๆœ‰ๅธฎๅŠฉ็š„ AI ๅŠฉๆ‰‹ใ€‚
103
-
104
- ใ€ๅฝ“ๅ‰ๅฏน่ฏใ€‘
105
- ็”จๆˆท: ${userInput}
106
-
107
- ่ฏทๅ›žๅค็”จๆˆทใ€‚`;
108
- }
109
- return prompt;
110
- }
111
- // ============================================================
112
- // ๆถˆๆฏๅค„็†
113
- // ============================================================
114
- function setupMessageHandlers() {
115
- console.log('\n[P2P] ่ฎพ็ฝฎๆถˆๆฏๅค„็†ๅ™จ...');
116
- // ๅค„็† chat ็ฑปๅž‹ๆถˆๆฏ
117
- irohTransport.onMessage('chat', async (msg) => {
118
- const content = new TextDecoder().decode(msg.payload);
119
- const fromNode = msg.from.substring(0, 12);
120
- console.log(`\n[ๆ”ถๅˆฐ] ๐Ÿ’ฌ from ${fromNode}...: ${content.substring(0, 50)}...`);
121
- // ็”Ÿๆˆ AI ๅ›žๅค
122
- const response = await generateAIResponse(content, 'p2p-dialogue');
123
- // ๅ‘้€ๅ›žๅค
124
- const replyPayload = JSON.stringify({
125
- type: 'ai-response',
126
- content: response,
127
- from: ownNodeId,
128
- timestamp: Date.now()
129
- });
130
- await irohTransport.sendMessage(msg.from, 'chat', new TextEncoder().encode(replyPayload));
131
- console.log(`[ๅ‘้€] โœ… ๅ›žๅคๅทฒๅ‘้€`);
132
- });
133
- // ๅค„็† ai-response ็ฑปๅž‹ๆถˆๆฏ
134
- irohTransport.onMessage('ai-response', (msg) => {
135
- try {
136
- const data = JSON.parse(new TextDecoder().decode(msg.payload));
137
- console.log(`\n[ๆ”ถๅˆฐ] ๐Ÿค– AI ๅ›žๅค from ${data.from?.substring(0, 12)}...`);
138
- console.log(`\n${'โ”€'.repeat(50)}`);
139
- console.log(data.content);
140
- console.log(`${'โ”€'.repeat(50)}\n`);
141
- }
142
- catch {
143
- console.log(`\n[ๆ”ถๅˆฐ] ๅŽŸๅง‹ๆถˆๆฏ: ${new TextDecoder().decode(msg.payload)}`);
144
- }
145
- });
146
- // ๅค„็† feedback ็ฑปๅž‹ๆถˆๆฏ๏ผˆ็”จๆˆทๅ้ฆˆ๏ผ‰
147
- irohTransport.onMessage('feedback', async (msg) => {
148
- try {
149
- const data = JSON.parse(new TextDecoder().decode(msg.payload));
150
- console.log(`\n[ๆ”ถๅˆฐ] ๐Ÿ“ ็”จๆˆทๅ้ฆˆ: ${JSON.stringify(data)}`);
151
- // ๅญ˜ๅ‚จๅ้ฆˆไฝœไธบๅˆคๆ–ญๅŠ›ๅญฆไน 
152
- if (data.judgment) {
153
- await storeHumanJudgment({
154
- decision: data.content || 'N/A',
155
- decision_type: data.type || 'approve',
156
- reasons: [data.reason || ''],
157
- values_derived: data.values || [],
158
- context: {
159
- domain: 'p2p-dialogue',
160
- complexity: 'moderate',
161
- stakes: 'low',
162
- time_pressure: 'low'
163
- },
164
- outcome: { approved: data.type === 'approve' },
165
- metadata: {
166
- source: 'p2p-feedback',
167
- confidence: 0.8,
168
- revisable: true
169
- }
170
- });
171
- console.log(' โœ… ๅ้ฆˆๅทฒๅญ˜ๅ‚จไธบๅˆคๆ–ญๅŠ›ๆ•ฐๆฎ');
172
- }
173
- }
174
- catch (e) {
175
- console.log(` โš ๏ธ ๅ้ฆˆ่งฃๆžๅคฑ่ดฅ: ${e.message}`);
176
- }
177
- });
178
- console.log(' โœ… ๆถˆๆฏๅค„็†ๅ™จๅทฒ่ฎพ็ฝฎ');
179
- }
180
- // ============================================================
181
- // DID ๅ‘ๅธƒ
182
- // ============================================================
183
- async function publishDID() {
184
- console.log('\n[DID] ๅ‘ๅธƒ่บซไปฝๅˆฐ IPFS...');
185
- const keyPair = KeyManager.generate();
186
- const did = keyPair.did;
187
- const nodeId = irohTransport.getNodeId() || '';
188
- console.log(` โœ… DID: ${did}`);
189
- console.log(` โœ… iroh Node ID: ${nodeId}`);
190
- // ๆž„ๅปบ DID ๆ–‡ๆกฃ๏ผˆๅŒ…ๅซ iroh ไฟกๆฏ๏ผ‰
191
- const agentDoc = {
192
- id: did,
193
- name: `bolloon-ai-${Date.now()}`,
194
- version: '1.0',
195
- capabilities: ['chat', 'reasoning', 'judgment-injection', 'ai-dialogue'],
196
- interests: ['ai', 'p2p', 'judgment-system'],
197
- irohNodeId: nodeId,
198
- publicKey: Buffer.from(keyPair.publicKey).toString('hex'),
199
- channels: [{ id: 'main', name: 'ไธปๅฏน่ฏ' }],
200
- createdAt: new Date().toISOString()
201
- };
202
- // ๅ‘ๅธƒๅˆฐ IPFS
203
- const formData = new FormData();
204
- const blob = new Blob([JSON.stringify(agentDoc)], { type: 'application/json' });
205
- formData.append('file', blob, 'agent-doc.json');
206
- const response = await fetch(`${IPFS_ENDPOINT}/api/v0/add`, {
207
- method: 'POST',
208
- body: formData
209
- });
210
- const result = await response.text();
211
- const cidMatch = result.match(/"Hash":"([^"]+)"/);
212
- const cid = cidMatch ? cidMatch[1] : '';
213
- console.log(` โœ… IPFS CID: ${cid}`);
214
- return { did, cid, nodeId };
215
- }
216
- // ============================================================
217
- // ่งฃๆž CID
218
- // ============================================================
219
- async function resolveCID(cid) {
220
- console.log('\n[IPFS] ่งฃๆž CID...');
221
- try {
222
- const response = await fetch(`${IPFS_ENDPOINT}/api/v0/cat?arg=${cid}`, {
223
- method: 'POST'
224
- });
225
- const content = await response.text();
226
- const doc = JSON.parse(content);
227
- console.log(` โœ… ่งฃๆžๆˆๅŠŸ`);
228
- console.log(` DID: ${doc.id}`);
229
- console.log(` ๅ็งฐ: ${doc.name || 'N/A'}`);
230
- return { did: doc.id, name: doc.name || 'Unknown' };
231
- }
232
- catch (e) {
233
- console.log(` โŒ ่งฃๆžๅคฑ่ดฅ: ${e.message}`);
234
- return null;
235
- }
236
- }
237
- // ============================================================
238
- // ไธปๆต็จ‹
239
- // ============================================================
240
- async function main() {
241
- console.log('โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—');
242
- console.log('โ•‘ P2P AI ๅฏน่ฏๆต‹่ฏ• - ๅˆคๆ–ญๅŠ›ๆณจๅ…ฅ + ๆ™บ่ƒฝไฝ“ๅฏน่ฏ โ•‘');
243
- console.log('โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•');
244
- const args = process.argv.slice(2);
245
- const isPublisher = args.includes('--publish');
246
- const targetCid = args.find(a => a.startsWith('--cid='))?.split('=')[1];
247
- const targetNode = args.find(a => a.startsWith('--node='))?.split('=')[1];
248
- // 1. ๅˆๅง‹ๅŒ–
249
- console.log('\n[ๅˆๅง‹ๅŒ–] ๅฏๅŠจ iroh...');
250
- await irohTransport.start();
251
- ownNodeId = irohTransport.getNodeId() || '';
252
- console.log(` โœ… iroh ๅทฒๅฏๅŠจ: ${ownNodeId.substring(0, 20)}...`);
253
- // 2. ๅˆๅง‹ๅŒ–ไปทๅ€ผ่ง‚ๅญ˜ๅ‚จ
254
- try {
255
- await initializeValueStore();
256
- console.log(' โœ… ๅˆคๆ–ญๅŠ›ๅญ˜ๅ‚จๅทฒๅˆๅง‹ๅŒ–');
257
- }
258
- catch (e) {
259
- console.log(` โš ๏ธ ๅˆคๆ–ญๅŠ›ๅญ˜ๅ‚จๅˆๅง‹ๅŒ–ๅคฑ่ดฅ: ${e.message}`);
260
- }
261
- // 3. ่ฎพ็ฝฎๆถˆๆฏๅค„็†ๅ™จ
262
- setupMessageHandlers();
263
- // ๅ‘ๅธƒๆจกๅผ
264
- if (isPublisher) {
265
- const { did, cid, nodeId } = await publishDID();
266
- console.log('\nโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•');
267
- console.log(' ๐Ÿ“‹ ่ฟžๆŽฅไฟกๆฏ๏ผˆๅˆ†ไบซ็ป™ๅฆไธ€ๅฐ็”ต่„‘๏ผ‰:');
268
- console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•');
269
- console.log(` CID: ${cid}`);
270
- console.log(` Node ID: ${nodeId}`);
271
- console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n');
272
- console.log('็”จๆณ•:');
273
- console.log(` npx tsx src/test/p2p-ai-dialogue-test.ts --cid=${cid} --node=${nodeId}`);
274
- console.log('\n ็ญ‰ๅพ…ๆถˆๆฏ...\n');
275
- await new Promise(() => { });
276
- }
277
- // ่ฟžๆŽฅๆจกๅผ
278
- else if (targetCid && targetNode) {
279
- const resolved = await resolveCID(targetCid);
280
- if (resolved) {
281
- console.log(`\n ๐ŸŽฏ ๅ‡†ๅค‡่ฟžๆŽฅๅˆฐ ${resolved.name}...`);
282
- }
283
- // ๅ‘้€ๆต‹่ฏ•ๆถˆๆฏ
284
- const testMessage = JSON.stringify({
285
- type: 'chat',
286
- content: 'ไฝ ๅฅฝ๏ผ่ฟ™ๆ˜ฏ P2P AI ๅฏน่ฏๆต‹่ฏ•ๆถˆๆฏใ€‚่ฏท้—ฎไฝ ่ƒฝๅค„็†ไป€ไนˆไปปๅŠก๏ผŸ',
287
- from: ownNodeId,
288
- timestamp: Date.now()
289
- });
290
- console.log('\n[ๅ‘้€] ๆต‹่ฏ•ๆถˆๆฏ...');
291
- const success = await irohTransport.sendMessage(targetNode, 'chat', new TextEncoder().encode(testMessage));
292
- if (success) {
293
- console.log(' โœ… ๆถˆๆฏๅ‘้€ๆˆๅŠŸ๏ผŒ็ญ‰ๅพ…ๅ›žๅค...\n');
294
- }
295
- else {
296
- console.log(' โš ๏ธ ๆถˆๆฏๅ‘้€ๅคฑ่ดฅ\n');
297
- }
298
- console.log(' ็ญ‰ๅพ…ๆถˆๆฏ... (30็ง’ๅŽ้€€ๅ‡บ)\n');
299
- await new Promise(resolve => setTimeout(resolve, 30000));
300
- }
301
- // ๅธฎๅŠฉไฟกๆฏ
302
- else {
303
- console.log('\n็”จๆณ•:');
304
- console.log('');
305
- console.log(' ็”ต่„‘ A (ๅ‘ๅธƒๆ–น):');
306
- console.log(' npx tsx src/test/p2p-ai-dialogue-test.ts --publish');
307
- console.log('');
308
- console.log(' ็”ต่„‘ B (่ฟžๆŽฅๆ–น):');
309
- console.log(' npx tsx src/test/p2p-ai-dialogue-test.ts --cid=<CID> --node=<NodeID>');
310
- console.log('');
311
- console.log('ๆต‹่ฏ•ๆต็จ‹:');
312
- console.log(' 1. A ่ฟ่กŒ --publish๏ผŒ่ฎฐๅฝ•ๆ˜พ็คบ็š„ CID ๅ’Œ NodeID');
313
- console.log(' 2. B ไฝฟ็”จ --cid ๅ’Œ --node ่ฟžๆŽฅ A');
314
- console.log(' 3. A ๆ”ถๅˆฐๆถˆๆฏๅŽ๏ผŒ่ฐƒ็”จ AI ็”Ÿๆˆๅ›žๅค๏ผˆๅธฆๅˆคๆ–ญๅŠ›ๆณจๅ…ฅ๏ผ‰');
315
- console.log(' 4. ๅ›žๅค้€š่ฟ‡ P2P ๅ‘้€ๅ›ž B');
316
- }
317
- }
318
- main().catch(console.error);
@@ -1,195 +0,0 @@
1
- /**
2
- * P2P CID ่ฟžๆŽฅๆต‹่ฏ• - ้ชŒ่ฏ้€š่ฟ‡ CID ่‡ชๅŠจ่งฃๆž DID ๆ–‡ๆกฃๅนถๅปบ็ซ‹่ฟžๆŽฅ
3
- *
4
- * ๆต็จ‹:
5
- * 1. ็”ต่„‘ A: ็”Ÿๆˆ DID โ†’ ๅ‘ๅธƒๅˆฐ IPFS โ†’ ่Žทๅพ— CID โ†’ ๅˆ†ไบซ็ป™ B
6
- * 2. ็”ต่„‘ B: ๆŽฅๆ”ถ CID โ†’ ไปŽ IPFS ่งฃๆž DID ๆ–‡ๆกฃ โ†’ ๆๅ–่ฟžๆŽฅไฟกๆฏ โ†’ ๅปบ็ซ‹ P2P
7
- */
8
- import crypto from 'node:crypto';
9
- import { KeyManager, IpfsClient } from '@diap/sdk';
10
- import { createHyperswarmCommunicator, createTopic } from '@diap/sdk';
11
- const IPFS_ENDPOINT = 'http://127.0.0.1:5001';
12
- const P2P_TOPIC = 'bolloon-test-v2'; // ๆต‹่ฏ•็”จไธป้ข˜
13
- // ============================================================
14
- // ๆญฅ้ชค 1: ๅ‘ๅธƒ DID ๅˆฐ IPFS๏ผˆ็”ต่„‘ A๏ผ‰
15
- // ============================================================
16
- async function publishDIDToIPFS(name) {
17
- console.log('\n[ๆญฅ้ชค 1] ๅ‘ๅธƒ DID ๅˆฐ IPFS...');
18
- // ็”Ÿๆˆ DID
19
- const keyPair = KeyManager.generate();
20
- const did = keyPair.did;
21
- console.log(` โœ… DID ็”Ÿๆˆ: ${did}`);
22
- // ๆž„ๅปบ DID ๆ–‡ๆกฃ๏ผˆๆ ‡ๅ‡† DIAP ๆ ผๅผ๏ผ‰
23
- const didDoc = {
24
- '@context': [
25
- 'https://www.w3.org/ns/did/v1',
26
- 'https://w3id.org/security/suites/ed25519-2020/v1'
27
- ],
28
- id: did,
29
- verificationMethod: [{
30
- id: `${did}#key-1`,
31
- type: 'Ed25519VerificationKey2020',
32
- controller: did,
33
- publicKeyMultibase: `did:key:${Buffer.from(keyPair.publicKey).toString('base64url')}`
34
- }],
35
- authentication: [`${did}#key-1`],
36
- capabilityInvocation: [`${did}#key-1`],
37
- capabilityDelegation: [`${did}#key-1`],
38
- // ๆ‰ฉๅฑ•ๅญ—ๆฎต๏ผšๆ™บ่ƒฝไฝ“ไฟกๆฏ
39
- name: name,
40
- capabilities: ['chat', 'reasoning', 'judgment-injection'],
41
- interests: ['ai', 'p2p'],
42
- channels: [{ id: 'main', name: 'ไธปๅฏน่ฏ' }]
43
- };
44
- // ไธŠไผ ๅˆฐ IPFS
45
- const ipfs = new IpfsClient(IPFS_ENDPOINT, null);
46
- const docJson = JSON.stringify(didDoc);
47
- const formData = new FormData();
48
- const blob = new Blob([docJson], { type: 'application/json' });
49
- formData.append('file', blob, 'did-doc.json');
50
- const response = await fetch(`${IPFS_ENDPOINT}/api/v0/add`, {
51
- method: 'POST',
52
- body: formData
53
- });
54
- const result = await response.text();
55
- const cidMatch = result.match(/"Hash":"([^"]+)"/);
56
- const cid = cidMatch ? cidMatch[1] : '';
57
- console.log(` โœ… DID ๆ–‡ๆกฃๅ‘ๅธƒๅˆฐ IPFS: ${cid}`);
58
- return { did, cid, keyPair };
59
- }
60
- // ============================================================
61
- // ๆญฅ้ชค 2: ไปŽ IPFS ่งฃๆž DID ๆ–‡ๆกฃ๏ผˆ็”ต่„‘ B๏ผ‰
62
- // ============================================================
63
- async function resolveDIDFromIPFS(cid) {
64
- console.log('\n[ๆญฅ้ชค 2] ไปŽ IPFS ่งฃๆž DID ๆ–‡ๆกฃ...');
65
- const ipfs = new IpfsClient(IPFS_ENDPOINT, null);
66
- try {
67
- const content = await ipfs.get(cid);
68
- const doc = JSON.parse(content);
69
- console.log(` โœ… DID ๆ–‡ๆกฃ่งฃๆžๆˆๅŠŸ`);
70
- console.log(` DID: ${doc.id}`);
71
- console.log(` ๅ็งฐ: ${doc.name || 'N/A'}`);
72
- console.log(` ่ƒฝๅŠ›: ${(doc.capabilities || []).join(', ') || 'N/A'}`);
73
- return {
74
- did: doc.id,
75
- name: doc.name || 'Unknown',
76
- capabilities: doc.capabilities || []
77
- };
78
- }
79
- catch (e) {
80
- console.log(` โŒ ่งฃๆžๅคฑ่ดฅ: ${e.message}`);
81
- return null;
82
- }
83
- }
84
- // ============================================================
85
- // ๆญฅ้ชค 3: ๅปบ็ซ‹ P2P ่ฟžๆŽฅ
86
- // ============================================================
87
- async function establishP2PConnection() {
88
- console.log('\n[ๆญฅ้ชค 3] ๅˆๅง‹ๅŒ– P2P ็ฝ‘็ปœ...');
89
- const seed = crypto.getRandomValues(new Uint8Array(32));
90
- const comm = createHyperswarmCommunicator({
91
- server: true,
92
- client: true,
93
- autoConnect: true,
94
- maxConnections: 5,
95
- seed: seed
96
- });
97
- // ๅ…ˆๅฏๅŠจ
98
- await comm.start();
99
- console.log(' โœ… P2P ็ฝ‘็ปœๅทฒๅฏๅŠจ');
100
- const topic = createTopic(P2P_TOPIC);
101
- await comm.joinTopic(topic);
102
- console.log(` โœ… ๅทฒๅŠ ๅ…ฅ P2P ไธป้ข˜: ${P2P_TOPIC}`);
103
- // ่Žทๅ–ๆœฌๆœบๅ…ฌ้’ฅ
104
- const publicKey = comm.publicKey || '';
105
- console.log(` โœ… ๆœฌๆœบ่Š‚็‚น ID: ${publicKey.substring(0, 16)}...`);
106
- return { comm, publicKey };
107
- }
108
- // ============================================================
109
- // ๆญฅ้ชค 4: ๅ‘้€/ๆŽฅๆ”ถๆถˆๆฏ
110
- // ============================================================
111
- async function testMessaging(comm, isInitiator) {
112
- console.log('\n[ๆญฅ้ชค 4] ๆต‹่ฏ•ๆถˆๆฏๆ”ถๅ‘...');
113
- const messageLog = [];
114
- comm.on('message', (msg, conn) => {
115
- const content = new TextDecoder().decode(msg.content);
116
- console.log(` ๐Ÿ“ฉ ๆ”ถๅˆฐๆถˆๆฏ: ${content}`);
117
- messageLog.push(`ๆ”ถๅˆฐ: ${content}`);
118
- // ๅ›žๅค
119
- const reply = isInitiator
120
- ? `ACK: ๅทฒๆ”ถๅˆฐ "${content}"`
121
- : `ๅ“ๅบ”: ไฝ ๅฅฝ๏ผŒๆˆ‘ๆ˜ฏๆŽฅๆ”ถๆ–น`;
122
- conn.send(new TextEncoder().encode(reply));
123
- console.log(` ๐Ÿ“ค ๅ‘้€ๅ›žๅค: ${reply}`);
124
- });
125
- comm.on('connection', (conn) => {
126
- console.log(` ๐Ÿ”Œ ๆ–ฐ่ฟžๆŽฅ: ${conn.publicKey.substring(0, 8)}...`);
127
- // ๅ‘่ตทๆ–นๅ‘้€ๆต‹่ฏ•ๆถˆๆฏ
128
- if (isInitiator && messageLog.length === 0) {
129
- setTimeout(() => {
130
- const testMsg = `Hello from ${isInitiator ? 'Initiator' : 'Receiver'} at ${new Date().toISOString()}`;
131
- conn.send(new TextEncoder().encode(testMsg));
132
- console.log(` ๐Ÿ“ค ๅ‘้€ๆต‹่ฏ•ๆถˆๆฏ: ${testMsg}`);
133
- }, 1000);
134
- }
135
- });
136
- return messageLog;
137
- }
138
- // ============================================================
139
- // ไธปๆต‹่ฏ•ๆต็จ‹
140
- // ============================================================
141
- async function main() {
142
- console.log('โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—');
143
- console.log('โ•‘ P2P CID ่ฟžๆŽฅๆต‹่ฏ• - ้ชŒ่ฏ DID ๆ–‡ๆกฃ่งฃๆžไธŽ่‡ชๅŠจ่ฟžๆŽฅ โ•‘');
144
- console.log('โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•');
145
- const args = process.argv.slice(2);
146
- const isInitiator = args.includes('--initiator');
147
- const shareCid = args.find(a => a.startsWith('--cid='))?.split('=')[1];
148
- // ็”ต่„‘ A: ๅ‘ๅธƒ DID ๅˆฐ IPFS
149
- if (isInitiator) {
150
- const agentName = `test-agent-${Date.now()}`;
151
- const { did, cid } = await publishDIDToIPFS(agentName);
152
- // ๅปบ็ซ‹ P2P
153
- const { comm, publicKey } = await establishP2PConnection();
154
- console.log('\nโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•');
155
- console.log(' ๐Ÿ“‹ ๅˆ†ไบซ็ป™ๅฆไธ€ๅฐ็”ต่„‘็š„ไฟกๆฏ:');
156
- console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•');
157
- console.log(` CID: ${cid}`);
158
- console.log(` ไธป้ข˜: ${P2P_TOPIC}`);
159
- console.log(` ไฝ ็š„่Š‚็‚น ID: ${publicKey.substring(0, 20)}...`);
160
- console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n');
161
- await testMessaging(comm, true);
162
- console.log('\n ็ญ‰ๅพ…ๆถˆๆฏ... (Ctrl+C ้€€ๅ‡บ)');
163
- }
164
- // ็”ต่„‘ B: ไปŽ CID ่งฃๆžๅนถ่ฟžๆŽฅ
165
- else if (shareCid) {
166
- const resolved = await resolveDIDFromIPFS(shareCid);
167
- if (!resolved) {
168
- console.log('โŒ ๆ— ๆณ•่งฃๆž DID ๆ–‡ๆกฃ');
169
- return;
170
- }
171
- console.log(`\n ๅ‡†ๅค‡่ฟžๆŽฅๅˆฐ ${resolved.name}...`);
172
- // ๅปบ็ซ‹ P2P๏ผˆๅŠ ๅ…ฅๅŒไธ€ไธป้ข˜๏ผ‰
173
- const { comm, publicKey } = await establishP2PConnection();
174
- console.log('\nโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•');
175
- console.log(' ๐Ÿ“‹ ๆœฌๆœบไฟกๆฏ:');
176
- console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•');
177
- console.log(` DID: ${resolved.did}`);
178
- console.log(` ๅ็งฐ: ${resolved.name}`);
179
- console.log(` ไธป้ข˜: ${P2P_TOPIC}`);
180
- console.log(` ไฝ ็š„่Š‚็‚น ID: ${publicKey.substring(0, 20)}...`);
181
- console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n');
182
- await testMessaging(comm, false);
183
- console.log('\n ็ญ‰ๅพ…ๆถˆๆฏ... (Ctrl+C ้€€ๅ‡บ)');
184
- }
185
- else {
186
- console.log('\n็”จๆณ•:');
187
- console.log(' ็”ต่„‘ A (ๅ‘่ตทๆ–น): npx tsx src/test/p2p-cid-connect-test.ts --initiator');
188
- console.log(' ็”ต่„‘ B (ๆŽฅๆ”ถๆ–น): npx tsx src/test/p2p-cid-connect-test.ts --cid=<CID>');
189
- console.log('\nๆต‹่ฏ•ๆญฅ้ชค:');
190
- console.log(' 1. ๅœจ็”ต่„‘ A ่ฟ่กŒ --initiator๏ผŒ่ฎฐๅฝ•ๆ˜พ็คบ็š„ CID');
191
- console.log(' 2. ๅœจ็”ต่„‘ B ่ฟ่กŒ --cid=<ไธŠไธ€ๆญฅ็š„CID>');
192
- console.log(' 3. ่ง‚ๅฏŸ P2P ่ฟžๆŽฅๅ’Œๆถˆๆฏๆ”ถๅ‘');
193
- }
194
- }
195
- main().catch(console.error);
@@ -1,69 +0,0 @@
1
- /**
2
- * P2P ๆŽฅๆ”ถ็ซฏๆต‹่ฏ• - ็”ต่„‘ B ไฝฟ็”จ CID ่งฃๆžๅนถ่ฟžๆŽฅ
3
- */
4
- import { irohTransport } from '../network/iroh-transport.js';
5
- async function main() {
6
- console.log('โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—');
7
- console.log('โ•‘ P2P ๆŽฅๆ”ถ็ซฏ - ่งฃๆž CID ๅนถ่ฟžๆŽฅ โ•‘');
8
- console.log('โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•');
9
- // ไปŽๅ‘ฝไปค่กŒ่Žทๅ–ๅ‚ๆ•ฐ
10
- const args = process.argv.slice(2);
11
- const cid = args.find(a => a.startsWith('--cid='))?.split('=')[1];
12
- const nodeId = args.find(a => a.startsWith('--node='))?.split('=')[1];
13
- if (!cid || !nodeId) {
14
- console.log('\n็”จๆณ•:');
15
- console.log(' npx tsx src/test/p2p-connect-receiver.ts --cid=<CID> --node=<iroh-node-id>');
16
- console.log('\n็คบไพ‹:');
17
- console.log(' npx tsx src/test/p2p-connect-receiver.ts \\');
18
- console.log(' --cid=QmXjU6RJZRgBphuMAD9gka2JMuEKvSutTLwsfHbrBb4JGQ \\');
19
- console.log(' --node=327914b4744c67e0dbe3307175b22d893e14413cd9ca7f1a5667d565702575b4');
20
- return;
21
- }
22
- console.log(`\n๐Ÿ“ก CID: ${cid}`);
23
- console.log(`๐Ÿ”— ็›ฎๆ ‡่Š‚็‚น: ${nodeId.substring(0, 20)}...`);
24
- // 1. ๅฏๅŠจ iroh
25
- console.log('\n[1] ๅฏๅŠจ iroh...');
26
- await irohTransport.start();
27
- const myNodeId = irohTransport.getNodeId();
28
- console.log(` โœ… ๆˆ‘็š„่Š‚็‚น ID: ${myNodeId}`);
29
- // 2. ่งฃๆž CID
30
- console.log('\n[2] ่งฃๆž DID ๆ–‡ๆกฃ...');
31
- try {
32
- const response = await fetch(`http://127.0.0.1:5001/api/v0/cat?arg=${cid}`, {
33
- method: 'POST'
34
- });
35
- const content = await response.text();
36
- const doc = JSON.parse(content);
37
- console.log(` โœ… ่งฃๆžๆˆๅŠŸ!`);
38
- console.log(` DID: ${doc.id}`);
39
- console.log(` ๅ็งฐ: ${doc.name || 'N/A'}`);
40
- }
41
- catch (e) {
42
- console.log(` โš ๏ธ ่งฃๆžๅคฑ่ดฅ๏ผˆๅฏ่ƒฝๅฏนๆ–น็ฆป็บฟ๏ผ‰: ${e.message}`);
43
- }
44
- // 3. ่ฎพ็ฝฎๆถˆๆฏ็›‘ๅฌ
45
- console.log('\n[3] ่ฎพ็ฝฎๆถˆๆฏ็›‘ๅฌ...');
46
- irohTransport.onMessage('chat', (msg) => {
47
- console.log(`\n ๐Ÿ’ฌ ๆ”ถๅˆฐๆถˆๆฏ from ${msg.from.substring(0, 16)}...`);
48
- console.log(` ๅ†…ๅฎน: ${new TextDecoder().decode(msg.payload)}`);
49
- // ๅ›žๅค
50
- const reply = `ACK from ${myNodeId?.substring(0, 8)}: ๅทฒๆ”ถๅˆฐ!`;
51
- irohTransport.sendMessage(msg.from, 'chat', new TextEncoder().encode(reply));
52
- console.log(` ๐Ÿ“ค ๅ‘้€ๅ›žๅค`);
53
- });
54
- console.log(' โœ… ็ญ‰ๅพ…ๆถˆๆฏ...');
55
- // 4. ๅฐ่ฏ•่ฟžๆŽฅๅนถๅ‘้€ๆถˆๆฏ
56
- console.log('\n[4] ๅฐ่ฏ•่ฟžๆŽฅ็›ฎๆ ‡่Š‚็‚น...');
57
- const success = await irohTransport.sendMessage(nodeId, 'chat', new TextEncoder().encode(`Hello from receiver at ${Date.now()}!`));
58
- if (success) {
59
- console.log(' โœ… ๆถˆๆฏๅ‘้€ๆˆๅŠŸ!');
60
- }
61
- else {
62
- console.log(' โš ๏ธ ๆถˆๆฏๅ‘้€ๅคฑ่ดฅ๏ผˆ็›ฎๆ ‡ๅฏ่ƒฝ็ฆป็บฟ๏ผ‰');
63
- console.log(' ๆถˆๆฏๅฐ†ๅœจๅฏนๆ–นไธŠ็บฟๆ—ถ่‡ชๅŠจ้€่พพ');
64
- }
65
- console.log('\n ็ญ‰ๅพ…ๆถˆๆฏ... (Ctrl+C ้€€ๅ‡บ)\n');
66
- // ไฟๆŒ่ฟ่กŒ
67
- await new Promise(() => { });
68
- }
69
- main().catch(console.error);