@bolloon/bolloon-agent 0.1.1 → 0.1.3
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/bin/bolloon-cli.cjs +165 -0
- package/bin/bolloon-daemon.sh +207 -0
- package/bin/bolloon.cmd +11 -0
- package/dist/agents/constraint-layer.js +10 -15
- package/dist/agents/pi-sdk.js +433 -106
- package/dist/agents/protocol.js +82 -1
- package/dist/agents/subagent-manager.js +2 -2
- package/dist/agents/workflow-engine.js +15 -20
- package/dist/agents/workflow-pivot-loop.js +541 -0
- package/dist/bollharness/src/index.js +5 -0
- package/dist/bollharness/src/scripts/checks/check_adr_plan_numbering.js +6 -0
- package/dist/bollharness/src/scripts/checks/check_api_types.js +45 -0
- package/dist/bollharness/src/scripts/checks/check_artifact_link.js +146 -0
- package/dist/bollharness/src/scripts/checks/check_bridge_deps.js +6 -0
- package/dist/bollharness/src/scripts/checks/check_bugfix_binding.js +6 -0
- package/dist/bollharness/src/scripts/checks/check_bugfix_binding_ci.js +6 -0
- package/dist/bollharness/src/scripts/checks/check_doc_file_references.js +6 -0
- package/dist/bollharness/src/scripts/checks/check_doc_freshness.js +135 -0
- package/dist/bollharness/src/scripts/checks/check_doc_links.js +31 -0
- package/dist/bollharness/src/scripts/checks/check_file_existence_claims.js +6 -0
- package/dist/bollharness/src/scripts/checks/check_fragment_integrity.js +34 -0
- package/dist/bollharness/src/scripts/checks/check_hook_installed.js +63 -0
- package/dist/bollharness/src/scripts/checks/check_issue_closure.js +41 -0
- package/dist/bollharness/src/scripts/checks/check_mcp_parity.js +6 -0
- package/dist/bollharness/src/scripts/checks/check_security.js +48 -0
- package/dist/bollharness/src/scripts/checks/check_skill_parity.js +6 -0
- package/dist/bollharness/src/scripts/checks/check_versions.js +6 -0
- package/dist/bollharness/src/scripts/checks/finding.js +13 -0
- package/dist/bollharness/src/scripts/checks/next_decision_number.js +20 -0
- package/dist/bollharness/src/scripts/checks/regenerate_magic_docs.js +6 -0
- package/dist/bollharness/src/scripts/ci/detect_rebaseline_triggers.js +8 -0
- package/dist/bollharness/src/scripts/ci/scan_subprocess_cfg.js +8 -0
- package/dist/bollharness/src/scripts/ci/scan_verify_artifacts.js +8 -0
- package/dist/bollharness/src/scripts/ci/scan_yaml_schema.js +8 -0
- package/dist/bollharness/src/scripts/context_router.js +67 -0
- package/dist/bollharness/src/scripts/deploy-guard.js +157 -0
- package/dist/bollharness/src/scripts/guard-feedback.js +192 -0
- package/dist/bollharness/src/scripts/guard_router.js +158 -0
- package/dist/bollharness/src/scripts/hooks/_hook_output.js +6 -0
- package/dist/bollharness/src/scripts/hooks/auto-python3.js +6 -0
- package/dist/bollharness/src/scripts/hooks/deploy-progress-on-session-end.js +6 -0
- package/dist/bollharness/src/scripts/hooks/failure-analyzer.js +6 -0
- package/dist/bollharness/src/scripts/hooks/gate-judgment-inject.js +92 -0
- package/dist/bollharness/src/scripts/hooks/gate-transition-judgment.js +63 -0
- package/dist/bollharness/src/scripts/hooks/inbox-ack.js +6 -0
- package/dist/bollharness/src/scripts/hooks/inbox-inject-on-start.js +6 -0
- package/dist/bollharness/src/scripts/hooks/inbox-validate.js +6 -0
- package/dist/bollharness/src/scripts/hooks/inbox-write-ledger.js +6 -0
- package/dist/bollharness/src/scripts/hooks/initializer-agent.js +6 -0
- package/dist/bollharness/src/scripts/hooks/loop-detection.js +73 -0
- package/dist/bollharness/src/scripts/hooks/owner-guard.js +6 -0
- package/dist/bollharness/src/scripts/hooks/precompact.js +6 -0
- package/dist/bollharness/src/scripts/hooks/review-agent-gatekeeper.js +6 -0
- package/dist/bollharness/src/scripts/hooks/risk-tracker.js +108 -0
- package/dist/bollharness/src/scripts/hooks/sanitize-on-read.js +6 -0
- package/dist/bollharness/src/scripts/hooks/session-reflection.js +7 -0
- package/dist/bollharness/src/scripts/hooks/session-start-magic-docs.js +7 -0
- package/dist/bollharness/src/scripts/hooks/session-start-reset-risk.js +7 -0
- package/dist/bollharness/src/scripts/hooks/session-start-toolkit-reminder.js +7 -0
- package/dist/bollharness/src/scripts/hooks/stop-evaluator.js +157 -0
- package/dist/bollharness/src/scripts/hooks/tool-call-counter.js +6 -0
- package/dist/bollharness/src/scripts/hooks/trace-analyzer.js +10 -0
- package/dist/bollharness/src/scripts/install/install-trust-token.js +7 -0
- package/dist/bollharness/src/scripts/install/multi_project_registry.js +9 -0
- package/dist/bollharness/src/scripts/install/phase2_auto.js +21 -0
- package/dist/bollharness/src/scripts/install/pre_commit_installer.js +6 -0
- package/dist/bollharness/src/scripts/install/tier_selector.js +7 -0
- package/dist/bollharness/src/scripts/install/transcript_miner.js +7 -0
- package/dist/bollharness/src/scripts/lib/claim_patterns.js +10 -0
- package/dist/bollharness/src/scripts/lib/sanitize_patterns.js +12 -0
- package/dist/bollharness/src/scripts/sanitize.js +6 -0
- package/dist/bollharness-integration/channel-judgment-engine.js +530 -0
- package/dist/bollharness-integration/context-chain-router.js +383 -0
- package/dist/bollharness-integration/context-router-judgment.js +13 -21
- package/dist/bollharness-integration/context-router.js +22 -64
- package/dist/bollharness-integration/gate-state-machine.js +14 -19
- package/dist/bollharness-integration/gate-transition-hooks.js +16 -61
- package/dist/bollharness-integration/guard-checker.js +21 -68
- package/dist/bollharness-integration/index.js +14 -124
- package/dist/bollharness-integration/integration.js +13 -20
- package/dist/bollharness-integration/llm-judgment-engine.js +569 -0
- package/dist/bollharness-integration/skill-adapter.js +18 -64
- package/dist/cli-entry.js +261 -0
- package/dist/constraint-runtime/src/commands.js +17 -7
- package/dist/constraint-runtime/src/constraint/budget.js +1 -6
- package/dist/constraint-runtime/src/constraint/permission.js +1 -6
- package/dist/constraint-runtime/src/models.js +1 -3
- package/dist/constraint-runtime/src/tools.js +17 -7
- package/dist/constraints/index.js +1 -7
- package/dist/documents/reader.js +8 -49
- package/dist/heartbeat/DaemonManager.js +242 -0
- package/dist/heartbeat/HealthMonitor.js +285 -0
- package/dist/heartbeat/StartupVerifier.js +205 -0
- package/dist/heartbeat/Watchdog.js +168 -0
- package/dist/heartbeat/index.js +84 -0
- package/dist/heartbeat/types.js +5 -0
- package/dist/index.js +381 -28
- package/dist/llm/config-store.js +31 -57
- package/dist/llm/llm-judgment-client.js +389 -0
- package/dist/llm/pi-ai.js +9 -52
- package/dist/network/agent-network.js +46 -90
- package/dist/network/hybrid-messenger.js +125 -0
- package/dist/network/iroh-bootstrap.js +38 -0
- package/dist/network/iroh-discovery.js +145 -0
- package/dist/network/iroh-integration.js +9 -16
- package/dist/network/iroh-transport.js +10 -48
- package/dist/network/p2p.js +23 -62
- package/dist/network/storage/adapters/json-adapter.js +4 -42
- package/dist/network/storage/index.js +147 -0
- package/dist/network/storage/types.js +14 -0
- package/dist/pi-ecosystem/index.js +233 -0
- package/dist/pi-ecosystem-colony/index.js +29 -90
- package/dist/pi-ecosystem-goals/index.js +20 -74
- package/dist/pi-ecosystem-judgment/decision.js +29 -47
- package/dist/pi-ecosystem-judgment/distillation.js +16 -29
- package/dist/pi-ecosystem-judgment/human-value-store.js +13 -60
- package/dist/pi-ecosystem-judgment/index.js +21 -74
- package/dist/pi-ecosystem-judgment/value-injection.js +26 -72
- package/dist/pi-ecosystem-mcp/index.js +24 -78
- package/dist/pi-ecosystem-subagents/index.js +20 -69
- package/dist/social/ant-colony/AdaptiveHeartbeat.js +3 -8
- package/dist/social/ant-colony/PheromoneEngine.js +11 -49
- package/dist/social/ant-colony/index.js +6 -0
- package/dist/social/ant-colony/types.js +4 -8
- package/dist/social/channels/ChannelManager.js +8 -46
- package/dist/social/channels/DiapChannelBridge.js +9 -47
- package/dist/social/channels/InterestMatcher.js +2 -7
- package/dist/social/channels/channel-agent-session.js +309 -0
- package/dist/social/channels/channel-heartbeat-agent.js +494 -0
- package/dist/social/channels/diap-doc-parser.js +204 -0
- package/dist/social/channels/harness-workflow-integrator.js +446 -0
- package/dist/social/channels/index.js +9 -0
- package/dist/social/channels/types.js +3 -7
- package/dist/social/global-shared-context.js +6 -47
- package/dist/social/heartbeat.js +29 -72
- package/dist/social/persona/enhanced-persona.js +299 -0
- package/dist/web/client.js +302 -136
- package/dist/web/components/p2p/index.js +159 -9
- package/dist/web/components/p2p/p2p-connection.js +136 -0
- package/dist/web/components/p2p/p2p-manager.js +24 -0
- package/dist/web/components/p2p/p2p-store-memory.js +1 -1
- package/dist/web/components/p2p/types.js +7 -0
- package/dist/web/index.html +5 -0
- package/dist/web/style.css +118 -0
- package/package.json +12 -6
- package/scripts/build-cli.js +206 -0
- package/scripts/postinstall.js +153 -0
- package/src/agents/pi-sdk.ts +347 -28
- package/src/agents/protocol.ts +95 -1
- package/src/agents/workflow-pivot-loop.ts +674 -0
- package/src/bollharness/CLAUDE.md +73 -0
- package/src/bollharness/README.md +143 -0
- package/src/bollharness/README.zh-CN.md +131 -0
- package/src/bollharness/reference/boll-reference/scripts/hooks/stop-evaluator.md +57 -0
- package/src/bollharness/scripts/context-fragments/artifact-linkage.md +14 -0
- package/src/bollharness/scripts/context-fragments/auth-consumers.md +17 -0
- package/src/bollharness/scripts/context-fragments/bridge-constitution.md +13 -0
- package/src/bollharness/scripts/context-fragments/catalyst-distributed.md +18 -0
- package/src/bollharness/scripts/context-fragments/closure-checklist.md +13 -0
- package/src/bollharness/scripts/context-fragments/contract-consumers.md +15 -0
- package/src/bollharness/scripts/context-fragments/db-shared-structures.md +15 -0
- package/src/bollharness/scripts/context-fragments/fixed-three-layers.md +19 -0
- package/src/bollharness/scripts/context-fragments/general-dev-principles.md +11 -0
- package/src/bollharness/scripts/context-fragments/issue-first.md +8 -0
- package/src/bollharness/scripts/context-fragments/mcp-parity.md +16 -0
- package/src/bollharness/scripts/context-fragments/pi-agent-operations.md +108 -0
- package/src/bollharness/scripts/context-fragments/protocol-consumers.md +15 -0
- package/src/bollharness/scripts/context-fragments/run-events-consumers.md +15 -0
- package/src/bollharness/scripts/context-fragments/scene-fidelity.md +13 -0
- package/src/bollharness/scripts/context-fragments/truth-source-hierarchy.md +15 -0
- package/src/bollharness/scripts/context-fragments/two-language.md +15 -0
- package/src/bollharness/scripts/context-fragments/version-sources.md +14 -0
- package/src/bollharness/scripts/hooks/stop-evaluator.md +83 -0
- package/src/bollharness/templates/scaffold/CLAUDE.md +89 -0
- package/src/cli-entry.ts +304 -0
- package/src/heartbeat/DaemonManager.ts +283 -0
- package/src/heartbeat/HealthMonitor.ts +316 -0
- package/src/heartbeat/StartupVerifier.ts +223 -0
- package/src/heartbeat/Watchdog.ts +198 -0
- package/src/heartbeat/index.ts +108 -0
- package/src/heartbeat/types.ts +82 -0
- package/src/llm/config-store.ts +23 -5
- package/src/network/iroh-transport.ts +3 -3
- package/src/web/client.js +302 -136
- package/src/web/components/p2p/P2PModal.tsx +91 -3
- package/src/web/components/p2p/index.ts +171 -9
- package/src/web/components/p2p/p2p-connection.ts +153 -1
- package/src/web/components/p2p/p2p-manager.ts +39 -1
- package/src/web/components/p2p/p2p-store-memory.ts +1 -1
- package/src/web/components/p2p/p2p-tools.ts +315 -0
- package/src/web/components/p2p/types.ts +58 -0
- package/src/web/design.md +99 -0
- package/src/web/index.html +5 -0
- package/src/web/server.ts +353 -36
- package/src/web/style.css +118 -0
- package/tsconfig.cli.json +16 -0
- package/tsconfig.electron.json +1 -1
- package/tsconfig.json +1 -2
- package/dist/web/server.js +0 -1647
- package/dist/web/server.js.map +0 -1
|
@@ -1,49 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.agentMessaging = exports.AgentMessaging = exports.agentRegistry = exports.AgentRegistry = void 0;
|
|
37
|
-
exports.initializeAgentNetwork = initializeAgentNetwork;
|
|
38
|
-
exports.broadcastOwnAddress = broadcastOwnAddress;
|
|
39
|
-
exports.findAndConnectToAgent = findAndConnectToAgent;
|
|
40
|
-
exports.sendMessageToAgent = sendMessageToAgent;
|
|
41
|
-
exports.sendUnverifiedMessageToAgent = sendUnverifiedMessageToAgent;
|
|
42
|
-
const fs = __importStar(require("fs/promises"));
|
|
43
|
-
const path = __importStar(require("path"));
|
|
44
|
-
const multiaddr_1 = require("@multiformats/multiaddr");
|
|
45
|
-
const sdk_1 = require("@diap/sdk");
|
|
46
|
-
const p2p_js_1 = require("./p2p.js");
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { multiaddr as createMultiaddr } from '@multiformats/multiaddr';
|
|
4
|
+
import { KeyManager } from '@diap/sdk';
|
|
5
|
+
import { p2pNetwork } from './p2p.js';
|
|
47
6
|
const AGENT_REGISTRY_PATH = path.join(process.env.HOME || '/tmp', '.bolloon', 'agent-registry.json');
|
|
48
7
|
const KEY_PAIR_PATH = path.join(process.env.HOME || '/tmp', '.bolloon', 'keypair.json');
|
|
49
8
|
const ADDRESS_BROADCAST_INTERVAL = 5 * 60 * 1000;
|
|
@@ -51,7 +10,7 @@ const RELAY_RETRY_INTERVAL = 30000;
|
|
|
51
10
|
const MAX_RELAY_HOPS = 3;
|
|
52
11
|
const MESSAGE_TIMESTAMP_TOLERANCE = 24 * 60 * 60 * 1000;
|
|
53
12
|
const SIGNED_MESSAGE_TYPES = ['task', 'response', 'discovery', 'address_broadcast'];
|
|
54
|
-
class AgentRegistry {
|
|
13
|
+
export class AgentRegistry {
|
|
55
14
|
agents = new Map();
|
|
56
15
|
registryPath;
|
|
57
16
|
ownEndpoint = null;
|
|
@@ -81,7 +40,7 @@ class AgentRegistry {
|
|
|
81
40
|
}
|
|
82
41
|
catch {
|
|
83
42
|
console.log(`[Registry] Generating new keypair...`);
|
|
84
|
-
const kp =
|
|
43
|
+
const kp = KeyManager.generate();
|
|
85
44
|
this.keyPair = {
|
|
86
45
|
privateKey: kp.privateKey,
|
|
87
46
|
publicKey: kp.publicKey,
|
|
@@ -144,7 +103,7 @@ class AgentRegistry {
|
|
|
144
103
|
return null;
|
|
145
104
|
}
|
|
146
105
|
try {
|
|
147
|
-
const signature = await
|
|
106
|
+
const signature = await KeyManager.sign(this.keyPair, new TextEncoder().encode(data));
|
|
148
107
|
return signature;
|
|
149
108
|
}
|
|
150
109
|
catch (e) {
|
|
@@ -161,7 +120,7 @@ class AgentRegistry {
|
|
|
161
120
|
}
|
|
162
121
|
const publicKey = Buffer.from(agent.publicKey, 'hex');
|
|
163
122
|
const keyPair = { privateKey: new Uint8Array(32), publicKey, did };
|
|
164
|
-
const isValid = await
|
|
123
|
+
const isValid = await KeyManager.verify(keyPair, new TextEncoder().encode(data), signature);
|
|
165
124
|
if (!isValid) {
|
|
166
125
|
console.warn(`[Registry] Invalid signature from ${did.substring(0, 20)}`);
|
|
167
126
|
}
|
|
@@ -232,7 +191,7 @@ class AgentRegistry {
|
|
|
232
191
|
if (entry && now - entry.lastBroadcast < ADDRESS_BROADCAST_INTERVAL) {
|
|
233
192
|
return null;
|
|
234
193
|
}
|
|
235
|
-
const relayAddr =
|
|
194
|
+
const relayAddr = p2pNetwork.getRelayAddress?.() || null;
|
|
236
195
|
const broadcastData = JSON.stringify({
|
|
237
196
|
type: 'address_broadcast',
|
|
238
197
|
from: this.keyPair.did,
|
|
@@ -368,8 +327,8 @@ class AgentRegistry {
|
|
|
368
327
|
if (agent.multiaddrs && agent.multiaddrs.length > 0) {
|
|
369
328
|
for (const addr of agent.multiaddrs) {
|
|
370
329
|
try {
|
|
371
|
-
const ma = (
|
|
372
|
-
const node =
|
|
330
|
+
const ma = createMultiaddr(addr);
|
|
331
|
+
const node = p2pNetwork.node;
|
|
373
332
|
if (node) {
|
|
374
333
|
await node.dial(ma);
|
|
375
334
|
connected = true;
|
|
@@ -385,9 +344,9 @@ class AgentRegistry {
|
|
|
385
344
|
if (!connected && agent.relayAddr) {
|
|
386
345
|
console.log(`[Registry] Trying relay connection to ${agent.name} via ${agent.relayAddr}`);
|
|
387
346
|
try {
|
|
388
|
-
const node =
|
|
347
|
+
const node = p2pNetwork.node;
|
|
389
348
|
if (node) {
|
|
390
|
-
const ma = (
|
|
349
|
+
const ma = createMultiaddr(`${agent.relayAddr}/p2p/${agent.peerId}`);
|
|
391
350
|
await node.dial(ma);
|
|
392
351
|
connected = true;
|
|
393
352
|
console.log(`[Registry] Relay connection to ${agent.name} established`);
|
|
@@ -406,9 +365,9 @@ class AgentRegistry {
|
|
|
406
365
|
console.log(`[Registry] Trying to relay via ${relay.name} (${relay.peerId.substring(0, 12)}...)`);
|
|
407
366
|
const relayAddr = relay.relayAddr || relay.multiaddrs?.[0];
|
|
408
367
|
if (relayAddr) {
|
|
409
|
-
const node =
|
|
368
|
+
const node = p2pNetwork.node;
|
|
410
369
|
if (node) {
|
|
411
|
-
const ma = (
|
|
370
|
+
const ma = createMultiaddr(`${relayAddr}/p2p/${agent.peerId}`);
|
|
412
371
|
await node.dial(ma);
|
|
413
372
|
connected = true;
|
|
414
373
|
console.log(`[Registry] Connection to ${agent.name} via relay ${relay.name}`);
|
|
@@ -423,7 +382,7 @@ class AgentRegistry {
|
|
|
423
382
|
}
|
|
424
383
|
if (connected) {
|
|
425
384
|
this.updateLastSeen(did);
|
|
426
|
-
|
|
385
|
+
p2pNetwork.addPersistentPeer({
|
|
427
386
|
peerId: agent.peerId,
|
|
428
387
|
multiaddrs: agent.multiaddrs,
|
|
429
388
|
did: agent.did,
|
|
@@ -451,7 +410,7 @@ class AgentRegistry {
|
|
|
451
410
|
try {
|
|
452
411
|
const peerId = targetAgent.peerId;
|
|
453
412
|
const relayMsg = new TextEncoder().encode(`RELAY:${fromDid}|${hops + 1}|${new TextDecoder().decode(data)}`);
|
|
454
|
-
await
|
|
413
|
+
await p2pNetwork.sendMessage(peerId, 'relay', new TextDecoder().decode(relayMsg));
|
|
455
414
|
return true;
|
|
456
415
|
}
|
|
457
416
|
catch (e) {
|
|
@@ -470,9 +429,8 @@ class AgentRegistry {
|
|
|
470
429
|
};
|
|
471
430
|
}
|
|
472
431
|
}
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
class AgentMessaging {
|
|
432
|
+
export const agentRegistry = new AgentRegistry();
|
|
433
|
+
export class AgentMessaging {
|
|
476
434
|
registry;
|
|
477
435
|
messageHandlers = new Map();
|
|
478
436
|
constructor(registry) {
|
|
@@ -494,7 +452,7 @@ class AgentMessaging {
|
|
|
494
452
|
}
|
|
495
453
|
try {
|
|
496
454
|
const messageStr = JSON.stringify(signedMsg);
|
|
497
|
-
await
|
|
455
|
+
await p2pNetwork.sendMessage(agent.peerId, 'signed', messageStr);
|
|
498
456
|
return true;
|
|
499
457
|
}
|
|
500
458
|
catch (e) {
|
|
@@ -510,7 +468,7 @@ class AgentMessaging {
|
|
|
510
468
|
}
|
|
511
469
|
const message = `${type}:${payload}`;
|
|
512
470
|
try {
|
|
513
|
-
await
|
|
471
|
+
await p2pNetwork.sendMessage(agent.peerId, type, payload);
|
|
514
472
|
return true;
|
|
515
473
|
}
|
|
516
474
|
catch (e) {
|
|
@@ -525,7 +483,7 @@ class AgentMessaging {
|
|
|
525
483
|
if (agent.did === ownEndpoint?.did)
|
|
526
484
|
continue;
|
|
527
485
|
try {
|
|
528
|
-
await
|
|
486
|
+
await p2pNetwork.sendMessage(agent.peerId, type, payload);
|
|
529
487
|
}
|
|
530
488
|
catch (e) {
|
|
531
489
|
console.warn(`[Messaging] Broadcast failed to ${agent.name}:`, e);
|
|
@@ -610,36 +568,35 @@ class AgentMessaging {
|
|
|
610
568
|
}
|
|
611
569
|
}
|
|
612
570
|
}
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
const keyPair = exports.agentRegistry.getKeyPair();
|
|
571
|
+
export const agentMessaging = new AgentMessaging(agentRegistry);
|
|
572
|
+
export async function initializeAgentNetwork(ownDid, ownName, peerId, multiaddrs) {
|
|
573
|
+
await agentRegistry.initialize();
|
|
574
|
+
const keyPair = agentRegistry.getKeyPair();
|
|
618
575
|
const publicKeyHex = keyPair ? Buffer.from(keyPair.publicKey).toString('hex') : undefined;
|
|
619
|
-
|
|
576
|
+
agentRegistry.setOwnEndpoint({
|
|
620
577
|
did: keyPair?.did || ownDid,
|
|
621
578
|
name: ownName,
|
|
622
579
|
peerId,
|
|
623
580
|
multiaddrs,
|
|
624
581
|
publicKey: publicKeyHex
|
|
625
582
|
});
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
await
|
|
583
|
+
p2pNetwork.setOwnDid(keyPair?.did || ownDid);
|
|
584
|
+
p2pNetwork.onMessage('signed', async (data, from, did) => {
|
|
585
|
+
await agentMessaging.dispatchSignedMessage(data, from);
|
|
629
586
|
});
|
|
630
|
-
|
|
587
|
+
p2pNetwork.onMessage('address_broadcast', async (data, from, did) => {
|
|
631
588
|
try {
|
|
632
589
|
const messageStr = new TextDecoder().decode(data);
|
|
633
590
|
const broadcast = JSON.parse(messageStr);
|
|
634
591
|
if (broadcast.type === 'address_broadcast') {
|
|
635
|
-
await
|
|
592
|
+
await agentRegistry.handleAddressBroadcast(broadcast);
|
|
636
593
|
}
|
|
637
594
|
}
|
|
638
595
|
catch (e) {
|
|
639
596
|
console.warn(`[AgentNetwork] Failed to handle address broadcast:`, e);
|
|
640
597
|
}
|
|
641
598
|
});
|
|
642
|
-
|
|
599
|
+
p2pNetwork.onMessage('relay', (data, from, did) => {
|
|
643
600
|
try {
|
|
644
601
|
const relayMsg = new TextDecoder().decode(data);
|
|
645
602
|
const relayMatch = relayMsg.match(/^RELAY:(.+?)\|(\d+)\|(.+)$/);
|
|
@@ -647,7 +604,7 @@ async function initializeAgentNetwork(ownDid, ownName, peerId, multiaddrs) {
|
|
|
647
604
|
const [, targetDid, hopsStr, innerData] = relayMatch;
|
|
648
605
|
const hops = parseInt(hopsStr, 10);
|
|
649
606
|
if (hops < MAX_RELAY_HOPS) {
|
|
650
|
-
|
|
607
|
+
agentRegistry.relayMessage(targetDid, new TextEncoder().encode(innerData), did || from, hops);
|
|
651
608
|
}
|
|
652
609
|
}
|
|
653
610
|
}
|
|
@@ -655,12 +612,12 @@ async function initializeAgentNetwork(ownDid, ownName, peerId, multiaddrs) {
|
|
|
655
612
|
console.warn(`[AgentNetwork] Failed to handle relay:`, e);
|
|
656
613
|
}
|
|
657
614
|
});
|
|
658
|
-
|
|
615
|
+
p2pNetwork.onMessage('discovery', async (data, from, did) => {
|
|
659
616
|
try {
|
|
660
617
|
const messageStr = new TextDecoder().decode(data);
|
|
661
618
|
const discovery = JSON.parse(messageStr);
|
|
662
619
|
if (discovery.type === 'discovery') {
|
|
663
|
-
const isValid = await
|
|
620
|
+
const isValid = await agentRegistry.verifySignature(discovery.from, JSON.stringify({ ...discovery, signature: undefined }), Buffer.from(discovery.signature, 'hex'));
|
|
664
621
|
if (isValid) {
|
|
665
622
|
console.log(`[AgentNetwork] Verified discovery from: ${discovery.name}`);
|
|
666
623
|
}
|
|
@@ -672,21 +629,20 @@ async function initializeAgentNetwork(ownDid, ownName, peerId, multiaddrs) {
|
|
|
672
629
|
});
|
|
673
630
|
console.log(`[AgentNetwork] Initialized with DID: ${keyPair?.did.substring(0, 20) || ownDid.substring(0, 20)}...`);
|
|
674
631
|
}
|
|
675
|
-
async function broadcastOwnAddress() {
|
|
676
|
-
const broadcast = await
|
|
632
|
+
export async function broadcastOwnAddress() {
|
|
633
|
+
const broadcast = await agentRegistry.createSignedBroadcast();
|
|
677
634
|
if (broadcast) {
|
|
678
635
|
const data = JSON.stringify(broadcast);
|
|
679
|
-
await
|
|
636
|
+
await p2pNetwork.broadcast('address_broadcast', data);
|
|
680
637
|
console.log(`[AgentNetwork] Broadcast signed address to network`);
|
|
681
638
|
}
|
|
682
639
|
}
|
|
683
|
-
async function findAndConnectToAgent(did) {
|
|
684
|
-
return
|
|
640
|
+
export async function findAndConnectToAgent(did) {
|
|
641
|
+
return agentRegistry.connectToAgent(did);
|
|
685
642
|
}
|
|
686
|
-
async function sendMessageToAgent(did, type, payload) {
|
|
687
|
-
return
|
|
643
|
+
export async function sendMessageToAgent(did, type, payload) {
|
|
644
|
+
return agentMessaging.sendSignedToAgent(did, type, payload);
|
|
688
645
|
}
|
|
689
|
-
async function sendUnverifiedMessageToAgent(did, type, payload) {
|
|
690
|
-
return
|
|
646
|
+
export async function sendUnverifiedMessageToAgent(did, type, payload) {
|
|
647
|
+
return agentMessaging.sendToAgent(did, type, payload);
|
|
691
648
|
}
|
|
692
|
-
//# sourceMappingURL=agent-network.js.map
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { irohTransport } from './iroh-transport.js';
|
|
2
|
+
import { p2pNetwork } from './p2p.js';
|
|
3
|
+
const DEFAULT_CONFIG = {
|
|
4
|
+
preferIrohForLarge: true,
|
|
5
|
+
largeThresholdBytes: 64 * 1024,
|
|
6
|
+
enableRelay: true,
|
|
7
|
+
};
|
|
8
|
+
export class HybridMessenger {
|
|
9
|
+
messageHandlers = new Map();
|
|
10
|
+
wildcardHandler = null;
|
|
11
|
+
config;
|
|
12
|
+
irohEnabled = true;
|
|
13
|
+
constructor(config = {}) {
|
|
14
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
15
|
+
}
|
|
16
|
+
selectTransport(type, payloadSize, priority = 'normal') {
|
|
17
|
+
if (this.irohEnabled && this.shouldUseIroh(type, payloadSize, priority)) {
|
|
18
|
+
return 'iroh';
|
|
19
|
+
}
|
|
20
|
+
if (priority === 'urgent' || type === 'relay') {
|
|
21
|
+
return 'libp2p';
|
|
22
|
+
}
|
|
23
|
+
return 'hyperswarm';
|
|
24
|
+
}
|
|
25
|
+
shouldUseIroh(type, payloadSize, priority) {
|
|
26
|
+
const bulkTypes = ['blob', 'stream', 'file', 'large-data'];
|
|
27
|
+
if (bulkTypes.includes(type) || payloadSize > this.config.largeThresholdBytes) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
if (priority === 'bulk' && payloadSize > 1024) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
async sendMessage(targetId, type, payload, options = {}) {
|
|
36
|
+
const { priority = 'normal', preferTransport, relayAddr } = options;
|
|
37
|
+
const payloadBytes = typeof payload === 'string'
|
|
38
|
+
? new TextEncoder().encode(payload)
|
|
39
|
+
: payload;
|
|
40
|
+
const transport = preferTransport || this.selectTransport(type, payloadBytes.length, priority);
|
|
41
|
+
console.log(`[HybridMessenger] Sending "${type}" (${payloadBytes.length} bytes) via ${transport}`);
|
|
42
|
+
switch (transport) {
|
|
43
|
+
case 'iroh':
|
|
44
|
+
return this.sendViaIroh(targetId, type, payloadBytes);
|
|
45
|
+
case 'libp2p':
|
|
46
|
+
return this.sendViaLibp2p(targetId, type, payloadBytes, relayAddr);
|
|
47
|
+
case 'hyperswarm':
|
|
48
|
+
default:
|
|
49
|
+
return this.sendViaHyperswarm(targetId, type, payloadBytes);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async sendViaIroh(targetId, type, payload) {
|
|
53
|
+
try {
|
|
54
|
+
return await irohTransport.sendMessage(targetId, type, payload);
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
console.warn('[HybridMessenger] iroh send failed:', e);
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async sendViaLibp2p(targetId, type, payload, relayAddr) {
|
|
62
|
+
try {
|
|
63
|
+
await p2pNetwork.sendMessage(targetId, type, new TextDecoder().decode(payload));
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
console.warn('[HybridMessenger] libp2p send failed:', e);
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async sendViaHyperswarm(targetId, type, payload) {
|
|
72
|
+
try {
|
|
73
|
+
await p2pNetwork.sendMessage(targetId, type, new TextDecoder().decode(payload));
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
console.warn('[HybridMessenger] Hyperswarm send failed:', e);
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async broadcast(type, payload, options = {}) {
|
|
82
|
+
const { priority = 'normal', transport } = options;
|
|
83
|
+
const payloadBytes = typeof payload === 'string'
|
|
84
|
+
? new TextEncoder().encode(payload)
|
|
85
|
+
: payload;
|
|
86
|
+
const selectedTransport = transport || this.selectTransport(type, payloadBytes.length, priority);
|
|
87
|
+
if (selectedTransport === 'iroh') {
|
|
88
|
+
await irohTransport.broadcast(type, payloadBytes);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
await p2pNetwork.broadcast(type, new TextDecoder().decode(payloadBytes));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
onMessage(type, handler) {
|
|
95
|
+
this.messageHandlers.set(type, handler);
|
|
96
|
+
}
|
|
97
|
+
onWildcard(handler) {
|
|
98
|
+
this.wildcardHandler = handler;
|
|
99
|
+
}
|
|
100
|
+
dispatchMessage(msg) {
|
|
101
|
+
const handler = this.messageHandlers.get(msg.type);
|
|
102
|
+
if (handler) {
|
|
103
|
+
handler(msg);
|
|
104
|
+
}
|
|
105
|
+
else if (this.wildcardHandler) {
|
|
106
|
+
this.wildcardHandler(msg);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
setIrohEnabled(enabled) {
|
|
110
|
+
this.irohEnabled = enabled;
|
|
111
|
+
}
|
|
112
|
+
isIrohEnabled() {
|
|
113
|
+
return this.irohEnabled;
|
|
114
|
+
}
|
|
115
|
+
getConfig() {
|
|
116
|
+
return { ...this.config };
|
|
117
|
+
}
|
|
118
|
+
setLargeThreshold(bytes) {
|
|
119
|
+
this.config.largeThresholdBytes = bytes;
|
|
120
|
+
}
|
|
121
|
+
setPreferIrohForLarge(enabled) {
|
|
122
|
+
this.config.preferIrohForLarge = enabled;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
export const hybridMessenger = new HybridMessenger();
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { irohTransport } from './iroh-transport.js';
|
|
2
|
+
export async function bootstrapIroh(auth, keyPair, agentName) {
|
|
3
|
+
console.log('[Iroh] Starting iroh transport...');
|
|
4
|
+
const node = await irohTransport.start();
|
|
5
|
+
const nodeId = node.nodeId;
|
|
6
|
+
console.log(`[Iroh] Node ID: ${nodeId}`);
|
|
7
|
+
const services = [
|
|
8
|
+
{ serviceType: 'iroh', endpoint: nodeId },
|
|
9
|
+
{ serviceType: 'iroh-quic', endpoint: `iroh://${nodeId}` },
|
|
10
|
+
];
|
|
11
|
+
try {
|
|
12
|
+
const result = await auth.registerAgent({ name: agentName, services: services }, keyPair, nodeId);
|
|
13
|
+
console.log(`[Iroh] Registered with DIAP: DID=${result.did.substring(0, 20)}...`);
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
console.warn('[Iroh] DIAP registration failed:', e);
|
|
17
|
+
}
|
|
18
|
+
irohTransport.onMessage('task', async (msg) => {
|
|
19
|
+
console.log(`[Iroh] Received task from ${msg.from}: ${new TextDecoder().decode(msg.payload).substring(0, 50)}...`);
|
|
20
|
+
});
|
|
21
|
+
irohTransport.onMessage('relay', (msg) => {
|
|
22
|
+
console.log(`[Iroh] Relay message from ${msg.from}`);
|
|
23
|
+
});
|
|
24
|
+
irohTransport.onMessage('blob', (msg) => {
|
|
25
|
+
console.log(`[Iroh] Blob from ${msg.from}: ${msg.payload.length} bytes`);
|
|
26
|
+
});
|
|
27
|
+
return nodeId;
|
|
28
|
+
}
|
|
29
|
+
export async function connectToIrohPeer(targetNodeId, type, payload) {
|
|
30
|
+
return irohTransport.sendMessage(targetNodeId, type, new TextEncoder().encode(payload));
|
|
31
|
+
}
|
|
32
|
+
export async function requestIrohPeer(targetNodeId, type, payload) {
|
|
33
|
+
const response = await irohTransport.requestResponse(targetNodeId, type, new TextEncoder().encode(payload));
|
|
34
|
+
return response ? new TextDecoder().decode(response) : null;
|
|
35
|
+
}
|
|
36
|
+
export function onIrohMessage(type, handler) {
|
|
37
|
+
irohTransport.onMessage(type, handler);
|
|
38
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { irohTransport } from './iroh-transport.js';
|
|
2
|
+
export class IrohDiscoveryService {
|
|
3
|
+
config;
|
|
4
|
+
discoveredAgents = new Map();
|
|
5
|
+
ownIrohNodeId = null;
|
|
6
|
+
refreshTimer = null;
|
|
7
|
+
discoveryTimer = null;
|
|
8
|
+
isRegistered = false;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.config = {
|
|
11
|
+
discoveryIntervalMs: 30000,
|
|
12
|
+
refreshIntervalMs: 5 * 60 * 1000,
|
|
13
|
+
...config,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
async start() {
|
|
17
|
+
console.log('[IrohDiscovery] Starting...');
|
|
18
|
+
const node = await irohTransport.start();
|
|
19
|
+
this.ownIrohNodeId = node.nodeId;
|
|
20
|
+
console.log('[IrohDiscovery] Iroh node ID:', this.ownIrohNodeId.substring(0, 16) + '...');
|
|
21
|
+
await this.registerWithDIAP();
|
|
22
|
+
this.isRegistered = true;
|
|
23
|
+
this.startRefreshLoop();
|
|
24
|
+
this.startDiscoveryLoop();
|
|
25
|
+
return this.ownIrohNodeId;
|
|
26
|
+
}
|
|
27
|
+
async registerWithDIAP() {
|
|
28
|
+
if (!this.ownIrohNodeId)
|
|
29
|
+
return;
|
|
30
|
+
try {
|
|
31
|
+
const services = [
|
|
32
|
+
{ serviceType: 'iroh', endpoint: this.ownIrohNodeId },
|
|
33
|
+
{ serviceType: 'iroh-quic', endpoint: `iroh://${this.ownIrohNodeId}` },
|
|
34
|
+
];
|
|
35
|
+
const agentInfo = {
|
|
36
|
+
name: this.config.agentName,
|
|
37
|
+
services: services,
|
|
38
|
+
description: this.config.agentDescription || 'Bolloon agent with iroh P2P',
|
|
39
|
+
tags: this.config.agentTags || ['bolloon', 'iroh'],
|
|
40
|
+
};
|
|
41
|
+
await this.config.agentAuthManager.registerAgent(agentInfo, this.config.keyPair, this.ownIrohNodeId);
|
|
42
|
+
console.log('[IrohDiscovery] Registered with DIAP');
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
console.warn('[IrohDiscovery] DIAP registration failed:', e);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
startRefreshLoop() {
|
|
49
|
+
this.refreshTimer = setInterval(async () => {
|
|
50
|
+
if (!this.isRegistered)
|
|
51
|
+
return;
|
|
52
|
+
console.log('[IrohDiscovery] Refreshing DIAP registration...');
|
|
53
|
+
await this.registerWithDIAP();
|
|
54
|
+
}, this.config.refreshIntervalMs);
|
|
55
|
+
}
|
|
56
|
+
startDiscoveryLoop() {
|
|
57
|
+
this.discoveryTimer = setInterval(async () => {
|
|
58
|
+
await this.discoverPeers();
|
|
59
|
+
}, this.discoveryIntervalMs);
|
|
60
|
+
setTimeout(() => this.discoverPeers(), 2000);
|
|
61
|
+
}
|
|
62
|
+
async discoverPeers() {
|
|
63
|
+
console.log('[IrohDiscovery] Discovering peers...');
|
|
64
|
+
const now = Date.now();
|
|
65
|
+
const staleThreshold = 10 * 60 * 1000;
|
|
66
|
+
for (const [did, agent] of this.discoveredAgents) {
|
|
67
|
+
if (now - agent.lastSeen > staleThreshold) {
|
|
68
|
+
this.discoveredAgents.delete(did);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
console.log('[IrohDiscovery] Known agents:', this.discoveredAgents.size);
|
|
72
|
+
return Array.from(this.discoveredAgents.values());
|
|
73
|
+
}
|
|
74
|
+
async discoverViaDIAP() {
|
|
75
|
+
console.log('[IrohDiscovery] Querying DIAP for agents...');
|
|
76
|
+
const agents = [];
|
|
77
|
+
try {
|
|
78
|
+
const ipfsClient = this.config.agentAuthManager.identityManager?.ipfsClient;
|
|
79
|
+
if (ipfsClient) {
|
|
80
|
+
console.log('[IrohDiscovery] IPFS client available for discovery');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
console.warn('[IrohDiscovery] DIAP discovery error:', e);
|
|
85
|
+
}
|
|
86
|
+
return agents;
|
|
87
|
+
}
|
|
88
|
+
addDiscoveredAgent(agent) {
|
|
89
|
+
const existing = this.discoveredAgents.get(agent.did);
|
|
90
|
+
this.discoveredAgents.set(agent.did, {
|
|
91
|
+
...agent,
|
|
92
|
+
lastSeen: Date.now(),
|
|
93
|
+
irohNodeId: agent.irohNodeId || existing?.irohNodeId || null,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
getDiscoveredAgents() {
|
|
97
|
+
return Array.from(this.discoveredAgents.values());
|
|
98
|
+
}
|
|
99
|
+
getAgentByDid(did) {
|
|
100
|
+
return this.discoveredAgents.get(did);
|
|
101
|
+
}
|
|
102
|
+
getAgentsWithIroh() {
|
|
103
|
+
return Array.from(this.discoveredAgents.values()).filter((a) => a.irohNodeId !== null);
|
|
104
|
+
}
|
|
105
|
+
getOwnIrohNodeId() {
|
|
106
|
+
return this.ownIrohNodeId;
|
|
107
|
+
}
|
|
108
|
+
async connectToPeer(nodeId) {
|
|
109
|
+
return irohTransport.connect(nodeId);
|
|
110
|
+
}
|
|
111
|
+
async connectToAllIrohPeers() {
|
|
112
|
+
const agents = this.getAgentsWithIroh();
|
|
113
|
+
for (const agent of agents) {
|
|
114
|
+
if (agent.irohNodeId && agent.irohNodeId !== this.ownIrohNodeId) {
|
|
115
|
+
await this.connectToPeer(agent.irohNodeId);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async shutdown() {
|
|
120
|
+
this.isRegistered = false;
|
|
121
|
+
if (this.refreshTimer) {
|
|
122
|
+
clearInterval(this.refreshTimer);
|
|
123
|
+
this.refreshTimer = null;
|
|
124
|
+
}
|
|
125
|
+
if (this.discoveryTimer) {
|
|
126
|
+
clearInterval(this.discoveryTimer);
|
|
127
|
+
this.discoveryTimer = null;
|
|
128
|
+
}
|
|
129
|
+
this.discoveredAgents.clear();
|
|
130
|
+
await irohTransport.shutdown();
|
|
131
|
+
console.log('[IrohDiscovery] Shut down');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
let discoveryInstance = null;
|
|
135
|
+
export async function startIrohDiscovery(config) {
|
|
136
|
+
if (discoveryInstance) {
|
|
137
|
+
return discoveryInstance;
|
|
138
|
+
}
|
|
139
|
+
discoveryInstance = new IrohDiscoveryService(config);
|
|
140
|
+
await discoveryInstance.start();
|
|
141
|
+
return discoveryInstance;
|
|
142
|
+
}
|
|
143
|
+
export function getIrohDiscovery() {
|
|
144
|
+
return discoveryInstance;
|
|
145
|
+
}
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.IrohIntegration = void 0;
|
|
4
|
-
exports.initIrohIntegration = initIrohIntegration;
|
|
5
|
-
exports.getIrohIntegration = getIrohIntegration;
|
|
6
|
-
const iroh_transport_js_1 = require("./iroh-transport.js");
|
|
7
|
-
class IrohIntegration {
|
|
1
|
+
import { irohTransport } from './iroh-transport.js';
|
|
2
|
+
export class IrohIntegration {
|
|
8
3
|
config;
|
|
9
4
|
irohNodeId = null;
|
|
10
5
|
registration = null;
|
|
@@ -22,10 +17,10 @@ class IrohIntegration {
|
|
|
22
17
|
async start() {
|
|
23
18
|
try {
|
|
24
19
|
console.log('[IrohIntegration] Starting iroh transport...');
|
|
25
|
-
const node = await
|
|
20
|
+
const node = await irohTransport.start();
|
|
26
21
|
this.irohNodeId = node.nodeId;
|
|
27
22
|
console.log(`[IrohIntegration] Node ID: ${this.irohNodeId}`);
|
|
28
|
-
|
|
23
|
+
irohTransport.onMessage('*', (msg) => {
|
|
29
24
|
this.dispatchMessage(msg);
|
|
30
25
|
});
|
|
31
26
|
await this.registerWithDIAP();
|
|
@@ -77,10 +72,10 @@ class IrohIntegration {
|
|
|
77
72
|
this.messageHandlers.set(type, handler);
|
|
78
73
|
}
|
|
79
74
|
async sendTo(targetNodeId, type, payload) {
|
|
80
|
-
return
|
|
75
|
+
return irohTransport.sendMessage(targetNodeId, type, payload);
|
|
81
76
|
}
|
|
82
77
|
async requestFrom(targetNodeId, type, payload) {
|
|
83
|
-
return
|
|
78
|
+
return irohTransport.requestResponse(targetNodeId, type, payload);
|
|
84
79
|
}
|
|
85
80
|
getNodeId() {
|
|
86
81
|
return this.irohNodeId;
|
|
@@ -96,13 +91,12 @@ class IrohIntegration {
|
|
|
96
91
|
clearInterval(this.refreshTimer);
|
|
97
92
|
this.refreshTimer = null;
|
|
98
93
|
}
|
|
99
|
-
await
|
|
94
|
+
await irohTransport.shutdown();
|
|
100
95
|
console.log('[IrohIntegration] Shut down');
|
|
101
96
|
}
|
|
102
97
|
}
|
|
103
|
-
exports.IrohIntegration = IrohIntegration;
|
|
104
98
|
let integrationInstance = null;
|
|
105
|
-
async function initIrohIntegration(config) {
|
|
99
|
+
export async function initIrohIntegration(config) {
|
|
106
100
|
if (integrationInstance) {
|
|
107
101
|
console.log('[IrohIntegration] Already initialized');
|
|
108
102
|
return integrationInstance;
|
|
@@ -111,7 +105,6 @@ async function initIrohIntegration(config) {
|
|
|
111
105
|
await integrationInstance.start();
|
|
112
106
|
return integrationInstance;
|
|
113
107
|
}
|
|
114
|
-
function getIrohIntegration() {
|
|
108
|
+
export function getIrohIntegration() {
|
|
115
109
|
return integrationInstance;
|
|
116
110
|
}
|
|
117
|
-
//# sourceMappingURL=iroh-integration.js.map
|