asgard-js-core-ink 0.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,415 @@
1
+ # AsgardJs Core
2
+
3
+ This package contains the core functionalities of the AsgardJs SDK, providing essential tools for interacting with the Asgard AI platform through Server-Sent Events (SSE) and conversation management.
4
+
5
+ ## Installation
6
+
7
+ To install the core package, use the following command:
8
+
9
+ ```sh
10
+ npm install @asgard-js/core
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ Here's a basic example of how to use the core package:
16
+
17
+ ```javascript
18
+ import { AsgardServiceClient } from '@asgard-js/core';
19
+
20
+ const client = new AsgardServiceClient({
21
+ apiKey: 'your-api-key',
22
+ botProviderEndpoint: 'https://api.asgard-ai.com/ns/{namespace}/bot-provider/{botProviderId}',
23
+ debugMode: true, // Enable to see deprecation warnings
24
+ });
25
+
26
+ // Use the client to send messages via SSE
27
+ client.fetchSse({
28
+ customChannelId: 'your-channel-id',
29
+ text: 'Hello, Asgard!',
30
+ action: 'message',
31
+ });
32
+
33
+ // Upload files (optional, requires uploadFile method)
34
+ if (client.uploadFile) {
35
+ const fileInput = document.querySelector('input[type="file"]');
36
+ const file = fileInput.files[0];
37
+
38
+ try {
39
+ const uploadResponse = await client.uploadFile(file, 'your-channel-id');
40
+
41
+ if (uploadResponse.isSuccess && uploadResponse.data[0]) {
42
+ const blobId = uploadResponse.data[0].blobId;
43
+
44
+ // Send message with uploaded file
45
+ client.fetchSse({
46
+ customChannelId: 'your-channel-id',
47
+ text: 'Here is my image:',
48
+ action: 'message',
49
+ blobIds: [blobId],
50
+ });
51
+ }
52
+ } catch (error) {
53
+ console.error('File upload failed:', error);
54
+ }
55
+ }
56
+
57
+ // Listen to events
58
+ client.on('MESSAGE', response => {
59
+ console.log('Received message:', response);
60
+ });
61
+
62
+ client.on('DONE', response => {
63
+ console.log('Conversation completed:', response);
64
+ });
65
+
66
+ client.on('ERROR', error => {
67
+ console.error('Error occurred:', error);
68
+ });
69
+ ```
70
+
71
+ ## Migration from `endpoint` to `botProviderEndpoint`
72
+
73
+ **Important**: The `endpoint` configuration option is deprecated. Use `botProviderEndpoint` instead for simplified configuration.
74
+
75
+ ### Before (Deprecated)
76
+
77
+ ```javascript
78
+ const client = new AsgardServiceClient({
79
+ apiKey: 'your-api-key',
80
+ endpoint: 'https://api.asgard-ai.com/ns/{namespace}/bot-provider/{botProviderId}/message/sse',
81
+ botProviderEndpoint: 'https://api.asgard-ai.com/ns/{namespace}/bot-provider/{botProviderId}',
82
+ });
83
+ ```
84
+
85
+ ### After (Recommended)
86
+
87
+ ```javascript
88
+ const client = new AsgardServiceClient({
89
+ apiKey: 'your-api-key',
90
+ botProviderEndpoint: 'https://api.asgard-ai.com/ns/{namespace}/bot-provider/{botProviderId}',
91
+ // SSE endpoint is automatically derived as: botProviderEndpoint + '/message/sse'
92
+ });
93
+ ```
94
+
95
+ **Benefits:**
96
+
97
+ - Simplified configuration with single endpoint
98
+ - Reduced chance of configuration errors
99
+ - Automatic endpoint derivation
100
+
101
+ **Backward Compatibility:** Existing code using `endpoint` will continue to work but may show deprecation warnings when `debugMode` is enabled.
102
+
103
+ ## API Reference
104
+
105
+ The core package exports three main classes for different levels of abstraction and includes authentication types for dynamic API key management:
106
+
107
+ ### AsgardServiceClient
108
+
109
+ The main client class for interacting with the Asgard AI platform.
110
+
111
+ #### Constructor Options (ClientConfig)
112
+
113
+ - **apiKey**: `string` (optional) - API key for authentication. Can be provided later via dynamic authentication
114
+ - **botProviderEndpoint**: `string` (required) - Bot provider endpoint URL (SSE endpoint will be auto-derived)
115
+ - **endpoint?**: `string` (deprecated) - Legacy API endpoint URL. Use `botProviderEndpoint` instead.
116
+ - **debugMode?**: `boolean` - Enable debug mode for deprecation warnings, defaults to `false`
117
+ - **transformSsePayload?**: `(payload: FetchSsePayload) => FetchSsePayload` - SSE payload transformer
118
+ - **onRunInit?**: `InitEventHandler` - Handler for run initialization events
119
+ - **onMessage?**: `MessageEventHandler` - Handler for message events
120
+ - **onToolCall?**: `ToolCallEventHandler` - Handler for tool call events
121
+ - **onProcess?**: `ProcessEventHandler` - Handler for process events
122
+ - **onRunDone?**: `DoneEventHandler` - Handler for run completion events
123
+ - **onRunError?**: `ErrorEventHandler` - Error handler for execution errors
124
+
125
+ #### Methods
126
+
127
+ - **fetchSse(payload, options?)**: Send a message via Server-Sent Events
128
+ - **uploadFile(file, customChannelId)**: Upload file to Blob API and return BlobUploadResponse
129
+ - **on(event, handler)**: Listen to specific SSE events
130
+ - **close()**: Close the SSE connection and cleanup resources
131
+
132
+ #### Event Types
133
+
134
+ - **INIT**: Run initialization events
135
+ - **MESSAGE**: Message events (start, delta, complete)
136
+ - **TOOL_CALL**: Tool call events (start, complete)
137
+ - **PROCESS**: Process events (start, complete)
138
+ - **DONE**: Run completion events
139
+ - **ERROR**: Error events
140
+
141
+ ### Channel
142
+
143
+ Higher-level abstraction for managing a conversation channel with reactive state management using RxJS.
144
+
145
+ #### Static Methods
146
+
147
+ - **Channel.reset(config, payload?, options?)**: `Promise<Channel>` - Create and initialize a new channel
148
+
149
+ #### Instance Methods
150
+
151
+ - **sendMessage(payload, options?)**: `Promise<void>` - Send a message through the channel
152
+ - **close()**: `void` - Close the channel and cleanup subscriptions
153
+
154
+ #### Configuration (ChannelConfig)
155
+
156
+ - **client**: `IAsgardServiceClient` - Instance of AsgardServiceClient
157
+ - **customChannelId**: `string` - Unique channel identifier
158
+ - **customMessageId?**: `string` - Optional message ID
159
+ - **conversation**: `Conversation` - Initial conversation state
160
+ - **statesObserver?**: `ObserverOrNext<ChannelStates>` - Observer for channel state changes
161
+
162
+ #### Properties
163
+
164
+ - **customChannelId**: `string` - The channel identifier
165
+ - **customMessageId?**: `string` - Optional message identifier
166
+
167
+ #### Example Usage
168
+
169
+ ```javascript
170
+ import { AsgardServiceClient, Channel, Conversation } from '@asgard-js/core';
171
+
172
+ const client = new AsgardServiceClient({
173
+ botProviderEndpoint: 'https://api.example.com/bot-provider/123',
174
+ apiKey: 'your-api-key',
175
+ });
176
+
177
+ const conversation = new Conversation({ messages: new Map() });
178
+
179
+ const channel = await Channel.reset({
180
+ client,
181
+ customChannelId: 'channel-123',
182
+ conversation,
183
+ statesObserver: states => {
184
+ console.log('Connection status:', states.isConnecting);
185
+ console.log('Messages:', Array.from(states.conversation.messages.values()));
186
+ },
187
+ });
188
+
189
+ // Send a message
190
+ await channel.sendMessage({ text: 'Hello, bot!' });
191
+ ```
192
+
193
+ ### Conversation
194
+
195
+ Immutable conversation state manager that handles message updates and SSE event processing.
196
+
197
+ #### Constructor
198
+
199
+ - **constructor(options)**: Initialize conversation with `{messages: Map<string, ConversationMessage> | null}`
200
+
201
+ #### Methods
202
+
203
+ - **pushMessage(message)**: `Conversation` - Add a new message (returns new instance)
204
+ - **onMessage(response)**: `Conversation` - Process SSE response and update conversation
205
+
206
+ #### Properties
207
+
208
+ - **messages**: `Map<string, ConversationMessage> | null` - Map of all messages in the conversation
209
+
210
+ #### Message Types
211
+
212
+ - **ConversationUserMessage**: User-sent messages with `text` and `time`
213
+ - **ConversationBotMessage**: Bot responses with `message`, `isTyping`, `typingText`, `eventType`
214
+ - **ConversationErrorMessage**: Error messages with `error` details
215
+
216
+ #### Example Usage
217
+
218
+ ```javascript
219
+ import { Conversation } from '@asgard-js/core';
220
+
221
+ // Create new conversation
222
+ const conversation = new Conversation({ messages: new Map() });
223
+
224
+ // Add a user message
225
+ const userMessage = {
226
+ id: 'msg-1',
227
+ type: 'user',
228
+ text: 'Hello',
229
+ time: Date.now(),
230
+ };
231
+
232
+ const updatedConversation = conversation.pushMessage(userMessage);
233
+ console.log('Messages:', Array.from(updatedConversation.messages.values()));
234
+ ```
235
+
236
+ ### File Upload API
237
+
238
+ The core package includes file upload capabilities for sending images through the chatbot.
239
+
240
+ ```typescript
241
+ // Upload file and send message with attachment
242
+ const uploadResponse = await client.uploadFile(file, customChannelId);
243
+
244
+ if (uploadResponse.isSuccess && uploadResponse.data[0]) {
245
+ const blobId = uploadResponse.data[0].blobId;
246
+
247
+ client.fetchSse({
248
+ customChannelId: 'your-channel-id',
249
+ text: 'Here is my image',
250
+ action: 'message',
251
+ blobIds: [blobId],
252
+ });
253
+ }
254
+ ```
255
+
256
+ **Note**: `uploadFile` is optional - check `client.uploadFile` exists before use. Supports JPEG, PNG, GIF, WebP up to 20MB.
257
+
258
+ ### Authentication Types
259
+
260
+ The core package includes authentication-related types for dynamic API key management:
261
+
262
+ #### AuthState
263
+
264
+ Authentication state management for applications requiring dynamic API key input:
265
+
266
+ ```typescript
267
+ type AuthState = 'loading' | 'needApiKey' | 'authenticated' | 'error' | 'invalidApiKey';
268
+ ```
269
+
270
+ **States:**
271
+
272
+ - **`loading`**: Authentication in progress
273
+ - **`needApiKey`**: User needs to provide API key
274
+ - **`authenticated`**: Successfully authenticated
275
+ - **`error`**: General authentication error
276
+ - **`invalidApiKey`**: API key is invalid
277
+
278
+ **Usage:**
279
+
280
+ ```typescript
281
+ import { AuthState } from '@asgard-js/core';
282
+
283
+ function handleAuthState(state: AuthState) {
284
+ switch (state) {
285
+ case 'needApiKey':
286
+ // Show API key input interface
287
+ break;
288
+ case 'authenticated':
289
+ // Initialize chatbot normally
290
+ break;
291
+ // Handle other states...
292
+ }
293
+ }
294
+ ```
295
+
296
+ ## Testing
297
+
298
+ The core package includes comprehensive tests using Vitest.
299
+
300
+ ### Running Tests
301
+
302
+ ```sh
303
+ # Run tests once
304
+ npm run test:core
305
+
306
+ # Run tests in watch mode
307
+ npm run test:core:watch
308
+
309
+ # Run tests with UI
310
+ npm run test:core:ui
311
+
312
+ # Run tests with coverage
313
+ npm run test:core:coverage
314
+ ```
315
+
316
+ ### Test Structure
317
+
318
+ Tests are located alongside source files with `.spec.ts` extensions:
319
+
320
+ - `src/lib/client.spec.ts` - Tests for AsgardServiceClient including deprecation scenarios
321
+ - Test environment: jsdom with Vitest
322
+ - Coverage reports available in `test-output/vitest/coverage/`
323
+
324
+ ### Writing Tests
325
+
326
+ The package uses Vitest for testing with the following setup:
327
+
328
+ - TypeScript support
329
+ - jsdom environment for DOM APIs
330
+ - ESLint integration
331
+ - Coverage reporting with v8 provider
332
+
333
+ Example test structure:
334
+
335
+ ```javascript
336
+ import { describe, it, expect } from 'vitest';
337
+ import { AsgardServiceClient } from './client';
338
+
339
+ describe('AsgardServiceClient', () => {
340
+ it('should create client with botProviderEndpoint', () => {
341
+ const client = new AsgardServiceClient({
342
+ botProviderEndpoint: 'https://api.example.com/bot-provider/bp-123',
343
+ apiKey: 'test-key',
344
+ });
345
+
346
+ expect(client).toBeDefined();
347
+ });
348
+ });
349
+ ```
350
+
351
+ ## Development
352
+
353
+ To develop the core package locally, follow these steps:
354
+
355
+ 1. Clone the repository and navigate to the project root directory.
356
+
357
+ 2. Install dependencies:
358
+
359
+ ```sh
360
+ npm install
361
+ ```
362
+
363
+ 3. Start development:
364
+
365
+ You can use the following commands to work with the core package:
366
+
367
+ ```sh
368
+ # Lint the core package
369
+ npm run lint:core
370
+
371
+ # Run tests
372
+ npm run test:core
373
+
374
+ # Build the package
375
+ npm run build:core
376
+
377
+ # Watch mode for development
378
+ npm run watch:core
379
+ ```
380
+
381
+ Setup your npm registry token for npm publishing:
382
+
383
+ ```sh
384
+ cd ~/
385
+ touch .npmrc
386
+ echo "//registry.npmjs.org/:_authToken={{YOUR_TOKEN}}" >> .npmrc
387
+ ```
388
+
389
+ For working with both core and React packages:
390
+
391
+ ```sh
392
+ # Lint both packages
393
+ npm run lint:packages
394
+
395
+ # Test both packages
396
+ npm test
397
+
398
+ # Build core package (required for React package)
399
+ npm run build:core
400
+ npm run build:react
401
+
402
+ # Release packages
403
+ npm run release:core # Release core package
404
+ npm run release:react # Release React package
405
+ ```
406
+
407
+ All builds will be available in the `dist` directory.
408
+
409
+ ## Contributing
410
+
411
+ We welcome contributions! Please read our [contributing guide](../../CONTRIBUTING.md) to get started.
412
+
413
+ ## License
414
+
415
+ This project is licensed under the MIT License - see the [LICENSE](../../LICENSE) file for details.
@@ -0,0 +1,31 @@
1
+ export declare enum FetchSseAction {
2
+ RESET_CHANNEL = "RESET_CHANNEL",
3
+ NONE = "NONE"
4
+ }
5
+ export declare enum EventType {
6
+ INIT = "asgard.run.init",
7
+ PROCESS = "asgard.process",
8
+ PROCESS_START = "asgard.process.start",
9
+ PROCESS_COMPLETE = "asgard.process.complete",
10
+ MESSAGE = "asgard.message",
11
+ MESSAGE_START = "asgard.message.start",
12
+ MESSAGE_DELTA = "asgard.message.delta",
13
+ MESSAGE_COMPLETE = "asgard.message.complete",
14
+ TOOL_CALL = "asgard.tool_call",
15
+ TOOL_CALL_START = "asgard.tool_call.start",
16
+ TOOL_CALL_COMPLETE = "asgard.tool_call.complete",
17
+ DONE = "asgard.run.done",
18
+ ERROR = "asgard.run.error"
19
+ }
20
+ export declare enum MessageTemplateType {
21
+ TEXT = "TEXT",
22
+ HINT = "HINT",
23
+ BUTTON = "BUTTON",
24
+ IMAGE = "IMAGE",
25
+ VIDEO = "VIDEO",
26
+ AUDIO = "AUDIO",
27
+ LOCATION = "LOCATION",
28
+ CAROUSEL = "CAROUSEL",
29
+ CHART = "CHART"
30
+ }
31
+ //# sourceMappingURL=enum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enum.d.ts","sourceRoot":"","sources":["../../src/constants/enum.ts"],"names":[],"mappings":"AAAA,oBAAY,cAAc;IACxB,aAAa,kBAAkB;IAC/B,IAAI,SAAS;CACd;AAED,oBAAY,SAAS;IACnB,IAAI,oBAAoB;IACxB,OAAO,mBAAmB;IAC1B,aAAa,yBAAyB;IACtC,gBAAgB,4BAA4B;IAC5C,OAAO,mBAAmB;IAC1B,aAAa,yBAAyB;IACtC,aAAa,yBAAyB;IACtC,gBAAgB,4BAA4B;IAC5C,SAAS,qBAAqB;IAC9B,eAAe,2BAA2B;IAC1C,kBAAkB,8BAA8B;IAChD,IAAI,oBAAoB;IACxB,KAAK,qBAAqB;CAC3B;AAED,oBAAY,mBAAmB;IAC7B,IAAI,SAAS;IACb,IAAI,SAAS;IACb,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,KAAK,UAAU;IACf,KAAK,UAAU;IACf,QAAQ,aAAa;IACrB,QAAQ,aAAa;IACrB,KAAK,UAAU;CAChB"}
package/dist/index.cjs ADDED
@@ -0,0 +1,5 @@
1
+ "use strict";var Ge=Object.defineProperty;var Fe=(r,t,e)=>t in r?Ge(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e;var b=(r,t,e)=>Fe(r,typeof t!="symbol"?t+"":t,e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var N=(r=>(r.RESET_CHANNEL="RESET_CHANNEL",r.NONE="NONE",r))(N||{}),h=(r=>(r.INIT="asgard.run.init",r.PROCESS="asgard.process",r.PROCESS_START="asgard.process.start",r.PROCESS_COMPLETE="asgard.process.complete",r.MESSAGE="asgard.message",r.MESSAGE_START="asgard.message.start",r.MESSAGE_DELTA="asgard.message.delta",r.MESSAGE_COMPLETE="asgard.message.complete",r.TOOL_CALL="asgard.tool_call",r.TOOL_CALL_START="asgard.tool_call.start",r.TOOL_CALL_COMPLETE="asgard.tool_call.complete",r.DONE="asgard.run.done",r.ERROR="asgard.run.error",r))(h||{}),he=(r=>(r.TEXT="TEXT",r.HINT="HINT",r.BUTTON="BUTTON",r.IMAGE="IMAGE",r.VIDEO="VIDEO",r.AUDIO="AUDIO",r.LOCATION="LOCATION",r.CAROUSEL="CAROUSEL",r.CHART="CHART",r))(he||{}),W=function(r,t){return W=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,n){e.__proto__=n}||function(e,n){for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i])},W(r,t)};function A(r,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");W(r,t);function e(){this.constructor=r}r.prototype=t===null?Object.create(t):(e.prototype=t.prototype,new e)}function Ve(r,t,e,n){function i(o){return o instanceof e?o:new e(function(s){s(o)})}return new(e||(e=Promise))(function(o,s){function a(l){try{u(n.next(l))}catch(d){s(d)}}function c(l){try{u(n.throw(l))}catch(d){s(d)}}function u(l){l.done?o(l.value):i(l.value).then(a,c)}u((n=n.apply(r,t||[])).next())})}function ve(r,t){var e={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]},n,i,o,s=Object.create((typeof Iterator=="function"?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),typeof Symbol=="function"&&(s[Symbol.iterator]=function(){return this}),s;function a(u){return function(l){return c([u,l])}}function c(u){if(n)throw new TypeError("Generator is already executing.");for(;s&&(s=0,u[0]&&(e=0)),e;)try{if(n=1,i&&(o=u[0]&2?i.return:u[0]?i.throw||((o=i.return)&&o.call(i),0):i.next)&&!(o=o.call(i,u[1])).done)return o;switch(i=0,o&&(u=[u[0]&2,o.value]),u[0]){case 0:case 1:o=u;break;case 4:return e.label++,{value:u[1],done:!1};case 5:e.label++,i=u[1],u=[0];continue;case 7:u=e.ops.pop(),e.trys.pop();continue;default:if(o=e.trys,!(o=o.length>0&&o[o.length-1])&&(u[0]===6||u[0]===2)){e=0;continue}if(u[0]===3&&(!o||u[1]>o[0]&&u[1]<o[3])){e.label=u[1];break}if(u[0]===6&&e.label<o[1]){e.label=o[1],o=u;break}if(o&&e.label<o[2]){e.label=o[2],e.ops.push(u);break}o[2]&&e.ops.pop(),e.trys.pop();continue}u=t.call(r,e)}catch(l){u=[6,l],i=0}finally{n=o=0}if(u[0]&5)throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}function L(r){var t=typeof Symbol=="function"&&Symbol.iterator,e=t&&r[t],n=0;if(e)return e.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function R(r,t){var e=typeof Symbol=="function"&&r[Symbol.iterator];if(!e)return r;var n=e.call(r),i,o=[],s;try{for(;(t===void 0||t-- >0)&&!(i=n.next()).done;)o.push(i.value)}catch(a){s={error:a}}finally{try{i&&!i.done&&(e=n.return)&&e.call(n)}finally{if(s)throw s.error}}return o}function U(r,t,e){if(e||arguments.length===2)for(var n=0,i=t.length,o;n<i;n++)(o||!(n in t))&&(o||(o=Array.prototype.slice.call(t,0,n)),o[n]=t[n]);return r.concat(o||Array.prototype.slice.call(t))}function M(r){return this instanceof M?(this.v=r,this):new M(r)}function qe(r,t,e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n=e.apply(r,t||[]),i,o=[];return i=Object.create((typeof AsyncIterator=="function"?AsyncIterator:Object).prototype),a("next"),a("throw"),a("return",s),i[Symbol.asyncIterator]=function(){return this},i;function s(f){return function(p){return Promise.resolve(p).then(f,d)}}function a(f,p){n[f]&&(i[f]=function(v){return new Promise(function(w,I){o.push([f,v,w,I])>1||c(f,v)})},p&&(i[f]=p(i[f])))}function c(f,p){try{u(n[f](p))}catch(v){y(o[0][3],v)}}function u(f){f.value instanceof M?Promise.resolve(f.value.v).then(l,d):y(o[0][2],f)}function l(f){c("next",f)}function d(f){c("throw",f)}function y(f,p){f(p),o.shift(),o.length&&c(o[0][0],o[0][1])}}function He(r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=r[Symbol.asyncIterator],e;return t?t.call(r):(r=typeof L=="function"?L(r):r[Symbol.iterator](),e={},n("next"),n("throw"),n("return"),e[Symbol.asyncIterator]=function(){return this},e);function n(o){e[o]=r[o]&&function(s){return new Promise(function(a,c){s=r[o](s),i(a,c,s.done,s.value)})}}function i(o,s,a,c){Promise.resolve(c).then(function(u){o({value:u,done:a})},s)}}function m(r){return typeof r=="function"}function ye(r){var t=function(n){Error.call(n),n.stack=new Error().stack},e=r(t);return e.prototype=Object.create(Error.prototype),e.prototype.constructor=e,e}var B=ye(function(r){return function(e){r(this),this.message=e?e.length+` errors occurred during unsubscription:
2
+ `+e.map(function(n,i){return i+1+") "+n.toString()}).join(`
3
+ `):"",this.name="UnsubscriptionError",this.errors=e}});function G(r,t){if(r){var e=r.indexOf(t);0<=e&&r.splice(e,1)}}var k=(function(){function r(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return r.prototype.unsubscribe=function(){var t,e,n,i,o;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=L(s),c=a.next();!c.done;c=a.next()){var u=c.value;u.remove(this)}}catch(v){t={error:v}}finally{try{c&&!c.done&&(e=a.return)&&e.call(a)}finally{if(t)throw t.error}}else s.remove(this);var l=this.initialTeardown;if(m(l))try{l()}catch(v){o=v instanceof B?v.errors:[v]}var d=this._finalizers;if(d){this._finalizers=null;try{for(var y=L(d),f=y.next();!f.done;f=y.next()){var p=f.value;try{ne(p)}catch(v){o=o??[],v instanceof B?o=U(U([],R(o)),R(v.errors)):o.push(v)}}}catch(v){n={error:v}}finally{try{f&&!f.done&&(i=y.return)&&i.call(y)}finally{if(n)throw n.error}}}if(o)throw new B(o)}},r.prototype.add=function(t){var e;if(t&&t!==this)if(this.closed)ne(t);else{if(t instanceof r){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(e=this._finalizers)!==null&&e!==void 0?e:[]).push(t)}},r.prototype._hasParent=function(t){var e=this._parentage;return e===t||Array.isArray(e)&&e.includes(t)},r.prototype._addParent=function(t){var e=this._parentage;this._parentage=Array.isArray(e)?(e.push(t),e):e?[e,t]:t},r.prototype._removeParent=function(t){var e=this._parentage;e===t?this._parentage=null:Array.isArray(e)&&G(e,t)},r.prototype.remove=function(t){var e=this._finalizers;e&&G(e,t),t instanceof r&&t._removeParent(this)},r.EMPTY=(function(){var t=new r;return t.closed=!0,t})(),r})(),pe=k.EMPTY;function me(r){return r instanceof k||r&&"closed"in r&&m(r.remove)&&m(r.add)&&m(r.unsubscribe)}function ne(r){m(r)?r():r.unsubscribe()}var Ke={Promise:void 0},Be={setTimeout:function(r,t){for(var e=[],n=2;n<arguments.length;n++)e[n-2]=arguments[n];return setTimeout.apply(void 0,U([r,t],R(e)))},clearTimeout:function(r){return clearTimeout(r)},delegate:void 0};function be(r){Be.setTimeout(function(){throw r})}function X(){}function D(r){r()}var Q=(function(r){A(t,r);function t(e){var n=r.call(this)||this;return n.isStopped=!1,e?(n.destination=e,me(e)&&e.add(n)):n.destination=Xe,n}return t.create=function(e,n,i){return new J(e,n,i)},t.prototype.next=function(e){this.isStopped||this._next(e)},t.prototype.error=function(e){this.isStopped||(this.isStopped=!0,this._error(e))},t.prototype.complete=function(){this.isStopped||(this.isStopped=!0,this._complete())},t.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,r.prototype.unsubscribe.call(this),this.destination=null)},t.prototype._next=function(e){this.destination.next(e)},t.prototype._error=function(e){try{this.destination.error(e)}finally{this.unsubscribe()}},t.prototype._complete=function(){try{this.destination.complete()}finally{this.unsubscribe()}},t})(k),Ye=(function(){function r(t){this.partialObserver=t}return r.prototype.next=function(t){var e=this.partialObserver;if(e.next)try{e.next(t)}catch(n){j(n)}},r.prototype.error=function(t){var e=this.partialObserver;if(e.error)try{e.error(t)}catch(n){j(n)}else j(t)},r.prototype.complete=function(){var t=this.partialObserver;if(t.complete)try{t.complete()}catch(e){j(e)}},r})(),J=(function(r){A(t,r);function t(e,n,i){var o=r.call(this)||this,s;return m(e)||!e?s={next:e??void 0,error:n??void 0,complete:i??void 0}:s=e,o.destination=new Ye(s),o}return t})(Q);function j(r){be(r)}function We(r){throw r}var Xe={closed:!0,next:X,error:We,complete:X},Z=(function(){return typeof Symbol=="function"&&Symbol.observable||"@@observable"})();function V(r){return r}function Je(r){return r.length===0?V:r.length===1?r[0]:function(e){return r.reduce(function(n,i){return i(n)},e)}}var S=(function(){function r(t){t&&(this._subscribe=t)}return r.prototype.lift=function(t){var e=new r;return e.source=this,e.operator=t,e},r.prototype.subscribe=function(t,e,n){var i=this,o=Qe(t)?t:new J(t,e,n);return D(function(){var s=i,a=s.operator,c=s.source;o.add(a?a.call(o,c):c?i._subscribe(o):i._trySubscribe(o))}),o},r.prototype._trySubscribe=function(t){try{return this._subscribe(t)}catch(e){t.error(e)}},r.prototype.forEach=function(t,e){var n=this;return e=ie(e),new e(function(i,o){var s=new J({next:function(a){try{t(a)}catch(c){o(c),s.unsubscribe()}},error:o,complete:i});n.subscribe(s)})},r.prototype._subscribe=function(t){var e;return(e=this.source)===null||e===void 0?void 0:e.subscribe(t)},r.prototype[Z]=function(){return this},r.prototype.pipe=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return Je(t)(this)},r.prototype.toPromise=function(t){var e=this;return t=ie(t),new t(function(n,i){var o;e.subscribe(function(s){return o=s},function(s){return i(s)},function(){return n(o)})})},r.create=function(t){return new r(t)},r})();function ie(r){var t;return(t=r??Ke.Promise)!==null&&t!==void 0?t:Promise}function ze(r){return r&&m(r.next)&&m(r.error)&&m(r.complete)}function Qe(r){return r&&r instanceof Q||ze(r)&&me(r)}function Ze(r){return m(r==null?void 0:r.lift)}function P(r){return function(t){if(Ze(t))return t.lift(function(e){try{return r(e,this)}catch(n){this.error(n)}});throw new TypeError("Unable to lift unknown Observable type")}}function O(r,t,e,n,i){return new et(r,t,e,n,i)}var et=(function(r){A(t,r);function t(e,n,i,o,s,a){var c=r.call(this,e)||this;return c.onFinalize=s,c.shouldUnsubscribe=a,c._next=n?function(u){try{n(u)}catch(l){e.error(l)}}:r.prototype._next,c._error=o?function(u){try{o(u)}catch(l){e.error(l)}finally{this.unsubscribe()}}:r.prototype._error,c._complete=i?function(){try{i()}catch(u){e.error(u)}finally{this.unsubscribe()}}:r.prototype._complete,c}return t.prototype.unsubscribe=function(){var e;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){var n=this.closed;r.prototype.unsubscribe.call(this),!n&&((e=this.onFinalize)===null||e===void 0||e.call(this))}},t})(Q),tt=ye(function(r){return function(){r(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"}}),ee=(function(r){A(t,r);function t(){var e=r.call(this)||this;return e.closed=!1,e.currentObservers=null,e.observers=[],e.isStopped=!1,e.hasError=!1,e.thrownError=null,e}return t.prototype.lift=function(e){var n=new oe(this,this);return n.operator=e,n},t.prototype._throwIfClosed=function(){if(this.closed)throw new tt},t.prototype.next=function(e){var n=this;D(function(){var i,o;if(n._throwIfClosed(),!n.isStopped){n.currentObservers||(n.currentObservers=Array.from(n.observers));try{for(var s=L(n.currentObservers),a=s.next();!a.done;a=s.next()){var c=a.value;c.next(e)}}catch(u){i={error:u}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(i)throw i.error}}}})},t.prototype.error=function(e){var n=this;D(function(){if(n._throwIfClosed(),!n.isStopped){n.hasError=n.isStopped=!0,n.thrownError=e;for(var i=n.observers;i.length;)i.shift().error(e)}})},t.prototype.complete=function(){var e=this;D(function(){if(e._throwIfClosed(),!e.isStopped){e.isStopped=!0;for(var n=e.observers;n.length;)n.shift().complete()}})},t.prototype.unsubscribe=function(){this.isStopped=this.closed=!0,this.observers=this.currentObservers=null},Object.defineProperty(t.prototype,"observed",{get:function(){var e;return((e=this.observers)===null||e===void 0?void 0:e.length)>0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(e){return this._throwIfClosed(),r.prototype._trySubscribe.call(this,e)},t.prototype._subscribe=function(e){return this._throwIfClosed(),this._checkFinalizedStatuses(e),this._innerSubscribe(e)},t.prototype._innerSubscribe=function(e){var n=this,i=this,o=i.hasError,s=i.isStopped,a=i.observers;return o||s?pe:(this.currentObservers=null,a.push(e),new k(function(){n.currentObservers=null,G(a,e)}))},t.prototype._checkFinalizedStatuses=function(e){var n=this,i=n.hasError,o=n.thrownError,s=n.isStopped;i?e.error(o):s&&e.complete()},t.prototype.asObservable=function(){var e=new S;return e.source=this,e},t.create=function(e,n){return new oe(e,n)},t})(S),oe=(function(r){A(t,r);function t(e,n){var i=r.call(this)||this;return i.destination=e,i.source=n,i}return t.prototype.next=function(e){var n,i;(i=(n=this.destination)===null||n===void 0?void 0:n.next)===null||i===void 0||i.call(n,e)},t.prototype.error=function(e){var n,i;(i=(n=this.destination)===null||n===void 0?void 0:n.error)===null||i===void 0||i.call(n,e)},t.prototype.complete=function(){var e,n;(n=(e=this.destination)===null||e===void 0?void 0:e.complete)===null||n===void 0||n.call(e)},t.prototype._subscribe=function(e){var n,i;return(i=(n=this.source)===null||n===void 0?void 0:n.subscribe(e))!==null&&i!==void 0?i:pe},t})(ee),se=(function(r){A(t,r);function t(e){var n=r.call(this)||this;return n._value=e,n}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(e){var n=r.prototype._subscribe.call(this,e);return!n.closed&&e.next(this._value),n},t.prototype.getValue=function(){var e=this,n=e.hasError,i=e.thrownError,o=e._value;if(n)throw i;return this._throwIfClosed(),o},t.prototype.next=function(e){r.prototype.next.call(this,this._value=e)},t})(ee),rt={now:function(){return Date.now()}},nt=(function(r){A(t,r);function t(e,n){return r.call(this)||this}return t.prototype.schedule=function(e,n){return this},t})(k),ae={setInterval:function(r,t){for(var e=[],n=2;n<arguments.length;n++)e[n-2]=arguments[n];return setInterval.apply(void 0,U([r,t],R(e)))},clearInterval:function(r){return clearInterval(r)},delegate:void 0},it=(function(r){A(t,r);function t(e,n){var i=r.call(this,e,n)||this;return i.scheduler=e,i.work=n,i.pending=!1,i}return t.prototype.schedule=function(e,n){var i;if(n===void 0&&(n=0),this.closed)return this;this.state=e;var o=this.id,s=this.scheduler;return o!=null&&(this.id=this.recycleAsyncId(s,o,n)),this.pending=!0,this.delay=n,this.id=(i=this.id)!==null&&i!==void 0?i:this.requestAsyncId(s,this.id,n),this},t.prototype.requestAsyncId=function(e,n,i){return i===void 0&&(i=0),ae.setInterval(e.flush.bind(e,this),i)},t.prototype.recycleAsyncId=function(e,n,i){if(i===void 0&&(i=0),i!=null&&this.delay===i&&this.pending===!1)return n;n!=null&&ae.clearInterval(n)},t.prototype.execute=function(e,n){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var i=this._execute(e,n);if(i)return i;this.pending===!1&&this.id!=null&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},t.prototype._execute=function(e,n){var i=!1,o;try{this.work(e)}catch(s){i=!0,o=s||new Error("Scheduled action threw falsy error")}if(i)return this.unsubscribe(),o},t.prototype.unsubscribe=function(){if(!this.closed){var e=this,n=e.id,i=e.scheduler,o=i.actions;this.work=this.state=this.scheduler=null,this.pending=!1,G(o,this),n!=null&&(this.id=this.recycleAsyncId(i,n,null)),this.delay=null,r.prototype.unsubscribe.call(this)}},t})(nt),ce=(function(){function r(t,e){e===void 0&&(e=r.now),this.schedulerActionCtor=t,this.now=e}return r.prototype.schedule=function(t,e,n){return e===void 0&&(e=0),new this.schedulerActionCtor(this,t).schedule(n,e)},r.now=rt.now,r})(),ot=(function(r){A(t,r);function t(e,n){n===void 0&&(n=ce.now);var i=r.call(this,e,n)||this;return i.actions=[],i._active=!1,i}return t.prototype.flush=function(e){var n=this.actions;if(this._active){n.push(e);return}var i;this._active=!0;do if(i=e.execute(e.state,e.delay))break;while(e=n.shift());if(this._active=!1,i){for(;e=n.shift();)e.unsubscribe();throw i}},t})(ce),ge=new ot(it),st=ge,at=new S(function(r){return r.complete()});function Se(r){return r&&m(r.schedule)}function we(r){return r[r.length-1]}function ct(r){return m(we(r))?r.pop():void 0}function Ee(r){return Se(we(r))?r.pop():void 0}var Ie=(function(r){return r&&typeof r.length=="number"&&typeof r!="function"});function Oe(r){return m(r==null?void 0:r.then)}function Ae(r){return m(r[Z])}function Ce(r){return Symbol.asyncIterator&&m(r==null?void 0:r[Symbol.asyncIterator])}function Te(r){return new TypeError("You provided "+(r!==null&&typeof r=="object"?"an invalid object":"'"+r+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function ut(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var _e=ut();function xe(r){return m(r==null?void 0:r[_e])}function Pe(r){return qe(this,arguments,function(){var e,n,i,o;return ve(this,function(s){switch(s.label){case 0:e=r.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,M(e.read())];case 3:return n=s.sent(),i=n.value,o=n.done,o?[4,M(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,M(i)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return e.releaseLock(),[7];case 10:return[2]}})})}function Me(r){return m(r==null?void 0:r.getReader)}function _(r){if(r instanceof S)return r;if(r!=null){if(Ae(r))return lt(r);if(Ie(r))return ft(r);if(Oe(r))return dt(r);if(Ce(r))return Le(r);if(xe(r))return ht(r);if(Me(r))return vt(r)}throw Te(r)}function lt(r){return new S(function(t){var e=r[Z]();if(m(e.subscribe))return e.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function ft(r){return new S(function(t){for(var e=0;e<r.length&&!t.closed;e++)t.next(r[e]);t.complete()})}function dt(r){return new S(function(t){r.then(function(e){t.closed||(t.next(e),t.complete())},function(e){return t.error(e)}).then(null,be)})}function ht(r){return new S(function(t){var e,n;try{for(var i=L(r),o=i.next();!o.done;o=i.next()){var s=o.value;if(t.next(s),t.closed)return}}catch(a){e={error:a}}finally{try{o&&!o.done&&(n=i.return)&&n.call(i)}finally{if(e)throw e.error}}t.complete()})}function Le(r){return new S(function(t){yt(r,t).catch(function(e){return t.error(e)})})}function vt(r){return Le(Pe(r))}function yt(r,t){var e,n,i,o;return Ve(this,void 0,void 0,function(){var s,a;return ve(this,function(c){switch(c.label){case 0:c.trys.push([0,5,6,11]),e=He(r),c.label=1;case 1:return[4,e.next()];case 2:if(n=c.sent(),!!n.done)return[3,4];if(s=n.value,t.next(s),t.closed)return[2];c.label=3;case 3:return[3,1];case 4:return[3,11];case 5:return a=c.sent(),i={error:a},[3,11];case 6:return c.trys.push([6,,9,10]),n&&!n.done&&(o=e.return)?[4,o.call(e)]:[3,8];case 7:c.sent(),c.label=8;case 8:return[3,10];case 9:if(i)throw i.error;return[7];case 10:return[7];case 11:return t.complete(),[2]}})})}function T(r,t,e,n,i){n===void 0&&(n=0),i===void 0&&(i=!1);var o=t.schedule(function(){e(),i?r.add(this.schedule(null,n)):this.unsubscribe()},n);if(r.add(o),!i)return o}function Re(r,t){return t===void 0&&(t=0),P(function(e,n){e.subscribe(O(n,function(i){return T(n,r,function(){return n.next(i)},t)},function(){return T(n,r,function(){return n.complete()},t)},function(i){return T(n,r,function(){return n.error(i)},t)}))})}function Ue(r,t){return t===void 0&&(t=0),P(function(e,n){n.add(r.schedule(function(){return e.subscribe(n)},t))})}function pt(r,t){return _(r).pipe(Ue(t),Re(t))}function mt(r,t){return _(r).pipe(Ue(t),Re(t))}function bt(r,t){return new S(function(e){var n=0;return t.schedule(function(){n===r.length?e.complete():(e.next(r[n++]),e.closed||this.schedule())})})}function gt(r,t){return new S(function(e){var n;return T(e,t,function(){n=r[_e](),T(e,t,function(){var i,o,s;try{i=n.next(),o=i.value,s=i.done}catch(a){e.error(a);return}s?e.complete():e.next(o)},0,!0)}),function(){return m(n==null?void 0:n.return)&&n.return()}})}function ke(r,t){if(!r)throw new Error("Iterable cannot be null");return new S(function(e){T(e,t,function(){var n=r[Symbol.asyncIterator]();T(e,t,function(){n.next().then(function(i){i.done?e.complete():e.next(i.value)})},0,!0)})})}function St(r,t){return ke(Pe(r),t)}function wt(r,t){if(r!=null){if(Ae(r))return pt(r,t);if(Ie(r))return bt(r,t);if(Oe(r))return mt(r,t);if(Ce(r))return ke(r,t);if(xe(r))return gt(r,t);if(Me(r))return St(r,t)}throw Te(r)}function te(r,t){return t?wt(r,t):_(r)}function Et(){for(var r=[],t=0;t<arguments.length;t++)r[t]=arguments[t];var e=Ee(r);return te(r,e)}function It(r){return r instanceof Date&&!isNaN(r)}function q(r,t){return P(function(e,n){var i=0;e.subscribe(O(n,function(o){n.next(r.call(t,o,i++))}))})}var Ot=Array.isArray;function At(r,t){return Ot(t)?r.apply(void 0,U([],R(t))):r(t)}function Ct(r){return q(function(t){return At(r,t)})}var Tt=Array.isArray,_t=Object.getPrototypeOf,xt=Object.prototype,Pt=Object.keys;function Mt(r){if(r.length===1){var t=r[0];if(Tt(t))return{args:t,keys:null};if(Lt(t)){var e=Pt(t);return{args:e.map(function(n){return t[n]}),keys:e}}}return{args:r,keys:null}}function Lt(r){return r&&typeof r=="object"&&_t(r)===xt}function Rt(r,t){return r.reduce(function(e,n,i){return e[n]=t[i],e},{})}function Ut(){for(var r=[],t=0;t<arguments.length;t++)r[t]=arguments[t];var e=Ee(r),n=ct(r),i=Mt(r),o=i.args,s=i.keys;if(o.length===0)return te([],e);var a=new S(kt(o,e,s?function(c){return Rt(s,c)}:V));return n?a.pipe(Ct(n)):a}function kt(r,t,e){return e===void 0&&(e=V),function(n){ue(t,function(){for(var i=r.length,o=new Array(i),s=i,a=i,c=function(l){ue(t,function(){var d=te(r[l],t),y=!1;d.subscribe(O(n,function(f){o[l]=f,y||(y=!0,a--),a||n.next(e(o.slice()))},function(){--s||n.complete()}))},n)},u=0;u<i;u++)c(u)},n)}}function ue(r,t,e){r?T(e,r,t):t()}function $t(r,t,e,n,i,o,s,a){var c=[],u=0,l=0,d=!1,y=function(){d&&!c.length&&!u&&t.complete()},f=function(v){return u<n?p(v):c.push(v)},p=function(v){u++;var w=!1;_(e(v,l++)).subscribe(O(t,function(I){t.next(I)},function(){w=!0},void 0,function(){if(w)try{u--;for(var I=function(){var x=c.shift();s||p(x)};c.length&&u<n;)I();y()}catch(x){t.error(x)}}))};return r.subscribe(O(t,f,function(){d=!0,y()})),function(){}}function F(r,t,e){return e===void 0&&(e=1/0),m(t)?F(function(n,i){return q(function(o,s){return t(n,o,i,s)})(_(r(n,i)))},e):(typeof t=="number"&&(e=t),P(function(n,i){return $t(n,i,r,e)}))}function $e(r,t,e){r===void 0&&(r=0),e===void 0&&(e=st);var n=-1;return t!=null&&(Se(t)?e=t:n=t),new S(function(i){var o=It(r)?+r-e.now():r;o<0&&(o=0);var s=0;return e.schedule(function(){i.closed||(i.next(s++),0<=n?this.schedule(void 0,n):i.complete())},o)})}function jt(r,t){return m(t)?F(r,t,1):F(r,1)}function Dt(r){return r<=0?function(){return at}:P(function(t,e){var n=0;t.subscribe(O(e,function(i){++n<=r&&(e.next(i),r<=n&&e.complete())}))})}function Nt(r){return q(function(){return r})}function Gt(r,t){return F(function(e,n){return _(r(e,n)).pipe(Dt(1),Nt(e))})}function Ft(r,t){t===void 0&&(t=ge);var e=$e(r,t);return Gt(function(){return e})}function Vt(r){var t;t={count:r};var e=t.count,n=e===void 0?1/0:e,i=t.delay,o=t.resetOnSuccess,s=o===void 0?!1:o;return n<=0?V:P(function(a,c){var u=0,l,d=function(){var y=!1;l=a.subscribe(O(c,function(f){s&&(u=0),c.next(f)},void 0,function(f){if(u++<n){var p=function(){l?(l.unsubscribe(),l=null,d()):y=!0};if(i!=null){var v=typeof i=="number"?$e(i):_(i(f,u)),w=O(c,function(){w.unsubscribe(),p()},function(){c.complete()});v.subscribe(w)}else p()}else c.error(f)})),y&&(l.unsubscribe(),l=null,d())};d()})}function qt(r){return P(function(t,e){_(r).subscribe(O(e,function(){return e.complete()},X)),!e.closed&&t.subscribe(e)})}async function Ht(r,t){const e=r.getReader();let n;for(;!(n=await e.read()).done;)t(n.value)}function Kt(r){let t,e,n,i=!1;return function(s){t===void 0?(t=s,e=0,n=-1):t=Yt(t,s);const a=t.length;let c=0;for(;e<a;){i&&(t[e]===10&&(c=++e),i=!1);let u=-1;for(;e<a&&u===-1;++e)switch(t[e]){case 58:n===-1&&(n=e-c);break;case 13:i=!0;case 10:u=e;break}if(u===-1)break;r(t.subarray(c,u),n),c=e,n=-1}c===a?t=void 0:c!==0&&(t=t.subarray(c),e-=c)}}function Bt(r,t,e){let n=le();const i=new TextDecoder;return function(s,a){if(s.length===0)e==null||e(n),n=le();else if(a>0){const c=i.decode(s.subarray(0,a)),u=a+(s[a+1]===32?2:1),l=i.decode(s.subarray(u));switch(c){case"data":n.data=n.data?n.data+`
4
+ `+l:l;break;case"event":n.event=l;break;case"id":r(n.id=l);break;case"retry":const d=parseInt(l,10);isNaN(d)||t(n.retry=d);break}}}}function Yt(r,t){const e=new Uint8Array(r.length+t.length);return e.set(r),e.set(t,r.length),e}function le(){return{data:"",event:"",id:"",retry:void 0}}var Wt=function(r,t){var e={};for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&t.indexOf(n)<0&&(e[n]=r[n]);if(r!=null&&typeof Object.getOwnPropertySymbols=="function")for(var i=0,n=Object.getOwnPropertySymbols(r);i<n.length;i++)t.indexOf(n[i])<0&&Object.prototype.propertyIsEnumerable.call(r,n[i])&&(e[n[i]]=r[n[i]]);return e};const z="text/event-stream",Xt=1e3,fe="last-event-id";function Jt(r,t){var{signal:e,headers:n,onopen:i,onmessage:o,onclose:s,onerror:a,openWhenHidden:c,fetch:u}=t,l=Wt(t,["signal","headers","onopen","onmessage","onclose","onerror","openWhenHidden","fetch"]);return new Promise((d,y)=>{const f=Object.assign({},n);f.accept||(f.accept=z);let p;function v(){p.abort(),document.hidden||H()}c||document.addEventListener("visibilitychange",v);let w=Xt,I=0;function x(){document.removeEventListener("visibilitychange",v),window.clearTimeout(I),p.abort()}e==null||e.addEventListener("abort",()=>{x(),d()});const De=u??window.fetch,Ne=i??zt;async function H(){var K;p=new AbortController;try{const $=await De(r,Object.assign(Object.assign({},l),{headers:f,signal:p.signal}));await Ne($),await Ht($.body,Kt(Bt(C=>{C?f[fe]=C:delete f[fe]},C=>{w=C},o))),s==null||s(),x(),d()}catch($){if(!p.signal.aborted)try{const C=(K=a==null?void 0:a($))!==null&&K!==void 0?K:w;window.clearTimeout(I),I=window.setTimeout(H,C)}catch(C){x(),y(C)}}}H()})}function zt(r){const t=r.headers.get("content-type");if(!(t!=null&&t.startsWith(z)))throw new Error(`Expected content-type to be ${z}, Actual: ${t}`)}function Qt(r){const{endpoint:t,apiKey:e,payload:n,debugMode:i}=r;return new S(o=>{const s=new AbortController;let a;const c={"Content-Type":"application/json"};e&&(c["X-API-KEY"]=e);const u=new URLSearchParams;i&&u.set("is_debug","true");const l=new URL(t);return u.toString()&&(l.search=u.toString()),Jt(l.toString(),{method:"POST",headers:c,body:n?JSON.stringify(n):void 0,signal:s.signal,openWhenHidden:!0,onopen:async d=>{d.ok?a=d.headers.get("X-Trace-Id")??void 0:(o.error(d),s.abort())},onmessage:d=>{const y=JSON.parse(d.data);a?y.traceId=a:y.requestId&&(y.traceId=y.requestId,a||(a=y.requestId)),o.next(y)},onclose:()=>{o.complete()},onerror:d=>{throw o.error(d),s.abort(),d}}),()=>{s.abort()}})}class Zt{constructor(){b(this,"listeners",{})}on(t,e){this.listeners=Object.assign({},this.listeners,{[t]:(this.listeners[t]??[]).concat(e)})}off(t,e){this.listeners[t]&&(this.listeners=Object.assign({},this.listeners,{[t]:(this.listeners[t]??[]).filter(n=>n!==e)}))}remove(t){delete this.listeners[t]}emit(t,...e){this.listeners[t]&&this.listeners[t].forEach(n=>n(...e))}}class er{constructor(t){b(this,"apiKey");b(this,"endpoint");b(this,"botProviderEndpoint");b(this,"debugMode");b(this,"destroy$",new ee);b(this,"sseEmitter",new Zt);b(this,"transformSsePayload");if(!t.endpoint&&!t.botProviderEndpoint)throw new Error("Either endpoint or botProviderEndpoint must be provided");if(this.apiKey=t.apiKey,this.debugMode=t.debugMode,this.transformSsePayload=t.transformSsePayload,this.botProviderEndpoint=t.botProviderEndpoint,!t.endpoint&&t.botProviderEndpoint){const e=t.botProviderEndpoint.replace(/\/+$/,"");this.endpoint=`${e}/message/sse`}else t.endpoint&&(this.endpoint=t.endpoint,this.debugMode&&console.warn('[AsgardServiceClient] The "endpoint" option is deprecated and will be removed in the next major version. Please use "botProviderEndpoint" instead. The SSE endpoint will be automatically derived as "${botProviderEndpoint}/message/sse".'))}on(t,e){this.sseEmitter.remove(t),this.sseEmitter.on(t,e)}handleEvent(t){switch(t.eventType){case h.INIT:this.sseEmitter.emit(h.INIT,t);break;case h.PROCESS_START:case h.PROCESS_COMPLETE:this.sseEmitter.emit(h.PROCESS,t);break;case h.MESSAGE_START:case h.MESSAGE_DELTA:case h.MESSAGE_COMPLETE:this.sseEmitter.emit(h.MESSAGE,t);break;case h.TOOL_CALL_START:case h.TOOL_CALL_COMPLETE:this.sseEmitter.emit(h.TOOL_CALL,t);break;case h.DONE:this.sseEmitter.emit(h.DONE,t);break;case h.ERROR:this.sseEmitter.emit(h.ERROR,t);break}}fetchSse(t,e){var n,i;(n=e==null?void 0:e.onSseStart)==null||n.call(e),Qt({apiKey:this.apiKey,endpoint:this.endpoint,debugMode:this.debugMode,payload:((i=this.transformSsePayload)==null?void 0:i.call(this,t))??t}).pipe(jt(o=>Et(o).pipe(Ft((e==null?void 0:e.delayTime)??50))),qt(this.destroy$),Vt(3)).subscribe({next:o=>{var s;(s=e==null?void 0:e.onSseMessage)==null||s.call(e,o),this.handleEvent(o)},error:o=>{var s;(s=e==null?void 0:e.onSseError)==null||s.call(e,o)},complete:()=>{var o;(o=e==null?void 0:e.onSseCompleted)==null||o.call(e)}})}close(){this.destroy$.next(),this.destroy$.complete()}async uploadFile(t,e){const n=this.deriveBlobEndpoint();if(!n)throw new Error("Unable to derive blob endpoint. Please provide botProviderEndpoint in config.");const i=new FormData;i.append("file",t),i.append("customChannelId",e);const o={};this.apiKey&&(o["X-API-KEY"]=this.apiKey);try{const s=await fetch(n,{method:"POST",headers:o,body:i});if(!s.ok)throw new Error(`Upload failed: ${s.status} ${s.statusText}`);const a=await s.json();return this.debugMode&&console.log("[AsgardServiceClient] File upload response:",a),a}catch(s){throw console.error("[AsgardServiceClient] File upload error:",s),s}}deriveBlobEndpoint(){if(!this.botProviderEndpoint&&!this.endpoint)return null;let t=this.botProviderEndpoint;if(!t&&this.endpoint&&(t=this.endpoint.replace("/message/sse","")),!t)return null;if(t=t.replace(/\/+$/,""),!t.includes("/generic/")){const e=t.match(/^(https?:\/\/[^/]+)(\/.*)/);if(e){const[,n,i]=e;t=`${n}/generic${i}`}}return`${t}/blob`}}const g=[];for(let r=0;r<256;++r)g.push((r+256).toString(16).slice(1));function tr(r,t=0){return(g[r[t+0]]+g[r[t+1]]+g[r[t+2]]+g[r[t+3]]+"-"+g[r[t+4]]+g[r[t+5]]+"-"+g[r[t+6]]+g[r[t+7]]+"-"+g[r[t+8]]+g[r[t+9]]+"-"+g[r[t+10]]+g[r[t+11]]+g[r[t+12]]+g[r[t+13]]+g[r[t+14]]+g[r[t+15]]).toLowerCase()}let Y;const rr=new Uint8Array(16);function nr(){if(!Y){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");Y=crypto.getRandomValues.bind(crypto)}return Y(rr)}const ir=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),de={randomUUID:ir};function or(r,t,e){var i;r=r||{};const n=r.random??((i=r.rng)==null?void 0:i.call(r))??nr();if(n.length<16)throw new Error("Random bytes length must be >= 16");return n[6]=n[6]&15|64,n[8]=n[8]&63|128,tr(n)}function je(r,t,e){return de.randomUUID&&!r?de.randomUUID():or(r)}class E{constructor({messages:t}){b(this,"messages",null);this.messages=t}pushMessage(t){const e=new Map(this.messages);return e.set(t.messageId,t),new E({messages:e})}onMessage(t){switch(t.eventType){case h.MESSAGE_START:return this.onMessageStart(t);case h.MESSAGE_DELTA:return this.onMessageDelta(t);case h.MESSAGE_COMPLETE:return this.onMessageComplete(t);case h.TOOL_CALL_START:return this.onToolCallStart(t);case h.TOOL_CALL_COMPLETE:return this.onToolCallComplete(t);case h.ERROR:return this.onMessageError(t);default:return this}}onMessageStart(t){const e=t.fact.messageStart.message,n=new Map(this.messages);return n.set(e.messageId,{type:"bot",eventType:h.MESSAGE_START,isTyping:!0,typingText:"",messageId:e.messageId,message:e,time:new Date,traceId:t.traceId}),new E({messages:n})}onMessageDelta(t){const e=t.fact.messageDelta.message,n=new Map(this.messages),i=n.get(e.messageId);if((i==null?void 0:i.type)!=="bot")return this;const o=`${(i==null?void 0:i.typingText)??""}${e.text}`;return n.set(e.messageId,{type:"bot",eventType:h.MESSAGE_DELTA,isTyping:!0,typingText:o,messageId:e.messageId,message:e,time:new Date,traceId:t.traceId??i.traceId}),new E({messages:n})}onMessageComplete(t){const e=t.fact.messageComplete.message,n=new Map(this.messages),i=n.get(e.messageId);return n.set(e.messageId,{type:"bot",eventType:h.MESSAGE_COMPLETE,isTyping:!1,typingText:null,messageId:e.messageId,message:e,time:new Date,traceId:t.traceId??((i==null?void 0:i.type)==="bot"?i.traceId:void 0)}),new E({messages:n})}onMessageError(t){const e=je(),n=t.fact.runError.error,i=new Map(this.messages);return i.set(e,{type:"error",eventType:h.ERROR,messageId:e,error:n,time:new Date,traceId:t.traceId}),new E({messages:i})}onToolCallStart(t){const e=t.fact.toolCallStart,n=new Map(this.messages),i=`${e.processId}-${e.callSeq}`,o={type:"tool-call",eventType:h.TOOL_CALL_START,messageId:i,processId:e.processId,callSeq:e.callSeq,toolName:e.toolCall.toolName,toolsetName:e.toolCall.toolsetName,parameter:e.toolCall.parameter,isComplete:!1,time:new Date,traceId:t.traceId};return n.set(i,o),new E({messages:n})}onToolCallComplete(t){const e=t.fact.toolCallComplete,n=new Map(this.messages),i=`${e.processId}-${e.callSeq}`,o=n.get(i);if((o==null?void 0:o.type)==="tool-call"){const s={...o,eventType:h.TOOL_CALL_COMPLETE,result:e.toolCallResult,isComplete:!0,traceId:t.traceId??o.traceId};n.set(i,s)}return new E({messages:n})}}class re{constructor(t){b(this,"client");b(this,"customChannelId");b(this,"customMessageId");b(this,"isConnecting$");b(this,"conversation$");b(this,"statesObserver");b(this,"statesSubscription");b(this,"currentUserMessageId");if(!t.client)throw new Error("client must be required");if(!t.customChannelId)throw new Error("customChannelId must be required");this.client=t.client,this.customChannelId=t.customChannelId,this.customMessageId=t.customMessageId,this.isConnecting$=new se(!1),this.conversation$=new se(t.conversation),this.statesObserver=t.statesObserver}static async reset(t,e,n){const i=new re(t);try{return i.subscribe(),await i.resetChannel(e,n),i}catch(o){throw i.close(),o}}subscribe(){this.statesSubscription=Ut([this.isConnecting$,this.conversation$]).pipe(q(([t,e])=>({isConnecting:t,conversation:e}))).subscribe(this.statesObserver)}fetchSse(t,e){return new Promise((n,i)=>{this.isConnecting$.next(!0),this.client.fetchSse(t,{onSseStart:e==null?void 0:e.onSseStart,onSseMessage:o=>{var s;if((s=e==null?void 0:e.onSseMessage)==null||s.call(e,o),this.currentUserMessageId&&o.traceId){const a=new Map(this.conversation$.value.messages),c=a.get(this.currentUserMessageId);c&&c.type==="user"&&(a.set(this.currentUserMessageId,{...c,traceId:o.traceId}),this.conversation$.next(new E({messages:a}))),this.currentUserMessageId=void 0}this.conversation$.next(this.conversation$.value.onMessage(o))},onSseError:o=>{var s;(s=e==null?void 0:e.onSseError)==null||s.call(e,o),this.isConnecting$.next(!1),this.currentUserMessageId=void 0,i(o)},onSseCompleted:()=>{var o;(o=e==null?void 0:e.onSseCompleted)==null||o.call(e),this.isConnecting$.next(!1),this.currentUserMessageId=void 0,n()}})})}resetChannel(t,e){return this.fetchSse({action:N.RESET_CHANNEL,customChannelId:this.customChannelId,customMessageId:this.customMessageId,text:(t==null?void 0:t.text)||"",payload:t==null?void 0:t.payload},e)}sendMessage(t,e){const n=t.text.trim(),i=t.customMessageId??je();return this.currentUserMessageId=i,this.conversation$.next(this.conversation$.value.pushMessage({type:"user",messageId:i,text:n,blobIds:t.blobIds,filePreviewUrls:t.filePreviewUrls,documentNames:t.documentNames,time:new Date})),this.fetchSse({action:N.NONE,customChannelId:this.customChannelId,customMessageId:i,payload:t==null?void 0:t.payload,text:n,blobIds:t==null?void 0:t.blobIds},e)}close(){var t;this.isConnecting$.complete(),this.conversation$.complete(),(t=this.statesSubscription)==null||t.unsubscribe()}}exports.AsgardServiceClient=er;exports.Channel=re;exports.Conversation=E;exports.EventType=h;exports.FetchSseAction=N;exports.MessageTemplateType=he;
5
+ //# sourceMappingURL=index.cjs.map