@tangle-network/agent-core 0.13.2 → 0.13.3

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 (78) hide show
  1. package/dist/auth/browser.d.ts +1 -1
  2. package/dist/auth/browser.js +1 -2
  3. package/dist/auth/index.d.ts +1 -7
  4. package/dist/auth/index.d.ts.map +1 -1
  5. package/dist/auth/index.js +4 -7
  6. package/dist/auth/index.js.map +1 -1
  7. package/dist/computer-use/index.d.ts +0 -6
  8. package/dist/computer-use/index.d.ts.map +1 -1
  9. package/dist/computer-use/index.js +3 -6
  10. package/dist/computer-use/index.js.map +1 -1
  11. package/dist/{errors-GuWACHTg.js → errors-B5KiSXnw.js} +2 -3
  12. package/dist/{errors-GuWACHTg.js.map → errors-B5KiSXnw.js.map} +1 -1
  13. package/dist/events/index.d.ts +1 -1
  14. package/dist/events/index.js +1 -2
  15. package/dist/{events-U7kxNUpM.js → events-C2vdiRD_.js} +4 -7
  16. package/dist/{events-U7kxNUpM.js.map → events-C2vdiRD_.js.map} +1 -1
  17. package/dist/{index-68is3nof.d.ts → index-AEKS1kB8.d.ts} +1 -9
  18. package/dist/index-AEKS1kB8.d.ts.map +1 -0
  19. package/dist/{index-Dq6SfGaX.d.ts → index-CevHCod7.d.ts} +1 -9
  20. package/dist/index-CevHCod7.d.ts.map +1 -0
  21. package/dist/{index-CKDeaS7l.d.ts → index-DWPciD1S.d.ts} +2 -8
  22. package/dist/index-DWPciD1S.d.ts.map +1 -0
  23. package/dist/{index-BFYASYJk.d.ts → index-DwvNnL6X.d.ts} +1 -3
  24. package/dist/index-DwvNnL6X.d.ts.map +1 -0
  25. package/dist/{index-CuBvSsBf.d.ts → index-OCnM4OoP.d.ts} +1 -7
  26. package/dist/index-OCnM4OoP.d.ts.map +1 -0
  27. package/dist/{index-CQPGv8jg.d.ts → index-v0euJYbX.d.ts} +10 -12
  28. package/dist/index-v0euJYbX.d.ts.map +1 -0
  29. package/dist/index.d.ts +7 -23
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +15 -23
  32. package/dist/index.js.map +1 -1
  33. package/dist/interactions/index.d.ts +1 -3
  34. package/dist/interactions/index.d.ts.map +1 -1
  35. package/dist/interactions/index.js +4 -7
  36. package/dist/interactions/index.js.map +1 -1
  37. package/dist/interactions/mcp-server.d.ts +1 -3
  38. package/dist/interactions/mcp-server.d.ts.map +1 -1
  39. package/dist/interactions/mcp-server.js +2 -3
  40. package/dist/{lifecycle-BljLcnY5.js → lifecycle-wjO8lqUZ.js} +2 -3
  41. package/dist/{lifecycle-BljLcnY5.js.map → lifecycle-wjO8lqUZ.js.map} +1 -1
  42. package/dist/node/index.d.ts +0 -2
  43. package/dist/node/index.d.ts.map +1 -1
  44. package/dist/node/index.js +1 -2
  45. package/dist/resilience/index.d.ts +1 -1
  46. package/dist/resilience/index.js +1 -2
  47. package/dist/{resilience-Cv5tqIDU.js → resilience-Bb1XDoKt.js} +5 -8
  48. package/dist/{resilience-Cv5tqIDU.js.map → resilience-Bb1XDoKt.js.map} +1 -1
  49. package/dist/sse/index.d.ts +0 -2
  50. package/dist/sse/index.d.ts.map +1 -1
  51. package/dist/sse/index.js +1 -2
  52. package/dist/telemetry/index.d.ts +1 -1
  53. package/dist/telemetry/index.js +1 -2
  54. package/dist/{telemetry--KwUEdTv.js → telemetry-CF4pOM9u.js} +5 -9
  55. package/dist/{telemetry--KwUEdTv.js.map → telemetry-CF4pOM9u.js.map} +1 -1
  56. package/dist/{tokens-browser-DCV3-WHc.d.ts → tokens-browser-CGLWUfZ7.d.ts} +5 -11
  57. package/dist/tokens-browser-CGLWUfZ7.d.ts.map +1 -0
  58. package/dist/{tools-DeZkIW3h.d.ts → tools-C3tUmLEu.d.ts} +1 -5
  59. package/dist/tools-C3tUmLEu.d.ts.map +1 -0
  60. package/dist/transport/index.d.ts +1 -1
  61. package/dist/transport/index.js +1 -2
  62. package/dist/{transport-DAfw3oL0.js → transport-BqEVpHWb.js} +5 -9
  63. package/dist/{transport-DAfw3oL0.js.map → transport-BqEVpHWb.js.map} +1 -1
  64. package/dist/types/index.d.ts +1 -1
  65. package/dist/types/index.js +1 -2
  66. package/dist/{types--u-Om3vE.js → types-BKMl10eN.js} +5 -8
  67. package/dist/{types--u-Om3vE.js.map → types-BKMl10eN.js.map} +1 -1
  68. package/dist/{types-DVN5qATk.js → types-UwiuyvMA.js} +2 -3
  69. package/dist/{types-DVN5qATk.js.map → types-UwiuyvMA.js.map} +1 -1
  70. package/package.json +9 -9
  71. package/dist/index-68is3nof.d.ts.map +0 -1
  72. package/dist/index-BFYASYJk.d.ts.map +0 -1
  73. package/dist/index-CKDeaS7l.d.ts.map +0 -1
  74. package/dist/index-CQPGv8jg.d.ts.map +0 -1
  75. package/dist/index-CuBvSsBf.d.ts.map +0 -1
  76. package/dist/index-Dq6SfGaX.d.ts.map +0 -1
  77. package/dist/tokens-browser-DCV3-WHc.d.ts.map +0 -1
  78. package/dist/tools-DeZkIW3h.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"transport-DAfw3oL0.js","names":[],"sources":["../src/transport/types.ts","../src/transport/connection-manager.ts","../src/transport/interface.ts","../src/transport/mock.ts"],"sourcesContent":["/**\n * Transport Types\n *\n * Core type definitions for the transport layer abstraction.\n */\n\n/** Connection lifecycle states */\nexport type ConnectionState =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"reconnecting\"\n | \"failed\";\n\n/** Connection quality levels for monitoring */\nexport type ConnectionQuality = \"excellent\" | \"good\" | \"degraded\" | \"poor\";\n\n/**\n * Transport mode for event delivery.\n *\n * - 'websocket': WebSocket via SessionGatewayClient (default, traditional server)\n * - 'sse': HTTP SSE (serverless/Cloudflare Workers)\n */\nexport type TransportMode = \"websocket\" | \"sse\";\n\n/** SSE event from server */\nexport interface SSEEvent {\n id?: string;\n event?: string;\n data: string;\n retry?: number;\n}\n\n/** Request options for HTTP calls */\nexport interface RequestOptions {\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n path: string;\n body?: unknown;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n timeout?: number;\n}\n\n/** Stream subscription options */\nexport interface StreamOptions {\n /** HTTP method (default: GET, use POST for streaming endpoints that accept a body) */\n method?: \"GET\" | \"POST\";\n path: string;\n /** Request body (for POST requests) */\n body?: unknown;\n headers?: Record<string, string>;\n /** Last event ID for resumption */\n lastEventId?: string;\n /** Reconnection configuration */\n reconnect?: ReconnectionConfig;\n /** Abort signal */\n signal?: AbortSignal;\n}\n\n/** Reconnection configuration with exponential backoff */\nexport interface ReconnectionConfig {\n /** Initial delay in milliseconds (default: 1000) */\n initialDelayMs?: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs?: number;\n /** Backoff multiplier (default: 1.5) */\n multiplier?: number;\n /** Jitter factor 0-1 (default: 0.2) */\n jitter?: number;\n /** Maximum reconnection attempts (default: 10, -1 for infinite) */\n maxAttempts?: number;\n}\n\n/** Default reconnection config */\nexport const DEFAULT_RECONNECTION_CONFIG: Required<ReconnectionConfig> = {\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n multiplier: 1.5,\n jitter: 0.2,\n maxAttempts: 10,\n};\n\n/** Transport quality metrics */\nexport interface TransportMetrics {\n /** Total requests made */\n requestCount: number;\n /** Failed requests */\n failedRequests: number;\n /** Average latency in ms */\n avgLatencyMs: number;\n /** Current reconnection attempt (0 if connected) */\n reconnectionAttempt: number;\n /** Total reconnection attempts since start */\n totalReconnections: number;\n /** Missed heartbeats in current connection */\n missedHeartbeats: number;\n /** Last successful request timestamp */\n lastRequestAt?: number;\n /** Connection uptime in ms */\n uptimeMs: number;\n}\n\n/** Transport event types */\nexport interface TransportEvents {\n /** Connection state changed */\n stateChange: (state: ConnectionState) => void;\n /** Error occurred */\n error: (error: Error) => void;\n /** Reconnecting with attempt count */\n reconnecting: (attempt: number, maxAttempts: number) => void;\n /** Successfully reconnected */\n reconnected: () => void;\n /** Quality changed */\n qualityChange: (quality: ConnectionQuality) => void;\n /** Heartbeat received */\n heartbeat: (timestamp: number) => void;\n}\n\n/** Base transport configuration */\nexport interface TransportConfig {\n /** Base URL for requests */\n baseUrl: string;\n /** Default headers for all requests */\n headers?: Record<string, string>;\n /** Request timeout in ms (default: 30000) */\n timeout?: number;\n /** Heartbeat interval in ms for quality monitoring (default: 30000) */\n heartbeatIntervalMs?: number;\n /** Enable automatic reconnection (default: true) */\n autoReconnect?: boolean;\n /** Reconnection config */\n reconnection?: ReconnectionConfig;\n}\n\n/** Subscription state */\nexport type SubscriptionState = \"active\" | \"paused\" | \"closed\";\n","/**\n * Connection Manager\n *\n * Manages reconnection logic with exponential backoff and jitter.\n */\n\nimport {\n DEFAULT_RECONNECTION_CONFIG,\n type ReconnectionConfig,\n} from \"./types.js\";\n\nexport interface ConnectionManagerConfig extends ReconnectionConfig {\n onReconnecting?: (attempt: number, maxAttempts: number) => void;\n onReconnected?: () => void;\n onFailed?: (error: Error) => void;\n}\n\nexport class ConnectionManager {\n private readonly config: Required<ReconnectionConfig>;\n private attempt = 0;\n private aborted = false;\n private readonly callbacks: {\n onReconnecting?: (attempt: number, maxAttempts: number) => void;\n onReconnected?: () => void;\n onFailed?: (error: Error) => void;\n };\n\n constructor(config: ConnectionManagerConfig = {}) {\n this.config = {\n initialDelayMs:\n config.initialDelayMs ?? DEFAULT_RECONNECTION_CONFIG.initialDelayMs,\n maxDelayMs: config.maxDelayMs ?? DEFAULT_RECONNECTION_CONFIG.maxDelayMs,\n multiplier: config.multiplier ?? DEFAULT_RECONNECTION_CONFIG.multiplier,\n jitter: config.jitter ?? DEFAULT_RECONNECTION_CONFIG.jitter,\n maxAttempts:\n config.maxAttempts ?? DEFAULT_RECONNECTION_CONFIG.maxAttempts,\n };\n this.callbacks = {\n onReconnecting: config.onReconnecting,\n onReconnected: config.onReconnected,\n onFailed: config.onFailed,\n };\n }\n\n /**\n * Calculate delay for current attempt with exponential backoff and jitter.\n */\n private calculateDelay(): number {\n const exponentialDelay =\n this.config.initialDelayMs * this.config.multiplier ** (this.attempt - 1);\n const cappedDelay = Math.min(exponentialDelay, this.config.maxDelayMs);\n const jitterRange = cappedDelay * this.config.jitter;\n const jitter = (Math.random() - 0.5) * 2 * jitterRange;\n return Math.max(0, cappedDelay + jitter);\n }\n\n /**\n * Wait for the calculated delay.\n */\n private async wait(): Promise<void> {\n const delay = this.calculateDelay();\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n /**\n * Check if more reconnection attempts are allowed.\n */\n canRetry(): boolean {\n if (this.aborted) return false;\n if (this.config.maxAttempts === -1) return true;\n return this.attempt < this.config.maxAttempts;\n }\n\n /**\n * Get current attempt number.\n */\n getAttempt(): number {\n return this.attempt;\n }\n\n /**\n * Reset the connection manager state.\n */\n reset(): void {\n this.attempt = 0;\n this.aborted = false;\n }\n\n /**\n * Abort any pending reconnection attempts.\n */\n abort(): void {\n this.aborted = true;\n }\n\n /**\n * Execute a reconnection attempt with the provided connect function.\n * Returns true if connection succeeded, false if should retry.\n */\n async reconnect(connectFn: () => Promise<void>): Promise<boolean> {\n if (!this.canRetry()) {\n const error = new Error(\n `Max reconnection attempts (${this.config.maxAttempts}) exceeded`,\n );\n this.callbacks.onFailed?.(error);\n return false;\n }\n\n this.attempt++;\n this.callbacks.onReconnecting?.(this.attempt, this.config.maxAttempts);\n\n await this.wait();\n\n if (this.aborted) {\n return false;\n }\n\n try {\n await connectFn();\n this.callbacks.onReconnected?.();\n this.reset();\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Run reconnection loop until success or max attempts.\n */\n async runReconnectionLoop(connectFn: () => Promise<void>): Promise<boolean> {\n while (this.canRetry()) {\n const success = await this.reconnect(connectFn);\n if (success) {\n return true;\n }\n }\n return false;\n }\n}\n","/**\n * Transport Adapter Interface\n *\n * The central abstraction for all transport implementations.\n * Provides HTTP requests and SSE stream subscriptions through a common API.\n */\n\nimport type {\n ConnectionQuality,\n ConnectionState,\n RequestOptions,\n SSEEvent,\n StreamOptions,\n SubscriptionState,\n TransportConfig,\n TransportEvents,\n TransportMetrics,\n} from \"./types.js\";\n\n/**\n * SSE Subscription handle for consuming server-sent events.\n * Supports pause/resume, async iteration, and event callbacks.\n */\nexport interface Subscription {\n /** Unique identifier for this subscription */\n readonly streamId: string;\n\n /** Current subscription state */\n readonly state: SubscriptionState;\n\n /** Pause event processing (events may still be buffered) */\n pause(): void;\n\n /** Resume event processing */\n resume(): void;\n\n /** Close the subscription and release resources */\n close(): void;\n\n /** Register callback for each event */\n onEvent(callback: (event: SSEEvent) => void): () => void;\n\n /** Register callback for errors */\n onError(callback: (error: Error) => void): () => void;\n\n /** Register callback for reconnection attempts */\n onReconnect(callback: (lastEventId: string | undefined) => void): () => void;\n\n /** Async iterator for event consumption */\n [Symbol.asyncIterator](): AsyncIterator<SSEEvent>;\n}\n\n/**\n * Transport Adapter - core abstraction for network communication.\n *\n * Implementations provide HTTP request/response and SSE streaming\n * with connection management, reconnection, and quality monitoring.\n */\nexport interface TransportAdapter {\n /** Current connection state */\n readonly state: ConnectionState;\n\n /** Connect to the server */\n connect(): Promise<void>;\n\n /** Disconnect from the server */\n disconnect(): Promise<void>;\n\n /** Check if currently connected */\n isConnected(): boolean;\n\n /**\n * Make an HTTP request.\n * Routes through the transport layer for connection management.\n */\n request<T>(options: RequestOptions): Promise<T>;\n\n /**\n * Subscribe to an SSE stream.\n * Handles reconnection and Last-Event-ID resumption.\n */\n subscribe(options: StreamOptions): Subscription;\n\n /** Register event listener, returns unsubscribe function */\n on<K extends keyof TransportEvents>(\n event: K,\n listener: TransportEvents[K],\n ): () => void;\n\n /** Get current transport metrics */\n getMetrics(): TransportMetrics;\n\n /** Get current connection quality */\n getQuality(): ConnectionQuality;\n}\n\n/**\n * Base class for transport adapters with shared functionality.\n * Handles event emission, metrics tracking, and connection state.\n */\nexport abstract class BaseTransportAdapter implements TransportAdapter {\n protected _state: ConnectionState = \"disconnected\";\n protected _quality: ConnectionQuality = \"excellent\";\n protected readonly config: Required<TransportConfig>;\n protected readonly listeners: Map<\n keyof TransportEvents,\n Set<(...args: never[]) => unknown>\n > = new Map();\n protected metrics: TransportMetrics = {\n requestCount: 0,\n failedRequests: 0,\n avgLatencyMs: 0,\n reconnectionAttempt: 0,\n totalReconnections: 0,\n missedHeartbeats: 0,\n uptimeMs: 0,\n };\n protected connectionStartTime?: number;\n private latencySum = 0;\n\n constructor(config: TransportConfig) {\n this.config = {\n baseUrl: config.baseUrl.replace(/\\/$/, \"\"),\n headers: config.headers ?? {},\n timeout: config.timeout ?? 30000,\n heartbeatIntervalMs: config.heartbeatIntervalMs ?? 30000,\n autoReconnect: config.autoReconnect ?? true,\n reconnection: {\n initialDelayMs: config.reconnection?.initialDelayMs ?? 1000,\n maxDelayMs: config.reconnection?.maxDelayMs ?? 30000,\n multiplier: config.reconnection?.multiplier ?? 1.5,\n jitter: config.reconnection?.jitter ?? 0.2,\n maxAttempts: config.reconnection?.maxAttempts ?? 10,\n },\n };\n }\n\n get state(): ConnectionState {\n return this._state;\n }\n\n abstract connect(): Promise<void>;\n abstract disconnect(): Promise<void>;\n abstract request<T>(options: RequestOptions): Promise<T>;\n abstract subscribe(options: StreamOptions): Subscription;\n\n isConnected(): boolean {\n return this._state === \"connected\";\n }\n\n on<K extends keyof TransportEvents>(\n event: K,\n listener: TransportEvents[K],\n ): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)?.add(listener);\n return () => this.listeners.get(event)?.delete(listener);\n }\n\n getMetrics(): TransportMetrics {\n return {\n ...this.metrics,\n uptimeMs: this.connectionStartTime\n ? Date.now() - this.connectionStartTime\n : 0,\n };\n }\n\n getQuality(): ConnectionQuality {\n return this._quality;\n }\n\n protected emit<K extends keyof TransportEvents>(\n event: K,\n ...args: Parameters<TransportEvents[K]>\n ): void {\n const listeners = this.listeners.get(event);\n if (listeners) {\n for (const listener of listeners) {\n try {\n (listener as (...args: unknown[]) => void)(...args);\n } catch (e) {\n console.error(`Error in ${event} listener:`, e);\n }\n }\n }\n }\n\n protected setState(state: ConnectionState): void {\n if (this._state !== state) {\n this._state = state;\n if (state === \"connected\") {\n this.connectionStartTime = Date.now();\n this.metrics.reconnectionAttempt = 0;\n }\n this.emit(\"stateChange\", state);\n }\n }\n\n protected setQuality(quality: ConnectionQuality): void {\n if (this._quality !== quality) {\n this._quality = quality;\n this.emit(\"qualityChange\", quality);\n }\n }\n\n protected recordRequest(durationMs: number, failed: boolean): void {\n this.metrics.requestCount++;\n if (failed) {\n this.metrics.failedRequests++;\n }\n this.latencySum += durationMs;\n this.metrics.avgLatencyMs = this.latencySum / this.metrics.requestCount;\n this.metrics.lastRequestAt = Date.now();\n this.updateQuality();\n }\n\n protected recordReconnection(): void {\n this.metrics.totalReconnections++;\n this.emit(\"reconnected\");\n }\n\n protected recordMissedHeartbeat(): void {\n this.metrics.missedHeartbeats++;\n this.updateQuality();\n }\n\n protected resetHeartbeatCounter(): void {\n this.metrics.missedHeartbeats = 0;\n this.updateQuality();\n }\n\n private updateQuality(): void {\n const failRate =\n this.metrics.requestCount > 0\n ? this.metrics.failedRequests / this.metrics.requestCount\n : 0;\n\n let quality: ConnectionQuality;\n if (\n this.metrics.missedHeartbeats >= 3 ||\n failRate > 0.5 ||\n this.metrics.avgLatencyMs > 5000\n ) {\n quality = \"poor\";\n } else if (\n this.metrics.missedHeartbeats >= 2 ||\n failRate > 0.2 ||\n this.metrics.avgLatencyMs > 2000\n ) {\n quality = \"degraded\";\n } else if (\n this.metrics.missedHeartbeats >= 1 ||\n failRate > 0.1 ||\n this.metrics.avgLatencyMs > 1000\n ) {\n quality = \"good\";\n } else {\n quality = \"excellent\";\n }\n\n this.setQuality(quality);\n }\n\n protected buildUrl(path: string): string {\n const cleanPath = path.startsWith(\"/\") ? path : `/${path}`;\n return `${this.config.baseUrl}${cleanPath}`;\n }\n\n protected buildHeaders(\n extra?: Record<string, string>,\n ): Record<string, string> {\n return {\n ...this.config.headers,\n ...extra,\n };\n }\n}\n","/**\n * Mock Transport Adapter\n *\n * A fully controllable transport adapter for testing.\n * Allows mocking responses, simulating streams, and verifying requests.\n */\n\nimport { BaseTransportAdapter, type Subscription } from \"./interface.js\";\nimport type {\n RequestOptions,\n SSEEvent,\n StreamOptions,\n SubscriptionState,\n TransportConfig,\n} from \"./types.js\";\n\n/** Recorded request for verification */\nexport interface RecordedRequest {\n method: string;\n path: string;\n body?: unknown;\n headers?: Record<string, string>;\n timestamp: number;\n}\n\n/** Mock response configuration */\nexport interface MockResponse<T = unknown> {\n status?: number;\n data?: T;\n error?: Error;\n delay?: number;\n}\n\n/** Mock stream event */\nexport interface MockStreamEvent {\n event?: string;\n data: string;\n id?: string;\n delay?: number;\n}\n\n/** Mock subscription for testing */\nclass MockSubscription implements Subscription {\n readonly streamId: string;\n private _state: SubscriptionState = \"active\";\n private eventCallbacks: Set<(event: SSEEvent) => void> = new Set();\n private errorCallbacks: Set<(error: Error) => void> = new Set();\n private reconnectCallbacks: Set<(lastEventId: string | undefined) => void> =\n new Set();\n private events: SSEEvent[] = [];\n private eventIndex = 0;\n private closed = false;\n\n constructor(streamId: string, events: MockStreamEvent[] = []) {\n this.streamId = streamId;\n this.events = events.map((e, i) => ({\n id: e.id ?? `mock_${i}`,\n event: e.event,\n data: e.data,\n }));\n }\n\n get state(): SubscriptionState {\n return this._state;\n }\n\n pause(): void {\n if (this._state === \"active\") {\n this._state = \"paused\";\n }\n }\n\n resume(): void {\n if (this._state === \"paused\") {\n this._state = \"active\";\n this.deliverPending();\n }\n }\n\n close(): void {\n this._state = \"closed\";\n this.closed = true;\n }\n\n onEvent(callback: (event: SSEEvent) => void): () => void {\n this.eventCallbacks.add(callback);\n return () => this.eventCallbacks.delete(callback);\n }\n\n onError(callback: (error: Error) => void): () => void {\n this.errorCallbacks.add(callback);\n return () => this.errorCallbacks.delete(callback);\n }\n\n onReconnect(callback: (lastEventId: string | undefined) => void): () => void {\n this.reconnectCallbacks.add(callback);\n return () => this.reconnectCallbacks.delete(callback);\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<SSEEvent> {\n while (!this.closed) {\n if (this.eventIndex < this.events.length) {\n if (this._state === \"active\") {\n yield this.events[this.eventIndex++];\n } else {\n await new Promise((r) => setTimeout(r, 10));\n }\n } else {\n await new Promise((r) => setTimeout(r, 10));\n }\n }\n }\n\n /** Push a new event to the stream (for testing) */\n pushEvent(event: SSEEvent): void {\n this.events.push(event);\n if (this._state === \"active\") {\n this.deliverPending();\n }\n }\n\n /** Simulate an error (for testing) */\n simulateError(error: Error): void {\n for (const cb of this.errorCallbacks) {\n cb(error);\n }\n }\n\n /** Simulate reconnection (for testing) */\n simulateReconnect(lastEventId?: string): void {\n for (const cb of this.reconnectCallbacks) {\n cb(lastEventId);\n }\n }\n\n private deliverPending(): void {\n while (this.eventIndex < this.events.length && this._state === \"active\") {\n const event = this.events[this.eventIndex++];\n for (const cb of this.eventCallbacks) {\n cb(event);\n }\n }\n }\n\n /** Start delivering events automatically */\n startDelivery(): void {\n this.deliverPending();\n }\n}\n\n/** Configuration for MockTransportAdapter */\nexport interface MockTransportConfig extends Partial<TransportConfig> {\n /** Auto-connect on creation (default: true) */\n autoConnect?: boolean;\n}\n\n/**\n * Mock transport adapter for testing.\n * Provides full control over responses and streams.\n */\nexport class MockTransportAdapter extends BaseTransportAdapter {\n private readonly responses = new Map<string, MockResponse>();\n private readonly streams = new Map<string, MockStreamEvent[]>();\n private readonly subscriptions = new Map<string, MockSubscription>();\n readonly requests: RecordedRequest[] = [];\n\n constructor(config: MockTransportConfig = {}) {\n super({\n baseUrl: config.baseUrl ?? \"http://mock\",\n headers: config.headers,\n timeout: config.timeout,\n heartbeatIntervalMs: config.heartbeatIntervalMs,\n autoReconnect: config.autoReconnect,\n reconnection: config.reconnection,\n });\n\n if (config.autoConnect !== false) {\n this.setState(\"connected\");\n }\n }\n\n async connect(): Promise<void> {\n this.setState(\"connecting\");\n this.setState(\"connected\");\n }\n\n async disconnect(): Promise<void> {\n this.setState(\"disconnected\");\n for (const sub of this.subscriptions.values()) {\n sub.close();\n }\n this.subscriptions.clear();\n }\n\n async request<T>(options: RequestOptions): Promise<T> {\n const start = Date.now();\n\n this.requests.push({\n method: options.method ?? \"GET\",\n path: options.path,\n body: options.body,\n headers: options.headers,\n timestamp: start,\n });\n\n const key = `${options.method ?? \"GET\"}:${options.path}`;\n const mock = this.responses.get(key) ?? this.responses.get(options.path);\n\n if (mock?.delay) {\n await new Promise((r) => setTimeout(r, mock.delay));\n }\n\n const duration = Date.now() - start;\n\n if (mock?.error) {\n this.recordRequest(duration, true);\n throw mock.error;\n }\n\n this.recordRequest(duration, false);\n return (mock?.data ?? {}) as T;\n }\n\n subscribe(options: StreamOptions): Subscription {\n const streamId = `mock_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const events = this.streams.get(options.path) ?? [];\n const subscription = new MockSubscription(streamId, events);\n this.subscriptions.set(streamId, subscription);\n\n // Start delivering events after a microtask\n queueMicrotask(() => subscription.startDelivery());\n\n return subscription;\n }\n\n // ========== Test Helpers ==========\n\n /** Mock a response for a specific path */\n mockResponse<T>(path: string, response: MockResponse<T>): void {\n this.responses.set(path, response);\n }\n\n /** Mock a response for a specific method and path */\n mockMethodResponse<T>(\n method: string,\n path: string,\n response: MockResponse<T>,\n ): void {\n this.responses.set(`${method}:${path}`, response);\n }\n\n /** Mock a stream with events */\n mockStream(path: string, events: MockStreamEvent[]): void {\n this.streams.set(path, events);\n }\n\n /** Get a subscription by stream ID */\n getSubscription(streamId: string): MockSubscription | undefined {\n return this.subscriptions.get(streamId);\n }\n\n /** Get all active subscriptions */\n getActiveSubscriptions(): MockSubscription[] {\n return Array.from(this.subscriptions.values()).filter(\n (s) => s.state !== \"closed\",\n );\n }\n\n /** Push an event to all subscriptions for a path */\n pushEventToPath(_path: string, event: SSEEvent): void {\n for (const sub of this.subscriptions.values()) {\n sub.pushEvent(event);\n }\n }\n\n /** Clear all recorded requests */\n clearRequests(): void {\n this.requests.length = 0;\n }\n\n /** Clear all mocked responses */\n clearMocks(): void {\n this.responses.clear();\n this.streams.clear();\n }\n\n /** Get requests matching a path pattern */\n getRequestsForPath(path: string): RecordedRequest[] {\n return this.requests.filter((r) => r.path === path);\n }\n\n /** Get the last request made */\n getLastRequest(): RecordedRequest | undefined {\n return this.requests[this.requests.length - 1];\n }\n\n /** Simulate connection failure */\n simulateDisconnect(): void {\n this.setState(\"disconnected\");\n this.emit(\"error\", new Error(\"Simulated disconnect\"));\n }\n\n /** Simulate reconnection */\n simulateReconnect(): void {\n this.setState(\"connected\");\n this.recordReconnection();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"transport-BqEVpHWb.js","names":[],"sources":["../src/transport/types.ts","../src/transport/connection-manager.ts","../src/transport/interface.ts","../src/transport/mock.ts"],"sourcesContent":["/**\n * Transport Types\n *\n * Core type definitions for the transport layer abstraction.\n */\n\n/** Connection lifecycle states */\nexport type ConnectionState =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"reconnecting\"\n | \"failed\";\n\n/** Connection quality levels for monitoring */\nexport type ConnectionQuality = \"excellent\" | \"good\" | \"degraded\" | \"poor\";\n\n/**\n * Transport mode for event delivery.\n *\n * - 'websocket': WebSocket via SessionGatewayClient (default, traditional server)\n * - 'sse': HTTP SSE (serverless/Cloudflare Workers)\n */\nexport type TransportMode = \"websocket\" | \"sse\";\n\n/** SSE event from server */\nexport interface SSEEvent {\n id?: string;\n event?: string;\n data: string;\n retry?: number;\n}\n\n/** Request options for HTTP calls */\nexport interface RequestOptions {\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n path: string;\n body?: unknown;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n timeout?: number;\n}\n\n/** Stream subscription options */\nexport interface StreamOptions {\n /** HTTP method (default: GET, use POST for streaming endpoints that accept a body) */\n method?: \"GET\" | \"POST\";\n path: string;\n /** Request body (for POST requests) */\n body?: unknown;\n headers?: Record<string, string>;\n /** Last event ID for resumption */\n lastEventId?: string;\n /** Reconnection configuration */\n reconnect?: ReconnectionConfig;\n /** Abort signal */\n signal?: AbortSignal;\n}\n\n/** Reconnection configuration with exponential backoff */\nexport interface ReconnectionConfig {\n /** Initial delay in milliseconds (default: 1000) */\n initialDelayMs?: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs?: number;\n /** Backoff multiplier (default: 1.5) */\n multiplier?: number;\n /** Jitter factor 0-1 (default: 0.2) */\n jitter?: number;\n /** Maximum reconnection attempts (default: 10, -1 for infinite) */\n maxAttempts?: number;\n}\n\n/** Default reconnection config */\nexport const DEFAULT_RECONNECTION_CONFIG: Required<ReconnectionConfig> = {\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n multiplier: 1.5,\n jitter: 0.2,\n maxAttempts: 10,\n};\n\n/** Transport quality metrics */\nexport interface TransportMetrics {\n /** Total requests made */\n requestCount: number;\n /** Failed requests */\n failedRequests: number;\n /** Average latency in ms */\n avgLatencyMs: number;\n /** Current reconnection attempt (0 if connected) */\n reconnectionAttempt: number;\n /** Total reconnection attempts since start */\n totalReconnections: number;\n /** Missed heartbeats in current connection */\n missedHeartbeats: number;\n /** Last successful request timestamp */\n lastRequestAt?: number;\n /** Connection uptime in ms */\n uptimeMs: number;\n}\n\n/** Transport event types */\nexport interface TransportEvents {\n /** Connection state changed */\n stateChange: (state: ConnectionState) => void;\n /** Error occurred */\n error: (error: Error) => void;\n /** Reconnecting with attempt count */\n reconnecting: (attempt: number, maxAttempts: number) => void;\n /** Successfully reconnected */\n reconnected: () => void;\n /** Quality changed */\n qualityChange: (quality: ConnectionQuality) => void;\n /** Heartbeat received */\n heartbeat: (timestamp: number) => void;\n}\n\n/** Base transport configuration */\nexport interface TransportConfig {\n /** Base URL for requests */\n baseUrl: string;\n /** Default headers for all requests */\n headers?: Record<string, string>;\n /** Request timeout in ms (default: 30000) */\n timeout?: number;\n /** Heartbeat interval in ms for quality monitoring (default: 30000) */\n heartbeatIntervalMs?: number;\n /** Enable automatic reconnection (default: true) */\n autoReconnect?: boolean;\n /** Reconnection config */\n reconnection?: ReconnectionConfig;\n}\n\n/** Subscription state */\nexport type SubscriptionState = \"active\" | \"paused\" | \"closed\";\n","/**\n * Connection Manager\n *\n * Manages reconnection logic with exponential backoff and jitter.\n */\n\nimport {\n DEFAULT_RECONNECTION_CONFIG,\n type ReconnectionConfig,\n} from \"./types.js\";\n\nexport interface ConnectionManagerConfig extends ReconnectionConfig {\n onReconnecting?: (attempt: number, maxAttempts: number) => void;\n onReconnected?: () => void;\n onFailed?: (error: Error) => void;\n}\n\nexport class ConnectionManager {\n private readonly config: Required<ReconnectionConfig>;\n private attempt = 0;\n private aborted = false;\n private readonly callbacks: {\n onReconnecting?: (attempt: number, maxAttempts: number) => void;\n onReconnected?: () => void;\n onFailed?: (error: Error) => void;\n };\n\n constructor(config: ConnectionManagerConfig = {}) {\n this.config = {\n initialDelayMs:\n config.initialDelayMs ?? DEFAULT_RECONNECTION_CONFIG.initialDelayMs,\n maxDelayMs: config.maxDelayMs ?? DEFAULT_RECONNECTION_CONFIG.maxDelayMs,\n multiplier: config.multiplier ?? DEFAULT_RECONNECTION_CONFIG.multiplier,\n jitter: config.jitter ?? DEFAULT_RECONNECTION_CONFIG.jitter,\n maxAttempts:\n config.maxAttempts ?? DEFAULT_RECONNECTION_CONFIG.maxAttempts,\n };\n this.callbacks = {\n onReconnecting: config.onReconnecting,\n onReconnected: config.onReconnected,\n onFailed: config.onFailed,\n };\n }\n\n /**\n * Calculate delay for current attempt with exponential backoff and jitter.\n */\n private calculateDelay(): number {\n const exponentialDelay =\n this.config.initialDelayMs * this.config.multiplier ** (this.attempt - 1);\n const cappedDelay = Math.min(exponentialDelay, this.config.maxDelayMs);\n const jitterRange = cappedDelay * this.config.jitter;\n const jitter = (Math.random() - 0.5) * 2 * jitterRange;\n return Math.max(0, cappedDelay + jitter);\n }\n\n /**\n * Wait for the calculated delay.\n */\n private async wait(): Promise<void> {\n const delay = this.calculateDelay();\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n /**\n * Check if more reconnection attempts are allowed.\n */\n canRetry(): boolean {\n if (this.aborted) return false;\n if (this.config.maxAttempts === -1) return true;\n return this.attempt < this.config.maxAttempts;\n }\n\n /**\n * Get current attempt number.\n */\n getAttempt(): number {\n return this.attempt;\n }\n\n /**\n * Reset the connection manager state.\n */\n reset(): void {\n this.attempt = 0;\n this.aborted = false;\n }\n\n /**\n * Abort any pending reconnection attempts.\n */\n abort(): void {\n this.aborted = true;\n }\n\n /**\n * Execute a reconnection attempt with the provided connect function.\n * Returns true if connection succeeded, false if should retry.\n */\n async reconnect(connectFn: () => Promise<void>): Promise<boolean> {\n if (!this.canRetry()) {\n const error = new Error(\n `Max reconnection attempts (${this.config.maxAttempts}) exceeded`,\n );\n this.callbacks.onFailed?.(error);\n return false;\n }\n\n this.attempt++;\n this.callbacks.onReconnecting?.(this.attempt, this.config.maxAttempts);\n\n await this.wait();\n\n if (this.aborted) {\n return false;\n }\n\n try {\n await connectFn();\n this.callbacks.onReconnected?.();\n this.reset();\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Run reconnection loop until success or max attempts.\n */\n async runReconnectionLoop(connectFn: () => Promise<void>): Promise<boolean> {\n while (this.canRetry()) {\n const success = await this.reconnect(connectFn);\n if (success) {\n return true;\n }\n }\n return false;\n }\n}\n","/**\n * Transport Adapter Interface\n *\n * The central abstraction for all transport implementations.\n * Provides HTTP requests and SSE stream subscriptions through a common API.\n */\n\nimport type {\n ConnectionQuality,\n ConnectionState,\n RequestOptions,\n SSEEvent,\n StreamOptions,\n SubscriptionState,\n TransportConfig,\n TransportEvents,\n TransportMetrics,\n} from \"./types.js\";\n\n/**\n * SSE Subscription handle for consuming server-sent events.\n * Supports pause/resume, async iteration, and event callbacks.\n */\nexport interface Subscription {\n /** Unique identifier for this subscription */\n readonly streamId: string;\n\n /** Current subscription state */\n readonly state: SubscriptionState;\n\n /** Pause event processing (events may still be buffered) */\n pause(): void;\n\n /** Resume event processing */\n resume(): void;\n\n /** Close the subscription and release resources */\n close(): void;\n\n /** Register callback for each event */\n onEvent(callback: (event: SSEEvent) => void): () => void;\n\n /** Register callback for errors */\n onError(callback: (error: Error) => void): () => void;\n\n /** Register callback for reconnection attempts */\n onReconnect(callback: (lastEventId: string | undefined) => void): () => void;\n\n /** Async iterator for event consumption */\n [Symbol.asyncIterator](): AsyncIterator<SSEEvent>;\n}\n\n/**\n * Transport Adapter - core abstraction for network communication.\n *\n * Implementations provide HTTP request/response and SSE streaming\n * with connection management, reconnection, and quality monitoring.\n */\nexport interface TransportAdapter {\n /** Current connection state */\n readonly state: ConnectionState;\n\n /** Connect to the server */\n connect(): Promise<void>;\n\n /** Disconnect from the server */\n disconnect(): Promise<void>;\n\n /** Check if currently connected */\n isConnected(): boolean;\n\n /**\n * Make an HTTP request.\n * Routes through the transport layer for connection management.\n */\n request<T>(options: RequestOptions): Promise<T>;\n\n /**\n * Subscribe to an SSE stream.\n * Handles reconnection and Last-Event-ID resumption.\n */\n subscribe(options: StreamOptions): Subscription;\n\n /** Register event listener, returns unsubscribe function */\n on<K extends keyof TransportEvents>(\n event: K,\n listener: TransportEvents[K],\n ): () => void;\n\n /** Get current transport metrics */\n getMetrics(): TransportMetrics;\n\n /** Get current connection quality */\n getQuality(): ConnectionQuality;\n}\n\n/**\n * Base class for transport adapters with shared functionality.\n * Handles event emission, metrics tracking, and connection state.\n */\nexport abstract class BaseTransportAdapter implements TransportAdapter {\n protected _state: ConnectionState = \"disconnected\";\n protected _quality: ConnectionQuality = \"excellent\";\n protected readonly config: Required<TransportConfig>;\n protected readonly listeners: Map<\n keyof TransportEvents,\n Set<(...args: never[]) => unknown>\n > = new Map();\n protected metrics: TransportMetrics = {\n requestCount: 0,\n failedRequests: 0,\n avgLatencyMs: 0,\n reconnectionAttempt: 0,\n totalReconnections: 0,\n missedHeartbeats: 0,\n uptimeMs: 0,\n };\n protected connectionStartTime?: number;\n private latencySum = 0;\n\n constructor(config: TransportConfig) {\n this.config = {\n baseUrl: config.baseUrl.replace(/\\/$/, \"\"),\n headers: config.headers ?? {},\n timeout: config.timeout ?? 30000,\n heartbeatIntervalMs: config.heartbeatIntervalMs ?? 30000,\n autoReconnect: config.autoReconnect ?? true,\n reconnection: {\n initialDelayMs: config.reconnection?.initialDelayMs ?? 1000,\n maxDelayMs: config.reconnection?.maxDelayMs ?? 30000,\n multiplier: config.reconnection?.multiplier ?? 1.5,\n jitter: config.reconnection?.jitter ?? 0.2,\n maxAttempts: config.reconnection?.maxAttempts ?? 10,\n },\n };\n }\n\n get state(): ConnectionState {\n return this._state;\n }\n\n abstract connect(): Promise<void>;\n abstract disconnect(): Promise<void>;\n abstract request<T>(options: RequestOptions): Promise<T>;\n abstract subscribe(options: StreamOptions): Subscription;\n\n isConnected(): boolean {\n return this._state === \"connected\";\n }\n\n on<K extends keyof TransportEvents>(\n event: K,\n listener: TransportEvents[K],\n ): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)?.add(listener);\n return () => this.listeners.get(event)?.delete(listener);\n }\n\n getMetrics(): TransportMetrics {\n return {\n ...this.metrics,\n uptimeMs: this.connectionStartTime\n ? Date.now() - this.connectionStartTime\n : 0,\n };\n }\n\n getQuality(): ConnectionQuality {\n return this._quality;\n }\n\n protected emit<K extends keyof TransportEvents>(\n event: K,\n ...args: Parameters<TransportEvents[K]>\n ): void {\n const listeners = this.listeners.get(event);\n if (listeners) {\n for (const listener of listeners) {\n try {\n (listener as (...args: unknown[]) => void)(...args);\n } catch (e) {\n console.error(`Error in ${event} listener:`, e);\n }\n }\n }\n }\n\n protected setState(state: ConnectionState): void {\n if (this._state !== state) {\n this._state = state;\n if (state === \"connected\") {\n this.connectionStartTime = Date.now();\n this.metrics.reconnectionAttempt = 0;\n }\n this.emit(\"stateChange\", state);\n }\n }\n\n protected setQuality(quality: ConnectionQuality): void {\n if (this._quality !== quality) {\n this._quality = quality;\n this.emit(\"qualityChange\", quality);\n }\n }\n\n protected recordRequest(durationMs: number, failed: boolean): void {\n this.metrics.requestCount++;\n if (failed) {\n this.metrics.failedRequests++;\n }\n this.latencySum += durationMs;\n this.metrics.avgLatencyMs = this.latencySum / this.metrics.requestCount;\n this.metrics.lastRequestAt = Date.now();\n this.updateQuality();\n }\n\n protected recordReconnection(): void {\n this.metrics.totalReconnections++;\n this.emit(\"reconnected\");\n }\n\n protected recordMissedHeartbeat(): void {\n this.metrics.missedHeartbeats++;\n this.updateQuality();\n }\n\n protected resetHeartbeatCounter(): void {\n this.metrics.missedHeartbeats = 0;\n this.updateQuality();\n }\n\n private updateQuality(): void {\n const failRate =\n this.metrics.requestCount > 0\n ? this.metrics.failedRequests / this.metrics.requestCount\n : 0;\n\n let quality: ConnectionQuality;\n if (\n this.metrics.missedHeartbeats >= 3 ||\n failRate > 0.5 ||\n this.metrics.avgLatencyMs > 5000\n ) {\n quality = \"poor\";\n } else if (\n this.metrics.missedHeartbeats >= 2 ||\n failRate > 0.2 ||\n this.metrics.avgLatencyMs > 2000\n ) {\n quality = \"degraded\";\n } else if (\n this.metrics.missedHeartbeats >= 1 ||\n failRate > 0.1 ||\n this.metrics.avgLatencyMs > 1000\n ) {\n quality = \"good\";\n } else {\n quality = \"excellent\";\n }\n\n this.setQuality(quality);\n }\n\n protected buildUrl(path: string): string {\n const cleanPath = path.startsWith(\"/\") ? path : `/${path}`;\n return `${this.config.baseUrl}${cleanPath}`;\n }\n\n protected buildHeaders(\n extra?: Record<string, string>,\n ): Record<string, string> {\n return {\n ...this.config.headers,\n ...extra,\n };\n }\n}\n","/**\n * Mock Transport Adapter\n *\n * A fully controllable transport adapter for testing.\n * Allows mocking responses, simulating streams, and verifying requests.\n */\n\nimport { BaseTransportAdapter, type Subscription } from \"./interface.js\";\nimport type {\n RequestOptions,\n SSEEvent,\n StreamOptions,\n SubscriptionState,\n TransportConfig,\n} from \"./types.js\";\n\n/** Recorded request for verification */\nexport interface RecordedRequest {\n method: string;\n path: string;\n body?: unknown;\n headers?: Record<string, string>;\n timestamp: number;\n}\n\n/** Mock response configuration */\nexport interface MockResponse<T = unknown> {\n status?: number;\n data?: T;\n error?: Error;\n delay?: number;\n}\n\n/** Mock stream event */\nexport interface MockStreamEvent {\n event?: string;\n data: string;\n id?: string;\n delay?: number;\n}\n\n/** Mock subscription for testing */\nclass MockSubscription implements Subscription {\n readonly streamId: string;\n private _state: SubscriptionState = \"active\";\n private eventCallbacks: Set<(event: SSEEvent) => void> = new Set();\n private errorCallbacks: Set<(error: Error) => void> = new Set();\n private reconnectCallbacks: Set<(lastEventId: string | undefined) => void> =\n new Set();\n private events: SSEEvent[] = [];\n private eventIndex = 0;\n private closed = false;\n\n constructor(streamId: string, events: MockStreamEvent[] = []) {\n this.streamId = streamId;\n this.events = events.map((e, i) => ({\n id: e.id ?? `mock_${i}`,\n event: e.event,\n data: e.data,\n }));\n }\n\n get state(): SubscriptionState {\n return this._state;\n }\n\n pause(): void {\n if (this._state === \"active\") {\n this._state = \"paused\";\n }\n }\n\n resume(): void {\n if (this._state === \"paused\") {\n this._state = \"active\";\n this.deliverPending();\n }\n }\n\n close(): void {\n this._state = \"closed\";\n this.closed = true;\n }\n\n onEvent(callback: (event: SSEEvent) => void): () => void {\n this.eventCallbacks.add(callback);\n return () => this.eventCallbacks.delete(callback);\n }\n\n onError(callback: (error: Error) => void): () => void {\n this.errorCallbacks.add(callback);\n return () => this.errorCallbacks.delete(callback);\n }\n\n onReconnect(callback: (lastEventId: string | undefined) => void): () => void {\n this.reconnectCallbacks.add(callback);\n return () => this.reconnectCallbacks.delete(callback);\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<SSEEvent> {\n while (!this.closed) {\n if (this.eventIndex < this.events.length) {\n if (this._state === \"active\") {\n yield this.events[this.eventIndex++];\n } else {\n await new Promise((r) => setTimeout(r, 10));\n }\n } else {\n await new Promise((r) => setTimeout(r, 10));\n }\n }\n }\n\n /** Push a new event to the stream (for testing) */\n pushEvent(event: SSEEvent): void {\n this.events.push(event);\n if (this._state === \"active\") {\n this.deliverPending();\n }\n }\n\n /** Simulate an error (for testing) */\n simulateError(error: Error): void {\n for (const cb of this.errorCallbacks) {\n cb(error);\n }\n }\n\n /** Simulate reconnection (for testing) */\n simulateReconnect(lastEventId?: string): void {\n for (const cb of this.reconnectCallbacks) {\n cb(lastEventId);\n }\n }\n\n private deliverPending(): void {\n while (this.eventIndex < this.events.length && this._state === \"active\") {\n const event = this.events[this.eventIndex++];\n for (const cb of this.eventCallbacks) {\n cb(event);\n }\n }\n }\n\n /** Start delivering events automatically */\n startDelivery(): void {\n this.deliverPending();\n }\n}\n\n/** Configuration for MockTransportAdapter */\nexport interface MockTransportConfig extends Partial<TransportConfig> {\n /** Auto-connect on creation (default: true) */\n autoConnect?: boolean;\n}\n\n/**\n * Mock transport adapter for testing.\n * Provides full control over responses and streams.\n */\nexport class MockTransportAdapter extends BaseTransportAdapter {\n private readonly responses = new Map<string, MockResponse>();\n private readonly streams = new Map<string, MockStreamEvent[]>();\n private readonly subscriptions = new Map<string, MockSubscription>();\n readonly requests: RecordedRequest[] = [];\n\n constructor(config: MockTransportConfig = {}) {\n super({\n baseUrl: config.baseUrl ?? \"http://mock\",\n headers: config.headers,\n timeout: config.timeout,\n heartbeatIntervalMs: config.heartbeatIntervalMs,\n autoReconnect: config.autoReconnect,\n reconnection: config.reconnection,\n });\n\n if (config.autoConnect !== false) {\n this.setState(\"connected\");\n }\n }\n\n async connect(): Promise<void> {\n this.setState(\"connecting\");\n this.setState(\"connected\");\n }\n\n async disconnect(): Promise<void> {\n this.setState(\"disconnected\");\n for (const sub of this.subscriptions.values()) {\n sub.close();\n }\n this.subscriptions.clear();\n }\n\n async request<T>(options: RequestOptions): Promise<T> {\n const start = Date.now();\n\n this.requests.push({\n method: options.method ?? \"GET\",\n path: options.path,\n body: options.body,\n headers: options.headers,\n timestamp: start,\n });\n\n const key = `${options.method ?? \"GET\"}:${options.path}`;\n const mock = this.responses.get(key) ?? this.responses.get(options.path);\n\n if (mock?.delay) {\n await new Promise((r) => setTimeout(r, mock.delay));\n }\n\n const duration = Date.now() - start;\n\n if (mock?.error) {\n this.recordRequest(duration, true);\n throw mock.error;\n }\n\n this.recordRequest(duration, false);\n return (mock?.data ?? {}) as T;\n }\n\n subscribe(options: StreamOptions): Subscription {\n const streamId = `mock_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const events = this.streams.get(options.path) ?? [];\n const subscription = new MockSubscription(streamId, events);\n this.subscriptions.set(streamId, subscription);\n\n // Start delivering events after a microtask\n queueMicrotask(() => subscription.startDelivery());\n\n return subscription;\n }\n\n // ========== Test Helpers ==========\n\n /** Mock a response for a specific path */\n mockResponse<T>(path: string, response: MockResponse<T>): void {\n this.responses.set(path, response);\n }\n\n /** Mock a response for a specific method and path */\n mockMethodResponse<T>(\n method: string,\n path: string,\n response: MockResponse<T>,\n ): void {\n this.responses.set(`${method}:${path}`, response);\n }\n\n /** Mock a stream with events */\n mockStream(path: string, events: MockStreamEvent[]): void {\n this.streams.set(path, events);\n }\n\n /** Get a subscription by stream ID */\n getSubscription(streamId: string): MockSubscription | undefined {\n return this.subscriptions.get(streamId);\n }\n\n /** Get all active subscriptions */\n getActiveSubscriptions(): MockSubscription[] {\n return Array.from(this.subscriptions.values()).filter(\n (s) => s.state !== \"closed\",\n );\n }\n\n /** Push an event to all subscriptions for a path */\n pushEventToPath(_path: string, event: SSEEvent): void {\n for (const sub of this.subscriptions.values()) {\n sub.pushEvent(event);\n }\n }\n\n /** Clear all recorded requests */\n clearRequests(): void {\n this.requests.length = 0;\n }\n\n /** Clear all mocked responses */\n clearMocks(): void {\n this.responses.clear();\n this.streams.clear();\n }\n\n /** Get requests matching a path pattern */\n getRequestsForPath(path: string): RecordedRequest[] {\n return this.requests.filter((r) => r.path === path);\n }\n\n /** Get the last request made */\n getLastRequest(): RecordedRequest | undefined {\n return this.requests[this.requests.length - 1];\n }\n\n /** Simulate connection failure */\n simulateDisconnect(): void {\n this.setState(\"disconnected\");\n this.emit(\"error\", new Error(\"Simulated disconnect\"));\n }\n\n /** Simulate reconnection */\n simulateReconnect(): void {\n this.setState(\"connected\");\n this.recordReconnection();\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { A as ToolStateCompleted, C as TerminalDataEvent, D as TextPart, E as TerminalResizeEvent, F as isReasoningPart, I as isSubtaskPart, L as isTextPart, M as ToolStatePending, N as ToolStateRunning, O as ToolPart, P as isFilePart, R as isToolPart, S as SubtaskPart, T as TerminalExitEvent, _ as ReplayEndEvent, a as DoneEvent, b as SessionUpdatedEvent, c as ExecutionCompletedEvent, d as FilePart, f as HeartbeatEvent, g as ReasoningPart, h as PartBase, i as ConnectionInitEvent, j as ToolStateError, k as ToolState, l as ExecutionFailedEvent, m as Part, n as AgentEventType, o as ErrorEvent, p as MessagePartUpdatedEvent, r as AgentEventTypeSchema, s as EventMetadata, t as AgentEvent, u as ExecutionStartedEvent, v as ReplayStartEvent, w as TerminalEvent, x as StatusEvent, y as ResultEvent } from "../index-CQPGv8jg.js";
1
+ import { A as ToolStateCompleted, C as TerminalDataEvent, D as TextPart, E as TerminalResizeEvent, F as isReasoningPart, I as isSubtaskPart, L as isTextPart, M as ToolStatePending, N as ToolStateRunning, O as ToolPart, P as isFilePart, R as isToolPart, S as SubtaskPart, T as TerminalExitEvent, _ as ReplayEndEvent, a as DoneEvent, b as SessionUpdatedEvent, c as ExecutionCompletedEvent, d as FilePart, f as HeartbeatEvent, g as ReasoningPart, h as PartBase, i as ConnectionInitEvent, j as ToolStateError, k as ToolState, l as ExecutionFailedEvent, m as Part, n as AgentEventType, o as ErrorEvent, p as MessagePartUpdatedEvent, r as AgentEventTypeSchema, s as EventMetadata, t as AgentEvent, u as ExecutionStartedEvent, v as ReplayStartEvent, w as TerminalEvent, x as StatusEvent, y as ResultEvent } from "../index-v0euJYbX.js";
2
2
  export { type AgentEvent, type AgentEventType, AgentEventTypeSchema, type ConnectionInitEvent, type DoneEvent, type ErrorEvent, type EventMetadata, type ExecutionCompletedEvent, type ExecutionFailedEvent, type ExecutionStartedEvent, type FilePart, type HeartbeatEvent, type MessagePartUpdatedEvent, type Part, type PartBase, type ReasoningPart, type ReplayEndEvent, type ReplayStartEvent, type ResultEvent, type SessionUpdatedEvent, type StatusEvent, type SubtaskPart, type TerminalDataEvent, type TerminalEvent, type TerminalExitEvent, type TerminalResizeEvent, type TextPart, type ToolPart, type ToolState, type ToolStateCompleted, type ToolStateError, type ToolStatePending, type ToolStateRunning, isFilePart, isReasoningPart, isSubtaskPart, isTextPart, isToolPart };
@@ -1,2 +1 @@
1
- import { a as isTextPart, i as isSubtaskPart, n as isFilePart, o as isToolPart, r as isReasoningPart, t as AgentEventTypeSchema } from "../types-DVN5qATk.js";
2
- export { AgentEventTypeSchema, isFilePart, isReasoningPart, isSubtaskPart, isTextPart, isToolPart };
1
+ export { t as AgentEventTypeSchema, n as isFilePart, r as isReasoningPart, i as isSubtaskPart, a as isTextPart, o as isToolPart } from "../types-UwiuyvMA.js";
@@ -1,6 +1,6 @@
1
- import { t as SDKError } from "./errors-GuWACHTg.js";
1
+ import { t as SDKError } from "./errors-B5KiSXnw.js";
2
2
  import { z } from "zod";
3
- //#region src/auth/tokens-browser.ts
3
+ // src/auth/tokens-browser.ts
4
4
  const textDecoder = new TextDecoder();
5
5
  /** Base64URL decode (RFC 7515) to raw bytes. */
6
6
  function base64UrlToBytes(data) {
@@ -48,8 +48,7 @@ function getTokenTTL(payload) {
48
48
  function isTokenExpiringSoon(payload, bufferSeconds = 60) {
49
49
  return getTokenTTL(payload) <= bufferSeconds;
50
50
  }
51
- //#endregion
52
- //#region src/auth/shared-providers.ts
51
+ // src/auth/shared-providers.ts
53
52
  /**
54
53
  * Shared Auth Providers
55
54
  *
@@ -196,8 +195,7 @@ var ReadTokenAuth = class {
196
195
  return Math.floor((this.expiresAt - Date.now()) / 1e3);
197
196
  }
198
197
  };
199
- //#endregion
200
- //#region src/auth/types.ts
198
+ // src/auth/types.ts
201
199
  /**
202
200
  * Auth Types
203
201
  *
@@ -378,7 +376,6 @@ const SendMessageRequestSchema = z.object({
378
376
  execution_id: z.string().optional(),
379
377
  metadata: z.object({ model: z.string().optional() }).passthrough().optional()
380
378
  });
381
- //#endregion
382
379
  export { isTokenExpiringSoon as _, ReadTokenPayloadSchema as a, CallbackAuth as c, RefreshableTokenAuth as d, StaticTokenAuth as f, getTokenTTL as g, decodeToken as h, ProjectScopedTokenPayloadSchema as i, NoAuth as l, base64UrlToBytes as m, CreateSessionRequestSchema as n, SendMessageRequestSchema as o, base64UrlDecode as p, ProductSchema as r, SessionScopedTokenPayloadSchema as s, BatchScopedTokenPayloadSchema as t, ReadTokenAuth as u };
383
380
 
384
- //# sourceMappingURL=types--u-Om3vE.js.map
381
+ //# sourceMappingURL=types-BKMl10eN.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types--u-Om3vE.js","names":[],"sources":["../src/auth/tokens-browser.ts","../src/auth/shared-providers.ts","../src/auth/types.ts"],"sourcesContent":["/**\n * Reading a token, on any runtime.\n *\n * Inspecting a token needs no secret, so this half of the token surface is\n * portable: it uses only `atob`, `TextDecoder`, and `Date`, all of which a\n * browser and Node both provide. The server module builds on it rather than\n * keeping a second copy, so `@tangle-network/agent-core/auth` and\n * `@tangle-network/agent-core/auth/browser` cannot read one token two ways.\n */\n\nimport type { ReadTokenPayload } from \"./types.js\";\n\nconst textDecoder = new TextDecoder();\n\n/** Base64URL decode (RFC 7515) to raw bytes. */\nexport function base64UrlToBytes(data: string): Uint8Array {\n const padded = data + \"=\".repeat((4 - (data.length % 4)) % 4);\n const binary = atob(padded.replace(/-/g, \"+\").replace(/_/g, \"/\"));\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/**\n * Base64URL decode to a UTF-8 string.\n *\n * `atob` answers one byte per code unit, so its result is the raw bytes and\n * not yet text. A claim carrying any non-ASCII character — an account name, a\n * project name, an email display name — is only recovered by decoding those\n * bytes as UTF-8.\n */\nexport function base64UrlDecode(data: string): string {\n return textDecoder.decode(base64UrlToBytes(data));\n}\n\n/**\n * Decode a JWT without verifying it, to read claims for lookup.\n * Returns null if the token is malformed.\n */\nexport function decodeToken(token: string): ReadTokenPayload | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) {\n return null;\n }\n\n const payload = JSON.parse(base64UrlDecode(parts[1]));\n return payload as ReadTokenPayload;\n } catch {\n return null;\n }\n}\n\n/**\n * Get time until token expires (in seconds).\n * Returns negative if expired.\n */\nexport function getTokenTTL(payload: ReadTokenPayload): number {\n const now = Math.floor(Date.now() / 1000);\n return payload.exp - now;\n}\n\n/**\n * Check if token is expiring soon (within buffer seconds).\n */\nexport function isTokenExpiringSoon(\n payload: ReadTokenPayload,\n bufferSeconds = 60,\n): boolean {\n return getTokenTTL(payload) <= bufferSeconds;\n}\n","/**\n * Shared Auth Providers\n *\n * Browser-safe auth classes shared between index.ts and browser.ts.\n * These classes have no node:crypto dependency and work in all environments.\n */\n\nimport { SDKError } from \"../errors/index.js\";\n\n/** Auth provider interface */\nexport interface AuthProvider {\n /** Get current token (called on each request) */\n getToken(): Promise<string | null>;\n /** Refresh expired token */\n refreshToken?(): Promise<string>;\n /** Called when token is rejected by server */\n onTokenRejected?(error: SDKError): Promise<void>;\n}\n\n/** Simple static token auth */\nexport class StaticTokenAuth implements AuthProvider {\n constructor(private token: string) {}\n\n async getToken(): Promise<string> {\n return this.token;\n }\n\n setToken(token: string): void {\n this.token = token;\n }\n}\n\n/** Token with refresh capability */\nexport class RefreshableTokenAuth implements AuthProvider {\n private accessToken: string;\n private refreshTokenValue: string;\n private expiresAt: number;\n private refreshPromise: Promise<string> | null = null;\n\n constructor(\n private config: {\n accessToken: string;\n refreshToken: string;\n expiresIn: number; // seconds\n onRefresh: (refreshToken: string) => Promise<{\n accessToken: string;\n refreshToken?: string;\n expiresIn: number;\n }>;\n onRefreshFailed?: (error: Error) => void;\n /** Buffer before expiry to trigger refresh (default: 60s) */\n refreshBuffer?: number;\n },\n ) {\n this.accessToken = config.accessToken;\n this.refreshTokenValue = config.refreshToken;\n this.expiresAt = Date.now() + config.expiresIn * 1000;\n }\n\n async getToken(): Promise<string> {\n const buffer = (this.config.refreshBuffer ?? 60) * 1000;\n\n // Proactively refresh if close to expiry\n if (Date.now() > this.expiresAt - buffer) {\n return this.refreshToken();\n }\n\n return this.accessToken;\n }\n\n async refreshToken(): Promise<string> {\n // Deduplicate concurrent refresh calls\n if (this.refreshPromise) {\n return this.refreshPromise;\n }\n\n this.refreshPromise = this.doRefresh();\n\n try {\n return await this.refreshPromise;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n private async doRefresh(): Promise<string> {\n try {\n const result = await this.config.onRefresh(this.refreshTokenValue);\n this.accessToken = result.accessToken;\n if (result.refreshToken) {\n this.refreshTokenValue = result.refreshToken;\n }\n this.expiresAt = Date.now() + result.expiresIn * 1000;\n return this.accessToken;\n } catch (error) {\n this.config.onRefreshFailed?.(\n error instanceof Error ? error : new Error(String(error)),\n );\n throw new SDKError(\"Token refresh failed\", {\n code: \"AUTH\",\n retryable: false,\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n\n async onTokenRejected(error: SDKError): Promise<void> {\n // Force refresh on 401\n if (error.status === 401) {\n this.expiresAt = 0; // Mark as expired\n }\n }\n\n /** Check if token needs refresh */\n isExpired(): boolean {\n return Date.now() > this.expiresAt;\n }\n}\n\n/** No auth (for public endpoints) */\nexport class NoAuth implements AuthProvider {\n async getToken(): Promise<null> {\n return null;\n }\n}\n\n/**\n * Callback-based auth for dynamic token retrieval.\n * Useful when token comes from external source (user session, secure storage).\n */\nexport class CallbackAuth implements AuthProvider {\n constructor(\n private getTokenFn: () => string | null | Promise<string | null>,\n ) {}\n\n async getToken(): Promise<string | null> {\n return this.getTokenFn();\n }\n}\n\n/**\n * Read token auth for WebSocket connections.\n * Wraps a read token with refresh capability.\n */\nexport class ReadTokenAuth implements AuthProvider {\n private token: string;\n private expiresAt: number;\n private refreshPromise: Promise<string> | null = null;\n private expiryWarned = false;\n\n constructor(\n private config: {\n token: string;\n expiresAt: number; // Unix timestamp (seconds)\n onRefresh: () => Promise<{ token: string; expiresAt: number }>;\n onExpiring?: (secondsRemaining: number) => void;\n onRefreshFailed?: (error: Error) => void;\n /** Buffer before expiry to trigger refresh (default: 60s) */\n refreshBuffer?: number;\n /** Buffer before expiry to trigger warning (default: 60s) */\n warningBuffer?: number;\n },\n ) {\n this.token = config.token;\n this.expiresAt = config.expiresAt * 1000; // Convert to ms\n }\n\n async getToken(): Promise<string> {\n const now = Date.now();\n const refreshBuffer = (this.config.refreshBuffer ?? 60) * 1000;\n const warningBuffer = (this.config.warningBuffer ?? 60) * 1000;\n\n // Warn if expiring soon\n if (!this.expiryWarned && now > this.expiresAt - warningBuffer) {\n this.expiryWarned = true;\n const secondsRemaining = Math.floor((this.expiresAt - now) / 1000);\n this.config.onExpiring?.(secondsRemaining);\n }\n\n // Proactively refresh if close to expiry\n if (now > this.expiresAt - refreshBuffer) {\n return this.refreshToken();\n }\n\n return this.token;\n }\n\n async refreshToken(): Promise<string> {\n // Deduplicate concurrent refresh calls\n if (this.refreshPromise) {\n return this.refreshPromise;\n }\n\n this.refreshPromise = this.doRefresh();\n\n try {\n return await this.refreshPromise;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n private async doRefresh(): Promise<string> {\n try {\n const result = await this.config.onRefresh();\n this.token = result.token;\n this.expiresAt = result.expiresAt * 1000;\n this.expiryWarned = false;\n return this.token;\n } catch (error) {\n this.config.onRefreshFailed?.(\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n }\n\n /** Check if token is expired */\n isExpired(): boolean {\n return Date.now() > this.expiresAt;\n }\n\n /** Get seconds until expiry */\n getSecondsRemaining(): number {\n return Math.floor((this.expiresAt - Date.now()) / 1000);\n }\n}\n","/**\n * Auth Types\n *\n * Type definitions for multi-tenant authentication.\n */\n\nimport { z } from \"zod\";\n\n/**\n * Product configuration for multi-tenant orchestrator.\n */\nexport const ProductSchema = z\n .object({\n /** Unique product identifier (e.g., \"vibecode\", \"bgagents\") */\n product_id: z.string().min(1).max(64),\n\n /** Human-readable name */\n name: z.string().min(1).max(255),\n\n /** API key for backend → orchestrator auth (format: orch_prod_{random}) */\n api_key: z.string().min(32),\n\n /** Signing secrets for JWT tokens */\n secrets: z.object({\n current: z.object({\n secret: z.string().min(32),\n created_at: z.number(),\n }),\n previous: z\n .object({\n secret: z.string().min(32),\n created_at: z.number(),\n expires_at: z.number(),\n })\n .optional(),\n }),\n\n /** Token TTL configuration (minutes) */\n token_config: z.object({\n free_ttl_minutes: z.number().min(1).max(2880).default(15),\n paid_ttl_minutes: z.number().min(1).max(2880).default(240),\n max_ttl_minutes: z.number().min(1).max(2880).default(480),\n }),\n\n /** Per-product rate limits */\n rate_limits: z.object({\n max_concurrent_sessions: z.number().min(1).default(10000),\n max_sessions_per_minute: z.number().min(1).default(100),\n max_requests_per_minute: z.number().min(1).default(1000),\n }),\n\n /**\n * When true, skip all quota checks and usage metering.\n * Rate limits still enforced (DoS protection).\n * Use for internal/company accounts that don't go through billing.\n */\n unlimited: z.boolean().default(false),\n\n /**\n * Admin-only notes for internal tracking.\n * Examples: \"Engineering team\", \"Partner: Acme Corp\", \"Trial until 2024-03\"\n */\n internal_notes: z.string().max(1000).optional(),\n\n /** Optional webhook URL for notifications */\n webhook_url: z.string().url().optional(),\n\n /** Product status */\n status: z.enum([\"active\", \"suspended\", \"deleted\"]).default(\"active\"),\n\n /** Deployment type: shared (multi-tenant) or customer-hosted (on-prem) */\n deployment_type: z.enum([\"shared\", \"customer-hosted\"]).default(\"shared\"),\n\n /** Customer orchestrator configuration (for on-prem deployments) */\n customer_orchestrator: z\n .object({\n /** Customer's orchestrator URL (e.g., https://orch.customer.internal) */\n url: z.string().url().startsWith(\"https://\", {\n message: \"Customer orchestrator URL must use HTTPS\",\n }),\n /** Customer's orchestrator API key */\n api_key: z.string().min(32),\n })\n .optional(),\n\n /** Timestamps */\n created_at: z.string().datetime(),\n updated_at: z.string().datetime(),\n })\n .refine(\n (data) => {\n if (\n data.customer_orchestrator &&\n data.deployment_type !== \"customer-hosted\"\n ) {\n return false;\n }\n return true;\n },\n {\n message:\n \"customer_orchestrator can only be set when deployment_type is 'customer-hosted'\",\n path: [\"customer_orchestrator\"],\n },\n );\n\nexport type Product = z.infer<typeof ProductSchema>;\n\n/**\n * Token scope types for multi-tenant access control.\n *\n * - \"session\": Access to a single session (requires sid)\n * - \"project\": Access to all sessions within a project (requires projectId)\n * - \"batch\": Access to multiple projects (requires projectIds array)\n */\nexport type TokenScope = \"session\" | \"project\" | \"batch\";\n\n/**\n * Base token payload (common fields for all scopes).\n */\nconst BaseTokenPayloadSchema = z.object({\n /** Subject: User ID */\n sub: z.string().min(1),\n\n /** Product ID (used to look up signing secret) */\n pid: z.string().min(1),\n\n /** Sidecar/Container ID (optional, for direct routing) */\n cid: z.string().optional(),\n\n /** Token type (always \"read\" for read tokens) */\n typ: z.literal(\"read\"),\n\n /** Issued at (Unix timestamp, seconds) */\n iat: z.number(),\n\n /** Expires at (Unix timestamp, seconds) */\n exp: z.number(),\n});\n\n/**\n * Session-scoped token payload.\n * Grants access to a single session's events.\n */\nexport const SessionScopedTokenPayloadSchema = BaseTokenPayloadSchema.extend({\n /** Session ID - required for session-scoped tokens */\n sid: z.string().min(1),\n /** Project ID - must not be present for session-scoped tokens */\n projectId: z.undefined().optional(),\n /** Project IDs - must not be present for session-scoped tokens */\n projectIds: z.undefined().optional(),\n});\n\n/**\n * Project-scoped token payload.\n * Grants access to all sessions within a single project.\n */\nexport const ProjectScopedTokenPayloadSchema = BaseTokenPayloadSchema.extend({\n /** Session ID - must not be present for project-scoped tokens */\n sid: z.undefined().optional(),\n /** Project ID - required for project-scoped tokens */\n projectId: z.string().min(1),\n /** Project IDs - must not be present for project-scoped tokens */\n projectIds: z.undefined().optional(),\n});\n\n/**\n * Batch-scoped token payload.\n * Grants access to multiple projects (organization-level access).\n */\nexport const BatchScopedTokenPayloadSchema = BaseTokenPayloadSchema.extend({\n /** Session ID - must not be present for batch-scoped tokens */\n sid: z.undefined().optional(),\n /** Project ID - must not be present for batch-scoped tokens */\n projectId: z.undefined().optional(),\n /** Project IDs - required for batch-scoped tokens */\n projectIds: z.array(z.string().min(1)).min(1),\n});\n\n/**\n * Read token payload (JWT claims for WebSocket auth).\n *\n * Supports three scopes:\n * - Session: sid present (single session)\n * - Project: projectId present (all sessions in project)\n * - Batch: projectIds present (multiple projects)\n *\n * For backwards compatibility, tokens with sid are session-scoped.\n */\nexport const ReadTokenPayloadSchema = z.union([\n SessionScopedTokenPayloadSchema,\n ProjectScopedTokenPayloadSchema,\n BatchScopedTokenPayloadSchema,\n]);\n\nexport type ReadTokenPayload = z.infer<typeof ReadTokenPayloadSchema>;\nexport type SessionScopedTokenPayload = z.infer<\n typeof SessionScopedTokenPayloadSchema\n>;\nexport type ProjectScopedTokenPayload = z.infer<\n typeof ProjectScopedTokenPayloadSchema\n>;\nexport type BatchScopedTokenPayload = z.infer<\n typeof BatchScopedTokenPayloadSchema\n>;\n\n/**\n * Token validation result.\n */\nexport interface TokenValidationResult {\n valid: boolean;\n payload?: ReadTokenPayload;\n /** Token scope (session, project, or batch) */\n scope?: TokenScope;\n error?: string;\n errorCode?:\n | \"TOKEN_MISSING\"\n | \"TOKEN_INVALID\"\n | \"TOKEN_EXPIRED\"\n | \"TOKEN_WRONG_TYPE\"\n | \"PRODUCT_NOT_FOUND\"\n | \"PRODUCT_SUSPENDED\"\n | \"SIGNATURE_INVALID\";\n}\n\n/**\n * Product secrets structure.\n */\nexport interface ProductSecrets {\n current: {\n secret: string;\n created_at: number;\n };\n previous?: {\n secret: string;\n created_at: number;\n expires_at: number;\n };\n}\n\n/**\n * Minimal product info for token validation (avoids full product lookup).\n */\nexport interface ProductAuthInfo {\n product_id: string;\n secrets: ProductSecrets;\n status: \"active\" | \"suspended\" | \"deleted\";\n}\n\n/**\n * Session creation request from product backend.\n */\nexport const CreateSessionRequestSchema = z.object({\n user_id: z.string().min(1),\n project_ref: z.string().optional(),\n tier: z\n .enum([\"free\", \"pro\", \"enterprise\"])\n .or(z.literal(\"paid\").transform(() => \"pro\" as const))\n .default(\"free\"),\n config: z\n .object({\n image: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n resources: z\n .object({\n cpu: z.number().optional(),\n memory: z.string().optional(),\n })\n .optional(),\n })\n .optional(),\n});\n\nexport type CreateSessionRequest = z.infer<typeof CreateSessionRequestSchema>;\n\n/**\n * Session creation response to product backend.\n */\nexport interface CreateSessionResponse {\n session_id: string;\n sidecar_id: string;\n websocket_url: string;\n}\n\n/**\n * Message send request from product backend.\n *\n * `metadata` is intentionally free-form (.passthrough): the wire format\n * accepts arbitrary product-specific keys without requiring a schema bump.\n * Only `model` is named today; legacy gateway-credential fields previously\n * declared here were never read internally and have been dropped — any\n * such fields sent by older callers continue to flow through .passthrough.\n */\nexport const SendMessageRequestSchema = z.object({\n content: z.string(),\n user_id: z.string().min(1),\n execution_id: z.string().optional(),\n metadata: z\n .object({\n model: z.string().optional(),\n })\n .passthrough()\n .optional(),\n});\n\nexport type SendMessageRequest = z.infer<typeof SendMessageRequestSchema>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"types-BKMl10eN.js","names":[],"sources":["../src/auth/tokens-browser.ts","../src/auth/shared-providers.ts","../src/auth/types.ts"],"sourcesContent":["/**\n * Reading a token, on any runtime.\n *\n * Inspecting a token needs no secret, so this half of the token surface is\n * portable: it uses only `atob`, `TextDecoder`, and `Date`, all of which a\n * browser and Node both provide. The server module builds on it rather than\n * keeping a second copy, so `@tangle-network/agent-core/auth` and\n * `@tangle-network/agent-core/auth/browser` cannot read one token two ways.\n */\n\nimport type { ReadTokenPayload } from \"./types.js\";\n\nconst textDecoder = new TextDecoder();\n\n/** Base64URL decode (RFC 7515) to raw bytes. */\nexport function base64UrlToBytes(data: string): Uint8Array {\n const padded = data + \"=\".repeat((4 - (data.length % 4)) % 4);\n const binary = atob(padded.replace(/-/g, \"+\").replace(/_/g, \"/\"));\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/**\n * Base64URL decode to a UTF-8 string.\n *\n * `atob` answers one byte per code unit, so its result is the raw bytes and\n * not yet text. A claim carrying any non-ASCII character — an account name, a\n * project name, an email display name — is only recovered by decoding those\n * bytes as UTF-8.\n */\nexport function base64UrlDecode(data: string): string {\n return textDecoder.decode(base64UrlToBytes(data));\n}\n\n/**\n * Decode a JWT without verifying it, to read claims for lookup.\n * Returns null if the token is malformed.\n */\nexport function decodeToken(token: string): ReadTokenPayload | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) {\n return null;\n }\n\n const payload = JSON.parse(base64UrlDecode(parts[1]));\n return payload as ReadTokenPayload;\n } catch {\n return null;\n }\n}\n\n/**\n * Get time until token expires (in seconds).\n * Returns negative if expired.\n */\nexport function getTokenTTL(payload: ReadTokenPayload): number {\n const now = Math.floor(Date.now() / 1000);\n return payload.exp - now;\n}\n\n/**\n * Check if token is expiring soon (within buffer seconds).\n */\nexport function isTokenExpiringSoon(\n payload: ReadTokenPayload,\n bufferSeconds = 60,\n): boolean {\n return getTokenTTL(payload) <= bufferSeconds;\n}\n","/**\n * Shared Auth Providers\n *\n * Browser-safe auth classes shared between index.ts and browser.ts.\n * These classes have no node:crypto dependency and work in all environments.\n */\n\nimport { SDKError } from \"../errors/index.js\";\n\n/** Auth provider interface */\nexport interface AuthProvider {\n /** Get current token (called on each request) */\n getToken(): Promise<string | null>;\n /** Refresh expired token */\n refreshToken?(): Promise<string>;\n /** Called when token is rejected by server */\n onTokenRejected?(error: SDKError): Promise<void>;\n}\n\n/** Simple static token auth */\nexport class StaticTokenAuth implements AuthProvider {\n constructor(private token: string) {}\n\n async getToken(): Promise<string> {\n return this.token;\n }\n\n setToken(token: string): void {\n this.token = token;\n }\n}\n\n/** Token with refresh capability */\nexport class RefreshableTokenAuth implements AuthProvider {\n private accessToken: string;\n private refreshTokenValue: string;\n private expiresAt: number;\n private refreshPromise: Promise<string> | null = null;\n\n constructor(\n private config: {\n accessToken: string;\n refreshToken: string;\n expiresIn: number; // seconds\n onRefresh: (refreshToken: string) => Promise<{\n accessToken: string;\n refreshToken?: string;\n expiresIn: number;\n }>;\n onRefreshFailed?: (error: Error) => void;\n /** Buffer before expiry to trigger refresh (default: 60s) */\n refreshBuffer?: number;\n },\n ) {\n this.accessToken = config.accessToken;\n this.refreshTokenValue = config.refreshToken;\n this.expiresAt = Date.now() + config.expiresIn * 1000;\n }\n\n async getToken(): Promise<string> {\n const buffer = (this.config.refreshBuffer ?? 60) * 1000;\n\n // Proactively refresh if close to expiry\n if (Date.now() > this.expiresAt - buffer) {\n return this.refreshToken();\n }\n\n return this.accessToken;\n }\n\n async refreshToken(): Promise<string> {\n // Deduplicate concurrent refresh calls\n if (this.refreshPromise) {\n return this.refreshPromise;\n }\n\n this.refreshPromise = this.doRefresh();\n\n try {\n return await this.refreshPromise;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n private async doRefresh(): Promise<string> {\n try {\n const result = await this.config.onRefresh(this.refreshTokenValue);\n this.accessToken = result.accessToken;\n if (result.refreshToken) {\n this.refreshTokenValue = result.refreshToken;\n }\n this.expiresAt = Date.now() + result.expiresIn * 1000;\n return this.accessToken;\n } catch (error) {\n this.config.onRefreshFailed?.(\n error instanceof Error ? error : new Error(String(error)),\n );\n throw new SDKError(\"Token refresh failed\", {\n code: \"AUTH\",\n retryable: false,\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n\n async onTokenRejected(error: SDKError): Promise<void> {\n // Force refresh on 401\n if (error.status === 401) {\n this.expiresAt = 0; // Mark as expired\n }\n }\n\n /** Check if token needs refresh */\n isExpired(): boolean {\n return Date.now() > this.expiresAt;\n }\n}\n\n/** No auth (for public endpoints) */\nexport class NoAuth implements AuthProvider {\n async getToken(): Promise<null> {\n return null;\n }\n}\n\n/**\n * Callback-based auth for dynamic token retrieval.\n * Useful when token comes from external source (user session, secure storage).\n */\nexport class CallbackAuth implements AuthProvider {\n constructor(\n private getTokenFn: () => string | null | Promise<string | null>,\n ) {}\n\n async getToken(): Promise<string | null> {\n return this.getTokenFn();\n }\n}\n\n/**\n * Read token auth for WebSocket connections.\n * Wraps a read token with refresh capability.\n */\nexport class ReadTokenAuth implements AuthProvider {\n private token: string;\n private expiresAt: number;\n private refreshPromise: Promise<string> | null = null;\n private expiryWarned = false;\n\n constructor(\n private config: {\n token: string;\n expiresAt: number; // Unix timestamp (seconds)\n onRefresh: () => Promise<{ token: string; expiresAt: number }>;\n onExpiring?: (secondsRemaining: number) => void;\n onRefreshFailed?: (error: Error) => void;\n /** Buffer before expiry to trigger refresh (default: 60s) */\n refreshBuffer?: number;\n /** Buffer before expiry to trigger warning (default: 60s) */\n warningBuffer?: number;\n },\n ) {\n this.token = config.token;\n this.expiresAt = config.expiresAt * 1000; // Convert to ms\n }\n\n async getToken(): Promise<string> {\n const now = Date.now();\n const refreshBuffer = (this.config.refreshBuffer ?? 60) * 1000;\n const warningBuffer = (this.config.warningBuffer ?? 60) * 1000;\n\n // Warn if expiring soon\n if (!this.expiryWarned && now > this.expiresAt - warningBuffer) {\n this.expiryWarned = true;\n const secondsRemaining = Math.floor((this.expiresAt - now) / 1000);\n this.config.onExpiring?.(secondsRemaining);\n }\n\n // Proactively refresh if close to expiry\n if (now > this.expiresAt - refreshBuffer) {\n return this.refreshToken();\n }\n\n return this.token;\n }\n\n async refreshToken(): Promise<string> {\n // Deduplicate concurrent refresh calls\n if (this.refreshPromise) {\n return this.refreshPromise;\n }\n\n this.refreshPromise = this.doRefresh();\n\n try {\n return await this.refreshPromise;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n private async doRefresh(): Promise<string> {\n try {\n const result = await this.config.onRefresh();\n this.token = result.token;\n this.expiresAt = result.expiresAt * 1000;\n this.expiryWarned = false;\n return this.token;\n } catch (error) {\n this.config.onRefreshFailed?.(\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n }\n\n /** Check if token is expired */\n isExpired(): boolean {\n return Date.now() > this.expiresAt;\n }\n\n /** Get seconds until expiry */\n getSecondsRemaining(): number {\n return Math.floor((this.expiresAt - Date.now()) / 1000);\n }\n}\n","/**\n * Auth Types\n *\n * Type definitions for multi-tenant authentication.\n */\n\nimport { z } from \"zod\";\n\n/**\n * Product configuration for multi-tenant orchestrator.\n */\nexport const ProductSchema = z\n .object({\n /** Unique product identifier (e.g., \"vibecode\", \"bgagents\") */\n product_id: z.string().min(1).max(64),\n\n /** Human-readable name */\n name: z.string().min(1).max(255),\n\n /** API key for backend → orchestrator auth (format: orch_prod_{random}) */\n api_key: z.string().min(32),\n\n /** Signing secrets for JWT tokens */\n secrets: z.object({\n current: z.object({\n secret: z.string().min(32),\n created_at: z.number(),\n }),\n previous: z\n .object({\n secret: z.string().min(32),\n created_at: z.number(),\n expires_at: z.number(),\n })\n .optional(),\n }),\n\n /** Token TTL configuration (minutes) */\n token_config: z.object({\n free_ttl_minutes: z.number().min(1).max(2880).default(15),\n paid_ttl_minutes: z.number().min(1).max(2880).default(240),\n max_ttl_minutes: z.number().min(1).max(2880).default(480),\n }),\n\n /** Per-product rate limits */\n rate_limits: z.object({\n max_concurrent_sessions: z.number().min(1).default(10000),\n max_sessions_per_minute: z.number().min(1).default(100),\n max_requests_per_minute: z.number().min(1).default(1000),\n }),\n\n /**\n * When true, skip all quota checks and usage metering.\n * Rate limits still enforced (DoS protection).\n * Use for internal/company accounts that don't go through billing.\n */\n unlimited: z.boolean().default(false),\n\n /**\n * Admin-only notes for internal tracking.\n * Examples: \"Engineering team\", \"Partner: Acme Corp\", \"Trial until 2024-03\"\n */\n internal_notes: z.string().max(1000).optional(),\n\n /** Optional webhook URL for notifications */\n webhook_url: z.string().url().optional(),\n\n /** Product status */\n status: z.enum([\"active\", \"suspended\", \"deleted\"]).default(\"active\"),\n\n /** Deployment type: shared (multi-tenant) or customer-hosted (on-prem) */\n deployment_type: z.enum([\"shared\", \"customer-hosted\"]).default(\"shared\"),\n\n /** Customer orchestrator configuration (for on-prem deployments) */\n customer_orchestrator: z\n .object({\n /** Customer's orchestrator URL (e.g., https://orch.customer.internal) */\n url: z.string().url().startsWith(\"https://\", {\n message: \"Customer orchestrator URL must use HTTPS\",\n }),\n /** Customer's orchestrator API key */\n api_key: z.string().min(32),\n })\n .optional(),\n\n /** Timestamps */\n created_at: z.string().datetime(),\n updated_at: z.string().datetime(),\n })\n .refine(\n (data) => {\n if (\n data.customer_orchestrator &&\n data.deployment_type !== \"customer-hosted\"\n ) {\n return false;\n }\n return true;\n },\n {\n message:\n \"customer_orchestrator can only be set when deployment_type is 'customer-hosted'\",\n path: [\"customer_orchestrator\"],\n },\n );\n\nexport type Product = z.infer<typeof ProductSchema>;\n\n/**\n * Token scope types for multi-tenant access control.\n *\n * - \"session\": Access to a single session (requires sid)\n * - \"project\": Access to all sessions within a project (requires projectId)\n * - \"batch\": Access to multiple projects (requires projectIds array)\n */\nexport type TokenScope = \"session\" | \"project\" | \"batch\";\n\n/**\n * Base token payload (common fields for all scopes).\n */\nconst BaseTokenPayloadSchema = z.object({\n /** Subject: User ID */\n sub: z.string().min(1),\n\n /** Product ID (used to look up signing secret) */\n pid: z.string().min(1),\n\n /** Sidecar/Container ID (optional, for direct routing) */\n cid: z.string().optional(),\n\n /** Token type (always \"read\" for read tokens) */\n typ: z.literal(\"read\"),\n\n /** Issued at (Unix timestamp, seconds) */\n iat: z.number(),\n\n /** Expires at (Unix timestamp, seconds) */\n exp: z.number(),\n});\n\n/**\n * Session-scoped token payload.\n * Grants access to a single session's events.\n */\nexport const SessionScopedTokenPayloadSchema = BaseTokenPayloadSchema.extend({\n /** Session ID - required for session-scoped tokens */\n sid: z.string().min(1),\n /** Project ID - must not be present for session-scoped tokens */\n projectId: z.undefined().optional(),\n /** Project IDs - must not be present for session-scoped tokens */\n projectIds: z.undefined().optional(),\n});\n\n/**\n * Project-scoped token payload.\n * Grants access to all sessions within a single project.\n */\nexport const ProjectScopedTokenPayloadSchema = BaseTokenPayloadSchema.extend({\n /** Session ID - must not be present for project-scoped tokens */\n sid: z.undefined().optional(),\n /** Project ID - required for project-scoped tokens */\n projectId: z.string().min(1),\n /** Project IDs - must not be present for project-scoped tokens */\n projectIds: z.undefined().optional(),\n});\n\n/**\n * Batch-scoped token payload.\n * Grants access to multiple projects (organization-level access).\n */\nexport const BatchScopedTokenPayloadSchema = BaseTokenPayloadSchema.extend({\n /** Session ID - must not be present for batch-scoped tokens */\n sid: z.undefined().optional(),\n /** Project ID - must not be present for batch-scoped tokens */\n projectId: z.undefined().optional(),\n /** Project IDs - required for batch-scoped tokens */\n projectIds: z.array(z.string().min(1)).min(1),\n});\n\n/**\n * Read token payload (JWT claims for WebSocket auth).\n *\n * Supports three scopes:\n * - Session: sid present (single session)\n * - Project: projectId present (all sessions in project)\n * - Batch: projectIds present (multiple projects)\n *\n * For backwards compatibility, tokens with sid are session-scoped.\n */\nexport const ReadTokenPayloadSchema = z.union([\n SessionScopedTokenPayloadSchema,\n ProjectScopedTokenPayloadSchema,\n BatchScopedTokenPayloadSchema,\n]);\n\nexport type ReadTokenPayload = z.infer<typeof ReadTokenPayloadSchema>;\nexport type SessionScopedTokenPayload = z.infer<\n typeof SessionScopedTokenPayloadSchema\n>;\nexport type ProjectScopedTokenPayload = z.infer<\n typeof ProjectScopedTokenPayloadSchema\n>;\nexport type BatchScopedTokenPayload = z.infer<\n typeof BatchScopedTokenPayloadSchema\n>;\n\n/**\n * Token validation result.\n */\nexport interface TokenValidationResult {\n valid: boolean;\n payload?: ReadTokenPayload;\n /** Token scope (session, project, or batch) */\n scope?: TokenScope;\n error?: string;\n errorCode?:\n | \"TOKEN_MISSING\"\n | \"TOKEN_INVALID\"\n | \"TOKEN_EXPIRED\"\n | \"TOKEN_WRONG_TYPE\"\n | \"PRODUCT_NOT_FOUND\"\n | \"PRODUCT_SUSPENDED\"\n | \"SIGNATURE_INVALID\";\n}\n\n/**\n * Product secrets structure.\n */\nexport interface ProductSecrets {\n current: {\n secret: string;\n created_at: number;\n };\n previous?: {\n secret: string;\n created_at: number;\n expires_at: number;\n };\n}\n\n/**\n * Minimal product info for token validation (avoids full product lookup).\n */\nexport interface ProductAuthInfo {\n product_id: string;\n secrets: ProductSecrets;\n status: \"active\" | \"suspended\" | \"deleted\";\n}\n\n/**\n * Session creation request from product backend.\n */\nexport const CreateSessionRequestSchema = z.object({\n user_id: z.string().min(1),\n project_ref: z.string().optional(),\n tier: z\n .enum([\"free\", \"pro\", \"enterprise\"])\n .or(z.literal(\"paid\").transform(() => \"pro\" as const))\n .default(\"free\"),\n config: z\n .object({\n image: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n resources: z\n .object({\n cpu: z.number().optional(),\n memory: z.string().optional(),\n })\n .optional(),\n })\n .optional(),\n});\n\nexport type CreateSessionRequest = z.infer<typeof CreateSessionRequestSchema>;\n\n/**\n * Session creation response to product backend.\n */\nexport interface CreateSessionResponse {\n session_id: string;\n sidecar_id: string;\n websocket_url: string;\n}\n\n/**\n * Message send request from product backend.\n *\n * `metadata` is intentionally free-form (.passthrough): the wire format\n * accepts arbitrary product-specific keys without requiring a schema bump.\n * Only `model` is named today; legacy gateway-credential fields previously\n * declared here were never read internally and have been dropped — any\n * such fields sent by older callers continue to flow through .passthrough.\n */\nexport const SendMessageRequestSchema = z.object({\n content: z.string(),\n user_id: z.string().min(1),\n execution_id: z.string().optional(),\n metadata: z\n .object({\n model: z.string().optional(),\n })\n .passthrough()\n .optional(),\n});\n\nexport type SendMessageRequest = z.infer<typeof SendMessageRequestSchema>;\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { isFilePart, isReasoningPart, isSubtaskPart, isTextPart, isToolPart } from "@tangle-network/agent-interface";
3
- //#region src/types/events.ts
3
+ // src/types/events.ts
4
4
  /**
5
5
  * Shared Event Types
6
6
  *
@@ -25,7 +25,6 @@ const AgentEventTypeSchema = z.enum([
25
25
  "result",
26
26
  "done"
27
27
  ]);
28
- //#endregion
29
28
  export { isTextPart as a, isSubtaskPart as i, isFilePart as n, isToolPart as o, isReasoningPart as r, AgentEventTypeSchema as t };
30
29
 
31
- //# sourceMappingURL=types-DVN5qATk.js.map
30
+ //# sourceMappingURL=types-UwiuyvMA.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types-DVN5qATk.js","names":[],"sources":["../src/types/events.ts"],"sourcesContent":["/**\n * Shared Event Types\n *\n * Type definitions for events across the SDK.\n * Uses message.part.updated as the single canonical event for all content.\n *\n * Part types (TextPart, ToolPart, ReasoningPart, FilePart, ToolState)\n * are re-exported from @tangle-network/agent-interface for consistency.\n */\n\nimport { z } from \"zod\";\n\n// Re-export canonical Part types from agent-interface\nexport type {\n FilePart,\n Part,\n PartBase,\n ReasoningPart,\n SubtaskPart,\n TextPart,\n ToolPart,\n ToolState,\n ToolStateCompleted,\n ToolStateError,\n ToolStatePending,\n ToolStateRunning,\n} from \"@tangle-network/agent-interface\";\n\n// Re-export part type guards\nexport {\n isFilePart,\n isReasoningPart,\n isSubtaskPart,\n isTextPart,\n isToolPart,\n} from \"@tangle-network/agent-interface\";\n\n// Agent event types - message.part.updated is the primary content event\nexport const AgentEventTypeSchema = z.enum([\n \"message.part.updated\",\n \"status\",\n \"error\",\n \"heartbeat\",\n \"connection.init\",\n \"history.replay.start\",\n \"history.replay.end\",\n \"execution.started\",\n \"execution.completed\",\n \"execution.failed\",\n \"session.updated\",\n \"result\",\n \"done\",\n]);\n\nexport type AgentEventType = z.infer<typeof AgentEventTypeSchema>;\n\n// Base event metadata (agent-core specific - adds sequence tracking)\nexport interface EventMetadata {\n serverInstanceId: string;\n seq: number;\n prevSeq: number | null;\n sentAt: number;\n}\n\n// Import Part type for use in events\nimport type { Part, StreamStatus } from \"@tangle-network/agent-interface\";\n\n// The primary content event - all text, tool, and reasoning updates\nexport interface MessagePartUpdatedEvent {\n type: \"message.part.updated\";\n part: Part;\n delta?: string; // Incremental text change for streaming\n _meta?: EventMetadata;\n}\n\n// Status event\nexport interface StatusEvent {\n type: \"status\";\n status: StreamStatus;\n detail?: string;\n _meta?: EventMetadata;\n}\n\n// Error event\nexport interface ErrorEvent {\n type: \"error\";\n code?: string;\n message: string;\n details?: unknown;\n _meta?: EventMetadata;\n}\n\n// Heartbeat event\nexport interface HeartbeatEvent {\n type: \"heartbeat\";\n timestamp?: number;\n _meta?: EventMetadata;\n}\n\n// Connection events\nexport interface ConnectionInitEvent {\n type: \"connection.init\";\n serverInstanceId?: string;\n streamId?: string;\n initialSeq?: number;\n timestamp?: number;\n _meta?: EventMetadata;\n}\n\n// Replay events\nexport interface ReplayStartEvent {\n type: \"history.replay.start\";\n executionId?: string;\n sessionId?: string;\n totalEvents?: number;\n status?: string;\n}\n\nexport interface ReplayEndEvent {\n type: \"history.replay.end\";\n executionId?: string;\n totalEventsReplayed?: number;\n status?: string;\n continuing?: boolean;\n}\n\n// Execution lifecycle events\nexport interface ExecutionStartedEvent {\n type: \"execution.started\";\n executionId?: string;\n sessionId?: string;\n timestamp?: number;\n}\n\nexport interface ExecutionCompletedEvent {\n type: \"execution.completed\";\n executionId?: string;\n sessionId?: string;\n timestamp?: number;\n}\n\nexport interface ExecutionFailedEvent {\n type: \"execution.failed\";\n executionId?: string;\n sessionId?: string;\n error?: string;\n timestamp?: number;\n}\n\n// Session update event\nexport interface SessionUpdatedEvent {\n type: \"session.updated\";\n sessionId: string;\n title?: string;\n time?: { created?: number; updated?: number };\n}\n\n// Result event (final response)\nexport interface ResultEvent {\n type: \"result\";\n finalText?: string;\n toolInvocations?: unknown[];\n tokenUsage?: Record<string, unknown>;\n timing?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\n// Done event (stream complete)\nexport interface DoneEvent {\n type: \"done\";\n requestId?: string;\n}\n\n// Union of all agent events\nexport type AgentEvent =\n | MessagePartUpdatedEvent\n | StatusEvent\n | ErrorEvent\n | HeartbeatEvent\n | ConnectionInitEvent\n | ReplayStartEvent\n | ReplayEndEvent\n | ExecutionStartedEvent\n | ExecutionCompletedEvent\n | ExecutionFailedEvent\n | SessionUpdatedEvent\n | ResultEvent\n | DoneEvent;\n\n// Terminal event types\nexport interface TerminalDataEvent {\n type: \"terminal.data\";\n data: string;\n terminalId: string;\n}\n\nexport interface TerminalResizeEvent {\n type: \"terminal.resize\";\n cols: number;\n rows: number;\n terminalId: string;\n}\n\nexport interface TerminalExitEvent {\n type: \"terminal.exit\";\n exitCode: number;\n terminalId: string;\n}\n\nexport type TerminalEvent =\n | TerminalDataEvent\n | TerminalResizeEvent\n | TerminalExitEvent;\n"],"mappings":";;;;;;;;;;;;AAsCA,MAAa,uBAAuB,EAAE,KAAK;CACzC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC"}
1
+ {"version":3,"file":"types-UwiuyvMA.js","names":[],"sources":["../src/types/events.ts"],"sourcesContent":["/**\n * Shared Event Types\n *\n * Type definitions for events across the SDK.\n * Uses message.part.updated as the single canonical event for all content.\n *\n * Part types (TextPart, ToolPart, ReasoningPart, FilePart, ToolState)\n * are re-exported from @tangle-network/agent-interface for consistency.\n */\n\nimport { z } from \"zod\";\n\n// Re-export canonical Part types from agent-interface\nexport type {\n FilePart,\n Part,\n PartBase,\n ReasoningPart,\n SubtaskPart,\n TextPart,\n ToolPart,\n ToolState,\n ToolStateCompleted,\n ToolStateError,\n ToolStatePending,\n ToolStateRunning,\n} from \"@tangle-network/agent-interface\";\n\n// Re-export part type guards\nexport {\n isFilePart,\n isReasoningPart,\n isSubtaskPart,\n isTextPart,\n isToolPart,\n} from \"@tangle-network/agent-interface\";\n\n// Agent event types - message.part.updated is the primary content event\nexport const AgentEventTypeSchema = z.enum([\n \"message.part.updated\",\n \"status\",\n \"error\",\n \"heartbeat\",\n \"connection.init\",\n \"history.replay.start\",\n \"history.replay.end\",\n \"execution.started\",\n \"execution.completed\",\n \"execution.failed\",\n \"session.updated\",\n \"result\",\n \"done\",\n]);\n\nexport type AgentEventType = z.infer<typeof AgentEventTypeSchema>;\n\n// Base event metadata (agent-core specific - adds sequence tracking)\nexport interface EventMetadata {\n serverInstanceId: string;\n seq: number;\n prevSeq: number | null;\n sentAt: number;\n}\n\n// Import Part type for use in events\nimport type { Part, StreamStatus } from \"@tangle-network/agent-interface\";\n\n// The primary content event - all text, tool, and reasoning updates\nexport interface MessagePartUpdatedEvent {\n type: \"message.part.updated\";\n part: Part;\n delta?: string; // Incremental text change for streaming\n _meta?: EventMetadata;\n}\n\n// Status event\nexport interface StatusEvent {\n type: \"status\";\n status: StreamStatus;\n detail?: string;\n _meta?: EventMetadata;\n}\n\n// Error event\nexport interface ErrorEvent {\n type: \"error\";\n code?: string;\n message: string;\n details?: unknown;\n _meta?: EventMetadata;\n}\n\n// Heartbeat event\nexport interface HeartbeatEvent {\n type: \"heartbeat\";\n timestamp?: number;\n _meta?: EventMetadata;\n}\n\n// Connection events\nexport interface ConnectionInitEvent {\n type: \"connection.init\";\n serverInstanceId?: string;\n streamId?: string;\n initialSeq?: number;\n timestamp?: number;\n _meta?: EventMetadata;\n}\n\n// Replay events\nexport interface ReplayStartEvent {\n type: \"history.replay.start\";\n executionId?: string;\n sessionId?: string;\n totalEvents?: number;\n status?: string;\n}\n\nexport interface ReplayEndEvent {\n type: \"history.replay.end\";\n executionId?: string;\n totalEventsReplayed?: number;\n status?: string;\n continuing?: boolean;\n}\n\n// Execution lifecycle events\nexport interface ExecutionStartedEvent {\n type: \"execution.started\";\n executionId?: string;\n sessionId?: string;\n timestamp?: number;\n}\n\nexport interface ExecutionCompletedEvent {\n type: \"execution.completed\";\n executionId?: string;\n sessionId?: string;\n timestamp?: number;\n}\n\nexport interface ExecutionFailedEvent {\n type: \"execution.failed\";\n executionId?: string;\n sessionId?: string;\n error?: string;\n timestamp?: number;\n}\n\n// Session update event\nexport interface SessionUpdatedEvent {\n type: \"session.updated\";\n sessionId: string;\n title?: string;\n time?: { created?: number; updated?: number };\n}\n\n// Result event (final response)\nexport interface ResultEvent {\n type: \"result\";\n finalText?: string;\n toolInvocations?: unknown[];\n tokenUsage?: Record<string, unknown>;\n timing?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\n// Done event (stream complete)\nexport interface DoneEvent {\n type: \"done\";\n requestId?: string;\n}\n\n// Union of all agent events\nexport type AgentEvent =\n | MessagePartUpdatedEvent\n | StatusEvent\n | ErrorEvent\n | HeartbeatEvent\n | ConnectionInitEvent\n | ReplayStartEvent\n | ReplayEndEvent\n | ExecutionStartedEvent\n | ExecutionCompletedEvent\n | ExecutionFailedEvent\n | SessionUpdatedEvent\n | ResultEvent\n | DoneEvent;\n\n// Terminal event types\nexport interface TerminalDataEvent {\n type: \"terminal.data\";\n data: string;\n terminalId: string;\n}\n\nexport interface TerminalResizeEvent {\n type: \"terminal.resize\";\n cols: number;\n rows: number;\n terminalId: string;\n}\n\nexport interface TerminalExitEvent {\n type: \"terminal.exit\";\n exitCode: number;\n terminalId: string;\n}\n\nexport type TerminalEvent =\n | TerminalDataEvent\n | TerminalResizeEvent\n | TerminalExitEvent;\n"],"mappings":";;;;;;;;;;;;AAsCA,MAAa,uBAAuB,EAAE,KAAK;CACzC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/agent-core",
3
- "version": "0.13.2",
3
+ "version": "0.13.3",
4
4
  "description": "Core transport interfaces, event utilities, auth, SSE parsing, and resilience primitives for talking to Tangle agents",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -146,9 +146,9 @@
146
146
  "LICENSE"
147
147
  ],
148
148
  "dependencies": {
149
- "@tangle-network/agent-interface": "^5.7.1",
150
- "@tangle-network/agent-trace-contract": "^2.0.0",
151
- "zod": "4.6.6"
149
+ "@tangle-network/agent-interface": "^5.8.1",
150
+ "@tangle-network/agent-trace-contract": "^2.1.0",
151
+ "zod": "^4.6.6"
152
152
  },
153
153
  "peerDependencies": {
154
154
  "@modelcontextprotocol/sdk": "^1.30.0"
@@ -159,11 +159,11 @@
159
159
  }
160
160
  },
161
161
  "devDependencies": {
162
- "@modelcontextprotocol/sdk": "^1.30.1",
163
- "@types/node": "26.6.3",
164
- "tsdown": "0.23.0",
165
- "typescript": "7.0.2",
166
- "vitest": "5.0.2"
162
+ "@modelcontextprotocol/sdk": "^1.32.2",
163
+ "@types/node": "26.6.5",
164
+ "tsdown": "0.23.2",
165
+ "typescript": "6.0.3",
166
+ "vitest": "5.0.5"
167
167
  },
168
168
  "scripts": {
169
169
  "build": "tsdown",
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-68is3nof.d.ts","names":[],"sources":["../src/telemetry/content-attributes.ts","../src/telemetry/genai-attributes.ts","../src/telemetry/spine-attributes.ts","../src/telemetry/token-usage.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAiCiB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;;;;;KAMU,qBAAqB;;cAYpB;;cAEA;;cAEA;;cAEA;;cAEA;;;;;;;;cA+JA;;;;cAOA,mBAAmB,SAAS,eAAe;;;iBAKxC,eAAe;;;;iBAWf,gBAAgB;;;;;;;;;cAyKnB;;;;;;;;iBAoNG,2BACd,KAAK,6CACJ;;;;;;;iBAyGa,eACd,YAAY,6CACX;;;;;iBA0Ba,WACd,YAAY;;;;;;;;;;;;;;iBAkCE,oBACd,YAAY,4CACZ,kCACC;;;;;;;;;;;;;;iBA2Ca,cACd,KAAK;;;;;;UA6BU;EACf;;EAEA;;;;;;;;;;;;iBAac,sBACd,MAAM,6CACL;;;;;;;;;;iBA6Ba,iBAAiB,SAAS;;;;;;;;;;;;;;;;;;cCl4B7B;;cAEA;;cAEA;;cAEA;;;;;;cAOA;;cAIA;;cAGA;;cAEA;;cAGA;;;;;cAMA;;cAGA;;UAGI;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;;;;;;;;iBAcc,qBACd,OAAO,aACN;;;;;;;;;;;;;;;;;;;;;;;;cCjEU;;cAEA;;cAEA;;cAEA;;cAEA;;cAEA;;cAEA;;cAEA;;;cAGA;;cAGA;;;;;;cAUA;;cASA;;cAOA;;;;;;cAUA;;;cAUA;;cAKA;;;;;;;;;;;;;;;;;;;;cC5EA;cAQA;cAQA;;;;;;;;;;;;;;;;;;;;;;;cA8BA;cAQA;cASA;cAGA;;;;cAYA;;;;;;;;;;;;;;;cAqBA;cAMA;cAIA;;;;;;;;;;;UAaI;;EAEf;EACA;;;;EAIA;;EAEA;;iBAGc,WAAW;iBAeX,gBACd,QAAQ,qCACR;iBAwBc,kBACd,QAAQ,qCACR;iBAUc,iBACd,MAAM,0BACL;iBA2Ga,eACd,MAAM,0BACL;iBA4Ba,iBACd,MAAM;iBAkBQ,cACd,SAAS,8BACT,MAAM,mBACL;;;;iBAqBa,aAAa,OAAO;;;;iBAWpB,aAAa,OAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-BFYASYJk.d.ts","names":[],"sources":["../src/errors/index.ts"],"mappings":";;;;;;;KAOY;;cAaC,iBAAiB;WACnB,MAAM;WACN;WACA;WACA;WACA,UAAU;EAEnB,YACE,iBACA;IACE,MAAM;IACN;IACA;IACA;IACA,UAAU;IACV,QAAQ;;UAaJ;;SAYD,aAAa,gBAAgB,iBAAiB;;SAgE9C,UAAU,iBAAiB;;;;;;;;;;;;;;;;;iBA8CnB;;EAwCf;;;iBASc,WAAW,iBAAiB,SAAS;;iBAKrC,YAAY"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-CKDeaS7l.d.ts","names":[],"sources":["../src/resilience/circuit-breaker.ts","../src/resilience/protection.ts","../src/resilience/timeout.ts"],"mappings":";;KAeY;UAEK;;EAEf;;EAEA;;EAEA;;EAEA,iBAAiB;;UAGF;EACf,OAAO;EACP;EACA;EACA;EACA;EACA;EACA;;cAGW,yBAAyB;WAC3B;WACA;EAET,YAAY,cAAc;;cAaf;mBAYQ;mBACA;UAZX;UACA;UACA;UACA;UAGA;UACA;UACA;EAER,YACmB,cACA,QAAQ;;;;;EAiBrB,QAAQ,GAAG,UAAU,QAAQ,KAAK,QAAQ;UA6BxC;UAiBA;;EAwBR,YAAY;;EAKZ,YAAY;;EAaZ;;EAcA;;EAQA;;;;UC5Le;;EAEf;;EAEA,UAAU;;EAEV;;;;;;;;;;;iBAYoB,eAAe,GACnC,UAAU,QAAQ,IAClB,UAAS,oBACR,QAAQ;;;;iBAoBK,kBAAkB,yBAAyB,SACzD,QAAQ,MAAM,UAAU,QAAQ,UAChC,SAAS,wBACJ,MAAM,UAAU,QAAQ;;;cC3ClB,qBAAqB;WACvB;EAET,YAAY,iBAAiB;;;;;;iBAef,YAAY,GAC1B,SAAS,QAAQ,IACjB,mBACA,mBACC,QAAQ;;;;;iBA2BK,wBAAwB;EACtC,YAAY;EACZ;;;;;;iBAuBc,MAAM,YAAY,SAAS,cAAc"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-CQPGv8jg.d.ts","names":[],"sources":["../src/types/events.ts"],"mappings":";;;cAsCa,sBAAoB,EAAA;;;;;;;;;;;;;;;KAgBrB,iBAAiB,EAAE,aAAa;UAG3B;EACf;EACA;EACA;EACA;;UAOe;EACf;EACA,MAAM;EACN;EACA,QAAQ;;UAIO;EACf;EACA,QAAQ;EACR;EACA,QAAQ;;UAIO;EACf;EACA;EACA;EACA;EACA,QAAQ;;UAIO;EACf;EACA;EACA,QAAQ;;UAIO;EACf;EACA;EACA;EACA;EACA;EACA,QAAQ;;UAIO;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;;UAIe;EACf;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;;UAIe;EACf;EACA;EACA;EACA;IAAS;IAAkB;;;UAIZ;EACf;EACA;EACA;EACA,aAAa;EACb,SAAS;EACT,WAAW;;UAII;EACf;EACA;;KAIU,aACR,0BACA,cACA,aACA,iBACA,sBACA,mBACA,iBACA,wBACA,0BACA,uBACA,sBACA,cACA;UAGa;EACf;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;;KAGU,gBACR,oBACA,sBACA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-CuBvSsBf.d.ts","names":[],"sources":["../src/events/buffer.ts","../src/events/channel.ts","../src/events/deduplication.ts"],"mappings":";;;;;;;UAOiB;;EAEf;;EAEA;;EAEA;;UAGe,cAAc;EAC7B;EACA,MAAM;EACN;EACA;;cASW,YAAY;mBACN;UACT;UACA;UACA;EAER,YAAY,SAAQ,QAAQ;;EAM5B,KAAK,YAAY,MAAM,GAAG;;EA6B1B,UAAU,cAAc;;EAMxB,SAAS,sBAAsB,cAAc;;EAU7C,kBAAkB,oBAAoB,cAAc;;EAMpD;;EAMA;;EAKA;;EAKA;;EAKA;UAQQ;UASA;;;;;;;;;;KC3HE,eAAe,gBAAgB,SAAS,GAAG;UAEtC;;EAEf;;EAEA;;cAcW,aAAa;mBACP;mBACA;EAEjB,YAAY,SAAQ,QAAQ;;;;;;;;;;;;EAe5B,UAAU,iBAAiB,SAAS,eAAe;;;;;EAuBnD,QAAQ,eAAe,SAAS;;;;EAoBhC,eAAe;;;;EAOf,gBAAgB;;;;EAOhB;;;;EAOA;;;;EAOA;UAIQ;UAOA;;;;;;;;;;UCzHO;;EAEf;;EAEA;;cAYW;mBACM;mBACA;UACT;EAER,YAAY,SAAQ,QAAQ;;;;;EAS5B,YAAY;;;;EAoBZ,SAAS;;;;EAUT,QAAQ;;;;EASR;;;;EAOA;;;;EAOA;UAQQ;UAQA;UASA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-Dq6SfGaX.d.ts","names":[],"sources":["../src/transport/types.ts","../src/transport/connection-manager.ts","../src/transport/interface.ts","../src/transport/mock.ts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tokens-browser-DCV3-WHc.d.ts","names":[],"sources":["../src/auth/shared-providers.ts","../src/auth/types.ts","../src/auth/tokens-browser.ts"],"mappings":";;;;UAUiB;;EAEf,YAAY;;EAEZ,iBAAiB;;EAEjB,iBAAiB,OAAO,WAAW;;;cAIxB,2BAA2B;UAClB;EAApB,YAAoB;EAEd,YAAY;EAIlB,SAAS;;;cAME,gCAAgC;UAOjC;UANF;UACA;UACA;UACA;EAER,YACU;IACN;IACA;IACA;IACA,YAAY,yBAAyB;MACnC;MACA;MACA;;IAEF,mBAAmB,OAAO;;IAE1B;;EAQE,YAAY;EAWZ,gBAAgB;UAeR;EAqBR,gBAAgB,OAAO,WAAW;;EAQxC;;;cAMW,kBAAkB;EACvB,YAAY;;;;;;cASP,wBAAwB;UAEzB;EADV,YACU,kCAAkC;EAGtC,YAAY;;;;;;cASP,yBAAyB;UAO1B;UANF;UACA;UACA;UACA;EAER,YACU;IACN;IACA;IACA,iBAAiB;MAAU;MAAe;;IAC1C,cAAc;IACd,mBAAmB,OAAO;;IAE1B;;IAEA;;EAOE,YAAY;EAoBZ,gBAAgB;UAeR;;EAgBd;;EAKA;;;;;;;cCpNW,eAAa,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6FvB,EAAA,KAAA;KAES,UAAU,EAAE,aAAa;;;;;;;;KASzB;;;;;cA6BC,iCAA+B,EAAA;;;;;;;;;;GAO1C,EAAA,KAAA;;;;;cAMW,iCAA+B,EAAA;;;;;;;;;;GAO1C,EAAA,KAAA;;;;;cAMW,+BAA6B,EAAA;;;;;;;;;;GAOxC,EAAA,KAAA;;;;;;;;;;;cAYW,wBAAsB,EAAA,mBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAIjC,EAAA,KAAA;KAEU,mBAAmB,EAAE,aAAa;KAClC,4BAA4B,EAAE,aACjC;KAEG,4BAA4B,EAAE,aACjC;KAEG,0BAA0B,EAAE,aAC/B;;;;UAMQ;EACf;EACA,UAAU;;EAEV,QAAQ;EACR;EACA;;;;;UAae;EACf;IACE;IACA;;EAEF;IACE;IACA;IACA;;;;;;UAOa;EACf;EACA,SAAS;EACT;;;;;cAMW,4BAA0B,EAAA;;;;;;;;;;;;;;;;GAmBrC,EAAA,KAAA;KAEU,uBAAuB,EAAE,aAAa;;;;UAKjC;EACf;EACA;EACA;;;;;;;;;;;cAYW,0BAAwB,EAAA;;;;;;;GAUnC,EAAA,KAAA;KAEU,qBAAqB,EAAE,aAAa;;;;;;;iBC1QhC,YAAY,gBAAgB;;;;;iBAkB5B,YAAY,SAAS;;;;iBAQrB,oBACd,SAAS,kBACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tools-DeZkIW3h.d.ts","names":[],"sources":["../src/interactions/broker.ts","../src/interactions/tools.ts"],"mappings":";;;cAkBa;cACA;UAEI;;EAEf;;cAGW,2BAAyB,EAAA;;;;;;;GAWpC,EAAA,KAAA;KACU,sBAAsB,EAAE,aAAa;;iBA+BjC,sBAAsB,iBAAiB;;iBASvC,iCACd,MAAM;;iBAmBQ,kCACd,WAAW,wBACV;KA0CE,wBAAwB,OAAO;;;;;;;cA4BvB;mBACM;mBACA;mBACA;EAEjB,YAAY,UAAS;UAMb;;EAOR,QAAQ;IACN;IACA;IACA,SAAS;IACT;IACA;IACA,gBAAgB;IAChB;IACA,SAAS;IACT,OAAO;MACL,QAAQ;;EA6EZ,QAAQ;;EAkBR,gBAAgB;IACd;IACA;IACA,SAAS;IACT,WAAW;IACX;IACA,SAAS;IACT,OAAO;MACL;;EA2DJ,gBAAgB;;EAoBhB,YAAY;;EAUZ,cAAc,SAAS;;;;;KC1Xb,0BAA0B;EACpC;EACA,OAAO;EACP;EACA;EACA,SAAS;MACL;;KAGM,iBAAiB;EAC3B,WAAW;EACX;EACA,SAAS;MACL;;KAGM,2BAA2B;EACrC;EACA,OAAO;EACP;EACA,SAAS;MACL;EAAU;EAAkB;;;KAGtB,qBAAqB;EAC/B;EACA;MACI,QAAQ;UAEG;EACf,SAAS;EACT,mBAAmB;EACnB;;;iBAIc,uBACd,QAAQ,mBACR;EACE;EACA,SAAS;EACT;EACA,QAAQ,OAAO;IAEhB"}