@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.
Files changed (55) hide show
  1. package/LICENSE +374 -0
  2. package/README.md +594 -0
  3. package/dist/agents/loopman-agent.d.ts +29 -0
  4. package/dist/agents/loopman-agent.d.ts.map +1 -0
  5. package/dist/agents/loopman-agent.js +441 -0
  6. package/dist/agents/loopman-agent.js.map +1 -0
  7. package/dist/client/loopman-api.d.ts +123 -0
  8. package/dist/client/loopman-api.d.ts.map +1 -0
  9. package/dist/client/loopman-api.js +407 -0
  10. package/dist/client/loopman-api.js.map +1 -0
  11. package/dist/helpers/prompt-orchestrator.d.ts +12 -0
  12. package/dist/helpers/prompt-orchestrator.d.ts.map +1 -0
  13. package/dist/helpers/prompt-orchestrator.js +133 -0
  14. package/dist/helpers/prompt-orchestrator.js.map +1 -0
  15. package/dist/index.d.ts +17 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +22 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/loopman-agent-wrapper.d.ts +70 -0
  20. package/dist/loopman-agent-wrapper.d.ts.map +1 -0
  21. package/dist/loopman-agent-wrapper.js +157 -0
  22. package/dist/loopman-agent-wrapper.js.map +1 -0
  23. package/dist/loopman-middleware.d.ts +78 -0
  24. package/dist/loopman-middleware.d.ts.map +1 -0
  25. package/dist/loopman-middleware.js +367 -0
  26. package/dist/loopman-middleware.js.map +1 -0
  27. package/dist/mcp/loopman-mcp-client.d.ts +17 -0
  28. package/dist/mcp/loopman-mcp-client.d.ts.map +1 -0
  29. package/dist/mcp/loopman-mcp-client.js +76 -0
  30. package/dist/mcp/loopman-mcp-client.js.map +1 -0
  31. package/dist/mcp/tool-registry.d.ts +29 -0
  32. package/dist/mcp/tool-registry.d.ts.map +1 -0
  33. package/dist/mcp/tool-registry.js +143 -0
  34. package/dist/mcp/tool-registry.js.map +1 -0
  35. package/dist/services/index.d.ts +12 -0
  36. package/dist/services/index.d.ts.map +1 -0
  37. package/dist/services/index.js +9 -0
  38. package/dist/services/index.js.map +1 -0
  39. package/dist/services/logger.service.d.ts +107 -0
  40. package/dist/services/logger.service.d.ts.map +1 -0
  41. package/dist/services/logger.service.js +173 -0
  42. package/dist/services/logger.service.js.map +1 -0
  43. package/dist/services/loopman.service.d.ts +72 -0
  44. package/dist/services/loopman.service.d.ts.map +1 -0
  45. package/dist/services/loopman.service.js +271 -0
  46. package/dist/services/loopman.service.js.map +1 -0
  47. package/dist/services/polling.service.d.ts +136 -0
  48. package/dist/services/polling.service.d.ts.map +1 -0
  49. package/dist/services/polling.service.js +428 -0
  50. package/dist/services/polling.service.js.map +1 -0
  51. package/dist/types.d.ts +242 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +35 -0
  54. package/dist/types.js.map +1 -0
  55. 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":"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"}
@@ -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