@agentuity/core 0.0.32 → 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
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export * from './json';
2
+ export * from './services';
3
+ export * from './standard_schema';
4
+ export * from './typehelper';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC"}
package/dist/json.js ADDED
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Safely stringify an object to JSON, handling circular references
3
+ * @param obj - The object to stringify
4
+ * @returns JSON string representation
5
+ */
6
+ export function safeStringify(obj) {
7
+ const visited = new WeakSet();
8
+ function replacer(_key, value) {
9
+ if (typeof value === 'bigint') {
10
+ return value.toString();
11
+ }
12
+ if (typeof value === 'object' && value !== null) {
13
+ if (visited.has(value)) {
14
+ return '[Circular]';
15
+ }
16
+ visited.add(value);
17
+ return value;
18
+ }
19
+ return value;
20
+ }
21
+ return JSON.stringify(obj, replacer);
22
+ }
23
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACzC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAc;QAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;QACzB,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACjD,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,YAAY,CAAC;YACrB,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO,KAAK,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,107 @@
1
+ import { safeStringify } from '../json';
2
+ import { ServiceException } from './exception';
3
+ export const buildUrl = (base, path, subpath, query) => {
4
+ path = path.startsWith('/') ? path : `/${path}`;
5
+ let url = base.replace(/\/$/, '') + path;
6
+ if (subpath) {
7
+ subpath = subpath.startsWith('/') ? subpath : `/${subpath}`;
8
+ url += subpath;
9
+ }
10
+ if (query) {
11
+ url += `?${query.toString()}`;
12
+ }
13
+ return url;
14
+ };
15
+ export async function toServiceException(response) {
16
+ switch (response.status) {
17
+ case 401:
18
+ case 403:
19
+ return new ServiceException('Unauthorized', response.status);
20
+ case 404:
21
+ return new ServiceException('Not Found', response.status);
22
+ default:
23
+ }
24
+ const ct = response.headers.get('content-type');
25
+ if (ct?.includes('json')) {
26
+ try {
27
+ const payload = (await response.json());
28
+ if (payload.error) {
29
+ return new ServiceException(payload.error, response.status);
30
+ }
31
+ if (payload.message) {
32
+ return new ServiceException(payload.message, response.status);
33
+ }
34
+ return new ServiceException(JSON.stringify(payload), response.status);
35
+ }
36
+ catch {
37
+ /** don't worry */
38
+ }
39
+ }
40
+ try {
41
+ const body = await response.text();
42
+ return new ServiceException(body, response.status);
43
+ }
44
+ catch {
45
+ /* fall through */
46
+ }
47
+ return new ServiceException(response.statusText, response.status);
48
+ }
49
+ const binaryContentType = 'application/octet-stream';
50
+ const textContentType = 'text/plain';
51
+ const jsonContentType = 'application/json';
52
+ export async function toPayload(data) {
53
+ if (data === undefined || data === null) {
54
+ return ['', textContentType];
55
+ }
56
+ switch (typeof data) {
57
+ case 'string':
58
+ if ((data.charAt(0) === '{' && data.charAt(data.length - 1) === '}') ||
59
+ (data.charAt(0) === '[' && data.charAt(data.length - 1) === ']')) {
60
+ try {
61
+ JSON.parse(data);
62
+ return [data, jsonContentType];
63
+ }
64
+ catch {
65
+ /* fall through */
66
+ }
67
+ }
68
+ return [data, textContentType];
69
+ case 'boolean':
70
+ return [String(data), textContentType];
71
+ case 'number':
72
+ return [String(data), textContentType];
73
+ case 'object': {
74
+ if (data instanceof ArrayBuffer) {
75
+ return [data, binaryContentType];
76
+ }
77
+ if (data instanceof Buffer) {
78
+ return [data, binaryContentType];
79
+ }
80
+ if (data instanceof ReadableStream) {
81
+ return [data, binaryContentType];
82
+ }
83
+ if (data instanceof Promise) {
84
+ return toPayload(await data);
85
+ }
86
+ if (data instanceof Function) {
87
+ return toPayload(data());
88
+ }
89
+ return [safeStringify(data), jsonContentType];
90
+ }
91
+ }
92
+ return ['', textContentType];
93
+ }
94
+ export async function fromResponse(response) {
95
+ const contentType = response.headers.get('content-type');
96
+ if (!contentType || contentType?.includes('/json')) {
97
+ return (await response.json());
98
+ }
99
+ if (contentType?.includes('text/')) {
100
+ return (await response.text());
101
+ }
102
+ if (contentType?.includes(binaryContentType)) {
103
+ return (await response.arrayBuffer());
104
+ }
105
+ throw new ServiceException(`Unsupported content-type: ${contentType}`, response.status);
106
+ }
107
+ //# sourceMappingURL=_util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_util.js","sourceRoot":"","sources":["../../src/services/_util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/services/adapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ export class ServiceException extends Error {
2
+ statusCode;
3
+ constructor(message, statusCode) {
4
+ super(message);
5
+ this.statusCode = statusCode;
6
+ }
7
+ }
8
+ //# sourceMappingURL=exception.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exception.js","sourceRoot":"","sources":["../../src/services/exception.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAC1C,UAAU,CAAS;IACnB,YAAY,OAAe,EAAE,UAAkB;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC9B,CAAC;CACD"}
@@ -0,0 +1,8 @@
1
+ export * from './adapter';
2
+ export * from './exception';
3
+ export * from './keyvalue';
4
+ export * from './objectstore';
5
+ export * from './stream';
6
+ export * from './vector';
7
+ export { buildUrl, toServiceException, toPayload, fromResponse } from './_util';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { buildUrl, toServiceException, toPayload } from './_util';
2
+ export class KeyValueStorageService {
3
+ #adapter;
4
+ #baseUrl;
5
+ constructor(baseUrl, adapter) {
6
+ this.#adapter = adapter;
7
+ this.#baseUrl = baseUrl;
8
+ }
9
+ async get(name, key) {
10
+ const url = buildUrl(this.#baseUrl, `/kv/2025-03-17/${encodeURIComponent(name)}/${encodeURIComponent(key)}`);
11
+ const signal = AbortSignal.timeout(10_000);
12
+ const res = await this.#adapter.invoke(url, {
13
+ method: 'GET',
14
+ signal,
15
+ telemetry: {
16
+ name: 'agentuity.keyvalue.get',
17
+ attributes: {
18
+ name,
19
+ key,
20
+ },
21
+ },
22
+ });
23
+ if (res.ok) {
24
+ return {
25
+ data: res.data,
26
+ contentType: res.response.headers.get('content-type') ?? 'application/octet-stream',
27
+ exists: true,
28
+ };
29
+ }
30
+ if (res.response.status === 404) {
31
+ return { exists: false };
32
+ }
33
+ throw await toServiceException(res.response);
34
+ }
35
+ async set(name, key, value, params) {
36
+ let ttlstr = '';
37
+ if (params?.ttl) {
38
+ if (params.ttl < 60) {
39
+ throw new Error(`ttl for keyvalue set must be at least 60 seconds, got ${params.ttl}`);
40
+ }
41
+ ttlstr = `/${params.ttl}`;
42
+ }
43
+ const url = buildUrl(this.#baseUrl, `/kv/2025-03-17/${encodeURIComponent(name)}/${encodeURIComponent(key)}${ttlstr}`);
44
+ const [body, contentType] = await toPayload(value);
45
+ const signal = AbortSignal.timeout(30_000);
46
+ const res = await this.#adapter.invoke(url, {
47
+ method: 'PUT',
48
+ signal,
49
+ body,
50
+ contentType: params?.contentType || contentType,
51
+ telemetry: {
52
+ name: 'agentuity.keyvalue.set',
53
+ attributes: {
54
+ name,
55
+ key,
56
+ ttl: ttlstr,
57
+ },
58
+ },
59
+ });
60
+ if (res.ok) {
61
+ return;
62
+ }
63
+ throw await toServiceException(res.response);
64
+ }
65
+ async delete(name, key) {
66
+ const url = buildUrl(this.#baseUrl, `/kv/2025-03-17/${encodeURIComponent(name)}/${encodeURIComponent(key)}`);
67
+ const signal = AbortSignal.timeout(30_000);
68
+ const res = await this.#adapter.invoke(url, {
69
+ method: 'DELETE',
70
+ signal,
71
+ telemetry: {
72
+ name: 'agentuity.keyvalue.delete',
73
+ attributes: {
74
+ name,
75
+ key,
76
+ },
77
+ },
78
+ });
79
+ if (res.ok) {
80
+ return;
81
+ }
82
+ throw await toServiceException(res.response);
83
+ }
84
+ }
85
+ //# sourceMappingURL=keyvalue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyvalue.js","sourceRoot":"","sources":["../../src/services/keyvalue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,218 @@
1
+ import { buildUrl, toServiceException } from './_util';
2
+ /**
3
+ * Implementation of the ObjectStorage interface
4
+ */
5
+ export class ObjectStorageService {
6
+ #adapter;
7
+ #baseUrl;
8
+ constructor(baseUrl, adapter) {
9
+ this.#baseUrl = baseUrl;
10
+ this.#adapter = adapter;
11
+ }
12
+ async get(bucket, key) {
13
+ if (!bucket?.trim()) {
14
+ throw new Error('bucket is required and cannot be empty');
15
+ }
16
+ if (!key?.trim()) {
17
+ throw new Error('key is required and cannot be empty');
18
+ }
19
+ const url = buildUrl(this.#baseUrl, `/object/2025-03-17/${encodeURIComponent(bucket)}/${encodeURIComponent(key)}`);
20
+ const signal = AbortSignal.timeout(10_000);
21
+ const options = {
22
+ method: 'GET',
23
+ signal,
24
+ telemetry: {
25
+ name: 'agentuity.objectstore.get',
26
+ attributes: {
27
+ 'objectstore.bucket': bucket,
28
+ 'objectstore.key': key,
29
+ },
30
+ },
31
+ };
32
+ try {
33
+ const result = await this.#adapter.invoke(url, options);
34
+ if (result.response.status === 404) {
35
+ return { exists: false };
36
+ }
37
+ if (!result.ok) {
38
+ throw new Error(`Failed to get object: ${result.response.statusText} (${result.response.status})`);
39
+ }
40
+ const data = result.data;
41
+ if (!(data instanceof ArrayBuffer)) {
42
+ throw new Error('Expected ArrayBuffer response from object store');
43
+ }
44
+ const contentType = result.response.headers.get('content-type') || 'application/octet-stream';
45
+ return {
46
+ exists: true,
47
+ data: new Uint8Array(data),
48
+ contentType,
49
+ };
50
+ }
51
+ catch (err) {
52
+ if (err instanceof Response) {
53
+ throw await toServiceException(err);
54
+ }
55
+ throw err;
56
+ }
57
+ }
58
+ async put(bucket, key, data, params) {
59
+ if (!bucket?.trim()) {
60
+ throw new Error('bucket is required and cannot be empty');
61
+ }
62
+ if (!key?.trim()) {
63
+ throw new Error('key is required and cannot be empty');
64
+ }
65
+ if (!data) {
66
+ throw new Error('data is required');
67
+ }
68
+ const url = buildUrl(this.#baseUrl, `/object/2025-03-17/${encodeURIComponent(bucket)}/${encodeURIComponent(key)}`);
69
+ const headers = {
70
+ 'Content-Type': params?.contentType || 'application/octet-stream',
71
+ };
72
+ if (params?.contentEncoding) {
73
+ headers['Content-Encoding'] = params.contentEncoding;
74
+ }
75
+ if (params?.cacheControl) {
76
+ headers['Cache-Control'] = params.cacheControl;
77
+ }
78
+ if (params?.contentDisposition) {
79
+ headers['Content-Disposition'] = params.contentDisposition;
80
+ }
81
+ if (params?.contentLanguage) {
82
+ headers['Content-Language'] = params.contentLanguage;
83
+ }
84
+ if (params?.metadata) {
85
+ for (const [metaKey, metaValue] of Object.entries(params.metadata)) {
86
+ headers[`x-metadata-${metaKey}`] = metaValue;
87
+ }
88
+ }
89
+ let body;
90
+ if (data instanceof ArrayBuffer) {
91
+ body = data;
92
+ }
93
+ else if (data instanceof Uint8Array) {
94
+ if (data.byteOffset !== 0 || data.byteLength !== data.buffer.byteLength) {
95
+ body = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
96
+ }
97
+ else {
98
+ body = data.buffer;
99
+ }
100
+ }
101
+ else {
102
+ body = data;
103
+ }
104
+ const signal = AbortSignal.timeout(30_000);
105
+ const options = {
106
+ method: 'PUT',
107
+ headers,
108
+ body,
109
+ signal,
110
+ telemetry: {
111
+ name: 'agentuity.objectstore.put',
112
+ attributes: {
113
+ 'objectstore.bucket': bucket,
114
+ 'objectstore.key': key,
115
+ 'objectstore.contentType': params?.contentType || 'application/octet-stream',
116
+ },
117
+ },
118
+ };
119
+ try {
120
+ const result = await this.#adapter.invoke(url, options);
121
+ if (!result.ok || (result.response.status !== 200 && result.response.status !== 201)) {
122
+ throw new Error(`Failed to put object: ${result.response.statusText} (${result.response.status})`);
123
+ }
124
+ }
125
+ catch (err) {
126
+ if (err instanceof Response) {
127
+ throw await toServiceException(err);
128
+ }
129
+ throw err;
130
+ }
131
+ }
132
+ async delete(bucket, key) {
133
+ if (!bucket?.trim()) {
134
+ throw new Error('bucket is required and cannot be empty');
135
+ }
136
+ if (!key?.trim()) {
137
+ throw new Error('key is required and cannot be empty');
138
+ }
139
+ const url = buildUrl(this.#baseUrl, `/object/2025-03-17/${encodeURIComponent(bucket)}/${encodeURIComponent(key)}`);
140
+ const signal = AbortSignal.timeout(10_000);
141
+ const options = {
142
+ method: 'DELETE',
143
+ signal,
144
+ telemetry: {
145
+ name: 'agentuity.objectstore.delete',
146
+ attributes: {
147
+ 'objectstore.bucket': bucket,
148
+ 'objectstore.key': key,
149
+ },
150
+ },
151
+ };
152
+ try {
153
+ const result = await this.#adapter.invoke(url, options);
154
+ if (result.response.status === 404) {
155
+ return false;
156
+ }
157
+ if (result.response.status === 200) {
158
+ return true;
159
+ }
160
+ throw new Error(`Failed to delete object: ${result.response.statusText} (${result.response.status})`);
161
+ }
162
+ catch (err) {
163
+ if (err instanceof Response) {
164
+ throw await toServiceException(err);
165
+ }
166
+ throw err;
167
+ }
168
+ }
169
+ async createPublicURL(bucket, key, params) {
170
+ if (!bucket?.trim()) {
171
+ throw new Error('bucket is required and cannot be empty');
172
+ }
173
+ if (!key?.trim()) {
174
+ throw new Error('key is required and cannot be empty');
175
+ }
176
+ const url = buildUrl(this.#baseUrl, `/object/2025-03-17/presigned/${encodeURIComponent(bucket)}/${encodeURIComponent(key)}`);
177
+ const requestBody = {};
178
+ if (params?.expiresDuration) {
179
+ requestBody.expires = params.expiresDuration;
180
+ }
181
+ const signal = AbortSignal.timeout(10_000);
182
+ const options = {
183
+ method: 'POST',
184
+ contentType: 'application/json',
185
+ body: JSON.stringify(requestBody),
186
+ signal,
187
+ telemetry: {
188
+ name: 'agentuity.objectstore.createPublicURL',
189
+ attributes: {
190
+ 'objectstore.bucket': bucket,
191
+ 'objectstore.key': key,
192
+ 'objectstore.expiresDuration': params?.expiresDuration?.toString() || '',
193
+ },
194
+ },
195
+ };
196
+ try {
197
+ const result = await this.#adapter.invoke(url, options);
198
+ if (!result.ok) {
199
+ throw new Error(`Failed to create public URL: ${result.response.statusText} (${result.response.status})`);
200
+ }
201
+ const data = result.data;
202
+ if (!data.success) {
203
+ throw new Error(data.message || 'Failed to create public URL');
204
+ }
205
+ return data.url;
206
+ }
207
+ catch (err) {
208
+ if (err instanceof Error && err.message.includes('Object not found')) {
209
+ throw err;
210
+ }
211
+ if (err instanceof Response) {
212
+ throw await toServiceException(err);
213
+ }
214
+ throw err;
215
+ }
216
+ }
217
+ }
218
+ //# sourceMappingURL=objectstore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objectstore.js","sourceRoot":"","sources":["../../src/services/objectstore.ts"],"names":[],"mappings":"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"}