@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.
- package/LICENSES.md +212 -0
- package/README.md +388 -6
- package/dist-standalone/_deps/mldsa-wasm/dist/mldsa.js +1 -1920
- package/dist-standalone/_deps/shared/cjs/errors.js +1 -639
- package/dist-standalone/_deps/shared/cjs/index.js +1 -496
- package/dist-standalone/_deps/shared/cjs/types.js +1 -317
- package/dist-standalone/_deps/shared/errors.js +1 -255
- package/dist-standalone/_deps/shared/index.js +1 -74
- package/dist-standalone/_deps/shared/types.js +1 -90
- package/dist-standalone/_deps/ux-helpers/cjs/errors.js +1 -1
- package/dist-standalone/_deps/ux-helpers/cjs/index.js +1 -1
- package/dist-standalone/_deps/ux-helpers/cjs/pagination.js +1 -1
- package/dist-standalone/_deps/ux-helpers/cjs/progress.js +1 -1
- package/dist-standalone/_deps/ux-helpers/cjs/search.js +1 -1
- package/dist-standalone/_deps/ux-helpers/cjs/types.js +1 -1
- package/dist-standalone/_deps/ux-helpers/errors.js +1 -1
- package/dist-standalone/_deps/ux-helpers/index.js +1 -1
- package/dist-standalone/_deps/ux-helpers/pagination.js +1 -1
- package/dist-standalone/_deps/ux-helpers/progress.js +1 -1
- package/dist-standalone/_deps/ux-helpers/search.js +1 -1
- package/dist-standalone/_deps/xchange/auto-accept.js +1 -1
- package/dist-standalone/_deps/xchange/cjs/auto-accept.js +1 -1
- package/dist-standalone/_deps/xchange/cjs/errors.js +1 -1
- package/dist-standalone/_deps/xchange/cjs/index.js +1 -1
- package/dist-standalone/_deps/xchange/cjs/invite-client.js +1 -1
- package/dist-standalone/_deps/xchange/cjs/lazy-init.js +1 -1
- package/dist-standalone/_deps/xchange/cjs/trust-integration.js +1 -1
- package/dist-standalone/_deps/xchange/cjs/xchange.js +1 -1
- package/dist-standalone/_deps/xchange/errors.js +1 -1
- package/dist-standalone/_deps/xchange/index.js +1 -1
- package/dist-standalone/_deps/xchange/invite-client.js +1 -1
- package/dist-standalone/_deps/xchange/lazy-init.js +1 -1
- package/dist-standalone/_deps/xchange/trust-integration.js +1 -1
- package/dist-standalone/_deps/xchange/xchange.js +1 -1
- package/dist-standalone/_deps/xregistry/cjs/discovery.js +1 -1
- package/dist-standalone/_deps/xregistry/cjs/errors.js +1 -1
- package/dist-standalone/_deps/xregistry/cjs/index.js +1 -1
- package/dist-standalone/_deps/xregistry/cjs/registry.js +1 -1
- package/dist-standalone/_deps/xregistry/cjs/schema.js +1 -1
- package/dist-standalone/_deps/xregistry/cjs/types.js +1 -1
- package/dist-standalone/_deps/xregistry/discovery.js +1 -1
- package/dist-standalone/_deps/xregistry/errors.js +1 -1
- package/dist-standalone/_deps/xregistry/index.js +1 -1
- package/dist-standalone/_deps/xregistry/registry.js +1 -1
- package/dist-standalone/_deps/xregistry/schema.js +1 -1
- package/dist-standalone/_deps/xregistry/types.js +1 -1
- package/dist-standalone/agent-call.js +1 -642
- package/dist-standalone/agent-sdk.js +1 -328
- package/dist-standalone/agent.d.ts +95 -5
- package/dist-standalone/agent.js +1 -1545
- package/dist-standalone/approval.js +1 -193
- package/dist-standalone/async-iterators.d.ts +275 -0
- package/dist-standalone/async-iterators.js +1 -0
- package/dist-standalone/auth.js +1 -219
- package/dist-standalone/auto-accept.js +1 -229
- package/dist-standalone/backup-config.js +1 -201
- package/dist-standalone/backup.d.ts +114 -0
- package/dist-standalone/backup.js +1 -0
- package/dist-standalone/batch-operations.d.ts +297 -0
- package/dist-standalone/batch-operations.js +1 -0
- package/dist-standalone/cancellation.d.ts +301 -0
- package/dist-standalone/cancellation.js +1 -0
- package/dist-standalone/checkpoint.js +1 -186
- package/dist-standalone/circuit-breaker.d.ts +351 -0
- package/dist-standalone/circuit-breaker.js +1 -0
- package/dist-standalone/cjs/agent-call.js +1 -651
- package/dist-standalone/cjs/agent-sdk.js +1 -332
- package/dist-standalone/cjs/agent.js +1 -1582
- package/dist-standalone/cjs/approval.js +1 -199
- package/dist-standalone/cjs/async-iterators.js +1 -0
- package/dist-standalone/cjs/auth.js +1 -225
- package/dist-standalone/cjs/auto-accept.js +1 -233
- package/dist-standalone/cjs/backup-config.js +1 -207
- package/dist-standalone/cjs/backup.js +1 -0
- package/dist-standalone/cjs/batch-operations.js +1 -0
- package/dist-standalone/cjs/cancellation.js +1 -0
- package/dist-standalone/cjs/checkpoint.js +1 -193
- package/dist-standalone/cjs/circuit-breaker.js +1 -0
- package/dist-standalone/cjs/cli/init.js +1 -486
- package/dist-standalone/cjs/config-validation.js +1 -0
- package/dist-standalone/cjs/connect.js +1 -312
- package/dist-standalone/cjs/connection-pool.js +1 -0
- package/dist-standalone/cjs/correlation-id.js +1 -339
- package/dist-standalone/cjs/crypto-utils.js +1 -0
- package/dist-standalone/cjs/debug-mode.js +1 -0
- package/dist-standalone/cjs/did-document.js +1 -101
- package/dist-standalone/cjs/did-privateme.js +1 -130
- package/dist-standalone/cjs/did-web.js +1 -201
- package/dist-standalone/cjs/discovery.js +1 -462
- package/dist-standalone/cjs/dual-mode.js +1 -251
- package/dist-standalone/cjs/email-templates.js +1 -313
- package/dist-standalone/cjs/email-transport.js +1 -239
- package/dist-standalone/cjs/envelope.js +1 -510
- package/dist-standalone/cjs/errors.js +1 -826
- package/dist-standalone/cjs/event-emitter.js +1 -0
- package/dist-standalone/cjs/gateway-state.js +1 -55
- package/dist-standalone/cjs/gateway-transport.js +1 -120
- package/dist-standalone/cjs/graceful-degradation.js +1 -0
- package/dist-standalone/cjs/guardrails.js +1 -223
- package/dist-standalone/cjs/health-check.js +1 -0
- package/dist-standalone/cjs/http-compat.js +1 -272
- package/dist-standalone/cjs/http-status-map.js +1 -571
- package/dist-standalone/cjs/identity.js +1 -540
- package/dist-standalone/cjs/index.js +1 -237
- package/dist-standalone/cjs/invitation.js +1 -421
- package/dist-standalone/cjs/invite.js +1 -328
- package/dist-standalone/cjs/key-agreement.js +1 -246
- package/dist-standalone/cjs/lazy-init.js +1 -300
- package/dist-standalone/cjs/logger.js +1 -0
- package/dist-standalone/cjs/mdns-discovery.js +1 -202
- package/dist-standalone/cjs/nonce-store.js +1 -66
- package/dist-standalone/cjs/pairing-manager.js +1 -223
- package/dist-standalone/cjs/plugin-system.js +1 -0
- package/dist-standalone/cjs/plugins/logging.js +1 -0
- package/dist-standalone/cjs/plugins/metrics.js +1 -0
- package/dist-standalone/cjs/plugins/validation.js +1 -0
- package/dist-standalone/cjs/policy.js +1 -320
- package/dist-standalone/cjs/progress-callbacks.js +1 -0
- package/dist-standalone/cjs/redis-nonce-store.js +1 -76
- package/dist-standalone/cjs/registry-middleware.js +1 -50
- package/dist-standalone/cjs/retry-strategies.js +1 -0
- package/dist-standalone/cjs/retry-transport.js +1 -102
- package/dist-standalone/cjs/runtime/browser.js +1 -0
- package/dist-standalone/cjs/runtime/edge.js +1 -0
- package/dist-standalone/cjs/runtime/react-native.js +1 -0
- package/dist-standalone/cjs/security-policy.js +1 -245
- package/dist-standalone/cjs/serialization.js +1 -0
- package/dist-standalone/cjs/split-channel.js +1 -177
- package/dist-standalone/cjs/subscription-proof.js +1 -230
- package/dist-standalone/cjs/succession.js +1 -148
- package/dist-standalone/cjs/timeouts.js +1 -0
- package/dist-standalone/cjs/trace-context.js +1 -0
- package/dist-standalone/cjs/trace-spans.js +1 -0
- package/dist-standalone/cjs/transport.js +1 -63
- package/dist-standalone/cjs/trust-registry.js +1 -742
- package/dist-standalone/cjs/types/error-response.js +1 -56
- package/dist-standalone/cjs/vault-auth.js +1 -0
- package/dist-standalone/cjs/vault-store-loader.js +1 -0
- package/dist-standalone/cjs/verify.js +1 -25
- package/dist-standalone/cjs/version-info.js +1 -0
- package/dist-standalone/cjs/xfetch.js +1 -252
- package/dist-standalone/cli/init.js +1 -449
- package/dist-standalone/cli/setup.js +1 -514
- package/dist-standalone/cli/types.js +1 -27
- package/dist-standalone/cli/xbind.js +1 -148
- package/dist-standalone/config-validation.d.ts +185 -0
- package/dist-standalone/config-validation.js +1 -0
- package/dist-standalone/connect.js +1 -274
- package/dist-standalone/connection-pool.d.ts +251 -0
- package/dist-standalone/connection-pool.js +1 -0
- package/dist-standalone/correlation-id.js +1 -326
- package/dist-standalone/crypto-utils.d.ts +60 -0
- package/dist-standalone/crypto-utils.js +1 -0
- package/dist-standalone/debug-mode.d.ts +286 -0
- package/dist-standalone/debug-mode.js +1 -0
- package/dist-standalone/did-document.js +1 -96
- package/dist-standalone/did-privateme.js +1 -121
- package/dist-standalone/did-web.js +1 -196
- package/dist-standalone/discovery.js +1 -458
- package/dist-standalone/dual-mode.js +1 -247
- package/dist-standalone/email-templates.js +1 -309
- package/dist-standalone/email-transport.js +1 -232
- package/dist-standalone/envelope.d.ts +29 -1
- package/dist-standalone/envelope.js +1 -497
- package/dist-standalone/errors.d.ts +10 -0
- package/dist-standalone/errors.js +1 -811
- package/dist-standalone/event-emitter.d.ts +395 -0
- package/dist-standalone/event-emitter.js +1 -0
- package/dist-standalone/gateway-state.js +1 -51
- package/dist-standalone/gateway-transport.js +1 -116
- package/dist-standalone/graceful-degradation.d.ts +246 -0
- package/dist-standalone/graceful-degradation.js +1 -0
- package/dist-standalone/guardrails.js +1 -216
- package/dist-standalone/health-check.d.ts +150 -0
- package/dist-standalone/health-check.js +1 -0
- package/dist-standalone/http-compat.js +1 -267
- package/dist-standalone/http-status-map.js +1 -561
- package/dist-standalone/identity.d.ts +64 -1
- package/dist-standalone/identity.js +1 -515
- package/dist-standalone/index.d.ts +45 -3
- package/dist-standalone/index.js +1 -52
- package/dist-standalone/invitation.js +1 -415
- package/dist-standalone/invite.js +1 -324
- package/dist-standalone/key-agreement.d.ts +61 -13
- package/dist-standalone/key-agreement.js +1 -236
- package/dist-standalone/lazy-init.js +1 -295
- package/dist-standalone/logger.d.ts +77 -0
- package/dist-standalone/logger.js +1 -0
- package/dist-standalone/mdns-discovery.js +1 -195
- package/dist-standalone/nonce-store.d.ts +16 -3
- package/dist-standalone/nonce-store.js +1 -62
- package/dist-standalone/package.json +0 -1
- package/dist-standalone/pairing-manager.js +1 -219
- package/dist-standalone/plugin-system.d.ts +145 -0
- package/dist-standalone/plugin-system.js +1 -0
- package/dist-standalone/policy.js +1 -315
- package/dist-standalone/progress-callbacks.d.ts +394 -0
- package/dist-standalone/progress-callbacks.js +1 -0
- package/dist-standalone/redis-nonce-store.js +1 -72
- package/dist-standalone/registry-middleware.js +1 -47
- package/dist-standalone/retry-strategies.d.ts +382 -0
- package/dist-standalone/retry-strategies.js +1 -0
- package/dist-standalone/retry-transport.js +1 -98
- package/dist-standalone/security-policy.js +1 -239
- package/dist-standalone/serialization.d.ts +244 -0
- package/dist-standalone/serialization.js +1 -0
- package/dist-standalone/split-channel.d.ts +49 -1
- package/dist-standalone/split-channel.js +1 -171
- package/dist-standalone/subscription-proof.js +1 -224
- package/dist-standalone/succession.js +1 -142
- package/dist-standalone/timeouts.d.ts +275 -0
- package/dist-standalone/timeouts.js +1 -0
- package/dist-standalone/trace-context.d.ts +252 -0
- package/dist-standalone/trace-context.js +1 -0
- package/dist-standalone/trace-spans.d.ts +360 -0
- package/dist-standalone/trace-spans.js +1 -0
- package/dist-standalone/transport.js +1 -59
- package/dist-standalone/trust-registry.d.ts +106 -5
- package/dist-standalone/trust-registry.js +1 -702
- package/dist-standalone/vault-auth.d.ts +91 -0
- package/dist-standalone/vault-auth.js +1 -0
- package/dist-standalone/vault-store-loader.d.ts +110 -0
- package/dist-standalone/vault-store-loader.js +1 -0
- package/dist-standalone/verify.js +1 -16
- package/dist-standalone/version-info.d.ts +259 -0
- package/dist-standalone/version-info.js +1 -0
- package/dist-standalone/xfetch.js +1 -247
- package/llms.txt +1 -0
- package/package.json +65 -5
- package/share1.dat +0 -0
- package/dist-standalone/_deps/crypto/base64.d.ts +0 -29
- package/dist-standalone/_deps/crypto/base64.js +0 -222
- package/dist-standalone/_deps/crypto/cjs/base64.js +0 -665
- package/dist-standalone/_deps/crypto/cjs/errors.js +0 -675
- package/dist-standalone/_deps/crypto/cjs/hmac.js +0 -473
- package/dist-standalone/_deps/crypto/cjs/index.js +0 -852
- package/dist-standalone/_deps/crypto/cjs/package.json +0 -1
- package/dist-standalone/_deps/crypto/cjs/padding.js +0 -511
- package/dist-standalone/_deps/crypto/cjs/share-header.js +0 -372
- package/dist-standalone/_deps/crypto/cjs/shares.js +0 -874
- package/dist-standalone/_deps/crypto/cjs/tlv.js +0 -1021
- package/dist-standalone/_deps/crypto/cjs/uuid.js +0 -443
- package/dist-standalone/_deps/crypto/cjs/verify.js +0 -414
- package/dist-standalone/_deps/crypto/cjs/xorida.js +0 -923
- package/dist-standalone/_deps/crypto/errors.d.ts +0 -51
- package/dist-standalone/_deps/crypto/errors.js +0 -199
- package/dist-standalone/_deps/crypto/hmac.d.ts +0 -39
- package/dist-standalone/_deps/crypto/hmac.js +0 -134
- package/dist-standalone/_deps/crypto/index.d.ts +0 -20
- package/dist-standalone/_deps/crypto/index.js +0 -145
- package/dist-standalone/_deps/crypto/padding.d.ts +0 -19
- package/dist-standalone/_deps/crypto/padding.js +0 -159
- package/dist-standalone/_deps/crypto/share-header.d.ts +0 -44
- package/dist-standalone/_deps/crypto/share-header.js +0 -92
- package/dist-standalone/_deps/crypto/shares.d.ts +0 -27
- package/dist-standalone/_deps/crypto/shares.js +0 -295
- package/dist-standalone/_deps/crypto/tlv.d.ts +0 -26
- package/dist-standalone/_deps/crypto/tlv.js +0 -364
- package/dist-standalone/_deps/crypto/uuid.d.ts +0 -22
- package/dist-standalone/_deps/crypto/uuid.js +0 -136
- package/dist-standalone/_deps/crypto/verify.d.ts +0 -15
- package/dist-standalone/_deps/crypto/verify.js +0 -71
- package/dist-standalone/_deps/crypto/xorida.d.ts +0 -44
- package/dist-standalone/_deps/crypto/xorida.js +0 -366
- package/dist-standalone/_deps/shared/errors.d.ts.map +0 -1
- package/dist-standalone/_deps/shared/errors.js.map +0 -1
- package/dist-standalone/_deps/shared/index.d.ts.map +0 -1
- package/dist-standalone/_deps/shared/index.js.map +0 -1
- package/dist-standalone/_deps/shared/types.d.ts.map +0 -1
- package/dist-standalone/_deps/shared/types.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/errors.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/errors.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/index.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/index.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/pagination.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/pagination.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/progress.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/progress.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/search.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/search.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/types.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/types.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/errors.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/errors.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/index.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/index.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/pagination.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/pagination.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/progress.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/progress.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/search.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/search.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/types.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/types.js.map +0 -1
- package/dist-standalone/_deps/xregistry/discovery.d.ts.map +0 -1
- package/dist-standalone/_deps/xregistry/discovery.js.map +0 -1
- package/dist-standalone/_deps/xregistry/errors.d.ts.map +0 -1
- package/dist-standalone/_deps/xregistry/errors.js.map +0 -1
- package/dist-standalone/_deps/xregistry/index.d.ts.map +0 -1
- package/dist-standalone/_deps/xregistry/index.js.map +0 -1
- package/dist-standalone/_deps/xregistry/registry.d.ts.map +0 -1
- package/dist-standalone/_deps/xregistry/registry.js.map +0 -1
- package/dist-standalone/_deps/xregistry/schema.d.ts.map +0 -1
- package/dist-standalone/_deps/xregistry/schema.js.map +0 -1
- package/dist-standalone/_deps/xregistry/types.d.ts.map +0 -1
- package/dist-standalone/_deps/xregistry/types.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.XBindEventEmitter=void 0,exports.createScopedEmitter=createScopedEmitter;const shared_1=require("../_deps/shared/index.js");class XBindEventEmitter{listeners=new Map;parent;disposed=!1;eventCounter=0;maxListeners=10;warningsEnabled=!0;constructor(e){this.parent=e}on(e,t,s={}){if(this.checkDisposed(),"function"!=typeof t)throw new Error("Listener must be a function");const r=this.listeners.get(e)??[],n={listener:t,once:s.once??!1,priority:s.priority??0};return r.push(n),r.sort((e,t)=>t.priority-e.priority),this.listeners.set(e,r),this.warningsEnabled&&this.maxListeners>0&&r.length>this.maxListeners&&console.warn(`[xBind EventEmitter] Possible memory leak detected: ${r.length} listeners for event '${e}'. Use emitter.setMaxListeners() to increase limit.`),this}once(e,t,s={}){return this.on(e,t,{...s,once:!0})}off(e,t){this.checkDisposed();const s=this.listeners.get(e);if(!s)return this;const r=s.filter(e=>e.listener!==t);return 0===r.length?this.listeners.delete(e):this.listeners.set(e,r),this}removeAllListeners(e){return this.checkDisposed(),e?this.listeners.delete(e):this.listeners.clear(),this}async emit(e,t,s={}){this.checkDisposed();const r={...t,eventId:s.eventId??this.generateEventId(),timestamp:(new Date).toISOString()},n=this.listeners.get(e);if(n&&n.length>0){const t=[...n];for(const n of t)try{if(await n.listener(r),n.once&&this.off(e,n.listener),s.stopPropagation)return(0,shared_1.ok)(void 0)}catch(t){return console.error(`[xBind EventEmitter] Error in listener for '${e}':`,t),(0,shared_1.err)("LISTENER_ERROR")}}return!1!==s.bubble&&this.parent?this.parent.emit(e,t,{...s,bubble:!0}):(0,shared_1.ok)(void 0)}hasListeners(e){const t=this.listeners.get(e);return void 0!==t&&t.length>0}listenerCount(e){const t=this.listeners.get(e);return t?.length??0}eventNames(){return Array.from(this.listeners.keys())}setMaxListeners(e){if(e<0||!Number.isInteger(e))throw new Error("Max listeners must be a non-negative integer");return this.maxListeners=e,this}getMaxListeners(){return this.maxListeners}setWarningsEnabled(e){return this.warningsEnabled=e,this}setParent(e){return this.parent=e,this}getParent(){return this.parent}waitFor(e,t){return new Promise((s,r)=>{let n;const i=e=>{n&&clearTimeout(n),s(e)};this.once(e,i),void 0!==t&&t>0&&(n=setTimeout(()=>{this.off(e,i),r(new Error(`Timeout waiting for event '${e}' after ${t}ms`))},t))})}dispose(){this.disposed=!0,this.listeners.clear(),this.parent=void 0}isDisposed(){return this.disposed}checkDisposed(){if(this.disposed)throw new Error("EventEmitter has been disposed")}generateEventId(){return`evt-${Date.now()}-${++this.eventCounter}`}}function createScopedEmitter(e,t){const s=new XBindEventEmitter(e),r=new Set(t);return{on:(e,t,n)=>{if(!r.has(e))throw new Error(`Event type '${String(e)}' not allowed in scoped emitter`);return s.on(e,t,n)},once:(e,t,n)=>{if(!r.has(e))throw new Error(`Event type '${String(e)}' not allowed in scoped emitter`);return s.once(e,t,n)},off:(e,t)=>s.off(e,t),emit:(e,t,n)=>r.has(e)?s.emit(e,t,n):Promise.resolve((0,shared_1.err)("INVALID_EVENT_TYPE")),hasListeners:e=>s.hasListeners(e),listenerCount:e=>s.listenerCount(e),dispose:()=>s.dispose()}}exports.XBindEventEmitter=XBindEventEmitter;
|
|
@@ -1,55 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GatewayConnectionState = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* Gateway connection state manager.
|
|
6
|
-
*
|
|
7
|
-
* Online-only model: State evaporates immediately on disconnect.
|
|
8
|
-
* No 12-hour windows, no persistent state.
|
|
9
|
-
*
|
|
10
|
-
* Note: WebSocket type is runtime-dependent (browser WebSocket or 'ws' package).
|
|
11
|
-
*/
|
|
12
|
-
class GatewayConnectionState {
|
|
13
|
-
connections = new Map(); // did → socket
|
|
14
|
-
/**
|
|
15
|
-
* Register agent connection.
|
|
16
|
-
*
|
|
17
|
-
* @param did - DID of the connecting agent
|
|
18
|
-
* @param socket - WebSocket connection (browser or Node.js 'ws' package)
|
|
19
|
-
*/
|
|
20
|
-
connect(did, socket) {
|
|
21
|
-
this.connections.set(did, socket);
|
|
22
|
-
// Handle close event (works for both browser and Node.js ws)
|
|
23
|
-
if (typeof socket.on === 'function') {
|
|
24
|
-
// Node.js 'ws' package style
|
|
25
|
-
socket.on('close', () => {
|
|
26
|
-
this.connections.delete(did); // Immediate evaporation
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
else if (socket.addEventListener) {
|
|
30
|
-
// Browser WebSocket style
|
|
31
|
-
socket.addEventListener('close', () => {
|
|
32
|
-
this.connections.delete(did);
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Check if agent is currently online.
|
|
38
|
-
*/
|
|
39
|
-
isOnline(did) {
|
|
40
|
-
return this.connections.has(did);
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Get WebSocket for online agent (or null if offline).
|
|
44
|
-
*/
|
|
45
|
-
getSocket(did) {
|
|
46
|
-
return this.connections.get(did) ?? null;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Get all online DIDs.
|
|
50
|
-
*/
|
|
51
|
-
getOnlineDids() {
|
|
52
|
-
return Array.from(this.connections.keys());
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
exports.GatewayConnectionState = GatewayConnectionState;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.GatewayConnectionState=void 0;class GatewayConnectionState{connections=new Map;connect(e,n){this.connections.set(e,n),"function"==typeof n.on?n.on("close",()=>{this.connections.delete(e)}):n.addEventListener&&n.addEventListener("close",()=>{this.connections.delete(e)})}isOnline(e){return this.connections.has(e)}getSocket(e){return this.connections.get(e)??null}getOnlineDids(){return Array.from(this.connections.keys())}}exports.GatewayConnectionState=GatewayConnectionState;
|
|
@@ -1,120 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Gateway transport adapter for delivering envelopes to Xail inbox users.
|
|
4
|
-
*
|
|
5
|
-
* Sends envelopes via POST /gateway/deliver on the hosted gateway API.
|
|
6
|
-
* For agent-to-agent (M2M), use HttpsTransportAdapter with direct URLs.
|
|
7
|
-
* Optionally polls for incoming messages.
|
|
8
|
-
*/
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.GatewayTransport = void 0;
|
|
11
|
-
const shared_1 = require("../_deps/shared/index.js");
|
|
12
|
-
/**
|
|
13
|
-
* Transport adapter for the Xail Gateway.
|
|
14
|
-
*
|
|
15
|
-
* Sends envelopes via POST /gateway/deliver with API key auth.
|
|
16
|
-
* Optionally polls GET /gateway/messages/:did for incoming messages.
|
|
17
|
-
*/
|
|
18
|
-
class GatewayTransport {
|
|
19
|
-
apiKey;
|
|
20
|
-
gateway;
|
|
21
|
-
timeoutMs;
|
|
22
|
-
fetchFn;
|
|
23
|
-
pollIntervalMs;
|
|
24
|
-
handlers = [];
|
|
25
|
-
pollTimer = null;
|
|
26
|
-
senderDid = null;
|
|
27
|
-
constructor(opts) {
|
|
28
|
-
this.apiKey = opts.apiKey;
|
|
29
|
-
this.gateway = opts.gateway.replace(/\/$/, '');
|
|
30
|
-
this.timeoutMs = opts.timeoutMs ?? 15_000;
|
|
31
|
-
this.fetchFn = opts.fetch ?? globalThis.fetch.bind(globalThis);
|
|
32
|
-
this.pollIntervalMs = opts.pollIntervalMs ?? 0;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Send a signed envelope to a recipient via the gateway.
|
|
36
|
-
* @param envelope - The signed transport envelope.
|
|
37
|
-
* @param _recipientDid - Recipient DID (already in envelope.recipient).
|
|
38
|
-
* @returns Success or transport error.
|
|
39
|
-
*/
|
|
40
|
-
async send(envelope, _recipientDid) {
|
|
41
|
-
const url = `${this.gateway}/gateway/deliver`;
|
|
42
|
-
try {
|
|
43
|
-
const controller = new AbortController();
|
|
44
|
-
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
45
|
-
const response = await this.fetchFn(url, {
|
|
46
|
-
method: 'POST',
|
|
47
|
-
headers: {
|
|
48
|
-
'Content-Type': 'application/json',
|
|
49
|
-
'Authorization': `Bearer ${this.apiKey}`,
|
|
50
|
-
},
|
|
51
|
-
body: JSON.stringify(envelope),
|
|
52
|
-
signal: controller.signal,
|
|
53
|
-
});
|
|
54
|
-
clearTimeout(timer);
|
|
55
|
-
if (!response.ok) {
|
|
56
|
-
return (0, shared_1.err)(response.status === 404
|
|
57
|
-
? 'RECIPIENT_UNREACHABLE'
|
|
58
|
-
: 'SEND_FAILED');
|
|
59
|
-
}
|
|
60
|
-
return (0, shared_1.ok)(undefined);
|
|
61
|
-
}
|
|
62
|
-
catch (e) {
|
|
63
|
-
if (e instanceof DOMException && e.name === 'AbortError') {
|
|
64
|
-
return (0, shared_1.err)('TIMEOUT');
|
|
65
|
-
}
|
|
66
|
-
return (0, shared_1.err)('NETWORK_ERROR');
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
/** Register a handler for incoming envelopes. */
|
|
70
|
-
onReceive(handler) {
|
|
71
|
-
this.handlers.push(handler);
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Start polling for incoming messages.
|
|
75
|
-
* Must be called after Agent.create() sets the sender DID.
|
|
76
|
-
* @param did - The agent's own DID for polling.
|
|
77
|
-
*/
|
|
78
|
-
startPolling(did) {
|
|
79
|
-
this.senderDid = did;
|
|
80
|
-
if (this.pollIntervalMs > 0 && !this.pollTimer) {
|
|
81
|
-
this.pollTimer = setInterval(() => void this.poll(), this.pollIntervalMs);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
/** Shut down the transport (stop polling, clear handlers). */
|
|
85
|
-
dispose() {
|
|
86
|
-
if (this.pollTimer) {
|
|
87
|
-
clearInterval(this.pollTimer);
|
|
88
|
-
this.pollTimer = null;
|
|
89
|
-
}
|
|
90
|
-
this.handlers = [];
|
|
91
|
-
}
|
|
92
|
-
/** Poll for incoming messages and dispatch to handlers. */
|
|
93
|
-
async poll() {
|
|
94
|
-
if (!this.senderDid)
|
|
95
|
-
return;
|
|
96
|
-
try {
|
|
97
|
-
const url = `${this.gateway}/gateway/messages/${encodeURIComponent(this.senderDid)}`;
|
|
98
|
-
const res = await this.fetchFn(url, {
|
|
99
|
-
headers: { Authorization: `Bearer ${this.apiKey}` },
|
|
100
|
-
});
|
|
101
|
-
if (!res.ok)
|
|
102
|
-
return;
|
|
103
|
-
const data = (await res.json());
|
|
104
|
-
for (const msg of data.messages) {
|
|
105
|
-
for (const handler of this.handlers) {
|
|
106
|
-
handler(msg.envelope);
|
|
107
|
-
}
|
|
108
|
-
// Ack delivery
|
|
109
|
-
await this.fetchFn(`${this.gateway}/gateway/ack/${msg.id}`, {
|
|
110
|
-
method: 'POST',
|
|
111
|
-
headers: { Authorization: `Bearer ${this.apiKey}` },
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
catch {
|
|
116
|
-
// Silent failure — polling errors are non-fatal
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
exports.GatewayTransport = GatewayTransport;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.GatewayTransport=void 0;const shared_1=require("../_deps/shared/index.js");class GatewayTransport{apiKey;gateway;timeoutMs;fetchFn;pollIntervalMs;handlers=[];pollTimer=null;senderDid=null;constructor(e){this.apiKey=e.apiKey,this.gateway=e.gateway.replace(/\/$/,""),this.timeoutMs=e.timeoutMs??15e3,this.fetchFn=e.fetch??globalThis.fetch.bind(globalThis),this.pollIntervalMs=e.pollIntervalMs??0}async send(e,t){const s=`${this.gateway}/gateway/deliver`;try{const t=new AbortController,a=setTimeout(()=>t.abort(),this.timeoutMs),r=await this.fetchFn(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(e),signal:t.signal});return clearTimeout(a),r.ok?(0,shared_1.ok)(void 0):(0,shared_1.err)(404===r.status?"RECIPIENT_UNREACHABLE":"SEND_FAILED")}catch(e){return e instanceof DOMException&&"AbortError"===e.name?(0,shared_1.err)("TIMEOUT"):(0,shared_1.err)("NETWORK_ERROR")}}onReceive(e){this.handlers.push(e)}startPolling(e){this.senderDid=e,this.pollIntervalMs>0&&!this.pollTimer&&(this.pollTimer=setInterval(()=>{this.poll()},this.pollIntervalMs))}dispose(){this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null),this.handlers=[]}async poll(){if(this.senderDid)try{const e=`${this.gateway}/gateway/messages/${encodeURIComponent(this.senderDid)}`,t=await this.fetchFn(e,{headers:{Authorization:`Bearer ${this.apiKey}`}});if(!t.ok)return;const s=await t.json();for(const e of s.messages){for(const t of this.handlers)t(e.envelope);await this.fetchFn(`${this.gateway}/gateway/ack/${e.id}`,{method:"POST",headers:{Authorization:`Bearer ${this.apiKey}`}})}}catch{}}}exports.GatewayTransport=GatewayTransport;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.GracefulDegradationManager=void 0,exports.registryLookupWithFallback=registryLookupWithFallback,exports.sendWithTransportFallback=sendWithTransportFallback,exports.enhanceError=enhanceError;const shared_1=require("../_deps/shared/index.js"),ux_helpers_1=require("../_deps/ux-helpers/index.js"),DEFAULT_CACHE_CONFIG={defaultTTL:3e5,maxSize:1e3,allowStale:!0,maxStaleMs:36e5},DEFAULT_RETRY_CONFIG={maxAttempts:3,initialDelayMs:1e3,backoffMultiplier:2,maxDelayMs:3e4,jitter:!0};class GracefulDegradationManager{cacheConfig;retryConfig;cache=new Map;serviceStatus=new Map;constructor(e,t){this.cacheConfig={...DEFAULT_CACHE_CONFIG,...e},this.retryConfig={...DEFAULT_RETRY_CONFIG,...t}}getCached(e,t){const r=this.cache.get(e);if(!r)return;const a=Date.now()-r.cachedAt,s=a<=r.ttl,i=a>r.ttl&&a<=this.cacheConfig.maxStaleMs;return"CRITICAL"===t||"HIGH"===t?s?r.value:void 0:this.cacheConfig.allowStale&&(s||i)?(r.usageCount++,r.value):s?r.value:void 0}setCached(e,t,r){if(this.cache.size>=this.cacheConfig.maxSize){const e=this.cache.keys().next().value;e&&this.cache.delete(e)}this.cache.set(e,{value:t,cachedAt:Date.now(),ttl:r??this.cacheConfig.defaultTTL,usageCount:0})}invalidate(e){this.cache.delete(e)}clearCache(){this.cache.clear()}getCacheStats(){const e=Date.now(),t=Array.from(this.cache.entries()).map(([t,r])=>({key:t,age:e-r.cachedAt,usageCount:r.usageCount}));return{size:this.cache.size,maxSize:this.cacheConfig.maxSize,entries:t}}recordSuccess(e){const t=this.serviceStatus.get(e)||{health:"HEALTHY",lastSuccess:0,failureCount:0};t.health="HEALTHY",t.lastSuccess=Date.now(),t.failureCount=0,t.lastError=void 0,this.serviceStatus.set(e,t)}recordFailure(e,t){const r=this.serviceStatus.get(e)||{health:"HEALTHY",lastSuccess:0,failureCount:0};r.failureCount++,r.lastError=t,r.failureCount>=5?r.health="UNAVAILABLE":r.failureCount>=2&&(r.health="DEGRADED"),this.serviceStatus.set(e,r)}getServiceHealth(e){return this.serviceStatus.get(e)?.health??"HEALTHY"}getServiceStatus(e){return this.serviceStatus.get(e)}resetServiceHealth(e){e?this.serviceStatus.delete(e):this.serviceStatus.clear()}async withRetry(e,t){const r=this.getMaxAttempts(t.qos);let a;for(let t=1;t<=r;t++){const s=await e();if(s.ok)return s;if(a=s.error,t<r){const e=this.calculateBackoff(t);await this.sleep(e)}}return(0,shared_1.err)(a)}getMaxAttempts(e){switch(e){case"CRITICAL":case"LOW":return 1;case"HIGH":return this.retryConfig.maxAttempts;case"NORMAL":return Math.max(1,this.retryConfig.maxAttempts-1)}}calculateBackoff(e){const t=this.retryConfig.initialDelayMs*Math.pow(this.retryConfig.backoffMultiplier,e-1),r=Math.min(t,this.retryConfig.maxDelayMs);if(!this.retryConfig.jitter)return r;const a=new Uint8Array(4);crypto.getRandomValues(a);const s=.75+.5*(new DataView(a.buffer).getUint32(0)/4294967295);return Math.floor(r*s)}sleep(e){return new Promise(t=>setTimeout(t,e))}}async function registryLookupWithFallback(e,t,r,a){const s=`registry:${t}`;if("LOW"===r.qos){const e=a.getCached(s,r.qos);if(e)return(0,shared_1.ok)(e)}const i=await a.withRetry(()=>e.getEntry(t),r);if(i.ok){a.recordSuccess("registry");const e={publicKey:Buffer.from(i.value.publicKey).toString("base64")};return a.setCached(s,e),(0,shared_1.ok)(e)}if(a.recordFailure("registry",String(i.error)),"HIGH"===r.qos||"NORMAL"===r.qos){const e=a.getCached(s,r.qos);if(e)return(0,shared_1.ok)(e)}return(0,shared_1.err)((0,ux_helpers_1.createDetailedError)("REGISTRY_UNAVAILABLE",`Failed to resolve DID: ${t}`,{hint:"UNAVAILABLE"===a.getServiceHealth("registry")?"Registry service is currently unavailable. Using cached data may help.":"Registry lookup failed after retries. Check network connectivity.",suggested_action:"CRITICAL"===r.qos?"Wait for registry service to recover before retrying critical operations.":"Lower QoS level to NORMAL or LOW to use cached data.",docs:"https://private.me/docs/xbind/registry-fallback",severity:"CRITICAL"===r.qos?"critical":"error"}))}async function sendWithTransportFallback(e,t,r,a,s){if(0===e.length)return(0,shared_1.err)((0,ux_helpers_1.createDetailedError)("NO_TRANSPORT","No transport adapters configured",{hint:"Configure at least one transport adapter for envelope delivery.",suggested_action:"Add HttpsTransportAdapter or custom transport to agent configuration.",docs:"https://private.me/docs/xbind/transport",severity:"critical"}));const i=[];for(let o=0;o<e.length;o++){const c=e[o];if(!c)continue;const n=await s.withRetry(()=>c.send(t,r),a);if(n.ok)return s.recordSuccess(`transport:${o}`),(0,shared_1.ok)(void 0);i.push({transport:o,error:n.error}),s.recordFailure(`transport:${o}`,n.error)}const o=i[0]?.error??"SEND_FAILED";return(0,shared_1.err)((0,ux_helpers_1.createDetailedError)("TRANSPORT_EXHAUSTED",`All transport adapters failed: ${i.map(e=>e.error).join(", ")}`,{hint:"NETWORK_ERROR"===o?"Network connectivity issue detected. Check internet connection.":"TIMEOUT"===o?"Transport timeout occurred. Recipient may be unreachable or overloaded.":"RECIPIENT_UNREACHABLE"===o?"Recipient DID not found or offline.":"Transport layer failure. Check transport configuration.",suggested_action:"Verify recipient endpoint and network connectivity. Consider increasing timeout or adding fallback transports.",docs:"https://private.me/docs/xbind/transport-fallback",severity:"CRITICAL"===a.qos?"critical":"error"}))}function enhanceError(e,t,r){const a=r.getServiceHealth(t.type.split(":")[0]??"unknown"),s="DEGRADED"===a?" Service is experiencing degraded performance.":"UNAVAILABLE"===a?" Service is currently unavailable.":"",i="CRITICAL"===t.qos?" Consider retrying when service recovers.":"HIGH"===t.qos?" Cached data may be used if available.":" Using cached data regardless of staleness.";return{...e,hint:(e.hint??"")+s+i}}exports.GracefulDegradationManager=GracefulDegradationManager;
|
|
@@ -1,223 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* @module guardrails
|
|
4
|
-
* Enhanced error messages with actionable suggestions for policy violations
|
|
5
|
-
*
|
|
6
|
-
* When policies deny requests, guardrails provide specific, actionable
|
|
7
|
-
* guidance on how to fix the issue or what to request from admins.
|
|
8
|
-
*/
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.Guardrails = exports.PolicyDenied = void 0;
|
|
11
|
-
exports.extractSuggestion = extractSuggestion;
|
|
12
|
-
exports.toPolicyDenied = toPolicyDenied;
|
|
13
|
-
/**
|
|
14
|
-
* Policy violation error with actionable suggestions
|
|
15
|
-
*/
|
|
16
|
-
class PolicyDenied extends Error {
|
|
17
|
-
rule;
|
|
18
|
-
allowed;
|
|
19
|
-
requested;
|
|
20
|
-
suggestion;
|
|
21
|
-
details;
|
|
22
|
-
constructor(
|
|
23
|
-
/** Which policy rule was violated */
|
|
24
|
-
rule,
|
|
25
|
-
/** What the policy allows */
|
|
26
|
-
allowed,
|
|
27
|
-
/** What was requested */
|
|
28
|
-
requested,
|
|
29
|
-
/** Actionable suggestion for how to fix */
|
|
30
|
-
suggestion,
|
|
31
|
-
/** Full policy violation details */
|
|
32
|
-
details) {
|
|
33
|
-
super(`Policy violation: ${rule}`);
|
|
34
|
-
this.rule = rule;
|
|
35
|
-
this.allowed = allowed;
|
|
36
|
-
this.requested = requested;
|
|
37
|
-
this.suggestion = suggestion;
|
|
38
|
-
this.details = details;
|
|
39
|
-
this.name = 'PolicyDenied';
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Format error for AI agent consumption
|
|
43
|
-
*
|
|
44
|
-
* Structured format optimized for LLM parsing
|
|
45
|
-
*/
|
|
46
|
-
toAgentFormat() {
|
|
47
|
-
return [
|
|
48
|
-
`POLICY_VIOLATION: ${this.rule}`,
|
|
49
|
-
`REQUESTED: ${JSON.stringify(this.requested)}`,
|
|
50
|
-
`ALLOWED: ${JSON.stringify(this.allowed)}`,
|
|
51
|
-
`SUGGESTION: ${this.suggestion}`,
|
|
52
|
-
].join('\n');
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Format error for human consumption
|
|
56
|
-
*
|
|
57
|
-
* User-friendly format with clear next steps
|
|
58
|
-
*/
|
|
59
|
-
toUserFormat() {
|
|
60
|
-
return [
|
|
61
|
-
`❌ Policy Violation: ${this.rule}`,
|
|
62
|
-
'',
|
|
63
|
-
`You requested: ${this.formatValue(this.requested)}`,
|
|
64
|
-
`Policy allows: ${this.formatValue(this.allowed)}`,
|
|
65
|
-
'',
|
|
66
|
-
`💡 Suggestion: ${this.suggestion}`,
|
|
67
|
-
].join('\n');
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Format error for logs (structured JSON)
|
|
71
|
-
*/
|
|
72
|
-
toLogFormat() {
|
|
73
|
-
return {
|
|
74
|
-
error: 'PolicyDenied',
|
|
75
|
-
rule: this.rule,
|
|
76
|
-
allowed: this.allowed,
|
|
77
|
-
requested: this.requested,
|
|
78
|
-
suggestion: this.suggestion,
|
|
79
|
-
details: this.details,
|
|
80
|
-
timestamp: new Date().toISOString(),
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
formatValue(value) {
|
|
84
|
-
if (typeof value === 'number') {
|
|
85
|
-
// Format currency if it looks like money
|
|
86
|
-
if (this.rule.includes('amount') || this.rule.includes('Amount')) {
|
|
87
|
-
return `$${value.toLocaleString()}`;
|
|
88
|
-
}
|
|
89
|
-
return value.toLocaleString();
|
|
90
|
-
}
|
|
91
|
-
if (Array.isArray(value)) {
|
|
92
|
-
return value.map((v) => `"${String(v)}"`).join(', ');
|
|
93
|
-
}
|
|
94
|
-
return JSON.stringify(value);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
exports.PolicyDenied = PolicyDenied;
|
|
98
|
-
/**
|
|
99
|
-
* Guardrail builder - fluent API for creating policy errors with suggestions
|
|
100
|
-
*
|
|
101
|
-
* @example
|
|
102
|
-
* ```typescript
|
|
103
|
-
* const error = Guardrails.amountExceeded({
|
|
104
|
-
* requested: 5000,
|
|
105
|
-
* limit: 1000,
|
|
106
|
-
* type: 'per-transaction'
|
|
107
|
-
* });
|
|
108
|
-
*
|
|
109
|
-
* throw error;
|
|
110
|
-
* // ❌ Policy Violation: maxAmount
|
|
111
|
-
* // You requested: $5,000
|
|
112
|
-
* // Policy allows: $1,000
|
|
113
|
-
* // 💡 Suggestion: Reduce amount to $1,000 or request policy update from admin
|
|
114
|
-
* ```
|
|
115
|
-
*/
|
|
116
|
-
class Guardrails {
|
|
117
|
-
/**
|
|
118
|
-
* Amount exceeded (per-transaction limit)
|
|
119
|
-
*/
|
|
120
|
-
static amountExceeded(options) {
|
|
121
|
-
let rule;
|
|
122
|
-
let suggestion;
|
|
123
|
-
switch (options.type) {
|
|
124
|
-
case 'per-transaction':
|
|
125
|
-
rule = 'maxAmount';
|
|
126
|
-
suggestion = `Reduce amount to $${options.limit.toLocaleString()} or request policy update from admin`;
|
|
127
|
-
break;
|
|
128
|
-
case 'daily':
|
|
129
|
-
rule = 'dailyAmount';
|
|
130
|
-
suggestion = `Reduce amount to stay within daily limit of $${options.limit.toLocaleString()}, or wait until tomorrow`;
|
|
131
|
-
break;
|
|
132
|
-
case 'monthly':
|
|
133
|
-
rule = 'monthlyAmount';
|
|
134
|
-
suggestion = `Reduce amount to stay within monthly limit of $${options.limit.toLocaleString()}, or wait until next month`;
|
|
135
|
-
break;
|
|
136
|
-
}
|
|
137
|
-
return new PolicyDenied(rule, options.limit, options.requested, suggestion);
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Rate limit exceeded
|
|
141
|
-
*/
|
|
142
|
-
static rateLimitExceeded(options) {
|
|
143
|
-
const windowSec = options.windowMs / 1000;
|
|
144
|
-
const suggestion = windowSec >= 60
|
|
145
|
-
? `Wait ${Math.ceil(windowSec / 60)} minutes before making additional calls`
|
|
146
|
-
: `Wait ${windowSec} seconds before making additional calls`;
|
|
147
|
-
return new PolicyDenied('callsPerMinute', options.limit, options.current + 1, suggestion);
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Tool not allowed
|
|
151
|
-
*/
|
|
152
|
-
static toolDenied(options) {
|
|
153
|
-
const [service] = options.tool.split(':');
|
|
154
|
-
const suggestion = options.allowed.length === 0
|
|
155
|
-
? `No tools are currently allowed. Request approval from admin to enable "${options.tool}"`
|
|
156
|
-
: `Request approval from admin to add "${options.tool}" or "${service}:*" to allowed tools`;
|
|
157
|
-
return new PolicyDenied('allowedTools', options.allowed, options.tool, suggestion);
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Scope not allowed
|
|
161
|
-
*/
|
|
162
|
-
static scopeDenied(options) {
|
|
163
|
-
const suggestion = options.allowed.length === 0
|
|
164
|
-
? `No scopes are currently allowed. Request approval from admin to enable "${options.scope}"`
|
|
165
|
-
: `Request approval from admin to add "${options.scope}" to allowed scopes`;
|
|
166
|
-
return new PolicyDenied('allowedScopes', options.allowed, options.scope, suggestion);
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Field filter denied (data access restriction)
|
|
170
|
-
*/
|
|
171
|
-
static fieldDenied(options) {
|
|
172
|
-
const suggestion = `Field "${options.field}" is restricted. Contact admin to update policy.fieldFilters for "${options.tool}"`;
|
|
173
|
-
return new PolicyDenied('fieldFilters', options.allowed, options.field, suggestion);
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Time window restriction
|
|
177
|
-
*/
|
|
178
|
-
static timeWindowDenied(options) {
|
|
179
|
-
const suggestion = `Actions are only allowed between ${options.allowedStart} and ${options.allowedEnd}. Current time is ${options.current.toTimeString()}`;
|
|
180
|
-
return new PolicyDenied('timeWindow', `${options.allowedStart} - ${options.allowedEnd}`, options.current.toTimeString(), suggestion);
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Generic policy violation
|
|
184
|
-
*/
|
|
185
|
-
static custom(options) {
|
|
186
|
-
return new PolicyDenied(options.rule, options.allowed, options.requested, options.suggestion);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
exports.Guardrails = Guardrails;
|
|
190
|
-
/**
|
|
191
|
-
* Helper: Extract actionable suggestion from AgentError details
|
|
192
|
-
*
|
|
193
|
-
* Used by agent.call() to convert PolicyViolationDetails into PolicyDenied
|
|
194
|
-
*/
|
|
195
|
-
function extractSuggestion(details) {
|
|
196
|
-
return details.fix ?? 'Contact administrator to update policy';
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Helper: Convert PolicyViolationDetails to PolicyDenied
|
|
200
|
-
*/
|
|
201
|
-
function toPolicyDenied(details) {
|
|
202
|
-
let rule;
|
|
203
|
-
switch (details.constraint) {
|
|
204
|
-
case 'amountPerTxn':
|
|
205
|
-
rule = 'maxAmount';
|
|
206
|
-
break;
|
|
207
|
-
case 'dailyAmount':
|
|
208
|
-
rule = 'dailyAmount';
|
|
209
|
-
break;
|
|
210
|
-
case 'callsPerMinute':
|
|
211
|
-
rule = 'callsPerMinute';
|
|
212
|
-
break;
|
|
213
|
-
case 'scope':
|
|
214
|
-
rule = 'allowedScopes';
|
|
215
|
-
break;
|
|
216
|
-
case 'tool':
|
|
217
|
-
rule = 'allowedTools';
|
|
218
|
-
break;
|
|
219
|
-
default:
|
|
220
|
-
rule = String(details.constraint);
|
|
221
|
-
}
|
|
222
|
-
return new PolicyDenied(rule, details.allowed, details.requested, details.fix, details);
|
|
223
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Guardrails=exports.PolicyDenied=void 0,exports.extractSuggestion=extractSuggestion,exports.toPolicyDenied=toPolicyDenied;class PolicyDenied extends Error{rule;allowed;requested;suggestion;details;constructor(e,t,o,i,l){super(`Policy violation: ${e}`),this.rule=e,this.allowed=t,this.requested=o,this.suggestion=i,this.details=l,this.name="PolicyDenied"}toAgentFormat(){return[`POLICY_VIOLATION: ${this.rule}`,`REQUESTED: ${JSON.stringify(this.requested)}`,`ALLOWED: ${JSON.stringify(this.allowed)}`,`SUGGESTION: ${this.suggestion}`].join("\n")}toUserFormat(){return[`❌ Policy Violation: ${this.rule}`,"",`You requested: ${this.formatValue(this.requested)}`,`Policy allows: ${this.formatValue(this.allowed)}`,"",`💡 Suggestion: ${this.suggestion}`].join("\n")}toLogFormat(){return{error:"PolicyDenied",rule:this.rule,allowed:this.allowed,requested:this.requested,suggestion:this.suggestion,details:this.details,timestamp:(new Date).toISOString()}}formatValue(e){return"number"==typeof e?this.rule.includes("amount")||this.rule.includes("Amount")?`$${e.toLocaleString()}`:e.toLocaleString():Array.isArray(e)?e.map(e=>`"${String(e)}"`).join(", "):JSON.stringify(e)}}exports.PolicyDenied=PolicyDenied;class Guardrails{static amountExceeded(e){let t,o;switch(e.type){case"per-transaction":t="maxAmount",o=`Reduce amount to $${e.limit.toLocaleString()} or request policy update from admin`;break;case"daily":t="dailyAmount",o=`Reduce amount to stay within daily limit of $${e.limit.toLocaleString()}, or wait until tomorrow`;break;case"monthly":t="monthlyAmount",o=`Reduce amount to stay within monthly limit of $${e.limit.toLocaleString()}, or wait until next month`}return new PolicyDenied(t,e.limit,e.requested,o)}static rateLimitExceeded(e){const t=e.windowMs/1e3,o=t>=60?`Wait ${Math.ceil(t/60)} minutes before making additional calls`:`Wait ${t} seconds before making additional calls`;return new PolicyDenied("callsPerMinute",e.limit,e.current+1,o)}static toolDenied(e){const[t]=e.tool.split(":"),o=0===e.allowed.length?`No tools are currently allowed. Request approval from admin to enable "${e.tool}"`:`Request approval from admin to add "${e.tool}" or "${t}:*" to allowed tools`;return new PolicyDenied("allowedTools",e.allowed,e.tool,o)}static scopeDenied(e){const t=0===e.allowed.length?`No scopes are currently allowed. Request approval from admin to enable "${e.scope}"`:`Request approval from admin to add "${e.scope}" to allowed scopes`;return new PolicyDenied("allowedScopes",e.allowed,e.scope,t)}static fieldDenied(e){const t=`Field "${e.field}" is restricted. Contact admin to update policy.fieldFilters for "${e.tool}"`;return new PolicyDenied("fieldFilters",e.allowed,e.field,t)}static timeWindowDenied(e){const t=`Actions are only allowed between ${e.allowedStart} and ${e.allowedEnd}. Current time is ${e.current.toTimeString()}`;return new PolicyDenied("timeWindow",`${e.allowedStart} - ${e.allowedEnd}`,e.current.toTimeString(),t)}static custom(e){return new PolicyDenied(e.rule,e.allowed,e.requested,e.suggestion)}}function extractSuggestion(e){return e.fix??"Contact administrator to update policy"}function toPolicyDenied(e){let t;switch(e.constraint){case"amountPerTxn":t="maxAmount";break;case"dailyAmount":t="dailyAmount";break;case"callsPerMinute":t="callsPerMinute";break;case"scope":t="allowedScopes";break;case"tool":t="allowedTools";break;default:t=String(e.constraint)}return new PolicyDenied(t,e.allowed,e.requested,e.fix,e)}exports.Guardrails=Guardrails;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.createHealthChecker=createHealthChecker,exports.healthEndpoint=healthEndpoint;class HealthCheckerImpl{startTime;registry;transport;serviceName;version;environment;timeoutMs;enableStartupProbe;startupComplete=!1;constructor(t={}){this.startTime=Date.now(),this.registry=t.registry,this.transport=t.transport,this.serviceName=t.serviceName,this.version=t.version,this.environment=t.environment,this.timeoutMs=t.timeoutMs??5e3,this.enableStartupProbe=t.enableStartupProbe??!0}markStartupComplete(){this.startupComplete=!0}isStartupComplete(){return this.startupComplete}async check(t="readiness"){const e=(new Date).toISOString(),s=Math.floor((Date.now()-this.startTime)/1e3);if("startup"===t&&this.enableStartupProbe){const t=[{name:"startup",status:this.startupComplete?"healthy":"unhealthy",message:this.startupComplete?"Initialization complete":"Waiting for startup completion (call markStartupComplete())",lastCheck:e}];return{healthy:this.startupComplete,timestamp:e,uptimeSeconds:s,components:t,metadata:this.buildMetadata()}}if("liveness"===t){return{healthy:!0,timestamp:e,uptimeSeconds:s,components:[{name:"self",status:"healthy",message:"Service responsive",lastCheck:e}],metadata:this.buildMetadata()}}const a=[];if(this.registry){const t=await this.checkRegistry();a.push(t)}if(this.transport){const t=await this.checkTransport();a.push(t)}0===a.length&&a.push({name:"self",status:"healthy",message:"No dependencies configured",lastCheck:e});return{healthy:a.every(t=>"healthy"===t.status),timestamp:e,uptimeSeconds:s,components:a,metadata:this.buildMetadata()}}buildMetadata(){const t={};return this.serviceName&&(t.service=this.serviceName),this.version&&(t.version=this.version),this.environment&&(t.environment=this.environment),Object.keys(t).length>0?t:void 0}async checkRegistry(){const t=Date.now(),e=(new Date).toISOString();try{if(!this.registry)return{name:"registry",status:"unhealthy",message:"Registry not configured",lastCheck:e};const s=await this.withTimeout(this.registry.resolve("did:xail:health_check_probe"),this.timeoutMs),a=Date.now()-t;if(s&&"object"==typeof s&&"ok"in s){if(s.ok)return{name:"registry",status:"healthy",message:"Registry responding",latencyMs:a,lastCheck:e};{const t="string"==typeof s.error?s.error:"UNKNOWN";return t.includes("NOT_FOUND")?{name:"registry",status:"healthy",message:"Registry responding",latencyMs:a,lastCheck:e}:{name:"registry",status:"unhealthy",message:`Registry error: ${t}`,latencyMs:a,lastCheck:e}}}return{name:"registry",status:"healthy",message:"Registry responding",latencyMs:a,lastCheck:e}}catch(s){const a=Date.now()-t,r=s instanceof Error?s.message:"Unknown error";return r.toLowerCase().includes("timeout")?{name:"registry",status:"degraded",message:`Registry slow (>${this.timeoutMs}ms)`,latencyMs:a,lastCheck:e}:{name:"registry",status:"unhealthy",message:`Registry error: ${r}`,latencyMs:a,lastCheck:e}}}async checkTransport(){const t=Date.now(),e=(new Date).toISOString();try{if(!this.transport)return{name:"transport",status:"unhealthy",message:"Transport not configured",lastCheck:e};return{name:"transport",status:"healthy",message:"Transport adapter available",latencyMs:Date.now()-t,lastCheck:e}}catch(s){const a=Date.now()-t;return{name:"transport",status:"unhealthy",message:`Transport error: ${s instanceof Error?s.message:"Unknown error"}`,latencyMs:a,lastCheck:e}}}async withTimeout(t,e){return Promise.race([t,new Promise((t,s)=>setTimeout(()=>s(new Error("Health check timeout")),e))])}}function createHealthChecker(t){return new HealthCheckerImpl(t)}function healthEndpoint(t,e="readiness"){return async(s,a)=>{try{const s=await t.check(e),r=s.healthy?200:503;a.status(r).json(s)}catch(t){const e=t instanceof Error?t.message:"Unknown error";a.status(503).json({healthy:!1,timestamp:(new Date).toISOString(),uptimeSeconds:0,components:[{name:"health-check",status:"unhealthy",message:`Health check failed: ${e}`,lastCheck:(new Date).toISOString()}]})}}}
|