@vertesia/client 0.51.0 → 0.54.0

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 (208) hide show
  1. package/LICENSE +3 -3
  2. package/package.json +27 -12
  3. package/src/AccountApi.ts +14 -2
  4. package/src/AccountsApi.ts +4 -0
  5. package/src/ApiKeysApi.ts +1 -1
  6. package/src/EnvironmentsApi.ts +2 -2
  7. package/src/InteractionBase.ts +1 -1
  8. package/src/InteractionsApi.ts +29 -7
  9. package/src/PluginsApi.ts +28 -0
  10. package/src/ProjectsApi.ts +10 -2
  11. package/src/PromptsApi.ts +1 -1
  12. package/src/RunsApi.ts +67 -30
  13. package/src/client.test.ts +94 -0
  14. package/src/client.ts +86 -13
  15. package/src/execute.ts +14 -8
  16. package/src/index.ts +2 -3
  17. package/src/nodejs/NodeStreamSource.ts +43 -0
  18. package/src/nodejs/index.ts +1 -0
  19. package/src/store/AnalyzeDocApi.ts +29 -9
  20. package/src/store/CommandsApi.ts +6 -33
  21. package/src/store/EmbeddingsApi.ts +39 -0
  22. package/src/store/FilesApi.ts +4 -0
  23. package/src/store/ObjectsApi.ts +179 -86
  24. package/src/store/TypesApi.ts +2 -1
  25. package/src/store/WorkflowsApi.ts +127 -25
  26. package/src/store/client.ts +2 -0
  27. package/lib/cjs/AccountApi.js +0 -74
  28. package/lib/cjs/AccountApi.js.map +0 -1
  29. package/lib/cjs/AccountsApi.js +0 -13
  30. package/lib/cjs/AccountsApi.js.map +0 -1
  31. package/lib/cjs/AnalyticsApi.js +0 -13
  32. package/lib/cjs/AnalyticsApi.js.map +0 -1
  33. package/lib/cjs/ApiKeysApi.js +0 -63
  34. package/lib/cjs/ApiKeysApi.js.map +0 -1
  35. package/lib/cjs/CommandsApi.js +0 -19
  36. package/lib/cjs/CommandsApi.js.map +0 -1
  37. package/lib/cjs/EnvironmentsApi.js +0 -58
  38. package/lib/cjs/EnvironmentsApi.js.map +0 -1
  39. package/lib/cjs/IamApi.js +0 -51
  40. package/lib/cjs/IamApi.js.map +0 -1
  41. package/lib/cjs/InteractionBase.js +0 -44
  42. package/lib/cjs/InteractionBase.js.map +0 -1
  43. package/lib/cjs/InteractionsApi.js +0 -192
  44. package/lib/cjs/InteractionsApi.js.map +0 -1
  45. package/lib/cjs/ProjectsApi.js +0 -48
  46. package/lib/cjs/ProjectsApi.js.map +0 -1
  47. package/lib/cjs/PromptsApi.js +0 -133
  48. package/lib/cjs/PromptsApi.js.map +0 -1
  49. package/lib/cjs/RefsApi.js +0 -14
  50. package/lib/cjs/RefsApi.js.map +0 -1
  51. package/lib/cjs/RunsApi.js +0 -80
  52. package/lib/cjs/RunsApi.js.map +0 -1
  53. package/lib/cjs/StreamSource.js +0 -17
  54. package/lib/cjs/StreamSource.js.map +0 -1
  55. package/lib/cjs/TrainingApi.js +0 -54
  56. package/lib/cjs/TrainingApi.js.map +0 -1
  57. package/lib/cjs/UsersApi.js +0 -13
  58. package/lib/cjs/UsersApi.js.map +0 -1
  59. package/lib/cjs/client.js +0 -161
  60. package/lib/cjs/client.js.map +0 -1
  61. package/lib/cjs/execute.js +0 -146
  62. package/lib/cjs/execute.js.map +0 -1
  63. package/lib/cjs/index.js +0 -22
  64. package/lib/cjs/index.js.map +0 -1
  65. package/lib/cjs/package.json +0 -3
  66. package/lib/cjs/store/AgentsApi.js +0 -16
  67. package/lib/cjs/store/AgentsApi.js.map +0 -1
  68. package/lib/cjs/store/AnalyzeDocApi.js +0 -37
  69. package/lib/cjs/store/AnalyzeDocApi.js.map +0 -1
  70. package/lib/cjs/store/CollectionsApi.js +0 -77
  71. package/lib/cjs/store/CollectionsApi.js.map +0 -1
  72. package/lib/cjs/store/CommandsApi.js +0 -33
  73. package/lib/cjs/store/CommandsApi.js.map +0 -1
  74. package/lib/cjs/store/FilesApi.js +0 -122
  75. package/lib/cjs/store/FilesApi.js.map +0 -1
  76. package/lib/cjs/store/ObjectsApi.js +0 -189
  77. package/lib/cjs/store/ObjectsApi.js.map +0 -1
  78. package/lib/cjs/store/TypesApi.js +0 -56
  79. package/lib/cjs/store/TypesApi.js.map +0 -1
  80. package/lib/cjs/store/WorkflowsApi.js +0 -92
  81. package/lib/cjs/store/WorkflowsApi.js.map +0 -1
  82. package/lib/cjs/store/client.js +0 -53
  83. package/lib/cjs/store/client.js.map +0 -1
  84. package/lib/cjs/store/errors.js +0 -11
  85. package/lib/cjs/store/errors.js.map +0 -1
  86. package/lib/cjs/store/index.js +0 -22
  87. package/lib/cjs/store/index.js.map +0 -1
  88. package/lib/esm/AccountApi.js +0 -71
  89. package/lib/esm/AccountApi.js.map +0 -1
  90. package/lib/esm/AccountsApi.js +0 -10
  91. package/lib/esm/AccountsApi.js.map +0 -1
  92. package/lib/esm/AnalyticsApi.js +0 -10
  93. package/lib/esm/AnalyticsApi.js.map +0 -1
  94. package/lib/esm/ApiKeysApi.js +0 -59
  95. package/lib/esm/ApiKeysApi.js.map +0 -1
  96. package/lib/esm/CommandsApi.js +0 -16
  97. package/lib/esm/CommandsApi.js.map +0 -1
  98. package/lib/esm/EnvironmentsApi.js +0 -55
  99. package/lib/esm/EnvironmentsApi.js.map +0 -1
  100. package/lib/esm/IamApi.js +0 -45
  101. package/lib/esm/IamApi.js.map +0 -1
  102. package/lib/esm/InteractionBase.js +0 -40
  103. package/lib/esm/InteractionBase.js.map +0 -1
  104. package/lib/esm/InteractionsApi.js +0 -189
  105. package/lib/esm/InteractionsApi.js.map +0 -1
  106. package/lib/esm/ProjectsApi.js +0 -45
  107. package/lib/esm/ProjectsApi.js.map +0 -1
  108. package/lib/esm/PromptsApi.js +0 -130
  109. package/lib/esm/PromptsApi.js.map +0 -1
  110. package/lib/esm/RefsApi.js +0 -10
  111. package/lib/esm/RefsApi.js.map +0 -1
  112. package/lib/esm/RunsApi.js +0 -76
  113. package/lib/esm/RunsApi.js.map +0 -1
  114. package/lib/esm/StreamSource.js +0 -13
  115. package/lib/esm/StreamSource.js.map +0 -1
  116. package/lib/esm/TrainingApi.js +0 -51
  117. package/lib/esm/TrainingApi.js.map +0 -1
  118. package/lib/esm/UsersApi.js +0 -10
  119. package/lib/esm/UsersApi.js.map +0 -1
  120. package/lib/esm/client.js +0 -154
  121. package/lib/esm/client.js.map +0 -1
  122. package/lib/esm/execute.js +0 -108
  123. package/lib/esm/execute.js.map +0 -1
  124. package/lib/esm/index.js +0 -6
  125. package/lib/esm/index.js.map +0 -1
  126. package/lib/esm/store/AgentsApi.js +0 -12
  127. package/lib/esm/store/AgentsApi.js.map +0 -1
  128. package/lib/esm/store/AnalyzeDocApi.js +0 -33
  129. package/lib/esm/store/AnalyzeDocApi.js.map +0 -1
  130. package/lib/esm/store/CollectionsApi.js +0 -73
  131. package/lib/esm/store/CollectionsApi.js.map +0 -1
  132. package/lib/esm/store/CommandsApi.js +0 -28
  133. package/lib/esm/store/CommandsApi.js.map +0 -1
  134. package/lib/esm/store/FilesApi.js +0 -117
  135. package/lib/esm/store/FilesApi.js.map +0 -1
  136. package/lib/esm/store/ObjectsApi.js +0 -185
  137. package/lib/esm/store/ObjectsApi.js.map +0 -1
  138. package/lib/esm/store/TypesApi.js +0 -52
  139. package/lib/esm/store/TypesApi.js.map +0 -1
  140. package/lib/esm/store/WorkflowsApi.js +0 -86
  141. package/lib/esm/store/WorkflowsApi.js.map +0 -1
  142. package/lib/esm/store/client.js +0 -49
  143. package/lib/esm/store/client.js.map +0 -1
  144. package/lib/esm/store/errors.js +0 -7
  145. package/lib/esm/store/errors.js.map +0 -1
  146. package/lib/esm/store/index.js +0 -6
  147. package/lib/esm/store/index.js.map +0 -1
  148. package/lib/tsconfig.tsbuildinfo +0 -1
  149. package/lib/types/AccountApi.d.ts +0 -53
  150. package/lib/types/AccountApi.d.ts.map +0 -1
  151. package/lib/types/AccountsApi.d.ts +0 -7
  152. package/lib/types/AccountsApi.d.ts.map +0 -1
  153. package/lib/types/AnalyticsApi.d.ts +0 -7
  154. package/lib/types/AnalyticsApi.d.ts.map +0 -1
  155. package/lib/types/ApiKeysApi.d.ts +0 -43
  156. package/lib/types/ApiKeysApi.d.ts.map +0 -1
  157. package/lib/types/CommandsApi.d.ts +0 -11
  158. package/lib/types/CommandsApi.d.ts.map +0 -1
  159. package/lib/types/EnvironmentsApi.d.ts +0 -31
  160. package/lib/types/EnvironmentsApi.d.ts.map +0 -1
  161. package/lib/types/IamApi.d.ts +0 -40
  162. package/lib/types/IamApi.d.ts.map +0 -1
  163. package/lib/types/InteractionBase.d.ts +0 -23
  164. package/lib/types/InteractionBase.d.ts.map +0 -1
  165. package/lib/types/InteractionsApi.d.ts +0 -136
  166. package/lib/types/InteractionsApi.d.ts.map +0 -1
  167. package/lib/types/ProjectsApi.d.ts +0 -18
  168. package/lib/types/ProjectsApi.d.ts.map +0 -1
  169. package/lib/types/PromptsApi.d.ts +0 -107
  170. package/lib/types/PromptsApi.d.ts.map +0 -1
  171. package/lib/types/RefsApi.d.ts +0 -7
  172. package/lib/types/RefsApi.d.ts.map +0 -1
  173. package/lib/types/RunsApi.d.ts +0 -64
  174. package/lib/types/RunsApi.d.ts.map +0 -1
  175. package/lib/types/StreamSource.d.ts +0 -8
  176. package/lib/types/StreamSource.d.ts.map +0 -1
  177. package/lib/types/TrainingApi.d.ts +0 -28
  178. package/lib/types/TrainingApi.d.ts.map +0 -1
  179. package/lib/types/UsersApi.d.ts +0 -7
  180. package/lib/types/UsersApi.d.ts.map +0 -1
  181. package/lib/types/client.d.ts +0 -86
  182. package/lib/types/client.d.ts.map +0 -1
  183. package/lib/types/execute.d.ts +0 -33
  184. package/lib/types/execute.d.ts.map +0 -1
  185. package/lib/types/index.d.ts +0 -9
  186. package/lib/types/index.d.ts.map +0 -1
  187. package/lib/types/store/AgentsApi.d.ts +0 -7
  188. package/lib/types/store/AgentsApi.d.ts.map +0 -1
  189. package/lib/types/store/AnalyzeDocApi.d.ts +0 -17
  190. package/lib/types/store/AnalyzeDocApi.d.ts.map +0 -1
  191. package/lib/types/store/CollectionsApi.d.ts +0 -38
  192. package/lib/types/store/CollectionsApi.d.ts.map +0 -1
  193. package/lib/types/store/CommandsApi.d.ts +0 -14
  194. package/lib/types/store/CommandsApi.d.ts.map +0 -1
  195. package/lib/types/store/FilesApi.d.ts +0 -42
  196. package/lib/types/store/FilesApi.d.ts.map +0 -1
  197. package/lib/types/store/ObjectsApi.d.ts +0 -79
  198. package/lib/types/store/ObjectsApi.d.ts.map +0 -1
  199. package/lib/types/store/TypesApi.d.ts +0 -23
  200. package/lib/types/store/TypesApi.d.ts.map +0 -1
  201. package/lib/types/store/WorkflowsApi.d.ts +0 -40
  202. package/lib/types/store/WorkflowsApi.d.ts.map +0 -1
  203. package/lib/types/store/client.d.ts +0 -28
  204. package/lib/types/store/client.d.ts.map +0 -1
  205. package/lib/types/store/errors.d.ts +0 -5
  206. package/lib/types/store/errors.d.ts.map +0 -1
  207. package/lib/types/store/index.d.ts +0 -6
  208. package/lib/types/store/index.d.ts.map +0 -1
@@ -1,35 +1,54 @@
1
- import { ApiTopic, ClientBase } from '@vertesia/api-fetch-client';
2
- import { ComplexSearchPayload, ComputeObjectFacetPayload, ContentObject, ContentObjectItem, ContentSource, CreateContentObjectPayload, Embedding, ExportPropertiesPayload, ExportPropertiesResponse, FindPayload, GetFileUrlPayload, GetFileUrlResponse, GetRenditionResponse, GetUploadUrlPayload, ListWorkflowRunsResponse, ObjectSearchPayload, ObjectSearchQuery, SupportedEmbeddingTypes } from '@vertesia/common';
3
-
4
- import { StreamSource } from '../StreamSource.js';
5
- import { ZenoClient } from './client.js';
6
- import { AnalyzeDocApi } from './AnalyzeDocApi.js';
7
-
8
- export interface UploadContentObjectPayload extends Omit<CreateContentObjectPayload, 'content'> {
9
- content?: StreamSource | File | {
10
-
11
- // the source URI
12
- source: string,
13
- // the original name of the input file if any
14
- name?: string,
15
- // the mime type of the content source.
16
- type?: string
17
-
18
- // the target id in the content store
19
- id?: string
20
-
21
- }
1
+ import { ApiTopic, ClientBase } from "@vertesia/api-fetch-client";
2
+ import {
3
+ ComplexSearchPayload,
4
+ ComputeObjectFacetPayload,
5
+ ContentObject,
6
+ ContentObjectItem,
7
+ ContentSource,
8
+ CreateContentObjectPayload,
9
+ Embedding,
10
+ ExportPropertiesPayload,
11
+ ExportPropertiesResponse,
12
+ FindPayload,
13
+ GetFileUrlPayload,
14
+ GetFileUrlResponse,
15
+ GetRenditionResponse,
16
+ GetUploadUrlPayload,
17
+ ListWorkflowRunsResponse,
18
+ ObjectSearchPayload,
19
+ ObjectSearchQuery,
20
+ SupportedEmbeddingTypes,
21
+ } from "@vertesia/common";
22
+
23
+ import { StreamSource } from "../StreamSource.js";
24
+ import { ZenoClient } from "./client.js";
25
+ import { AnalyzeDocApi } from "./AnalyzeDocApi.js";
26
+
27
+ export interface UploadContentObjectPayload extends Omit<CreateContentObjectPayload, "content"> {
28
+ content?:
29
+ | StreamSource
30
+ | File
31
+ | {
32
+ // the source URI
33
+ source: string;
34
+ // the original name of the input file if any
35
+ name?: string;
36
+ // the mime type of the content source.
37
+ type?: string;
38
+
39
+ // the target id in the content store
40
+ id?: string;
41
+ };
22
42
  }
23
43
 
24
44
  export interface ComputeFacetsResponse {
25
- type?: { _id: string, count: number }[];
26
- location?: { _id: string, count: number }[];
27
- status?: { _id: string, count: number }[];
45
+ type?: { _id: string; count: number }[];
46
+ location?: { _id: string; count: number }[];
47
+ status?: { _id: string; count: number }[];
28
48
  total?: { count: number }[];
29
49
  }
30
50
 
31
51
  export class ObjectsApi extends ApiTopic {
32
-
33
52
  constructor(parent: ClientBase) {
34
53
  super(parent, "/api/v1/objects");
35
54
  }
@@ -39,64 +58,85 @@ export class ObjectsApi extends ApiTopic {
39
58
  }
40
59
 
41
60
  getUploadUrl(payload: GetUploadUrlPayload): Promise<GetFileUrlResponse> {
42
- return this.post('/upload-url', {
43
- payload
44
- })
61
+ return this.post("/upload-url", {
62
+ payload,
63
+ });
45
64
  }
46
65
 
47
66
  getDownloadUrl(fileUri: string): Promise<{ url: string }> {
48
- return this.post('/download-url', {
67
+ return this.post("/download-url", {
49
68
  payload: {
50
- file: fileUri
51
- } satisfies GetFileUrlPayload
52
- })
69
+ file: fileUri,
70
+ } satisfies GetFileUrlPayload,
71
+ });
53
72
  }
54
73
 
55
74
  getContentSource(objectId: string): Promise<ContentSource> {
56
75
  return this.get(`/${objectId}/content-source`);
57
76
  }
58
77
 
59
- list(payload: ObjectSearchPayload = {}): Promise<ContentObjectItem[]> {
78
+ /**
79
+ * List objects with revision filtering options
80
+ *
81
+ * @param payload Search/filter parameters
82
+ * @returns Matching content objects
83
+ */
84
+ list<T = any>(payload: ObjectSearchPayload = {}): Promise<ContentObjectItem<T>[]> {
60
85
  const limit = payload.limit || 100;
61
86
  const offset = payload.offset || 0;
62
- const query = payload.query || {} as ObjectSearchQuery;
87
+ const query = payload.query || ({} as ObjectSearchQuery);
88
+
89
+ // Add revision filtering options
90
+ const showAllRevisions = payload.show_all_revisions === true;
91
+ const revisionRoot = payload.from_root;
63
92
 
64
93
  return this.get("/", {
65
94
  query: {
66
95
  limit,
67
96
  offset,
68
- ...query
69
- }
97
+ ...query,
98
+ show_all_revisions: showAllRevisions ? "true" : undefined,
99
+ from_root: revisionRoot,
100
+ },
70
101
  });
71
102
  }
72
103
 
73
104
  computeFacets(query: ComputeObjectFacetPayload): Promise<ComputeFacetsResponse> {
74
105
  return this.post("/facets", {
75
- payload: query
106
+ payload: query,
76
107
  });
77
108
  }
78
109
 
79
- listFolders(path: string = '/') {
80
- path;//TODO
110
+ listFolders(path: string = "/") {
111
+ path; //TODO
81
112
  }
82
113
 
114
+ /** Find object based on query */
83
115
  find(payload: FindPayload): Promise<ContentObject[]> {
84
116
  return this.post("/find", {
85
- payload
117
+ payload,
86
118
  });
87
119
  }
88
120
 
121
+ /** Count number of objects matching this query */
122
+ count(payload: FindPayload): Promise<{ count: number }> {
123
+ return this.post("/count", {
124
+ payload,
125
+ });
126
+ }
127
+
128
+ /** Search object — different from find because allow full text search */
89
129
  search(payload: ComplexSearchPayload): Promise<ContentObjectItem[]> {
90
130
  return this.post("/search", {
91
- payload
131
+ payload,
92
132
  });
93
133
  }
94
134
 
95
135
  retrieve(id: string, select?: string): Promise<ContentObject> {
96
136
  return this.get(`/${id}`, {
97
137
  query: {
98
- select
99
- }
138
+ select,
139
+ },
100
140
  });
101
141
  }
102
142
 
@@ -110,10 +150,10 @@ export class ObjectsApi extends ApiTopic {
110
150
  const { url, id, mime_type } = await this.getUploadUrl({
111
151
  id: isStream ? source.id : undefined,
112
152
  name: source.name,
113
- mime_type: source.type
153
+ mime_type: source.type,
114
154
  });
115
155
 
116
- console.log(`Uploading file to ${url}`, { id, mime_type, isStream, source })
156
+ console.log(`Uploading content to ${url}`, { id, mime_type, isStream, source });
117
157
 
118
158
  // upload the file content to the signed URL
119
159
  /*const res = await this.fetch(url, {
@@ -134,44 +174,50 @@ export class ObjectsApi extends ApiTopic {
134
174
  });*/
135
175
 
136
176
  const res = await fetch(url, {
137
- method: 'PUT',
177
+ method: "PUT",
138
178
  body: isStream ? source.stream : source,
139
179
  //@ts-ignore: duplex is not in the types. See https://github.com/node-fetch/node-fetch/issues/1769
140
180
  duplex: isStream ? "half" : undefined,
141
181
  headers: {
142
- 'Content-Type': mime_type || 'application/octet-stream'
143
- }
144
- }).then((res: Response) => {
145
- if (res.ok) {
146
- return res;
147
- } else {
148
- console.log(res);
149
- throw new Error(`Failed to upload file: ${res.statusText}`);
150
- }
151
- }).catch(err => {
152
- console.error('Failed to upload file', err);
153
- throw err;
154
- });
155
-
182
+ "Content-Type": mime_type || "application/octet-stream",
183
+ },
184
+ })
185
+ .then((res: Response) => {
186
+ if (res.ok) {
187
+ return res;
188
+ } else {
189
+ console.log(res);
190
+ throw new Error(`Failed to upload file: ${res.statusText}`);
191
+ }
192
+ })
193
+ .catch((err) => {
194
+ console.error("Failed to upload file", err);
195
+ throw err;
196
+ });
197
+
198
+ //Etag need to be unquoted
199
+ //When a server returns an ETag header, it includes the quotes around the actual hash value.
200
+ //This is part of the HTTP specification (RFC 7232), which states that ETags should be
201
+ //enclosed in double quotes.
202
+ const etag = res.headers.get("etag")?.replace(/^"(.*)"$/, "$1");
156
203
 
157
204
  return {
158
205
  source: id,
159
206
  name: source.name,
160
207
  type: mime_type,
161
- etag: res.headers.get('etag') ?? undefined
162
- }
208
+ etag,
209
+ };
163
210
  }
164
211
 
165
212
  async create(payload: UploadContentObjectPayload): Promise<ContentObject> {
166
-
167
213
  const createPayload: CreateContentObjectPayload = {
168
- ...payload
214
+ ...payload,
169
215
  };
170
216
  if (payload.content instanceof StreamSource || payload.content instanceof File) {
171
217
  createPayload.content = await this.upload(payload.content);
172
218
  }
173
- return await this.post('/', {
174
- payload: createPayload
219
+ return await this.post("/", {
220
+ payload: createPayload,
175
221
  });
176
222
  }
177
223
 
@@ -184,25 +230,72 @@ export class ObjectsApi extends ApiTopic {
184
230
  * @returns
185
231
  */
186
232
  async createFromExternalSource(uri: string, payload: CreateContentObjectPayload = {}): Promise<ContentObject> {
187
- const metadata = await ((this.client as ZenoClient).files.getMetadata(uri));
233
+ const metadata = await (this.client as ZenoClient).files.getMetadata(uri);
188
234
  const createPayload: CreateContentObjectPayload = {
189
235
  ...payload,
190
236
  content: {
191
237
  source: uri,
192
238
  name: metadata.name,
193
239
  type: metadata.contentType,
194
- etag: metadata.etag
195
- }
240
+ etag: metadata.etag,
241
+ },
196
242
  };
197
- return await this.post('/', {
198
- payload: createPayload
243
+ return await this.post("/", {
244
+ payload: createPayload,
199
245
  });
200
246
  }
201
247
 
202
- update(id: string, payload: Partial<CreateContentObjectPayload>): Promise<ContentObject> {
203
- return this.put(`/${id}`, {
204
- payload
205
- });
248
+ /**
249
+ * Updates an existing object or creates a new revision
250
+ * Handles file uploads similar to the create method
251
+ *
252
+ * @param id The ID of the object to update
253
+ * @param payload The changes to apply
254
+ * @param options Additional options
255
+ * @param options.createRevision Whether to create a new revision instead of updating in place
256
+ * @param options.revisionLabel Optional label for the revision (e.g., "v1.2")
257
+ * @returns The updated object or newly created revision
258
+ */
259
+ async update(
260
+ id: string,
261
+ payload: Partial<CreateContentObjectPayload>,
262
+ options?: {
263
+ createRevision?: boolean;
264
+ revisionLabel?: string;
265
+ },
266
+ ): Promise<ContentObject> {
267
+ const updatePayload: Partial<CreateContentObjectPayload> = {
268
+ ...payload,
269
+ };
270
+
271
+ // Handle file upload if content is provided as File or StreamSource
272
+ if (payload.content instanceof StreamSource || payload.content instanceof File) {
273
+ updatePayload.content = await this.upload(payload.content);
274
+ }
275
+
276
+ if (options?.createRevision) {
277
+ return this.put(`/${id}`, {
278
+ payload: updatePayload,
279
+ headers: {
280
+ "x-create-revision": "true",
281
+ "x-revision-label": options.revisionLabel || "",
282
+ },
283
+ });
284
+ } else {
285
+ return this.put(`/${id}`, {
286
+ payload: updatePayload,
287
+ });
288
+ }
289
+ }
290
+
291
+ /**
292
+ * Retrieves all revisions of a content object
293
+ *
294
+ * @param id The ID of any revision in the object's history
295
+ * @returns Array of all revisions sharing the same root
296
+ */
297
+ getRevisions(id: string): Promise<ContentObjectItem[]> {
298
+ return this.get(`/${id}/revisions`);
206
299
  }
207
300
 
208
301
  delete(id: string): Promise<{ id: string }> {
@@ -210,9 +303,7 @@ export class ObjectsApi extends ApiTopic {
210
303
  }
211
304
 
212
305
  listWorkflowRuns(documentId: string): Promise<ListWorkflowRunsResponse> {
213
-
214
- return this.get(`/${documentId}/workflow-runs`)
215
-
306
+ return this.get(`/${documentId}/workflow-runs`);
216
307
  }
217
308
 
218
309
  listRenditions(documentId: string): Promise<ContentObjectItem[]> {
@@ -220,31 +311,33 @@ export class ObjectsApi extends ApiTopic {
220
311
  }
221
312
 
222
313
  getRendition(documentId: string, options: GetRenditionParams): Promise<GetRenditionResponse> {
223
-
224
314
  const query = {
225
315
  max_hw: options.max_hw,
226
- generate_if_missing: options.generate_if_missing
227
- }
316
+ generate_if_missing: options.generate_if_missing,
317
+ };
228
318
 
229
319
  return this.get(`/${documentId}/renditions/${options.format}`, { query });
230
320
  }
231
321
 
232
322
  exportProperties(payload: ExportPropertiesPayload): Promise<ExportPropertiesResponse> {
233
323
  return this.post("/export", {
234
- payload
324
+ payload,
235
325
  });
236
326
  }
237
327
 
238
- setEmbedding(id: string, type: SupportedEmbeddingTypes, payload: Embedding): Promise<Record<SupportedEmbeddingTypes, Embedding>> {
328
+ setEmbedding(
329
+ id: string,
330
+ type: SupportedEmbeddingTypes,
331
+ payload: Embedding,
332
+ ): Promise<Record<SupportedEmbeddingTypes, Embedding>> {
239
333
  return this.put(`/${id}/embeddings/${type}`, {
240
- payload
334
+ payload,
241
335
  });
242
336
  }
243
-
244
337
  }
245
338
 
246
339
  interface GetRenditionParams {
247
340
  format: string;
248
341
  max_hw?: number;
249
342
  generate_if_missing?: boolean;
250
- }
343
+ }
@@ -16,7 +16,7 @@ export class TypesApi extends ApiTopic {
16
16
  * @param options
17
17
  * @returns
18
18
  */
19
- list(payload: ObjectTypeSearchPayload = {}, options?: { layout: boolean }): Promise<ContentObjectTypeItem[]> {
19
+ list(payload: ObjectTypeSearchPayload = {}, options?: { layout?: boolean, schema?: boolean }): Promise<ContentObjectTypeItem[]> {
20
20
  const limit = payload.limit || 100;
21
21
  const offset = payload.offset || 0;
22
22
  const query = payload.query || {} as ObjectTypeSearchQuery;
@@ -26,6 +26,7 @@ export class TypesApi extends ApiTopic {
26
26
  limit,
27
27
  offset,
28
28
  layout: options?.layout ? true : false,
29
+ schema: options?.schema ? true : false,
29
30
  ...query
30
31
  }
31
32
  });
@@ -1,8 +1,23 @@
1
- import { ApiTopic, ClientBase } from '@vertesia/api-fetch-client';
2
- import { ActivityCatalog, CreateWorkflowRulePayload, DSLWorkflowDefinition, DSLWorkflowSpec, ExecuteWorkflowPayload, ListWorkflowRunsPayload, ListWorkflowRunsResponse, WorkflowDefinitionRef, WorkflowRule, WorkflowRuleItem, WorkflowRunWithDetails } from '@vertesia/common';
1
+ import { ApiTopic, ClientBase } from "@vertesia/api-fetch-client";
2
+ import {
3
+ ActivityCatalog,
4
+ AgentMessage,
5
+ AgentMessageType,
6
+ CreateWorkflowRulePayload,
7
+ DSLWorkflowDefinition,
8
+ DSLWorkflowSpec,
9
+ ExecuteWorkflowPayload,
10
+ ListWorkflowRunsPayload,
11
+ ListWorkflowRunsResponse,
12
+ WorkflowDefinitionRef,
13
+ WorkflowRule,
14
+ WorkflowRuleItem,
15
+ WorkflowRunWithDetails,
16
+ } from "@vertesia/common";
17
+ import { VertesiaClient } from "../client.js";
18
+ import { EventSourceProvider } from "../execute.js";
3
19
 
4
20
  export class WorkflowsApi extends ApiTopic {
5
-
6
21
  constructor(parent: ClientBase) {
7
22
  super(parent, "/api/v1/workflows");
8
23
  }
@@ -19,53 +34,142 @@ export class WorkflowsApi extends ApiTopic {
19
34
  return this.post(`/runs`, { payload: payload });
20
35
  }
21
36
 
37
+ sendSignal(workflowId: string, runId: string, signal: string, payload?: any): Promise<{ message: string }> {
38
+ return this.post(`/runs/${workflowId}/${runId}/signal/${signal}`, { payload });
39
+ }
40
+
22
41
  getRunDetails(runId: string, workflowId: string): Promise<WorkflowRunWithDetails> {
23
- return this.get(`/runs/${workflowId}/${runId}`, { query: { workflowId } });
42
+ return this.get(`/runs/${workflowId}/${runId}`);
24
43
  }
25
44
 
26
45
  terminate(workflowId: string, runId: string, reason?: string): Promise<{ message: string }> {
27
- return this.post(`/runs/${workflowId}/${runId}/terminate`, { payload: { reason } });
46
+ return this.post(`/runs/${workflowId}/${runId}/actions/terminate`, { payload: { reason } });
28
47
  }
29
48
 
30
49
  cancel(workflowId: string, runId: string, reason?: string): Promise<{ message: string }> {
31
- return this.post(`/runs/${workflowId}/${runId}/cancel`, { payload: { reason } });
50
+ return this.post(`/runs/${workflowId}/${runId}/actions/cancel`, { payload: { reason } });
32
51
  }
33
52
 
34
- execute(name: string, payload: ExecuteWorkflowPayload = {}): Promise<{ runIds: string[] }> {
53
+ execute(
54
+ name: string,
55
+ payload: ExecuteWorkflowPayload = {},
56
+ ): Promise<({ run_id: string; workflow_id: string } | undefined)[]> {
35
57
  return this.post(`/execute/${name}`, { payload });
36
58
  }
37
59
 
60
+ postMessage(runId: string, message: string, type?: AgentMessageType, details?: any): Promise<void> {
61
+ if (!runId) {
62
+ throw new Error("runId is required");
63
+ }
64
+ const payload = {
65
+ message,
66
+ type,
67
+ details,
68
+ };
69
+ return this.post(`/runs/${runId}/updates`, { payload });
70
+ }
71
+
72
+ retrieveMessages(runId: string, since?: number): Promise<AgentMessage[]> {
73
+ const query = {
74
+ since,
75
+ };
76
+ return this.get(`/runs/${runId}/updates`, { query });
77
+ }
78
+
79
+ streamMessages(runId: string, onMessage?: (message: AgentMessage) => void, since?: number): Promise<void> {
80
+ return new Promise(async (resolve, reject) => {
81
+ try {
82
+ const EventSourceImpl = await EventSourceProvider();
83
+ const client = this.client as VertesiaClient;
84
+ const streamUrl = new URL(client.workflows.baseUrl + "/runs/" + runId + "/stream");
85
+
86
+ if (since) {
87
+ streamUrl.searchParams.set("since", since.toString());
88
+ }
89
+
90
+ const bearerToken = client._auth ? await client._auth() : undefined;
91
+ if (!bearerToken) return reject(new Error("No auth token available"));
92
+
93
+ const token = bearerToken.split(" ")[1];
94
+ streamUrl.searchParams.set("access_token", token);
95
+
96
+ const sse = new EventSourceImpl(streamUrl.href);
97
+ let isClosed = false;
98
+
99
+ sse.onmessage = (ev: MessageEvent) => {
100
+ if (!ev.data || ev.data.startsWith(":")) {
101
+ console.log("Received comment or heartbeat; ignoring it.: ", ev.data);
102
+ return;
103
+ }
104
+
105
+ try {
106
+ const message = JSON.parse(ev.data) as AgentMessage;
107
+ if (onMessage) onMessage(message);
108
+
109
+ if (message.type === AgentMessageType.COMPLETE) {
110
+ sse.close();
111
+ isClosed = true;
112
+ resolve();
113
+ }
114
+ } catch (err) {
115
+ console.error("Failed to parse SSE message:", err, ev.data);
116
+ }
117
+ };
118
+
119
+ sse.onerror = (err: any) => {
120
+ if (!isClosed) {
121
+ console.error("SSE stream error:", err);
122
+ sse.close();
123
+ reject(err);
124
+ }
125
+ };
126
+
127
+ // Prevent Node from exiting prematurely
128
+ const interval = setInterval(() => { }, 1000);
129
+
130
+ // Cleanup when stream resolves
131
+ const cleanup = () => {
132
+ clearInterval(interval);
133
+ };
134
+
135
+ // Attach cleanup
136
+ sse.addEventListener("close", () => {
137
+ isClosed = true;
138
+ cleanup();
139
+ resolve();
140
+ });
141
+ } catch (err) {
142
+ reject(err);
143
+ }
144
+ });
145
+ }
146
+
38
147
  rules = new WorkflowsRulesApi(this);
39
148
  definitions = new WorkflowsDefinitionApi(this);
40
-
41
149
  }
42
150
 
43
-
44
151
  export class WorkflowsRulesApi extends ApiTopic {
45
-
46
152
  constructor(parent: WorkflowsApi) {
47
153
  super(parent, "/rules");
48
154
  }
49
155
 
50
-
51
156
  list(): Promise<WorkflowRuleItem[]> {
52
157
  return this.get("/");
53
158
  }
54
159
 
55
-
56
160
  retrieve(id: string): Promise<WorkflowRule> {
57
161
  return this.get(`/${id}`);
58
162
  }
59
163
 
60
164
  update(id: string, payload: any): Promise<WorkflowRule> {
61
165
  return this.put(`/${id}`, {
62
- payload
166
+ payload,
63
167
  });
64
168
  }
65
169
 
66
170
  create(payload: CreateWorkflowRulePayload): Promise<WorkflowRule> {
67
171
  return this.post("/", {
68
- payload
172
+ payload,
69
173
  });
70
174
  }
71
175
 
@@ -73,19 +177,20 @@ export class WorkflowsRulesApi extends ApiTopic {
73
177
  return this.del(`/${id}`);
74
178
  }
75
179
 
76
-
77
- execute(id: string, objectIds?: string[], vars?: Record<string, any>): Promise<{ runIds: string[] }> {
180
+ execute(
181
+ id: string,
182
+ objectIds?: string[],
183
+ vars?: Record<string, any>,
184
+ ): Promise<({ run_id: string; workflow_id: string } | undefined)[]> {
78
185
  const payload: ExecuteWorkflowPayload = {
79
186
  objectIds,
80
- vars
187
+ vars,
81
188
  };
82
189
  return this.post(`/${id}/execute`, { payload });
83
190
  }
84
-
85
191
  }
86
192
 
87
193
  export class WorkflowsDefinitionApi extends ApiTopic {
88
-
89
194
  //model: DSLWorkflowDefinition;
90
195
 
91
196
  constructor(parent: WorkflowsApi) {
@@ -96,26 +201,23 @@ export class WorkflowsDefinitionApi extends ApiTopic {
96
201
  return this.get("/");
97
202
  }
98
203
 
99
-
100
204
  retrieve(id: string): Promise<DSLWorkflowDefinition> {
101
205
  return this.get(`/${id}`);
102
206
  }
103
207
 
104
208
  update(id: string, payload: any): Promise<DSLWorkflowDefinition> {
105
209
  return this.put(`/${id}`, {
106
- payload
210
+ payload,
107
211
  });
108
212
  }
109
213
 
110
214
  create(payload: DSLWorkflowSpec): Promise<DSLWorkflowDefinition> {
111
215
  return this.post("/", {
112
- payload
216
+ payload,
113
217
  });
114
218
  }
115
219
 
116
220
  delete(id: string) {
117
221
  return this.del(`/${id}`);
118
222
  }
119
-
120
-
121
- }
223
+ }
@@ -2,6 +2,7 @@ import { AbstractFetchClient, RequestError } from "@vertesia/api-fetch-client";
2
2
  import { BulkOperationPayload, BulkOperationResult } from "@vertesia/common";
3
3
  import { AgentsApi } from "./AgentsApi.js";
4
4
  import { CommandsApi } from "./CommandsApi.js";
5
+ import { EmbeddingsApi } from "./EmbeddingsApi.js";
5
6
  import { ZenoClientNotFoundError } from "./errors.js";
6
7
  import { FilesApi } from "./FilesApi.js";
7
8
  import { ObjectsApi } from "./ObjectsApi.js";
@@ -62,4 +63,5 @@ export class ZenoClient extends AbstractFetchClient<ZenoClient> {
62
63
  commands = new CommandsApi(this);
63
64
  agents = new AgentsApi(this);
64
65
  collections = new CollectionsApi(this);
66
+ embeddings = new EmbeddingsApi(this);
65
67
  }