@minded-ai/mindedjs 1.0.95-beta-3 → 1.0.96-beta-1
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/agent.d.ts +1 -4
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +41 -75
- package/dist/agent.js.map +1 -1
- package/dist/cli/index.js +12 -12
- package/dist/cli/index.js.map +1 -1
- package/dist/edges/createDirectEdge.js +1 -1
- package/dist/edges/createDirectEdge.js.map +1 -1
- package/dist/edges/createLogicalRouter.d.ts.map +1 -1
- package/dist/edges/createLogicalRouter.js +7 -7
- package/dist/edges/createLogicalRouter.js.map +1 -1
- package/dist/edges/createPromptRouter.d.ts.map +1 -1
- package/dist/edges/createPromptRouter.js +3 -4
- package/dist/edges/createPromptRouter.js.map +1 -1
- package/dist/edges/edgeFactory.js +2 -2
- package/dist/edges/edgeFactory.js.map +1 -1
- package/dist/nodes/addAppToolNode.js +3 -3
- package/dist/nodes/addAppToolNode.js.map +1 -1
- package/dist/nodes/addHumanInTheLoopNode.d.ts.map +1 -1
- package/dist/nodes/addHumanInTheLoopNode.js +2 -3
- package/dist/nodes/addHumanInTheLoopNode.js.map +1 -1
- package/dist/nodes/addJumpToNode.js +1 -1
- package/dist/nodes/addJumpToNode.js.map +1 -1
- package/dist/nodes/addPromptNode.d.ts.map +1 -1
- package/dist/nodes/addPromptNode.js +1 -45
- package/dist/nodes/addPromptNode.js.map +1 -1
- package/dist/nodes/addToolNode.d.ts.map +1 -1
- package/dist/nodes/addToolNode.js +1 -4
- package/dist/nodes/addToolNode.js.map +1 -1
- package/dist/nodes/addToolRunNode.d.ts.map +1 -1
- package/dist/nodes/addToolRunNode.js +0 -1
- package/dist/nodes/addToolRunNode.js.map +1 -1
- package/dist/nodes/addTriggerNode.js +1 -1
- package/dist/nodes/addTriggerNode.js.map +1 -1
- package/dist/platform/mindedConnection.d.ts.map +1 -1
- package/dist/platform/mindedConnection.js +12 -12
- package/dist/platform/mindedConnection.js.map +1 -1
- package/dist/platform/mindedConnectionTypes.d.ts +1 -151
- package/dist/platform/mindedConnectionTypes.d.ts.map +1 -1
- package/dist/platform/mindedConnectionTypes.js +0 -9
- package/dist/platform/mindedConnectionTypes.js.map +1 -1
- package/dist/playbooks/playbooks.js +4 -4
- package/dist/playbooks/playbooks.js.map +1 -1
- package/dist/types/Agent.types.d.ts +0 -2
- package/dist/types/Agent.types.d.ts.map +1 -1
- package/dist/types/Agent.types.js.map +1 -1
- package/dist/types/Flows.types.d.ts +2 -1
- package/dist/types/Flows.types.d.ts.map +1 -1
- package/dist/types/Flows.types.js +1 -0
- package/dist/types/Flows.types.js.map +1 -1
- package/dist/types/LangGraph.types.d.ts +4 -2
- package/dist/types/LangGraph.types.d.ts.map +1 -1
- package/dist/types/LangGraph.types.js +5 -3
- package/dist/types/LangGraph.types.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +0 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/voice/voiceSession.d.ts.map +1 -1
- package/dist/voice/voiceSession.js +3 -2
- package/dist/voice/voiceSession.js.map +1 -1
- package/package.json +1 -1
- package/src/agent.ts +45 -93
- package/src/cli/index.ts +12 -12
- package/src/edges/createDirectEdge.ts +1 -1
- package/src/edges/createLogicalRouter.ts +8 -7
- package/src/edges/createPromptRouter.ts +3 -4
- package/src/edges/edgeFactory.ts +2 -2
- package/src/nodes/addAppToolNode.ts +3 -3
- package/src/nodes/addHumanInTheLoopNode.ts +3 -3
- package/src/nodes/addJumpToNode.ts +1 -1
- package/src/nodes/addPromptNode.ts +6 -50
- package/src/nodes/addToolNode.ts +2 -4
- package/src/nodes/addToolRunNode.ts +1 -1
- package/src/nodes/addTriggerNode.ts +1 -1
- package/src/platform/mindedConnection.ts +25 -15
- package/src/platform/mindedConnectionTypes.ts +1 -188
- package/src/playbooks/playbooks.ts +4 -4
- package/src/types/Agent.types.ts +0 -2
- package/src/types/Flows.types.ts +1 -0
- package/src/types/LangGraph.types.ts +5 -3
- package/src/utils/logger.ts +0 -1
- package/src/voice/voiceSession.ts +4 -7
- package/src/interrupts/BaseInterruptSessionManager.ts +0 -94
- package/src/interrupts/MemoryInterruptSessionManager.ts +0 -57
- package/src/interrupts/MindedInterruptSessionManager.ts +0 -155
- package/src/interrupts/interruptSessionManagerFactory.ts +0 -20
|
@@ -33,15 +33,6 @@ export enum mindedConnectionSocketMessageType {
|
|
|
33
33
|
TIMER_RESET = 'timer-reset',
|
|
34
34
|
TIMER_CANCEL = 'timer-cancel',
|
|
35
35
|
TIMER_TRIGGER = 'timer-trigger',
|
|
36
|
-
// Interrupt Session Management
|
|
37
|
-
INTERRUPT_SESSION_IS_PROCESSED = 'interrupt-session-is-processed',
|
|
38
|
-
INTERRUPT_SESSION_LOCK = 'interrupt-session-lock',
|
|
39
|
-
INTERRUPT_SESSION_RELEASE = 'interrupt-session-release',
|
|
40
|
-
INTERRUPT_SESSION_ENQUEUE = 'interrupt-session-enqueue',
|
|
41
|
-
INTERRUPT_SESSION_DEQUEUE_ALL = 'interrupt-session-dequeue-all',
|
|
42
|
-
INTERRUPT_SESSION_DEQUEUE = 'interrupt-session-dequeue',
|
|
43
|
-
INTERRUPT_SESSION_HAS_MESSAGES = 'interrupt-session-has-messages',
|
|
44
|
-
INTERRUPT_SESSION_GET_MESSAGES = 'interrupt-session-get-messages',
|
|
45
36
|
}
|
|
46
37
|
|
|
47
38
|
export type mindedConnectionSocketMessageTypeMap = {
|
|
@@ -66,15 +57,6 @@ export type mindedConnectionSocketMessageTypeMap = {
|
|
|
66
57
|
[mindedConnectionSocketMessageType.TIMER_CANCEL]: TimerCancelRequest;
|
|
67
58
|
[mindedConnectionSocketMessageType.TIMER_TRIGGER]: TimerTriggerRequest;
|
|
68
59
|
[mindedConnectionSocketMessageType.RESTORE_CHECKPOINT]: RestoreCheckpointRequest;
|
|
69
|
-
// Interrupt Session Management
|
|
70
|
-
[mindedConnectionSocketMessageType.INTERRUPT_SESSION_IS_PROCESSED]: InterruptSessionIsProcessedRequest;
|
|
71
|
-
[mindedConnectionSocketMessageType.INTERRUPT_SESSION_LOCK]: InterruptSessionLockRequest;
|
|
72
|
-
[mindedConnectionSocketMessageType.INTERRUPT_SESSION_RELEASE]: InterruptSessionReleaseRequest;
|
|
73
|
-
[mindedConnectionSocketMessageType.INTERRUPT_SESSION_ENQUEUE]: InterruptSessionEnqueueRequest;
|
|
74
|
-
[mindedConnectionSocketMessageType.INTERRUPT_SESSION_DEQUEUE_ALL]: InterruptSessionDequeueAllRequest;
|
|
75
|
-
[mindedConnectionSocketMessageType.INTERRUPT_SESSION_DEQUEUE]: InterruptSessionDequeueRequest;
|
|
76
|
-
[mindedConnectionSocketMessageType.INTERRUPT_SESSION_HAS_MESSAGES]: InterruptSessionHasMessagesRequest;
|
|
77
|
-
[mindedConnectionSocketMessageType.INTERRUPT_SESSION_GET_MESSAGES]: InterruptSessionGetMessagesRequest;
|
|
78
60
|
};
|
|
79
61
|
|
|
80
62
|
export interface BasemindedConnectionSocketMessage {
|
|
@@ -199,166 +181,6 @@ export interface TimerTriggerRequest extends BasemindedConnectionSocketMessage {
|
|
|
199
181
|
eventArgs: Record<string, any>;
|
|
200
182
|
}
|
|
201
183
|
|
|
202
|
-
// Interrupt Session Management Interfaces
|
|
203
|
-
export interface InterruptSessionIsProcessedRequest extends BasemindedConnectionSocketMessage {
|
|
204
|
-
sessionId: string;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
export interface InterruptSessionIsProcessedResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
208
|
-
isProcessed?: boolean;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
export interface InterruptSessionLockRequest extends BasemindedConnectionSocketMessage {
|
|
212
|
-
sessionId: string;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
export interface InterruptSessionLockResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
216
|
-
lockAcquired?: boolean;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
export interface InterruptSessionReleaseRequest extends BasemindedConnectionSocketMessage {
|
|
220
|
-
sessionId: string;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
export interface InterruptSessionReleaseResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
224
|
-
success?: boolean;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
export interface InterruptSessionEnqueueRequest extends BasemindedConnectionSocketMessage {
|
|
228
|
-
sessionId: string;
|
|
229
|
-
message: {
|
|
230
|
-
triggerBody: any;
|
|
231
|
-
triggerName: string;
|
|
232
|
-
appName?: string;
|
|
233
|
-
};
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
export interface InterruptSessionEnqueueResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
237
|
-
success?: boolean;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
export interface InterruptSessionDequeueAllRequest extends BasemindedConnectionSocketMessage {
|
|
241
|
-
sessionId: string;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
export interface InterruptSessionDequeueAllResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
245
|
-
messages?: Array<{
|
|
246
|
-
triggerBody: any;
|
|
247
|
-
triggerName: string;
|
|
248
|
-
appName?: string;
|
|
249
|
-
}>;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
export interface InterruptSessionDequeueRequest extends BasemindedConnectionSocketMessage {
|
|
253
|
-
sessionId: string;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
export interface InterruptSessionDequeueResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
257
|
-
message?: {
|
|
258
|
-
triggerBody: any;
|
|
259
|
-
triggerName: string;
|
|
260
|
-
appName?: string;
|
|
261
|
-
} | null;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
export interface InterruptSessionHasMessagesRequest extends BasemindedConnectionSocketMessage {
|
|
265
|
-
sessionId: string;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
export interface InterruptSessionHasMessagesResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
269
|
-
hasMessages?: boolean;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
export interface InterruptSessionGetMessagesRequest extends BasemindedConnectionSocketMessage {
|
|
273
|
-
sessionId: string;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
export interface InterruptSessionGetMessagesResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
277
|
-
messages?: Array<{
|
|
278
|
-
triggerBody: any;
|
|
279
|
-
triggerName: string;
|
|
280
|
-
appName?: string;
|
|
281
|
-
}>;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// Interrupt Session Management Interfaces
|
|
285
|
-
export interface InterruptSessionIsProcessedRequest extends BasemindedConnectionSocketMessage {
|
|
286
|
-
sessionId: string;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
export interface InterruptSessionIsProcessedResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
290
|
-
isProcessed?: boolean;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
export interface InterruptSessionLockRequest extends BasemindedConnectionSocketMessage {
|
|
294
|
-
sessionId: string;
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
export interface InterruptSessionReleaseRequest extends BasemindedConnectionSocketMessage {
|
|
298
|
-
sessionId: string;
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
export interface InterruptSessionReleaseResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
302
|
-
success?: boolean;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
export interface InterruptSessionEnqueueRequest extends BasemindedConnectionSocketMessage {
|
|
306
|
-
sessionId: string;
|
|
307
|
-
message: {
|
|
308
|
-
triggerBody: any;
|
|
309
|
-
triggerName: string;
|
|
310
|
-
appName?: string;
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
export interface InterruptSessionEnqueueResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
315
|
-
success?: boolean;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
export interface InterruptSessionDequeueAllRequest extends BasemindedConnectionSocketMessage {
|
|
319
|
-
sessionId: string;
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
export interface InterruptSessionDequeueAllResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
323
|
-
messages?: Array<{
|
|
324
|
-
triggerBody: any;
|
|
325
|
-
triggerName: string;
|
|
326
|
-
appName?: string;
|
|
327
|
-
}>;
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
export interface InterruptSessionDequeueRequest extends BasemindedConnectionSocketMessage {
|
|
331
|
-
sessionId: string;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
export interface InterruptSessionDequeueResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
335
|
-
message?: {
|
|
336
|
-
triggerBody: any;
|
|
337
|
-
triggerName: string;
|
|
338
|
-
appName?: string;
|
|
339
|
-
} | null;
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
export interface InterruptSessionHasMessagesRequest extends BasemindedConnectionSocketMessage {
|
|
343
|
-
sessionId: string;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
export interface InterruptSessionHasMessagesResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
347
|
-
hasMessages?: boolean;
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
export interface InterruptSessionGetMessagesRequest extends BasemindedConnectionSocketMessage {
|
|
351
|
-
sessionId: string;
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
export interface InterruptSessionGetMessagesResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
355
|
-
messages?: Array<{
|
|
356
|
-
triggerBody: any;
|
|
357
|
-
triggerName: string;
|
|
358
|
-
appName?: string;
|
|
359
|
-
}>;
|
|
360
|
-
}
|
|
361
|
-
|
|
362
184
|
export interface RestoreCheckpointRequest extends BasemindedConnectionSocketMessage {
|
|
363
185
|
sessionId: string;
|
|
364
186
|
checkpointId: string;
|
|
@@ -366,13 +188,4 @@ export interface RestoreCheckpointRequest extends BasemindedConnectionSocketMess
|
|
|
366
188
|
|
|
367
189
|
export interface RestoreCheckpointResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
368
190
|
success?: boolean;
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
export interface RestoreCheckpointRequest extends BasemindedConnectionSocketMessage {
|
|
372
|
-
sessionId: string;
|
|
373
|
-
checkpointId: string;
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
export interface RestoreCheckpointResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
377
|
-
success?: boolean;
|
|
378
|
-
}
|
|
191
|
+
}
|
|
@@ -113,7 +113,7 @@ function loadPlaybooksFromDirectories(directories: string[]): Playbook[] {
|
|
|
113
113
|
|
|
114
114
|
for (const directory of directories) {
|
|
115
115
|
if (!fs.existsSync(directory)) {
|
|
116
|
-
logger.info(
|
|
116
|
+
logger.info(`Playbooks directory does not exist: ${directory}`);
|
|
117
117
|
continue;
|
|
118
118
|
}
|
|
119
119
|
|
|
@@ -126,12 +126,12 @@ function loadPlaybooksFromDirectories(directories: string[]): Playbook[] {
|
|
|
126
126
|
|
|
127
127
|
if (playbook && playbook.name && playbook.blocks) {
|
|
128
128
|
playbooks.push(playbook);
|
|
129
|
-
logger.info(
|
|
129
|
+
logger.info(`Loaded playbook: ${playbook.name} from ${file}`);
|
|
130
130
|
} else {
|
|
131
|
-
logger.warn(
|
|
131
|
+
logger.warn(`Invalid playbook structure in ${file}`);
|
|
132
132
|
}
|
|
133
133
|
} catch (error) {
|
|
134
|
-
logger.error(
|
|
134
|
+
logger.error(`Failed to load playbook file ${file}: ${error}`);
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
137
|
}
|
package/src/types/Agent.types.ts
CHANGED
|
@@ -29,8 +29,6 @@ export interface AgentInvokeParams {
|
|
|
29
29
|
sessionId?: string;
|
|
30
30
|
/** Optional name of the application triggering the agent in case of an app trigger */
|
|
31
31
|
appName?: string;
|
|
32
|
-
/** Internal flag to bypass session processing check for recursive calls */
|
|
33
|
-
bypassSessionCheck?: boolean;
|
|
34
32
|
}
|
|
35
33
|
export interface HistoryStep {
|
|
36
34
|
type: NodeType;
|
package/src/types/Flows.types.ts
CHANGED
|
@@ -29,13 +29,15 @@ export const createStateAnnotation = <Memory = any>() =>
|
|
|
29
29
|
default: () => [],
|
|
30
30
|
reducer: (a, b) => a.concat(b),
|
|
31
31
|
}),
|
|
32
|
-
sessionId: Annotation<string>(
|
|
33
|
-
reducer: (a, b) => b || a,
|
|
34
|
-
}),
|
|
32
|
+
sessionId: Annotation<string>(),
|
|
35
33
|
sessionType: Annotation<SessionType>({
|
|
36
34
|
default: () => SessionType.TEXT,
|
|
37
35
|
reducer: (a, b) => b || a,
|
|
38
36
|
}),
|
|
37
|
+
overrideStartFromNodeId: Annotation<string | null>({
|
|
38
|
+
default: () => null,
|
|
39
|
+
reducer: (a, b) => b,
|
|
40
|
+
}),
|
|
39
41
|
});
|
|
40
42
|
|
|
41
43
|
// Default state annotation with any memory type
|
package/src/utils/logger.ts
CHANGED
|
@@ -235,13 +235,10 @@ export class VoiceSession {
|
|
|
235
235
|
agentMessage.additional_kwargs = agentMessage.additional_kwargs || {};
|
|
236
236
|
agentMessage.additional_kwargs.update = true;
|
|
237
237
|
const currentNodeId = graphState.tasks[graphState.tasks.length - 1].name;
|
|
238
|
-
await this.agent.compiledGraph.updateState(
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
},
|
|
243
|
-
currentNodeId,
|
|
244
|
-
);
|
|
238
|
+
await this.agent.compiledGraph.updateState(graphState.config, {
|
|
239
|
+
messages: [agentMessage],
|
|
240
|
+
overrideStartFromNodeId: currentNodeId,
|
|
241
|
+
});
|
|
245
242
|
} else {
|
|
246
243
|
logger.warn({ message: 'Agent message not found for correction', sessionId: this.sessionId, originalAgentResponse });
|
|
247
244
|
}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { State } from '../types/LangGraph.types';
|
|
2
|
-
import { GraphInterrupt } from '@langchain/langgraph';
|
|
3
|
-
import { logger } from '../utils/logger';
|
|
4
|
-
|
|
5
|
-
export enum InterruptType {
|
|
6
|
-
NEW_TRIGGERS = 'NEW_TRIGGERS',
|
|
7
|
-
HUMAN_IN_THE_LOOP = 'HUMAN_IN_THE_LOOP',
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export interface QueuedMessage {
|
|
11
|
-
triggerBody: any;
|
|
12
|
-
triggerName: string;
|
|
13
|
-
appName?: string;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// export interface UpdateStateObject {
|
|
17
|
-
// memory: any;
|
|
18
|
-
// messages: any[];
|
|
19
|
-
// history: any[];
|
|
20
|
-
// sessionId: string;
|
|
21
|
-
// sessionType: SessionType;
|
|
22
|
-
// }
|
|
23
|
-
export interface InterruptPayload {
|
|
24
|
-
type: InterruptType.NEW_TRIGGERS;
|
|
25
|
-
updateStateObject?: Partial<State>;
|
|
26
|
-
id?: string;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export interface InterruptSessionManager {
|
|
30
|
-
isProcessed(sessionId: string): boolean | Promise<boolean>;
|
|
31
|
-
/**
|
|
32
|
-
* Atomically attempts to acquire a lock for the given session.
|
|
33
|
-
* This method should only succeed if the session is not already being processed.
|
|
34
|
-
*
|
|
35
|
-
* @param sessionId - The session ID to lock
|
|
36
|
-
* @returns true if the lock was successfully acquired, false if the session is already locked
|
|
37
|
-
*/
|
|
38
|
-
lock(sessionId: string): boolean | Promise<boolean>;
|
|
39
|
-
release(sessionId: string): void | Promise<void>;
|
|
40
|
-
enqueueMessage(sessionId: string, message: QueuedMessage): void | Promise<void>;
|
|
41
|
-
dequeueAll(sessionId: string): QueuedMessage[] | Promise<QueuedMessage[]>;
|
|
42
|
-
dequeue(sessionId: string): QueuedMessage | null | Promise<QueuedMessage | null>;
|
|
43
|
-
checkQueueAndInterrupt(sessionId: string, updateStateObject?: Partial<State>): Promise<boolean>;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export abstract class BaseInterruptSessionManager implements InterruptSessionManager {
|
|
47
|
-
// Abstract methods that subclasses must implement for queue management
|
|
48
|
-
abstract isProcessed(sessionId: string): boolean | Promise<boolean>;
|
|
49
|
-
/**
|
|
50
|
-
* Atomically attempts to acquire a lock for the given session.
|
|
51
|
-
* This method should only succeed if the session is not already being processed.
|
|
52
|
-
* Implementations must ensure this operation is atomic to prevent race conditions.
|
|
53
|
-
*
|
|
54
|
-
* @param sessionId - The session ID to lock
|
|
55
|
-
* @returns true if the lock was successfully acquired, false if the session is already locked
|
|
56
|
-
*/
|
|
57
|
-
abstract lock(sessionId: string): boolean | Promise<boolean>;
|
|
58
|
-
abstract release(sessionId: string): void | Promise<void>;
|
|
59
|
-
abstract enqueueMessage(sessionId: string, message: QueuedMessage): void | Promise<void>;
|
|
60
|
-
abstract dequeueAll(sessionId: string): QueuedMessage[] | Promise<QueuedMessage[]>;
|
|
61
|
-
abstract dequeue(sessionId: string): QueuedMessage | null | Promise<QueuedMessage | null>;
|
|
62
|
-
|
|
63
|
-
// Abstract method to check if queue has messages - this is the only queue-specific part
|
|
64
|
-
protected abstract hasQueuedMessages(sessionId: string): boolean | Promise<boolean>;
|
|
65
|
-
protected abstract getQueuedMessages(sessionId: string): QueuedMessage[] | Promise<QueuedMessage[]>;
|
|
66
|
-
|
|
67
|
-
// Common implementation of checkQueueAndInterrupt
|
|
68
|
-
async checkQueueAndInterrupt(sessionId: string, updateStateObject?: Partial<State>): Promise<boolean> {
|
|
69
|
-
if (await this.hasQueuedMessages(sessionId)) {
|
|
70
|
-
logger.trace({ message: 'graph has queued messagess, interrupting graph', sessionId });
|
|
71
|
-
|
|
72
|
-
// Interrupt the graph with NEW_TRIGGERS flag and optional updateStateObject
|
|
73
|
-
const interruptPayload: InterruptPayload = { type: InterruptType.NEW_TRIGGERS };
|
|
74
|
-
if (updateStateObject) {
|
|
75
|
-
interruptPayload.updateStateObject = {
|
|
76
|
-
messages: updateStateObject.messages,
|
|
77
|
-
memory: updateStateObject.memory,
|
|
78
|
-
history: updateStateObject.history,
|
|
79
|
-
sessionId: updateStateObject.sessionId,
|
|
80
|
-
sessionType: updateStateObject.sessionType,
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
throw new GraphInterrupt([
|
|
85
|
-
{
|
|
86
|
-
value: interruptPayload,
|
|
87
|
-
when: 'during',
|
|
88
|
-
resumable: true,
|
|
89
|
-
},
|
|
90
|
-
]);
|
|
91
|
-
}
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { BaseInterruptSessionManager, QueuedMessage } from './BaseInterruptSessionManager';
|
|
2
|
-
|
|
3
|
-
export class MemoryInterruptSessionManager extends BaseInterruptSessionManager {
|
|
4
|
-
private sessionProcessing: Map<string, boolean> = new Map();
|
|
5
|
-
private sessionMessageQueues: Map<string, QueuedMessage[]> = new Map();
|
|
6
|
-
|
|
7
|
-
isProcessed(sessionId: string): boolean {
|
|
8
|
-
return this.sessionProcessing.get(sessionId) || false;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
lock(sessionId: string): boolean {
|
|
12
|
-
const isCurrentlyProcessed = this.sessionProcessing.get(sessionId) || false;
|
|
13
|
-
if (isCurrentlyProcessed) {
|
|
14
|
-
return false; // Could not acquire lock
|
|
15
|
-
}
|
|
16
|
-
this.sessionProcessing.set(sessionId, true);
|
|
17
|
-
return true; // Successfully acquired lock
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
release(sessionId: string): void {
|
|
21
|
-
this.sessionProcessing.set(sessionId, false);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
enqueueMessage(sessionId: string, message: QueuedMessage): void {
|
|
25
|
-
if (!this.sessionMessageQueues.has(sessionId)) {
|
|
26
|
-
this.sessionMessageQueues.set(sessionId, []);
|
|
27
|
-
}
|
|
28
|
-
this.sessionMessageQueues.get(sessionId)!.push(message);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
dequeueAll(sessionId: string): QueuedMessage[] {
|
|
32
|
-
const messages = this.sessionMessageQueues.get(sessionId) || [];
|
|
33
|
-
const result = [...messages];
|
|
34
|
-
this.sessionMessageQueues.set(sessionId, []);
|
|
35
|
-
return result;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
dequeue(sessionId: string): QueuedMessage | null {
|
|
39
|
-
const messages = this.sessionMessageQueues.get(sessionId) || [];
|
|
40
|
-
if (messages.length === 0) {
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
const firstMessage = messages.shift()!;
|
|
44
|
-
this.sessionMessageQueues.set(sessionId, messages);
|
|
45
|
-
return firstMessage;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Implementation of abstract methods from BaseInterruptSessionManager
|
|
49
|
-
protected hasQueuedMessages(sessionId: string): boolean {
|
|
50
|
-
const queue = this.sessionMessageQueues.get(sessionId) || [];
|
|
51
|
-
return queue.length > 0;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
protected getQueuedMessages(sessionId: string): QueuedMessage[] {
|
|
55
|
-
return this.sessionMessageQueues.get(sessionId) || [];
|
|
56
|
-
}
|
|
57
|
-
}
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import { BaseInterruptSessionManager, QueuedMessage } from './BaseInterruptSessionManager';
|
|
2
|
-
import * as mindedConnection from '../platform/mindedConnection';
|
|
3
|
-
import {
|
|
4
|
-
mindedConnectionSocketMessageType,
|
|
5
|
-
InterruptSessionIsProcessedRequest,
|
|
6
|
-
InterruptSessionIsProcessedResponse,
|
|
7
|
-
InterruptSessionLockRequest,
|
|
8
|
-
InterruptSessionLockResponse,
|
|
9
|
-
InterruptSessionReleaseRequest,
|
|
10
|
-
InterruptSessionReleaseResponse,
|
|
11
|
-
InterruptSessionEnqueueRequest,
|
|
12
|
-
InterruptSessionEnqueueResponse,
|
|
13
|
-
InterruptSessionDequeueAllRequest,
|
|
14
|
-
InterruptSessionDequeueAllResponse,
|
|
15
|
-
InterruptSessionDequeueRequest,
|
|
16
|
-
InterruptSessionDequeueResponse,
|
|
17
|
-
InterruptSessionHasMessagesRequest,
|
|
18
|
-
InterruptSessionHasMessagesResponse,
|
|
19
|
-
InterruptSessionGetMessagesRequest,
|
|
20
|
-
InterruptSessionGetMessagesResponse,
|
|
21
|
-
} from '../platform/mindedConnectionTypes';
|
|
22
|
-
|
|
23
|
-
export class MindedInterruptSessionManager extends BaseInterruptSessionManager {
|
|
24
|
-
constructor() {
|
|
25
|
-
super();
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
async isProcessed(sessionId: string): Promise<boolean> {
|
|
29
|
-
try {
|
|
30
|
-
const response = await mindedConnection.awaitEmit<InterruptSessionIsProcessedRequest, InterruptSessionIsProcessedResponse>(
|
|
31
|
-
mindedConnectionSocketMessageType.INTERRUPT_SESSION_IS_PROCESSED,
|
|
32
|
-
{
|
|
33
|
-
type: mindedConnectionSocketMessageType.INTERRUPT_SESSION_IS_PROCESSED,
|
|
34
|
-
sessionId,
|
|
35
|
-
},
|
|
36
|
-
);
|
|
37
|
-
return response.isProcessed ?? false;
|
|
38
|
-
} catch (error) {
|
|
39
|
-
console.error('Error checking if session is processed:', error);
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
async lock(sessionId: string): Promise<boolean> {
|
|
45
|
-
try {
|
|
46
|
-
const response = await mindedConnection.awaitEmit<InterruptSessionLockRequest, InterruptSessionLockResponse>(
|
|
47
|
-
mindedConnectionSocketMessageType.INTERRUPT_SESSION_LOCK,
|
|
48
|
-
{
|
|
49
|
-
type: mindedConnectionSocketMessageType.INTERRUPT_SESSION_LOCK,
|
|
50
|
-
sessionId,
|
|
51
|
-
},
|
|
52
|
-
);
|
|
53
|
-
return response.lockAcquired ?? false;
|
|
54
|
-
} catch (error) {
|
|
55
|
-
console.error('Error locking session:', error);
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
async release(sessionId: string): Promise<void> {
|
|
61
|
-
try {
|
|
62
|
-
await mindedConnection.awaitEmit<InterruptSessionReleaseRequest, InterruptSessionReleaseResponse>(
|
|
63
|
-
mindedConnectionSocketMessageType.INTERRUPT_SESSION_RELEASE,
|
|
64
|
-
{
|
|
65
|
-
type: mindedConnectionSocketMessageType.INTERRUPT_SESSION_RELEASE,
|
|
66
|
-
sessionId,
|
|
67
|
-
},
|
|
68
|
-
);
|
|
69
|
-
} catch (error) {
|
|
70
|
-
console.error('Error releasing session:', error);
|
|
71
|
-
throw error;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
async enqueueMessage(sessionId: string, message: QueuedMessage): Promise<void> {
|
|
76
|
-
try {
|
|
77
|
-
await mindedConnection.awaitEmit<InterruptSessionEnqueueRequest, InterruptSessionEnqueueResponse>(
|
|
78
|
-
mindedConnectionSocketMessageType.INTERRUPT_SESSION_ENQUEUE,
|
|
79
|
-
{
|
|
80
|
-
type: mindedConnectionSocketMessageType.INTERRUPT_SESSION_ENQUEUE,
|
|
81
|
-
sessionId,
|
|
82
|
-
message,
|
|
83
|
-
},
|
|
84
|
-
);
|
|
85
|
-
} catch (error) {
|
|
86
|
-
console.error('Error enqueuing message:', error);
|
|
87
|
-
throw error;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
async dequeueAll(sessionId: string): Promise<QueuedMessage[]> {
|
|
92
|
-
try {
|
|
93
|
-
const response = await mindedConnection.awaitEmit<InterruptSessionDequeueAllRequest, InterruptSessionDequeueAllResponse>(
|
|
94
|
-
mindedConnectionSocketMessageType.INTERRUPT_SESSION_DEQUEUE_ALL,
|
|
95
|
-
{
|
|
96
|
-
type: mindedConnectionSocketMessageType.INTERRUPT_SESSION_DEQUEUE_ALL,
|
|
97
|
-
sessionId,
|
|
98
|
-
},
|
|
99
|
-
);
|
|
100
|
-
return response.messages ?? [];
|
|
101
|
-
} catch (error) {
|
|
102
|
-
console.error('Error dequeuing all messages:', error);
|
|
103
|
-
return [];
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
async dequeue(sessionId: string): Promise<QueuedMessage | null> {
|
|
108
|
-
try {
|
|
109
|
-
const response = await mindedConnection.awaitEmit<InterruptSessionDequeueRequest, InterruptSessionDequeueResponse>(
|
|
110
|
-
mindedConnectionSocketMessageType.INTERRUPT_SESSION_DEQUEUE,
|
|
111
|
-
{
|
|
112
|
-
type: mindedConnectionSocketMessageType.INTERRUPT_SESSION_DEQUEUE,
|
|
113
|
-
sessionId,
|
|
114
|
-
},
|
|
115
|
-
);
|
|
116
|
-
return response.message ?? null;
|
|
117
|
-
} catch (error) {
|
|
118
|
-
console.error('Error dequeuing message:', error);
|
|
119
|
-
return null;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// Implementation of abstract methods from BaseInterruptSessionManager
|
|
124
|
-
protected async hasQueuedMessages(sessionId: string): Promise<boolean> {
|
|
125
|
-
try {
|
|
126
|
-
const response = await mindedConnection.awaitEmit<InterruptSessionHasMessagesRequest, InterruptSessionHasMessagesResponse>(
|
|
127
|
-
mindedConnectionSocketMessageType.INTERRUPT_SESSION_HAS_MESSAGES,
|
|
128
|
-
{
|
|
129
|
-
type: mindedConnectionSocketMessageType.INTERRUPT_SESSION_HAS_MESSAGES,
|
|
130
|
-
sessionId,
|
|
131
|
-
},
|
|
132
|
-
);
|
|
133
|
-
return response.hasMessages ?? false;
|
|
134
|
-
} catch (error) {
|
|
135
|
-
console.error('Error checking if session has messages:', error);
|
|
136
|
-
return false;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
protected async getQueuedMessages(sessionId: string): Promise<QueuedMessage[]> {
|
|
141
|
-
try {
|
|
142
|
-
const response = await mindedConnection.awaitEmit<InterruptSessionGetMessagesRequest, InterruptSessionGetMessagesResponse>(
|
|
143
|
-
mindedConnectionSocketMessageType.INTERRUPT_SESSION_GET_MESSAGES,
|
|
144
|
-
{
|
|
145
|
-
type: mindedConnectionSocketMessageType.INTERRUPT_SESSION_GET_MESSAGES,
|
|
146
|
-
sessionId,
|
|
147
|
-
},
|
|
148
|
-
);
|
|
149
|
-
return response.messages ?? [];
|
|
150
|
-
} catch (error) {
|
|
151
|
-
console.error('Error getting queued messages:', error);
|
|
152
|
-
return [];
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { InterruptSessionManager } from './BaseInterruptSessionManager';
|
|
2
|
-
import { MemoryInterruptSessionManager } from './MemoryInterruptSessionManager';
|
|
3
|
-
import { MindedInterruptSessionManager } from './MindedInterruptSessionManager';
|
|
4
|
-
import * as mindedConnection from '../platform/mindedConnection';
|
|
5
|
-
import { getConfig } from '../platform/config';
|
|
6
|
-
import { logger } from '../utils/logger';
|
|
7
|
-
|
|
8
|
-
export function createInterruptSessionManager(): InterruptSessionManager {
|
|
9
|
-
const { runLocally } = getConfig();
|
|
10
|
-
if (runLocally) {
|
|
11
|
-
logger.info({ message: 'Using memory interrupt session manager' });
|
|
12
|
-
return new MemoryInterruptSessionManager();
|
|
13
|
-
} else {
|
|
14
|
-
if (!mindedConnection.isConnected()) {
|
|
15
|
-
throw new Error('MindedConnection is required for platform interrupt session manager');
|
|
16
|
-
}
|
|
17
|
-
logger.info({ message: 'Using Minded interrupt session manager' });
|
|
18
|
-
return new MindedInterruptSessionManager();
|
|
19
|
-
}
|
|
20
|
-
}
|