@bolloon/bolloon-agent 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/bin/bolloon-cli.cjs +157 -0
  2. package/bin/bolloon-daemon.sh +207 -0
  3. package/bin/bolloon.cmd +11 -0
  4. package/dist/agents/constraint-layer.js +10 -15
  5. package/dist/agents/pi-sdk.js +433 -106
  6. package/dist/agents/protocol.js +82 -1
  7. package/dist/agents/subagent-manager.js +2 -2
  8. package/dist/agents/workflow-engine.js +15 -20
  9. package/dist/agents/workflow-pivot-loop.js +541 -0
  10. package/dist/bollharness/src/index.js +5 -0
  11. package/dist/bollharness/src/scripts/checks/check_adr_plan_numbering.js +6 -0
  12. package/dist/bollharness/src/scripts/checks/check_api_types.js +45 -0
  13. package/dist/bollharness/src/scripts/checks/check_artifact_link.js +146 -0
  14. package/dist/bollharness/src/scripts/checks/check_bridge_deps.js +6 -0
  15. package/dist/bollharness/src/scripts/checks/check_bugfix_binding.js +6 -0
  16. package/dist/bollharness/src/scripts/checks/check_bugfix_binding_ci.js +6 -0
  17. package/dist/bollharness/src/scripts/checks/check_doc_file_references.js +6 -0
  18. package/dist/bollharness/src/scripts/checks/check_doc_freshness.js +135 -0
  19. package/dist/bollharness/src/scripts/checks/check_doc_links.js +31 -0
  20. package/dist/bollharness/src/scripts/checks/check_file_existence_claims.js +6 -0
  21. package/dist/bollharness/src/scripts/checks/check_fragment_integrity.js +34 -0
  22. package/dist/bollharness/src/scripts/checks/check_hook_installed.js +63 -0
  23. package/dist/bollharness/src/scripts/checks/check_issue_closure.js +41 -0
  24. package/dist/bollharness/src/scripts/checks/check_mcp_parity.js +6 -0
  25. package/dist/bollharness/src/scripts/checks/check_security.js +48 -0
  26. package/dist/bollharness/src/scripts/checks/check_skill_parity.js +6 -0
  27. package/dist/bollharness/src/scripts/checks/check_versions.js +6 -0
  28. package/dist/bollharness/src/scripts/checks/finding.js +13 -0
  29. package/dist/bollharness/src/scripts/checks/next_decision_number.js +20 -0
  30. package/dist/bollharness/src/scripts/checks/regenerate_magic_docs.js +6 -0
  31. package/dist/bollharness/src/scripts/ci/detect_rebaseline_triggers.js +8 -0
  32. package/dist/bollharness/src/scripts/ci/scan_subprocess_cfg.js +8 -0
  33. package/dist/bollharness/src/scripts/ci/scan_verify_artifacts.js +8 -0
  34. package/dist/bollharness/src/scripts/ci/scan_yaml_schema.js +8 -0
  35. package/dist/bollharness/src/scripts/context_router.js +67 -0
  36. package/dist/bollharness/src/scripts/deploy-guard.js +157 -0
  37. package/dist/bollharness/src/scripts/guard-feedback.js +192 -0
  38. package/dist/bollharness/src/scripts/guard_router.js +158 -0
  39. package/dist/bollharness/src/scripts/hooks/_hook_output.js +6 -0
  40. package/dist/bollharness/src/scripts/hooks/auto-python3.js +6 -0
  41. package/dist/bollharness/src/scripts/hooks/deploy-progress-on-session-end.js +6 -0
  42. package/dist/bollharness/src/scripts/hooks/failure-analyzer.js +6 -0
  43. package/dist/bollharness/src/scripts/hooks/gate-judgment-inject.js +92 -0
  44. package/dist/bollharness/src/scripts/hooks/gate-transition-judgment.js +63 -0
  45. package/dist/bollharness/src/scripts/hooks/inbox-ack.js +6 -0
  46. package/dist/bollharness/src/scripts/hooks/inbox-inject-on-start.js +6 -0
  47. package/dist/bollharness/src/scripts/hooks/inbox-validate.js +6 -0
  48. package/dist/bollharness/src/scripts/hooks/inbox-write-ledger.js +6 -0
  49. package/dist/bollharness/src/scripts/hooks/initializer-agent.js +6 -0
  50. package/dist/bollharness/src/scripts/hooks/loop-detection.js +73 -0
  51. package/dist/bollharness/src/scripts/hooks/owner-guard.js +6 -0
  52. package/dist/bollharness/src/scripts/hooks/precompact.js +6 -0
  53. package/dist/bollharness/src/scripts/hooks/review-agent-gatekeeper.js +6 -0
  54. package/dist/bollharness/src/scripts/hooks/risk-tracker.js +108 -0
  55. package/dist/bollharness/src/scripts/hooks/sanitize-on-read.js +6 -0
  56. package/dist/bollharness/src/scripts/hooks/session-reflection.js +7 -0
  57. package/dist/bollharness/src/scripts/hooks/session-start-magic-docs.js +7 -0
  58. package/dist/bollharness/src/scripts/hooks/session-start-reset-risk.js +7 -0
  59. package/dist/bollharness/src/scripts/hooks/session-start-toolkit-reminder.js +7 -0
  60. package/dist/bollharness/src/scripts/hooks/stop-evaluator.js +157 -0
  61. package/dist/bollharness/src/scripts/hooks/tool-call-counter.js +6 -0
  62. package/dist/bollharness/src/scripts/hooks/trace-analyzer.js +10 -0
  63. package/dist/bollharness/src/scripts/install/install-trust-token.js +7 -0
  64. package/dist/bollharness/src/scripts/install/multi_project_registry.js +9 -0
  65. package/dist/bollharness/src/scripts/install/phase2_auto.js +21 -0
  66. package/dist/bollharness/src/scripts/install/pre_commit_installer.js +6 -0
  67. package/dist/bollharness/src/scripts/install/tier_selector.js +7 -0
  68. package/dist/bollharness/src/scripts/install/transcript_miner.js +7 -0
  69. package/dist/bollharness/src/scripts/lib/claim_patterns.js +10 -0
  70. package/dist/bollharness/src/scripts/lib/sanitize_patterns.js +12 -0
  71. package/dist/bollharness/src/scripts/sanitize.js +6 -0
  72. package/dist/bollharness-integration/channel-judgment-engine.js +530 -0
  73. package/dist/bollharness-integration/context-chain-router.js +383 -0
  74. package/dist/bollharness-integration/context-router-judgment.js +13 -21
  75. package/dist/bollharness-integration/context-router.js +22 -64
  76. package/dist/bollharness-integration/gate-state-machine.js +14 -19
  77. package/dist/bollharness-integration/gate-transition-hooks.js +16 -61
  78. package/dist/bollharness-integration/guard-checker.js +21 -68
  79. package/dist/bollharness-integration/index.js +14 -124
  80. package/dist/bollharness-integration/integration.js +13 -20
  81. package/dist/bollharness-integration/llm-judgment-engine.js +569 -0
  82. package/dist/bollharness-integration/skill-adapter.js +18 -64
  83. package/dist/cli-entry.js +261 -0
  84. package/dist/constraint-runtime/src/commands.js +17 -7
  85. package/dist/constraint-runtime/src/constraint/budget.js +1 -6
  86. package/dist/constraint-runtime/src/constraint/permission.js +1 -6
  87. package/dist/constraint-runtime/src/models.js +1 -3
  88. package/dist/constraint-runtime/src/tools.js +17 -7
  89. package/dist/constraints/index.js +1 -7
  90. package/dist/documents/reader.js +8 -49
  91. package/dist/heartbeat/DaemonManager.js +242 -0
  92. package/dist/heartbeat/HealthMonitor.js +285 -0
  93. package/dist/heartbeat/StartupVerifier.js +205 -0
  94. package/dist/heartbeat/Watchdog.js +168 -0
  95. package/dist/heartbeat/index.js +84 -0
  96. package/dist/heartbeat/types.js +5 -0
  97. package/dist/index.js +381 -28
  98. package/dist/llm/config-store.js +31 -57
  99. package/dist/llm/llm-judgment-client.js +389 -0
  100. package/dist/llm/pi-ai.js +9 -52
  101. package/dist/network/agent-network.js +46 -90
  102. package/dist/network/hybrid-messenger.js +125 -0
  103. package/dist/network/iroh-bootstrap.js +38 -0
  104. package/dist/network/iroh-discovery.js +145 -0
  105. package/dist/network/iroh-integration.js +9 -16
  106. package/dist/network/iroh-transport.js +10 -48
  107. package/dist/network/p2p.js +23 -62
  108. package/dist/network/storage/adapters/json-adapter.js +4 -42
  109. package/dist/network/storage/index.js +147 -0
  110. package/dist/network/storage/types.js +14 -0
  111. package/dist/pi-ecosystem/index.js +233 -0
  112. package/dist/pi-ecosystem-colony/index.js +29 -90
  113. package/dist/pi-ecosystem-goals/index.js +20 -74
  114. package/dist/pi-ecosystem-judgment/decision.js +29 -47
  115. package/dist/pi-ecosystem-judgment/distillation.js +16 -29
  116. package/dist/pi-ecosystem-judgment/human-value-store.js +13 -60
  117. package/dist/pi-ecosystem-judgment/index.js +21 -74
  118. package/dist/pi-ecosystem-judgment/value-injection.js +26 -72
  119. package/dist/pi-ecosystem-mcp/index.js +24 -78
  120. package/dist/pi-ecosystem-subagents/index.js +20 -69
  121. package/dist/social/ant-colony/AdaptiveHeartbeat.js +3 -8
  122. package/dist/social/ant-colony/PheromoneEngine.js +11 -49
  123. package/dist/social/ant-colony/index.js +6 -0
  124. package/dist/social/ant-colony/types.js +4 -8
  125. package/dist/social/channels/ChannelManager.js +8 -46
  126. package/dist/social/channels/DiapChannelBridge.js +9 -47
  127. package/dist/social/channels/InterestMatcher.js +2 -7
  128. package/dist/social/channels/channel-agent-session.js +309 -0
  129. package/dist/social/channels/channel-heartbeat-agent.js +494 -0
  130. package/dist/social/channels/diap-doc-parser.js +204 -0
  131. package/dist/social/channels/harness-workflow-integrator.js +446 -0
  132. package/dist/social/channels/index.js +9 -0
  133. package/dist/social/channels/types.js +3 -7
  134. package/dist/social/global-shared-context.js +6 -47
  135. package/dist/social/heartbeat.js +29 -72
  136. package/dist/social/persona/enhanced-persona.js +299 -0
  137. package/dist/web/client.js +302 -136
  138. package/dist/web/components/p2p/index.js +159 -9
  139. package/dist/web/components/p2p/p2p-connection.js +136 -0
  140. package/dist/web/components/p2p/p2p-manager.js +24 -0
  141. package/dist/web/components/p2p/p2p-store-memory.js +1 -1
  142. package/dist/web/components/p2p/types.js +7 -0
  143. package/dist/web/index.html +5 -0
  144. package/dist/web/style.css +118 -0
  145. package/package.json +12 -6
  146. package/scripts/build-cli.js +206 -0
  147. package/scripts/postinstall.js +153 -0
  148. package/src/agents/pi-sdk.ts +347 -28
  149. package/src/agents/protocol.ts +95 -1
  150. package/src/agents/workflow-pivot-loop.ts +674 -0
  151. package/src/bollharness/CLAUDE.md +73 -0
  152. package/src/bollharness/README.md +143 -0
  153. package/src/bollharness/README.zh-CN.md +131 -0
  154. package/src/bollharness/reference/boll-reference/scripts/hooks/stop-evaluator.md +57 -0
  155. package/src/bollharness/scripts/context-fragments/artifact-linkage.md +14 -0
  156. package/src/bollharness/scripts/context-fragments/auth-consumers.md +17 -0
  157. package/src/bollharness/scripts/context-fragments/bridge-constitution.md +13 -0
  158. package/src/bollharness/scripts/context-fragments/catalyst-distributed.md +18 -0
  159. package/src/bollharness/scripts/context-fragments/closure-checklist.md +13 -0
  160. package/src/bollharness/scripts/context-fragments/contract-consumers.md +15 -0
  161. package/src/bollharness/scripts/context-fragments/db-shared-structures.md +15 -0
  162. package/src/bollharness/scripts/context-fragments/fixed-three-layers.md +19 -0
  163. package/src/bollharness/scripts/context-fragments/general-dev-principles.md +11 -0
  164. package/src/bollharness/scripts/context-fragments/issue-first.md +8 -0
  165. package/src/bollharness/scripts/context-fragments/mcp-parity.md +16 -0
  166. package/src/bollharness/scripts/context-fragments/pi-agent-operations.md +108 -0
  167. package/src/bollharness/scripts/context-fragments/protocol-consumers.md +15 -0
  168. package/src/bollharness/scripts/context-fragments/run-events-consumers.md +15 -0
  169. package/src/bollharness/scripts/context-fragments/scene-fidelity.md +13 -0
  170. package/src/bollharness/scripts/context-fragments/truth-source-hierarchy.md +15 -0
  171. package/src/bollharness/scripts/context-fragments/two-language.md +15 -0
  172. package/src/bollharness/scripts/context-fragments/version-sources.md +14 -0
  173. package/src/bollharness/scripts/hooks/stop-evaluator.md +83 -0
  174. package/src/bollharness/templates/scaffold/CLAUDE.md +89 -0
  175. package/src/cli-entry.ts +304 -0
  176. package/src/heartbeat/DaemonManager.ts +283 -0
  177. package/src/heartbeat/HealthMonitor.ts +316 -0
  178. package/src/heartbeat/StartupVerifier.ts +223 -0
  179. package/src/heartbeat/Watchdog.ts +198 -0
  180. package/src/heartbeat/index.ts +108 -0
  181. package/src/heartbeat/types.ts +82 -0
  182. package/src/llm/config-store.ts +23 -5
  183. package/src/network/iroh-transport.ts +3 -3
  184. package/src/web/client.js +302 -136
  185. package/src/web/components/p2p/P2PModal.tsx +91 -3
  186. package/src/web/components/p2p/index.ts +171 -9
  187. package/src/web/components/p2p/p2p-connection.ts +153 -1
  188. package/src/web/components/p2p/p2p-manager.ts +39 -1
  189. package/src/web/components/p2p/p2p-store-memory.ts +1 -1
  190. package/src/web/components/p2p/p2p-tools.ts +315 -0
  191. package/src/web/components/p2p/types.ts +58 -0
  192. package/src/web/design.md +99 -0
  193. package/src/web/index.html +5 -0
  194. package/src/web/server.ts +353 -36
  195. package/src/web/style.css +118 -0
  196. package/tsconfig.cli.json +16 -0
  197. package/tsconfig.electron.json +1 -1
  198. package/tsconfig.json +1 -2
  199. package/dist/web/server.js +0 -1647
  200. package/dist/web/server.js.map +0 -1
@@ -1,49 +1,8 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
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 = sdk_1.KeyManager.generate();
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 sdk_1.KeyManager.sign(this.keyPair, new TextEncoder().encode(data));
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 sdk_1.KeyManager.verify(keyPair, new TextEncoder().encode(data), signature);
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 = p2p_js_1.p2pNetwork.getRelayAddress?.() || null;
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 = (0, multiaddr_1.multiaddr)(addr);
372
- const node = p2p_js_1.p2pNetwork.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 = p2p_js_1.p2pNetwork.node;
347
+ const node = p2pNetwork.node;
389
348
  if (node) {
390
- const ma = (0, multiaddr_1.multiaddr)(`${agent.relayAddr}/p2p/${agent.peerId}`);
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 = p2p_js_1.p2pNetwork.node;
368
+ const node = p2pNetwork.node;
410
369
  if (node) {
411
- const ma = (0, multiaddr_1.multiaddr)(`${relayAddr}/p2p/${agent.peerId}`);
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
- p2p_js_1.p2pNetwork.addPersistentPeer({
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 p2p_js_1.p2pNetwork.sendMessage(peerId, 'relay', new TextDecoder().decode(relayMsg));
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
- exports.AgentRegistry = AgentRegistry;
474
- exports.agentRegistry = new AgentRegistry();
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 p2p_js_1.p2pNetwork.sendMessage(agent.peerId, 'signed', messageStr);
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 p2p_js_1.p2pNetwork.sendMessage(agent.peerId, type, payload);
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 p2p_js_1.p2pNetwork.sendMessage(agent.peerId, type, payload);
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
- exports.AgentMessaging = AgentMessaging;
614
- exports.agentMessaging = new AgentMessaging(exports.agentRegistry);
615
- async function initializeAgentNetwork(ownDid, ownName, peerId, multiaddrs) {
616
- await exports.agentRegistry.initialize();
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
- exports.agentRegistry.setOwnEndpoint({
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
- p2p_js_1.p2pNetwork.setOwnDid(keyPair?.did || ownDid);
627
- p2p_js_1.p2pNetwork.onMessage('signed', async (data, from, did) => {
628
- await exports.agentMessaging.dispatchSignedMessage(data, from);
583
+ p2pNetwork.setOwnDid(keyPair?.did || ownDid);
584
+ p2pNetwork.onMessage('signed', async (data, from, did) => {
585
+ await agentMessaging.dispatchSignedMessage(data, from);
629
586
  });
630
- p2p_js_1.p2pNetwork.onMessage('address_broadcast', async (data, from, did) => {
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 exports.agentRegistry.handleAddressBroadcast(broadcast);
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
- p2p_js_1.p2pNetwork.onMessage('relay', (data, from, did) => {
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
- exports.agentRegistry.relayMessage(targetDid, new TextEncoder().encode(innerData), did || from, hops);
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
- p2p_js_1.p2pNetwork.onMessage('discovery', async (data, from, did) => {
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 exports.agentRegistry.verifySignature(discovery.from, JSON.stringify({ ...discovery, signature: undefined }), Buffer.from(discovery.signature, 'hex'));
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 exports.agentRegistry.createSignedBroadcast();
632
+ export async function broadcastOwnAddress() {
633
+ const broadcast = await agentRegistry.createSignedBroadcast();
677
634
  if (broadcast) {
678
635
  const data = JSON.stringify(broadcast);
679
- await p2p_js_1.p2pNetwork.broadcast('address_broadcast', data);
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 exports.agentRegistry.connectToAgent(did);
640
+ export async function findAndConnectToAgent(did) {
641
+ return agentRegistry.connectToAgent(did);
685
642
  }
686
- async function sendMessageToAgent(did, type, payload) {
687
- return exports.agentMessaging.sendSignedToAgent(did, type, payload);
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 exports.agentMessaging.sendToAgent(did, type, payload);
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
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
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 iroh_transport_js_1.irohTransport.start();
20
+ const node = await irohTransport.start();
26
21
  this.irohNodeId = node.nodeId;
27
22
  console.log(`[IrohIntegration] Node ID: ${this.irohNodeId}`);
28
- iroh_transport_js_1.irohTransport.onMessage('*', (msg) => {
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 iroh_transport_js_1.irohTransport.sendMessage(targetNodeId, type, payload);
75
+ return irohTransport.sendMessage(targetNodeId, type, payload);
81
76
  }
82
77
  async requestFrom(targetNodeId, type, payload) {
83
- return iroh_transport_js_1.irohTransport.requestResponse(targetNodeId, type, payload);
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 iroh_transport_js_1.irohTransport.shutdown();
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