@bolloon/bolloon-agent 0.2.9 โ 0.2.10
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.
- package/README.md +467 -467
- package/bin/bolloon-cli.cjs +183 -183
- package/bin/bolloon.cjs +0 -0
- package/bin/bolloon.js +157 -0
- package/dist/agents/agent-manifest-protocol.js +0 -52
- package/dist/agents/constraint-layer.js +19 -19
- package/dist/agents/pi-sdk.js +287 -1213
- package/dist/agents/shell-guard.js +2 -2
- package/dist/agents/workflow-pivot-loop.js +2 -81
- package/dist/bollharness/src/scripts/deploy-guard.js +8 -8
- package/dist/bollharness-integration/context-router-judgment.js +4 -4
- package/dist/bollharness-integration/context-router.js +292 -292
- package/dist/bollharness-integration/gate-state-machine.js +13 -26
- package/dist/bollharness-integration/integration.js +0 -71
- package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
- package/dist/bollharness-integration/skill-adapter.js +127 -52
- package/dist/bootstrap/context-collector.js +3 -6
- package/dist/bootstrap/lifecycle-hooks.js +1 -15
- package/dist/cli-entry.js +35 -39
- package/dist/constraint-runtime/src/_archive_helper.js +9 -0
- package/dist/constraint-runtime/src/agent/coordinator.js +48 -0
- package/dist/constraint-runtime/src/agent/index.js +1 -0
- package/dist/constraint-runtime/src/assistant/index.js +12 -0
- package/dist/constraint-runtime/src/bootstrap/index.js +12 -0
- package/dist/constraint-runtime/src/bootstrap_graph.js +13 -0
- package/dist/constraint-runtime/src/bridge/index.js +12 -0
- package/dist/constraint-runtime/src/buddy/index.js +12 -0
- package/dist/constraint-runtime/src/cli/index.js +12 -0
- package/dist/constraint-runtime/src/command_graph.js +10 -0
- package/dist/constraint-runtime/src/commands.js +60 -0
- package/dist/constraint-runtime/src/components/index.js +12 -0
- package/dist/constraint-runtime/src/constants/index.js +12 -0
- package/dist/constraint-runtime/src/constraint/budget.js +22 -0
- package/dist/constraint-runtime/src/constraint/index.js +2 -0
- package/dist/constraint-runtime/src/constraint/permission.js +20 -0
- package/dist/constraint-runtime/src/context.js +30 -0
- package/dist/constraint-runtime/src/coordinator/index.js +12 -0
- package/dist/constraint-runtime/src/cost_hook.js +4 -0
- package/dist/constraint-runtime/src/cost_tracker.js +8 -0
- package/dist/constraint-runtime/src/deferred_init.js +10 -0
- package/dist/constraint-runtime/src/direct_modes.js +6 -0
- package/dist/constraint-runtime/src/dynamic-tool-loader.js +85 -0
- package/dist/constraint-runtime/src/entrypoints/index.js +12 -0
- package/dist/constraint-runtime/src/execution_registry.js +44 -0
- package/dist/constraint-runtime/src/history.js +9 -0
- package/dist/constraint-runtime/src/hooks/index.js +12 -0
- package/dist/constraint-runtime/src/index.js +26 -0
- package/dist/constraint-runtime/src/ink.js +4 -0
- package/dist/constraint-runtime/src/keybindings/index.js +12 -0
- package/dist/constraint-runtime/src/memdir/index.js +12 -0
- package/dist/constraint-runtime/src/migrations/index.js +12 -0
- package/dist/constraint-runtime/src/models.js +1 -0
- package/dist/constraint-runtime/src/moreright/index.js +12 -0
- package/dist/constraint-runtime/src/native_ts/index.js +12 -0
- package/dist/constraint-runtime/src/output_styles/index.js +12 -0
- package/dist/constraint-runtime/src/parity_audit.js +12 -0
- package/dist/constraint-runtime/src/plugins/index.js +12 -0
- package/dist/constraint-runtime/src/port_manifest.js +11 -0
- package/dist/constraint-runtime/src/prefetch.js +9 -0
- package/dist/constraint-runtime/src/query.js +1 -0
- package/dist/constraint-runtime/src/remote/index.js +12 -0
- package/dist/constraint-runtime/src/remote_runtime.js +9 -0
- package/dist/constraint-runtime/src/runtime/index.js +1 -0
- package/dist/constraint-runtime/src/runtime/session.js +35 -0
- package/dist/constraint-runtime/src/schemas/index.js +12 -0
- package/dist/constraint-runtime/src/screens/index.js +12 -0
- package/dist/constraint-runtime/src/server/index.js +12 -0
- package/dist/constraint-runtime/src/services/index.js +12 -0
- package/dist/constraint-runtime/src/session_store.js +22 -0
- package/dist/constraint-runtime/src/setup.js +30 -0
- package/dist/constraint-runtime/src/skills/index.js +1 -0
- package/dist/constraint-runtime/src/skills/skill-registry.js +28 -0
- package/dist/constraint-runtime/src/state/index.js +12 -0
- package/dist/constraint-runtime/src/system_init.js +20 -0
- package/dist/constraint-runtime/src/thinking/engine.js +42 -0
- package/dist/constraint-runtime/src/thinking/index.js +1 -0
- package/dist/constraint-runtime/src/tool_pool.js +8 -0
- package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +7 -0
- package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +7 -0
- package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +7 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +6 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +8 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +6 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +6 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +6 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +6 -0
- package/dist/constraint-runtime/src/tools.js +80 -0
- package/dist/constraint-runtime/src/transcript.js +19 -0
- package/dist/constraint-runtime/src/types/index.js +12 -0
- package/dist/constraint-runtime/src/upstream_proxy/index.js +12 -0
- package/dist/constraint-runtime/src/utils/index.js +12 -0
- package/dist/constraint-runtime/src/vim/index.js +12 -0
- package/dist/constraint-runtime/src/voice/index.js +12 -0
- package/dist/constraint-runtime/tests/agent.test.js +16 -0
- package/dist/constraint-runtime/tests/constraint.test.js +41 -0
- package/dist/constraint-runtime/tests/skill.test.js +19 -0
- package/dist/constraint-runtime/tests/thinking.test.js +22 -0
- package/dist/context-compaction/auto-compact.js +7 -7
- package/dist/electron-preload.js +1 -18
- package/dist/electron-preload.js.map +1 -1
- package/dist/electron.js +168 -3
- package/dist/electron.js.map +1 -1
- package/dist/index.js +116 -136
- package/dist/llm/config-store.js +8 -24
- package/dist/llm/llm-judgment-client.js +102 -102
- package/dist/llm/pi-ai.js +85 -126
- package/dist/llm/system-prompt/layers/channel/local.md +14 -14
- package/dist/llm/system-prompt/layers/channel/p2p-agent.md +18 -18
- package/dist/llm/system-prompt/layers/channel/p2p-visitor.md +19 -19
- package/dist/llm/system-prompt/layers/core/artifacts_storage.md +89 -89
- package/dist/llm/system-prompt/layers/core/evenhandedness.md +21 -21
- package/dist/llm/system-prompt/layers/core/hibs_reminders.md +15 -15
- package/dist/llm/system-prompt/layers/core/identity.md +37 -37
- package/dist/llm/system-prompt/layers/core/knowledge.md +17 -17
- package/dist/llm/system-prompt/layers/core/memory_system.md +12 -12
- package/dist/llm/system-prompt/layers/core/network_filesystem.md +28 -28
- package/dist/llm/system-prompt/layers/core/refusal.md +37 -37
- package/dist/llm/system-prompt/layers/core/tone.md +31 -31
- package/dist/llm/system-prompt/layers/core/tools.thin.md +13 -13
- package/dist/llm/system-prompt/layers/core/wellbeing.md +41 -41
- package/dist/llm/system-prompt/layers/role/architect.md +20 -20
- package/dist/llm/system-prompt/layers/role/expert.md +19 -19
- package/dist/llm/system-prompt/layers/role/implementer.md +15 -15
- package/dist/llm/system-prompt/layers/role/security.md +15 -15
- package/dist/llm/system-prompt/layers/tool/artifacts.md +72 -72
- package/dist/llm/system-prompt/layers/tool/bash.md +25 -25
- package/dist/llm/system-prompt/layers/tool/hibs_api.md +171 -171
- package/dist/llm/system-prompt/layers/tool/image_search.md +70 -70
- package/dist/llm/system-prompt/layers/tool/manifest.md +89 -89
- package/dist/llm/system-prompt/layers/tool/mcp_apps.md +53 -53
- package/dist/llm/system-prompt/layers/tool/web_search.md +83 -83
- package/dist/llm/tool-manifest/ask_user_input.js +1 -1
- package/dist/llm/tool-manifest/bash.js +3 -3
- package/dist/llm/tool-manifest/create_file.js +4 -4
- package/dist/llm/tool-manifest/fetch_sports_data.js +3 -3
- package/dist/llm/tool-manifest/image_search.js +2 -2
- package/dist/llm/tool-manifest/mcp.js +2 -2
- package/dist/llm/tool-manifest/message_compose.js +3 -3
- package/dist/llm/tool-manifest/places.js +2 -2
- package/dist/llm/tool-manifest/present_files.js +1 -1
- package/dist/llm/tool-manifest/recipe.js +2 -2
- package/dist/llm/tool-manifest/str_replace.js +5 -5
- package/dist/llm/tool-manifest/view.js +3 -3
- package/dist/llm/tool-manifest/weather.js +4 -4
- package/dist/llm/tool-manifest/web.js +4 -4
- package/dist/pi-ecosystem-colony/index.js +365 -0
- package/dist/pi-ecosystem-judgment/causal-judge.js +51 -51
- package/dist/pi-ecosystem-judgment/distill-prompt.js +42 -42
- package/dist/pi-ecosystem-judgment/distillation.js +14 -14
- package/dist/pi-ecosystem-judgment/monitor-gate.js +28 -28
- package/dist/pi-ecosystem-judgment/value-injection.js +102 -102
- package/dist/security/context-router-tool.js +15 -15
- package/dist/security/tool-gate.js +0 -11
- package/dist/social/ant-colony/AdaptiveHeartbeat.js +101 -0
- package/dist/social/ant-colony/PheromoneEngine.js +227 -0
- package/dist/social/ant-colony/index.js +6 -0
- package/dist/social/ant-colony/types.js +24 -0
- package/dist/test/ai-judgment-test.js +80 -0
- package/dist/test/bollharness-integration.test.js +318 -0
- package/dist/test/channel-agent-multi-dialogue.js +205 -0
- package/dist/test/channel-heartbeat-agent-test.js +201 -0
- package/dist/test/constraint-layer.test.js +164 -0
- package/dist/test/diap-identity-test.js +172 -0
- package/dist/test/diap-quick-test.js +62 -0
- package/dist/test/global-shared-context.test.js +315 -0
- package/dist/test/harness-judgment-injection.test.js +246 -0
- package/dist/test/harness-workflow-integrator-test.js +228 -0
- package/dist/test/human-value-store.test.js +243 -0
- package/dist/test/hybrid-integration-test.js +118 -0
- package/dist/test/hybrid-messenger-verify.js +55 -0
- package/dist/test/iroh-bistream-debug.js +38 -0
- package/dist/test/iroh-communication.test.js +66 -0
- package/dist/test/iroh-debug-test.js +57 -0
- package/dist/test/iroh-diap-test.js +71 -0
- package/dist/test/iroh-direct-connect.js +55 -0
- package/dist/test/iroh-e2e-fixed.js +89 -0
- package/dist/test/iroh-e2e-same-process.js +63 -0
- package/dist/test/iroh-e2e.js +66 -0
- package/dist/test/iroh-final-e2e.js +72 -0
- package/dist/test/iroh-relay-test.js +37 -0
- package/dist/test/iroh-simple-test.js +41 -0
- package/dist/test/iroh-transport-verify.js +54 -0
- package/dist/test/iroh-transport.test.js +37 -0
- package/dist/test/iroh-two-nodes.js +70 -0
- package/dist/test/iroh-verify.js +44 -0
- package/dist/test/judgment-decision.test.js +219 -0
- package/dist/test/llm-judgment-integration.test.js +220 -0
- package/dist/test/p2p-agent-complex-dialogue.js +385 -0
- package/dist/test/p2p-agent-dialogue.js +341 -0
- package/dist/test/p2p-agent-full-bidirectional.js +510 -0
- package/dist/test/p2p-agent-harness-flow.js +437 -0
- package/dist/test/p2p-agent-harness-single.js +143 -0
- package/dist/test/p2p-ai-dialogue-test.js +318 -0
- package/dist/test/p2p-cid-connect-test.js +195 -0
- package/dist/test/p2p-connect-receiver.js +69 -0
- package/dist/test/p2p-doc-transfer.js +110 -0
- package/dist/test/p2p-identity-page-test.js +77 -0
- package/dist/test/p2p-iroh-test.js +171 -0
- package/dist/test/p2p-minimal-test.js +241 -0
- package/dist/test/p2p-node-1.js +148 -0
- package/dist/test/p2p-node-2.js +148 -0
- package/dist/test/p2p-server.js +281 -0
- package/dist/test/p2p-two-nodes-test.js +438 -0
- package/dist/test/pi-sdk.test.js +44 -0
- package/dist/test/set-persona.js +40 -0
- package/dist/test/simple.test.js +9 -0
- package/dist/test/storage-integration.test.js +150 -0
- package/dist/test/subagent-manager.test.js +276 -0
- package/dist/test/test-gate-flow.test.js +81 -0
- package/dist/test/workflow-engine.test.js +87 -0
- package/dist/test/workflow-pivot-loop.test.js +246 -0
- package/dist/web/api-config.html +520 -520
- package/dist/web/client.js +2917 -3791
- package/dist/web/components/p2p/index.js +234 -276
- package/dist/web/components/wallet-viem.mjs +118 -118
- package/dist/web/index.html +374 -373
- package/dist/web/manifest.json +20 -20
- package/dist/web/server.js +23 -775
- package/dist/web/style.css +4737 -4737
- package/dist/web/ui/message-renderer.js +373 -451
- package/dist/web/ui/step-timeline.js +255 -351
- package/package.json +160 -160
- package/scripts/build-cli.js +215 -215
- package/scripts/build-web.ts +125 -125
- package/scripts/postinstall.js +152 -152
- package/bin/bolloon-daemon.sh +0 -207
- package/bin/ipfs +0 -0
- package/dist/agents/chat-segmenter.js +0 -298
- package/dist/agents/judgment-protocol.js +0 -479
- package/dist/agents/parse-tool-call.js +0 -304
- package/dist/agents/peer-manifest-loader.js +0 -210
- package/dist/agents/react-loop.js +0 -120
- package/dist/agents/session-store.js +0 -171
- package/dist/agents/tool-registry.js +0 -136
- package/dist/bootstrap/chat-archiver.js +0 -276
- package/dist/bootstrap/memory-compressor.js +0 -170
- package/dist/bootstrap/persona-loader.js +0 -94
- package/dist/electron/config.js +0 -16
- package/dist/electron/config.js.map +0 -1
- package/dist/electron/dialogs.js +0 -71
- package/dist/electron/dialogs.js.map +0 -1
- package/dist/electron/first-run.js +0 -129
- package/dist/electron/first-run.js.map +0 -1
- package/dist/electron/ipc.js +0 -16
- package/dist/electron/ipc.js.map +0 -1
- package/dist/electron/logger.js +0 -77
- package/dist/electron/logger.js.map +0 -1
- package/dist/electron/main.js +0 -60
- package/dist/electron/main.js.map +0 -1
- package/dist/electron/menu.js +0 -140
- package/dist/electron/menu.js.map +0 -1
- package/dist/electron/paths.js +0 -33
- package/dist/electron/paths.js.map +0 -1
- package/dist/electron/server.js +0 -74
- package/dist/electron/server.js.map +0 -1
- package/dist/electron/tray.js +0 -73
- package/dist/electron/tray.js.map +0 -1
- package/dist/electron/window.js +0 -69
- package/dist/electron/window.js.map +0 -1
- package/dist/network/local-inbox-bus.js +0 -73
- package/dist/network/p2p-outbox.js +0 -161
- package/dist/network/peer-fs.js +0 -420
- package/dist/network/peer-resource-bridge.js +0 -216
- package/dist/web/components/p2p/P2PModal.js +0 -188
- package/dist/web/components/p2p/p2p-modal.js +0 -664
- package/dist/web/components/p2p/p2p-tools.js +0 -248
- package/dist/web/input-validator.js +0 -103
- package/dist/web/util/safe-name.js +0 -32
|
@@ -0,0 +1,318 @@
|
|
|
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);
|
|
@@ -0,0 +1,195 @@
|
|
|
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);
|
|
@@ -0,0 +1,69 @@
|
|
|
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);
|