@sovant/sdk 1.4.0 → 1.4.2

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 CHANGED
@@ -103,11 +103,12 @@ Sovant provides two ways to query memories:
103
103
  Pure vector similarity search without profile logic. Behavior unchanged from previous versions.
104
104
 
105
105
  ```typescript
106
- // Recall for conversational queries
107
- const context = await sv.memory.recall({
106
+ // Recall for conversational queries (returns { results: [...], total, query_type })
107
+ const recall = await sv.memory.recall({
108
108
  query: "what do you know about me?",
109
109
  limit: 10
110
110
  });
111
+ console.log(recall.results); // array of matching memories
111
112
 
112
113
  // Search for topic discovery
113
114
  const topics = await sv.memory.search({
@@ -144,11 +145,12 @@ await sv.memory.create({
144
145
  });
145
146
 
146
147
  // Recall memories from this specific thread
147
- const threadMemories = await sv.memory.recall({
148
+ const threadRecall = await sv.memory.recall({
148
149
  query: "launch date",
149
150
  thread_id: thread.id,
150
151
  limit: 10
151
152
  });
153
+ console.log(threadRecall.results); // thread-scoped matches
152
154
  ```
153
155
 
154
156
  ### List and manage threads
@@ -191,17 +193,18 @@ await sv.memory.create({
191
193
  });
192
194
 
193
195
  // Recall from all memories
194
- const allMemories = await sv.memory.recall({
196
+ const recall = await sv.memory.recall({
195
197
  query: "notification preferences"
196
198
  });
199
+ console.log(recall.results);
197
200
  ```
198
201
 
199
202
  ## Features
200
203
 
201
204
  - **Memory CRUD** — create, retrieve, update, delete memories
202
- - **Semantic Search** — query memories with filters and topK ranking
205
+ - **Semantic Search** — query memories with filters and ranking
203
206
  - **Threads** — organize memories into conversations or sessions (fully supported in SDK)
204
- - **Batch Operations (Beta)** — atomic multi-operation support
207
+ - **Batch Operations** — create multiple memories in one request
205
208
  - **Compliance-ready** — audit trails, PDPA/GDPR-friendly by design
206
209
  - **SDKs** — official TypeScript and Python SDKs, with REST API reference
207
210
 
@@ -221,27 +224,21 @@ const allMemories = await sv.memory.recall({
221
224
  - `PATCH|PUT /api/v1/memories/{id}` — Update memory
222
225
  - `DELETE /api/v1/memories/{id}` — Delete memory
223
226
  - `GET /api/v1/memory/search` — Search memories
224
- - `POST /api/v1/memory/batch` — Batch operations (Beta)
227
+ - `POST /api/v1/memory/batch` — Batch create
225
228
 
226
229
  ## Field Mapping Note
227
230
 
228
231
  - **SDK level:** accepts `data`
229
232
  - **API level:** expects `content`
230
233
  - SDK automatically converts `data` → `content`.
231
- - `subject` is deprecated (ignored by API). Use `thread_id`, `tags`, or `metadata` for grouping.
232
-
233
- ## Status of Advanced Features
234
-
235
- - **Batch API:** Available, marked Beta.
236
- - **Threads:** Fully supported in TypeScript SDK (v1.4.0+).
237
- - **Webhooks, personalization, multi-channel sync:** Coming soon.
238
234
 
239
235
  ## Versioning & Changelog
240
236
 
241
- - **Current release:** 1.4.0
242
- - Version 1.4.0 adds full threads support (create, list, get, update, delete)
243
- - Version 1.3.0 added hybrid recall with profile awareness
244
- - See [CHANGELOG.md](./CHANGELOG.md) for details.
237
+ - **Current release:** 1.4.1
238
+ - Version 1.4.1 CJS export fix
239
+ - Version 1.4.0 full threads support (create, list, get, update, delete)
240
+ - Version 1.3.0 hybrid recall with profile awareness
241
+ - Version 1.2.0 — retry logic, batch operations, telemetry hooks
245
242
 
246
243
  ## License & Use
247
244
 
package/dist/index.cjs ADDED
@@ -0,0 +1,301 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ Sovant: () => Sovant,
24
+ SovantError: () => SovantError
25
+ });
26
+ module.exports = __toCommonJS(index_exports);
27
+ var Sovant = class {
28
+ apiKey;
29
+ baseUrl;
30
+ timeout;
31
+ maxRetries;
32
+ retryDelay;
33
+ onRequest;
34
+ onResponse;
35
+ onError;
36
+ constructor(opts) {
37
+ if (!opts?.apiKey) throw new Error("Missing apiKey");
38
+ this.apiKey = opts.apiKey;
39
+ this.baseUrl = (opts.baseUrl ?? process.env.SOVANT_BASE_URL ?? "https://sovant.ai").replace(/\/+$/, "");
40
+ this.timeout = opts.timeoutMs ?? 3e4;
41
+ this.maxRetries = opts.maxRetries ?? 3;
42
+ this.retryDelay = opts.retryDelay ?? 1e3;
43
+ this.onRequest = opts.onRequest;
44
+ this.onResponse = opts.onResponse;
45
+ this.onError = opts.onError;
46
+ }
47
+ async req(path, init) {
48
+ const method = init.method || "GET";
49
+ const startTime = Date.now();
50
+ if (this.onRequest) {
51
+ try {
52
+ const body = init.body ? JSON.parse(init.body) : void 0;
53
+ this.onRequest({ method, path, body });
54
+ } catch {
55
+ }
56
+ }
57
+ let lastError = null;
58
+ for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
59
+ const ctl = new AbortController();
60
+ const timeoutId = setTimeout(() => ctl.abort(), this.timeout);
61
+ try {
62
+ const res = await fetch(`${this.baseUrl}${path}`, {
63
+ ...init,
64
+ headers: {
65
+ "content-type": "application/json",
66
+ authorization: `Bearer ${this.apiKey}`,
67
+ ...init.headers || {}
68
+ },
69
+ signal: ctl.signal
70
+ });
71
+ clearTimeout(timeoutId);
72
+ const text = await res.text();
73
+ let body;
74
+ try {
75
+ body = text ? JSON.parse(text) : void 0;
76
+ } catch {
77
+ body = text;
78
+ }
79
+ if (!res.ok) {
80
+ const msg = body?.message || res.statusText;
81
+ const code = body?.code || `HTTP_${res.status}`;
82
+ const error = new SovantError(msg, code, res.status, body);
83
+ if (attempt < this.maxRetries && (res.status === 429 || res.status >= 500)) {
84
+ lastError = error;
85
+ const delay = this.retryDelay * Math.pow(2, attempt);
86
+ await new Promise((resolve) => setTimeout(resolve, delay));
87
+ continue;
88
+ }
89
+ if (this.onError) {
90
+ try {
91
+ this.onError(error);
92
+ } catch {
93
+ }
94
+ }
95
+ throw error;
96
+ }
97
+ const duration = Date.now() - startTime;
98
+ if (this.onResponse) {
99
+ try {
100
+ this.onResponse({ method, path, status: res.status, duration });
101
+ } catch {
102
+ }
103
+ }
104
+ return body;
105
+ } catch (err) {
106
+ clearTimeout(timeoutId);
107
+ if (err instanceof Error && err.name === "AbortError") {
108
+ const error = new SovantError("Request timeout", "TIMEOUT", 408);
109
+ if (attempt < this.maxRetries) {
110
+ lastError = error;
111
+ const delay = this.retryDelay * Math.pow(2, attempt);
112
+ await new Promise((resolve) => setTimeout(resolve, delay));
113
+ continue;
114
+ }
115
+ throw error;
116
+ }
117
+ if (err instanceof Error) {
118
+ const error = new SovantError(err.message, "NETWORK_ERROR", 0);
119
+ if (attempt < this.maxRetries) {
120
+ lastError = error;
121
+ const delay = this.retryDelay * Math.pow(2, attempt);
122
+ await new Promise((resolve) => setTimeout(resolve, delay));
123
+ continue;
124
+ }
125
+ throw error;
126
+ }
127
+ throw err;
128
+ }
129
+ }
130
+ throw lastError || new SovantError("Max retries exceeded", "MAX_RETRIES", 0);
131
+ }
132
+ memory = {
133
+ create: (input) => this.req("/api/v1/memory", {
134
+ method: "POST",
135
+ body: JSON.stringify({
136
+ content: typeof input.data === "string" ? input.data : JSON.stringify(input.data),
137
+ type: input.type || "journal",
138
+ ttl: input.ttl,
139
+ tags: input.tags,
140
+ metadata: input.metadata,
141
+ thread_id: input.thread_id
142
+ })
143
+ }),
144
+ get: (id) => this.req(`/api/v1/memories/${encodeURIComponent(id)}`, {
145
+ method: "GET"
146
+ }),
147
+ search: (q) => {
148
+ const params = new URLSearchParams();
149
+ if (q.query) params.append("query", q.query);
150
+ if (q.type) params.append("type", q.type);
151
+ if (q.tags) params.append("tags", q.tags.join(","));
152
+ if (q.thread_id) params.append("thread_id", q.thread_id);
153
+ if (q.limit) params.append("limit", q.limit.toString());
154
+ if (q.from_date) params.append("from_date", q.from_date);
155
+ if (q.to_date) params.append("to_date", q.to_date);
156
+ return this.req(`/api/v1/memory/search?${params.toString()}`, {
157
+ method: "GET"
158
+ });
159
+ },
160
+ update: (id, patch) => this.req(`/api/v1/memories/${encodeURIComponent(id)}`, {
161
+ method: "PATCH",
162
+ body: JSON.stringify({
163
+ content: patch.data ? typeof patch.data === "string" ? patch.data : JSON.stringify(patch.data) : void 0,
164
+ type: patch.type,
165
+ ttl: patch.ttl,
166
+ tags: patch.tags,
167
+ metadata: patch.metadata
168
+ })
169
+ }),
170
+ delete: (id) => this.req(`/api/v1/memories/${encodeURIComponent(id)}`, {
171
+ method: "DELETE"
172
+ }),
173
+ /**
174
+ * Batch create multiple memories in a single request
175
+ * @param memories Array of memory objects to create (max 100)
176
+ * @returns BatchResponse with individual results
177
+ */
178
+ createBatch: (memories) => {
179
+ const operations = memories.map((mem) => ({
180
+ operation: "create",
181
+ data: {
182
+ content: typeof mem.data === "string" ? mem.data : JSON.stringify(mem.data),
183
+ type: mem.type || "journal",
184
+ tags: mem.tags,
185
+ metadata: mem.metadata,
186
+ thread_id: mem.thread_id
187
+ }
188
+ }));
189
+ return this.req("/api/v1/memory/batch", {
190
+ method: "POST",
191
+ body: JSON.stringify(operations)
192
+ });
193
+ },
194
+ /**
195
+ * Hybrid recall with profile awareness
196
+ * Uses multi-stage pipeline (profile fast-path + lexical + semantic)
197
+ * Guarantees profile facts (name/age/location) when available
198
+ *
199
+ * Use recall() for conversational queries ("who am I?", "what do you know about me?")
200
+ * Use search() for pure semantic topic lookup
201
+ */
202
+ recall: (q) => {
203
+ const params = new URLSearchParams();
204
+ params.append("query", q.query);
205
+ if (q.thread_id) params.append("thread_id", q.thread_id);
206
+ if (q.limit) params.append("limit", q.limit.toString());
207
+ return this.req(`/api/v1/memory/recall?${params.toString()}`, {
208
+ method: "GET"
209
+ });
210
+ }
211
+ };
212
+ threads = {
213
+ /**
214
+ * Create a new thread
215
+ * @param input Thread creation parameters
216
+ * @returns Created thread with ID
217
+ */
218
+ create: (input) => this.req("/api/v1/threads", {
219
+ method: "POST",
220
+ body: JSON.stringify({
221
+ title: input.title,
222
+ description: input.description,
223
+ metadata: input.metadata
224
+ })
225
+ }),
226
+ /**
227
+ * List threads with optional filtering
228
+ * @param params List parameters
229
+ * @returns Paginated thread list
230
+ */
231
+ list: (params) => {
232
+ const query = new URLSearchParams();
233
+ if (params?.limit) query.append("limit", params.limit.toString());
234
+ if (params?.offset) query.append("offset", params.offset.toString());
235
+ if (params?.status) query.append("status", params.status);
236
+ return this.req(`/api/v1/threads?${query.toString()}`, {
237
+ method: "GET"
238
+ });
239
+ },
240
+ /**
241
+ * Get a thread by ID
242
+ * @param threadId Thread UUID
243
+ * @param options Optional parameters
244
+ * @returns Thread details
245
+ */
246
+ get: (threadId, options) => {
247
+ const query = new URLSearchParams();
248
+ if (options?.include_memories) query.append("include_memories", "true");
249
+ if (options?.limit) query.append("limit", options.limit.toString());
250
+ return this.req(
251
+ `/api/v1/threads/${encodeURIComponent(threadId)}?${query.toString()}`,
252
+ {
253
+ method: "GET"
254
+ }
255
+ );
256
+ },
257
+ /**
258
+ * Update a thread
259
+ * @param threadId Thread UUID
260
+ * @param updates Fields to update
261
+ * @returns Updated thread
262
+ */
263
+ update: (threadId, updates) => this.req(`/api/v1/threads/${encodeURIComponent(threadId)}`, {
264
+ method: "PUT",
265
+ body: JSON.stringify(updates)
266
+ }),
267
+ /**
268
+ * Delete a thread
269
+ * @param threadId Thread UUID
270
+ * @param deleteMemories If true, also delete associated memories
271
+ * @returns Deletion confirmation
272
+ */
273
+ delete: (threadId, deleteMemories = false) => {
274
+ const query = new URLSearchParams();
275
+ if (deleteMemories) query.append("delete_memories", "true");
276
+ return this.req(
277
+ `/api/v1/threads/${encodeURIComponent(threadId)}?${query.toString()}`,
278
+ {
279
+ method: "DELETE"
280
+ }
281
+ );
282
+ }
283
+ };
284
+ };
285
+ var SovantError = class extends Error {
286
+ code;
287
+ status;
288
+ details;
289
+ constructor(message, code, status, details) {
290
+ super(message);
291
+ this.name = "SovantError";
292
+ this.code = code;
293
+ this.status = status;
294
+ this.details = details;
295
+ }
296
+ };
297
+ // Annotate the CommonJS export names for ESM import in node:
298
+ 0 && (module.exports = {
299
+ Sovant,
300
+ SovantError
301
+ });
@@ -0,0 +1,207 @@
1
+ type SovantClientOptions = {
2
+ apiKey: string;
3
+ baseUrl?: string;
4
+ timeoutMs?: number;
5
+ maxRetries?: number;
6
+ retryDelay?: number;
7
+ onRequest?: (req: {
8
+ method: string;
9
+ path: string;
10
+ body?: any;
11
+ }) => void;
12
+ onResponse?: (res: {
13
+ method: string;
14
+ path: string;
15
+ status: number;
16
+ duration: number;
17
+ }) => void;
18
+ onError?: (err: SovantError) => void;
19
+ };
20
+ declare class Sovant {
21
+ private apiKey;
22
+ private baseUrl;
23
+ private timeout;
24
+ private maxRetries;
25
+ private retryDelay;
26
+ private onRequest?;
27
+ private onResponse?;
28
+ private onError?;
29
+ constructor(opts: SovantClientOptions);
30
+ private req;
31
+ memory: {
32
+ create: <T = any>(input: {
33
+ data: T;
34
+ type?: "journal" | "insight" | "observation" | "task" | "preference";
35
+ ttl?: string;
36
+ tags?: string[];
37
+ metadata?: Record<string, any>;
38
+ thread_id?: string;
39
+ }) => Promise<unknown>;
40
+ get: (id: string) => Promise<unknown>;
41
+ search: (q: {
42
+ query?: string;
43
+ type?: string;
44
+ tags?: string[];
45
+ thread_id?: string;
46
+ limit?: number;
47
+ from_date?: string;
48
+ to_date?: string;
49
+ }) => Promise<unknown>;
50
+ update: <T = any>(id: string, patch: Partial<{
51
+ data: T;
52
+ type?: string;
53
+ ttl?: string;
54
+ tags?: string[];
55
+ metadata?: Record<string, any>;
56
+ }>) => Promise<unknown>;
57
+ delete: (id: string) => Promise<unknown>;
58
+ /**
59
+ * Batch create multiple memories in a single request
60
+ * @param memories Array of memory objects to create (max 100)
61
+ * @returns BatchResponse with individual results
62
+ */
63
+ createBatch: <T = any>(memories: Array<{
64
+ data: T;
65
+ type?: "journal" | "insight" | "observation" | "task" | "preference";
66
+ tags?: string[];
67
+ metadata?: Record<string, any>;
68
+ thread_id?: string;
69
+ }>) => Promise<{
70
+ results: Array<{
71
+ success: boolean;
72
+ operation: string;
73
+ id?: string;
74
+ error?: {
75
+ code: string;
76
+ message: string;
77
+ };
78
+ index: number;
79
+ }>;
80
+ summary: {
81
+ total: number;
82
+ successful: number;
83
+ failed: number;
84
+ };
85
+ transaction_id: string;
86
+ }>;
87
+ /**
88
+ * Hybrid recall with profile awareness
89
+ * Uses multi-stage pipeline (profile fast-path + lexical + semantic)
90
+ * Guarantees profile facts (name/age/location) when available
91
+ *
92
+ * Use recall() for conversational queries ("who am I?", "what do you know about me?")
93
+ * Use search() for pure semantic topic lookup
94
+ */
95
+ recall: (q: {
96
+ query: string;
97
+ thread_id?: string;
98
+ limit?: number;
99
+ }) => Promise<unknown>;
100
+ };
101
+ threads: {
102
+ /**
103
+ * Create a new thread
104
+ * @param input Thread creation parameters
105
+ * @returns Created thread with ID
106
+ */
107
+ create: (input: {
108
+ title: string;
109
+ description?: string;
110
+ metadata?: Record<string, any>;
111
+ }) => Promise<{
112
+ ok: boolean;
113
+ id: string;
114
+ title: string;
115
+ description?: string;
116
+ metadata?: Record<string, any>;
117
+ created_at: string;
118
+ updated_at: string;
119
+ }>;
120
+ /**
121
+ * List threads with optional filtering
122
+ * @param params List parameters
123
+ * @returns Paginated thread list
124
+ */
125
+ list: (params?: {
126
+ limit?: number;
127
+ offset?: number;
128
+ status?: "active" | "archived" | "completed";
129
+ }) => Promise<{
130
+ threads: Array<{
131
+ id: string;
132
+ title: string;
133
+ description?: string;
134
+ metadata?: Record<string, any>;
135
+ created_at: string;
136
+ updated_at: string;
137
+ }>;
138
+ total: number;
139
+ limit: number;
140
+ offset: number;
141
+ has_more: boolean;
142
+ }>;
143
+ /**
144
+ * Get a thread by ID
145
+ * @param threadId Thread UUID
146
+ * @param options Optional parameters
147
+ * @returns Thread details
148
+ */
149
+ get: (threadId: string, options?: {
150
+ include_memories?: boolean;
151
+ limit?: number;
152
+ }) => Promise<{
153
+ thread: {
154
+ id: string;
155
+ title: string;
156
+ description?: string;
157
+ status?: string;
158
+ metadata?: Record<string, any>;
159
+ created_at: string;
160
+ updated_at: string;
161
+ memory_ids?: string[];
162
+ memories?: any[];
163
+ };
164
+ }>;
165
+ /**
166
+ * Update a thread
167
+ * @param threadId Thread UUID
168
+ * @param updates Fields to update
169
+ * @returns Updated thread
170
+ */
171
+ update: (threadId: string, updates: {
172
+ title?: string;
173
+ description?: string;
174
+ status?: "active" | "archived" | "completed";
175
+ metadata?: Record<string, any>;
176
+ }) => Promise<{
177
+ thread: {
178
+ id: string;
179
+ title: string;
180
+ description?: string;
181
+ status?: string;
182
+ metadata?: Record<string, any>;
183
+ created_at: string;
184
+ updated_at: string;
185
+ };
186
+ message: string;
187
+ }>;
188
+ /**
189
+ * Delete a thread
190
+ * @param threadId Thread UUID
191
+ * @param deleteMemories If true, also delete associated memories
192
+ * @returns Deletion confirmation
193
+ */
194
+ delete: (threadId: string, deleteMemories?: boolean) => Promise<{
195
+ message: string;
196
+ memories_deleted: boolean;
197
+ }>;
198
+ };
199
+ }
200
+ declare class SovantError extends Error {
201
+ code: string;
202
+ status?: number;
203
+ details?: any;
204
+ constructor(message: string, code: string, status?: number, details?: any);
205
+ }
206
+
207
+ export { Sovant, type SovantClientOptions, SovantError };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type SovantClientOptions = {
1
+ type SovantClientOptions = {
2
2
  apiKey: string;
3
3
  baseUrl?: string;
4
4
  timeoutMs?: number;
@@ -17,7 +17,7 @@ export type SovantClientOptions = {
17
17
  }) => void;
18
18
  onError?: (err: SovantError) => void;
19
19
  };
20
- export declare class Sovant {
20
+ declare class Sovant {
21
21
  private apiKey;
22
22
  private baseUrl;
23
23
  private timeout;
@@ -197,10 +197,11 @@ export declare class Sovant {
197
197
  }>;
198
198
  };
199
199
  }
200
- export declare class SovantError extends Error {
200
+ declare class SovantError extends Error {
201
201
  code: string;
202
202
  status?: number;
203
203
  details?: any;
204
204
  constructor(message: string, code: string, status?: number, details?: any);
205
205
  }
206
- //# sourceMappingURL=index.d.ts.map
206
+
207
+ export { Sovant, type SovantClientOptions, SovantError };
package/dist/index.js CHANGED
@@ -1,299 +1,275 @@
1
- export class Sovant {
2
- apiKey;
3
- baseUrl;
4
- timeout;
5
- maxRetries;
6
- retryDelay;
7
- onRequest;
8
- onResponse;
9
- onError;
10
- constructor(opts) {
11
- if (!opts?.apiKey)
12
- throw new Error("Missing apiKey");
13
- this.apiKey = opts.apiKey;
14
- this.baseUrl = (opts.baseUrl ??
15
- process.env.SOVANT_BASE_URL ??
16
- "https://sovant.ai").replace(/\/+$/, "");
17
- this.timeout = opts.timeoutMs ?? 30000;
18
- this.maxRetries = opts.maxRetries ?? 3;
19
- this.retryDelay = opts.retryDelay ?? 1000;
20
- this.onRequest = opts.onRequest;
21
- this.onResponse = opts.onResponse;
22
- this.onError = opts.onError;
1
+ // src/index.ts
2
+ var Sovant = class {
3
+ apiKey;
4
+ baseUrl;
5
+ timeout;
6
+ maxRetries;
7
+ retryDelay;
8
+ onRequest;
9
+ onResponse;
10
+ onError;
11
+ constructor(opts) {
12
+ if (!opts?.apiKey) throw new Error("Missing apiKey");
13
+ this.apiKey = opts.apiKey;
14
+ this.baseUrl = (opts.baseUrl ?? process.env.SOVANT_BASE_URL ?? "https://sovant.ai").replace(/\/+$/, "");
15
+ this.timeout = opts.timeoutMs ?? 3e4;
16
+ this.maxRetries = opts.maxRetries ?? 3;
17
+ this.retryDelay = opts.retryDelay ?? 1e3;
18
+ this.onRequest = opts.onRequest;
19
+ this.onResponse = opts.onResponse;
20
+ this.onError = opts.onError;
21
+ }
22
+ async req(path, init) {
23
+ const method = init.method || "GET";
24
+ const startTime = Date.now();
25
+ if (this.onRequest) {
26
+ try {
27
+ const body = init.body ? JSON.parse(init.body) : void 0;
28
+ this.onRequest({ method, path, body });
29
+ } catch {
30
+ }
23
31
  }
24
- async req(path, init) {
25
- const method = init.method || "GET";
26
- const startTime = Date.now();
27
- // Telemetry: onRequest hook
28
- if (this.onRequest) {
29
- try {
30
- const body = init.body ? JSON.parse(init.body) : undefined;
31
- this.onRequest({ method, path, body });
32
- }
33
- catch { }
32
+ let lastError = null;
33
+ for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
34
+ const ctl = new AbortController();
35
+ const timeoutId = setTimeout(() => ctl.abort(), this.timeout);
36
+ try {
37
+ const res = await fetch(`${this.baseUrl}${path}`, {
38
+ ...init,
39
+ headers: {
40
+ "content-type": "application/json",
41
+ authorization: `Bearer ${this.apiKey}`,
42
+ ...init.headers || {}
43
+ },
44
+ signal: ctl.signal
45
+ });
46
+ clearTimeout(timeoutId);
47
+ const text = await res.text();
48
+ let body;
49
+ try {
50
+ body = text ? JSON.parse(text) : void 0;
51
+ } catch {
52
+ body = text;
34
53
  }
35
- let lastError = null;
36
- for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
37
- const ctl = new AbortController();
38
- const timeoutId = setTimeout(() => ctl.abort(), this.timeout);
54
+ if (!res.ok) {
55
+ const msg = body?.message || res.statusText;
56
+ const code = body?.code || `HTTP_${res.status}`;
57
+ const error = new SovantError(msg, code, res.status, body);
58
+ if (attempt < this.maxRetries && (res.status === 429 || res.status >= 500)) {
59
+ lastError = error;
60
+ const delay = this.retryDelay * Math.pow(2, attempt);
61
+ await new Promise((resolve) => setTimeout(resolve, delay));
62
+ continue;
63
+ }
64
+ if (this.onError) {
39
65
  try {
40
- const res = await fetch(`${this.baseUrl}${path}`, {
41
- ...init,
42
- headers: {
43
- "content-type": "application/json",
44
- authorization: `Bearer ${this.apiKey}`,
45
- ...(init.headers || {}),
46
- },
47
- signal: ctl.signal,
48
- });
49
- clearTimeout(timeoutId);
50
- const text = await res.text();
51
- let body;
52
- try {
53
- body = text ? JSON.parse(text) : undefined;
54
- }
55
- catch {
56
- body = text;
57
- }
58
- if (!res.ok) {
59
- const msg = body?.message || res.statusText;
60
- const code = body?.code || `HTTP_${res.status}`;
61
- const error = new SovantError(msg, code, res.status, body);
62
- // Retry on 429 (rate limit) or 5xx errors
63
- if (attempt < this.maxRetries &&
64
- (res.status === 429 || res.status >= 500)) {
65
- lastError = error;
66
- const delay = this.retryDelay * Math.pow(2, attempt); // Exponential backoff
67
- await new Promise((resolve) => setTimeout(resolve, delay));
68
- continue;
69
- }
70
- // Telemetry: onError hook
71
- if (this.onError) {
72
- try {
73
- this.onError(error);
74
- }
75
- catch { }
76
- }
77
- throw error;
78
- }
79
- // Success - telemetry: onResponse hook
80
- const duration = Date.now() - startTime;
81
- if (this.onResponse) {
82
- try {
83
- this.onResponse({ method, path, status: res.status, duration });
84
- }
85
- catch { }
86
- }
87
- return body;
88
- }
89
- catch (err) {
90
- clearTimeout(timeoutId);
91
- // Handle abort/timeout errors
92
- if (err instanceof Error && err.name === "AbortError") {
93
- const error = new SovantError("Request timeout", "TIMEOUT", 408);
94
- if (attempt < this.maxRetries) {
95
- lastError = error;
96
- const delay = this.retryDelay * Math.pow(2, attempt);
97
- await new Promise((resolve) => setTimeout(resolve, delay));
98
- continue;
99
- }
100
- throw error;
101
- }
102
- // Network errors
103
- if (err instanceof Error) {
104
- const error = new SovantError(err.message, "NETWORK_ERROR", 0);
105
- if (attempt < this.maxRetries) {
106
- lastError = error;
107
- const delay = this.retryDelay * Math.pow(2, attempt);
108
- await new Promise((resolve) => setTimeout(resolve, delay));
109
- continue;
110
- }
111
- throw error;
112
- }
113
- throw err;
66
+ this.onError(error);
67
+ } catch {
114
68
  }
69
+ }
70
+ throw error;
71
+ }
72
+ const duration = Date.now() - startTime;
73
+ if (this.onResponse) {
74
+ try {
75
+ this.onResponse({ method, path, status: res.status, duration });
76
+ } catch {
77
+ }
78
+ }
79
+ return body;
80
+ } catch (err) {
81
+ clearTimeout(timeoutId);
82
+ if (err instanceof Error && err.name === "AbortError") {
83
+ const error = new SovantError("Request timeout", "TIMEOUT", 408);
84
+ if (attempt < this.maxRetries) {
85
+ lastError = error;
86
+ const delay = this.retryDelay * Math.pow(2, attempt);
87
+ await new Promise((resolve) => setTimeout(resolve, delay));
88
+ continue;
89
+ }
90
+ throw error;
115
91
  }
116
- // If we exhausted retries, throw the last error
117
- throw (lastError || new SovantError("Max retries exceeded", "MAX_RETRIES", 0));
92
+ if (err instanceof Error) {
93
+ const error = new SovantError(err.message, "NETWORK_ERROR", 0);
94
+ if (attempt < this.maxRetries) {
95
+ lastError = error;
96
+ const delay = this.retryDelay * Math.pow(2, attempt);
97
+ await new Promise((resolve) => setTimeout(resolve, delay));
98
+ continue;
99
+ }
100
+ throw error;
101
+ }
102
+ throw err;
103
+ }
104
+ }
105
+ throw lastError || new SovantError("Max retries exceeded", "MAX_RETRIES", 0);
106
+ }
107
+ memory = {
108
+ create: (input) => this.req("/api/v1/memory", {
109
+ method: "POST",
110
+ body: JSON.stringify({
111
+ content: typeof input.data === "string" ? input.data : JSON.stringify(input.data),
112
+ type: input.type || "journal",
113
+ ttl: input.ttl,
114
+ tags: input.tags,
115
+ metadata: input.metadata,
116
+ thread_id: input.thread_id
117
+ })
118
+ }),
119
+ get: (id) => this.req(`/api/v1/memories/${encodeURIComponent(id)}`, {
120
+ method: "GET"
121
+ }),
122
+ search: (q) => {
123
+ const params = new URLSearchParams();
124
+ if (q.query) params.append("query", q.query);
125
+ if (q.type) params.append("type", q.type);
126
+ if (q.tags) params.append("tags", q.tags.join(","));
127
+ if (q.thread_id) params.append("thread_id", q.thread_id);
128
+ if (q.limit) params.append("limit", q.limit.toString());
129
+ if (q.from_date) params.append("from_date", q.from_date);
130
+ if (q.to_date) params.append("to_date", q.to_date);
131
+ return this.req(`/api/v1/memory/search?${params.toString()}`, {
132
+ method: "GET"
133
+ });
134
+ },
135
+ update: (id, patch) => this.req(`/api/v1/memories/${encodeURIComponent(id)}`, {
136
+ method: "PATCH",
137
+ body: JSON.stringify({
138
+ content: patch.data ? typeof patch.data === "string" ? patch.data : JSON.stringify(patch.data) : void 0,
139
+ type: patch.type,
140
+ ttl: patch.ttl,
141
+ tags: patch.tags,
142
+ metadata: patch.metadata
143
+ })
144
+ }),
145
+ delete: (id) => this.req(`/api/v1/memories/${encodeURIComponent(id)}`, {
146
+ method: "DELETE"
147
+ }),
148
+ /**
149
+ * Batch create multiple memories in a single request
150
+ * @param memories Array of memory objects to create (max 100)
151
+ * @returns BatchResponse with individual results
152
+ */
153
+ createBatch: (memories) => {
154
+ const operations = memories.map((mem) => ({
155
+ operation: "create",
156
+ data: {
157
+ content: typeof mem.data === "string" ? mem.data : JSON.stringify(mem.data),
158
+ type: mem.type || "journal",
159
+ tags: mem.tags,
160
+ metadata: mem.metadata,
161
+ thread_id: mem.thread_id
162
+ }
163
+ }));
164
+ return this.req("/api/v1/memory/batch", {
165
+ method: "POST",
166
+ body: JSON.stringify(operations)
167
+ });
168
+ },
169
+ /**
170
+ * Hybrid recall with profile awareness
171
+ * Uses multi-stage pipeline (profile fast-path + lexical + semantic)
172
+ * Guarantees profile facts (name/age/location) when available
173
+ *
174
+ * Use recall() for conversational queries ("who am I?", "what do you know about me?")
175
+ * Use search() for pure semantic topic lookup
176
+ */
177
+ recall: (q) => {
178
+ const params = new URLSearchParams();
179
+ params.append("query", q.query);
180
+ if (q.thread_id) params.append("thread_id", q.thread_id);
181
+ if (q.limit) params.append("limit", q.limit.toString());
182
+ return this.req(`/api/v1/memory/recall?${params.toString()}`, {
183
+ method: "GET"
184
+ });
118
185
  }
119
- memory = {
120
- create: (input) => this.req("/api/v1/memory", {
121
- method: "POST",
122
- body: JSON.stringify({
123
- content: typeof input.data === "string"
124
- ? input.data
125
- : JSON.stringify(input.data),
126
- type: input.type || "journal",
127
- ttl: input.ttl,
128
- tags: input.tags,
129
- metadata: input.metadata,
130
- thread_id: input.thread_id,
131
- }),
132
- }),
133
- get: (id) => this.req(`/api/v1/memories/${encodeURIComponent(id)}`, {
134
- method: "GET",
135
- }),
136
- search: (q) => {
137
- const params = new URLSearchParams();
138
- if (q.query)
139
- params.append("query", q.query);
140
- if (q.type)
141
- params.append("type", q.type);
142
- if (q.tags)
143
- params.append("tags", q.tags.join(","));
144
- if (q.thread_id)
145
- params.append("thread_id", q.thread_id);
146
- if (q.limit)
147
- params.append("limit", q.limit.toString());
148
- if (q.from_date)
149
- params.append("from_date", q.from_date);
150
- if (q.to_date)
151
- params.append("to_date", q.to_date);
152
- return this.req(`/api/v1/memory/search?${params.toString()}`, {
153
- method: "GET",
154
- });
155
- },
156
- update: (id, patch) => this.req(`/api/v1/memories/${encodeURIComponent(id)}`, {
157
- method: "PATCH",
158
- body: JSON.stringify({
159
- content: patch.data
160
- ? typeof patch.data === "string"
161
- ? patch.data
162
- : JSON.stringify(patch.data)
163
- : undefined,
164
- type: patch.type,
165
- ttl: patch.ttl,
166
- tags: patch.tags,
167
- metadata: patch.metadata,
168
- }),
169
- }),
170
- delete: (id) => this.req(`/api/v1/memories/${encodeURIComponent(id)}`, {
171
- method: "DELETE",
172
- }),
173
- /**
174
- * Batch create multiple memories in a single request
175
- * @param memories Array of memory objects to create (max 100)
176
- * @returns BatchResponse with individual results
177
- */
178
- createBatch: (memories) => {
179
- const operations = memories.map((mem) => ({
180
- operation: "create",
181
- data: {
182
- content: typeof mem.data === "string" ? mem.data : JSON.stringify(mem.data),
183
- type: mem.type || "journal",
184
- tags: mem.tags,
185
- metadata: mem.metadata,
186
- thread_id: mem.thread_id,
187
- },
188
- }));
189
- return this.req("/api/v1/memory/batch", {
190
- method: "POST",
191
- body: JSON.stringify(operations),
192
- });
193
- },
194
- /**
195
- * Hybrid recall with profile awareness
196
- * Uses multi-stage pipeline (profile fast-path + lexical + semantic)
197
- * Guarantees profile facts (name/age/location) when available
198
- *
199
- * Use recall() for conversational queries ("who am I?", "what do you know about me?")
200
- * Use search() for pure semantic topic lookup
201
- */
202
- recall: (q) => {
203
- const params = new URLSearchParams();
204
- params.append("query", q.query);
205
- if (q.thread_id)
206
- params.append("thread_id", q.thread_id);
207
- if (q.limit)
208
- params.append("limit", q.limit.toString());
209
- return this.req(`/api/v1/memory/recall?${params.toString()}`, {
210
- method: "GET",
211
- });
212
- },
213
- };
214
- threads = {
215
- /**
216
- * Create a new thread
217
- * @param input Thread creation parameters
218
- * @returns Created thread with ID
219
- */
220
- create: (input) => this.req("/api/v1/threads", {
221
- method: "POST",
222
- body: JSON.stringify({
223
- title: input.title,
224
- description: input.description,
225
- metadata: input.metadata,
226
- }),
227
- }),
228
- /**
229
- * List threads with optional filtering
230
- * @param params List parameters
231
- * @returns Paginated thread list
232
- */
233
- list: (params) => {
234
- const query = new URLSearchParams();
235
- if (params?.limit)
236
- query.append("limit", params.limit.toString());
237
- if (params?.offset)
238
- query.append("offset", params.offset.toString());
239
- if (params?.status)
240
- query.append("status", params.status);
241
- return this.req(`/api/v1/threads?${query.toString()}`, {
242
- method: "GET",
243
- });
244
- },
245
- /**
246
- * Get a thread by ID
247
- * @param threadId Thread UUID
248
- * @param options Optional parameters
249
- * @returns Thread details
250
- */
251
- get: (threadId, options) => {
252
- const query = new URLSearchParams();
253
- if (options?.include_memories)
254
- query.append("include_memories", "true");
255
- if (options?.limit)
256
- query.append("limit", options.limit.toString());
257
- return this.req(`/api/v1/threads/${encodeURIComponent(threadId)}?${query.toString()}`, {
258
- method: "GET",
259
- });
260
- },
261
- /**
262
- * Update a thread
263
- * @param threadId Thread UUID
264
- * @param updates Fields to update
265
- * @returns Updated thread
266
- */
267
- update: (threadId, updates) => this.req(`/api/v1/threads/${encodeURIComponent(threadId)}`, {
268
- method: "PUT",
269
- body: JSON.stringify(updates),
270
- }),
271
- /**
272
- * Delete a thread
273
- * @param threadId Thread UUID
274
- * @param deleteMemories If true, also delete associated memories
275
- * @returns Deletion confirmation
276
- */
277
- delete: (threadId, deleteMemories = false) => {
278
- const query = new URLSearchParams();
279
- if (deleteMemories)
280
- query.append("delete_memories", "true");
281
- return this.req(`/api/v1/threads/${encodeURIComponent(threadId)}?${query.toString()}`, {
282
- method: "DELETE",
283
- });
284
- },
285
- };
286
- }
287
- export class SovantError extends Error {
288
- code;
289
- status;
290
- details;
291
- constructor(message, code, status, details) {
292
- super(message);
293
- this.name = "SovantError";
294
- this.code = code;
295
- this.status = status;
296
- this.details = details;
186
+ };
187
+ threads = {
188
+ /**
189
+ * Create a new thread
190
+ * @param input Thread creation parameters
191
+ * @returns Created thread with ID
192
+ */
193
+ create: (input) => this.req("/api/v1/threads", {
194
+ method: "POST",
195
+ body: JSON.stringify({
196
+ title: input.title,
197
+ description: input.description,
198
+ metadata: input.metadata
199
+ })
200
+ }),
201
+ /**
202
+ * List threads with optional filtering
203
+ * @param params List parameters
204
+ * @returns Paginated thread list
205
+ */
206
+ list: (params) => {
207
+ const query = new URLSearchParams();
208
+ if (params?.limit) query.append("limit", params.limit.toString());
209
+ if (params?.offset) query.append("offset", params.offset.toString());
210
+ if (params?.status) query.append("status", params.status);
211
+ return this.req(`/api/v1/threads?${query.toString()}`, {
212
+ method: "GET"
213
+ });
214
+ },
215
+ /**
216
+ * Get a thread by ID
217
+ * @param threadId Thread UUID
218
+ * @param options Optional parameters
219
+ * @returns Thread details
220
+ */
221
+ get: (threadId, options) => {
222
+ const query = new URLSearchParams();
223
+ if (options?.include_memories) query.append("include_memories", "true");
224
+ if (options?.limit) query.append("limit", options.limit.toString());
225
+ return this.req(
226
+ `/api/v1/threads/${encodeURIComponent(threadId)}?${query.toString()}`,
227
+ {
228
+ method: "GET"
229
+ }
230
+ );
231
+ },
232
+ /**
233
+ * Update a thread
234
+ * @param threadId Thread UUID
235
+ * @param updates Fields to update
236
+ * @returns Updated thread
237
+ */
238
+ update: (threadId, updates) => this.req(`/api/v1/threads/${encodeURIComponent(threadId)}`, {
239
+ method: "PUT",
240
+ body: JSON.stringify(updates)
241
+ }),
242
+ /**
243
+ * Delete a thread
244
+ * @param threadId Thread UUID
245
+ * @param deleteMemories If true, also delete associated memories
246
+ * @returns Deletion confirmation
247
+ */
248
+ delete: (threadId, deleteMemories = false) => {
249
+ const query = new URLSearchParams();
250
+ if (deleteMemories) query.append("delete_memories", "true");
251
+ return this.req(
252
+ `/api/v1/threads/${encodeURIComponent(threadId)}?${query.toString()}`,
253
+ {
254
+ method: "DELETE"
255
+ }
256
+ );
297
257
  }
298
- }
299
- //# sourceMappingURL=index.js.map
258
+ };
259
+ };
260
+ var SovantError = class extends Error {
261
+ code;
262
+ status;
263
+ details;
264
+ constructor(message, code, status, details) {
265
+ super(message);
266
+ this.name = "SovantError";
267
+ this.code = code;
268
+ this.status = status;
269
+ this.details = details;
270
+ }
271
+ };
272
+ export {
273
+ Sovant,
274
+ SovantError
275
+ };
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@sovant/sdk",
3
- "version": "1.4.0",
3
+ "version": "1.4.2",
4
4
  "description": "Official Sovant Memory-as-a-Service SDK for JavaScript and TypeScript",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "exports": {
9
9
  ".": {
10
+ "types": "./dist/index.d.ts",
10
11
  "import": "./dist/index.js",
11
- "require": "./dist/index.cjs",
12
- "types": "./dist/index.d.ts"
12
+ "require": "./dist/index.cjs"
13
13
  }
14
14
  },
15
15
  "files": [
@@ -18,8 +18,9 @@
18
18
  "LICENSE"
19
19
  ],
20
20
  "scripts": {
21
- "build": "tsc -p tsconfig.build.json",
22
- "prepublishOnly": "npm run build",
21
+ "build": "tsup src/index.ts --format esm,cjs --dts --clean",
22
+ "typecheck": "tsc -p tsconfig.build.json --noEmit",
23
+ "prepublishOnly": "npm run typecheck && npm run build",
23
24
  "lint": "eslint .",
24
25
  "format": "prettier -w ."
25
26
  },
@@ -48,6 +49,7 @@
48
49
  "@types/node": "^24.10.0",
49
50
  "eslint": "^9.9.0",
50
51
  "prettier": "^3.3.3",
52
+ "tsup": "^8.5.1",
51
53
  "typescript": "^5.6.2"
52
54
  }
53
55
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,GAAG,CAAA;KAAE,KAAK,IAAI,CAAC;IACxE,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,KAAK,IAAI,CAAC;IACX,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;CACtC,CAAC;AAEF,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAC,CAIP;IACX,OAAO,CAAC,UAAU,CAAC,CAKR;IACX,OAAO,CAAC,OAAO,CAAC,CAA6B;gBAEjC,IAAI,EAAE,mBAAmB;YAgBvB,GAAG;IA+GjB,MAAM;iBACK,CAAC,eAAe;YACvB,IAAI,EAAE,CAAC,CAAC;YACR,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC;YACrE,GAAG,CAAC,EAAE,MAAM,CAAC;YACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;YAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB;kBAgBS,MAAM;oBAKJ;YACV,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;YAChB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB;iBAcQ,CAAC,YACJ,MAAM,SACH,OAAO,CAAC;YACb,IAAI,EAAE,CAAC,CAAC;YACR,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,GAAG,CAAC,EAAE,MAAM,CAAC;YACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;YAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;SAChC,CAAC;qBAiBS,MAAM;QAKnB;;;;WAIG;sBACW,CAAC,kBACH,KAAK,CAAC;YACd,IAAI,EAAE,CAAC,CAAC;YACR,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC;YACrE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;YAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;qBAeS,KAAK,CAAC;gBACb,OAAO,EAAE,OAAO,CAAC;gBACjB,SAAS,EAAE,MAAM,CAAC;gBAClB,EAAE,CAAC,EAAE,MAAM,CAAC;gBACZ,KAAK,CAAC,EAAE;oBAAE,IAAI,EAAE,MAAM,CAAC;oBAAC,OAAO,EAAE,MAAM,CAAA;iBAAE,CAAC;gBAC1C,KAAK,EAAE,MAAM,CAAC;aACf,CAAC;qBACO;gBACP,KAAK,EAAE,MAAM,CAAC;gBACd,UAAU,EAAE,MAAM,CAAC;gBACnB,MAAM,EAAE,MAAM,CAAC;aAChB;4BACe,MAAM;;QAO1B;;;;;;;WAOG;oBACS;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE;MASjE;IAEF,OAAO;QACL;;;;WAIG;wBACa;YACd,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;SAChC;gBAEO,OAAO;gBACP,MAAM;mBACH,MAAM;0BACC,MAAM;uBACT,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;wBAClB,MAAM;wBACN,MAAM;;QAUtB;;;;WAIG;wBACa;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;SAC9C;qBAMY,KAAK,CAAC;gBACb,EAAE,EAAE,MAAM,CAAC;gBACX,KAAK,EAAE,MAAM,CAAC;gBACd,WAAW,CAAC,EAAE,MAAM,CAAC;gBACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAC/B,UAAU,EAAE,MAAM,CAAC;gBACnB,UAAU,EAAE,MAAM,CAAC;aACpB,CAAC;mBACK,MAAM;mBACN,MAAM;oBACL,MAAM;sBACJ,OAAO;;QAMrB;;;;;WAKG;wBAES,MAAM,YACN;YAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE;oBAO9C;gBACN,EAAE,EAAE,MAAM,CAAC;gBACX,KAAK,EAAE,MAAM,CAAC;gBACd,WAAW,CAAC,EAAE,MAAM,CAAC;gBACrB,MAAM,CAAC,EAAE,MAAM,CAAC;gBAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAC/B,UAAU,EAAE,MAAM,CAAC;gBACnB,UAAU,EAAE,MAAM,CAAC;gBACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;gBACtB,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;aAClB;;QASL;;;;;WAKG;2BAES,MAAM,WACP;YACP,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;YAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;SAChC;oBAGS;gBACN,EAAE,EAAE,MAAM,CAAC;gBACX,KAAK,EAAE,MAAM,CAAC;gBACd,WAAW,CAAC,EAAE,MAAM,CAAC;gBACrB,MAAM,CAAC,EAAE,MAAM,CAAC;gBAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAC/B,UAAU,EAAE,MAAM,CAAC;gBACnB,UAAU,EAAE,MAAM,CAAC;aACpB;qBACQ,MAAM;;QAMnB;;;;;WAKG;2BACgB,MAAM;qBAIZ,MAAM;8BACG,OAAO;;MAQ7B;CACH;AAED,qBAAa,WAAY,SAAQ,KAAK;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,GAAG,CAAC;gBAEF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;CAO1E"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,MAAM;IACT,MAAM,CAAS;IACf,OAAO,CAAS;IAChB,OAAO,CAAS;IAChB,UAAU,CAAS;IACnB,UAAU,CAAS;IACnB,SAAS,CAIN;IACH,UAAU,CAKP;IACH,OAAO,CAA8B;IAE7C,YAAY,IAAyB;QACnC,IAAI,CAAC,IAAI,EAAE,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,CACb,IAAI,CAAC,OAAO;YACZ,OAAO,CAAC,GAAG,CAAC,eAAe;YAC3B,mBAAmB,CACpB,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;QACvC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,GAAG,CAAI,IAAY,EAAE,IAAiB;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,4BAA4B;QAC5B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACrE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QAED,IAAI,SAAS,GAAuB,IAAI,CAAC;QAEzC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YAC5D,MAAM,GAAG,GAAG,IAAI,eAAe,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAE9D,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;oBAChD,GAAG,IAAI;oBACP,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;wBACtC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;qBACxB;oBACD,MAAM,EAAE,GAAG,CAAC,MAAM;iBACnB,CAAC,CAAC;gBAEH,YAAY,CAAC,SAAS,CAAC,CAAC;gBAExB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC9B,IAAI,IAAS,CAAC;gBACd,IAAI,CAAC;oBACH,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC7C,CAAC;gBAAC,MAAM,CAAC;oBACP,IAAI,GAAG,IAAI,CAAC;gBACd,CAAC;gBAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBACZ,MAAM,GAAG,GAAG,IAAI,EAAE,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC;oBAC5C,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;oBAChD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;oBAE3D,0CAA0C;oBAC1C,IACE,OAAO,GAAG,IAAI,CAAC,UAAU;wBACzB,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,EACzC,CAAC;wBACD,SAAS,GAAG,KAAK,CAAC;wBAClB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,sBAAsB;wBAC5E,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;wBAC3D,SAAS;oBACX,CAAC;oBAED,0BAA0B;oBAC1B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;wBACjB,IAAI,CAAC;4BACH,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;wBACtB,CAAC;wBAAC,MAAM,CAAC,CAAA,CAAC;oBACZ,CAAC;oBAED,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,uCAAuC;gBACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBACxC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACpB,IAAI,CAAC;wBACH,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAClE,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBACZ,CAAC;gBAED,OAAO,IAAS,CAAC;YACnB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,YAAY,CAAC,SAAS,CAAC,CAAC;gBAExB,8BAA8B;gBAC9B,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBACtD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,iBAAiB,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;oBACjE,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;wBAC9B,SAAS,GAAG,KAAK,CAAC;wBAClB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;wBACrD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;wBAC3D,SAAS;oBACX,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,iBAAiB;gBACjB,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;oBACzB,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;oBAC/D,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;wBAC9B,SAAS,GAAG,KAAK,CAAC;wBAClB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;wBACrD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;wBAC3D,SAAS;oBACX,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QAED,gDAAgD;QAChD,MAAM,CACJ,SAAS,IAAI,IAAI,WAAW,CAAC,sBAAsB,EAAE,aAAa,EAAE,CAAC,CAAC,CACvE,CAAC;IACJ,CAAC;IAED,MAAM,GAAG;QACP,MAAM,EAAE,CAAU,KAOjB,EAAE,EAAE,CACH,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE;YACzB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,OAAO,EACL,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;oBAC5B,CAAC,CAAC,KAAK,CAAC,IAAI;oBACZ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;gBAChC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,SAAS;gBAC7B,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,SAAS,EAAE,KAAK,CAAC,SAAS;aAC3B,CAAC;SACH,CAAC;QAEJ,GAAG,EAAE,CAAC,EAAU,EAAE,EAAE,CAClB,IAAI,CAAC,GAAG,CAAC,oBAAoB,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE;YACrD,MAAM,EAAE,KAAK;SACd,CAAC;QAEJ,MAAM,EAAE,CAAC,CAQR,EAAE,EAAE;YACH,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,IAAI,CAAC,CAAC,KAAK;gBAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YAC7C,IAAI,CAAC,CAAC,IAAI;gBAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,CAAC,IAAI;gBAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACpD,IAAI,CAAC,CAAC,SAAS;gBAAE,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;YACzD,IAAI,CAAC,CAAC,KAAK;gBAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YACxD,IAAI,CAAC,CAAC,SAAS;gBAAE,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;YACzD,IAAI,CAAC,CAAC,OAAO;gBAAE,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC,GAAG,CAAC,yBAAyB,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE;gBAC5D,MAAM,EAAE,KAAK;aACd,CAAC,CAAC;QACL,CAAC;QAED,MAAM,EAAE,CACN,EAAU,EACV,KAME,EACF,EAAE,CACF,IAAI,CAAC,GAAG,CAAC,oBAAoB,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE;YACrD,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,OAAO,EAAE,KAAK,CAAC,IAAI;oBACjB,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;wBAC9B,CAAC,CAAC,KAAK,CAAC,IAAI;wBACZ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;oBAC9B,CAAC,CAAC,SAAS;gBACb,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACzB,CAAC;SACH,CAAC;QAEJ,MAAM,EAAE,CAAC,EAAU,EAAE,EAAE,CACrB,IAAI,CAAC,GAAG,CAAC,oBAAoB,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE;YACrD,MAAM,EAAE,QAAQ;SACjB,CAAC;QAEJ;;;;WAIG;QACH,WAAW,EAAE,CACX,QAME,EACF,EAAE;YACF,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACxC,SAAS,EAAE,QAAiB;gBAC5B,IAAI,EAAE;oBACJ,OAAO,EACL,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;oBACpE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,SAAS;oBAC3B,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,SAAS,EAAE,GAAG,CAAC,SAAS;iBACzB;aACF,CAAC,CAAC,CAAC;YAEJ,OAAO,IAAI,CAAC,GAAG,CAcZ,sBAAsB,EAAE;gBACzB,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;aACjC,CAAC,CAAC;QACL,CAAC;QAED;;;;;;;WAOG;QACH,MAAM,EAAE,CAAC,CAAwD,EAAE,EAAE;YACnE,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,CAAC,CAAC,SAAS;gBAAE,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;YACzD,IAAI,CAAC,CAAC,KAAK;gBAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,GAAG,CAAC,yBAAyB,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE;gBAC5D,MAAM,EAAE,KAAK;aACd,CAAC,CAAC;QACL,CAAC;KACF,CAAC;IAEF,OAAO,GAAG;QACR;;;;WAIG;QACH,MAAM,EAAE,CAAC,KAIR,EAAE,EAAE,CACH,IAAI,CAAC,GAAG,CAQL,iBAAiB,EAAE;YACpB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACzB,CAAC;SACH,CAAC;QAEJ;;;;WAIG;QACH,IAAI,EAAE,CAAC,MAIN,EAAE,EAAE;YACH,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;YACpC,IAAI,MAAM,EAAE,KAAK;gBAAE,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAClE,IAAI,MAAM,EAAE,MAAM;gBAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrE,IAAI,MAAM,EAAE,MAAM;gBAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1D,OAAO,IAAI,CAAC,GAAG,CAaZ,mBAAmB,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE;gBACxC,MAAM,EAAE,KAAK;aACd,CAAC,CAAC;QACL,CAAC;QAED;;;;;WAKG;QACH,GAAG,EAAE,CACH,QAAgB,EAChB,OAAwD,EACxD,EAAE;YACF,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;YACpC,IAAI,OAAO,EAAE,gBAAgB;gBAC3B,KAAK,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;YAC3C,IAAI,OAAO,EAAE,KAAK;gBAAE,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YACpE,OAAO,IAAI,CAAC,GAAG,CAab,mBAAmB,kBAAkB,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,EACrE;gBACE,MAAM,EAAE,KAAK;aACd,CACF,CAAC;QACJ,CAAC;QAED;;;;;WAKG;QACH,MAAM,EAAE,CACN,QAAgB,EAChB,OAKC,EACD,EAAE,CACF,IAAI,CAAC,GAAG,CAWL,mBAAmB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,EAAE;YACpD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC;QAEJ;;;;;WAKG;QACH,MAAM,EAAE,CAAC,QAAgB,EAAE,cAAc,GAAG,KAAK,EAAE,EAAE;YACnD,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;YACpC,IAAI,cAAc;gBAAE,KAAK,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;YAC5D,OAAO,IAAI,CAAC,GAAG,CAIb,mBAAmB,kBAAkB,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,EACrE;gBACE,MAAM,EAAE,QAAQ;aACjB,CACF,CAAC;QACJ,CAAC;KACF,CAAC;CACH;AAED,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,IAAI,CAAS;IACb,MAAM,CAAU;IAChB,OAAO,CAAO;IAEd,YAAY,OAAe,EAAE,IAAY,EAAE,MAAe,EAAE,OAAa;QACvE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF"}