@private.me/xbind 3.0.0 → 3.0.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 (217) hide show
  1. package/README.md +55 -7
  2. package/dist-standalone/_deps/mldsa-wasm/dist/mldsa.js +1920 -1
  3. package/dist-standalone/_deps/shared/cjs/errors.js +729 -1
  4. package/dist-standalone/_deps/shared/cjs/index.js +463 -1
  5. package/dist-standalone/_deps/shared/cjs/types.js +315 -1
  6. package/dist-standalone/_deps/shared/errors.js +244 -1
  7. package/dist-standalone/_deps/shared/index.js +72 -1
  8. package/dist-standalone/_deps/shared/types.js +86 -1
  9. package/dist-standalone/_deps/ux-helpers/cjs/errors.js +1 -1
  10. package/dist-standalone/_deps/ux-helpers/cjs/index.js +1 -1
  11. package/dist-standalone/_deps/ux-helpers/cjs/pagination.js +1 -1
  12. package/dist-standalone/_deps/ux-helpers/cjs/progress.js +1 -1
  13. package/dist-standalone/_deps/ux-helpers/cjs/search.js +1 -1
  14. package/dist-standalone/_deps/ux-helpers/cjs/types.js +1 -1
  15. package/dist-standalone/_deps/ux-helpers/errors.js +1 -1
  16. package/dist-standalone/_deps/ux-helpers/index.js +1 -1
  17. package/dist-standalone/_deps/ux-helpers/pagination.js +1 -1
  18. package/dist-standalone/_deps/ux-helpers/progress.js +1 -1
  19. package/dist-standalone/_deps/ux-helpers/search.js +1 -1
  20. package/dist-standalone/_deps/xchange/auto-accept.js +1 -1
  21. package/dist-standalone/_deps/xchange/cjs/auto-accept.js +1 -1
  22. package/dist-standalone/_deps/xchange/cjs/errors.js +1 -1
  23. package/dist-standalone/_deps/xchange/cjs/index.js +1 -1
  24. package/dist-standalone/_deps/xchange/cjs/invite-client.js +1 -1
  25. package/dist-standalone/_deps/xchange/cjs/lazy-init.js +1 -1
  26. package/dist-standalone/_deps/xchange/cjs/trust-integration.js +1 -1
  27. package/dist-standalone/_deps/xchange/cjs/xchange.js +1 -1
  28. package/dist-standalone/_deps/xchange/errors.js +1 -1
  29. package/dist-standalone/_deps/xchange/index.js +1 -1
  30. package/dist-standalone/_deps/xchange/invite-client.js +1 -1
  31. package/dist-standalone/_deps/xchange/lazy-init.js +1 -1
  32. package/dist-standalone/_deps/xchange/trust-integration.js +1 -1
  33. package/dist-standalone/_deps/xchange/xchange.js +1 -1
  34. package/dist-standalone/_deps/xregistry/cjs/discovery.js +1 -1
  35. package/dist-standalone/_deps/xregistry/cjs/errors.js +1 -1
  36. package/dist-standalone/_deps/xregistry/cjs/index.js +1 -1
  37. package/dist-standalone/_deps/xregistry/cjs/registry.js +1 -1
  38. package/dist-standalone/_deps/xregistry/cjs/schema.js +1 -1
  39. package/dist-standalone/_deps/xregistry/cjs/types.js +1 -1
  40. package/dist-standalone/_deps/xregistry/discovery.js +1 -1
  41. package/dist-standalone/_deps/xregistry/errors.js +1 -1
  42. package/dist-standalone/_deps/xregistry/index.js +1 -1
  43. package/dist-standalone/_deps/xregistry/registry.js +1 -1
  44. package/dist-standalone/_deps/xregistry/schema.js +1 -1
  45. package/dist-standalone/_deps/xregistry/types.js +1 -1
  46. package/dist-standalone/agent-call.js +659 -1
  47. package/dist-standalone/agent-sdk.js +328 -1
  48. package/dist-standalone/agent.js +1800 -1
  49. package/dist-standalone/approval.js +193 -1
  50. package/dist-standalone/async-iterators.js +382 -1
  51. package/dist-standalone/auth.js +219 -1
  52. package/dist-standalone/auto-accept.js +229 -1
  53. package/dist-standalone/backup-config.js +201 -1
  54. package/dist-standalone/backup.js +326 -1
  55. package/dist-standalone/batch-operations.js +388 -1
  56. package/dist-standalone/cancellation.js +477 -1
  57. package/dist-standalone/checkpoint.js +186 -1
  58. package/dist-standalone/circuit-breaker.js +468 -1
  59. package/dist-standalone/cjs/agent-call.js +701 -1
  60. package/dist-standalone/cjs/agent-sdk.js +332 -1
  61. package/dist-standalone/cjs/agent.js +1837 -1
  62. package/dist-standalone/cjs/approval.js +199 -1
  63. package/dist-standalone/cjs/async-iterators.js +392 -1
  64. package/dist-standalone/cjs/auth.js +225 -1
  65. package/dist-standalone/cjs/auto-accept.js +233 -1
  66. package/dist-standalone/cjs/backup-config.js +207 -1
  67. package/dist-standalone/cjs/backup.js +330 -1
  68. package/dist-standalone/cjs/batch-operations.js +397 -1
  69. package/dist-standalone/cjs/cancellation.js +490 -1
  70. package/dist-standalone/cjs/checkpoint.js +193 -1
  71. package/dist-standalone/cjs/circuit-breaker.js +476 -1
  72. package/dist-standalone/cjs/cli/init.js +492 -1
  73. package/dist-standalone/cjs/config-validation.js +522 -1
  74. package/dist-standalone/cjs/connect.js +312 -1
  75. package/dist-standalone/cjs/connection-pool.js +506 -1
  76. package/dist-standalone/cjs/correlation-id.js +339 -1
  77. package/dist-standalone/cjs/crypto-utils.js +176 -1
  78. package/dist-standalone/cjs/debug-mode.js +534 -1
  79. package/dist-standalone/cjs/did-document.js +101 -1
  80. package/dist-standalone/cjs/did-privateme.js +130 -1
  81. package/dist-standalone/cjs/did-web.js +201 -1
  82. package/dist-standalone/cjs/discovery.js +462 -1
  83. package/dist-standalone/cjs/dual-mode.js +251 -1
  84. package/dist-standalone/cjs/email-templates.js +313 -1
  85. package/dist-standalone/cjs/email-transport.js +239 -1
  86. package/dist-standalone/cjs/envelope.js +538 -1
  87. package/dist-standalone/cjs/errors.js +913 -1
  88. package/dist-standalone/cjs/event-emitter.js +461 -1
  89. package/dist-standalone/cjs/gateway-state.js +55 -1
  90. package/dist-standalone/cjs/gateway-transport.js +120 -1
  91. package/dist-standalone/cjs/graceful-degradation.js +403 -1
  92. package/dist-standalone/cjs/guardrails.js +223 -1
  93. package/dist-standalone/cjs/health-check.js +336 -1
  94. package/dist-standalone/cjs/http-compat.js +272 -1
  95. package/dist-standalone/cjs/http-status-map.js +571 -1
  96. package/dist-standalone/cjs/identity.js +645 -1
  97. package/dist-standalone/cjs/index.js +406 -1
  98. package/dist-standalone/cjs/invitation.js +421 -1
  99. package/dist-standalone/cjs/invite.js +328 -1
  100. package/dist-standalone/cjs/key-agreement.js +335 -1
  101. package/dist-standalone/cjs/lazy-init.js +300 -1
  102. package/dist-standalone/cjs/logger.js +291 -1
  103. package/dist-standalone/cjs/mdns-discovery.js +202 -1
  104. package/dist-standalone/cjs/nonce-store.js +80 -1
  105. package/dist-standalone/cjs/pairing-manager.js +223 -1
  106. package/dist-standalone/cjs/plugin-system.js +264 -1
  107. package/dist-standalone/cjs/plugins/logging.js +168 -1
  108. package/dist-standalone/cjs/plugins/metrics.js +181 -1
  109. package/dist-standalone/cjs/plugins/validation.js +302 -1
  110. package/dist-standalone/cjs/policy.js +320 -1
  111. package/dist-standalone/cjs/progress-callbacks.js +583 -1
  112. package/dist-standalone/cjs/redis-nonce-store.js +76 -1
  113. package/dist-standalone/cjs/registry-middleware.js +50 -1
  114. package/dist-standalone/cjs/retry-strategies.js +544 -1
  115. package/dist-standalone/cjs/retry-transport.js +102 -1
  116. package/dist-standalone/cjs/runtime/browser.js +533 -1
  117. package/dist-standalone/cjs/runtime/edge.js +526 -1
  118. package/dist-standalone/cjs/runtime/react-native.js +394 -1
  119. package/dist-standalone/cjs/security-policy.js +245 -1
  120. package/dist-standalone/cjs/serialization.js +1040 -1
  121. package/dist-standalone/cjs/split-channel.js +225 -1
  122. package/dist-standalone/cjs/subscription-proof.js +230 -1
  123. package/dist-standalone/cjs/succession.js +148 -1
  124. package/dist-standalone/cjs/timeouts.js +412 -1
  125. package/dist-standalone/cjs/trace-context.js +424 -1
  126. package/dist-standalone/cjs/trace-spans.js +495 -1
  127. package/dist-standalone/cjs/transport.js +63 -1
  128. package/dist-standalone/cjs/trust-registry.js +991 -1
  129. package/dist-standalone/cjs/types/error-response.js +56 -1
  130. package/dist-standalone/cjs/vault-auth.js +178 -1
  131. package/dist-standalone/cjs/vault-store-loader.js +194 -1
  132. package/dist-standalone/cjs/verify.js +25 -1
  133. package/dist-standalone/cjs/version-info.js +543 -1
  134. package/dist-standalone/cjs/xfetch.js +340 -1
  135. package/dist-standalone/cli/init.js +455 -1
  136. package/dist-standalone/cli/setup.js +514 -1
  137. package/dist-standalone/cli/types.js +27 -1
  138. package/dist-standalone/cli/xbind.js +148 -1
  139. package/dist-standalone/config-validation.js +513 -1
  140. package/dist-standalone/connect.js +274 -1
  141. package/dist-standalone/connection-pool.js +500 -1
  142. package/dist-standalone/correlation-id.js +326 -1
  143. package/dist-standalone/crypto-utils.js +157 -1
  144. package/dist-standalone/debug-mode.js +510 -1
  145. package/dist-standalone/did-document.js +96 -1
  146. package/dist-standalone/did-privateme.js +121 -1
  147. package/dist-standalone/did-web.js +196 -1
  148. package/dist-standalone/discovery.js +458 -1
  149. package/dist-standalone/dual-mode.js +247 -1
  150. package/dist-standalone/email-templates.js +309 -1
  151. package/dist-standalone/email-transport.js +232 -1
  152. package/dist-standalone/envelope.js +525 -1
  153. package/dist-standalone/errors.js +896 -1
  154. package/dist-standalone/event-emitter.js +456 -1
  155. package/dist-standalone/gateway-state.js +51 -1
  156. package/dist-standalone/gateway-transport.js +116 -1
  157. package/dist-standalone/graceful-degradation.js +396 -1
  158. package/dist-standalone/guardrails.js +216 -1
  159. package/dist-standalone/health-check.js +332 -1
  160. package/dist-standalone/http-compat.js +267 -1
  161. package/dist-standalone/http-status-map.js +561 -1
  162. package/dist-standalone/identity.js +619 -1
  163. package/dist-standalone/index.js +78 -1
  164. package/dist-standalone/invitation.js +415 -1
  165. package/dist-standalone/invite.js +324 -1
  166. package/dist-standalone/key-agreement.js +325 -1
  167. package/dist-standalone/lazy-init.js +295 -1
  168. package/dist-standalone/logger.js +285 -1
  169. package/dist-standalone/mdns-discovery.js +195 -1
  170. package/dist-standalone/nonce-store.js +76 -1
  171. package/dist-standalone/pairing-manager.js +219 -1
  172. package/dist-standalone/plugin-system.js +257 -1
  173. package/dist-standalone/plugins/logging.d.ts +84 -0
  174. package/dist-standalone/plugins/logging.js +163 -0
  175. package/dist-standalone/plugins/metrics.d.ts +111 -0
  176. package/dist-standalone/plugins/metrics.js +176 -0
  177. package/dist-standalone/plugins/validation.d.ts +104 -0
  178. package/dist-standalone/plugins/validation.js +297 -0
  179. package/dist-standalone/policy.js +315 -1
  180. package/dist-standalone/progress-callbacks.js +576 -1
  181. package/dist-standalone/redis-nonce-store.js +72 -1
  182. package/dist-standalone/registry-middleware.js +47 -1
  183. package/dist-standalone/retry-strategies.js +534 -1
  184. package/dist-standalone/retry-transport.js +98 -1
  185. package/dist-standalone/runtime/browser.d.ts +311 -0
  186. package/dist-standalone/runtime/browser.js +516 -0
  187. package/dist-standalone/runtime/edge.d.ts +282 -0
  188. package/dist-standalone/runtime/edge.js +511 -0
  189. package/dist-standalone/runtime/react-native.d.ts +157 -0
  190. package/dist-standalone/runtime/react-native.js +383 -0
  191. package/dist-standalone/security-policy.js +239 -1
  192. package/dist-standalone/serialization.js +1031 -1
  193. package/dist-standalone/split-channel.js +219 -1
  194. package/dist-standalone/subscription-proof.js +224 -1
  195. package/dist-standalone/succession.js +142 -1
  196. package/dist-standalone/timeouts.js +398 -1
  197. package/dist-standalone/trace-context.js +414 -1
  198. package/dist-standalone/trace-spans.js +488 -1
  199. package/dist-standalone/transport.js +59 -1
  200. package/dist-standalone/trust-registry.js +950 -1
  201. package/dist-standalone/types/error-response.d.ts +209 -0
  202. package/dist-standalone/types/error-response.js +52 -0
  203. package/dist-standalone/vault-auth.js +174 -1
  204. package/dist-standalone/vault-store-loader.js +187 -1
  205. package/dist-standalone/verify.js +16 -1
  206. package/dist-standalone/version-info.js +530 -1
  207. package/dist-standalone/xfetch.js +335 -1
  208. package/package.json +4 -10
  209. package/share1.dat +0 -0
  210. package/dist-standalone/_deps/mldsa-wasm/LICENSE +0 -24
  211. package/dist-standalone/_deps/mldsa-wasm/package.json +0 -46
  212. package/dist-standalone/_deps/shared/cjs/package.json +0 -1
  213. package/dist-standalone/_deps/ux-helpers/cjs/package.json +0 -1
  214. package/dist-standalone/_deps/xchange/cjs/package.json +0 -1
  215. package/dist-standalone/_deps/xregistry/cjs/package.json +0 -1
  216. package/dist-standalone/cjs/package.json +0 -3
  217. package/dist-standalone/package.json +0 -10
@@ -1 +1,274 @@
1
- import{ok,err}from"./_deps/shared/index.js";import{fromBase64,toBase64}from"./crypto-utils.js";import{Agent}from"./agent.js";import{ServiceDiscovery}from"./discovery.js";import{HttpsTransportAdapter}from"./transport.js";import{MemoryTrustRegistry}from"./trust-registry.js";import{importPublicKey}from"./identity.js";export var ConnectErrorCode;!function(e){e.DISCOVERY_FAILED="CONNECT_DISCOVERY_FAILED",e.AGENT_CREATION_FAILED="CONNECT_AGENT_CREATION_FAILED",e.TRUST_VERIFICATION_FAILED="CONNECT_TRUST_VERIFICATION_FAILED",e.INVALID_SERVICE_INFO="CONNECT_INVALID_SERVICE_INFO"}(ConnectErrorCode||(ConnectErrorCode={}));export async function connect(e,r={}){const t=r.discovery||new ServiceDiscovery,i=await t.discover(e);if(!i.ok)return err({code:ConnectErrorCode.DISCOVERY_FAILED,message:`Failed to discover service: ${i.error.message}`,hint:i.error.hint,cause:i.error});const o=i.value;if(!o.did||!o.endpoint||!o.publicKey)return err({code:ConnectErrorCode.INVALID_SERVICE_INFO,message:"Service info missing required fields (did, endpoint, publicKey)",hint:"Service must provide complete metadata"});const n=r.registry||new MemoryTrustRegistry;try{const e=fromBase64(o.publicKey),r=await importPublicKey(e);if(!r.ok)return err({code:ConnectErrorCode.TRUST_VERIFICATION_FAILED,message:"Invalid service public key",cause:r.error});await n.add({did:o.did,publicKey:r.value,x25519PublicKey:o.x25519PublicKey?await importPublicKey(fromBase64(o.x25519PublicKey)).then(e=>e.ok?e.value:void 0):void 0,mlKemPublicKey:o.mlKemPublicKey?fromBase64(o.mlKemPublicKey):void 0})}catch(e){return err({code:ConnectErrorCode.TRUST_VERIFICATION_FAILED,message:"Failed to verify service public key",cause:e})}const a=r.transport||new HttpsTransportAdapter({baseUrl:o.endpoint}),c={name:r.name||`client-${Date.now()}`,registry:n,transport:a,xchange:r.xchange,postQuantumSig:r.postQuantumSig},s=await Agent.create(c);return s.ok?ok({agent:s.value,service:o,did:o.did,endpoint:o.endpoint}):err({code:ConnectErrorCode.AGENT_CREATION_FAILED,message:"Failed to create agent",cause:s.error})}export async function acceptInvite(e,r={}){const{InviteService:t}=await import("./invite.js"),i=new t,o=await i.get(e);if(!o.ok)return err({code:ConnectErrorCode.DISCOVERY_FAILED,message:`Failed to get invite: ${o.error.message}`,cause:o.error});const n=o.value,a={name:n.from.name,did:n.from.did,endpoint:n.from.endpoint,publicKey:n.from.publicKey,x25519PublicKey:n.from.x25519PublicKey,mlKemPublicKey:n.from.mlKemPublicKey},c=r.registry||new MemoryTrustRegistry;try{const e=fromBase64(a.publicKey),r=await importPublicKey(e);if(!r.ok)return err({code:ConnectErrorCode.TRUST_VERIFICATION_FAILED,message:"Invalid service public key",cause:r.error});await c.add({did:a.did,publicKey:r.value,x25519PublicKey:a.x25519PublicKey?await importPublicKey(fromBase64(a.x25519PublicKey)).then(e=>e.ok?e.value:void 0):void 0,mlKemPublicKey:a.mlKemPublicKey?fromBase64(a.mlKemPublicKey):void 0})}catch(e){return err({code:ConnectErrorCode.TRUST_VERIFICATION_FAILED,message:"Failed to verify service public key",cause:e})}const s=r.transport||new HttpsTransportAdapter({baseUrl:a.endpoint}),d={name:r.name||`client-${Date.now()}`,registry:c,transport:s,xchange:r.xchange,postQuantumSig:r.postQuantumSig},u=await Agent.create(d);if(!u.ok)return err({code:ConnectErrorCode.AGENT_CREATION_FAILED,message:"Failed to create agent",cause:u.error});return(await i.accept({inviteUrl:e,acceptor:{name:d.name,did:u.value.did,endpoint:r.endpoint||"",publicKey:toBase64(u.value.identity.rawPublicKey),x25519PublicKey:u.value.identity.rawX25519PublicKey?toBase64(u.value.identity.rawX25519PublicKey):void 0}})).ok,ok({agent:u.value,service:a,did:a.did,endpoint:a.endpoint})}
1
+ /**
2
+ * @module connect
3
+ * High-level connect() API for zero-config XBind connections.
4
+ *
5
+ * Enables: `const service = await connect('payments-service')`
6
+ *
7
+ * Combines:
8
+ * - Service discovery
9
+ * - Trust verification
10
+ * - Agent creation
11
+ * - Connection establishment
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * import { connect } from '@private.me/xbind';
16
+ *
17
+ * // Connect by name (uses registry):
18
+ * const payments = await connect('payments-service');
19
+ *
20
+ * // Connect by domain (uses .well-known):
21
+ * const payments = await connect('payments.example.com');
22
+ *
23
+ * // Connect by URL (direct):
24
+ * const payments = await connect('https://api.payments.com/xbind');
25
+ *
26
+ * // Use the connection:
27
+ * await payments.send({
28
+ * to: payments.did,
29
+ * payload: { action: 'createCharge', amount: 100 },
30
+ * scope: 'payments',
31
+ * });
32
+ * ```
33
+ */
34
+ import { ok, err } from"./_deps/shared/index.js";
35
+ import { fromBase64, toBase64 } from './crypto-utils.js';
36
+ import { Agent } from './agent.js';
37
+ import { ServiceDiscovery } from './discovery.js';
38
+ import { HttpsTransportAdapter } from './transport.js';
39
+ import { MemoryTrustRegistry } from './trust-registry.js';
40
+ import { importPublicKey } from './identity.js';
41
+ /**
42
+ * Connect error codes.
43
+ */
44
+ export var ConnectErrorCode;
45
+ (function (ConnectErrorCode) {
46
+ ConnectErrorCode["DISCOVERY_FAILED"] = "CONNECT_DISCOVERY_FAILED";
47
+ ConnectErrorCode["AGENT_CREATION_FAILED"] = "CONNECT_AGENT_CREATION_FAILED";
48
+ ConnectErrorCode["TRUST_VERIFICATION_FAILED"] = "CONNECT_TRUST_VERIFICATION_FAILED";
49
+ ConnectErrorCode["INVALID_SERVICE_INFO"] = "CONNECT_INVALID_SERVICE_INFO";
50
+ })(ConnectErrorCode || (ConnectErrorCode = {}));
51
+ /**
52
+ * Connect to a service with zero configuration.
53
+ *
54
+ * @param nameOrUrl - Service name, domain, or URL
55
+ * @param options - Connection options
56
+ * @returns Connection or error
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * // Minimal:
61
+ * const connection = await connect('payments-service');
62
+ * if (connection.ok) {
63
+ * await connection.value.agent.send({
64
+ * to: connection.value.did,
65
+ * payload: { action: 'test' },
66
+ * scope: 'test',
67
+ * });
68
+ * }
69
+ *
70
+ * // With options:
71
+ * const connection = await connect('payments-service', {
72
+ * name: 'billing-service',
73
+ * xchange: true, // Use faster Xchange mode
74
+ * splitChannel: true, // Use split-channel by default
75
+ * });
76
+ * ```
77
+ */
78
+ export async function connect(nameOrUrl, options = {}) {
79
+ // Step 1: Discover service
80
+ const discovery = options.discovery || new ServiceDiscovery();
81
+ const serviceResult = await discovery.discover(nameOrUrl);
82
+ if (!serviceResult.ok) {
83
+ return err({
84
+ code: ConnectErrorCode.DISCOVERY_FAILED,
85
+ message: `Failed to discover service: ${serviceResult.error.message}`,
86
+ hint: serviceResult.error.hint,
87
+ cause: serviceResult.error,
88
+ });
89
+ }
90
+ const service = serviceResult.value;
91
+ // Step 2: Validate service info
92
+ if (!service.did || !service.endpoint || !service.publicKey) {
93
+ return err({
94
+ code: ConnectErrorCode.INVALID_SERVICE_INFO,
95
+ message: 'Service info missing required fields (did, endpoint, publicKey)',
96
+ hint: 'Service must provide complete metadata',
97
+ });
98
+ }
99
+ // Step 3: Create trust registry and add service
100
+ const registry = options.registry || new MemoryTrustRegistry();
101
+ try {
102
+ // Import public key (convert from base64 string)
103
+ const publicKeyBytes = fromBase64(service.publicKey);
104
+ const publicKeyResult = await importPublicKey(publicKeyBytes);
105
+ if (!publicKeyResult.ok) {
106
+ return err({
107
+ code: ConnectErrorCode.TRUST_VERIFICATION_FAILED,
108
+ message: 'Invalid service public key',
109
+ cause: publicKeyResult.error,
110
+ });
111
+ }
112
+ // Add to trust registry
113
+ await registry.add({
114
+ did: service.did,
115
+ publicKey: publicKeyResult.value,
116
+ x25519PublicKey: service.x25519PublicKey
117
+ ? await importPublicKey(fromBase64(service.x25519PublicKey)).then(r => r.ok ? r.value : undefined)
118
+ : undefined,
119
+ mlKemPublicKey: service.mlKemPublicKey
120
+ ? fromBase64(service.mlKemPublicKey)
121
+ : undefined,
122
+ });
123
+ }
124
+ catch (error) {
125
+ return err({
126
+ code: ConnectErrorCode.TRUST_VERIFICATION_FAILED,
127
+ message: 'Failed to verify service public key',
128
+ cause: error,
129
+ });
130
+ }
131
+ // Step 4: Create transport
132
+ const transport = options.transport || new HttpsTransportAdapter({
133
+ baseUrl: service.endpoint,
134
+ });
135
+ // Step 5: Create agent
136
+ const agentName = options.name || `client-${Date.now()}`;
137
+ const agentOptions = {
138
+ name: agentName,
139
+ registry,
140
+ transport,
141
+ xchange: options.xchange,
142
+ postQuantumSig: options.postQuantumSig,
143
+ };
144
+ const agentResult = await Agent.create(agentOptions);
145
+ if (!agentResult.ok) {
146
+ return err({
147
+ code: ConnectErrorCode.AGENT_CREATION_FAILED,
148
+ message: 'Failed to create agent',
149
+ cause: agentResult.error,
150
+ });
151
+ }
152
+ // Step 6: Return connection
153
+ return ok({
154
+ agent: agentResult.value,
155
+ service,
156
+ did: service.did,
157
+ endpoint: service.endpoint,
158
+ });
159
+ }
160
+ /**
161
+ * Accept an invite and establish connection.
162
+ *
163
+ * @param inviteUrl - Invite URL
164
+ * @param options - Connection options
165
+ * @returns Connection or error
166
+ *
167
+ * @example
168
+ * ```ts
169
+ * const connection = await acceptInvite('https://xbind.to/invite/abc123', {
170
+ * name: 'my-service',
171
+ * });
172
+ *
173
+ * if (connection.ok) {
174
+ * console.log('Connected to:', connection.value.service.name);
175
+ * }
176
+ * ```
177
+ */
178
+ export async function acceptInvite(inviteUrl, options = {}) {
179
+ const { InviteService } = await import('./invite.js');
180
+ const inviteService = new InviteService();
181
+ // Get invite details
182
+ const inviteResult = await inviteService.get(inviteUrl);
183
+ if (!inviteResult.ok) {
184
+ return err({
185
+ code: ConnectErrorCode.DISCOVERY_FAILED,
186
+ message: `Failed to get invite: ${inviteResult.error.message}`,
187
+ cause: inviteResult.error,
188
+ });
189
+ }
190
+ const invite = inviteResult.value;
191
+ // Convert invite.from to ServiceInfo
192
+ const service = {
193
+ name: invite.from.name,
194
+ did: invite.from.did,
195
+ endpoint: invite.from.endpoint,
196
+ publicKey: invite.from.publicKey,
197
+ x25519PublicKey: invite.from.x25519PublicKey,
198
+ mlKemPublicKey: invite.from.mlKemPublicKey,
199
+ };
200
+ // Connect to service (same as connect())
201
+ // Create trust registry and add service
202
+ const registry = options.registry || new MemoryTrustRegistry();
203
+ try {
204
+ // Import public key (convert from base64 string)
205
+ const publicKeyBytes = fromBase64(service.publicKey);
206
+ const publicKeyResult = await importPublicKey(publicKeyBytes);
207
+ if (!publicKeyResult.ok) {
208
+ return err({
209
+ code: ConnectErrorCode.TRUST_VERIFICATION_FAILED,
210
+ message: 'Invalid service public key',
211
+ cause: publicKeyResult.error,
212
+ });
213
+ }
214
+ await registry.add({
215
+ did: service.did,
216
+ publicKey: publicKeyResult.value,
217
+ x25519PublicKey: service.x25519PublicKey
218
+ ? await importPublicKey(fromBase64(service.x25519PublicKey)).then(r => r.ok ? r.value : undefined)
219
+ : undefined,
220
+ mlKemPublicKey: service.mlKemPublicKey
221
+ ? fromBase64(service.mlKemPublicKey)
222
+ : undefined,
223
+ });
224
+ }
225
+ catch (error) {
226
+ return err({
227
+ code: ConnectErrorCode.TRUST_VERIFICATION_FAILED,
228
+ message: 'Failed to verify service public key',
229
+ cause: error,
230
+ });
231
+ }
232
+ const transport = options.transport || new HttpsTransportAdapter({
233
+ baseUrl: service.endpoint,
234
+ });
235
+ const agentName = options.name || `client-${Date.now()}`;
236
+ const agentOptions = {
237
+ name: agentName,
238
+ registry,
239
+ transport,
240
+ xchange: options.xchange,
241
+ postQuantumSig: options.postQuantumSig,
242
+ };
243
+ const agentResult = await Agent.create(agentOptions);
244
+ if (!agentResult.ok) {
245
+ return err({
246
+ code: ConnectErrorCode.AGENT_CREATION_FAILED,
247
+ message: 'Failed to create agent',
248
+ cause: agentResult.error,
249
+ });
250
+ }
251
+ // Accept the invite
252
+ const acceptResult = await inviteService.accept({
253
+ inviteUrl,
254
+ acceptor: {
255
+ name: agentOptions.name,
256
+ did: agentResult.value.did,
257
+ endpoint: options.endpoint || '', // Agent's endpoint (where it can be reached), empty for client-only agents
258
+ publicKey: toBase64(agentResult.value.identity.rawPublicKey),
259
+ x25519PublicKey: agentResult.value.identity.rawX25519PublicKey
260
+ ? toBase64(agentResult.value.identity.rawX25519PublicKey)
261
+ : undefined,
262
+ },
263
+ });
264
+ if (!acceptResult.ok) {
265
+ // Connection created but invite acceptance failed - still return connection
266
+ // (invite acceptance is for tracking/notification, not required for connectivity)
267
+ }
268
+ return ok({
269
+ agent: agentResult.value,
270
+ service,
271
+ did: service.did,
272
+ endpoint: service.endpoint,
273
+ });
274
+ }