@datatechsolutions/ui 2.11.82 → 2.11.84
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/dist/astrlabe/index.d.mts +2 -2
- package/dist/astrlabe/index.d.ts +2 -2
- package/dist/astrlabe/index.js +110 -106
- package/dist/astrlabe/index.mjs +4 -4
- package/dist/astrlabe/workflow-canvas.js +4 -4
- package/dist/astrlabe/workflow-canvas.mjs +3 -3
- package/dist/chunk-3T2WGL47.js +44 -0
- package/dist/chunk-3T2WGL47.js.map +1 -0
- package/dist/{chunk-HAZP5J67.mjs → chunk-63AL2RN5.mjs} +187 -17
- package/dist/chunk-63AL2RN5.mjs.map +1 -0
- package/dist/chunk-64G2HBRQ.mjs +481 -0
- package/dist/chunk-64G2HBRQ.mjs.map +1 -0
- package/dist/{chunk-J3OYJ44D.mjs → chunk-BH2AU3LG.mjs} +3 -3
- package/dist/{chunk-J3OYJ44D.mjs.map → chunk-BH2AU3LG.mjs.map} +1 -1
- package/dist/chunk-CCRBT7TA.mjs +941 -0
- package/dist/chunk-CCRBT7TA.mjs.map +1 -0
- package/dist/chunk-CHLJUSXX.mjs +128 -0
- package/dist/chunk-CHLJUSXX.mjs.map +1 -0
- package/dist/chunk-CXIQWPBH.js +214 -0
- package/dist/chunk-CXIQWPBH.js.map +1 -0
- package/dist/chunk-EDE36MKE.mjs +412 -0
- package/dist/chunk-EDE36MKE.mjs.map +1 -0
- package/dist/{chunk-M7P2TQ6X.js → chunk-EFREXNZB.js} +64 -64
- package/dist/{chunk-M7P2TQ6X.js.map → chunk-EFREXNZB.js.map} +1 -1
- package/dist/chunk-FAGDZEKM.js +23 -0
- package/dist/chunk-FAGDZEKM.js.map +1 -0
- package/dist/{chunk-TUEYBNWL.js → chunk-GV6WJCEB.js} +3 -3
- package/dist/{chunk-TUEYBNWL.js.map → chunk-GV6WJCEB.js.map} +1 -1
- package/dist/chunk-HU3EAHFO.mjs +20 -0
- package/dist/chunk-HU3EAHFO.mjs.map +1 -0
- package/dist/{chunk-LLFU42KC.mjs → chunk-I6WYV2AN.mjs} +3 -3
- package/dist/{chunk-LLFU42KC.mjs.map → chunk-I6WYV2AN.mjs.map} +1 -1
- package/dist/chunk-JJWFMKZY.js +132 -0
- package/dist/chunk-JJWFMKZY.js.map +1 -0
- package/dist/{chunk-K4QJV3GC.js → chunk-L6FVIWAJ.js} +308 -137
- package/dist/chunk-L6FVIWAJ.js.map +1 -0
- package/dist/chunk-MNQEZL7B.mjs +210 -0
- package/dist/chunk-MNQEZL7B.mjs.map +1 -0
- package/dist/chunk-SGJ24J2Q.js +943 -0
- package/dist/chunk-SGJ24J2Q.js.map +1 -0
- package/dist/chunk-SW6TVAIJ.js +418 -0
- package/dist/chunk-SW6TVAIJ.js.map +1 -0
- package/dist/chunk-SYNVNTLJ.mjs +20 -0
- package/dist/chunk-SYNVNTLJ.mjs.map +1 -0
- package/dist/chunk-UQXVCVAN.mjs +41 -0
- package/dist/chunk-UQXVCVAN.mjs.map +1 -0
- package/dist/chunk-WGELLCOZ.js +22 -0
- package/dist/chunk-WGELLCOZ.js.map +1 -0
- package/dist/chunk-YXPHJ2BQ.js +541 -0
- package/dist/chunk-YXPHJ2BQ.js.map +1 -0
- package/dist/index.d.mts +3 -47
- package/dist/index.d.ts +3 -47
- package/dist/index.js +765 -765
- package/dist/index.mjs +2 -2
- package/dist/navigation-BiWVffAN.d.mts +49 -0
- package/dist/navigation-BiWVffAN.d.ts +49 -0
- package/dist/platform/agents-workspace.d.mts +19 -0
- package/dist/platform/agents-workspace.d.ts +19 -0
- package/dist/platform/agents-workspace.js +26 -0
- package/dist/platform/agents-workspace.js.map +1 -0
- package/dist/platform/agents-workspace.mjs +17 -0
- package/dist/platform/agents-workspace.mjs.map +1 -0
- package/dist/platform/app-shell.d.mts +58 -0
- package/dist/platform/app-shell.d.ts +58 -0
- package/dist/platform/app-shell.js +17 -0
- package/dist/platform/app-shell.js.map +1 -0
- package/dist/platform/app-shell.mjs +8 -0
- package/dist/platform/app-shell.mjs.map +1 -0
- package/dist/platform/index.d.mts +100 -3
- package/dist/platform/index.d.ts +100 -3
- package/dist/platform/index.js +499 -28
- package/dist/platform/index.js.map +1 -1
- package/dist/platform/index.mjs +472 -27
- package/dist/platform/index.mjs.map +1 -1
- package/dist/platform/pages/index.d.mts +243 -82
- package/dist/platform/pages/index.d.ts +243 -82
- package/dist/platform/pages/index.js +886 -614
- package/dist/platform/pages/index.js.map +1 -1
- package/dist/platform/pages/index.mjs +756 -511
- package/dist/platform/pages/index.mjs.map +1 -1
- package/dist/platform/utils/index.js +18 -56
- package/dist/platform/utils/index.js.map +1 -1
- package/dist/platform/utils/index.mjs +3 -53
- package/dist/platform/utils/index.mjs.map +1 -1
- package/dist/platform/workflow-api-client.d.mts +6 -0
- package/dist/platform/workflow-api-client.d.ts +6 -0
- package/dist/platform/workflow-api-client.js +246 -0
- package/dist/platform/workflow-api-client.js.map +1 -0
- package/dist/platform/workflow-api-client.mjs +5 -0
- package/dist/platform/workflow-api-client.mjs.map +1 -0
- package/dist/platform/workflow-canvas-shell.d.mts +18 -0
- package/dist/platform/workflow-canvas-shell.d.ts +18 -0
- package/dist/platform/workflow-canvas-shell.js +20 -0
- package/dist/platform/workflow-canvas-shell.js.map +1 -0
- package/dist/platform/workflow-canvas-shell.mjs +11 -0
- package/dist/platform/workflow-canvas-shell.mjs.map +1 -0
- package/dist/{rule-form-F5jBOeqk.d.mts → rule-form-BYJzyork.d.mts} +50 -1
- package/dist/{rule-form-F5jBOeqk.d.ts → rule-form-BYJzyork.d.ts} +50 -1
- package/dist/workflow-api-client-C8gPn_D1.d.mts +386 -0
- package/dist/workflow-api-client-Dy1Ph8W-.d.ts +386 -0
- package/package.json +21 -1
- package/dist/chunk-HAZP5J67.mjs.map +0 -1
- package/dist/chunk-K4QJV3GC.js.map +0 -1
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var chunkFAGDZEKM_js = require('./chunk-FAGDZEKM.js');
|
|
5
|
+
var common = require('@datatechsolutions/shared-domain/common');
|
|
6
|
+
|
|
7
|
+
var _authFetch = fetch;
|
|
8
|
+
function setAuthenticatedFetch(authFetch) {
|
|
9
|
+
_authFetch = authFetch;
|
|
10
|
+
}
|
|
11
|
+
var _tokenProvider = async () => null;
|
|
12
|
+
function setAccessTokenProvider(provider) {
|
|
13
|
+
_tokenProvider = provider;
|
|
14
|
+
}
|
|
15
|
+
async function getCurrentAccessToken() {
|
|
16
|
+
try {
|
|
17
|
+
return await _tokenProvider();
|
|
18
|
+
} catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function buildAuthenticatedApiUrl(path, options = {}) {
|
|
23
|
+
const baseUrl = useExternalWorkflowApi() ? resolveWorkflowApiBaseUrl() : chunkFAGDZEKM_js.buildLambdaApiUrl("").replace(/\/$/, "");
|
|
24
|
+
const url = new URL(`${baseUrl}${path}`);
|
|
25
|
+
if (options.includeAccessToken) {
|
|
26
|
+
const token = await getCurrentAccessToken();
|
|
27
|
+
if (token && token.length > 0) {
|
|
28
|
+
url.searchParams.set("accessToken", token);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return url.toString();
|
|
32
|
+
}
|
|
33
|
+
function useExternalWorkflowApi() {
|
|
34
|
+
return undefined.VITE_WORKFLOW_API_MODE === "external";
|
|
35
|
+
}
|
|
36
|
+
function resolveWorkflowApiBaseUrl() {
|
|
37
|
+
const baseUrl = undefined.VITE_WORKFLOW_API_BASE_URL;
|
|
38
|
+
if (!baseUrl || baseUrl.trim().length === 0) {
|
|
39
|
+
throw new Error("Missing VITE_WORKFLOW_API_BASE_URL for external workflow API mode");
|
|
40
|
+
}
|
|
41
|
+
return baseUrl.replace(/\/$/, "");
|
|
42
|
+
}
|
|
43
|
+
function getPublishableKey() {
|
|
44
|
+
const key = undefined.VITE_WORKFLOW_BUILDER_PUBLISHABLE_KEY;
|
|
45
|
+
if (!key || key.trim().length === 0) {
|
|
46
|
+
throw new Error("Missing VITE_WORKFLOW_BUILDER_PUBLISHABLE_KEY");
|
|
47
|
+
}
|
|
48
|
+
return key;
|
|
49
|
+
}
|
|
50
|
+
async function request(path, init) {
|
|
51
|
+
const publishableKey = useExternalWorkflowApi() ? getPublishableKey() : null;
|
|
52
|
+
const baseUrl = publishableKey ? resolveWorkflowApiBaseUrl() : chunkFAGDZEKM_js.buildLambdaApiUrl("").replace(/\/$/, "");
|
|
53
|
+
const headers = {
|
|
54
|
+
"Content-Type": "application/json"
|
|
55
|
+
};
|
|
56
|
+
if (publishableKey) {
|
|
57
|
+
headers.Authorization = `Bearer ${publishableKey}`;
|
|
58
|
+
headers["X-Workflow-Key"] = publishableKey;
|
|
59
|
+
}
|
|
60
|
+
const response = await _authFetch(`${baseUrl}${path}`, {
|
|
61
|
+
...init,
|
|
62
|
+
credentials: init?.credentials ?? "include",
|
|
63
|
+
headers: { ...headers, ...init?.headers }
|
|
64
|
+
});
|
|
65
|
+
if (response.status === 204) return void 0;
|
|
66
|
+
const payload = await response.json().catch(() => null);
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
const message = payload?.message ?? payload?.error ?? `HTTP ${response.status}: ${response.statusText}`;
|
|
69
|
+
throw new common.HttpResponseError(message, response.status);
|
|
70
|
+
}
|
|
71
|
+
if (payload && typeof payload === "object" && "data" in payload && (!("success" in payload) || payload.success !== false)) {
|
|
72
|
+
return payload.data;
|
|
73
|
+
}
|
|
74
|
+
return payload;
|
|
75
|
+
}
|
|
76
|
+
async function requestPublic(path, init) {
|
|
77
|
+
const externalBaseUrl = undefined.VITE_WORKFLOW_API_BASE_URL?.trim();
|
|
78
|
+
const baseUrl = externalBaseUrl && externalBaseUrl.length > 0 ? externalBaseUrl.replace(/\/$/, "") : chunkFAGDZEKM_js.buildLambdaApiUrl("").replace(/\/$/, "");
|
|
79
|
+
const response = await fetch(`${baseUrl}${path}`, {
|
|
80
|
+
...init,
|
|
81
|
+
credentials: "include",
|
|
82
|
+
headers: {
|
|
83
|
+
"Content-Type": "application/json",
|
|
84
|
+
...init?.headers
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
if (response.status === 204) return void 0;
|
|
88
|
+
const payload = await response.json().catch(() => null);
|
|
89
|
+
if (!response.ok) {
|
|
90
|
+
const message = payload?.message ?? payload?.error ?? `HTTP ${response.status}: ${response.statusText}`;
|
|
91
|
+
throw new common.HttpResponseError(message, response.status);
|
|
92
|
+
}
|
|
93
|
+
if (payload && typeof payload === "object" && "success" in payload && payload.success && "data" in payload) {
|
|
94
|
+
return payload.data;
|
|
95
|
+
}
|
|
96
|
+
return payload;
|
|
97
|
+
}
|
|
98
|
+
async function aiValidateWorkflow(body) {
|
|
99
|
+
return request("/workflows/validate/ai", {
|
|
100
|
+
method: "POST",
|
|
101
|
+
body: JSON.stringify(body)
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
async function aiGenerateWorkflow(body) {
|
|
105
|
+
return request("/workflows/generate/ai", {
|
|
106
|
+
method: "POST",
|
|
107
|
+
body: JSON.stringify(body)
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
async function getWorkflows() {
|
|
111
|
+
return request("/workflows");
|
|
112
|
+
}
|
|
113
|
+
async function getWorkflowById(workflowId) {
|
|
114
|
+
return request(`/workflows/${encodeURIComponent(workflowId)}`);
|
|
115
|
+
}
|
|
116
|
+
async function createWorkflow(data) {
|
|
117
|
+
return request("/workflows", {
|
|
118
|
+
method: "POST",
|
|
119
|
+
body: JSON.stringify(data)
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
async function deleteWorkflow(workflowId) {
|
|
123
|
+
return request(`/workflows/${encodeURIComponent(workflowId)}`, {
|
|
124
|
+
method: "DELETE"
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
async function saveWorkflowDraft(workflowId, graph, metadata) {
|
|
128
|
+
return request(`/workflows/${encodeURIComponent(workflowId)}`, {
|
|
129
|
+
method: "PATCH",
|
|
130
|
+
body: JSON.stringify({ graph, ...metadata })
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
async function updateWorkflowSettings(workflowId, changes) {
|
|
134
|
+
return request(`/workflows/${encodeURIComponent(workflowId)}`, {
|
|
135
|
+
method: "PATCH",
|
|
136
|
+
body: JSON.stringify(changes)
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
async function publishWorkflow(workflowId) {
|
|
140
|
+
return request(`/workflows/${encodeURIComponent(workflowId)}/publish`, {
|
|
141
|
+
method: "POST"
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
async function executeWorkflow(workflowId, inputVariables) {
|
|
145
|
+
return request(`/workflows/${encodeURIComponent(workflowId)}/execute`, {
|
|
146
|
+
method: "POST",
|
|
147
|
+
body: JSON.stringify({ inputVariables: inputVariables ?? {} })
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
async function getWorkflowRuns(workflowId) {
|
|
151
|
+
return request(`/workflows/${encodeURIComponent(workflowId)}/execute`);
|
|
152
|
+
}
|
|
153
|
+
async function listWorkflowTemplates() {
|
|
154
|
+
return request("/workflows/templates");
|
|
155
|
+
}
|
|
156
|
+
async function createWorkflowFromTemplate(templateId, body) {
|
|
157
|
+
return request(`/workflows/templates/${encodeURIComponent(templateId)}`, {
|
|
158
|
+
method: "POST",
|
|
159
|
+
body: JSON.stringify(body)
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
async function listModelProviderConnections() {
|
|
163
|
+
return request("/agents/connections");
|
|
164
|
+
}
|
|
165
|
+
async function listModelProviderCatalog() {
|
|
166
|
+
const response = await request(
|
|
167
|
+
"/agents/providers"
|
|
168
|
+
);
|
|
169
|
+
if (Array.isArray(response)) return response;
|
|
170
|
+
if (response && typeof response === "object" && Array.isArray(response.data)) {
|
|
171
|
+
return response.data;
|
|
172
|
+
}
|
|
173
|
+
return [];
|
|
174
|
+
}
|
|
175
|
+
async function createModelProviderConnection(body) {
|
|
176
|
+
return request("/agents/connections", {
|
|
177
|
+
method: "POST",
|
|
178
|
+
body: JSON.stringify(body)
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
async function updateModelProviderConnection(id, body) {
|
|
182
|
+
return request(`/agents/connections/${encodeURIComponent(id)}`, {
|
|
183
|
+
method: "PATCH",
|
|
184
|
+
body: JSON.stringify(body)
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
async function deleteModelProviderConnection(id) {
|
|
188
|
+
return request(`/agents/connections/${encodeURIComponent(id)}`, {
|
|
189
|
+
method: "DELETE"
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
async function getAgentPrompts(agentId) {
|
|
193
|
+
return request(`/agents/prompts?agentId=${encodeURIComponent(agentId)}`);
|
|
194
|
+
}
|
|
195
|
+
async function getAgentModels() {
|
|
196
|
+
return request("/agents/models");
|
|
197
|
+
}
|
|
198
|
+
async function getAgentTools(agentId) {
|
|
199
|
+
return request(`/agents/tools?agentId=${encodeURIComponent(agentId)}`);
|
|
200
|
+
}
|
|
201
|
+
async function updateAgentTool(toolId, updates) {
|
|
202
|
+
const wire = { id: toolId };
|
|
203
|
+
if (typeof updates.enabled === "boolean") wire.isEnabled = updates.enabled;
|
|
204
|
+
const overrides = updates.configOverrides;
|
|
205
|
+
if (overrides !== void 0) wire.configOverrides = overrides;
|
|
206
|
+
return request("/agents/tools", {
|
|
207
|
+
method: "PATCH",
|
|
208
|
+
body: JSON.stringify(wire)
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
async function createAgentTool(tool) {
|
|
212
|
+
return request("/agents/tools", {
|
|
213
|
+
method: "POST",
|
|
214
|
+
body: JSON.stringify(tool)
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
async function deleteAgentTool(toolId) {
|
|
218
|
+
return request(`/agents/tools/${encodeURIComponent(toolId)}`, {
|
|
219
|
+
method: "DELETE"
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
async function getAgentToolDefinitions() {
|
|
223
|
+
return request("/agents/tool-definitions");
|
|
224
|
+
}
|
|
225
|
+
async function createAgentToolDefinition(toolDef) {
|
|
226
|
+
return request("/agents/tool-definitions", {
|
|
227
|
+
method: "POST",
|
|
228
|
+
body: JSON.stringify(toolDef)
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
async function getAgentRules() {
|
|
232
|
+
const response = await request("/rules");
|
|
233
|
+
if (Array.isArray(response)) return response;
|
|
234
|
+
if (response && typeof response === "object" && Array.isArray(response.data)) {
|
|
235
|
+
return response.data;
|
|
236
|
+
}
|
|
237
|
+
return [];
|
|
238
|
+
}
|
|
239
|
+
async function updateAgentRule(ruleId, updates) {
|
|
240
|
+
return request(`/rules/${encodeURIComponent(ruleId)}`, {
|
|
241
|
+
method: "PATCH",
|
|
242
|
+
body: JSON.stringify(updates)
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
async function createAgentRule(rule) {
|
|
246
|
+
return request("/rules", {
|
|
247
|
+
method: "POST",
|
|
248
|
+
body: JSON.stringify(rule)
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
async function deleteAgentRule(ruleId) {
|
|
252
|
+
return request(`/rules/${encodeURIComponent(ruleId)}`, {
|
|
253
|
+
method: "DELETE"
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
async function executeAgentRule(ruleId, input) {
|
|
257
|
+
return request(`/rules/${encodeURIComponent(ruleId)}/execute`, {
|
|
258
|
+
method: "POST",
|
|
259
|
+
body: JSON.stringify(input)
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
async function createAgentConfig(input) {
|
|
263
|
+
return request("/agents/configs", {
|
|
264
|
+
method: "POST",
|
|
265
|
+
body: JSON.stringify(input)
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
async function updateAgentConfig(agentId, updates) {
|
|
269
|
+
return request(`/agents/configs/${encodeURIComponent(agentId)}`, {
|
|
270
|
+
method: "PATCH",
|
|
271
|
+
body: JSON.stringify(updates)
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
async function deleteAgentConfig(agentId) {
|
|
275
|
+
return request(`/agents/configs/${encodeURIComponent(agentId)}`, {
|
|
276
|
+
method: "DELETE"
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
async function createAgentPrompt(input) {
|
|
280
|
+
return request("/agents/prompts", {
|
|
281
|
+
method: "POST",
|
|
282
|
+
body: JSON.stringify(input)
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
async function updateAgentPrompt(promptId, updates) {
|
|
286
|
+
const promptText = updates.promptText ?? updates.systemPrompt ?? updates.content;
|
|
287
|
+
if (typeof promptText !== "string" || promptText.length === 0) {
|
|
288
|
+
throw new Error("updateAgentPrompt: `promptText` (or `systemPrompt`/`content`) is required");
|
|
289
|
+
}
|
|
290
|
+
return request("/agents/prompts", {
|
|
291
|
+
method: "PATCH",
|
|
292
|
+
body: JSON.stringify({ promptId, promptText })
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
async function deleteAgentPrompt(promptId) {
|
|
296
|
+
throw new Error("deleteAgentPrompt is not supported by the backend yet \u2014 disable the prompt via PATCH instead");
|
|
297
|
+
}
|
|
298
|
+
async function updateAgentToolDefinition(agentToolId, updates) {
|
|
299
|
+
return request("/agents/tool-definitions", {
|
|
300
|
+
method: "PATCH",
|
|
301
|
+
body: JSON.stringify({ toolId: agentToolId, ...updates })
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
async function deleteAgentToolDefinition(agentToolId) {
|
|
305
|
+
return request("/agents/tool-definitions", {
|
|
306
|
+
method: "DELETE",
|
|
307
|
+
body: JSON.stringify({ toolId: agentToolId })
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
async function listWorkflowRuns(params) {
|
|
311
|
+
const query = new URLSearchParams();
|
|
312
|
+
if (params?.workflowId) query.set("workflowId", params.workflowId);
|
|
313
|
+
if (params?.status) query.set("status", params.status);
|
|
314
|
+
if (params?.limit) query.set("limit", String(params.limit));
|
|
315
|
+
if (params?.offset) query.set("offset", String(params.offset));
|
|
316
|
+
const path = query.toString().length > 0 ? `/workflow-runs?${query}` : "/workflow-runs";
|
|
317
|
+
return request(path);
|
|
318
|
+
}
|
|
319
|
+
async function getWorkflowRunById(runId) {
|
|
320
|
+
return request(`/workflow-runs/${encodeURIComponent(runId)}`);
|
|
321
|
+
}
|
|
322
|
+
async function cancelWorkflowRun(runId) {
|
|
323
|
+
return request(`/workflow-runs/${encodeURIComponent(runId)}/cancel`, {
|
|
324
|
+
method: "POST"
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
async function replayWorkflowRun(workflowId, runId, overrides) {
|
|
328
|
+
const body = overrides && Object.keys(overrides).length > 0 ? JSON.stringify({ inputVariables: overrides }) : void 0;
|
|
329
|
+
return request(
|
|
330
|
+
`/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/replay`,
|
|
331
|
+
{ method: "POST", body }
|
|
332
|
+
);
|
|
333
|
+
}
|
|
334
|
+
async function getRunTimeline(workflowId, runId) {
|
|
335
|
+
return request(
|
|
336
|
+
`/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/timeline`
|
|
337
|
+
);
|
|
338
|
+
}
|
|
339
|
+
async function getAnalyticsSummary(params) {
|
|
340
|
+
const query = new URLSearchParams();
|
|
341
|
+
if (params?.from) query.set("from", params.from);
|
|
342
|
+
if (params?.to) query.set("to", params.to);
|
|
343
|
+
const path = query.toString().length > 0 ? `/analytics/runs?${query}` : "/analytics/runs";
|
|
344
|
+
return request(path);
|
|
345
|
+
}
|
|
346
|
+
async function presignUpload(input) {
|
|
347
|
+
return request("/uploads", {
|
|
348
|
+
method: "POST",
|
|
349
|
+
body: JSON.stringify(input)
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
async function getUploadDownloadUrl(objectKey) {
|
|
353
|
+
return request(`/uploads/${encodeURIComponent(objectKey)}`);
|
|
354
|
+
}
|
|
355
|
+
async function deleteUpload(objectKey) {
|
|
356
|
+
return request(`/uploads/${encodeURIComponent(objectKey)}`, {
|
|
357
|
+
method: "DELETE"
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
async function getPublicSampleWorkflow(slug) {
|
|
361
|
+
return requestPublic(`/samples/workflows/${encodeURIComponent(slug)}`);
|
|
362
|
+
}
|
|
363
|
+
function subscribeToRunEvents(runId, onEvent, onError) {
|
|
364
|
+
const baseUrl = chunkFAGDZEKM_js.buildLambdaApiUrl("").replace(/\/$/, "");
|
|
365
|
+
const url = `${baseUrl}/workflow-runs/${encodeURIComponent(runId)}/events`;
|
|
366
|
+
const source = new EventSource(url, { withCredentials: true });
|
|
367
|
+
source.addEventListener("message", (event) => {
|
|
368
|
+
try {
|
|
369
|
+
const parsed = JSON.parse(event.data);
|
|
370
|
+
onEvent(parsed);
|
|
371
|
+
} catch {
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
if (onError) source.addEventListener("error", onError);
|
|
375
|
+
return () => source.close();
|
|
376
|
+
}
|
|
377
|
+
var AGENT_AVATARS = {
|
|
378
|
+
"Sales Assistant": "https://api.dicebear.com/9.x/lorelei/svg?seed=Rafael&hair=variant01&beardProbability=0&mouth=happy01",
|
|
379
|
+
"Sales Specialist": "https://api.dicebear.com/9.x/lorelei/svg?seed=Marcos&hair=variant15&beardProbability=50&mouth=happy02",
|
|
380
|
+
"Support Agent": "https://api.dicebear.com/9.x/lorelei/svg?seed=Ana&hair=variant43&beardProbability=0&mouth=happy01",
|
|
381
|
+
"Financial Analyst": "https://api.dicebear.com/9.x/lorelei/svg?seed=Lucas&hair=variant08&beardProbability=50&mouth=happy02",
|
|
382
|
+
"Security Analyst": "https://api.dicebear.com/9.x/lorelei/svg?seed=Pedro&hair=variant22&beardProbability=50&mouth=happy01",
|
|
383
|
+
"Data Analyst": "https://api.dicebear.com/9.x/lorelei/svg?seed=Julia&hair=variant29&beardProbability=0&mouth=happy01",
|
|
384
|
+
"Market Analyst": "https://api.dicebear.com/9.x/lorelei/svg?seed=Diego&hair=variant12&beardProbability=0&mouth=happy02",
|
|
385
|
+
"Pricing Manager": "https://api.dicebear.com/9.x/lorelei/svg?seed=Beatriz&hair=variant38&beardProbability=0&mouth=happy01",
|
|
386
|
+
"Onboarding Agent": "https://api.dicebear.com/9.x/lorelei/svg?seed=Camila&hair=variant35&beardProbability=0&mouth=happy01"
|
|
387
|
+
};
|
|
388
|
+
function defaultAvatar(name) {
|
|
389
|
+
return AGENT_AVATARS[name] ?? `https://api.dicebear.com/9.x/lorelei/svg?seed=${encodeURIComponent(name)}`;
|
|
390
|
+
}
|
|
391
|
+
async function getAgentConfigsWithPrompts() {
|
|
392
|
+
const configs = await request("/agents/configs");
|
|
393
|
+
return Promise.all(configs.map(async (agent) => {
|
|
394
|
+
const raw = agent;
|
|
395
|
+
const agentId = String(raw.agent_id ?? raw.agentId ?? agent.id ?? "");
|
|
396
|
+
const id = agentId;
|
|
397
|
+
const avatar = typeof raw.avatar === "string" && raw.avatar.length > 0 ? raw.avatar : defaultAvatar(String(agent.name ?? ""));
|
|
398
|
+
const modelId = String(raw.model_id ?? raw.modelId ?? "");
|
|
399
|
+
const displayOrder = Number(raw.display_order ?? raw.displayOrder ?? raw.order ?? 0);
|
|
400
|
+
const maxTokens = Number(raw.max_tokens ?? raw.maxTokens ?? 2048);
|
|
401
|
+
const normalized = { ...raw, agentId, modelId, displayOrder, maxTokens, order: displayOrder };
|
|
402
|
+
if (!id) return { ...normalized, avatar, promptCount: 0, activePromptVersion: 0 };
|
|
403
|
+
try {
|
|
404
|
+
const prompts = await getAgentPrompts(id);
|
|
405
|
+
const activePrompt = prompts.find((prompt) => prompt.isActive);
|
|
406
|
+
return {
|
|
407
|
+
...normalized,
|
|
408
|
+
avatar,
|
|
409
|
+
promptCount: prompts.length,
|
|
410
|
+
activePromptVersion: activePrompt?.version ?? 0
|
|
411
|
+
};
|
|
412
|
+
} catch {
|
|
413
|
+
return {
|
|
414
|
+
...normalized,
|
|
415
|
+
avatar,
|
|
416
|
+
promptCount: 0,
|
|
417
|
+
activePromptVersion: 0
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
}));
|
|
421
|
+
}
|
|
422
|
+
async function getDatasources() {
|
|
423
|
+
return request("/datasources");
|
|
424
|
+
}
|
|
425
|
+
async function createDatasource(data) {
|
|
426
|
+
const body = toDatasourceWireBody(data);
|
|
427
|
+
return request("/datasources", {
|
|
428
|
+
method: "POST",
|
|
429
|
+
body: JSON.stringify(body)
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
function toDatasourceWireBody(data) {
|
|
433
|
+
const CREDENTIAL_KEYS = [
|
|
434
|
+
"host",
|
|
435
|
+
"port",
|
|
436
|
+
"database",
|
|
437
|
+
"username",
|
|
438
|
+
"password",
|
|
439
|
+
"schema",
|
|
440
|
+
"connectionString",
|
|
441
|
+
"projectId",
|
|
442
|
+
"dataset",
|
|
443
|
+
"keyFile",
|
|
444
|
+
"account",
|
|
445
|
+
"warehouse",
|
|
446
|
+
"region",
|
|
447
|
+
"bucket",
|
|
448
|
+
"token",
|
|
449
|
+
"apiKey",
|
|
450
|
+
"environment",
|
|
451
|
+
"index",
|
|
452
|
+
"url",
|
|
453
|
+
"ssl"
|
|
454
|
+
];
|
|
455
|
+
const credentials = {};
|
|
456
|
+
for (const key of CREDENTIAL_KEYS) {
|
|
457
|
+
const value = data[key];
|
|
458
|
+
if (value !== void 0 && value !== "" && value !== null) {
|
|
459
|
+
credentials[key] = value;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
const body = {
|
|
463
|
+
name: data.name,
|
|
464
|
+
dialect: data.dialect
|
|
465
|
+
};
|
|
466
|
+
if (Object.keys(credentials).length > 0) body.credentials = credentials;
|
|
467
|
+
if (data.allowedTables && data.allowedTables.length > 0) body.allowedTables = data.allowedTables;
|
|
468
|
+
if (data.blockedColumns && data.blockedColumns.length > 0) body.blockedColumns = data.blockedColumns;
|
|
469
|
+
if (typeof data.maxPoolSize === "number") body.maxPoolSize = data.maxPoolSize;
|
|
470
|
+
if (typeof data.timeoutMs === "number") body.timeoutMs = data.timeoutMs;
|
|
471
|
+
if (typeof data.readOnly === "boolean") body.readOnly = data.readOnly;
|
|
472
|
+
return body;
|
|
473
|
+
}
|
|
474
|
+
async function getDatasourceTables(datasourceId) {
|
|
475
|
+
return request(`/datasources/${encodeURIComponent(datasourceId)}/tables`);
|
|
476
|
+
}
|
|
477
|
+
async function getDatasourceSchema(datasourceId, table) {
|
|
478
|
+
return request(`/datasources/${encodeURIComponent(datasourceId)}/schema/${encodeURIComponent(table)}`);
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
exports.aiGenerateWorkflow = aiGenerateWorkflow;
|
|
482
|
+
exports.aiValidateWorkflow = aiValidateWorkflow;
|
|
483
|
+
exports.buildAuthenticatedApiUrl = buildAuthenticatedApiUrl;
|
|
484
|
+
exports.cancelWorkflowRun = cancelWorkflowRun;
|
|
485
|
+
exports.createAgentConfig = createAgentConfig;
|
|
486
|
+
exports.createAgentPrompt = createAgentPrompt;
|
|
487
|
+
exports.createAgentRule = createAgentRule;
|
|
488
|
+
exports.createAgentTool = createAgentTool;
|
|
489
|
+
exports.createAgentToolDefinition = createAgentToolDefinition;
|
|
490
|
+
exports.createDatasource = createDatasource;
|
|
491
|
+
exports.createModelProviderConnection = createModelProviderConnection;
|
|
492
|
+
exports.createWorkflow = createWorkflow;
|
|
493
|
+
exports.createWorkflowFromTemplate = createWorkflowFromTemplate;
|
|
494
|
+
exports.deleteAgentConfig = deleteAgentConfig;
|
|
495
|
+
exports.deleteAgentPrompt = deleteAgentPrompt;
|
|
496
|
+
exports.deleteAgentRule = deleteAgentRule;
|
|
497
|
+
exports.deleteAgentTool = deleteAgentTool;
|
|
498
|
+
exports.deleteAgentToolDefinition = deleteAgentToolDefinition;
|
|
499
|
+
exports.deleteModelProviderConnection = deleteModelProviderConnection;
|
|
500
|
+
exports.deleteUpload = deleteUpload;
|
|
501
|
+
exports.deleteWorkflow = deleteWorkflow;
|
|
502
|
+
exports.executeAgentRule = executeAgentRule;
|
|
503
|
+
exports.executeWorkflow = executeWorkflow;
|
|
504
|
+
exports.getAgentConfigsWithPrompts = getAgentConfigsWithPrompts;
|
|
505
|
+
exports.getAgentModels = getAgentModels;
|
|
506
|
+
exports.getAgentPrompts = getAgentPrompts;
|
|
507
|
+
exports.getAgentRules = getAgentRules;
|
|
508
|
+
exports.getAgentToolDefinitions = getAgentToolDefinitions;
|
|
509
|
+
exports.getAgentTools = getAgentTools;
|
|
510
|
+
exports.getAnalyticsSummary = getAnalyticsSummary;
|
|
511
|
+
exports.getCurrentAccessToken = getCurrentAccessToken;
|
|
512
|
+
exports.getDatasourceSchema = getDatasourceSchema;
|
|
513
|
+
exports.getDatasourceTables = getDatasourceTables;
|
|
514
|
+
exports.getDatasources = getDatasources;
|
|
515
|
+
exports.getPublicSampleWorkflow = getPublicSampleWorkflow;
|
|
516
|
+
exports.getRunTimeline = getRunTimeline;
|
|
517
|
+
exports.getUploadDownloadUrl = getUploadDownloadUrl;
|
|
518
|
+
exports.getWorkflowById = getWorkflowById;
|
|
519
|
+
exports.getWorkflowRunById = getWorkflowRunById;
|
|
520
|
+
exports.getWorkflowRuns = getWorkflowRuns;
|
|
521
|
+
exports.getWorkflows = getWorkflows;
|
|
522
|
+
exports.listModelProviderCatalog = listModelProviderCatalog;
|
|
523
|
+
exports.listModelProviderConnections = listModelProviderConnections;
|
|
524
|
+
exports.listWorkflowRuns = listWorkflowRuns;
|
|
525
|
+
exports.listWorkflowTemplates = listWorkflowTemplates;
|
|
526
|
+
exports.presignUpload = presignUpload;
|
|
527
|
+
exports.publishWorkflow = publishWorkflow;
|
|
528
|
+
exports.replayWorkflowRun = replayWorkflowRun;
|
|
529
|
+
exports.saveWorkflowDraft = saveWorkflowDraft;
|
|
530
|
+
exports.setAccessTokenProvider = setAccessTokenProvider;
|
|
531
|
+
exports.setAuthenticatedFetch = setAuthenticatedFetch;
|
|
532
|
+
exports.subscribeToRunEvents = subscribeToRunEvents;
|
|
533
|
+
exports.updateAgentConfig = updateAgentConfig;
|
|
534
|
+
exports.updateAgentPrompt = updateAgentPrompt;
|
|
535
|
+
exports.updateAgentRule = updateAgentRule;
|
|
536
|
+
exports.updateAgentTool = updateAgentTool;
|
|
537
|
+
exports.updateAgentToolDefinition = updateAgentToolDefinition;
|
|
538
|
+
exports.updateModelProviderConnection = updateModelProviderConnection;
|
|
539
|
+
exports.updateWorkflowSettings = updateWorkflowSettings;
|
|
540
|
+
//# sourceMappingURL=chunk-YXPHJ2BQ.js.map
|
|
541
|
+
//# sourceMappingURL=chunk-YXPHJ2BQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/platform/workflow-api-client.ts"],"names":["buildLambdaApiUrl","HttpResponseError"],"mappings":"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","file":"chunk-YXPHJ2BQ.js","sourcesContent":["import type {\n AgentModel,\n AgentRule,\n AgentTool,\n WorkflowTool,\n VariableValue,\n Workflow,\n WorkflowGraph,\n WorkflowRun,\n} from '@ui/astrlabe/contracts'\nimport type { AgentWithPrompts } from '@ui/astrlabe'\nimport type { AgentPrompt } from '@datatechsolutions/shared-domain/ports/workflow'\nimport type { AgentConfigLike, DataSource } from '@datatechsolutions/shared-domain/common'\nimport { HttpResponseError } from '@datatechsolutions/shared-domain/common'\nimport { buildLambdaApiUrl } from './utils/lambda-endpoint'\nimport type { DatasourceFormData } from './pages/datasource-modal'\n\n// ---------------------------------------------------------------------------\n// Module-level authenticated fetch — set by setAuthenticatedFetch() during\n// provider initialization. This lets plain async functions (non-hooks) make\n// authenticated API calls without needing React context.\n// ---------------------------------------------------------------------------\nlet _authFetch: typeof fetch = fetch\n\n/**\n * Register an authenticated fetch function (call once from a provider/layout).\n * After this, all workflow API calls automatically include the JWT token.\n */\nexport function setAuthenticatedFetch(authFetch: typeof fetch): void {\n _authFetch = authFetch\n}\n\n// ---------------------------------------------------------------------------\n// Access token provider — used by SSE (EventSource cannot set headers, so\n// we pass the token as `?accessToken=<token>` on the event stream URL).\n// ---------------------------------------------------------------------------\n\nlet _tokenProvider: () => Promise<string | null> = async () => null\n\nexport function setAccessTokenProvider(provider: () => Promise<string | null>): void {\n _tokenProvider = provider\n}\n\nexport async function getCurrentAccessToken(): Promise<string | null> {\n try {\n return await _tokenProvider()\n } catch {\n return null\n }\n}\n\n/**\n * Build a full URL for a workflow API path, optionally appending the current\n * access token as a query parameter. Useful for APIs that require auth but\n * cannot set custom headers (EventSource, direct links).\n */\nexport async function buildAuthenticatedApiUrl(\n path: string,\n options: { includeAccessToken?: boolean } = {},\n): Promise<string> {\n const baseUrl = useExternalWorkflowApi()\n ? resolveWorkflowApiBaseUrl()\n : buildLambdaApiUrl('').replace(/\\/$/, '')\n const url = new URL(`${baseUrl}${path}`)\n if (options.includeAccessToken) {\n const token = await getCurrentAccessToken()\n if (token && token.length > 0) {\n url.searchParams.set('accessToken', token)\n }\n }\n return url.toString()\n}\n\n// ---------------------------------------------------------------------------\n// Config helpers\n// ---------------------------------------------------------------------------\n\nfunction useExternalWorkflowApi(): boolean {\n return import.meta.env.VITE_WORKFLOW_API_MODE === 'external'\n}\n\nfunction resolveWorkflowApiBaseUrl(): string {\n const baseUrl = import.meta.env.VITE_WORKFLOW_API_BASE_URL\n if (!baseUrl || baseUrl.trim().length === 0) {\n throw new Error('Missing VITE_WORKFLOW_API_BASE_URL for external workflow API mode')\n }\n return baseUrl.replace(/\\/$/, '')\n}\n\nfunction getPublishableKey(): string {\n const key = import.meta.env.VITE_WORKFLOW_BUILDER_PUBLISHABLE_KEY\n if (!key || key.trim().length === 0) {\n throw new Error('Missing VITE_WORKFLOW_BUILDER_PUBLISHABLE_KEY')\n }\n return key\n}\n\n// ---------------------------------------------------------------------------\n// Core request function — uses the registered authenticated fetch\n// ---------------------------------------------------------------------------\n\nasync function request<T>(path: string, init?: RequestInit): Promise<T> {\n const publishableKey = useExternalWorkflowApi() ? getPublishableKey() : null\n\n const baseUrl = publishableKey\n ? resolveWorkflowApiBaseUrl()\n : buildLambdaApiUrl('').replace(/\\/$/, '')\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n if (publishableKey) {\n headers.Authorization = `Bearer ${publishableKey}`\n headers['X-Workflow-Key'] = publishableKey\n }\n\n const response = await _authFetch(`${baseUrl}${path}`, {\n ...init,\n credentials: init?.credentials ?? 'include',\n headers: { ...headers, ...(init?.headers as Record<string, string> | undefined) },\n })\n\n if (response.status === 204) return undefined as T\n\n const payload = await response.json().catch(() => null)\n\n if (!response.ok) {\n const message = (payload as { error?: string; message?: string })?.message\n ?? (payload as { error?: string })?.error\n ?? `HTTP ${response.status}: ${response.statusText}`\n throw new HttpResponseError(message, response.status)\n }\n\n // Unwrap any `{ data: T }` envelope the Rust API returns. Some handlers\n // emit `{ success: true, data: T }`; others (list endpoints like\n // `/rules`, `/workflows`) emit just `{ data: T }`. Treating the presence\n // of a top-level `data` key as the signal is what shields pages from\n // the mismatch — without this, callers like `getAgentRules` fall through\n // to `payload.data` manually, and any null/empty body crashes the\n // `rules.map(...)` render with \"Cannot read properties of undefined\".\n if (\n payload &&\n typeof payload === 'object'\n && 'data' in payload\n && (!('success' in payload) || (payload as { success: boolean }).success !== false)\n ) {\n return (payload as { data: T }).data\n }\n\n return payload as T\n}\n\nasync function requestPublic<T>(path: string, init?: RequestInit): Promise<T> {\n const externalBaseUrl = import.meta.env.VITE_WORKFLOW_API_BASE_URL?.trim()\n const baseUrl = externalBaseUrl && externalBaseUrl.length > 0\n ? externalBaseUrl.replace(/\\/$/, '')\n : buildLambdaApiUrl('').replace(/\\/$/, '')\n\n const response = await fetch(`${baseUrl}${path}`, {\n ...init,\n credentials: init?.credentials ?? 'include',\n headers: {\n 'Content-Type': 'application/json',\n ...(init?.headers as Record<string, string> | undefined),\n },\n })\n\n if (response.status === 204) return undefined as T\n\n const payload = await response.json().catch(() => null)\n\n if (!response.ok) {\n const message = (payload as { error?: string; message?: string })?.message\n ?? (payload as { error?: string })?.error\n ?? `HTTP ${response.status}: ${response.statusText}`\n throw new HttpResponseError(message, response.status)\n }\n\n if (payload && typeof payload === 'object' && 'success' in payload && (payload as { success: boolean }).success && 'data' in payload) {\n return (payload as { data: T }).data\n }\n\n return payload as T\n}\n\n// ---------------------------------------------------------------------------\n// AI workflow assistants\n// ---------------------------------------------------------------------------\n\nexport type NodeValidationIssue = {\n nodeId: string\n nodeType: string\n field?: string\n code: string\n message: string\n}\n\nexport type AiValidateResponse = {\n ok: boolean\n structuralIssues: string[]\n nodeIssues: NodeValidationIssue[]\n rationale?: string | null\n}\n\nexport async function aiValidateWorkflow(body: {\n graph: WorkflowGraph\n connectionId?: string\n}): Promise<AiValidateResponse> {\n return request('/workflows/validate/ai', {\n method: 'POST',\n body: JSON.stringify(body),\n })\n}\n\nexport type AiGenerateResponse = {\n graph: WorkflowGraph\n ok: boolean\n structuralIssues: string[]\n nodeIssues: NodeValidationIssue[]\n rationale?: string | null\n}\n\nexport async function aiGenerateWorkflow(body: {\n prompt: string\n connectionId: string\n context?: string\n}): Promise<AiGenerateResponse> {\n return request('/workflows/generate/ai', {\n method: 'POST',\n body: JSON.stringify(body),\n })\n}\n\n// ---------------------------------------------------------------------------\n// Workflow CRUD\n// ---------------------------------------------------------------------------\n\nexport async function getWorkflows(): Promise<Workflow[]> {\n return request('/workflows')\n}\n\nexport async function getWorkflowById(workflowId: string): Promise<Workflow> {\n return request(`/workflows/${encodeURIComponent(workflowId)}`)\n}\n\nexport async function createWorkflow(data: { name: string; description?: string }): Promise<Workflow> {\n return request('/workflows', {\n method: 'POST',\n body: JSON.stringify(data),\n })\n}\n\nexport async function deleteWorkflow(workflowId: string): Promise<{ deleted: boolean }> {\n return request(`/workflows/${encodeURIComponent(workflowId)}`, {\n method: 'DELETE',\n })\n}\n\nexport async function saveWorkflowDraft(\n workflowId: string,\n graph: WorkflowGraph,\n metadata?: {\n name?: string\n description?: string\n slug?: string | null\n isDraft?: boolean\n isActive?: boolean\n },\n): Promise<Workflow> {\n return request(`/workflows/${encodeURIComponent(workflowId)}`, {\n method: 'PATCH',\n body: JSON.stringify({ graph, ...metadata }),\n })\n}\n\n/**\n * Settings modal PATCH — updates the workflow's identity + lifecycle\n * fields in one call. Pass `isDraft: true` to move a published workflow\n * back to draft, `isActive: false` to archive, etc. Anything omitted is\n * left untouched.\n */\nexport async function updateWorkflowSettings(\n workflowId: string,\n changes: {\n name?: string\n description?: string\n slug?: string | null\n isDraft?: boolean\n isActive?: boolean\n },\n): Promise<Workflow> {\n return request(`/workflows/${encodeURIComponent(workflowId)}`, {\n method: 'PATCH',\n body: JSON.stringify(changes),\n })\n}\n\nexport async function publishWorkflow(workflowId: string): Promise<Workflow> {\n return request(`/workflows/${encodeURIComponent(workflowId)}/publish`, {\n method: 'POST',\n })\n}\n\nexport async function executeWorkflow(\n workflowId: string,\n inputVariables?: Record<string, VariableValue>\n): Promise<WorkflowRun> {\n return request(`/workflows/${encodeURIComponent(workflowId)}/execute`, {\n method: 'POST',\n body: JSON.stringify({ inputVariables: inputVariables ?? {} }),\n })\n}\n\nexport async function getWorkflowRuns(workflowId: string): Promise<WorkflowRun[]> {\n return request(`/workflows/${encodeURIComponent(workflowId)}/execute`)\n}\n\n// ---------------------------------------------------------------------------\n// Workflow templates\n// ---------------------------------------------------------------------------\n\nexport interface WorkflowTemplateSummary {\n id: string\n name: string\n description: string\n tags: string[]\n}\n\nexport async function listWorkflowTemplates(): Promise<WorkflowTemplateSummary[]> {\n return request('/workflows/templates')\n}\n\n/**\n * Instantiate a workflow from a template. `connectionId` is required when\n * the template references a `{{connectionId}}` placeholder (all LLM-backed\n * templates do).\n */\nexport async function createWorkflowFromTemplate(\n templateId: string,\n body: { connectionId?: string; name?: string }\n): Promise<Workflow> {\n return request(`/workflows/templates/${encodeURIComponent(templateId)}`, {\n method: 'POST',\n body: JSON.stringify(body),\n })\n}\n\n// ---------------------------------------------------------------------------\n// Model provider connections (org-scoped LLM providers)\n// ---------------------------------------------------------------------------\n\nexport interface ModelProviderConnection {\n id: string\n organizationId: string\n providerId: string\n providerSlug?: string\n name: string\n region?: string\n endpoint?: string\n credentialRef?: string\n apiKeyRef?: string\n modelFilter?: string[]\n config?: Record<string, unknown>\n enabled: boolean\n createdAt?: string\n updatedAt?: string\n}\n\nexport async function listModelProviderConnections(): Promise<ModelProviderConnection[]> {\n return request('/agents/connections')\n}\n\n/**\n * Catalog of supported LLM providers. Previously hard-coded in the\n * connections modal; now backed by `astrlabe.model_providers` so new\n * providers can be added server-side without a frontend release.\n */\nexport type ModelProviderCatalogEntry = {\n id: string\n slug: string\n /** Slug normalized into the `ModelProviderType` enum the runtime uses. */\n normalizedSlug: string\n name: string\n category?: string | null\n logoUrl?: string | null\n docsUrl?: string | null\n authType?: string | null\n supportedModelFamilies?: unknown\n regions?: unknown\n enabled: boolean\n}\n\nexport async function listModelProviderCatalog(): Promise<ModelProviderCatalogEntry[]> {\n const response = await request<ModelProviderCatalogEntry[] | { data: ModelProviderCatalogEntry[] }>(\n '/agents/providers',\n )\n if (Array.isArray(response)) return response\n if (response && typeof response === 'object' && Array.isArray((response as { data?: unknown }).data)) {\n return (response as { data: ModelProviderCatalogEntry[] }).data\n }\n return []\n}\n\nexport async function createModelProviderConnection(body: {\n providerSlug?: string\n providerId?: string\n name: string\n region?: string\n endpoint?: string\n credentialRef?: string\n apiKeyRef?: string\n modelFilter?: string[]\n config?: Record<string, unknown>\n}): Promise<ModelProviderConnection> {\n return request('/agents/connections', {\n method: 'POST',\n body: JSON.stringify(body),\n })\n}\n\nexport async function updateModelProviderConnection(\n id: string,\n body: {\n name?: string\n region?: string\n endpoint?: string\n credentialRef?: string\n apiKeyRef?: string\n modelFilter?: string[]\n config?: Record<string, unknown>\n enabled?: boolean\n },\n): Promise<ModelProviderConnection> {\n return request(`/agents/connections/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n })\n}\n\nexport async function deleteModelProviderConnection(id: string): Promise<{ deleted: boolean }> {\n return request(`/agents/connections/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n })\n}\n\n// ---------------------------------------------------------------------------\n// Agent config & prompts\n// ---------------------------------------------------------------------------\n\nexport async function getAgentPrompts(agentId: string): Promise<AgentPrompt[]> {\n return request(`/agents/prompts?agentId=${encodeURIComponent(agentId)}`)\n}\n\nexport async function getAgentModels(): Promise<AgentModel[]> {\n return request('/agents/models')\n}\n\nexport async function getAgentTools(agentId: string): Promise<WorkflowTool[]> {\n return request(`/agents/tools?agentId=${encodeURIComponent(agentId)}`)\n}\n\nexport async function updateAgentTool(toolId: string, updates: Partial<WorkflowTool>): Promise<WorkflowTool> {\n // Backend PATCH lives at `/agents/tools` (collection) and takes `id`\n // in the body rather than as a path parameter. The `enabled` field the\n // legacy client passed maps to `isEnabled`; `configOverrides` lets\n // callers tweak a workflow-tool binding's overrides without touching\n // the underlying definition.\n const wire: Record<string, unknown> = { id: toolId }\n if (typeof updates.enabled === 'boolean') wire.isEnabled = updates.enabled\n const overrides = (updates as { configOverrides?: unknown }).configOverrides\n if (overrides !== undefined) wire.configOverrides = overrides\n return request('/agents/tools', {\n method: 'PATCH',\n body: JSON.stringify(wire),\n })\n}\n\nexport async function createAgentTool(\n tool: Omit<WorkflowTool, 'organizationId' | 'createdAt' | 'updatedAt'>\n): Promise<WorkflowTool> {\n return request('/agents/tools', {\n method: 'POST',\n body: JSON.stringify(tool),\n })\n}\n\nexport async function deleteAgentTool(toolId: string): Promise<{ deleted: boolean }> {\n return request(`/agents/tools/${encodeURIComponent(toolId)}`, {\n method: 'DELETE',\n })\n}\n\n// ---------------------------------------------------------------------------\n// Agent Tool Definitions (tools available to agents, e.g. web search, code interpreter)\n// ---------------------------------------------------------------------------\n\nexport async function getAgentToolDefinitions(): Promise<AgentTool[]> {\n return request('/agents/tool-definitions')\n}\n\n/**\n * Create a custom agent tool definition. The backend (`POST\n * /agents/tool-definitions`) requires:\n * { name, description, toolType, inputSchema, handlerConfig }\n * where `inputSchema` is a JSON-Schema object with `type` + `properties`.\n */\nexport async function createAgentToolDefinition(\n toolDef: {\n name: string\n description?: string\n toolType: string\n inputSchema: Record<string, unknown>\n handlerConfig: Record<string, unknown>\n },\n): Promise<AgentTool> {\n return request('/agents/tool-definitions', {\n method: 'POST',\n body: JSON.stringify(toolDef),\n })\n}\n\n// ---------------------------------------------------------------------------\n// Rules\n// ---------------------------------------------------------------------------\n\nexport async function getAgentRules(): Promise<AgentRule[]> {\n const response = await request<AgentRule[] | { data: AgentRule[] } | null | undefined>('/rules')\n if (Array.isArray(response)) return response\n if (response && typeof response === 'object' && Array.isArray((response as { data?: unknown }).data)) {\n return (response as { data: AgentRule[] }).data\n }\n return []\n}\n\nexport async function updateAgentRule(\n ruleId: string,\n updates: Partial<AgentRule> & Record<string, unknown>,\n): Promise<AgentRule> {\n return request(`/rules/${encodeURIComponent(ruleId)}`, {\n method: 'PATCH',\n body: JSON.stringify(updates),\n })\n}\n\nexport async function createAgentRule(\n rule: Partial<AgentRule> & Record<string, unknown>,\n): Promise<AgentRule> {\n return request('/rules', {\n method: 'POST',\n body: JSON.stringify(rule),\n })\n}\n\nexport async function deleteAgentRule(ruleId: string): Promise<{ deleted: boolean }> {\n return request(`/rules/${encodeURIComponent(ruleId)}`, {\n method: 'DELETE',\n })\n}\n\nexport async function executeAgentRule(ruleId: string, input: Record<string, unknown>): Promise<unknown> {\n return request(`/rules/${encodeURIComponent(ruleId)}/execute`, {\n method: 'POST',\n body: JSON.stringify(input),\n })\n}\n\n// ---------------------------------------------------------------------------\n// Agent Configs (CRUD — agents_config handler)\n// ---------------------------------------------------------------------------\n\nexport async function createAgentConfig(input: Partial<AgentConfigLike>): Promise<AgentConfigLike> {\n return request('/agents/configs', {\n method: 'POST',\n body: JSON.stringify(input),\n })\n}\n\nexport async function updateAgentConfig(agentId: string, updates: Partial<AgentConfigLike>): Promise<AgentConfigLike> {\n return request(`/agents/configs/${encodeURIComponent(agentId)}`, {\n method: 'PATCH',\n body: JSON.stringify(updates),\n })\n}\n\nexport async function deleteAgentConfig(agentId: string): Promise<{ deleted: boolean }> {\n return request(`/agents/configs/${encodeURIComponent(agentId)}`, {\n method: 'DELETE',\n })\n}\n\n// ---------------------------------------------------------------------------\n// Agent Prompts (versioned prompt library)\n// ---------------------------------------------------------------------------\n\nexport async function createAgentPrompt(input: Omit<AgentPrompt, 'promptId' | 'version' | 'createdAt'>): Promise<AgentPrompt> {\n return request('/agents/prompts', {\n method: 'POST',\n body: JSON.stringify(input),\n })\n}\n\nexport async function updateAgentPrompt(promptId: string, updates: Partial<AgentPrompt>): Promise<AgentPrompt> {\n // Backend route is the collection PATCH `/agents/prompts` — id rides\n // in the body as `promptId`. The handler also requires `promptText`\n // (it overwrites the active version's text), so coerce the legacy\n // partial-AgentPrompt payload into that shape.\n const promptText = (updates as { promptText?: unknown }).promptText\n ?? (updates as { systemPrompt?: unknown }).systemPrompt\n ?? (updates as { content?: unknown }).content\n if (typeof promptText !== 'string' || promptText.length === 0) {\n throw new Error('updateAgentPrompt: `promptText` (or `systemPrompt`/`content`) is required')\n }\n return request('/agents/prompts', {\n method: 'PATCH',\n body: JSON.stringify({ promptId, promptText }),\n })\n}\n\nexport async function deleteAgentPrompt(promptId: string): Promise<{ deleted: boolean }> {\n // The collection route does not expose DELETE today. Surface a clear\n // error rather than silently 404 — callers are using soft-delete via\n // an enabled toggle on the prompt instead.\n void promptId\n throw new Error('deleteAgentPrompt is not supported by the backend yet — disable the prompt via PATCH instead')\n}\n\n// ---------------------------------------------------------------------------\n// Agent Tool Definitions — update / delete\n// ---------------------------------------------------------------------------\n\n/**\n * Patch an existing tool definition. The Rust handler takes the id in\n * the BODY (`toolId`) rather than the URL, and accepts a narrower set\n * of fields than create: `{toolId, name?, description?, parameters?,\n * implementationKey?}`. `implementationKey` is a JSON string that wraps\n * `handlerConfig` — the page wrapper produces that shape before calling.\n */\nexport async function updateAgentToolDefinition(\n agentToolId: string,\n updates: {\n name?: string\n description?: string\n parameters?: Record<string, unknown>\n implementationKey?: string\n },\n): Promise<AgentTool> {\n return request('/agents/tool-definitions', {\n method: 'PATCH',\n body: JSON.stringify({ toolId: agentToolId, ...updates }),\n })\n}\n\nexport async function deleteAgentToolDefinition(agentToolId: string): Promise<{ deleted: boolean }> {\n return request('/agents/tool-definitions', {\n method: 'DELETE',\n body: JSON.stringify({ toolId: agentToolId }),\n })\n}\n\n// ---------------------------------------------------------------------------\n// Workflow Runs — detail, cancel, replay\n// ---------------------------------------------------------------------------\n\nexport type WorkflowRunListParams = {\n workflowId?: string\n status?: string\n limit?: number\n offset?: number\n}\n\nexport async function listWorkflowRuns(params?: WorkflowRunListParams): Promise<{ items: WorkflowRun[]; total: number }> {\n const query = new URLSearchParams()\n if (params?.workflowId) query.set('workflowId', params.workflowId)\n if (params?.status) query.set('status', params.status)\n if (params?.limit) query.set('limit', String(params.limit))\n if (params?.offset) query.set('offset', String(params.offset))\n const path = query.toString().length > 0 ? `/workflow-runs?${query}` : '/workflow-runs'\n return request(path)\n}\n\nexport async function getWorkflowRunById(runId: string): Promise<WorkflowRun> {\n return request(`/workflow-runs/${encodeURIComponent(runId)}`)\n}\n\nexport async function cancelWorkflowRun(runId: string): Promise<WorkflowRun> {\n return request(`/workflow-runs/${encodeURIComponent(runId)}/cancel`, {\n method: 'POST',\n })\n}\n\nexport async function replayWorkflowRun(\n workflowId: string,\n runId: string,\n overrides?: Record<string, VariableValue>,\n): Promise<WorkflowRun> {\n // Empty body → exact rerun (legacy behaviour). With `overrides`, the\n // backend shallow-merges over the original `input_variables`.\n const body = overrides && Object.keys(overrides).length > 0\n ? JSON.stringify({ inputVariables: overrides })\n : undefined\n return request(\n `/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/replay`,\n { method: 'POST', body },\n )\n}\n\nexport type NodeMetrics = {\n tokensIn?: number\n tokensOut?: number\n costUsd?: number\n provider?: string\n model?: string\n}\n\nexport type RunTimelineEntry = {\n nodeId: string\n nodeType: string\n status: 'pending' | 'running' | 'completed' | 'failed' | 'skipped'\n startedAt: string | null\n completedAt: string | null\n durationMs: number | null\n inputs?: Record<string, unknown>\n outputs?: Record<string, unknown>\n error?: string\n metrics?: NodeMetrics\n}\n\nexport async function getRunTimeline(workflowId: string, runId: string): Promise<RunTimelineEntry[]> {\n return request(\n `/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/timeline`,\n )\n}\n\n// ---------------------------------------------------------------------------\n// Analytics (analytics_runs handler)\n// ---------------------------------------------------------------------------\n\nexport type AnalyticsSummary = {\n totalRuns: number\n runsByStatus: Record<string, number>\n avgDurationMs: number\n successRate: number\n perWorkflow: Array<{ workflowId: string; name: string; runs: number; successRate: number }>\n series?: Array<{ date: string; runs: number; successes: number; failures: number }>\n}\n\nexport async function getAnalyticsSummary(params?: { from?: string; to?: string }): Promise<AnalyticsSummary> {\n const query = new URLSearchParams()\n if (params?.from) query.set('from', params.from)\n if (params?.to) query.set('to', params.to)\n const path = query.toString().length > 0 ? `/analytics/runs?${query}` : '/analytics/runs'\n return request(path)\n}\n\n// ---------------------------------------------------------------------------\n// Uploads — presigned S3 upload/download\n// ---------------------------------------------------------------------------\n\nexport type PresignUploadInput = {\n fileName: string\n contentType: string\n fileSize?: number\n folder?: string\n}\n\nexport type PresignedUpload = {\n uploadUrl: string\n downloadUrl: string\n objectKey: string\n expiresAt: string\n}\n\nexport async function presignUpload(input: PresignUploadInput): Promise<PresignedUpload> {\n return request('/uploads', {\n method: 'POST',\n body: JSON.stringify(input),\n })\n}\n\nexport async function getUploadDownloadUrl(objectKey: string): Promise<{ downloadUrl: string }> {\n return request(`/uploads/${encodeURIComponent(objectKey)}`)\n}\n\nexport async function deleteUpload(objectKey: string): Promise<{ deleted: boolean }> {\n return request(`/uploads/${encodeURIComponent(objectKey)}`, {\n method: 'DELETE',\n })\n}\n\n// ---------------------------------------------------------------------------\n// Run Events — SSE subscription helper\n// ---------------------------------------------------------------------------\n\nexport type RunEvent = {\n type: 'run-started' | 'node-started' | 'node-completed' | 'node-failed' | 'run-completed' | 'run-failed' | 'log'\n runId: string\n nodeId?: string\n data?: Record<string, unknown>\n timestamp: string\n}\n\n// ---------------------------------------------------------------------------\n// Public sample workflows\n// ---------------------------------------------------------------------------\n\nexport type PublicSampleWorkflow = {\n slug: string\n name: string | null\n description: string | null\n graph: WorkflowGraph\n version: number | null\n publishedAt: string | null\n}\n\nexport async function getPublicSampleWorkflow(slug: string): Promise<PublicSampleWorkflow> {\n return requestPublic(`/samples/workflows/${encodeURIComponent(slug)}`)\n}\n\nexport function subscribeToRunEvents(\n runId: string,\n onEvent: (event: RunEvent) => void,\n onError?: (error: Event) => void,\n): () => void {\n const baseUrl = buildLambdaApiUrl('').replace(/\\/$/, '')\n const url = `${baseUrl}/workflow-runs/${encodeURIComponent(runId)}/events`\n const source = new EventSource(url, { withCredentials: true })\n\n source.addEventListener('message', (event) => {\n try {\n const parsed = JSON.parse(event.data) as RunEvent\n onEvent(parsed)\n } catch {\n // ignore malformed messages\n }\n })\n\n if (onError) source.addEventListener('error', onError)\n\n return () => source.close()\n}\n\nconst AGENT_AVATARS: Record<string, string> = {\n 'Sales Assistant': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Rafael&hair=variant01&beardProbability=0&mouth=happy01',\n 'Sales Specialist': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Marcos&hair=variant15&beardProbability=50&mouth=happy02',\n 'Support Agent': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Ana&hair=variant43&beardProbability=0&mouth=happy01',\n 'Financial Analyst': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Lucas&hair=variant08&beardProbability=50&mouth=happy02',\n 'Security Analyst': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Pedro&hair=variant22&beardProbability=50&mouth=happy01',\n 'Data Analyst': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Julia&hair=variant29&beardProbability=0&mouth=happy01',\n 'Market Analyst': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Diego&hair=variant12&beardProbability=0&mouth=happy02',\n 'Pricing Manager': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Beatriz&hair=variant38&beardProbability=0&mouth=happy01',\n 'Onboarding Agent': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Camila&hair=variant35&beardProbability=0&mouth=happy01',\n}\n\nfunction defaultAvatar(name: string): string {\n return AGENT_AVATARS[name] ?? `https://api.dicebear.com/9.x/lorelei/svg?seed=${encodeURIComponent(name)}`\n}\n\nexport async function getAgentConfigsWithPrompts(): Promise<AgentWithPrompts[]> {\n const configs = await request<AgentConfigLike[]>('/agents/configs')\n\n return Promise.all(configs.map(async (agent) => {\n const raw = agent as Record<string, unknown>\n // Normalize snake_case from Rust API to camelCase\n const agentId = String(raw.agent_id ?? raw.agentId ?? agent.id ?? '')\n const id = agentId\n const avatar: string = typeof raw.avatar === 'string' && raw.avatar.length > 0\n ? raw.avatar\n : defaultAvatar(String(agent.name ?? ''))\n const modelId = String(raw.model_id ?? raw.modelId ?? '')\n const displayOrder = Number(raw.display_order ?? raw.displayOrder ?? raw.order ?? 0)\n const maxTokens = Number(raw.max_tokens ?? raw.maxTokens ?? 2048)\n const normalized = { ...raw, agentId, modelId, displayOrder, maxTokens, order: displayOrder }\n if (!id) return { ...(normalized as unknown as AgentWithPrompts), avatar, promptCount: 0, activePromptVersion: 0 }\n try {\n const prompts = await getAgentPrompts(id)\n const activePrompt = prompts.find((prompt) => prompt.isActive)\n return {\n ...(normalized as unknown as AgentWithPrompts),\n avatar,\n promptCount: prompts.length,\n activePromptVersion: activePrompt?.version ?? 0,\n }\n } catch {\n return {\n ...(normalized as unknown as AgentWithPrompts),\n avatar,\n promptCount: 0,\n activePromptVersion: 0,\n }\n }\n }))\n}\n\n// ---------------------------------------------------------------------------\n// Datasources\n// ---------------------------------------------------------------------------\n\nexport async function getDatasources(): Promise<DataSource[]> {\n return request('/datasources')\n}\n\nexport async function createDatasource(data: DatasourceFormData): Promise<DataSource> {\n const body = toDatasourceWireBody(data)\n return request('/datasources', {\n method: 'POST',\n body: JSON.stringify(body),\n })\n}\n\n/**\n * Group the flat `DatasourceFormData` shape (that the modal captures off\n * form state) into the nested body the backend expects:\n *\n * { name, dialect,\n * credentials: { host, port, database, username, password, ... },\n * allowedTables, blockedColumns, maxPoolSize, timeoutMs, readOnly }\n *\n * The handler's `ingest_credentials` pulls secret-shaped keys out of\n * `credentials` into the vault, so the plaintext password never lands\n * on the row. Governance fields stay top-level.\n */\nfunction toDatasourceWireBody(data: DatasourceFormData): Record<string, unknown> {\n const CREDENTIAL_KEYS: Array<keyof DatasourceFormData> = [\n 'host', 'port', 'database', 'username', 'password', 'schema',\n 'connectionString', 'projectId', 'dataset', 'keyFile', 'account',\n 'warehouse', 'region', 'bucket', 'token', 'apiKey', 'environment',\n 'index', 'url', 'ssl',\n ]\n const credentials: Record<string, unknown> = {}\n for (const key of CREDENTIAL_KEYS) {\n const value = data[key]\n if (value !== undefined && value !== '' && value !== null) {\n credentials[key as string] = value\n }\n }\n const body: Record<string, unknown> = {\n name: data.name,\n dialect: data.dialect,\n }\n if (Object.keys(credentials).length > 0) body.credentials = credentials\n if (data.allowedTables && data.allowedTables.length > 0) body.allowedTables = data.allowedTables\n if (data.blockedColumns && data.blockedColumns.length > 0) body.blockedColumns = data.blockedColumns\n if (typeof data.maxPoolSize === 'number') body.maxPoolSize = data.maxPoolSize\n if (typeof data.timeoutMs === 'number') body.timeoutMs = data.timeoutMs\n if (typeof data.readOnly === 'boolean') body.readOnly = data.readOnly\n return body\n}\n\nexport async function getDatasourceTables(datasourceId: string): Promise<string[]> {\n return request(`/datasources/${encodeURIComponent(datasourceId)}/tables`)\n}\n\nexport async function getDatasourceSchema(\n datasourceId: string,\n table: string\n): Promise<Array<{ name: string; type: string; nullable?: boolean }>> {\n return request(`/datasources/${encodeURIComponent(datasourceId)}/schema/${encodeURIComponent(table)}`)\n}\n"]}
|