@agentuity/core 0.0.33 → 0.0.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/index.js +5 -0
  2. package/dist/index.js.map +1 -0
  3. package/dist/json.js +23 -0
  4. package/dist/json.js.map +1 -0
  5. package/dist/services/_util.js +107 -0
  6. package/dist/services/_util.js.map +1 -0
  7. package/dist/services/adapter.js +2 -0
  8. package/dist/services/adapter.js.map +1 -0
  9. package/dist/services/exception.js +8 -0
  10. package/dist/services/exception.js.map +1 -0
  11. package/dist/services/index.js +8 -0
  12. package/dist/services/index.js.map +1 -0
  13. package/dist/services/keyvalue.js +85 -0
  14. package/dist/services/keyvalue.js.map +1 -0
  15. package/dist/services/objectstore.js +218 -0
  16. package/dist/services/objectstore.js.map +1 -0
  17. package/dist/services/stream.js +392 -0
  18. package/dist/services/stream.js.map +1 -0
  19. package/dist/services/vector.js +242 -0
  20. package/dist/services/vector.js.map +1 -0
  21. package/dist/standard_schema.js +2 -0
  22. package/dist/standard_schema.js.map +1 -0
  23. package/dist/typehelper.js +2 -0
  24. package/dist/typehelper.js.map +1 -0
  25. package/package.json +5 -4
  26. package/src/index.ts +4 -0
  27. package/src/json.ts +26 -0
  28. package/src/services/__test__/keyvalue.test.ts +402 -0
  29. package/src/services/__test__/mock-adapter.ts +114 -0
  30. package/src/services/__test__/objectstore.test.ts +431 -0
  31. package/src/services/__test__/stream.test.ts +554 -0
  32. package/src/services/__test__/vector.test.ts +813 -0
  33. package/src/services/_util.ts +117 -0
  34. package/src/services/adapter.ts +33 -0
  35. package/src/services/exception.ts +7 -0
  36. package/src/services/index.ts +7 -0
  37. package/src/services/keyvalue.ts +185 -0
  38. package/src/services/objectstore.ts +466 -0
  39. package/src/services/stream.ts +614 -0
  40. package/src/services/vector.ts +599 -0
  41. package/src/standard_schema.ts +69 -0
  42. package/src/typehelper.ts +5 -0
@@ -0,0 +1,392 @@
1
+ import { safeStringify } from '../json';
2
+ import { buildUrl, toServiceException } from './_util';
3
+ const encoder = new TextEncoder();
4
+ /**
5
+ * A writable stream implementation that extends WritableStream
6
+ */
7
+ class StreamImpl extends WritableStream {
8
+ id;
9
+ url;
10
+ activeWriter = null;
11
+ _compressed;
12
+ _adapter;
13
+ _sink;
14
+ constructor(id, url, compressed, underlyingSink, adapter) {
15
+ super(underlyingSink);
16
+ this.id = id;
17
+ this.url = url;
18
+ this._compressed = compressed;
19
+ this._adapter = adapter;
20
+ this._sink = underlyingSink;
21
+ }
22
+ get bytesWritten() {
23
+ return this._sink.total;
24
+ }
25
+ get compressed() {
26
+ return this._compressed;
27
+ }
28
+ /**
29
+ * Write data to the stream
30
+ */
31
+ async write(chunk) {
32
+ let binaryChunk;
33
+ if (chunk instanceof Uint8Array) {
34
+ binaryChunk = chunk;
35
+ }
36
+ else if (typeof chunk === 'string') {
37
+ binaryChunk = encoder.encode(chunk);
38
+ }
39
+ else if (chunk instanceof ArrayBuffer) {
40
+ binaryChunk = new Uint8Array(chunk);
41
+ }
42
+ else if (typeof chunk === 'object' && chunk !== null) {
43
+ binaryChunk = encoder.encode(safeStringify(chunk));
44
+ }
45
+ else {
46
+ binaryChunk = encoder.encode(String(chunk));
47
+ }
48
+ if (!this.activeWriter) {
49
+ this.activeWriter = this.getWriter();
50
+ }
51
+ await this.activeWriter.write(binaryChunk);
52
+ }
53
+ /**
54
+ * Override close to handle already closed streams gracefully
55
+ * This method safely closes the stream, or silently returns if already closed
56
+ */
57
+ async close() {
58
+ try {
59
+ // If we have an active writer from write() calls, use that
60
+ if (this.activeWriter) {
61
+ const writer = this.activeWriter;
62
+ this.activeWriter = null;
63
+ await writer.close();
64
+ return;
65
+ }
66
+ // Otherwise, get a writer and close it
67
+ const writer = this.getWriter();
68
+ await writer.close();
69
+ }
70
+ catch (error) {
71
+ // If we get a TypeError about the stream being closed, locked, or errored,
72
+ // that means pipeTo() or another operation already closed it or it's in use
73
+ if (error instanceof TypeError &&
74
+ (error.message.includes('closed') ||
75
+ error.message.includes('errored') ||
76
+ error.message.includes('Cannot close'))) {
77
+ // Silently return - this is the desired behavior
78
+ return Promise.resolve();
79
+ }
80
+ // If the stream is locked, try to close the underlying writer
81
+ if (error instanceof TypeError && error.message.includes('locked')) {
82
+ // Best-effort closure for locked streams
83
+ return Promise.resolve();
84
+ }
85
+ // Re-throw any other errors
86
+ throw error;
87
+ }
88
+ }
89
+ /**
90
+ * Get a ReadableStream that streams from the internal URL
91
+ *
92
+ * Note: This method will block waiting for data until writes start to the Stream.
93
+ * The returned ReadableStream will remain open until the Stream is closed or an error occurs.
94
+ *
95
+ * @returns a ReadableStream that can be passed to response.stream()
96
+ */
97
+ getReader() {
98
+ const url = this.url;
99
+ const adapter = this._adapter;
100
+ let ac = null;
101
+ return new ReadableStream({
102
+ async start(controller) {
103
+ try {
104
+ ac = new AbortController();
105
+ const res = await adapter.invoke(url, {
106
+ method: 'GET',
107
+ signal: ac.signal,
108
+ binary: true,
109
+ });
110
+ const response = res.response;
111
+ if (!res.ok) {
112
+ controller.error(new Error(`Failed to read stream: ${response.status} ${response.statusText}`));
113
+ return;
114
+ }
115
+ if (!response.body) {
116
+ controller.error(new Error('Response body is null'));
117
+ return;
118
+ }
119
+ const reader = response.body.getReader();
120
+ try {
121
+ // Iterative read to avoid recursive promise chains
122
+ while (true) {
123
+ const { done, value } = await reader.read();
124
+ if (done)
125
+ break;
126
+ if (value)
127
+ controller.enqueue(value);
128
+ }
129
+ controller.close();
130
+ }
131
+ catch (error) {
132
+ controller.error(error);
133
+ }
134
+ }
135
+ catch (error) {
136
+ controller.error(error);
137
+ }
138
+ },
139
+ cancel(reason) {
140
+ if (ac) {
141
+ ac.abort(reason);
142
+ ac = null;
143
+ }
144
+ },
145
+ });
146
+ }
147
+ }
148
+ // Create a WritableStream that writes to the backend stream
149
+ // Create the underlying sink that will handle the actual streaming
150
+ class UnderlyingSink {
151
+ adapter;
152
+ abortController = null;
153
+ writer = null;
154
+ putRequestPromise = null;
155
+ total = 0;
156
+ closed = false;
157
+ url;
158
+ props;
159
+ constructor(url, adapter, props) {
160
+ this.url = url;
161
+ this.adapter = adapter;
162
+ this.props = props;
163
+ }
164
+ async start() {
165
+ // Create AbortController for the fetch request
166
+ this.abortController = new AbortController();
167
+ // Create a ReadableStream to pipe data to the PUT request
168
+ // eslint-disable-next-line prefer-const
169
+ let { readable, writable } = new TransformStream();
170
+ // If compression is enabled, add gzip transform
171
+ if (this.props?.compress) {
172
+ const { Readable, Writable } = await import('node:stream');
173
+ // Create a new transform for the compressed output
174
+ const { readable: compressedReadable, writable: compressedWritable } = new TransformStream();
175
+ // Set up compression pipeline
176
+ const { createGzip } = await import('node:zlib');
177
+ const gzipStream = createGzip();
178
+ const nodeWritable = Writable.toWeb(gzipStream);
179
+ // Pipe gzip output to the compressed readable
180
+ const gzipReader = Readable.toWeb(gzipStream);
181
+ gzipReader.pipeTo(compressedWritable).catch((error) => {
182
+ this.abortController?.abort(error);
183
+ this.writer?.abort(error).catch(() => { });
184
+ });
185
+ // Chain: writable -> gzip -> compressedReadable
186
+ readable.pipeTo(nodeWritable).catch((error) => {
187
+ this.abortController?.abort(error);
188
+ this.writer?.abort(error).catch(() => { });
189
+ });
190
+ readable = compressedReadable;
191
+ }
192
+ this.writer = writable.getWriter();
193
+ // Start the PUT request with the readable stream as body
194
+ const headers = {
195
+ 'Content-Type': this.props?.contentType || 'application/octet-stream',
196
+ };
197
+ if (this.props?.compress) {
198
+ headers['Content-Encoding'] = 'gzip';
199
+ }
200
+ this.putRequestPromise = this.adapter.invoke(this.url, {
201
+ method: 'PUT',
202
+ headers,
203
+ body: readable,
204
+ signal: this.abortController.signal,
205
+ duplex: 'half',
206
+ });
207
+ }
208
+ async write(chunk) {
209
+ if (!this.writer) {
210
+ throw new Error('Stream writer not initialized');
211
+ }
212
+ // Convert input to Uint8Array if needed
213
+ let binaryChunk;
214
+ if (chunk instanceof Uint8Array) {
215
+ binaryChunk = chunk;
216
+ }
217
+ else if (typeof chunk === 'string') {
218
+ binaryChunk = new TextEncoder().encode(chunk);
219
+ }
220
+ else if (chunk instanceof ArrayBuffer) {
221
+ binaryChunk = new Uint8Array(chunk);
222
+ }
223
+ else if (typeof chunk === 'object' && chunk !== null) {
224
+ // Convert objects to JSON string, then to bytes
225
+ binaryChunk = new TextEncoder().encode(safeStringify(chunk));
226
+ }
227
+ else {
228
+ // Handle primitive types (number, boolean, etc.)
229
+ binaryChunk = new TextEncoder().encode(String(chunk));
230
+ }
231
+ // Write the chunk to the transform stream, which pipes to the PUT request
232
+ await this.writer.write(binaryChunk);
233
+ this.total += binaryChunk.length;
234
+ }
235
+ async close() {
236
+ if (this.closed) {
237
+ return;
238
+ }
239
+ this.closed = true;
240
+ if (this.writer) {
241
+ await this.writer.close();
242
+ this.writer = null;
243
+ }
244
+ // Wait for the PUT request to complete
245
+ if (this.putRequestPromise) {
246
+ try {
247
+ const res = await this.putRequestPromise;
248
+ if (!res.ok) {
249
+ throw new Error(`PUT request failed: ${res.response.status} ${res.response.statusText}`);
250
+ }
251
+ }
252
+ catch (error) {
253
+ if (error instanceof Error && error.name !== 'AbortError') {
254
+ throw error;
255
+ }
256
+ }
257
+ this.putRequestPromise = null;
258
+ }
259
+ this.abortController = null;
260
+ }
261
+ async abort(reason) {
262
+ if (this.writer) {
263
+ await this.writer.abort(reason);
264
+ this.writer = null;
265
+ }
266
+ // Abort the fetch request
267
+ if (this.abortController) {
268
+ this.abortController.abort(reason);
269
+ this.abortController = null;
270
+ }
271
+ this.putRequestPromise = null;
272
+ }
273
+ }
274
+ export class StreamStorageService {
275
+ #adapter;
276
+ #baseUrl;
277
+ constructor(baseUrl, adapter) {
278
+ this.#adapter = adapter;
279
+ this.#baseUrl = baseUrl;
280
+ }
281
+ async create(name, props) {
282
+ if (!name || name.length < 1 || name.length > 254) {
283
+ throw new Error('Stream name must be between 1 and 254 characters');
284
+ }
285
+ const url = this.#baseUrl;
286
+ const signal = AbortSignal.timeout(10_000);
287
+ const attributes = {
288
+ name,
289
+ };
290
+ if (!props?.contentType) {
291
+ props = props ?? {};
292
+ props.contentType = 'application/octet-stream';
293
+ }
294
+ if (props?.metadata) {
295
+ attributes['metadata'] = JSON.stringify(props.metadata);
296
+ }
297
+ if (props?.contentType) {
298
+ attributes['stream.content_type'] = props.contentType;
299
+ }
300
+ const body = JSON.stringify({
301
+ name,
302
+ ...(props?.metadata && { metadata: props.metadata }),
303
+ ...(props?.contentType && { contentType: props.contentType }),
304
+ });
305
+ const res = await this.#adapter.invoke(url, {
306
+ method: 'POST',
307
+ body,
308
+ contentType: 'application/json',
309
+ signal,
310
+ telemetry: {
311
+ name: 'agentuity.stream.create',
312
+ attributes,
313
+ },
314
+ });
315
+ if (res.ok) {
316
+ const streamUrl = buildUrl(this.#baseUrl, res.data.id);
317
+ const underlyingSink = new UnderlyingSink(streamUrl, this.#adapter, props);
318
+ const stream = new StreamImpl(res.data.id, streamUrl, props?.compress ?? false, underlyingSink, this.#adapter);
319
+ return stream;
320
+ }
321
+ throw await toServiceException(res.response);
322
+ }
323
+ async list(params) {
324
+ const attributes = {};
325
+ if (params?.limit !== undefined) {
326
+ if (params.limit <= 0 || params.limit > 1000) {
327
+ throw new Error('limit must be greater than 0 and less than or equal to 1000');
328
+ }
329
+ attributes['limit'] = String(params.limit);
330
+ }
331
+ if (params?.offset !== undefined) {
332
+ attributes['offset'] = String(params.offset);
333
+ }
334
+ if (params?.name) {
335
+ attributes['name'] = params.name;
336
+ }
337
+ if (params?.metadata) {
338
+ attributes['metadata'] = JSON.stringify(params.metadata);
339
+ }
340
+ const requestBody = {};
341
+ if (params?.name) {
342
+ requestBody.name = params.name;
343
+ }
344
+ if (params?.metadata) {
345
+ requestBody.metadata = params.metadata;
346
+ }
347
+ if (params?.limit) {
348
+ requestBody.limit = params.limit;
349
+ }
350
+ if (params?.offset) {
351
+ requestBody.offset = params.offset;
352
+ }
353
+ const signal = AbortSignal.timeout(30_000);
354
+ const url = buildUrl(this.#baseUrl, 'list');
355
+ const res = await this.#adapter.invoke(url, {
356
+ method: 'POST',
357
+ signal,
358
+ body: JSON.stringify(requestBody),
359
+ contentType: 'application/json',
360
+ telemetry: {
361
+ name: 'agentuity.stream.list',
362
+ attributes,
363
+ },
364
+ });
365
+ if (res.ok) {
366
+ return res.data;
367
+ }
368
+ throw await toServiceException(res.response);
369
+ }
370
+ async delete(id) {
371
+ if (!id || typeof id !== 'string' || id.trim().length === 0) {
372
+ throw new Error('Stream id is required and must be a non-empty string');
373
+ }
374
+ const signal = AbortSignal.timeout(30_000);
375
+ const url = buildUrl(this.#baseUrl, id);
376
+ const res = await this.#adapter.invoke(url, {
377
+ method: 'DELETE',
378
+ signal,
379
+ telemetry: {
380
+ name: 'agentuity.stream.delete',
381
+ attributes: {
382
+ 'stream.id': id,
383
+ },
384
+ },
385
+ });
386
+ if (res.ok) {
387
+ return;
388
+ }
389
+ throw await toServiceException(res.response);
390
+ }
391
+ }
392
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/services/stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,242 @@
1
+ import { buildUrl, toServiceException } from './_util';
2
+ import { safeStringify } from '../json';
3
+ export class VectorStorageService {
4
+ #adapter;
5
+ #baseUrl;
6
+ constructor(baseUrl, adapter) {
7
+ this.#adapter = adapter;
8
+ this.#baseUrl = baseUrl;
9
+ }
10
+ async upsert(name, ...documents) {
11
+ if (!name || typeof name !== 'string' || name.trim().length === 0) {
12
+ throw new Error('Vector storage name is required and must be a non-empty string');
13
+ }
14
+ if (!documents || documents.length === 0) {
15
+ throw new Error('At least one document is required for upsert');
16
+ }
17
+ for (const doc of documents) {
18
+ if (!doc.key || typeof doc.key !== 'string' || doc.key.trim().length === 0) {
19
+ throw new Error('Each document must have a non-empty key');
20
+ }
21
+ if (!('embeddings' in doc) && !('document' in doc)) {
22
+ throw new Error('Each document must have either embeddings or document text');
23
+ }
24
+ if ('embeddings' in doc && doc.embeddings) {
25
+ if (!Array.isArray(doc.embeddings) || doc.embeddings.length === 0) {
26
+ throw new Error('Embeddings must be a non-empty array of numbers');
27
+ }
28
+ }
29
+ if ('document' in doc && doc.document) {
30
+ if (typeof doc.document !== 'string' || doc.document.trim().length === 0) {
31
+ throw new Error('Document must be a non-empty string');
32
+ }
33
+ }
34
+ }
35
+ const url = buildUrl(this.#baseUrl, `/vector/2025-03-17/${encodeURIComponent(name)}`);
36
+ const signal = AbortSignal.timeout(30_000);
37
+ const res = await this.#adapter.invoke(url, {
38
+ method: 'PUT',
39
+ body: safeStringify(documents),
40
+ contentType: 'application/json',
41
+ signal,
42
+ telemetry: {
43
+ name: 'agentuity.vector.upsert',
44
+ attributes: {
45
+ name,
46
+ count: String(documents.length),
47
+ },
48
+ },
49
+ });
50
+ if (res.ok) {
51
+ if (res.data.success) {
52
+ return res.data.data.map((o, index) => ({
53
+ key: documents[index].key,
54
+ id: o.id,
55
+ }));
56
+ }
57
+ if ('message' in res.data) {
58
+ throw new Error(res.data.message);
59
+ }
60
+ }
61
+ throw await toServiceException(res.response);
62
+ }
63
+ async get(name, key) {
64
+ if (!name || typeof name !== 'string' || name.trim().length === 0) {
65
+ throw new Error('Vector storage name is required and must be a non-empty string');
66
+ }
67
+ if (!key || typeof key !== 'string' || key.trim().length === 0) {
68
+ throw new Error('Key is required and must be a non-empty string');
69
+ }
70
+ const url = buildUrl(this.#baseUrl, `/vector/2025-03-17/${encodeURIComponent(name)}/${encodeURIComponent(key)}`);
71
+ const signal = AbortSignal.timeout(10_000);
72
+ const res = await this.#adapter.invoke(url, {
73
+ method: 'GET',
74
+ signal,
75
+ telemetry: {
76
+ name: 'agentuity.vector.get',
77
+ attributes: {
78
+ name,
79
+ key,
80
+ },
81
+ },
82
+ });
83
+ if (res.response.status === 404) {
84
+ return { exists: false };
85
+ }
86
+ if (res.ok) {
87
+ if (res.data.success) {
88
+ return {
89
+ data: res.data.data,
90
+ exists: true,
91
+ };
92
+ }
93
+ if ('message' in res.data) {
94
+ throw new Error(res.data.message);
95
+ }
96
+ }
97
+ throw await toServiceException(res.response);
98
+ }
99
+ async getMany(name, ...keys) {
100
+ if (!name || typeof name !== 'string' || name.trim().length === 0) {
101
+ throw new Error('Vector storage name is required and must be a non-empty string');
102
+ }
103
+ if (keys.length === 0) {
104
+ return new Map();
105
+ }
106
+ for (const key of keys) {
107
+ if (!key || typeof key !== 'string' || key.trim().length === 0) {
108
+ throw new Error('All keys must be non-empty strings');
109
+ }
110
+ }
111
+ const results = await Promise.all(keys.map((key) => this.get(name, key)));
112
+ const resultMap = new Map();
113
+ results.forEach((result, index) => {
114
+ if (result.exists) {
115
+ resultMap.set(keys[index], result.data);
116
+ }
117
+ });
118
+ return resultMap;
119
+ }
120
+ async search(name, params) {
121
+ if (!name || typeof name !== 'string' || name.trim().length === 0) {
122
+ throw new Error('Vector storage name is required and must be a non-empty string');
123
+ }
124
+ if (!params.query || typeof params.query !== 'string' || params.query.trim().length === 0) {
125
+ throw new Error('Query is required and must be a non-empty string');
126
+ }
127
+ if (params.limit !== undefined) {
128
+ if (typeof params.limit !== 'number' || params.limit <= 0) {
129
+ throw new Error('Limit must be a positive number');
130
+ }
131
+ }
132
+ if (params.similarity !== undefined) {
133
+ if (typeof params.similarity !== 'number' ||
134
+ params.similarity < 0 ||
135
+ params.similarity > 1) {
136
+ throw new Error('Similarity must be a number between 0.0 and 1.0');
137
+ }
138
+ }
139
+ if (params.metadata !== undefined) {
140
+ if (typeof params.metadata !== 'object' || params.metadata === null) {
141
+ throw new Error('Metadata must be a valid object');
142
+ }
143
+ }
144
+ const url = buildUrl(this.#baseUrl, `/vector/2025-03-17/search/${encodeURIComponent(name)}`);
145
+ const signal = AbortSignal.timeout(30_000);
146
+ const attributes = {
147
+ name,
148
+ query: params.query,
149
+ };
150
+ if (params.limit !== undefined) {
151
+ attributes.limit = String(params.limit);
152
+ }
153
+ if (params.similarity !== undefined) {
154
+ attributes.similarity = String(params.similarity);
155
+ }
156
+ const res = await this.#adapter.invoke(url, {
157
+ method: 'POST',
158
+ body: safeStringify(params),
159
+ contentType: 'application/json',
160
+ signal,
161
+ telemetry: {
162
+ name: 'agentuity.vector.search',
163
+ attributes,
164
+ },
165
+ });
166
+ if (res.response.status === 404) {
167
+ return [];
168
+ }
169
+ if (res.ok) {
170
+ if (res.data.success) {
171
+ return res.data.data;
172
+ }
173
+ if ('message' in res.data) {
174
+ throw new Error(res.data.message);
175
+ }
176
+ }
177
+ throw await toServiceException(res.response);
178
+ }
179
+ async delete(name, ...keys) {
180
+ if (!name || typeof name !== 'string' || name.trim().length === 0) {
181
+ throw new Error('Vector storage name is required and must be a non-empty string');
182
+ }
183
+ if (keys.length === 0) {
184
+ return 0;
185
+ }
186
+ for (const key of keys) {
187
+ if (!key || typeof key !== 'string' || key.trim().length === 0) {
188
+ throw new Error('All keys must be non-empty strings');
189
+ }
190
+ }
191
+ const signal = AbortSignal.timeout(30_000);
192
+ let url;
193
+ let body;
194
+ if (keys.length === 1) {
195
+ url = buildUrl(this.#baseUrl, `/vector/2025-03-17/${encodeURIComponent(name)}/${encodeURIComponent(keys[0])}`);
196
+ }
197
+ else {
198
+ url = buildUrl(this.#baseUrl, `/vector/2025-03-17/${encodeURIComponent(name)}`);
199
+ body = safeStringify({ keys });
200
+ }
201
+ const res = await this.#adapter.invoke(url, {
202
+ method: 'DELETE',
203
+ ...(body && { body, contentType: 'application/json' }),
204
+ signal,
205
+ telemetry: {
206
+ name: 'agentuity.vector.delete',
207
+ attributes: {
208
+ name,
209
+ count: String(keys.length),
210
+ },
211
+ },
212
+ });
213
+ if (res.ok) {
214
+ if (res.data.success) {
215
+ return res.data.data;
216
+ }
217
+ if ('message' in res.data) {
218
+ throw new Error(res.data.message);
219
+ }
220
+ }
221
+ throw await toServiceException(res.response);
222
+ }
223
+ async exists(name) {
224
+ if (!name || typeof name !== 'string' || name.trim().length === 0) {
225
+ throw new Error('Vector storage name is required and must be a non-empty string');
226
+ }
227
+ try {
228
+ await this.search(name, { query: '_exists_check_', limit: 1 });
229
+ return true;
230
+ }
231
+ catch (error) {
232
+ if (error instanceof Error) {
233
+ const statusMatch = error.message.match(/(\d{3})/);
234
+ if (statusMatch && statusMatch[1] === '404') {
235
+ return false;
236
+ }
237
+ }
238
+ throw error;
239
+ }
240
+ }
241
+ }
242
+ //# sourceMappingURL=vector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector.js","sourceRoot":"","sources":["../../src/services/vector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=standard_schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard_schema.js","sourceRoot":"","sources":["../src/standard_schema.ts"],"names":[],"mappings":""}