@loopman/langchain-sdk 1.0.9
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/LICENSE +374 -0
- package/README.md +594 -0
- package/dist/agents/loopman-agent.d.ts +29 -0
- package/dist/agents/loopman-agent.d.ts.map +1 -0
- package/dist/agents/loopman-agent.js +441 -0
- package/dist/agents/loopman-agent.js.map +1 -0
- package/dist/client/loopman-api.d.ts +123 -0
- package/dist/client/loopman-api.d.ts.map +1 -0
- package/dist/client/loopman-api.js +407 -0
- package/dist/client/loopman-api.js.map +1 -0
- package/dist/helpers/prompt-orchestrator.d.ts +12 -0
- package/dist/helpers/prompt-orchestrator.d.ts.map +1 -0
- package/dist/helpers/prompt-orchestrator.js +133 -0
- package/dist/helpers/prompt-orchestrator.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/loopman-agent-wrapper.d.ts +70 -0
- package/dist/loopman-agent-wrapper.d.ts.map +1 -0
- package/dist/loopman-agent-wrapper.js +157 -0
- package/dist/loopman-agent-wrapper.js.map +1 -0
- package/dist/loopman-middleware.d.ts +78 -0
- package/dist/loopman-middleware.d.ts.map +1 -0
- package/dist/loopman-middleware.js +367 -0
- package/dist/loopman-middleware.js.map +1 -0
- package/dist/mcp/loopman-mcp-client.d.ts +17 -0
- package/dist/mcp/loopman-mcp-client.d.ts.map +1 -0
- package/dist/mcp/loopman-mcp-client.js +76 -0
- package/dist/mcp/loopman-mcp-client.js.map +1 -0
- package/dist/mcp/tool-registry.d.ts +29 -0
- package/dist/mcp/tool-registry.d.ts.map +1 -0
- package/dist/mcp/tool-registry.js +143 -0
- package/dist/mcp/tool-registry.js.map +1 -0
- package/dist/services/index.d.ts +12 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +9 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/logger.service.d.ts +107 -0
- package/dist/services/logger.service.d.ts.map +1 -0
- package/dist/services/logger.service.js +173 -0
- package/dist/services/logger.service.js.map +1 -0
- package/dist/services/loopman.service.d.ts +72 -0
- package/dist/services/loopman.service.d.ts.map +1 -0
- package/dist/services/loopman.service.js +271 -0
- package/dist/services/loopman.service.js.map +1 -0
- package/dist/services/polling.service.d.ts +136 -0
- package/dist/services/polling.service.d.ts.map +1 -0
- package/dist/services/polling.service.js +428 -0
- package/dist/services/polling.service.js.map +1 -0
- package/dist/types.d.ts +242 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +35 -0
- package/dist/types.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service for polling decision status and waiting for human review
|
|
3
|
+
*
|
|
4
|
+
* Inspired by the Python SDK PollingService with improvements:
|
|
5
|
+
* - Session management (start/stop polling)
|
|
6
|
+
* - Interruption notifications to backend
|
|
7
|
+
* - Jitter in polling intervals (±20%)
|
|
8
|
+
* - Graceful handling of 500 errors
|
|
9
|
+
* - Consecutive error tracking
|
|
10
|
+
* - AbortSignal support for cancellation
|
|
11
|
+
* - Progress callbacks
|
|
12
|
+
* - Centralized logging with LoggerService
|
|
13
|
+
*/
|
|
14
|
+
export class PollingService {
|
|
15
|
+
apiClient;
|
|
16
|
+
logger = null;
|
|
17
|
+
debug = false;
|
|
18
|
+
constructor(apiClient) {
|
|
19
|
+
this.apiClient = apiClient;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Set logger for this polling service
|
|
23
|
+
* Called by LoopmanService to inject the logger
|
|
24
|
+
*/
|
|
25
|
+
setLogger(logger) {
|
|
26
|
+
this.logger = logger;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Wait for a human decision on a specific decision
|
|
30
|
+
* @param options Polling options
|
|
31
|
+
* @returns Polling result with final decision
|
|
32
|
+
*/
|
|
33
|
+
async waitForDecision(options) {
|
|
34
|
+
const { taskId, workflowId, executionId, apiKey, timeoutMs = 5 * 60 * 1000, // 5 minutes
|
|
35
|
+
pollingIntervalMs = 5000, // 5 seconds
|
|
36
|
+
abortSignal, onStatusUpdate, } = options;
|
|
37
|
+
this.logger?.setTaskId(taskId);
|
|
38
|
+
// Store debug flag for this polling session
|
|
39
|
+
this.debug = options.debug ?? false;
|
|
40
|
+
this.logInfo("🚀 Starting polling for decision", {
|
|
41
|
+
taskId,
|
|
42
|
+
workflowId,
|
|
43
|
+
executionId,
|
|
44
|
+
timeoutMs,
|
|
45
|
+
pollingIntervalMs,
|
|
46
|
+
hasAbortSignal: !!abortSignal,
|
|
47
|
+
});
|
|
48
|
+
// Start polling session on backend
|
|
49
|
+
await this.startPollingSession(taskId, workflowId, executionId, apiKey);
|
|
50
|
+
const startTime = Date.now();
|
|
51
|
+
let iterationCount = 0;
|
|
52
|
+
let consecutiveErrors = 0;
|
|
53
|
+
const MAX_CONSECUTIVE_ERRORS = 50;
|
|
54
|
+
try {
|
|
55
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
56
|
+
iterationCount++;
|
|
57
|
+
const elapsedTime = Date.now() - startTime;
|
|
58
|
+
this.logDebug(`🔄 Polling iteration #${iterationCount}`, {
|
|
59
|
+
taskId,
|
|
60
|
+
elapsedTime,
|
|
61
|
+
remainingTime: timeoutMs - elapsedTime,
|
|
62
|
+
});
|
|
63
|
+
// Check for abort signal
|
|
64
|
+
if (abortSignal?.aborted) {
|
|
65
|
+
this.logInfo("🛑 Polling aborted by signal", {
|
|
66
|
+
taskId,
|
|
67
|
+
iterationCount,
|
|
68
|
+
});
|
|
69
|
+
await this.notifyInterruption(taskId, apiKey, "aborted", {
|
|
70
|
+
elapsedTime,
|
|
71
|
+
iteration: iterationCount,
|
|
72
|
+
reason: "aborted_by_signal",
|
|
73
|
+
});
|
|
74
|
+
await this.stopPollingSession(taskId, apiKey, "aborted");
|
|
75
|
+
return {
|
|
76
|
+
status: "ABORTED",
|
|
77
|
+
taskId,
|
|
78
|
+
elapsedTime,
|
|
79
|
+
iterations: iterationCount,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
// Check decision status
|
|
84
|
+
const statusResponse = await this.checkTaskStatus(taskId, workflowId, executionId, apiKey);
|
|
85
|
+
if (onStatusUpdate) {
|
|
86
|
+
onStatusUpdate(statusResponse.status, iterationCount);
|
|
87
|
+
}
|
|
88
|
+
// Check if decision is resolved
|
|
89
|
+
if (statusResponse.status !== "PENDING") {
|
|
90
|
+
this.logInfo("🎯 Decision resolved", {
|
|
91
|
+
taskId,
|
|
92
|
+
status: statusResponse.status,
|
|
93
|
+
iterationCount,
|
|
94
|
+
});
|
|
95
|
+
await this.stopPollingSession(taskId, apiKey, "completed");
|
|
96
|
+
return {
|
|
97
|
+
status: statusResponse.status,
|
|
98
|
+
taskId,
|
|
99
|
+
elapsedTime: Date.now() - startTime,
|
|
100
|
+
iterations: iterationCount,
|
|
101
|
+
data: statusResponse,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// Reset error counter on success
|
|
105
|
+
consecutiveErrors = 0;
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
consecutiveErrors++;
|
|
109
|
+
this.logWarn(`⚠️ Error in polling iteration #${iterationCount}`, error);
|
|
110
|
+
// Ignore 500 errors (server issues are temporary)
|
|
111
|
+
if (this.is500Error(error)) {
|
|
112
|
+
this.logInfo("Server error 500, continuing polling", {
|
|
113
|
+
taskId,
|
|
114
|
+
});
|
|
115
|
+
consecutiveErrors = 0; // Don't count 500 as critical error
|
|
116
|
+
}
|
|
117
|
+
else if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {
|
|
118
|
+
this.logWarn("🚨 Too many consecutive errors, stopping polling", {
|
|
119
|
+
consecutiveErrors,
|
|
120
|
+
taskId,
|
|
121
|
+
});
|
|
122
|
+
await this.notifyInterruption(taskId, apiKey, "error", {
|
|
123
|
+
elapsedTime: Date.now() - startTime,
|
|
124
|
+
reason: "consecutive_errors",
|
|
125
|
+
consecutiveErrors,
|
|
126
|
+
});
|
|
127
|
+
await this.stopPollingSession(taskId, apiKey, "error");
|
|
128
|
+
throw new Error(`Too many consecutive errors (${consecutiveErrors}) during polling for task ${taskId}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Sleep with jitter before next iteration
|
|
132
|
+
const sleepMs = this.addJitter(pollingIntervalMs);
|
|
133
|
+
this.logDebug(`😴 Sleeping for ${sleepMs}ms before next poll`, {
|
|
134
|
+
taskId,
|
|
135
|
+
});
|
|
136
|
+
try {
|
|
137
|
+
await this.sleep(sleepMs, abortSignal);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
if (error instanceof Error && error.message === "Sleep aborted") {
|
|
141
|
+
this.logInfo("🛑 Sleep interrupted by abort signal", {
|
|
142
|
+
taskId,
|
|
143
|
+
});
|
|
144
|
+
await this.notifyInterruption(taskId, apiKey, "aborted", {
|
|
145
|
+
elapsedTime: Date.now() - startTime,
|
|
146
|
+
reason: "sleep_interrupted",
|
|
147
|
+
phase: "sleep",
|
|
148
|
+
});
|
|
149
|
+
await this.stopPollingSession(taskId, apiKey, "aborted");
|
|
150
|
+
return {
|
|
151
|
+
status: "ABORTED",
|
|
152
|
+
taskId,
|
|
153
|
+
elapsedTime: Date.now() - startTime,
|
|
154
|
+
iterations: iterationCount,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Timeout reached
|
|
161
|
+
this.logWarn("⏰ Polling timeout reached", {
|
|
162
|
+
taskId,
|
|
163
|
+
timeoutMs,
|
|
164
|
+
});
|
|
165
|
+
await this.notifyInterruption(taskId, apiKey, "timeout", {
|
|
166
|
+
elapsedTime: Date.now() - startTime,
|
|
167
|
+
timeoutMs,
|
|
168
|
+
reason: "polling_timeout",
|
|
169
|
+
});
|
|
170
|
+
await this.stopPollingSession(taskId, apiKey, "timeout");
|
|
171
|
+
return {
|
|
172
|
+
status: "TIMEOUT",
|
|
173
|
+
taskId,
|
|
174
|
+
elapsedTime: Date.now() - startTime,
|
|
175
|
+
iterations: iterationCount,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
await this.stopPollingSession(taskId, apiKey, "error");
|
|
180
|
+
throw error;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Check task status via API
|
|
185
|
+
* Uses the simplified /api/v1/tasks/:id/status endpoint
|
|
186
|
+
*/
|
|
187
|
+
async checkTaskStatus(taskId, workflowId, executionId, apiKey) {
|
|
188
|
+
this.logDebug("📡 Checking task status", { taskId });
|
|
189
|
+
// Use the lightweight status endpoint for polling
|
|
190
|
+
const statusResponse = await this.apiClient.get(apiKey, `/api/v1/tasks/${taskId}/status`);
|
|
191
|
+
const status = this.mapTaskStatusToDecisionStatus(statusResponse.status);
|
|
192
|
+
// If status is NEED_CHANGES, fetch full task to get feedback
|
|
193
|
+
let feedback;
|
|
194
|
+
let modified_data;
|
|
195
|
+
if (status === "NEED_CHANGES") {
|
|
196
|
+
this.logDebug("🔄 Status is NEED_CHANGES, fetching full task for feedback", { taskId });
|
|
197
|
+
const fullTask = await this.apiClient.get(apiKey, `/api/v1/tasks/${taskId}`);
|
|
198
|
+
// Extract feedback from all NEED_CHANGES decisions (there can be multiple iterations)
|
|
199
|
+
if (fullTask.decisions &&
|
|
200
|
+
Array.isArray(fullTask.decisions) &&
|
|
201
|
+
fullTask.decisions.length > 0) {
|
|
202
|
+
// Filter NEED_CHANGES decisions (decisions are sorted by date desc)
|
|
203
|
+
const needChangesDecisions = fullTask.decisions.filter((d) => d.status === "NEED_CHANGES" || d.type === "NEED_CHANGES");
|
|
204
|
+
if (needChangesDecisions.length > 0) {
|
|
205
|
+
// Aggregate all feedback from NEED_CHANGES iterations with user names
|
|
206
|
+
const feedbacksWithUsers = needChangesDecisions
|
|
207
|
+
.map((d) => {
|
|
208
|
+
const comment = d.comment || d.feedback;
|
|
209
|
+
if (!comment)
|
|
210
|
+
return null;
|
|
211
|
+
// Extract user name
|
|
212
|
+
let userName = "Unknown user";
|
|
213
|
+
if (d.user) {
|
|
214
|
+
const firstName = d.user.firstName || d.user.first_name || "";
|
|
215
|
+
const lastName = d.user.lastName || d.user.last_name || "";
|
|
216
|
+
if (firstName || lastName) {
|
|
217
|
+
userName = `${firstName} ${lastName}`.trim();
|
|
218
|
+
}
|
|
219
|
+
else if (d.user.email) {
|
|
220
|
+
userName = d.user.email;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return { comment, userName };
|
|
224
|
+
})
|
|
225
|
+
.filter((item) => item !== null)
|
|
226
|
+
.reverse(); // Reverse to get chronological order (oldest first)
|
|
227
|
+
if (feedbacksWithUsers.length > 0) {
|
|
228
|
+
// Combine all feedback with iteration numbers and user names
|
|
229
|
+
feedback = feedbacksWithUsers
|
|
230
|
+
.map((item, index) => {
|
|
231
|
+
if (feedbacksWithUsers.length > 1) {
|
|
232
|
+
return `[Iteration ${index + 1}] ${item.userName}: ${item.comment}`;
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
return `${item.userName}: ${item.comment}`;
|
|
236
|
+
}
|
|
237
|
+
})
|
|
238
|
+
.join("\n\n");
|
|
239
|
+
}
|
|
240
|
+
// Use modified_data from the latest NEED_CHANGES
|
|
241
|
+
const latestNeedChanges = needChangesDecisions[0];
|
|
242
|
+
modified_data =
|
|
243
|
+
latestNeedChanges.modified_data || latestNeedChanges.modifiedData;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// Map task status response to decision status format
|
|
248
|
+
const mappedResponse = {
|
|
249
|
+
id: statusResponse.taskId || statusResponse.taskUuid || taskId,
|
|
250
|
+
status: status,
|
|
251
|
+
createdAt: statusResponse.createdAt || new Date().toISOString(),
|
|
252
|
+
updatedAt: statusResponse.updatedAt || new Date().toISOString(),
|
|
253
|
+
feedback: feedback || statusResponse.feedback,
|
|
254
|
+
modified_data: modified_data ||
|
|
255
|
+
statusResponse.modified_data ||
|
|
256
|
+
statusResponse.modifiedData,
|
|
257
|
+
};
|
|
258
|
+
this.logDebug("✅ Status response received", {
|
|
259
|
+
taskId,
|
|
260
|
+
status: mappedResponse.status,
|
|
261
|
+
hasFeedback: !!mappedResponse.feedback,
|
|
262
|
+
});
|
|
263
|
+
return mappedResponse;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Map task status from API to decision status
|
|
267
|
+
*/
|
|
268
|
+
mapTaskStatusToDecisionStatus(taskStatus) {
|
|
269
|
+
switch (taskStatus) {
|
|
270
|
+
case "APPROVED":
|
|
271
|
+
return "VALIDATED";
|
|
272
|
+
case "REJECTED":
|
|
273
|
+
return "REFUSED";
|
|
274
|
+
case "NEEDS_CHANGES":
|
|
275
|
+
return "NEED_CHANGES";
|
|
276
|
+
case "CANCELLED":
|
|
277
|
+
return "CANCELLED";
|
|
278
|
+
case "EXPIRED":
|
|
279
|
+
return "EXPIRED";
|
|
280
|
+
case "PENDING":
|
|
281
|
+
default:
|
|
282
|
+
return "PENDING";
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Start polling session on backend
|
|
287
|
+
* Uses the simplified /api/v1/tasks/:id/polling/start endpoint
|
|
288
|
+
*/
|
|
289
|
+
async startPollingSession(taskId, workflowId, executionId, apiKey) {
|
|
290
|
+
try {
|
|
291
|
+
await this.apiClient.post(apiKey, `/api/v1/tasks/${taskId}/polling/start`, {
|
|
292
|
+
source: "loopman-langchain-sdk-typescript",
|
|
293
|
+
timestamp: new Date().toISOString(),
|
|
294
|
+
});
|
|
295
|
+
this.logDebug("✅ Polling session started", { taskId });
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
this.logWarn("Failed to start polling session", error);
|
|
299
|
+
// Non-critical, continue anyway
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Stop polling session on backend
|
|
304
|
+
* Uses the simplified /api/v1/tasks/:id/polling/stop endpoint
|
|
305
|
+
*/
|
|
306
|
+
async stopPollingSession(taskId, apiKey, reason) {
|
|
307
|
+
try {
|
|
308
|
+
await this.apiClient.post(apiKey, `/api/v1/tasks/${taskId}/polling/stop`, {
|
|
309
|
+
reason,
|
|
310
|
+
timestamp: new Date().toISOString(),
|
|
311
|
+
});
|
|
312
|
+
this.logInfo("✅ Polling session stopped", {
|
|
313
|
+
taskId,
|
|
314
|
+
reason,
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
this.logWarn("Failed to stop polling session", error);
|
|
319
|
+
// Non-critical
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Notify backend about workflow interruption
|
|
324
|
+
* Uses /api/v1/tasks/:id/interruption endpoint (best effort - may not exist yet)
|
|
325
|
+
*/
|
|
326
|
+
async notifyInterruption(taskId, apiKey, type, metadata) {
|
|
327
|
+
try {
|
|
328
|
+
await this.apiClient.post(apiKey, `/api/v1/tasks/${taskId}/interruption`, {
|
|
329
|
+
type,
|
|
330
|
+
metadata: {
|
|
331
|
+
...metadata,
|
|
332
|
+
timestamp: new Date().toISOString(),
|
|
333
|
+
},
|
|
334
|
+
});
|
|
335
|
+
this.logInfo("✅ Interruption notified", {
|
|
336
|
+
taskId,
|
|
337
|
+
type,
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
catch (error) {
|
|
341
|
+
this.logWarn("Failed to notify interruption (endpoint may not exist yet)", error);
|
|
342
|
+
// Non-critical - endpoint might not be implemented yet
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Check if error is a 500 error (server-side issue)
|
|
347
|
+
*/
|
|
348
|
+
is500Error(error) {
|
|
349
|
+
if (error instanceof Error) {
|
|
350
|
+
const message = error.message.toLowerCase();
|
|
351
|
+
return (message.includes("500") || message.includes("internal server error"));
|
|
352
|
+
}
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Add jitter to polling interval (±20%)
|
|
357
|
+
* This helps distribute load on the server when multiple clients are polling
|
|
358
|
+
*/
|
|
359
|
+
addJitter(intervalMs) {
|
|
360
|
+
const jitterPercent = (Math.random() - 0.5) * 0.4; // -20% to +20%
|
|
361
|
+
const jitteredInterval = intervalMs * (1 + jitterPercent);
|
|
362
|
+
return Math.round(jitteredInterval);
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Sleep with optional abort signal support
|
|
366
|
+
*/
|
|
367
|
+
sleep(ms, abortSignal) {
|
|
368
|
+
return new Promise((resolve, reject) => {
|
|
369
|
+
const timeoutId = setTimeout(resolve, ms);
|
|
370
|
+
if (abortSignal) {
|
|
371
|
+
const abortHandler = () => {
|
|
372
|
+
clearTimeout(timeoutId);
|
|
373
|
+
reject(new Error("Sleep aborted"));
|
|
374
|
+
};
|
|
375
|
+
abortSignal.addEventListener("abort", abortHandler, { once: true });
|
|
376
|
+
// Cleanup listener after timeout
|
|
377
|
+
setTimeout(() => {
|
|
378
|
+
abortSignal.removeEventListener("abort", abortHandler);
|
|
379
|
+
}, ms);
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Log debug message
|
|
385
|
+
*/
|
|
386
|
+
logDebug(message, data) {
|
|
387
|
+
if (this.logger) {
|
|
388
|
+
this.logger.debug(message, data);
|
|
389
|
+
}
|
|
390
|
+
else if (this.debug) {
|
|
391
|
+
console.log("[PollingService]", message, data !== undefined ? data : "");
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Log info message
|
|
396
|
+
*/
|
|
397
|
+
logInfo(message, data) {
|
|
398
|
+
if (this.logger) {
|
|
399
|
+
this.logger.info(message, data);
|
|
400
|
+
}
|
|
401
|
+
else if (this.debug) {
|
|
402
|
+
console.log("[PollingService]", message, data !== undefined ? data : "");
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Log warning message
|
|
407
|
+
*/
|
|
408
|
+
logWarn(message, data) {
|
|
409
|
+
if (this.logger) {
|
|
410
|
+
this.logger.warn(message, data);
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
console.warn("[PollingService]", message, data !== undefined ? data : "");
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Log error message
|
|
418
|
+
*/
|
|
419
|
+
logError(message, data) {
|
|
420
|
+
if (this.logger) {
|
|
421
|
+
this.logger.error(message, data);
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
console.error("[PollingService]", message, data !== undefined ? data : "");
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
//# sourceMappingURL=polling.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polling.service.js","sourceRoot":"","sources":["../../src/services/polling.service.ts"],"names":[],"mappings":"AAqEA;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,cAAc;IACjB,SAAS,CAAmB;IAC5B,MAAM,GAAyB,IAAI,CAAC;IACpC,KAAK,GAAY,KAAK,CAAC;IAE/B,YAAY,SAA2B;QACrC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,MAAqB;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe,CAAC,OAAuB;QAC3C,MAAM,EACJ,MAAM,EACN,UAAU,EACV,WAAW,EACX,MAAM,EACN,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,YAAY;QACvC,iBAAiB,GAAG,IAAI,EAAE,YAAY;QACtC,WAAW,EACX,cAAc,GACf,GAAG,OAAO,CAAC;QAEZ,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAE/B,4CAA4C;QAC5C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;QAEpC,IAAI,CAAC,OAAO,CAAC,kCAAkC,EAAE;YAC/C,MAAM;YACN,UAAU;YACV,WAAW;YACX,SAAS;YACT,iBAAiB;YACjB,cAAc,EAAE,CAAC,CAAC,WAAW;SAC9B,CAAC,CAAC;QAEH,mCAAmC;QACnC,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QAExE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAC1B,MAAM,sBAAsB,GAAG,EAAE,CAAC;QAElC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;gBAC1C,cAAc,EAAE,CAAC;gBACjB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAE3C,IAAI,CAAC,QAAQ,CAAC,yBAAyB,cAAc,EAAE,EAAE;oBACvD,MAAM;oBACN,WAAW;oBACX,aAAa,EAAE,SAAS,GAAG,WAAW;iBACvC,CAAC,CAAC;gBAEH,yBAAyB;gBACzB,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;oBACzB,IAAI,CAAC,OAAO,CAAC,8BAA8B,EAAE;wBAC3C,MAAM;wBACN,cAAc;qBACf,CAAC,CAAC;oBACH,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE;wBACvD,WAAW;wBACX,SAAS,EAAE,cAAc;wBACzB,MAAM,EAAE,mBAAmB;qBAC5B,CAAC,CAAC;oBACH,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;oBACzD,OAAO;wBACL,MAAM,EAAE,SAAS;wBACjB,MAAM;wBACN,WAAW;wBACX,UAAU,EAAE,cAAc;qBAC3B,CAAC;gBACJ,CAAC;gBAED,IAAI,CAAC;oBACH,wBAAwB;oBACxB,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,eAAe,CAC/C,MAAM,EACN,UAAU,EACV,WAAW,EACX,MAAM,CACP,CAAC;oBAEF,IAAI,cAAc,EAAE,CAAC;wBACnB,cAAc,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;oBACxD,CAAC;oBAED,gCAAgC;oBAChC,IAAI,cAAc,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;wBACxC,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE;4BACnC,MAAM;4BACN,MAAM,EAAE,cAAc,CAAC,MAAM;4BAC7B,cAAc;yBACf,CAAC,CAAC;wBACH,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;wBAE3D,OAAO;4BACL,MAAM,EAAE,cAAc,CAAC,MAAM;4BAC7B,MAAM;4BACN,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;4BACnC,UAAU,EAAE,cAAc;4BAC1B,IAAI,EAAE,cAAc;yBACrB,CAAC;oBACJ,CAAC;oBAED,iCAAiC;oBACjC,iBAAiB,GAAG,CAAC,CAAC;gBACxB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,iBAAiB,EAAE,CAAC;oBACpB,IAAI,CAAC,OAAO,CACV,kCAAkC,cAAc,EAAE,EAClD,KAAK,CACN,CAAC;oBAEF,kDAAkD;oBAClD,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC3B,IAAI,CAAC,OAAO,CAAC,sCAAsC,EAAE;4BACnD,MAAM;yBACP,CAAC,CAAC;wBACH,iBAAiB,GAAG,CAAC,CAAC,CAAC,oCAAoC;oBAC7D,CAAC;yBAAM,IAAI,iBAAiB,IAAI,sBAAsB,EAAE,CAAC;wBACvD,IAAI,CAAC,OAAO,CAAC,kDAAkD,EAAE;4BAC/D,iBAAiB;4BACjB,MAAM;yBACP,CAAC,CAAC;wBACH,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;4BACrD,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;4BACnC,MAAM,EAAE,oBAAoB;4BAC5B,iBAAiB;yBAClB,CAAC,CAAC;wBACH,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;wBACvD,MAAM,IAAI,KAAK,CACb,gCAAgC,iBAAiB,6BAA6B,MAAM,EAAE,CACvF,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,0CAA0C;gBAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;gBAClD,IAAI,CAAC,QAAQ,CAAC,mBAAmB,OAAO,qBAAqB,EAAE;oBAC7D,MAAM;iBACP,CAAC,CAAC;gBAEH,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACzC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;wBAChE,IAAI,CAAC,OAAO,CAAC,sCAAsC,EAAE;4BACnD,MAAM;yBACP,CAAC,CAAC;wBACH,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE;4BACvD,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;4BACnC,MAAM,EAAE,mBAAmB;4BAC3B,KAAK,EAAE,OAAO;yBACf,CAAC,CAAC;wBACH,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;wBACzD,OAAO;4BACL,MAAM,EAAE,SAAS;4BACjB,MAAM;4BACN,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;4BACnC,UAAU,EAAE,cAAc;yBAC3B,CAAC;oBACJ,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YAED,kBAAkB;YAClB,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE;gBACxC,MAAM;gBACN,SAAS;aACV,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE;gBACvD,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBACnC,SAAS;gBACT,MAAM,EAAE,iBAAiB;aAC1B,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YAEzD,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,MAAM;gBACN,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBACnC,UAAU,EAAE,cAAc;aAC3B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,eAAe,CAC3B,MAAc,EACd,UAAkB,EAClB,WAAmB,EACnB,MAAc;QAEd,IAAI,CAAC,QAAQ,CAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAErD,kDAAkD;QAClD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAC7C,MAAM,EACN,iBAAiB,MAAM,SAAS,CACjC,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,CAAC,6BAA6B,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAEzE,6DAA6D;QAC7D,IAAI,QAA4B,CAAC;QACjC,IAAI,aAA8B,CAAC;QAEnC,IAAI,MAAM,KAAK,cAAc,EAAE,CAAC;YAC9B,IAAI,CAAC,QAAQ,CACX,4DAA4D,EAC5D,EAAE,MAAM,EAAE,CACX,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CACvC,MAAM,EACN,iBAAiB,MAAM,EAAE,CAC1B,CAAC;YAEF,sFAAsF;YACtF,IACE,QAAQ,CAAC,SAAS;gBAClB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;gBACjC,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAC7B,CAAC;gBACD,oEAAoE;gBACpE,MAAM,oBAAoB,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CACpD,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,cAAc,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CACrE,CAAC;gBAEF,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpC,sEAAsE;oBACtE,MAAM,kBAAkB,GAAG,oBAAoB;yBAC5C,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;wBACd,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC;wBACxC,IAAI,CAAC,OAAO;4BAAE,OAAO,IAAI,CAAC;wBAE1B,oBAAoB;wBACpB,IAAI,QAAQ,GAAG,cAAc,CAAC;wBAC9B,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;4BACX,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;4BAC9D,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;4BAC3D,IAAI,SAAS,IAAI,QAAQ,EAAE,CAAC;gCAC1B,QAAQ,GAAG,GAAG,SAAS,IAAI,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;4BAC/C,CAAC;iCAAM,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gCACxB,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;4BAC1B,CAAC;wBACH,CAAC;wBAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;oBAC/B,CAAC,CAAC;yBACD,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;yBACpC,OAAO,EAAE,CAAC,CAAC,oDAAoD;oBAElE,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAClC,6DAA6D;wBAC7D,QAAQ,GAAG,kBAAkB;6BAC1B,GAAG,CAAC,CAAC,IAAS,EAAE,KAAa,EAAE,EAAE;4BAChC,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCAClC,OAAO,cAAc,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,QAAQ,KAC9C,IAAI,CAAC,OACP,EAAE,CAAC;4BACL,CAAC;iCAAM,CAAC;gCACN,OAAO,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;4BAC7C,CAAC;wBACH,CAAC,CAAC;6BACD,IAAI,CAAC,MAAM,CAAC,CAAC;oBAClB,CAAC;oBAED,iDAAiD;oBACjD,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC;oBAClD,aAAa;wBACX,iBAAiB,CAAC,aAAa,IAAI,iBAAiB,CAAC,YAAY,CAAC;gBACtE,CAAC;YACH,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,MAAM,cAAc,GAA2B;YAC7C,EAAE,EAAE,cAAc,CAAC,MAAM,IAAI,cAAc,CAAC,QAAQ,IAAI,MAAM;YAC9D,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,cAAc,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC/D,SAAS,EAAE,cAAc,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC/D,QAAQ,EAAE,QAAQ,IAAI,cAAc,CAAC,QAAQ;YAC7C,aAAa,EACX,aAAa;gBACb,cAAc,CAAC,aAAa;gBAC5B,cAAc,CAAC,YAAY;SAC9B,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,4BAA4B,EAAE;YAC1C,MAAM;YACN,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,WAAW,EAAE,CAAC,CAAC,cAAc,CAAC,QAAQ;SACvC,CAAC,CAAC;QACH,OAAO,cAAc,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,6BAA6B,CACnC,UAAkB;QAElB,QAAQ,UAAU,EAAE,CAAC;YACnB,KAAK,UAAU;gBACb,OAAO,WAAW,CAAC;YACrB,KAAK,UAAU;gBACb,OAAO,SAAS,CAAC;YACnB,KAAK,eAAe;gBAClB,OAAO,cAAc,CAAC;YACxB,KAAK,WAAW;gBACd,OAAO,WAAW,CAAC;YACrB,KAAK,SAAS;gBACZ,OAAO,SAAS,CAAC;YACnB,KAAK,SAAS,CAAC;YACf;gBACE,OAAO,SAAS,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,mBAAmB,CAC/B,MAAc,EACd,UAAkB,EAClB,WAAmB,EACnB,MAAc;QAEd,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACvB,MAAM,EACN,iBAAiB,MAAM,gBAAgB,EACvC;gBACE,MAAM,EAAE,kCAAkC;gBAC1C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CACF,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;YACvD,gCAAgC;QAClC,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,kBAAkB,CAC9B,MAAc,EACd,MAAc,EACd,MAAc;QAEd,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACvB,MAAM,EACN,iBAAiB,MAAM,eAAe,EACtC;gBACE,MAAM;gBACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CACF,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE;gBACxC,MAAM;gBACN,MAAM;aACP,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YACtD,eAAe;QACjB,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,kBAAkB,CAC9B,MAAc,EACd,MAAc,EACd,IAAY,EACZ,QAA6B;QAE7B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACvB,MAAM,EACN,iBAAiB,MAAM,eAAe,EACtC;gBACE,IAAI;gBACJ,QAAQ,EAAE;oBACR,GAAG,QAAQ;oBACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC;aACF,CACF,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE;gBACtC,MAAM;gBACN,IAAI;aACL,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CACV,4DAA4D,EAC5D,KAAK,CACN,CAAC;YACF,uDAAuD;QACzD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,KAAU;QAC3B,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC5C,OAAO,CACL,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CACrE,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACK,SAAS,CAAC,UAAkB;QAClC,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,eAAe;QAClE,MAAM,gBAAgB,GAAG,UAAU,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,EAAU,EAAE,WAAyB;QACjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAE1C,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,YAAY,GAAG,GAAG,EAAE;oBACxB,YAAY,CAAC,SAAS,CAAC,CAAC;oBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;gBACrC,CAAC,CAAC;gBAEF,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAEpE,iCAAiC;gBACjC,UAAU,CAAC,GAAG,EAAE;oBACd,WAAW,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;gBACzD,CAAC,EAAE,EAAE,CAAC,CAAC;YACT,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,QAAQ,CAAC,OAAe,EAAE,IAAU;QAC1C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED;;OAEG;IACK,OAAO,CAAC,OAAe,EAAE,IAAU;QACzC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED;;OAEG;IACK,OAAO,CAAC,OAAe,EAAE,IAAU;QACzC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED;;OAEG;IACK,QAAQ,CAAC,OAAe,EAAE,IAAU;QAC1C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CACX,kBAAkB,EAClB,OAAO,EACP,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC/B,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core types for Loopman SDK TypeScript
|
|
3
|
+
*/
|
|
4
|
+
import { LoopmanMcpClientConfig } from "./mcp/loopman-mcp-client";
|
|
5
|
+
export interface LoopmanConfig {
|
|
6
|
+
/** Loopman API key for authentication */
|
|
7
|
+
apiKey: string;
|
|
8
|
+
/** Optional timeout for API operations (default: 30000ms) */
|
|
9
|
+
timeout?: number;
|
|
10
|
+
/** Optional retry configuration */
|
|
11
|
+
retry?: {
|
|
12
|
+
attempts: number;
|
|
13
|
+
delay: number;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface LoopmanAgentConfig {
|
|
17
|
+
model: string | unknown;
|
|
18
|
+
systemPrompt?: string;
|
|
19
|
+
additionalTools?: any[];
|
|
20
|
+
apiKey: string;
|
|
21
|
+
workflowId: string;
|
|
22
|
+
executionId?: string;
|
|
23
|
+
channelId?: string;
|
|
24
|
+
category?: string;
|
|
25
|
+
language?: string;
|
|
26
|
+
maxIterations?: number;
|
|
27
|
+
maxRetries?: number;
|
|
28
|
+
pollingTimeoutMs?: number;
|
|
29
|
+
pollingIntervalMs?: number;
|
|
30
|
+
debug?: boolean;
|
|
31
|
+
mcp?: Partial<LoopmanMcpClientConfig>;
|
|
32
|
+
manualExecutionMode?: boolean;
|
|
33
|
+
requireApprovalForTools?: string[];
|
|
34
|
+
}
|
|
35
|
+
export interface CreateLoopmanAgentParams extends LoopmanAgentConfig {
|
|
36
|
+
tools?: any[];
|
|
37
|
+
prompt?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface LoopmanAgentInput {
|
|
40
|
+
input: string;
|
|
41
|
+
context?: Record<string, unknown>;
|
|
42
|
+
}
|
|
43
|
+
export interface LoopmanAgentDecisionResult {
|
|
44
|
+
taskId: string;
|
|
45
|
+
status: "VALIDATED" | "REFUSED" | "NEED_CHANGES" | "CANCELLED" | "EXPIRED" | "TIMEOUT" | "ABORTED";
|
|
46
|
+
feedback?: string;
|
|
47
|
+
modifiedData?: any;
|
|
48
|
+
}
|
|
49
|
+
export interface LoopmanAgentOutput {
|
|
50
|
+
response: string;
|
|
51
|
+
taskId?: string;
|
|
52
|
+
status: "completed" | "pending_review" | "approved" | "rejected" | "needs_changes" | "timeout" | "aborted" | "error";
|
|
53
|
+
confidence?: number;
|
|
54
|
+
decision?: LoopmanAgentDecisionResult;
|
|
55
|
+
retries?: number;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* User interface
|
|
59
|
+
*/
|
|
60
|
+
export interface LoopmanUser {
|
|
61
|
+
id: string;
|
|
62
|
+
email: string;
|
|
63
|
+
firstName?: string;
|
|
64
|
+
lastName?: string;
|
|
65
|
+
tenantId: string;
|
|
66
|
+
createdAt: string;
|
|
67
|
+
updatedAt: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Token exchange response interface
|
|
71
|
+
*/
|
|
72
|
+
export interface TokenExchangeResponse {
|
|
73
|
+
accessToken: string;
|
|
74
|
+
refreshToken: string;
|
|
75
|
+
expiresIn: number;
|
|
76
|
+
serverUrl: string;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Cached token data interface
|
|
80
|
+
*/
|
|
81
|
+
export interface TokenData {
|
|
82
|
+
accessToken: string;
|
|
83
|
+
refreshToken?: string;
|
|
84
|
+
serverUrl: string;
|
|
85
|
+
expiresIn: number;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Cached token result interface
|
|
89
|
+
*/
|
|
90
|
+
export interface CachedToken {
|
|
91
|
+
accessToken: string;
|
|
92
|
+
serverUrl: string;
|
|
93
|
+
fromCache: boolean;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Configuration for LoopmanService
|
|
97
|
+
*/
|
|
98
|
+
export interface LoopmanServiceConfig {
|
|
99
|
+
apiKey: string;
|
|
100
|
+
workflowId: string;
|
|
101
|
+
executionId: string;
|
|
102
|
+
channelId?: string;
|
|
103
|
+
timeout?: number;
|
|
104
|
+
pollingInterval?: number;
|
|
105
|
+
debug?: boolean;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Loopman Task Status - Matches Prisma TaskStatus enum
|
|
109
|
+
*/
|
|
110
|
+
export type LoopmanTaskStatus = "PENDING" | "APPROVED" | "REJECTED" | "NEEDS_CHANGES";
|
|
111
|
+
/**
|
|
112
|
+
* Task response from Loopman API
|
|
113
|
+
* This is what POST /api/v1/tasks and GET /api/v1/tasks/:id/status return
|
|
114
|
+
*/
|
|
115
|
+
export interface LoopmanTaskResponse {
|
|
116
|
+
id: string;
|
|
117
|
+
status: LoopmanTaskStatus;
|
|
118
|
+
title?: string;
|
|
119
|
+
description?: string;
|
|
120
|
+
workflowIdentifier?: string;
|
|
121
|
+
executionIdentifier?: string;
|
|
122
|
+
metadata?: any;
|
|
123
|
+
createdAt: string;
|
|
124
|
+
updatedAt: string;
|
|
125
|
+
priority?: "LOW" | "MEDIUM" | "HIGH";
|
|
126
|
+
channelId?: string;
|
|
127
|
+
externalReference?: string;
|
|
128
|
+
businessContext?: string;
|
|
129
|
+
proposedDecision?: string;
|
|
130
|
+
decisionReasoning?: string;
|
|
131
|
+
decisions?: Array<{
|
|
132
|
+
id: string;
|
|
133
|
+
status: string;
|
|
134
|
+
comment?: string;
|
|
135
|
+
createdAt: string;
|
|
136
|
+
user?: {
|
|
137
|
+
id: string;
|
|
138
|
+
firstName?: string;
|
|
139
|
+
lastName?: string;
|
|
140
|
+
email: string;
|
|
141
|
+
};
|
|
142
|
+
}>;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Decision response from Loopman API (for backward compatibility and context)
|
|
146
|
+
* This maintains the existing interface for decision-based logic
|
|
147
|
+
*/
|
|
148
|
+
export interface LoopmanDecisionResponse {
|
|
149
|
+
id: string;
|
|
150
|
+
status: "PENDING" | "VALIDATED" | "REFUSED" | "NEED_CHANGES" | "CANCELLED" | "EXPIRED";
|
|
151
|
+
feedback?: string;
|
|
152
|
+
modified_data?: any;
|
|
153
|
+
createdAt: string;
|
|
154
|
+
updatedAt: string;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Information item for task display
|
|
158
|
+
*/
|
|
159
|
+
export interface TaskInformation {
|
|
160
|
+
label?: string;
|
|
161
|
+
type: "text" | "url" | "image" | "bulletPoints";
|
|
162
|
+
value: string | string[];
|
|
163
|
+
importance?: number;
|
|
164
|
+
ruleIds?: string[];
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Request body for creating a task in Loopman
|
|
168
|
+
* Maps tool call data to task fields for POST /api/v1/tasks
|
|
169
|
+
*/
|
|
170
|
+
export interface CreateTaskRequest {
|
|
171
|
+
title: string;
|
|
172
|
+
description: string;
|
|
173
|
+
workflowIdentifier: string;
|
|
174
|
+
executionIdentifier: string;
|
|
175
|
+
channelId?: string;
|
|
176
|
+
category?: string;
|
|
177
|
+
businessContext?: string;
|
|
178
|
+
proposedDecision?: string;
|
|
179
|
+
decisionReasoning?: string;
|
|
180
|
+
metadata: {
|
|
181
|
+
source: string;
|
|
182
|
+
timestamp: string;
|
|
183
|
+
toolName: string;
|
|
184
|
+
toolArgs: any;
|
|
185
|
+
parentTaskId?: string;
|
|
186
|
+
};
|
|
187
|
+
information?: TaskInformation[];
|
|
188
|
+
priority?: "LOW" | "MEDIUM" | "HIGH";
|
|
189
|
+
externalReference?: string;
|
|
190
|
+
idempotencyKey?: string;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Guideline from Loopman API
|
|
194
|
+
*/
|
|
195
|
+
export interface Guideline {
|
|
196
|
+
ruleId: string;
|
|
197
|
+
description: string;
|
|
198
|
+
category?: string | null;
|
|
199
|
+
severity: "CRITICAL" | "MAJOR" | "MINOR";
|
|
200
|
+
workflowId?: string | null;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Guidelines response from API
|
|
204
|
+
*/
|
|
205
|
+
export interface GuidelinesResponse {
|
|
206
|
+
guidelines: Guideline[];
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Decision context entry (decision history)
|
|
210
|
+
*/
|
|
211
|
+
export interface DecisionContextEntry {
|
|
212
|
+
date: Date | string;
|
|
213
|
+
userType: string;
|
|
214
|
+
lastName?: string;
|
|
215
|
+
firstName?: string;
|
|
216
|
+
status: "PENDING" | "APPROVED" | "REJECTED" | "NEEDS_CHANGES" | "CANCELLED" | "EXPIRED";
|
|
217
|
+
comment?: string;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Decision context response from API v1
|
|
221
|
+
*/
|
|
222
|
+
export interface DecisionContextResponse {
|
|
223
|
+
decisions: DecisionContextEntry[];
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Loopman errors
|
|
227
|
+
*/
|
|
228
|
+
export declare class LoopmanError extends Error {
|
|
229
|
+
code: string;
|
|
230
|
+
details?: any | undefined;
|
|
231
|
+
constructor(message: string, code: string, details?: any | undefined);
|
|
232
|
+
}
|
|
233
|
+
export declare class LoopmanConnectionError extends LoopmanError {
|
|
234
|
+
constructor(message: string, details?: any);
|
|
235
|
+
}
|
|
236
|
+
export declare class LoopmanValidationError extends LoopmanError {
|
|
237
|
+
constructor(message: string, details?: any);
|
|
238
|
+
}
|
|
239
|
+
export declare class LoopmanTimeoutError extends LoopmanError {
|
|
240
|
+
constructor(message: string, details?: any);
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=types.d.ts.map
|