@bolloon/bolloon-agent 0.2.8 โ 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 -157
- package/scripts/build-cli.js +216 -0
- package/scripts/build-web.ts +125 -0
- package/scripts/postinstall.js +153 -0
- 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,110 @@
|
|
|
1
|
+
import { irohTransport } from '../network/iroh-transport.js';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
const args = process.argv.slice(2);
|
|
5
|
+
const role = args[0];
|
|
6
|
+
const targetNodeId = args[1];
|
|
7
|
+
if (!role || !['server', 'client'].includes(role)) {
|
|
8
|
+
console.log('Usage:');
|
|
9
|
+
console.log(' Server: npx tsx src/test/p2p-doc-transfer.ts server');
|
|
10
|
+
console.log(' Client: npx tsx src/test/p2p-doc-transfer.ts client <server-node-id>');
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
async function readDoc(filePath) {
|
|
14
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
15
|
+
return {
|
|
16
|
+
name: path.basename(filePath),
|
|
17
|
+
content,
|
|
18
|
+
size: Buffer.byteLength(content, 'utf-8'),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
async function runServer() {
|
|
22
|
+
console.log('[Server] Starting iroh transport for document transfer test...');
|
|
23
|
+
const node = await irohTransport.start();
|
|
24
|
+
console.log('[Server] Node ID:', node.nodeId);
|
|
25
|
+
console.log('[Server] Waiting for document transfers...\n');
|
|
26
|
+
let docCount = 0;
|
|
27
|
+
irohTransport.onMessage('doc-md', (msg) => {
|
|
28
|
+
docCount++;
|
|
29
|
+
const content = new TextDecoder().decode(msg.payload);
|
|
30
|
+
console.log(`[Server] #${docCount} MD Doc from ${msg.from.substring(0, 16)}...`);
|
|
31
|
+
console.log(`[Server] Size: ${content.length} bytes`);
|
|
32
|
+
console.log(`[Server] Preview: "${content.substring(0, 80)}..."`);
|
|
33
|
+
irohTransport.sendMessage(msg.from, 'ack-md', new TextEncoder().encode('md-received'));
|
|
34
|
+
});
|
|
35
|
+
irohTransport.onMessage('doc-yaml', (msg) => {
|
|
36
|
+
docCount++;
|
|
37
|
+
const content = new TextDecoder().decode(msg.payload);
|
|
38
|
+
console.log(`[Server] #${docCount} YAML Doc from ${msg.from.substring(0, 16)}...`);
|
|
39
|
+
console.log(`[Server] Size: ${content.length} bytes`);
|
|
40
|
+
console.log(`[Server] Preview: "${content.substring(0, 80)}..."`);
|
|
41
|
+
irohTransport.sendMessage(msg.from, 'ack-yaml', new TextEncoder().encode('yaml-received'));
|
|
42
|
+
});
|
|
43
|
+
irohTransport.onMessage('doc-html', (msg) => {
|
|
44
|
+
docCount++;
|
|
45
|
+
const content = new TextDecoder().decode(msg.payload);
|
|
46
|
+
console.log(`[Server] #${docCount} HTML Doc from ${msg.from.substring(0, 16)}...`);
|
|
47
|
+
console.log(`[Server] Size: ${content.length} bytes`);
|
|
48
|
+
console.log(`[Server] Preview: "${content.substring(0, 80)}..."`);
|
|
49
|
+
irohTransport.sendMessage(msg.from, 'ack-html', new TextEncoder().encode('html-received'));
|
|
50
|
+
});
|
|
51
|
+
console.log('[Server] Ready. Press Ctrl+C to stop.');
|
|
52
|
+
await new Promise(() => { });
|
|
53
|
+
}
|
|
54
|
+
async function runClient(targetId) {
|
|
55
|
+
if (!targetId) {
|
|
56
|
+
console.error('[Client] Error: target node ID required');
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
console.log('[Client] Starting iroh transport for document transfer test...');
|
|
60
|
+
const node = await irohTransport.start();
|
|
61
|
+
console.log('[Client] Node ID:', node.nodeId);
|
|
62
|
+
console.log('[Client] Target:', targetId);
|
|
63
|
+
console.log('');
|
|
64
|
+
const acks = { md: false, yaml: false, html: false };
|
|
65
|
+
irohTransport.onMessage('ack-md', (msg) => {
|
|
66
|
+
console.log(`[Client] โ
MD doc acknowledged by server`);
|
|
67
|
+
acks.md = true;
|
|
68
|
+
});
|
|
69
|
+
irohTransport.onMessage('ack-yaml', (msg) => {
|
|
70
|
+
console.log(`[Client] โ
YAML doc acknowledged by server`);
|
|
71
|
+
acks.yaml = true;
|
|
72
|
+
});
|
|
73
|
+
irohTransport.onMessage('ack-html', (msg) => {
|
|
74
|
+
console.log(`[Client] โ
HTML doc acknowledged by server`);
|
|
75
|
+
acks.html = true;
|
|
76
|
+
});
|
|
77
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
78
|
+
console.log('[Client] Loading test documents...\n');
|
|
79
|
+
const testDocs = [
|
|
80
|
+
{ type: 'doc-md', path: 'src/bollharness/docs/practice.md', label: 'MD' },
|
|
81
|
+
{ type: 'doc-yaml', path: 'src/bollharness/.boll/MANIFEST.yaml', label: 'YAML' },
|
|
82
|
+
{ type: 'doc-html', path: 'src/web/index.html', label: 'HTML' },
|
|
83
|
+
];
|
|
84
|
+
for (const doc of testDocs) {
|
|
85
|
+
try {
|
|
86
|
+
const docInfo = await readDoc(doc.path);
|
|
87
|
+
console.log(`[Client] Sending ${doc.label} document: ${docInfo.name} (${docInfo.size} bytes)`);
|
|
88
|
+
const success = await irohTransport.sendMessage(targetId, doc.type, new TextEncoder().encode(docInfo.content));
|
|
89
|
+
console.log(`[Client] Send result: ${success ? 'โ
SUCCESS' : 'โ FAILED'}`);
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
console.log(`[Client] โ Error sending ${doc.label}: ${e.message}`);
|
|
93
|
+
}
|
|
94
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
95
|
+
}
|
|
96
|
+
console.log('\n[Client] Waiting for acknowledgements...');
|
|
97
|
+
await new Promise(resolve => setTimeout(resolve, 3000));
|
|
98
|
+
console.log('\n=== Test Summary ===');
|
|
99
|
+
console.log(` MD document: ${acks.md ? 'โ
Acknowledged' : 'โ Not acknowledged'}`);
|
|
100
|
+
console.log(` YAML document: ${acks.yaml ? 'โ
Acknowledged' : 'โ Not acknowledged'}`);
|
|
101
|
+
console.log(` HTML document: ${acks.html ? 'โ
Acknowledged' : 'โ Not acknowledged'}`);
|
|
102
|
+
await irohTransport.shutdown();
|
|
103
|
+
console.log('[Client] Done');
|
|
104
|
+
}
|
|
105
|
+
if (role === 'server') {
|
|
106
|
+
runServer();
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
runClient(targetNodeId);
|
|
110
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* P2P Identity Page Test with Playwright
|
|
3
|
+
* ๆต่ฏ P2P ่บซไปฝ้กต้ข๏ผๆพ็คบ DIDใCID ็ญไฟกๆฏ
|
|
4
|
+
*/
|
|
5
|
+
import { chromium } from 'playwright';
|
|
6
|
+
async function testP2PIdentityPage() {
|
|
7
|
+
console.log('=== P2P Identity Page Test ===\n');
|
|
8
|
+
const browser = await chromium.launch({ headless: true });
|
|
9
|
+
const context = await browser.newContext();
|
|
10
|
+
const page = await context.newPage();
|
|
11
|
+
try {
|
|
12
|
+
// 1. ๆๅผ Bolloon ็ฝ้กต
|
|
13
|
+
console.log('1. ๆๅผ Bolloon ็ฝ้กต...');
|
|
14
|
+
await page.goto('http://localhost:54188', {
|
|
15
|
+
waitUntil: 'domcontentloaded',
|
|
16
|
+
timeout: 60000
|
|
17
|
+
});
|
|
18
|
+
// 2. ๅๅงๅ iroh
|
|
19
|
+
console.log('2. ๅๅงๅ iroh...');
|
|
20
|
+
const irohInit = await page.evaluate(async () => {
|
|
21
|
+
const res = await fetch('/api/iroh/init', { method: 'POST' });
|
|
22
|
+
return res.json();
|
|
23
|
+
});
|
|
24
|
+
console.log(' iroh ๅๅงๅ็ปๆ:');
|
|
25
|
+
console.log(' - DID:', irohInit.did?.substring(0, 30) + '...');
|
|
26
|
+
console.log(' - CID:', irohInit.cid);
|
|
27
|
+
console.log(' - Initialized:', irohInit.initialized);
|
|
28
|
+
// 3. ๆๅผ P2P Modal
|
|
29
|
+
console.log('\n3. ๆๅผ P2P Modal...');
|
|
30
|
+
// ๅๅงๅ iroh๏ผ่ฟไผ่งฆๅ CID ็ๆ๏ผ
|
|
31
|
+
await page.evaluate(async () => {
|
|
32
|
+
await fetch('/api/iroh/init', { method: 'POST' });
|
|
33
|
+
});
|
|
34
|
+
await page.waitForTimeout(1000);
|
|
35
|
+
// ๆๅผ P2P Modal ้่ฟ็นๅปๆ้ฎ
|
|
36
|
+
await page.evaluate(() => {
|
|
37
|
+
const btn = document.querySelector('#p2p-network-btn');
|
|
38
|
+
if (btn)
|
|
39
|
+
btn.click();
|
|
40
|
+
});
|
|
41
|
+
await page.waitForTimeout(3000);
|
|
42
|
+
// 4. ่ทๅ่บซไปฝไฟกๆฏๆพ็คบ
|
|
43
|
+
console.log('\n4. ่ทๅ่บซไปฝไฟกๆฏ...');
|
|
44
|
+
// ่ทๅ modal HTML ็ปๆ็จไบ่ฐ่ฏ
|
|
45
|
+
const modalHtml = await page.evaluate(() => {
|
|
46
|
+
const modal = document.querySelector('.p2p-modal');
|
|
47
|
+
return modal ? modal.outerHTML : 'Modal not found';
|
|
48
|
+
});
|
|
49
|
+
console.log('\n Modal HTML:');
|
|
50
|
+
console.log(' ', modalHtml.substring(0, 1000));
|
|
51
|
+
// ๆฃๆฅ p2p-info-row ไธญ็ label ๅ
ๅฎน
|
|
52
|
+
const labels = await page.evaluate(() => {
|
|
53
|
+
return Array.from(document.querySelectorAll('.p2p-info-row .label')).map(el => el.textContent);
|
|
54
|
+
});
|
|
55
|
+
console.log('\n Labels found:', labels);
|
|
56
|
+
// ๆฃๆฅๆฏๅฆๆ CID
|
|
57
|
+
const hasCidRow = await page.evaluate(() => {
|
|
58
|
+
const rows = document.querySelectorAll('.p2p-info-row');
|
|
59
|
+
for (const row of rows) {
|
|
60
|
+
const label = row.querySelector('.label')?.textContent;
|
|
61
|
+
if (label?.includes('CID'))
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
});
|
|
66
|
+
console.log(' CID row exists:', hasCidRow);
|
|
67
|
+
console.log('\n=== ๆต่ฏๅฎๆ ===');
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
console.error('ๆต่ฏๅคฑ่ดฅ:', error);
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
await browser.close();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// ่ฟ่กๆต่ฏ
|
|
77
|
+
testP2PIdentityPage().catch(console.error);
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* P2P iroh ๆต่ฏ - ้่ฟ CID ่งฃๆ DID ๆๆกฃๅนถไฝฟ็จ iroh ๅปบ็ซ่ฟๆฅ
|
|
3
|
+
*
|
|
4
|
+
* ๆต็จ:
|
|
5
|
+
* 1. ็ๆ DID โ ๅๅธๅฐ IPFS โ ่ทๅพ CID
|
|
6
|
+
* 2. ้่ฟ CID ไป IPFS ่งฃๆ DID ๆๆกฃ
|
|
7
|
+
* 3. ไฝฟ็จ iroh ็ดๆฅ้่ฟ Node ID ่ฟๆฅ
|
|
8
|
+
*/
|
|
9
|
+
import { KeyManager, AgentAuthManager } from '@diap/sdk';
|
|
10
|
+
import { irohTransport } from '../network/iroh-transport.js';
|
|
11
|
+
const IPFS_ENDPOINT = 'http://127.0.0.1:5001';
|
|
12
|
+
// ============================================================
|
|
13
|
+
// ๆญฅ้ชค 1: ๅๅธ DID ๅฐ IPFS
|
|
14
|
+
// ============================================================
|
|
15
|
+
async function publishDIDToIPFS(name) {
|
|
16
|
+
console.log('\n[ๆญฅ้ชค 1] ๅๅธ DID ๅฐ IPFS...');
|
|
17
|
+
// ็ๆ DID
|
|
18
|
+
const keyPair = KeyManager.generate();
|
|
19
|
+
const did = keyPair.did;
|
|
20
|
+
console.log(` โ
DID ็ๆ: ${did}`);
|
|
21
|
+
// ่ทๅๅทฒๆ็ iroh Node ID
|
|
22
|
+
const irohNodeId = irohTransport.getNodeId();
|
|
23
|
+
console.log(` โ
iroh ่็น ID: ${irohNodeId}`);
|
|
24
|
+
// ๅๅธ DID ๅฐ IPFS๏ผไฝฟ็จ AgentAuthManager๏ผ
|
|
25
|
+
const authManager = await AgentAuthManager.newWithRemoteIpfs(IPFS_ENDPOINT, IPFS_ENDPOINT);
|
|
26
|
+
const result = await authManager.registerAgent({ name, services: [] }, keyPair, '');
|
|
27
|
+
console.log(` โ
IPFS CID: ${result.cid}`);
|
|
28
|
+
return {
|
|
29
|
+
did,
|
|
30
|
+
name,
|
|
31
|
+
cid: result.cid || '',
|
|
32
|
+
irohNodeId: irohNodeId || '',
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// ============================================================
|
|
36
|
+
// ๆญฅ้ชค 2: ไป CID ่งฃๆ DID ๆๆกฃ
|
|
37
|
+
// ============================================================
|
|
38
|
+
async function resolveDIDFromIPFS(cid) {
|
|
39
|
+
console.log('\n[ๆญฅ้ชค 2] ไป IPFS ่งฃๆ DID ๆๆกฃ...');
|
|
40
|
+
try {
|
|
41
|
+
// ็ดๆฅไฝฟ็จ fetch ่ทๅ
|
|
42
|
+
const response = await fetch(`${IPFS_ENDPOINT}/api/v0/cat?arg=${cid}`, {
|
|
43
|
+
method: 'POST'
|
|
44
|
+
});
|
|
45
|
+
const content = await response.text();
|
|
46
|
+
const doc = JSON.parse(content);
|
|
47
|
+
console.log(` โ
DID ๆๆกฃ่งฃๆๆๅ`);
|
|
48
|
+
console.log(` DID: ${doc.id}`);
|
|
49
|
+
console.log(` ๅ็งฐ: ${doc.name || 'N/A'}`);
|
|
50
|
+
return {
|
|
51
|
+
did: doc.id,
|
|
52
|
+
name: doc.name || 'Unknown',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
console.log(` โ ่งฃๆๅคฑ่ดฅ: ${e.message}`);
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// ============================================================
|
|
61
|
+
// ๆญฅ้ชค 3: ้่ฟ iroh ่ฟๆฅๅนถๅ้ๆถๆฏ
|
|
62
|
+
// ============================================================
|
|
63
|
+
async function connectAndMessage(targetNodeId, message) {
|
|
64
|
+
console.log('\n[ๆญฅ้ชค 3] ้่ฟ iroh ๅ้ๆถๆฏ...');
|
|
65
|
+
console.log(` ๐ค ็ฎๆ ่็น: ${targetNodeId.substring(0, 20)}...`);
|
|
66
|
+
console.log(` ๐ ๆถๆฏ: ${message}`);
|
|
67
|
+
const success = await irohTransport.sendMessage(targetNodeId, 'chat', new TextEncoder().encode(message));
|
|
68
|
+
if (success) {
|
|
69
|
+
console.log(' โ
ๆถๆฏๅ้ๆๅ');
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
console.log(' โ ๏ธ ๆถๆฏๅ้ๅคฑ่ดฅ๏ผๅฏนๆนๅฏ่ฝไธๅจ็บฟ๏ผ');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// ============================================================
|
|
76
|
+
// ๆฅๆถๆถๆฏๅค็
|
|
77
|
+
// ============================================================
|
|
78
|
+
function setupMessageHandler() {
|
|
79
|
+
console.log('\n[็ๅฌ] ่ฎพ็ฝฎๆถๆฏๅค็ๅจ...');
|
|
80
|
+
irohTransport.onMessage('chat', (msg) => {
|
|
81
|
+
const content = new TextDecoder().decode(msg.payload);
|
|
82
|
+
console.log(`\n ๐ฌ ๆถๅฐๆถๆฏ from ${msg.from.substring(0, 12)}...: ${content}`);
|
|
83
|
+
// ๅๅค
|
|
84
|
+
const reply = `ACK: ๅทฒๆถๅฐ "${content.substring(0, 30)}..."`;
|
|
85
|
+
irohTransport.sendMessage(msg.from, 'chat', new TextEncoder().encode(reply));
|
|
86
|
+
console.log(` ๐ค ๅ้ๅๅค: ${reply}`);
|
|
87
|
+
});
|
|
88
|
+
irohTransport.onMessage('*', (msg) => {
|
|
89
|
+
console.log(`\n ๐ฉ ๆถๅฐๆช็ฅ็ฑปๅๆถๆฏ [${msg.type}] from ${msg.from.substring(0, 12)}...`);
|
|
90
|
+
});
|
|
91
|
+
console.log(' โ
ๆถๆฏๅค็ๅจๅทฒ่ฎพ็ฝฎ');
|
|
92
|
+
}
|
|
93
|
+
// ============================================================
|
|
94
|
+
// ไธปๆต่ฏๆต็จ
|
|
95
|
+
// ============================================================
|
|
96
|
+
async function main() {
|
|
97
|
+
console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
98
|
+
console.log('โ P2P iroh ๆต่ฏ - CID ่งฃๆ + ็ดๆฅ Node ID ่ฟๆฅ โ');
|
|
99
|
+
console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
100
|
+
const args = process.argv.slice(2);
|
|
101
|
+
const isPublisher = args.includes('--publish');
|
|
102
|
+
const targetCid = args.find(a => a.startsWith('--cid='))?.split('=')[1];
|
|
103
|
+
const targetNodeId = args.find(a => a.startsWith('--node='))?.split('=')[1];
|
|
104
|
+
const testMessage = args.find(a => a.startsWith('--msg='))?.split('=')[1] || 'Hello from iroh!';
|
|
105
|
+
// ๅๅงๅ iroh๏ผๆๆๆจกๅผ้ฝ้่ฆ๏ผ
|
|
106
|
+
console.log('\n[ๅๅงๅ] ๅฏๅจ iroh transport...');
|
|
107
|
+
try {
|
|
108
|
+
await irohTransport.start(undefined, false);
|
|
109
|
+
console.log(' โ
iroh transport ๅทฒๅฏๅจ');
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
console.log(` โ iroh ๅฏๅจๅคฑ่ดฅ: ${e.message}`);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
// ่ฎพ็ฝฎๆถๆฏๅค็ๅจ
|
|
116
|
+
setupMessageHandler();
|
|
117
|
+
// ๆจกๅผ 1: ๅๅธ DID๏ผ็ต่ A๏ผ
|
|
118
|
+
if (isPublisher) {
|
|
119
|
+
const agentName = `bolloon-${Date.now()}`;
|
|
120
|
+
const info = await publishDIDToIPFS(agentName);
|
|
121
|
+
console.log('\nโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
122
|
+
console.log(' ๐ ๅไบซ็ปๅฆไธๅฐ็ต่็ไฟกๆฏ:');
|
|
123
|
+
console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
124
|
+
console.log(` DID: ${info.did}`);
|
|
125
|
+
console.log(` CID: ${info.cid}`);
|
|
126
|
+
console.log(` iroh Node ID: ${info.irohNodeId}`);
|
|
127
|
+
console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
128
|
+
console.log('\n ็จๆณ:');
|
|
129
|
+
console.log(` ็ต่ B: npx tsx src/test/p2p-iroh-test.ts --cid=${info.cid} --node=${info.irohNodeId}`);
|
|
130
|
+
console.log('\n ็ญๅพ
ๆถๆฏ... (Ctrl+C ้ๅบ)\n');
|
|
131
|
+
// ไฟๆ่ฟ่ก
|
|
132
|
+
await new Promise(() => { });
|
|
133
|
+
}
|
|
134
|
+
// ๆจกๅผ 2: ่งฃๆ CID ๅนถ่ฟๆฅ๏ผ็ต่ B๏ผ
|
|
135
|
+
else if (targetCid) {
|
|
136
|
+
const resolved = await resolveDIDFromIPFS(targetCid);
|
|
137
|
+
if (!resolved) {
|
|
138
|
+
console.log('โ ๆ ๆณ่งฃๆ DID ๆๆกฃ');
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// ๅฆๆๆไพไบ Node ID๏ผ็ดๆฅ่ฟๆฅ
|
|
142
|
+
if (targetNodeId) {
|
|
143
|
+
console.log(`\n ๐ฏ ่ฟๆฅๅฐ่็น: ${targetNodeId.substring(0, 20)}...`);
|
|
144
|
+
await connectAndMessage(targetNodeId, testMessage);
|
|
145
|
+
console.log('\n ็ญๅพ
ๅๅค... (5็งๅ้ๅบ)');
|
|
146
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
console.log(`\n โ ๏ธ DID ๆๆกฃๅทฒ่งฃๆ๏ผไฝ้่ฆ Node ID ๆ่ฝ่ฟๆฅ`);
|
|
150
|
+
console.log(` DID: ${resolved.did}`);
|
|
151
|
+
console.log(` ๅ็งฐ: ${resolved.name}`);
|
|
152
|
+
console.log('\n ๆณจๆ: DID ๆๆกฃไธญ้่ฆๅ
ๅซ iroh Node ID ไฟกๆฏ');
|
|
153
|
+
console.log(' ่ฏทไฝฟ็จ --node=<iroh-node-id> ๅๆฐ็ดๆฅๆๅฎ่็น ID');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// ๅธฎๅฉไฟกๆฏ
|
|
157
|
+
else {
|
|
158
|
+
console.log('\n็จๆณ:');
|
|
159
|
+
console.log('');
|
|
160
|
+
console.log(' ็ต่ A (ๅๅธๆน):');
|
|
161
|
+
console.log(' npx tsx src/test/p2p-iroh-test.ts --publish');
|
|
162
|
+
console.log('');
|
|
163
|
+
console.log(' ็ต่ B (่ฟๆฅๆน):');
|
|
164
|
+
console.log(' npx tsx src/test/p2p-iroh-test.ts --cid=<CID> --node=<iroh-node-id> --msg=<ๆถๆฏ>');
|
|
165
|
+
console.log('');
|
|
166
|
+
console.log('็คบไพ:');
|
|
167
|
+
console.log(' A: npx tsx src/test/p2p-iroh-test.ts --publish');
|
|
168
|
+
console.log(' B: npx tsx src/test/p2p-iroh-test.ts --cid=QmXXX --node=xyz123 --msg="Hello!"');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* P2P Minimal Test - ๅคๆญๅๆบ่ฝไฝ P2P ้ไฟกๆต่ฏ
|
|
3
|
+
*
|
|
4
|
+
* ่ฟ่กๆนๅผ:
|
|
5
|
+
* ็ต่ A: npx tsx src/test/p2p-minimal-test.ts
|
|
6
|
+
* ็ต่ B: npx tsx src/test/p2p-minimal-test.ts --connect <็ต่A็NodeId>
|
|
7
|
+
*
|
|
8
|
+
* ๆต่ฏๆต็จ:
|
|
9
|
+
* 1. ็ๆ DIAP ่บซไปฝ
|
|
10
|
+
* 2. ๅๅธ DID ๅฐ IPFS
|
|
11
|
+
* 3. ่ฟๆฅๅฏนๆน่็น๏ผๆ็ญๅพ
่ฟๆฅ๏ผ
|
|
12
|
+
* 4. ไบคๆข AI ๆถๆฏ๏ผๅธฆๅคๆญๅๆณจๅ
ฅ๏ผ
|
|
13
|
+
*/
|
|
14
|
+
import crypto from 'node:crypto';
|
|
15
|
+
import readline from 'node:readline';
|
|
16
|
+
import { KeyManager } from '@diap/sdk';
|
|
17
|
+
import { createHyperswarmCommunicator, createTopic } from '@diap/sdk';
|
|
18
|
+
const IPFS_API = 'http://127.0.0.1:5001';
|
|
19
|
+
const IPFS_GATEWAY = 'http://127.0.0.1:8080';
|
|
20
|
+
function parseArgs() {
|
|
21
|
+
const args = process.argv.slice(2);
|
|
22
|
+
const connectIdx = args.indexOf('--connect');
|
|
23
|
+
return {
|
|
24
|
+
connectTo: connectIdx >= 0 ? args[connectIdx + 1] : undefined
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
async function main() {
|
|
28
|
+
console.log('\nโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
29
|
+
console.log('โ P2P Minimal Test - ๅคๆญๅๆบ่ฝไฝ P2P ้ไฟก โ');
|
|
30
|
+
console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n');
|
|
31
|
+
const args = parseArgs();
|
|
32
|
+
// 1. ็ๆ DIAP ่บซไปฝ
|
|
33
|
+
console.log('[1/5] ็ๆ DIAP ่บซไปฝ...');
|
|
34
|
+
const keyManager = KeyManager.generate();
|
|
35
|
+
const did = keyManager.did;
|
|
36
|
+
const username = process.env.USER || process.env.USERNAME || 'user';
|
|
37
|
+
const agentName = `blln-${username.toLowerCase()}-${did.split(':').pop()?.substring(0, 4)}`;
|
|
38
|
+
console.log(` DID: ${did}`);
|
|
39
|
+
console.log(` ๅ็งฐ: ${agentName}`);
|
|
40
|
+
// 2. ๆณจๅๅฐ IPFS
|
|
41
|
+
console.log('\n[2/5] ๆณจๅ DID ๅฐ IPFS...');
|
|
42
|
+
let ipfsCid = null;
|
|
43
|
+
try {
|
|
44
|
+
const { AgentAuthManager } = await import('@diap/sdk');
|
|
45
|
+
const authManager = await AgentAuthManager.newWithRemoteIpfs(IPFS_API, IPFS_GATEWAY);
|
|
46
|
+
const result = await authManager.registerAgent({ name: agentName, services: [] }, keyManager, '');
|
|
47
|
+
ipfsCid = result.cid || null;
|
|
48
|
+
console.log(` โ
IPFS CID: ${ipfsCid || 'ๆช่ทๅๅฐ'}`);
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
console.log(` โ ๏ธ IPFS ๆณจๅๅคฑ่ดฅ๏ผๆฌๅฐๆจกๅผ็ปง็ปญ๏ผ: ${e.message}`);
|
|
52
|
+
}
|
|
53
|
+
// 3. ๅๅปบ P2P ้ไฟกๅจ
|
|
54
|
+
console.log('\n[3/5] ๅๅงๅ P2P ็ฝ็ป...');
|
|
55
|
+
const rawSeed = crypto.getRandomValues(new Uint8Array(32));
|
|
56
|
+
const comm = createHyperswarmCommunicator({
|
|
57
|
+
server: true,
|
|
58
|
+
client: true,
|
|
59
|
+
autoConnect: true,
|
|
60
|
+
maxConnections: 10,
|
|
61
|
+
seed: rawSeed
|
|
62
|
+
});
|
|
63
|
+
const topic = createTopic('bolloon-judgment-test-v1');
|
|
64
|
+
await comm.joinTopic(topic);
|
|
65
|
+
console.log(` โ
ๅทฒๅ ๅ
ฅไธป้ข: ${topic.slice(0, 8).toString('hex')}...`);
|
|
66
|
+
console.log(` ๐ ไฝ ็่็น ID: ${comm.publicKey?.substring(0, 16) || '็ๆไธญ...'}`);
|
|
67
|
+
// ๆถๆฏๅค็
|
|
68
|
+
const messageQueue = [];
|
|
69
|
+
let peerConnection = null;
|
|
70
|
+
comm.on('connection', (conn) => {
|
|
71
|
+
const shortKey = conn.publicKey.substring(0, 8);
|
|
72
|
+
console.log(`\n ๐ ๆฐ่ฟๆฅ: ${shortKey}...`);
|
|
73
|
+
if (!peerConnection) {
|
|
74
|
+
peerConnection = conn;
|
|
75
|
+
console.log(' โ
ๅทฒๅปบ็ซ่ฟๆฅ');
|
|
76
|
+
}
|
|
77
|
+
// ๅ้ hello
|
|
78
|
+
const hello = {
|
|
79
|
+
type: 'hello',
|
|
80
|
+
from: agentName,
|
|
81
|
+
content: `ไฝ ๅฅฝ๏ผๆๆฏ ${agentName}`,
|
|
82
|
+
timestamp: Date.now()
|
|
83
|
+
};
|
|
84
|
+
sendMessage(conn, hello);
|
|
85
|
+
});
|
|
86
|
+
comm.on('message', (msg, conn) => {
|
|
87
|
+
const content = new TextDecoder().decode(msg.content);
|
|
88
|
+
try {
|
|
89
|
+
const data = JSON.parse(content);
|
|
90
|
+
handleMessage(data, conn);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
console.log(`\n ๐ฉ ๆถๅฐๅๅงๆถๆฏ: ${content.substring(0, 100)}`);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
// ่ฟๆฅ่ฟ็จ่็น
|
|
97
|
+
if (args.connectTo) {
|
|
98
|
+
console.log(`\n[4/5] ่ฟๆฅๅฐ่ฟ็จ่็น: ${args.connectTo}...`);
|
|
99
|
+
try {
|
|
100
|
+
await comm.joinPeer(args.connectTo);
|
|
101
|
+
console.log(' โ
่ฟๆฅ่ฏทๆฑๅทฒๅ้๏ผ็ญๅพ
ๅฏนๆนๅๅบ...');
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
console.log(` โ ๏ธ ่ฟๆฅๅคฑ่ดฅ: ${e.message}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
console.log('\n[4/5] ็ญๅพ
่ฟๆฅ...');
|
|
109
|
+
}
|
|
110
|
+
// 5. ไบคไบ็้ข
|
|
111
|
+
console.log('\n[5/5] P2P ไบคไบๆจกๅผ');
|
|
112
|
+
console.log(' โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
113
|
+
console.log(' ่พๅ
ฅๆถๆฏๅ้ๅฐๅฏนๆน๏ผๆ่พๅ
ฅไปฅไธๅฝไปค:');
|
|
114
|
+
console.log(' /peers - ๆฅ็ๅทฒ่ฟๆฅ่็น');
|
|
115
|
+
console.log(' /cid - ๆพ็คบๆฌๆบ IPFS CID');
|
|
116
|
+
console.log(' /nodeid - ๆพ็คบๆฌๆบ่็น ID');
|
|
117
|
+
console.log(' /quit - ้ๅบ');
|
|
118
|
+
console.log(' โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n');
|
|
119
|
+
const rl = readline.createInterface({
|
|
120
|
+
input: process.stdin,
|
|
121
|
+
output: process.stdout
|
|
122
|
+
});
|
|
123
|
+
const prompt = () => {
|
|
124
|
+
rl.question(`[${agentName}] > `, async (input) => {
|
|
125
|
+
const trimmed = input.trim();
|
|
126
|
+
if (trimmed === '/quit') {
|
|
127
|
+
console.log('ๅ่ง๏ผ');
|
|
128
|
+
rl.close();
|
|
129
|
+
process.exit(0);
|
|
130
|
+
}
|
|
131
|
+
else if (trimmed === '/peers') {
|
|
132
|
+
const connections = comm.connections;
|
|
133
|
+
if (connections) {
|
|
134
|
+
console.log(` ๅทฒ่ฟๆฅ่็นๆฐ: ${connections.size}`);
|
|
135
|
+
for (const [k, v] of connections) {
|
|
136
|
+
console.log(` - ${v.publicKey?.substring(0, 16) || k}...`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
console.log(' ๆๆ ่ฟๆฅ');
|
|
141
|
+
}
|
|
142
|
+
prompt();
|
|
143
|
+
}
|
|
144
|
+
else if (trimmed === '/cid') {
|
|
145
|
+
console.log(` IPFS CID: ${ipfsCid || 'ๆชๆณจๅ'}`);
|
|
146
|
+
prompt();
|
|
147
|
+
}
|
|
148
|
+
else if (trimmed === '/nodeid') {
|
|
149
|
+
const nodeId = comm.publicKey;
|
|
150
|
+
console.log(` ่็น ID: ${nodeId || '็ๆไธญ'}`);
|
|
151
|
+
prompt();
|
|
152
|
+
}
|
|
153
|
+
else if (trimmed) {
|
|
154
|
+
// ๅ้ๆถๆฏ
|
|
155
|
+
if (peerConnection) {
|
|
156
|
+
const msg = {
|
|
157
|
+
type: 'message',
|
|
158
|
+
from: agentName,
|
|
159
|
+
content: trimmed,
|
|
160
|
+
timestamp: Date.now()
|
|
161
|
+
};
|
|
162
|
+
sendMessage(peerConnection, msg);
|
|
163
|
+
console.log(` โ
ๆถๆฏๅทฒๅ้`);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
console.log(' โ ๏ธ ๆๆ ่ฟๆฅ๏ผๆถๆฏๅทฒๅ ๅ
ฅ้ๅ');
|
|
167
|
+
messageQueue.push({
|
|
168
|
+
type: 'message',
|
|
169
|
+
from: agentName,
|
|
170
|
+
content: trimmed,
|
|
171
|
+
timestamp: Date.now()
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
prompt();
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
prompt();
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
};
|
|
181
|
+
// ๅฎๆๆฃๆฅ่ฟๆฅ
|
|
182
|
+
setInterval(() => {
|
|
183
|
+
if (!peerConnection) {
|
|
184
|
+
const connections = comm.connections;
|
|
185
|
+
if (connections && connections.size > 0) {
|
|
186
|
+
for (const [k, v] of connections) {
|
|
187
|
+
const conn = v;
|
|
188
|
+
if (conn && conn.publicKey) {
|
|
189
|
+
peerConnection = conn;
|
|
190
|
+
console.log('\n ๐ ๆฃๆตๅฐๆฐ่ฟๆฅ๏ผ');
|
|
191
|
+
// ๅ้้ๅไธญ็ๆถๆฏ
|
|
192
|
+
while (messageQueue.length > 0) {
|
|
193
|
+
const queued = messageQueue.shift();
|
|
194
|
+
sendMessage(peerConnection, queued);
|
|
195
|
+
}
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}, 2000);
|
|
202
|
+
prompt();
|
|
203
|
+
}
|
|
204
|
+
function sendMessage(conn, msg) {
|
|
205
|
+
const data = JSON.stringify(msg);
|
|
206
|
+
conn.send(new TextEncoder().encode(data));
|
|
207
|
+
}
|
|
208
|
+
function handleMessage(msg, conn) {
|
|
209
|
+
switch (msg.type) {
|
|
210
|
+
case 'hello':
|
|
211
|
+
console.log(`\n ๐ ๆถๅฐ้ฎๅ: ${msg.content}`);
|
|
212
|
+
break;
|
|
213
|
+
case 'message':
|
|
214
|
+
console.log(`\n ๐ฌ ${msg.from}: ${msg.content}`);
|
|
215
|
+
// ่ชๅจๅๅค
|
|
216
|
+
const response = {
|
|
217
|
+
type: 'response',
|
|
218
|
+
from: 'bot',
|
|
219
|
+
content: `[่ชๅจๅๅค] ๆถๅฐไฝ ็ๆถๆฏ: "${msg.content?.substring(0, 50)}..."`,
|
|
220
|
+
timestamp: Date.now()
|
|
221
|
+
};
|
|
222
|
+
sendMessage(conn, response);
|
|
223
|
+
break;
|
|
224
|
+
case 'response':
|
|
225
|
+
console.log(`\n ๐ค ${msg.from}: ${msg.content}`);
|
|
226
|
+
break;
|
|
227
|
+
case 'ping':
|
|
228
|
+
console.log(`\n ๐ ๆถๅฐ Ping`);
|
|
229
|
+
sendMessage(conn, { type: 'pong', from: 'bot', timestamp: Date.now() });
|
|
230
|
+
break;
|
|
231
|
+
case 'pong':
|
|
232
|
+
console.log(`\n ๐ ๆถๅฐ Pong`);
|
|
233
|
+
break;
|
|
234
|
+
default:
|
|
235
|
+
console.log(`\n ๐ฉ ๆถๅฐๆถๆฏ: ${JSON.stringify(msg)}`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
main().catch(e => {
|
|
239
|
+
console.error('\nโ ้่ฏฏ:', e.message);
|
|
240
|
+
process.exit(1);
|
|
241
|
+
});
|