@private.me/xbind 1.3.5 → 3.0.0

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 (306) hide show
  1. package/LICENSES.md +212 -0
  2. package/README.md +388 -6
  3. package/dist-standalone/_deps/mldsa-wasm/dist/mldsa.js +1 -1920
  4. package/dist-standalone/_deps/shared/cjs/errors.js +1 -639
  5. package/dist-standalone/_deps/shared/cjs/index.js +1 -496
  6. package/dist-standalone/_deps/shared/cjs/types.js +1 -317
  7. package/dist-standalone/_deps/shared/errors.js +1 -255
  8. package/dist-standalone/_deps/shared/index.js +1 -74
  9. package/dist-standalone/_deps/shared/types.js +1 -90
  10. package/dist-standalone/_deps/ux-helpers/cjs/errors.js +1 -1
  11. package/dist-standalone/_deps/ux-helpers/cjs/index.js +1 -1
  12. package/dist-standalone/_deps/ux-helpers/cjs/pagination.js +1 -1
  13. package/dist-standalone/_deps/ux-helpers/cjs/progress.js +1 -1
  14. package/dist-standalone/_deps/ux-helpers/cjs/search.js +1 -1
  15. package/dist-standalone/_deps/ux-helpers/cjs/types.js +1 -1
  16. package/dist-standalone/_deps/ux-helpers/errors.js +1 -1
  17. package/dist-standalone/_deps/ux-helpers/index.js +1 -1
  18. package/dist-standalone/_deps/ux-helpers/pagination.js +1 -1
  19. package/dist-standalone/_deps/ux-helpers/progress.js +1 -1
  20. package/dist-standalone/_deps/ux-helpers/search.js +1 -1
  21. package/dist-standalone/_deps/xchange/auto-accept.js +1 -1
  22. package/dist-standalone/_deps/xchange/cjs/auto-accept.js +1 -1
  23. package/dist-standalone/_deps/xchange/cjs/errors.js +1 -1
  24. package/dist-standalone/_deps/xchange/cjs/index.js +1 -1
  25. package/dist-standalone/_deps/xchange/cjs/invite-client.js +1 -1
  26. package/dist-standalone/_deps/xchange/cjs/lazy-init.js +1 -1
  27. package/dist-standalone/_deps/xchange/cjs/trust-integration.js +1 -1
  28. package/dist-standalone/_deps/xchange/cjs/xchange.js +1 -1
  29. package/dist-standalone/_deps/xchange/errors.js +1 -1
  30. package/dist-standalone/_deps/xchange/index.js +1 -1
  31. package/dist-standalone/_deps/xchange/invite-client.js +1 -1
  32. package/dist-standalone/_deps/xchange/lazy-init.js +1 -1
  33. package/dist-standalone/_deps/xchange/trust-integration.js +1 -1
  34. package/dist-standalone/_deps/xchange/xchange.js +1 -1
  35. package/dist-standalone/_deps/xregistry/cjs/discovery.js +1 -1
  36. package/dist-standalone/_deps/xregistry/cjs/errors.js +1 -1
  37. package/dist-standalone/_deps/xregistry/cjs/index.js +1 -1
  38. package/dist-standalone/_deps/xregistry/cjs/registry.js +1 -1
  39. package/dist-standalone/_deps/xregistry/cjs/schema.js +1 -1
  40. package/dist-standalone/_deps/xregistry/cjs/types.js +1 -1
  41. package/dist-standalone/_deps/xregistry/discovery.js +1 -1
  42. package/dist-standalone/_deps/xregistry/errors.js +1 -1
  43. package/dist-standalone/_deps/xregistry/index.js +1 -1
  44. package/dist-standalone/_deps/xregistry/registry.js +1 -1
  45. package/dist-standalone/_deps/xregistry/schema.js +1 -1
  46. package/dist-standalone/_deps/xregistry/types.js +1 -1
  47. package/dist-standalone/agent-call.js +1 -642
  48. package/dist-standalone/agent-sdk.js +1 -328
  49. package/dist-standalone/agent.d.ts +95 -5
  50. package/dist-standalone/agent.js +1 -1545
  51. package/dist-standalone/approval.js +1 -193
  52. package/dist-standalone/async-iterators.d.ts +275 -0
  53. package/dist-standalone/async-iterators.js +1 -0
  54. package/dist-standalone/auth.js +1 -219
  55. package/dist-standalone/auto-accept.js +1 -229
  56. package/dist-standalone/backup-config.js +1 -201
  57. package/dist-standalone/backup.d.ts +114 -0
  58. package/dist-standalone/backup.js +1 -0
  59. package/dist-standalone/batch-operations.d.ts +297 -0
  60. package/dist-standalone/batch-operations.js +1 -0
  61. package/dist-standalone/cancellation.d.ts +301 -0
  62. package/dist-standalone/cancellation.js +1 -0
  63. package/dist-standalone/checkpoint.js +1 -186
  64. package/dist-standalone/circuit-breaker.d.ts +351 -0
  65. package/dist-standalone/circuit-breaker.js +1 -0
  66. package/dist-standalone/cjs/agent-call.js +1 -651
  67. package/dist-standalone/cjs/agent-sdk.js +1 -332
  68. package/dist-standalone/cjs/agent.js +1 -1582
  69. package/dist-standalone/cjs/approval.js +1 -199
  70. package/dist-standalone/cjs/async-iterators.js +1 -0
  71. package/dist-standalone/cjs/auth.js +1 -225
  72. package/dist-standalone/cjs/auto-accept.js +1 -233
  73. package/dist-standalone/cjs/backup-config.js +1 -207
  74. package/dist-standalone/cjs/backup.js +1 -0
  75. package/dist-standalone/cjs/batch-operations.js +1 -0
  76. package/dist-standalone/cjs/cancellation.js +1 -0
  77. package/dist-standalone/cjs/checkpoint.js +1 -193
  78. package/dist-standalone/cjs/circuit-breaker.js +1 -0
  79. package/dist-standalone/cjs/cli/init.js +1 -486
  80. package/dist-standalone/cjs/config-validation.js +1 -0
  81. package/dist-standalone/cjs/connect.js +1 -312
  82. package/dist-standalone/cjs/connection-pool.js +1 -0
  83. package/dist-standalone/cjs/correlation-id.js +1 -339
  84. package/dist-standalone/cjs/crypto-utils.js +1 -0
  85. package/dist-standalone/cjs/debug-mode.js +1 -0
  86. package/dist-standalone/cjs/did-document.js +1 -101
  87. package/dist-standalone/cjs/did-privateme.js +1 -130
  88. package/dist-standalone/cjs/did-web.js +1 -201
  89. package/dist-standalone/cjs/discovery.js +1 -462
  90. package/dist-standalone/cjs/dual-mode.js +1 -251
  91. package/dist-standalone/cjs/email-templates.js +1 -313
  92. package/dist-standalone/cjs/email-transport.js +1 -239
  93. package/dist-standalone/cjs/envelope.js +1 -510
  94. package/dist-standalone/cjs/errors.js +1 -826
  95. package/dist-standalone/cjs/event-emitter.js +1 -0
  96. package/dist-standalone/cjs/gateway-state.js +1 -55
  97. package/dist-standalone/cjs/gateway-transport.js +1 -120
  98. package/dist-standalone/cjs/graceful-degradation.js +1 -0
  99. package/dist-standalone/cjs/guardrails.js +1 -223
  100. package/dist-standalone/cjs/health-check.js +1 -0
  101. package/dist-standalone/cjs/http-compat.js +1 -272
  102. package/dist-standalone/cjs/http-status-map.js +1 -571
  103. package/dist-standalone/cjs/identity.js +1 -540
  104. package/dist-standalone/cjs/index.js +1 -237
  105. package/dist-standalone/cjs/invitation.js +1 -421
  106. package/dist-standalone/cjs/invite.js +1 -328
  107. package/dist-standalone/cjs/key-agreement.js +1 -246
  108. package/dist-standalone/cjs/lazy-init.js +1 -300
  109. package/dist-standalone/cjs/logger.js +1 -0
  110. package/dist-standalone/cjs/mdns-discovery.js +1 -202
  111. package/dist-standalone/cjs/nonce-store.js +1 -66
  112. package/dist-standalone/cjs/pairing-manager.js +1 -223
  113. package/dist-standalone/cjs/plugin-system.js +1 -0
  114. package/dist-standalone/cjs/plugins/logging.js +1 -0
  115. package/dist-standalone/cjs/plugins/metrics.js +1 -0
  116. package/dist-standalone/cjs/plugins/validation.js +1 -0
  117. package/dist-standalone/cjs/policy.js +1 -320
  118. package/dist-standalone/cjs/progress-callbacks.js +1 -0
  119. package/dist-standalone/cjs/redis-nonce-store.js +1 -76
  120. package/dist-standalone/cjs/registry-middleware.js +1 -50
  121. package/dist-standalone/cjs/retry-strategies.js +1 -0
  122. package/dist-standalone/cjs/retry-transport.js +1 -102
  123. package/dist-standalone/cjs/runtime/browser.js +1 -0
  124. package/dist-standalone/cjs/runtime/edge.js +1 -0
  125. package/dist-standalone/cjs/runtime/react-native.js +1 -0
  126. package/dist-standalone/cjs/security-policy.js +1 -245
  127. package/dist-standalone/cjs/serialization.js +1 -0
  128. package/dist-standalone/cjs/split-channel.js +1 -177
  129. package/dist-standalone/cjs/subscription-proof.js +1 -230
  130. package/dist-standalone/cjs/succession.js +1 -148
  131. package/dist-standalone/cjs/timeouts.js +1 -0
  132. package/dist-standalone/cjs/trace-context.js +1 -0
  133. package/dist-standalone/cjs/trace-spans.js +1 -0
  134. package/dist-standalone/cjs/transport.js +1 -63
  135. package/dist-standalone/cjs/trust-registry.js +1 -742
  136. package/dist-standalone/cjs/types/error-response.js +1 -56
  137. package/dist-standalone/cjs/vault-auth.js +1 -0
  138. package/dist-standalone/cjs/vault-store-loader.js +1 -0
  139. package/dist-standalone/cjs/verify.js +1 -25
  140. package/dist-standalone/cjs/version-info.js +1 -0
  141. package/dist-standalone/cjs/xfetch.js +1 -252
  142. package/dist-standalone/cli/init.js +1 -449
  143. package/dist-standalone/cli/setup.js +1 -514
  144. package/dist-standalone/cli/types.js +1 -27
  145. package/dist-standalone/cli/xbind.js +1 -148
  146. package/dist-standalone/config-validation.d.ts +185 -0
  147. package/dist-standalone/config-validation.js +1 -0
  148. package/dist-standalone/connect.js +1 -274
  149. package/dist-standalone/connection-pool.d.ts +251 -0
  150. package/dist-standalone/connection-pool.js +1 -0
  151. package/dist-standalone/correlation-id.js +1 -326
  152. package/dist-standalone/crypto-utils.d.ts +60 -0
  153. package/dist-standalone/crypto-utils.js +1 -0
  154. package/dist-standalone/debug-mode.d.ts +286 -0
  155. package/dist-standalone/debug-mode.js +1 -0
  156. package/dist-standalone/did-document.js +1 -96
  157. package/dist-standalone/did-privateme.js +1 -121
  158. package/dist-standalone/did-web.js +1 -196
  159. package/dist-standalone/discovery.js +1 -458
  160. package/dist-standalone/dual-mode.js +1 -247
  161. package/dist-standalone/email-templates.js +1 -309
  162. package/dist-standalone/email-transport.js +1 -232
  163. package/dist-standalone/envelope.d.ts +29 -1
  164. package/dist-standalone/envelope.js +1 -497
  165. package/dist-standalone/errors.d.ts +10 -0
  166. package/dist-standalone/errors.js +1 -811
  167. package/dist-standalone/event-emitter.d.ts +395 -0
  168. package/dist-standalone/event-emitter.js +1 -0
  169. package/dist-standalone/gateway-state.js +1 -51
  170. package/dist-standalone/gateway-transport.js +1 -116
  171. package/dist-standalone/graceful-degradation.d.ts +246 -0
  172. package/dist-standalone/graceful-degradation.js +1 -0
  173. package/dist-standalone/guardrails.js +1 -216
  174. package/dist-standalone/health-check.d.ts +150 -0
  175. package/dist-standalone/health-check.js +1 -0
  176. package/dist-standalone/http-compat.js +1 -267
  177. package/dist-standalone/http-status-map.js +1 -561
  178. package/dist-standalone/identity.d.ts +64 -1
  179. package/dist-standalone/identity.js +1 -515
  180. package/dist-standalone/index.d.ts +45 -3
  181. package/dist-standalone/index.js +1 -52
  182. package/dist-standalone/invitation.js +1 -415
  183. package/dist-standalone/invite.js +1 -324
  184. package/dist-standalone/key-agreement.d.ts +61 -13
  185. package/dist-standalone/key-agreement.js +1 -236
  186. package/dist-standalone/lazy-init.js +1 -295
  187. package/dist-standalone/logger.d.ts +77 -0
  188. package/dist-standalone/logger.js +1 -0
  189. package/dist-standalone/mdns-discovery.js +1 -195
  190. package/dist-standalone/nonce-store.d.ts +16 -3
  191. package/dist-standalone/nonce-store.js +1 -62
  192. package/dist-standalone/package.json +0 -1
  193. package/dist-standalone/pairing-manager.js +1 -219
  194. package/dist-standalone/plugin-system.d.ts +145 -0
  195. package/dist-standalone/plugin-system.js +1 -0
  196. package/dist-standalone/policy.js +1 -315
  197. package/dist-standalone/progress-callbacks.d.ts +394 -0
  198. package/dist-standalone/progress-callbacks.js +1 -0
  199. package/dist-standalone/redis-nonce-store.js +1 -72
  200. package/dist-standalone/registry-middleware.js +1 -47
  201. package/dist-standalone/retry-strategies.d.ts +382 -0
  202. package/dist-standalone/retry-strategies.js +1 -0
  203. package/dist-standalone/retry-transport.js +1 -98
  204. package/dist-standalone/security-policy.js +1 -239
  205. package/dist-standalone/serialization.d.ts +244 -0
  206. package/dist-standalone/serialization.js +1 -0
  207. package/dist-standalone/split-channel.d.ts +49 -1
  208. package/dist-standalone/split-channel.js +1 -171
  209. package/dist-standalone/subscription-proof.js +1 -224
  210. package/dist-standalone/succession.js +1 -142
  211. package/dist-standalone/timeouts.d.ts +275 -0
  212. package/dist-standalone/timeouts.js +1 -0
  213. package/dist-standalone/trace-context.d.ts +252 -0
  214. package/dist-standalone/trace-context.js +1 -0
  215. package/dist-standalone/trace-spans.d.ts +360 -0
  216. package/dist-standalone/trace-spans.js +1 -0
  217. package/dist-standalone/transport.js +1 -59
  218. package/dist-standalone/trust-registry.d.ts +106 -5
  219. package/dist-standalone/trust-registry.js +1 -702
  220. package/dist-standalone/vault-auth.d.ts +91 -0
  221. package/dist-standalone/vault-auth.js +1 -0
  222. package/dist-standalone/vault-store-loader.d.ts +110 -0
  223. package/dist-standalone/vault-store-loader.js +1 -0
  224. package/dist-standalone/verify.js +1 -16
  225. package/dist-standalone/version-info.d.ts +259 -0
  226. package/dist-standalone/version-info.js +1 -0
  227. package/dist-standalone/xfetch.js +1 -247
  228. package/llms.txt +1 -0
  229. package/package.json +65 -5
  230. package/share1.dat +0 -0
  231. package/dist-standalone/_deps/crypto/base64.d.ts +0 -29
  232. package/dist-standalone/_deps/crypto/base64.js +0 -222
  233. package/dist-standalone/_deps/crypto/cjs/base64.js +0 -665
  234. package/dist-standalone/_deps/crypto/cjs/errors.js +0 -675
  235. package/dist-standalone/_deps/crypto/cjs/hmac.js +0 -473
  236. package/dist-standalone/_deps/crypto/cjs/index.js +0 -852
  237. package/dist-standalone/_deps/crypto/cjs/package.json +0 -1
  238. package/dist-standalone/_deps/crypto/cjs/padding.js +0 -511
  239. package/dist-standalone/_deps/crypto/cjs/share-header.js +0 -372
  240. package/dist-standalone/_deps/crypto/cjs/shares.js +0 -874
  241. package/dist-standalone/_deps/crypto/cjs/tlv.js +0 -1021
  242. package/dist-standalone/_deps/crypto/cjs/uuid.js +0 -443
  243. package/dist-standalone/_deps/crypto/cjs/verify.js +0 -414
  244. package/dist-standalone/_deps/crypto/cjs/xorida.js +0 -923
  245. package/dist-standalone/_deps/crypto/errors.d.ts +0 -51
  246. package/dist-standalone/_deps/crypto/errors.js +0 -199
  247. package/dist-standalone/_deps/crypto/hmac.d.ts +0 -39
  248. package/dist-standalone/_deps/crypto/hmac.js +0 -134
  249. package/dist-standalone/_deps/crypto/index.d.ts +0 -20
  250. package/dist-standalone/_deps/crypto/index.js +0 -145
  251. package/dist-standalone/_deps/crypto/padding.d.ts +0 -19
  252. package/dist-standalone/_deps/crypto/padding.js +0 -159
  253. package/dist-standalone/_deps/crypto/share-header.d.ts +0 -44
  254. package/dist-standalone/_deps/crypto/share-header.js +0 -92
  255. package/dist-standalone/_deps/crypto/shares.d.ts +0 -27
  256. package/dist-standalone/_deps/crypto/shares.js +0 -295
  257. package/dist-standalone/_deps/crypto/tlv.d.ts +0 -26
  258. package/dist-standalone/_deps/crypto/tlv.js +0 -364
  259. package/dist-standalone/_deps/crypto/uuid.d.ts +0 -22
  260. package/dist-standalone/_deps/crypto/uuid.js +0 -136
  261. package/dist-standalone/_deps/crypto/verify.d.ts +0 -15
  262. package/dist-standalone/_deps/crypto/verify.js +0 -71
  263. package/dist-standalone/_deps/crypto/xorida.d.ts +0 -44
  264. package/dist-standalone/_deps/crypto/xorida.js +0 -366
  265. package/dist-standalone/_deps/shared/errors.d.ts.map +0 -1
  266. package/dist-standalone/_deps/shared/errors.js.map +0 -1
  267. package/dist-standalone/_deps/shared/index.d.ts.map +0 -1
  268. package/dist-standalone/_deps/shared/index.js.map +0 -1
  269. package/dist-standalone/_deps/shared/types.d.ts.map +0 -1
  270. package/dist-standalone/_deps/shared/types.js.map +0 -1
  271. package/dist-standalone/_deps/ux-helpers/cjs/errors.d.ts.map +0 -1
  272. package/dist-standalone/_deps/ux-helpers/cjs/errors.js.map +0 -1
  273. package/dist-standalone/_deps/ux-helpers/cjs/index.d.ts.map +0 -1
  274. package/dist-standalone/_deps/ux-helpers/cjs/index.js.map +0 -1
  275. package/dist-standalone/_deps/ux-helpers/cjs/pagination.d.ts.map +0 -1
  276. package/dist-standalone/_deps/ux-helpers/cjs/pagination.js.map +0 -1
  277. package/dist-standalone/_deps/ux-helpers/cjs/progress.d.ts.map +0 -1
  278. package/dist-standalone/_deps/ux-helpers/cjs/progress.js.map +0 -1
  279. package/dist-standalone/_deps/ux-helpers/cjs/search.d.ts.map +0 -1
  280. package/dist-standalone/_deps/ux-helpers/cjs/search.js.map +0 -1
  281. package/dist-standalone/_deps/ux-helpers/cjs/types.d.ts.map +0 -1
  282. package/dist-standalone/_deps/ux-helpers/cjs/types.js.map +0 -1
  283. package/dist-standalone/_deps/ux-helpers/errors.d.ts.map +0 -1
  284. package/dist-standalone/_deps/ux-helpers/errors.js.map +0 -1
  285. package/dist-standalone/_deps/ux-helpers/index.d.ts.map +0 -1
  286. package/dist-standalone/_deps/ux-helpers/index.js.map +0 -1
  287. package/dist-standalone/_deps/ux-helpers/pagination.d.ts.map +0 -1
  288. package/dist-standalone/_deps/ux-helpers/pagination.js.map +0 -1
  289. package/dist-standalone/_deps/ux-helpers/progress.d.ts.map +0 -1
  290. package/dist-standalone/_deps/ux-helpers/progress.js.map +0 -1
  291. package/dist-standalone/_deps/ux-helpers/search.d.ts.map +0 -1
  292. package/dist-standalone/_deps/ux-helpers/search.js.map +0 -1
  293. package/dist-standalone/_deps/ux-helpers/types.d.ts.map +0 -1
  294. package/dist-standalone/_deps/ux-helpers/types.js.map +0 -1
  295. package/dist-standalone/_deps/xregistry/discovery.d.ts.map +0 -1
  296. package/dist-standalone/_deps/xregistry/discovery.js.map +0 -1
  297. package/dist-standalone/_deps/xregistry/errors.d.ts.map +0 -1
  298. package/dist-standalone/_deps/xregistry/errors.js.map +0 -1
  299. package/dist-standalone/_deps/xregistry/index.d.ts.map +0 -1
  300. package/dist-standalone/_deps/xregistry/index.js.map +0 -1
  301. package/dist-standalone/_deps/xregistry/registry.d.ts.map +0 -1
  302. package/dist-standalone/_deps/xregistry/registry.js.map +0 -1
  303. package/dist-standalone/_deps/xregistry/schema.d.ts.map +0 -1
  304. package/dist-standalone/_deps/xregistry/schema.js.map +0 -1
  305. package/dist-standalone/_deps/xregistry/types.d.ts.map +0 -1
  306. package/dist-standalone/_deps/xregistry/types.js.map +0 -1
@@ -1,199 +1 @@
1
- "use strict";
2
- /**
3
- * @module approval
4
- * OAuth-style approval flow for agents
5
- *
6
- * Enterprise agents require explicit user consent before performing
7
- * sensitive operations. This module implements OAuth-style consent
8
- * screens and approval tokens.
9
- */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.ApprovalFlow = exports.CLIApprovalPresenter = exports.ApprovalError = exports.ApprovalErrorCode = void 0;
12
- const shared_1 = require("../_deps/shared/index.js");
13
- /**
14
- * Approval error codes
15
- */
16
- var ApprovalErrorCode;
17
- (function (ApprovalErrorCode) {
18
- ApprovalErrorCode["USER_DENIED"] = "APPROVAL_USER_DENIED";
19
- ApprovalErrorCode["TIMEOUT"] = "APPROVAL_TIMEOUT";
20
- ApprovalErrorCode["INVALID_DURATION"] = "APPROVAL_INVALID_DURATION";
21
- ApprovalErrorCode["SIGNATURE_FAILED"] = "APPROVAL_SIGNATURE_FAILED";
22
- ApprovalErrorCode["TOKEN_EXPIRED"] = "APPROVAL_TOKEN_EXPIRED";
23
- ApprovalErrorCode["TOKEN_REVOKED"] = "APPROVAL_TOKEN_REVOKED";
24
- ApprovalErrorCode["INVALID_TOKEN"] = "APPROVAL_INVALID_TOKEN";
25
- })(ApprovalErrorCode || (exports.ApprovalErrorCode = ApprovalErrorCode = {}));
26
- /**
27
- * Approval error
28
- */
29
- class ApprovalError extends Error {
30
- code;
31
- details;
32
- constructor(code, message, details) {
33
- super(message);
34
- this.code = code;
35
- this.details = details;
36
- this.name = 'ApprovalError';
37
- }
38
- }
39
- exports.ApprovalError = ApprovalError;
40
- /**
41
- * CLI approval presenter (prints to console, reads stdin)
42
- * This is a legitimate CLI interface - console output is intentional
43
- */
44
- class CLIApprovalPresenter {
45
- /* eslint-disable no-console */
46
- async present(options) {
47
- console.log('\n=== AGENT APPROVAL REQUEST ===');
48
- console.log(`Agent: ${options.agentDid}`);
49
- console.log(`Duration: ${options.duration}`);
50
- console.log('\nRequested Scopes:');
51
- for (const scope of options.scopes) {
52
- console.log(` - ${scope}`);
53
- }
54
- if (options.limits) {
55
- console.log('\nPolicy Limits:');
56
- if (options.limits.amountPerTxn) {
57
- console.log(` - Max per transaction: $${options.limits.amountPerTxn.toLocaleString()}`);
58
- }
59
- if (options.limits.dailyAmount) {
60
- console.log(` - Daily limit: $${options.limits.dailyAmount.toLocaleString()}`);
61
- }
62
- if (options.limits.callsPerMinute) {
63
- console.log(` - Rate limit: ${options.limits.callsPerMinute} calls/minute`);
64
- }
65
- }
66
- if (options.description) {
67
- console.log(`\nDescription: ${options.description}`);
68
- }
69
- console.log('\n[This is a mock presenter - auto-approving for development]');
70
- console.log('In production, this would prompt for user input.\n');
71
- // Auto-approve for development (production would prompt for y/n)
72
- return (0, shared_1.ok)({
73
- approved: true,
74
- });
75
- }
76
- }
77
- exports.CLIApprovalPresenter = CLIApprovalPresenter;
78
- /**
79
- * Approval flow coordinator
80
- *
81
- * Orchestrates the consent flow: present to user → sign token → track expiry
82
- */
83
- class ApprovalFlow {
84
- presenter;
85
- tokens = new Map();
86
- constructor(options = {}) {
87
- this.presenter = options.presenter ?? new CLIApprovalPresenter();
88
- }
89
- /**
90
- * Request approval from user
91
- *
92
- * @param options - Approval request options
93
- * @returns Approval result with token (if approved)
94
- */
95
- async requestApproval(options) {
96
- // Validate duration
97
- const durationMs = this.parseDuration(options.duration);
98
- if (durationMs <= 0) {
99
- return (0, shared_1.err)(new ApprovalError(ApprovalErrorCode.INVALID_DURATION, `Invalid duration: ${options.duration}`));
100
- }
101
- // Present to user
102
- const result = await this.presenter.present(options);
103
- if (!result.ok)
104
- return result;
105
- if (!result.value.approved) {
106
- return (0, shared_1.ok)({
107
- approved: false,
108
- reason: result.value.reason ?? 'User denied approval',
109
- });
110
- }
111
- // Generate approval token
112
- const now = Date.now();
113
- const token = {
114
- id: this.generateTokenId(),
115
- agentDid: options.agentDid,
116
- scopes: options.scopes,
117
- limits: options.limits,
118
- expiresAt: now + durationMs,
119
- createdAt: now,
120
- valid: true,
121
- signature: await this.signToken(options.agentDid, options.scopes, now + durationMs),
122
- };
123
- // Store token
124
- this.tokens.set(token.id, token);
125
- return (0, shared_1.ok)({
126
- approved: true,
127
- token,
128
- });
129
- }
130
- /**
131
- * Verify an approval token
132
- *
133
- * @param tokenId - Token ID to verify
134
- * @returns Token if valid, error otherwise
135
- */
136
- verifyToken(tokenId) {
137
- const token = this.tokens.get(tokenId);
138
- if (!token) {
139
- return (0, shared_1.err)(new ApprovalError(ApprovalErrorCode.INVALID_TOKEN, `Token ${tokenId} not found`));
140
- }
141
- if (!token.valid) {
142
- return (0, shared_1.err)(new ApprovalError(ApprovalErrorCode.TOKEN_REVOKED, `Token ${tokenId} has been revoked`));
143
- }
144
- if (Date.now() > token.expiresAt) {
145
- return (0, shared_1.err)(new ApprovalError(ApprovalErrorCode.TOKEN_EXPIRED, `Token ${tokenId} expired at ${new Date(token.expiresAt).toISOString()}`));
146
- }
147
- return (0, shared_1.ok)(token);
148
- }
149
- /**
150
- * Revoke an approval token
151
- *
152
- * @param tokenId - Token ID to revoke
153
- */
154
- revokeToken(tokenId) {
155
- const token = this.tokens.get(tokenId);
156
- if (token) {
157
- this.tokens.set(tokenId, { ...token, valid: false });
158
- }
159
- }
160
- /**
161
- * Parse duration string to milliseconds
162
- */
163
- parseDuration(duration) {
164
- if (typeof duration === 'number')
165
- return duration;
166
- // Parse ISO 8601 duration or simple format
167
- const matches = duration.match(/^(\d+)([smhd])$/);
168
- if (!matches)
169
- return -1;
170
- const value = parseInt(matches[1] ?? '0', 10);
171
- const unit = matches[2];
172
- switch (unit) {
173
- case 's': return value * 1000;
174
- case 'm': return value * 60 * 1000;
175
- case 'h': return value * 60 * 60 * 1000;
176
- case 'd': return value * 24 * 60 * 60 * 1000;
177
- default: return -1;
178
- }
179
- }
180
- /**
181
- * Generate a unique token ID
182
- */
183
- generateTokenId() {
184
- const randomBytes = new Uint8Array(12);
185
- crypto.getRandomValues(randomBytes);
186
- const randomString = Array.from(randomBytes, b => b.toString(16).padStart(2, '0')).join('');
187
- return `appr_${Date.now()}_${randomString}`;
188
- }
189
- /**
190
- * Sign an approval token (stub - production would use Ed25519)
191
- */
192
- async signToken(agentDid, scopes, expiresAt) {
193
- // Production would use Ed25519 signature over JSON.stringify({ agentDid, scopes, expiresAt })
194
- // For now, return a mock signature
195
- const payload = JSON.stringify({ agentDid, scopes, expiresAt });
196
- return btoa(payload).substring(0, 32);
197
- }
198
- }
199
- exports.ApprovalFlow = ApprovalFlow;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ApprovalFlow=exports.CLIApprovalPresenter=exports.ApprovalError=exports.ApprovalErrorCode=void 0;const shared_1=require("../_deps/shared/index.js");var ApprovalErrorCode;!function(r){r.USER_DENIED="APPROVAL_USER_DENIED",r.TIMEOUT="APPROVAL_TIMEOUT",r.INVALID_DURATION="APPROVAL_INVALID_DURATION",r.SIGNATURE_FAILED="APPROVAL_SIGNATURE_FAILED",r.TOKEN_EXPIRED="APPROVAL_TOKEN_EXPIRED",r.TOKEN_REVOKED="APPROVAL_TOKEN_REVOKED",r.INVALID_TOKEN="APPROVAL_INVALID_TOKEN"}(ApprovalErrorCode||(exports.ApprovalErrorCode=ApprovalErrorCode={}));class ApprovalError extends Error{code;details;constructor(r,e,o){super(e),this.code=r,this.details=o,this.name="ApprovalError"}}exports.ApprovalError=ApprovalError;class CLIApprovalPresenter{async present(r){console.log("\n=== AGENT APPROVAL REQUEST ==="),console.log(`Agent: ${r.agentDid}`),console.log(`Duration: ${r.duration}`),console.log("\nRequested Scopes:");for(const e of r.scopes)console.log(` - ${e}`);return r.limits&&(console.log("\nPolicy Limits:"),r.limits.amountPerTxn&&console.log(` - Max per transaction: $${r.limits.amountPerTxn.toLocaleString()}`),r.limits.dailyAmount&&console.log(` - Daily limit: $${r.limits.dailyAmount.toLocaleString()}`),r.limits.callsPerMinute&&console.log(` - Rate limit: ${r.limits.callsPerMinute} calls/minute`)),r.description&&console.log(`\nDescription: ${r.description}`),console.log("\n[This is a mock presenter - auto-approving for development]"),console.log("In production, this would prompt for user input.\n"),(0,shared_1.ok)({approved:!0})}}exports.CLIApprovalPresenter=CLIApprovalPresenter;class ApprovalFlow{presenter;tokens=new Map;constructor(r={}){this.presenter=r.presenter??new CLIApprovalPresenter}async requestApproval(r){const e=this.parseDuration(r.duration);if(e<=0)return(0,shared_1.err)(new ApprovalError(ApprovalErrorCode.INVALID_DURATION,`Invalid duration: ${r.duration}`));const o=await this.presenter.present(r);if(!o.ok)return o;if(!o.value.approved)return(0,shared_1.ok)({approved:!1,reason:o.value.reason??"User denied approval"});const t=Date.now(),s={id:this.generateTokenId(),agentDid:r.agentDid,scopes:r.scopes,limits:r.limits,expiresAt:t+e,createdAt:t,valid:!0,signature:await this.signToken(r.agentDid,r.scopes,t+e)};return this.tokens.set(s.id,s),(0,shared_1.ok)({approved:!0,token:s})}verifyToken(r){const e=this.tokens.get(r);return e?e.valid?Date.now()>e.expiresAt?(0,shared_1.err)(new ApprovalError(ApprovalErrorCode.TOKEN_EXPIRED,`Token ${r} expired at ${new Date(e.expiresAt).toISOString()}`)):(0,shared_1.ok)(e):(0,shared_1.err)(new ApprovalError(ApprovalErrorCode.TOKEN_REVOKED,`Token ${r} has been revoked`)):(0,shared_1.err)(new ApprovalError(ApprovalErrorCode.INVALID_TOKEN,`Token ${r} not found`))}revokeToken(r){const e=this.tokens.get(r);e&&this.tokens.set(r,{...e,valid:!1})}parseDuration(r){if("number"==typeof r)return r;const e=r.match(/^(\d+)([smhd])$/);if(!e)return-1;const o=parseInt(e[1]??"0",10);switch(e[2]){case"s":return 1e3*o;case"m":return 60*o*1e3;case"h":return 60*o*60*1e3;case"d":return 24*o*60*60*1e3;default:return-1}}generateTokenId(){const r=new Uint8Array(12);crypto.getRandomValues(r);const e=Array.from(r,r=>r.toString(16).padStart(2,"0")).join("");return`appr_${Date.now()}_${e}`}async signToken(r,e,o){const t=JSON.stringify({agentDid:r,scopes:e,expiresAt:o});return btoa(t).substring(0,32)}}exports.ApprovalFlow=ApprovalFlow;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.MessageStream=void 0,exports.collectMessages=collectMessages,exports.mapStream=mapStream,exports.filterStream=filterStream,exports.takeStream=takeStream,exports.mergeStreams=mergeStreams,exports.installAsyncIterators=installAsyncIterators;class MessageStream{agent;options;state;constructor(e,t={}){this.agent=e,this.options={from:t.from,scope:t.scope,bufferSize:t.bufferSize??100,signal:t.signal,allowCleartext:t.allowCleartext??!1},this.state={buffer:[],pending:[],done:!1},this.options.signal&&this.options.signal.addEventListener("abort",()=>{this.close(new Error("Stream aborted"))});const s=e=>{this.handleEnvelope(e)},r=this.agent.getTransports()[0];r&&(r.onReceive(s),this.state.cleanup=()=>{})}async handleEnvelope(e){if(this.state.done)return;const t=await this.agent.receive(e,{allowCleartext:this.options.allowCleartext});if(!t.ok)return;const s=t.value;if(!(this.options.from&&s.sender!==this.options.from||this.options.scope&&s.scope!==this.options.scope))if(this.state.pending.length>0){this.state.pending.shift()({value:s,done:!1})}else this.state.buffer.length<this.options.bufferSize&&this.state.buffer.push(s)}close(e){if(!this.state.done){this.state.done=!0,this.state.error=e;for(const e of this.state.pending)e({value:void 0,done:!0});this.state.pending=[],this.state.cleanup&&this.state.cleanup()}}async next(){if(this.state.done)return{value:void 0,done:!0};if(this.options.signal?.aborted)return this.close(new Error("Stream aborted")),{value:void 0,done:!0};if(this.state.buffer.length>0){return{value:this.state.buffer.shift(),done:!1}}return new Promise(e=>{this.state.pending.push(e)})}async return(e){return this.close(),{value:void 0,done:!0}}async throw(e){return this.close(e instanceof Error?e:new Error(String(e))),{value:void 0,done:!0}}[Symbol.asyncIterator](){return this}get bufferedCount(){return this.state.buffer.length}get closed(){return this.state.done}get error(){return this.state.error}}async function collectMessages(e,t={}){const s=[],r=new MessageStream(e,t);let a;t.timeout&&(a=setTimeout(()=>{r.return()},t.timeout));try{for await(const e of r)if(s.push(e),t.limit&&s.length>=t.limit)break}finally{a&&clearTimeout(a),r.closed||await r.return()}return s}async function*mapStream(e,t){for await(const s of e)yield await t(s)}async function*filterStream(e,t){for await(const s of e)await t(s)&&(yield s)}async function*takeStream(e,t){let s=0;for await(const r of e){if(s>=t)break;yield r,s++}}async function*mergeStreams(e){const t=e.map(e=>e[Symbol.asyncIterator]()),s=new Map;for(let e=0;e<t.length;e++)s.set(e,t[e].next());for(;s.size>0;){const e=Array.from(s.entries()),r=await Promise.race(e.map(async([e,t])=>({idx:e,result:await t})));s.delete(r.idx),r.result.done||(yield r.result.value,s.set(r.idx,t[r.idx].next()))}}function installAsyncIterators(e){"subscribe"in e.prototype||(e.prototype.subscribe=function(e){return new MessageStream(this,e)})}exports.MessageStream=MessageStream;
@@ -1,225 +1 @@
1
- "use strict";
2
- /**
3
- * Xlock auth challenge module for Agent SDK.
4
- *
5
- * Provides requestAuth(), respondToChallenge(), and onChallenge()
6
- * functions that work with an Agent instance and the XBind gateway.
7
- *
8
- * These functions are also re-exported as thin methods on the Agent class.
9
- */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.requestAuth = requestAuth;
12
- exports.respondToChallenge = respondToChallenge;
13
- exports.onChallenge = onChallenge;
14
- exports.generateRegistrationQR = generateRegistrationQR;
15
- const shared_1 = require("../_deps/shared/index.js");
16
- const envelope_js_1 = require("./envelope.js");
17
- /** Default poll interval for challenge status. */
18
- const DEFAULT_POLL_INTERVAL_MS = 2_000;
19
- /** Default TTL for challenges (5 minutes). */
20
- const DEFAULT_TTL_MS = 5 * 60 * 1000;
21
- /** Max poll iterations (TTL / pollInterval + safety margin). */
22
- const MAX_POLL_ITERATIONS = 200;
23
- /**
24
- * Create an auth challenge and poll until the user responds.
25
- *
26
- * Sends a challenge via the XBind gateway, then polls the status
27
- * endpoint until the challenge is approved, denied, or expires.
28
- *
29
- * @param agent - The Agent requesting authorization.
30
- * @param request - Auth request details (recipient DID, action, metadata).
31
- * @param gateway - Gateway connection options.
32
- * @returns Auth result (approved/denied) or error.
33
- */
34
- async function requestAuth(agent, request, gateway) {
35
- const ttlMs = request.ttlMs ?? DEFAULT_TTL_MS;
36
- const pollIntervalMs = request.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
37
- // Build the challenge payload
38
- const payload = {
39
- recipientDid: request.to,
40
- action: request.action,
41
- metadata: request.metadata ?? {},
42
- ttlMs,
43
- };
44
- // Create a signed envelope wrapping the challenge request
45
- const envelopeResult = await (0, envelope_js_1.createSignedEnvelope)({
46
- senderDid: agent.did,
47
- recipientDid: request.to,
48
- scope: 'xlock:challenge',
49
- plaintext: new TextEncoder().encode(JSON.stringify(payload)),
50
- privateKey: agent.identity.privateKey,
51
- });
52
- if (!envelopeResult.ok) {
53
- return (0, shared_1.err)('INVALID_REQUEST');
54
- }
55
- // POST to gateway
56
- let challengeId;
57
- let expiresAt;
58
- try {
59
- const response = await fetch(`${gateway.gatewayUrl}/gateway/auth/challenge`, {
60
- method: 'POST',
61
- headers: { 'Content-Type': 'application/json' },
62
- body: JSON.stringify(envelopeResult.value),
63
- });
64
- if (response.status === 429)
65
- return (0, shared_1.err)('RATE_LIMITED');
66
- if (!response.ok) {
67
- const body = await response.json().catch(() => null);
68
- const code = body
69
- ?.error?.code;
70
- return (0, shared_1.err)(code ?? 'INVALID_REQUEST');
71
- }
72
- const data = await response.json();
73
- challengeId = data.challengeId;
74
- expiresAt = data.expiresAt;
75
- }
76
- catch {
77
- return (0, shared_1.err)('INVALID_REQUEST');
78
- }
79
- // Poll for status
80
- return pollChallengeStatus(challengeId, expiresAt, pollIntervalMs, gateway);
81
- }
82
- /**
83
- * Respond to an incoming auth challenge (approve or deny).
84
- *
85
- * Sends a signed response envelope to the gateway.
86
- *
87
- * @param agent - The Agent responding to the challenge.
88
- * @param challengeId - The challenge ID to respond to.
89
- * @param approved - Whether the user approved the challenge.
90
- * @param gateway - Gateway connection options.
91
- * @returns Success or error.
92
- */
93
- async function respondToChallenge(agent, challengeId, approved, gateway) {
94
- const payload = {
95
- challengeId,
96
- approved,
97
- timestamp: Date.now(),
98
- };
99
- // Create a signed envelope for the response
100
- const envelopeResult = await (0, envelope_js_1.createSignedEnvelope)({
101
- senderDid: agent.did,
102
- recipientDid: agent.did, // Self-addressed (gateway verifies recipient match)
103
- scope: 'xlock:respond',
104
- plaintext: new TextEncoder().encode(JSON.stringify(payload)),
105
- privateKey: agent.identity.privateKey,
106
- });
107
- if (!envelopeResult.ok) {
108
- return (0, shared_1.err)('INVALID_REQUEST');
109
- }
110
- try {
111
- const response = await fetch(`${gateway.gatewayUrl}/gateway/auth/respond`, {
112
- method: 'POST',
113
- headers: { 'Content-Type': 'application/json' },
114
- body: JSON.stringify({
115
- ...envelopeResult.value,
116
- // Include response fields at top level for the server
117
- challengeId,
118
- approved,
119
- responseEnvelope: envelopeResult.value,
120
- }),
121
- });
122
- if (!response.ok) {
123
- const body = await response.json().catch(() => null);
124
- const code = body
125
- ?.error?.code;
126
- return (0, shared_1.err)(code ?? 'INVALID_REQUEST');
127
- }
128
- return (0, shared_1.ok)(undefined);
129
- }
130
- catch {
131
- return (0, shared_1.err)('INVALID_REQUEST');
132
- }
133
- }
134
- /**
135
- * Register a callback for incoming auth challenges via WebSocket.
136
- *
137
- * The callback fires when an `auth:challenge` message arrives
138
- * over the gateway WebSocket connection.
139
- *
140
- * @param ws - The WebSocket connection to the gateway.
141
- * @param callback - Handler for incoming challenges.
142
- * @returns Cleanup function to unregister the listener.
143
- */
144
- function onChallenge(ws, callback) {
145
- const handler = (event) => {
146
- try {
147
- const msg = JSON.parse(event.data);
148
- if (msg.type === 'auth:challenge' && msg.data) {
149
- callback(msg.data);
150
- }
151
- }
152
- catch {
153
- // Skip non-JSON messages
154
- }
155
- };
156
- ws.addEventListener('message', handler);
157
- return () => ws.removeEventListener('message', handler);
158
- }
159
- /**
160
- * Generate a registration QR code URI for TOTP migration.
161
- *
162
- * Creates a `xlock://register` URI that replaces `otpauth://` for
163
- * asymmetric DID-based registration.
164
- *
165
- * @param options - Registration options.
166
- * @returns The registration URI string.
167
- */
168
- function generateRegistrationQR(options) {
169
- const params = new URLSearchParams({
170
- app: options.appName,
171
- did: options.appDid,
172
- registry: options.registryUrl,
173
- callback: options.callbackUrl,
174
- });
175
- if (options.appIcon)
176
- params.set('icon', options.appIcon);
177
- return `xlock://register?${params.toString()}`;
178
- }
179
- /** Poll the gateway for challenge status until resolved or expired. */
180
- async function pollChallengeStatus(challengeId, expiresAt, pollIntervalMs, gateway) {
181
- for (let i = 0; i < MAX_POLL_ITERATIONS; i++) {
182
- if (Date.now() > expiresAt) {
183
- return (0, shared_1.err)('CHALLENGE_EXPIRED');
184
- }
185
- await sleep(pollIntervalMs);
186
- try {
187
- const response = await fetch(`${gateway.gatewayUrl}/gateway/auth/status/${challengeId}`, {
188
- headers: { Authorization: `Bearer ${gateway.accessToken}` },
189
- });
190
- if (!response.ok) {
191
- if (response.status === 404)
192
- return (0, shared_1.err)('CHALLENGE_NOT_FOUND');
193
- continue; // Retry on transient errors
194
- }
195
- const data = await response.json();
196
- if (data.status === 'approved') {
197
- return (0, shared_1.ok)({
198
- challengeId: data.challengeId,
199
- approved: true,
200
- respondedAt: data.respondedAt,
201
- envelope: data.envelope,
202
- });
203
- }
204
- if (data.status === 'denied') {
205
- return (0, shared_1.ok)({
206
- challengeId: data.challengeId,
207
- approved: false,
208
- respondedAt: data.respondedAt,
209
- });
210
- }
211
- if (data.status === 'expired') {
212
- return (0, shared_1.err)('CHALLENGE_EXPIRED');
213
- }
214
- // Still pending — continue polling
215
- }
216
- catch {
217
- // Network error — continue polling
218
- }
219
- }
220
- return (0, shared_1.err)('CHALLENGE_TIMEOUT');
221
- }
222
- /** Promise-based sleep. */
223
- function sleep(ms) {
224
- return new Promise((resolve) => setTimeout(resolve, ms));
225
- }
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.requestAuth=requestAuth,exports.respondToChallenge=respondToChallenge,exports.onChallenge=onChallenge,exports.generateRegistrationQR=generateRegistrationQR;const shared_1=require("../_deps/shared/index.js"),envelope_js_1=require("./envelope.js"),DEFAULT_POLL_INTERVAL_MS=2e3,DEFAULT_TTL_MS=3e5,MAX_POLL_ITERATIONS=200;async function requestAuth(e,t,r){const a=t.ttlMs??DEFAULT_TTL_MS,n=t.pollIntervalMs??DEFAULT_POLL_INTERVAL_MS,s={recipientDid:t.to,action:t.action,metadata:t.metadata??{},ttlMs:a},o=await(0,envelope_js_1.createSignedEnvelope)({senderDid:e.did,recipientDid:t.to,scope:"xlock:challenge",plaintext:(new TextEncoder).encode(JSON.stringify(s)),privateKey:e.identity.privateKey});if(!o.ok)return(0,shared_1.err)("INVALID_REQUEST");let i,d;try{const e=await fetch(`${r.gatewayUrl}/gateway/auth/challenge`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o.value)});if(429===e.status)return(0,shared_1.err)("RATE_LIMITED");if(!e.ok){const t=await e.json().catch(()=>null),r=t?.error?.code;return(0,shared_1.err)(r??"INVALID_REQUEST")}const t=await e.json();i=t.challengeId,d=t.expiresAt}catch{return(0,shared_1.err)("INVALID_REQUEST")}return pollChallengeStatus(i,d,n,r)}async function respondToChallenge(e,t,r,a){const n={challengeId:t,approved:r,timestamp:Date.now()},s=await(0,envelope_js_1.createSignedEnvelope)({senderDid:e.did,recipientDid:e.did,scope:"xlock:respond",plaintext:(new TextEncoder).encode(JSON.stringify(n)),privateKey:e.identity.privateKey});if(!s.ok)return(0,shared_1.err)("INVALID_REQUEST");try{const e=await fetch(`${a.gatewayUrl}/gateway/auth/respond`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...s.value,challengeId:t,approved:r,responseEnvelope:s.value})});if(!e.ok){const t=await e.json().catch(()=>null),r=t?.error?.code;return(0,shared_1.err)(r??"INVALID_REQUEST")}return(0,shared_1.ok)(void 0)}catch{return(0,shared_1.err)("INVALID_REQUEST")}}function onChallenge(e,t){const r=e=>{try{const r=JSON.parse(e.data);"auth:challenge"===r.type&&r.data&&t(r.data)}catch{}};return e.addEventListener("message",r),()=>e.removeEventListener("message",r)}function generateRegistrationQR(e){const t=new URLSearchParams({app:e.appName,did:e.appDid,registry:e.registryUrl,callback:e.callbackUrl});return e.appIcon&&t.set("icon",e.appIcon),`xlock://register?${t.toString()}`}async function pollChallengeStatus(e,t,r,a){for(let n=0;n<200;n++){if(Date.now()>t)return(0,shared_1.err)("CHALLENGE_EXPIRED");await sleep(r);try{const t=await fetch(`${a.gatewayUrl}/gateway/auth/status/${e}`,{headers:{Authorization:`Bearer ${a.accessToken}`}});if(!t.ok){if(404===t.status)return(0,shared_1.err)("CHALLENGE_NOT_FOUND");continue}const r=await t.json();if("approved"===r.status)return(0,shared_1.ok)({challengeId:r.challengeId,approved:!0,respondedAt:r.respondedAt,envelope:r.envelope});if("denied"===r.status)return(0,shared_1.ok)({challengeId:r.challengeId,approved:!1,respondedAt:r.respondedAt});if("expired"===r.status)return(0,shared_1.err)("CHALLENGE_EXPIRED")}catch{}}return(0,shared_1.err)("CHALLENGE_TIMEOUT")}function sleep(e){return new Promise(t=>setTimeout(t,e))}
@@ -1,233 +1 @@
1
- "use strict";
2
- /**
3
- * @module auto-accept
4
- * Auto-accept invite on first SDK call for zero-click onboarding.
5
- *
6
- * Enables services to accept invites automatically without explicit
7
- * accept commands. Invite code comes from environment variable.
8
- *
9
- * @example
10
- * ```ts
11
- * // Environment: XBIND_INVITE_CODE=XBD-abc123, XBIND_AUTO_ACCEPT=true
12
- *
13
- * // Auto-accept happens on first Agent method call:
14
- * const agent = Agent.lazy({ name: 'my-service' });
15
- * await agent.send({ to: partnerDid, payload: data, scope: 'test' });
16
- * // ↑ Invite auto-accepted before send()
17
- * ```
18
- */
19
- Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.AutoAcceptErrorCode = void 0;
21
- exports.autoAcceptInvite = autoAcceptInvite;
22
- const shared_1 = require("../_deps/shared/index.js");
23
- const invite_js_1 = require("./invite.js");
24
- const trust_registry_js_1 = require("./trust-registry.js");
25
- const crypto_1 = require("../_deps/crypto/index.js");
26
- const identity_js_1 = require("./identity.js");
27
- /**
28
- * Auto-accept error codes.
29
- */
30
- var AutoAcceptErrorCode;
31
- (function (AutoAcceptErrorCode) {
32
- AutoAcceptErrorCode["NO_INVITE_CODE"] = "AUTO_ACCEPT_NO_INVITE_CODE";
33
- AutoAcceptErrorCode["DISABLED"] = "AUTO_ACCEPT_DISABLED";
34
- AutoAcceptErrorCode["INVITE_FAILED"] = "AUTO_ACCEPT_INVITE_FAILED";
35
- AutoAcceptErrorCode["REGISTRY_SETUP_FAILED"] = "AUTO_ACCEPT_REGISTRY_SETUP_FAILED";
36
- })(AutoAcceptErrorCode || (exports.AutoAcceptErrorCode = AutoAcceptErrorCode = {}));
37
- /**
38
- * Auto-accept an invite on first SDK call.
39
- *
40
- * Reads invite code from config or environment variable `XBIND_INVITE_CODE`.
41
- * If `XBIND_AUTO_ACCEPT` is false, returns error with code DISABLED.
42
- *
43
- * When successful:
44
- * 1. Fetches invite details from invite server
45
- * 2. Adds inviter to trust registry
46
- * 3. Auto-detects registry endpoint from invite metadata (if present)
47
- * 4. Marks invite as accepted
48
- *
49
- * This is called internally by `Agent.lazy()` before the first send/receive.
50
- *
51
- * @param config - Auto-accept configuration
52
- * @param acceptorInfo - Acceptor service info (DID, endpoint, publicKey)
53
- * @returns Accept details or error
54
- *
55
- * @example
56
- * ```ts
57
- * // Manual usage (typically called internally by Agent.lazy):
58
- * const result = await autoAcceptInvite(
59
- * { inviteCode: 'XBD-abc123' },
60
- * {
61
- * name: 'my-service',
62
- * did: 'did:key:z6Mk...',
63
- * endpoint: 'https://my-service.com',
64
- * publicKey: '...',
65
- * }
66
- * );
67
- *
68
- * if (result.ok) {
69
- * console.log('Auto-accepted invite from:', result.value.from.name);
70
- * }
71
- * ```
72
- */
73
- async function autoAcceptInvite(config, acceptorInfo) {
74
- // Step 1: Check if auto-accept is enabled
75
- const autoAcceptEnabled = config.enabled ?? getEnvFlag('XBIND_AUTO_ACCEPT', true);
76
- if (!autoAcceptEnabled) {
77
- return (0, shared_1.err)({
78
- code: AutoAcceptErrorCode.DISABLED,
79
- message: 'Auto-accept is disabled',
80
- hint: 'Set XBIND_AUTO_ACCEPT=true or pass { enabled: true } in config',
81
- });
82
- }
83
- // Step 2: Get invite code
84
- const inviteCode = config.inviteCode ?? getEnv('XBIND_INVITE_CODE');
85
- if (!inviteCode) {
86
- return (0, shared_1.err)({
87
- code: AutoAcceptErrorCode.NO_INVITE_CODE,
88
- message: 'No invite code provided',
89
- hint: 'Set XBIND_INVITE_CODE environment variable or pass inviteCode in config',
90
- });
91
- }
92
- // Step 3: Fetch invite details
93
- const inviteService = new invite_js_1.InviteService({
94
- inviteApiUrl: config.inviteApiUrl ?? getEnv('XBIND_INVITE_API_URL') ?? 'https://xbind.to',
95
- });
96
- const inviteUrl = normalizeInviteCode(inviteCode);
97
- const inviteResult = await inviteService.get(inviteUrl);
98
- if (!inviteResult.ok) {
99
- return (0, shared_1.err)({
100
- code: AutoAcceptErrorCode.INVITE_FAILED,
101
- message: `Failed to fetch invite: ${inviteResult.error.message}`,
102
- hint: inviteResult.error.hint,
103
- cause: inviteResult.error,
104
- });
105
- }
106
- const invite = inviteResult.value;
107
- // Step 4: Add inviter to trust registry
108
- const registry = config.registry ?? await autoConfigureRegistry(invite);
109
- try {
110
- // Import public key from base64
111
- const publicKeyBytes = (0, crypto_1.fromBase64)(invite.from.publicKey);
112
- const publicKeyResult = await (0, identity_js_1.importPublicKey)(publicKeyBytes);
113
- if (!publicKeyResult.ok) {
114
- return (0, shared_1.err)({
115
- code: AutoAcceptErrorCode.REGISTRY_SETUP_FAILED,
116
- message: 'Invalid inviter public key',
117
- hint: 'The invite may be corrupted',
118
- cause: publicKeyResult.error,
119
- });
120
- }
121
- // Add to registry
122
- const addResult = await registry.register(invite.from.did, publicKeyBytes, invite.from.name, invite.permissions, invite.from.x25519PublicKey ? (0, crypto_1.fromBase64)(invite.from.x25519PublicKey) : undefined, invite.from.mlKemPublicKey ? (0, crypto_1.fromBase64)(invite.from.mlKemPublicKey) : undefined, undefined, // mlDsaPublicKey (not in invite yet)
123
- false);
124
- if (!addResult.ok) {
125
- // If already registered, that's OK (idempotent)
126
- if (addResult.error !== 'ALREADY_REGISTERED') {
127
- return (0, shared_1.err)({
128
- code: AutoAcceptErrorCode.REGISTRY_SETUP_FAILED,
129
- message: `Failed to add inviter to registry: ${addResult.error}`,
130
- cause: addResult.error,
131
- });
132
- }
133
- }
134
- }
135
- catch (error) {
136
- return (0, shared_1.err)({
137
- code: AutoAcceptErrorCode.REGISTRY_SETUP_FAILED,
138
- message: 'Failed to configure trust registry',
139
- cause: error,
140
- });
141
- }
142
- // Step 5: Accept the invite (marks as accepted on server)
143
- const acceptResult = await inviteService.accept({ inviteUrl, acceptor: acceptorInfo });
144
- if (!acceptResult.ok) {
145
- // Non-fatal: invite acceptance is for tracking/notification only
146
- // The connection is still established locally via registry add
147
- }
148
- return (0, shared_1.ok)({
149
- invite,
150
- from: invite.from,
151
- registryUrl: extractRegistryUrl(invite),
152
- registryAutoconfigured: config.registry === undefined,
153
- });
154
- }
155
- /**
156
- * Auto-configure trust registry from invite metadata.
157
- *
158
- * Attempts to extract registry URL from invite. If found, creates HttpTrustRegistry.
159
- * Otherwise falls back to MemoryTrustRegistry.
160
- *
161
- * @param invite - Invite details
162
- * @returns Trust registry instance
163
- */
164
- async function autoConfigureRegistry(invite) {
165
- const registryUrl = extractRegistryUrl(invite);
166
- if (registryUrl) {
167
- return new trust_registry_js_1.HttpTrustRegistry({ baseUrl: registryUrl });
168
- }
169
- return new trust_registry_js_1.MemoryTrustRegistry();
170
- }
171
- /**
172
- * Extract registry URL from invite metadata.
173
- *
174
- * Checks for registry URL in invite.from.endpoint or custom metadata fields.
175
- *
176
- * @param invite - Invite details
177
- * @returns Registry URL or undefined
178
- */
179
- function extractRegistryUrl(invite) {
180
- // Check if endpoint is a registry URL (heuristic: contains /registry or /trust)
181
- if (invite.from.endpoint.includes('/registry') || invite.from.endpoint.includes('/trust')) {
182
- return invite.from.endpoint;
183
- }
184
- // Future: check invite.metadata.registryUrl when invite system adds it
185
- return undefined;
186
- }
187
- /**
188
- * Normalize invite code to full URL.
189
- *
190
- * If code is already a URL, returns as-is.
191
- * If code is short form (e.g., 'XBD-abc123'), converts to https://xbind.to/invite/{code}.
192
- *
193
- * @param code - Invite code or URL
194
- * @returns Full invite URL
195
- */
196
- function normalizeInviteCode(code) {
197
- if (code.startsWith('http://') || code.startsWith('https://')) {
198
- return code;
199
- }
200
- // Short form: XBD-abc123 or just abc123
201
- const cleanCode = code.replace(/^XBD-/i, '');
202
- return `https://xbind.to/invite/${cleanCode}`;
203
- }
204
- /**
205
- * Get environment variable value.
206
- *
207
- * @param key - Environment variable name
208
- * @param defaultValue - Default value if not set
209
- * @returns Environment variable value or default
210
- */
211
- function getEnv(key, defaultValue) {
212
- // SAFETY: Check for Node.js environment before accessing process
213
- if (typeof process !== 'undefined' && typeof process.env !== 'undefined') {
214
- return process.env[key] ?? defaultValue;
215
- }
216
- return defaultValue;
217
- }
218
- /**
219
- * Get environment variable as boolean flag.
220
- *
221
- * Treats 'true', '1', 'yes' as true. Everything else as false.
222
- *
223
- * @param key - Environment variable name
224
- * @param defaultValue - Default value if not set
225
- * @returns Boolean flag
226
- */
227
- function getEnvFlag(key, defaultValue) {
228
- const value = getEnv(key);
229
- if (value === undefined)
230
- return defaultValue;
231
- const normalized = value.toLowerCase().trim();
232
- return normalized === 'true' || normalized === '1' || normalized === 'yes';
233
- }
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.AutoAcceptErrorCode=void 0,exports.autoAcceptInvite=autoAcceptInvite;const shared_1=require("../_deps/shared/index.js"),invite_js_1=require("./invite.js"),trust_registry_js_1=require("./trust-registry.js"),crypto_utils_js_1=require("./crypto-utils.js"),identity_js_1=require("./identity.js");var AutoAcceptErrorCode;async function autoAcceptInvite(e,r){if(!(e.enabled??getEnvFlag("XBIND_AUTO_ACCEPT",!0)))return(0,shared_1.err)({code:AutoAcceptErrorCode.DISABLED,message:"Auto-accept is disabled",hint:"Set XBIND_AUTO_ACCEPT=true or pass { enabled: true } in config"});const t=e.inviteCode??getEnv("XBIND_INVITE_CODE");if(!t)return(0,shared_1.err)({code:AutoAcceptErrorCode.NO_INVITE_CODE,message:"No invite code provided",hint:"Set XBIND_INVITE_CODE environment variable or pass inviteCode in config"});const i=new invite_js_1.InviteService({inviteApiUrl:e.inviteApiUrl??getEnv("XBIND_INVITE_API_URL")??"https://xbind.to"}),o=normalizeInviteCode(t),s=await i.get(o);if(!s.ok)return(0,shared_1.err)({code:AutoAcceptErrorCode.INVITE_FAILED,message:`Failed to fetch invite: ${s.error.message}`,hint:s.error.hint,cause:s.error});const n=s.value,c=e.registry??await autoConfigureRegistry(n);try{const e=(0,crypto_utils_js_1.fromBase64)(n.from.publicKey),r=await(0,identity_js_1.importPublicKey)(e);if(!r.ok)return(0,shared_1.err)({code:AutoAcceptErrorCode.REGISTRY_SETUP_FAILED,message:"Invalid inviter public key",hint:"The invite may be corrupted",cause:r.error});const t=await c.register(n.from.did,e,n.from.name,n.permissions,n.from.x25519PublicKey?(0,crypto_utils_js_1.fromBase64)(n.from.x25519PublicKey):void 0,n.from.mlKemPublicKey?(0,crypto_utils_js_1.fromBase64)(n.from.mlKemPublicKey):void 0,void 0,!1);if(!t.ok&&"ALREADY_REGISTERED"!==t.error)return(0,shared_1.err)({code:AutoAcceptErrorCode.REGISTRY_SETUP_FAILED,message:`Failed to add inviter to registry: ${t.error}`,cause:t.error})}catch(e){return(0,shared_1.err)({code:AutoAcceptErrorCode.REGISTRY_SETUP_FAILED,message:"Failed to configure trust registry",cause:e})}return(await i.accept({inviteUrl:o,acceptor:r})).ok,(0,shared_1.ok)({invite:n,from:n.from,registryUrl:extractRegistryUrl(n),registryAutoconfigured:void 0===e.registry})}async function autoConfigureRegistry(e){const r=extractRegistryUrl(e);return r?new trust_registry_js_1.HttpTrustRegistry({baseUrl:r}):new trust_registry_js_1.MemoryTrustRegistry}function extractRegistryUrl(e){if(e.from.endpoint.includes("/registry")||e.from.endpoint.includes("/trust"))return e.from.endpoint}function normalizeInviteCode(e){if(e.startsWith("http://")||e.startsWith("https://"))return e;return`https://xbind.to/invite/${e.replace(/^XBD-/i,"")}`}function getEnv(e,r){return"undefined"!=typeof process&&void 0!==process.env?process.env[e]??r:r}function getEnvFlag(e,r){const t=getEnv(e);if(void 0===t)return r;const i=t.toLowerCase().trim();return"true"===i||"1"===i||"yes"===i}!function(e){e.NO_INVITE_CODE="AUTO_ACCEPT_NO_INVITE_CODE",e.DISABLED="AUTO_ACCEPT_DISABLED",e.INVITE_FAILED="AUTO_ACCEPT_INVITE_FAILED",e.REGISTRY_SETUP_FAILED="AUTO_ACCEPT_REGISTRY_SETUP_FAILED"}(AutoAcceptErrorCode||(exports.AutoAcceptErrorCode=AutoAcceptErrorCode={}));