@private.me/xbind 3.0.2 → 3.0.4

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 (222) hide show
  1. package/README.md +2366 -204
  2. package/dist-standalone/_deps/mldsa-wasm/dist/mldsa.js +1 -1920
  3. package/dist-standalone/_deps/shared/cjs/errors.js +1 -729
  4. package/dist-standalone/_deps/shared/cjs/index.js +1 -463
  5. package/dist-standalone/_deps/shared/cjs/types.js +1 -315
  6. package/dist-standalone/_deps/shared/errors.js +1 -244
  7. package/dist-standalone/_deps/shared/index.js +1 -72
  8. package/dist-standalone/_deps/shared/types.js +1 -86
  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.d.ts +2 -2
  47. package/dist-standalone/agent-call.js +1 -659
  48. package/dist-standalone/agent-sdk.js +1 -328
  49. package/dist-standalone/agent.d.ts +2 -0
  50. package/dist-standalone/agent.js +1 -1800
  51. package/dist-standalone/approval.js +1 -193
  52. package/dist-standalone/async-iterators.d.ts +3 -3
  53. package/dist-standalone/async-iterators.js +1 -382
  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.js +1 -326
  58. package/dist-standalone/batch-operations.js +1 -388
  59. package/dist-standalone/cancellation.js +1 -477
  60. package/dist-standalone/checkpoint.js +1 -186
  61. package/dist-standalone/circuit-breaker.js +1 -468
  62. package/dist-standalone/cjs/agent-call.js +1 -701
  63. package/dist-standalone/cjs/agent-sdk.js +1 -332
  64. package/dist-standalone/cjs/agent.js +1 -1837
  65. package/dist-standalone/cjs/approval.js +1 -199
  66. package/dist-standalone/cjs/async-iterators.js +1 -392
  67. package/dist-standalone/cjs/auth.js +1 -225
  68. package/dist-standalone/cjs/auto-accept.js +1 -233
  69. package/dist-standalone/cjs/backup-config.js +1 -207
  70. package/dist-standalone/cjs/backup.js +1 -330
  71. package/dist-standalone/cjs/batch-operations.js +1 -397
  72. package/dist-standalone/cjs/cancellation.js +1 -490
  73. package/dist-standalone/cjs/checkpoint.js +1 -193
  74. package/dist-standalone/cjs/circuit-breaker.js +1 -476
  75. package/dist-standalone/cjs/cli/init.js +1 -492
  76. package/dist-standalone/cjs/config-validation.js +1 -522
  77. package/dist-standalone/cjs/connect.js +1 -312
  78. package/dist-standalone/cjs/connection-pool.js +1 -506
  79. package/dist-standalone/cjs/correlation-id.js +1 -339
  80. package/dist-standalone/cjs/crypto-utils.js +1 -176
  81. package/dist-standalone/cjs/debug-mode.js +1 -534
  82. package/dist-standalone/cjs/did-document.js +1 -101
  83. package/dist-standalone/cjs/did-privateme.js +1 -130
  84. package/dist-standalone/cjs/did-web.js +1 -201
  85. package/dist-standalone/cjs/discovery.js +1 -462
  86. package/dist-standalone/cjs/dual-mode.js +1 -251
  87. package/dist-standalone/cjs/email-templates.js +1 -313
  88. package/dist-standalone/cjs/email-transport.js +1 -239
  89. package/dist-standalone/cjs/envelope.js +1 -538
  90. package/dist-standalone/cjs/errors.js +1 -913
  91. package/dist-standalone/cjs/event-emitter.js +1 -461
  92. package/dist-standalone/cjs/gateway-state.js +1 -55
  93. package/dist-standalone/cjs/gateway-transport.js +1 -120
  94. package/dist-standalone/cjs/graceful-degradation.js +1 -403
  95. package/dist-standalone/cjs/guardrails.js +1 -223
  96. package/dist-standalone/cjs/health-check.js +1 -336
  97. package/dist-standalone/cjs/http-compat.js +1 -272
  98. package/dist-standalone/cjs/http-status-map.js +1 -571
  99. package/dist-standalone/cjs/identity.js +1 -645
  100. package/dist-standalone/cjs/index.js +1 -406
  101. package/dist-standalone/cjs/invitation.js +1 -421
  102. package/dist-standalone/cjs/invite.js +1 -328
  103. package/dist-standalone/cjs/key-agreement.js +1 -335
  104. package/dist-standalone/cjs/lazy-init.js +1 -300
  105. package/dist-standalone/cjs/logger.js +1 -291
  106. package/dist-standalone/cjs/loopback-transport.js +1 -0
  107. package/dist-standalone/cjs/mdns-discovery.js +1 -202
  108. package/dist-standalone/cjs/nonce-store.js +1 -80
  109. package/dist-standalone/cjs/pairing-manager.js +1 -223
  110. package/dist-standalone/cjs/plugin-system.js +1 -264
  111. package/dist-standalone/cjs/plugins/logging.js +1 -168
  112. package/dist-standalone/cjs/plugins/metrics.js +1 -181
  113. package/dist-standalone/cjs/plugins/validation.js +1 -302
  114. package/dist-standalone/cjs/policy.js +1 -320
  115. package/dist-standalone/cjs/progress-callbacks.js +1 -583
  116. package/dist-standalone/cjs/redis-nonce-store.js +1 -76
  117. package/dist-standalone/cjs/registry-middleware.js +1 -50
  118. package/dist-standalone/cjs/retry-strategies.js +1 -544
  119. package/dist-standalone/cjs/retry-transport.js +1 -102
  120. package/dist-standalone/cjs/runtime/browser.js +1 -533
  121. package/dist-standalone/cjs/runtime/edge.js +1 -526
  122. package/dist-standalone/cjs/runtime/react-native.js +1 -394
  123. package/dist-standalone/cjs/security-policy.js +1 -245
  124. package/dist-standalone/cjs/serialization.js +1 -1040
  125. package/dist-standalone/cjs/split-channel.js +1 -225
  126. package/dist-standalone/cjs/subscription-proof.js +1 -230
  127. package/dist-standalone/cjs/succession.js +1 -148
  128. package/dist-standalone/cjs/timeouts.js +1 -412
  129. package/dist-standalone/cjs/trace-context.js +1 -424
  130. package/dist-standalone/cjs/trace-spans.js +1 -495
  131. package/dist-standalone/cjs/transport.js +1 -63
  132. package/dist-standalone/cjs/trust-registry.js +1 -991
  133. package/dist-standalone/cjs/types/error-response.js +1 -56
  134. package/dist-standalone/cjs/vault-auth.js +1 -178
  135. package/dist-standalone/cjs/vault-store-loader.js +1 -194
  136. package/dist-standalone/cjs/verify.js +1 -25
  137. package/dist-standalone/cjs/version-info.js +1 -543
  138. package/dist-standalone/cjs/xfetch.js +1 -340
  139. package/dist-standalone/cli/init.js +1 -455
  140. package/dist-standalone/cli/setup.js +1 -514
  141. package/dist-standalone/cli/types.js +1 -27
  142. package/dist-standalone/cli/xbind.js +1 -148
  143. package/dist-standalone/config-validation.js +1 -513
  144. package/dist-standalone/connect.js +1 -274
  145. package/dist-standalone/connection-pool.js +1 -500
  146. package/dist-standalone/correlation-id.js +1 -326
  147. package/dist-standalone/crypto-utils.d.ts +2 -7
  148. package/dist-standalone/crypto-utils.js +1 -157
  149. package/dist-standalone/debug-mode.js +1 -510
  150. package/dist-standalone/did-document.js +1 -96
  151. package/dist-standalone/did-privateme.js +1 -121
  152. package/dist-standalone/did-web.js +1 -196
  153. package/dist-standalone/discovery.js +1 -458
  154. package/dist-standalone/dual-mode.js +1 -247
  155. package/dist-standalone/email-templates.js +1 -309
  156. package/dist-standalone/email-transport.d.ts +2 -2
  157. package/dist-standalone/email-transport.js +1 -232
  158. package/dist-standalone/envelope.js +1 -525
  159. package/dist-standalone/errors.d.ts +13 -3
  160. package/dist-standalone/errors.js +1 -896
  161. package/dist-standalone/event-emitter.js +1 -456
  162. package/dist-standalone/gateway-state.d.ts +1 -1
  163. package/dist-standalone/gateway-state.js +1 -51
  164. package/dist-standalone/gateway-transport.js +1 -116
  165. package/dist-standalone/graceful-degradation.js +1 -396
  166. package/dist-standalone/guardrails.js +1 -216
  167. package/dist-standalone/health-check.d.ts +5 -1
  168. package/dist-standalone/health-check.js +1 -332
  169. package/dist-standalone/http-compat.d.ts +1 -1
  170. package/dist-standalone/http-compat.js +1 -267
  171. package/dist-standalone/http-status-map.js +1 -561
  172. package/dist-standalone/identity.js +1 -619
  173. package/dist-standalone/index.d.ts +15 -4
  174. package/dist-standalone/index.js +1 -78
  175. package/dist-standalone/invitation.js +1 -415
  176. package/dist-standalone/invite.js +1 -324
  177. package/dist-standalone/key-agreement.js +1 -325
  178. package/dist-standalone/lazy-init.d.ts +11 -6
  179. package/dist-standalone/lazy-init.js +1 -295
  180. package/dist-standalone/logger.js +1 -285
  181. package/dist-standalone/loopback-transport.d.ts +87 -0
  182. package/dist-standalone/loopback-transport.js +1 -0
  183. package/dist-standalone/mdns-discovery.js +1 -195
  184. package/dist-standalone/nonce-store.js +1 -76
  185. package/dist-standalone/pairing-manager.js +1 -219
  186. package/dist-standalone/plugin-system.js +1 -257
  187. package/dist-standalone/plugins/logging.js +1 -163
  188. package/dist-standalone/plugins/metrics.d.ts +4 -4
  189. package/dist-standalone/plugins/metrics.js +1 -176
  190. package/dist-standalone/plugins/validation.js +1 -297
  191. package/dist-standalone/policy.js +1 -315
  192. package/dist-standalone/progress-callbacks.js +1 -576
  193. package/dist-standalone/redis-nonce-store.js +1 -72
  194. package/dist-standalone/registry-middleware.js +1 -47
  195. package/dist-standalone/retry-strategies.js +1 -534
  196. package/dist-standalone/retry-transport.js +1 -98
  197. package/dist-standalone/runtime/browser.js +1 -516
  198. package/dist-standalone/runtime/edge.js +1 -511
  199. package/dist-standalone/runtime/react-native.d.ts +1 -1
  200. package/dist-standalone/runtime/react-native.js +1 -383
  201. package/dist-standalone/security-policy.js +1 -239
  202. package/dist-standalone/serialization.js +1 -1031
  203. package/dist-standalone/split-channel.d.ts +1 -1
  204. package/dist-standalone/split-channel.js +1 -219
  205. package/dist-standalone/subscription-proof.js +1 -224
  206. package/dist-standalone/succession.js +1 -142
  207. package/dist-standalone/timeouts.js +1 -398
  208. package/dist-standalone/trace-context.js +1 -414
  209. package/dist-standalone/trace-spans.js +1 -488
  210. package/dist-standalone/transport.d.ts +1 -1
  211. package/dist-standalone/transport.js +1 -59
  212. package/dist-standalone/trust-registry.d.ts +3 -3
  213. package/dist-standalone/trust-registry.js +1 -950
  214. package/dist-standalone/types/error-response.js +1 -52
  215. package/dist-standalone/vault-auth.js +1 -174
  216. package/dist-standalone/vault-store-loader.d.ts +9 -0
  217. package/dist-standalone/vault-store-loader.js +1 -187
  218. package/dist-standalone/verify.js +1 -16
  219. package/dist-standalone/version-info.js +1 -530
  220. package/dist-standalone/xfetch.js +1 -335
  221. package/package.json +1 -1
  222. package/share1.dat +0 -0
@@ -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;
@@ -1,392 +1 @@
1
- "use strict";
2
- /**
3
- * @fileoverview Async iterator API for xBind message streams.
4
- *
5
- * Provides modern async iteration patterns for consuming message streams
6
- * with backpressure handling, stream cancellation, and error propagation.
7
- *
8
- * @example
9
- * ```typescript
10
- * // Subscribe to messages with async iteration
11
- * for await (const message of agent.subscribe({ from: 'did:key:alice' })) {
12
- * console.log('Received:', message.payload);
13
- * }
14
- * ```
15
- *
16
- * @module async-iterators
17
- */
18
- Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.MessageStream = void 0;
20
- exports.collectMessages = collectMessages;
21
- exports.mapStream = mapStream;
22
- exports.filterStream = filterStream;
23
- exports.takeStream = takeStream;
24
- exports.mergeStreams = mergeStreams;
25
- exports.installAsyncIterators = installAsyncIterators;
26
- /**
27
- * Async iterable message stream.
28
- *
29
- * Implements AsyncIterableIterator for use with `for await...of` syntax.
30
- * Handles backpressure, cancellation, and error propagation.
31
- */
32
- class MessageStream {
33
- agent;
34
- options;
35
- state;
36
- constructor(agent, options = {}) {
37
- this.agent = agent;
38
- this.options = {
39
- from: options.from,
40
- scope: options.scope,
41
- bufferSize: options.bufferSize ?? 100,
42
- signal: options.signal,
43
- allowCleartext: options.allowCleartext ?? false,
44
- };
45
- this.state = {
46
- buffer: [],
47
- pending: [],
48
- done: false,
49
- };
50
- // Setup abort signal handler
51
- if (this.options.signal) {
52
- this.options.signal.addEventListener('abort', () => {
53
- this.close(new Error('Stream aborted'));
54
- });
55
- }
56
- // Register envelope handler
57
- const handler = (envelope) => {
58
- void this.handleEnvelope(envelope);
59
- };
60
- // Get first transport adapter and register handler
61
- const transports = this.agent.getTransports();
62
- const transport = transports[0];
63
- if (transport) {
64
- transport.onReceive(handler);
65
- this.state.cleanup = () => {
66
- // Remove handler by creating new transport without this handler
67
- // (Transport interface doesn't support handler removal)
68
- };
69
- }
70
- }
71
- /**
72
- * Handle incoming envelope from transport.
73
- * @internal
74
- */
75
- async handleEnvelope(envelope) {
76
- if (this.state.done)
77
- return;
78
- // Verify and decrypt the envelope
79
- const result = await this.agent.receive(envelope, {
80
- allowCleartext: this.options.allowCleartext,
81
- });
82
- if (!result.ok) {
83
- // Ignore verification errors (not all envelopes are for this stream)
84
- return;
85
- }
86
- const message = result.value;
87
- // Apply filters
88
- if (this.options.from && message.sender !== this.options.from) {
89
- return;
90
- }
91
- if (this.options.scope && message.scope !== this.options.scope) {
92
- return;
93
- }
94
- // Deliver message
95
- if (this.state.pending.length > 0) {
96
- // Consumer is waiting - deliver immediately
97
- const resolve = this.state.pending.shift();
98
- resolve({ value: message, done: false });
99
- }
100
- else if (this.state.buffer.length < this.options.bufferSize) {
101
- // Buffer has space - enqueue
102
- this.state.buffer.push(message);
103
- }
104
- // else: buffer full - drop message (backpressure)
105
- }
106
- /**
107
- * Close the stream with optional error.
108
- * @internal
109
- */
110
- close(error) {
111
- if (this.state.done)
112
- return;
113
- this.state.done = true;
114
- this.state.error = error;
115
- // Resolve all pending next() calls
116
- for (const resolve of this.state.pending) {
117
- if (error) {
118
- resolve({ value: undefined, done: true });
119
- }
120
- else {
121
- resolve({ value: undefined, done: true });
122
- }
123
- }
124
- this.state.pending = [];
125
- // Cleanup resources
126
- if (this.state.cleanup) {
127
- this.state.cleanup();
128
- }
129
- }
130
- /**
131
- * Get next message from the stream.
132
- *
133
- * Returns a promise that resolves when:
134
- * - A message is available in the buffer
135
- * - A new message arrives from the transport
136
- * - The stream is closed
137
- *
138
- * @returns Promise resolving to iterator result
139
- */
140
- async next() {
141
- // Stream already done
142
- if (this.state.done) {
143
- return { value: undefined, done: true };
144
- }
145
- // Check abort signal
146
- if (this.options.signal?.aborted) {
147
- this.close(new Error('Stream aborted'));
148
- return { value: undefined, done: true };
149
- }
150
- // Message available in buffer
151
- if (this.state.buffer.length > 0) {
152
- const message = this.state.buffer.shift();
153
- return { value: message, done: false };
154
- }
155
- // Wait for next message
156
- return new Promise((resolve) => {
157
- this.state.pending.push(resolve);
158
- });
159
- }
160
- /**
161
- * Return method for iterator protocol.
162
- * Closes the stream and completes iteration.
163
- *
164
- * @param value - Optional value (ignored)
165
- * @returns Promise resolving to done result
166
- */
167
- async return(value) {
168
- this.close();
169
- return { value: undefined, done: true };
170
- }
171
- /**
172
- * Throw method for iterator protocol.
173
- * Closes the stream with error.
174
- *
175
- * @param error - Error to propagate
176
- * @returns Promise resolving to done result
177
- */
178
- async throw(error) {
179
- this.close(error instanceof Error ? error : new Error(String(error)));
180
- return { value: undefined, done: true };
181
- }
182
- /**
183
- * Make this object async iterable.
184
- * Enables `for await...of` syntax.
185
- *
186
- * @returns This stream instance
187
- */
188
- [Symbol.asyncIterator]() {
189
- return this;
190
- }
191
- /**
192
- * Get number of buffered messages.
193
- * Useful for monitoring backpressure.
194
- */
195
- get bufferedCount() {
196
- return this.state.buffer.length;
197
- }
198
- /**
199
- * Check if stream is closed.
200
- */
201
- get closed() {
202
- return this.state.done;
203
- }
204
- /**
205
- * Get stream error if any.
206
- */
207
- get error() {
208
- return this.state.error;
209
- }
210
- }
211
- exports.MessageStream = MessageStream;
212
- /**
213
- * Collect messages from a stream into an array.
214
- *
215
- * Useful for batch processing or testing. Stream completes when:
216
- * - Limit is reached
217
- * - Timeout expires
218
- * - Stream is aborted via signal
219
- *
220
- * @param agent - Agent instance to collect messages from
221
- * @param options - Collection options
222
- * @returns Promise resolving to array of messages
223
- *
224
- * @example
225
- * ```typescript
226
- * // Collect up to 10 messages with 5 second timeout
227
- * const messages = await collectMessages(agent, {
228
- * from: 'did:key:alice',
229
- * limit: 10,
230
- * timeout: 5000
231
- * });
232
- * ```
233
- */
234
- async function collectMessages(agent, options = {}) {
235
- const messages = [];
236
- const stream = new MessageStream(agent, options);
237
- // Setup timeout if specified
238
- let timeoutId;
239
- if (options.timeout) {
240
- timeoutId = setTimeout(() => {
241
- void stream.return();
242
- }, options.timeout);
243
- }
244
- try {
245
- for await (const message of stream) {
246
- messages.push(message);
247
- if (options.limit && messages.length >= options.limit) {
248
- break;
249
- }
250
- }
251
- }
252
- finally {
253
- if (timeoutId) {
254
- clearTimeout(timeoutId);
255
- }
256
- if (!stream.closed) {
257
- await stream.return();
258
- }
259
- }
260
- return messages;
261
- }
262
- /**
263
- * Transform message stream with async mapping function.
264
- *
265
- * Enables functional-style stream processing with backpressure preservation.
266
- *
267
- * @param stream - Source message stream
268
- * @param fn - Async transform function
269
- * @returns Async iterable of transformed values
270
- *
271
- * @example
272
- * ```typescript
273
- * const stream = agent.subscribe({ from: 'did:key:alice' });
274
- * const payloads = mapStream(stream, async (msg) => msg.payload);
275
- *
276
- * for await (const payload of payloads) {
277
- * console.log('Payload:', payload);
278
- * }
279
- * ```
280
- */
281
- async function* mapStream(stream, fn) {
282
- for await (const value of stream) {
283
- yield await fn(value);
284
- }
285
- }
286
- /**
287
- * Filter message stream with async predicate.
288
- *
289
- * Only yields messages that satisfy the predicate.
290
- *
291
- * @param stream - Source message stream
292
- * @param predicate - Async filter predicate
293
- * @returns Async iterable of filtered messages
294
- *
295
- * @example
296
- * ```typescript
297
- * const stream = agent.subscribe({ scope: 'notifications' });
298
- * const urgent = filterStream(stream, async (msg) =>
299
- * msg.payload.priority === 'high'
300
- * );
301
- *
302
- * for await (const message of urgent) {
303
- * await handleUrgent(message);
304
- * }
305
- * ```
306
- */
307
- async function* filterStream(stream, predicate) {
308
- for await (const value of stream) {
309
- if (await predicate(value)) {
310
- yield value;
311
- }
312
- }
313
- }
314
- /**
315
- * Take first N messages from stream.
316
- *
317
- * Stream completes after yielding N messages.
318
- *
319
- * @param stream - Source message stream
320
- * @param count - Maximum messages to take
321
- * @returns Async iterable with at most count messages
322
- *
323
- * @example
324
- * ```typescript
325
- * const stream = agent.subscribe();
326
- * const first5 = takeStream(stream, 5);
327
- *
328
- * for await (const message of first5) {
329
- * console.log('Message:', message);
330
- * }
331
- * ```
332
- */
333
- async function* takeStream(stream, count) {
334
- let taken = 0;
335
- for await (const value of stream) {
336
- if (taken >= count)
337
- break;
338
- yield value;
339
- taken++;
340
- }
341
- }
342
- /**
343
- * Merge multiple message streams into one.
344
- *
345
- * Yields messages from all streams as they arrive.
346
- * Completes when all source streams complete.
347
- *
348
- * @param streams - Array of source streams
349
- * @returns Async iterable of merged messages
350
- *
351
- * @example
352
- * ```typescript
353
- * const stream1 = agent.subscribe({ from: 'did:key:alice' });
354
- * const stream2 = agent.subscribe({ from: 'did:key:bob' });
355
- * const merged = mergeStreams([stream1, stream2]);
356
- *
357
- * for await (const message of merged) {
358
- * console.log('From:', message.sender);
359
- * }
360
- * ```
361
- */
362
- async function* mergeStreams(streams) {
363
- const iterators = streams.map((s) => s[Symbol.asyncIterator]());
364
- const pending = new Map();
365
- // Start all iterators
366
- for (let i = 0; i < iterators.length; i++) {
367
- pending.set(i, iterators[i].next());
368
- }
369
- while (pending.size > 0) {
370
- // Race all pending next() calls
371
- const entries = Array.from(pending.entries());
372
- const winner = await Promise.race(entries.map(async ([idx, promise]) => ({ idx, result: await promise })));
373
- pending.delete(winner.idx);
374
- if (!winner.result.done) {
375
- yield winner.result.value;
376
- // Start next iteration for this stream
377
- pending.set(winner.idx, iterators[winner.idx].next());
378
- }
379
- }
380
- }
381
- /**
382
- * Add subscribe method to Agent prototype.
383
- * @internal
384
- */
385
- function installAsyncIterators(AgentClass) {
386
- if ('subscribe' in AgentClass.prototype) {
387
- return; // Already installed
388
- }
389
- AgentClass.prototype.subscribe = function (options) {
390
- return new MessageStream(this, options);
391
- };
392
- }
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;