@minded-ai/mindedjs 1.0.22 → 1.0.24
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.js +14 -7
- package/dist/agent.js.map +1 -1
- package/dist/checkpointer/checkpointSaverFactory.d.ts +3 -2
- package/dist/checkpointer/checkpointSaverFactory.js +6 -17
- package/dist/checkpointer/checkpointSaverFactory.js.map +1 -1
- package/dist/cli/index.js +0 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/platform/mindedCheckpointSaver.d.ts +3 -2
- package/dist/platform/mindedCheckpointSaver.js +36 -27
- package/dist/platform/mindedCheckpointSaver.js.map +1 -1
- package/dist/platform/mindedConnection.d.ts +1 -0
- package/dist/platform/mindedConnection.js +26 -1
- package/dist/platform/mindedConnection.js.map +1 -1
- package/dist/platform/mindedConnectionTypes.d.ts +37 -1
- package/dist/platform/mindedConnectionTypes.js +4 -0
- package/dist/platform/mindedConnectionTypes.js.map +1 -1
- package/docs/core-concepts/nodes.md +18 -0
- package/docs/core-concepts/tools.md +21 -1
- package/examples/orderRefundAgent/flows/orderRefundFlow.yaml +1 -1
- package/examples/orderRefundAgent/minded.json +4 -8
- package/examples/orderRefundAgent/orderRefundAgent.ts +4 -4
- package/package.json +2 -1
- package/src/agent.ts +14 -7
- package/src/checkpointer/checkpointSaverFactory.ts +7 -20
- package/src/cli/index.ts +0 -1
- package/src/platform/mindedCheckpointSaver.ts +54 -40
- package/src/platform/mindedConnection.ts +30 -1
- package/src/platform/mindedConnectionTypes.ts +50 -0
- package/test/checkpoint-saver/minded-checkpoint-saver-list.test.ts +17 -15
- package/test/checkpoint-saver/minded-checkpoint-saver.test.ts +16 -15
package/dist/agent.js
CHANGED
|
@@ -62,9 +62,7 @@ class Agent {
|
|
|
62
62
|
this.tools = tools;
|
|
63
63
|
this.platformToken = platformToken;
|
|
64
64
|
this.llm = (0, createLlmInstance_1.createLlmInstance)(config.llm);
|
|
65
|
-
this.checkpointer = memorySaver || (0, checkpointSaverFactory_1.createCheckpointSaver)('');
|
|
66
65
|
this.validate();
|
|
67
|
-
this.compiledGraph = this.initializeGraph();
|
|
68
66
|
if (process.env.NODE_ENV !== 'test' && process.env.NO_PLATFORM_CONNECT !== 'true') {
|
|
69
67
|
this.mindedConnection = new mindedConnection_1.MindedConnection();
|
|
70
68
|
this.mindedConnection.start();
|
|
@@ -77,6 +75,8 @@ class Agent {
|
|
|
77
75
|
});
|
|
78
76
|
});
|
|
79
77
|
}
|
|
78
|
+
this.checkpointer = memorySaver || (0, checkpointSaverFactory_1.createCheckpointSaver)(this.mindedConnection);
|
|
79
|
+
this.compiledGraph = this.initializeGraph();
|
|
80
80
|
}
|
|
81
81
|
loadFlowsFromDirectory(flowsDirectories) {
|
|
82
82
|
const flows = [];
|
|
@@ -134,11 +134,18 @@ class Agent {
|
|
|
134
134
|
});
|
|
135
135
|
// Add edges
|
|
136
136
|
(0, edgeFactory_1.edgeFactory)({ graph, edges, nodes: nodesObject, llm: this.llm });
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
}
|
|
137
|
+
// Add edge from start to first node if no triggers exist
|
|
138
|
+
const hasTrigger = nodes.some((node) => node.type === Flows_types_1.NodeType.TRIGGER);
|
|
139
|
+
if (!hasTrigger && nodes.length > 0) {
|
|
140
|
+
graph.addEdge('__start__', nodes[0].name);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
nodes.forEach((node) => {
|
|
144
|
+
if (node.type === Flows_types_1.NodeType.TRIGGER) {
|
|
145
|
+
graph.addEdge('__start__', node.name);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
}
|
|
142
149
|
// Compile the graph
|
|
143
150
|
return graph.compile({ checkpointer: this.checkpointer });
|
|
144
151
|
}
|
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAA2D;AAE3D,+BAAoC;AAEpC,oDAA2D;AAE3D,qDAAkD;AAClD,6DAA2F;AAC3F,qDAAkD;AAClD,sDAA0G;AAG1G,kEAA+D;AAC/D,4EAAsI;AACtI,uCAAyB;AACzB,2CAA6B;AAC7B,8CAAgC;AAEhC,+DAA4D;AAC5D,mCAAgC;AAChC,+BAA+B;AAC/B,kFAA8E;AAE9E,IAAA,eAAM,EAAC,EAAE,IAAI,EAAE,IAAA,cAAO,EAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;AAShD,MAAa,KAAK;IAmBhB,YAAY,MAA4D;QAbhE,qBAAgB,GAA4B,IAAI,CAAC;QAMzD,sFAAsF;QAC9E,kBAAa,GAIjB,EAAE,CAAC;QAGL,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;QAC3E,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,GAAG,GAAG,IAAA,qCAAiB,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { BaseCheckpointSaver } from '@langchain/langgraph';
|
|
2
|
+
import { MindedConnection } from '../platform/mindedConnection';
|
|
2
3
|
/**
|
|
3
|
-
* Factory function to create the appropriate checkpoint saver based on environment variables
|
|
4
|
+
* Factory function to create the appropriate checkpoint saver based on environment variables.
|
|
4
5
|
* @param platformToken - Optional platform token for remote checkpoint saving
|
|
5
6
|
* @returns BaseCheckpointSaver instance (either MemorySaver or MindedCheckpointSaver)
|
|
6
7
|
*/
|
|
7
|
-
export declare function createCheckpointSaver(
|
|
8
|
+
export declare function createCheckpointSaver(mindedConnection: MindedConnection | null): BaseCheckpointSaver;
|
|
@@ -4,27 +4,16 @@ exports.createCheckpointSaver = createCheckpointSaver;
|
|
|
4
4
|
const langgraph_1 = require("@langchain/langgraph");
|
|
5
5
|
const mindedCheckpointSaver_1 = require("../platform/mindedCheckpointSaver");
|
|
6
6
|
/**
|
|
7
|
-
* Factory function to create the appropriate checkpoint saver based on environment variables
|
|
7
|
+
* Factory function to create the appropriate checkpoint saver based on environment variables.
|
|
8
8
|
* @param platformToken - Optional platform token for remote checkpoint saving
|
|
9
9
|
* @returns BaseCheckpointSaver instance (either MemorySaver or MindedCheckpointSaver)
|
|
10
10
|
*/
|
|
11
|
-
function createCheckpointSaver(
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
console.log('Using in-memory checkpoint saver');
|
|
11
|
+
function createCheckpointSaver(mindedConnection) {
|
|
12
|
+
if (!mindedConnection) {
|
|
13
|
+
console.warn('mindedConnection not set, falling back to in-memory checkpoint saver');
|
|
15
14
|
return new langgraph_1.MemorySaver();
|
|
16
15
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
// console.warn('No platform token provided, falling back to in-memory checkpoint saver');
|
|
20
|
-
// return new MemorySaver();
|
|
21
|
-
// }
|
|
22
|
-
const mindedServer = process.env.MINDED_SERVER;
|
|
23
|
-
if (!mindedServer) {
|
|
24
|
-
console.warn('MINDED_SERVER environment variable not set, falling back to in-memory checkpoint saver');
|
|
25
|
-
return new langgraph_1.MemorySaver();
|
|
26
|
-
}
|
|
27
|
-
console.log(`Using remote checkpoint saver with server: ${mindedServer}`);
|
|
28
|
-
return new mindedCheckpointSaver_1.MindedCheckpointSaver(platformToken);
|
|
16
|
+
console.log(`Using remote checkpoint saver`);
|
|
17
|
+
return new mindedCheckpointSaver_1.MindedCheckpointSaver(mindedConnection);
|
|
29
18
|
}
|
|
30
19
|
//# sourceMappingURL=checkpointSaverFactory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpointSaverFactory.js","sourceRoot":"","sources":["../../src/checkpointer/checkpointSaverFactory.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"checkpointSaverFactory.js","sourceRoot":"","sources":["../../src/checkpointer/checkpointSaverFactory.ts"],"names":[],"mappings":";;AASA,sDAQC;AAjBD,oDAAwE;AACxE,6EAA0E;AAG1E;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,gBAAyC;IAC7E,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;QACrF,OAAO,IAAI,uBAAW,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,OAAO,IAAI,6CAAqB,CAAC,gBAAgB,CAAC,CAAC;AACrD,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
File without changes
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,uCAAyB;AACzB,2CAA6B;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,uCAAyB;AACzB,2CAA6B;AAE7B,MAAM,UAAU,GAAG,eAAe,CAAC;AAEnC,SAAS,gBAAgB;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC7B,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IACrC,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,IAAI;IACX,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { BaseCheckpointSaver, CheckpointTuple, Checkpoint, CheckpointMetadata, ChannelVersions, PendingWrite, CheckpointListOptions } from '@langchain/langgraph-checkpoint';
|
|
2
2
|
import type { RunnableConfig } from '@langchain/core/runnables';
|
|
3
|
+
import { MindedConnection } from './mindedConnection';
|
|
3
4
|
export declare class MindedCheckpointSaver extends BaseCheckpointSaver<number> {
|
|
4
|
-
private
|
|
5
|
-
constructor(
|
|
5
|
+
private mindedConnection;
|
|
6
|
+
constructor(mindedConnection: MindedConnection);
|
|
6
7
|
getTuple(config: RunnableConfig<Record<string, any>>): Promise<CheckpointTuple | undefined>;
|
|
7
8
|
list(config: RunnableConfig<Record<string, any>>, options?: CheckpointListOptions): AsyncGenerator<CheckpointTuple, any, any>;
|
|
8
9
|
put(config: RunnableConfig<Record<string, any>>, checkpoint: Checkpoint<string, string>, metadata: CheckpointMetadata, newVersions: ChannelVersions): Promise<RunnableConfig<Record<string, any>>>;
|
|
@@ -2,18 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MindedCheckpointSaver = void 0;
|
|
4
4
|
const langgraph_checkpoint_1 = require("@langchain/langgraph-checkpoint");
|
|
5
|
-
const
|
|
5
|
+
const mindedConnectionTypes_1 = require("./mindedConnectionTypes");
|
|
6
6
|
class MindedCheckpointSaver extends langgraph_checkpoint_1.BaseCheckpointSaver {
|
|
7
|
-
constructor(
|
|
7
|
+
constructor(mindedConnection) {
|
|
8
8
|
super();
|
|
9
|
-
this.
|
|
9
|
+
this.mindedConnection = mindedConnection;
|
|
10
10
|
}
|
|
11
11
|
async getTuple(config) {
|
|
12
|
-
const response = await (
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
body: { config },
|
|
16
|
-
token: this.token,
|
|
12
|
+
const response = await this.mindedConnection.awaitEmit(mindedConnectionTypes_1.MindedConnectionSocketMessageType.CHECKPOINT_GET_TUPLE, {
|
|
13
|
+
type: mindedConnectionTypes_1.MindedConnectionSocketMessageType.CHECKPOINT_GET_TUPLE,
|
|
14
|
+
config,
|
|
17
15
|
});
|
|
18
16
|
if (!response.tuple) {
|
|
19
17
|
return undefined;
|
|
@@ -47,13 +45,12 @@ class MindedCheckpointSaver extends langgraph_checkpoint_1.BaseCheckpointSaver {
|
|
|
47
45
|
};
|
|
48
46
|
}
|
|
49
47
|
async *list(config, options) {
|
|
50
|
-
const response = await (
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
token: this.token,
|
|
48
|
+
const response = await this.mindedConnection.awaitEmit(mindedConnectionTypes_1.MindedConnectionSocketMessageType.CHECKPOINT_LIST, {
|
|
49
|
+
type: mindedConnectionTypes_1.MindedConnectionSocketMessageType.CHECKPOINT_LIST,
|
|
50
|
+
config,
|
|
51
|
+
options,
|
|
55
52
|
});
|
|
56
|
-
for (const tuple of response.checkpoints) {
|
|
53
|
+
for (const tuple of response.checkpoints || []) {
|
|
57
54
|
// Re-serialize and deserialize checkpoint to restore class information
|
|
58
55
|
const [checkpointType, serializedCheckpoint] = this.serde.dumpsTyped(tuple.checkpoint);
|
|
59
56
|
const checkpoint = (await this.serde.loadsTyped(checkpointType, serializedCheckpoint));
|
|
@@ -73,21 +70,33 @@ class MindedCheckpointSaver extends langgraph_checkpoint_1.BaseCheckpointSaver {
|
|
|
73
70
|
}
|
|
74
71
|
}
|
|
75
72
|
async put(config, checkpoint, metadata, newVersions) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
73
|
+
try {
|
|
74
|
+
const response = await this.mindedConnection.awaitEmit(mindedConnectionTypes_1.MindedConnectionSocketMessageType.CHECKPOINT_PUT, {
|
|
75
|
+
type: mindedConnectionTypes_1.MindedConnectionSocketMessageType.CHECKPOINT_PUT,
|
|
76
|
+
config,
|
|
77
|
+
checkpoint,
|
|
78
|
+
metadata,
|
|
79
|
+
newVersions,
|
|
80
|
+
});
|
|
81
|
+
return response.config;
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.error('Error putting checkpoint:', error);
|
|
85
|
+
return config;
|
|
86
|
+
}
|
|
83
87
|
}
|
|
84
88
|
async putWrites(config, writes, taskId) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
try {
|
|
90
|
+
await this.mindedConnection.awaitEmit(mindedConnectionTypes_1.MindedConnectionSocketMessageType.CHECKPOINT_PUT_WRITES, {
|
|
91
|
+
type: mindedConnectionTypes_1.MindedConnectionSocketMessageType.CHECKPOINT_PUT_WRITES,
|
|
92
|
+
config,
|
|
93
|
+
writes,
|
|
94
|
+
taskId,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.error('Error putting writes:', error);
|
|
99
|
+
}
|
|
91
100
|
}
|
|
92
101
|
}
|
|
93
102
|
exports.MindedCheckpointSaver = MindedCheckpointSaver;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mindedCheckpointSaver.js","sourceRoot":"","sources":["../../src/platform/mindedCheckpointSaver.ts"],"names":[],"mappings":";;;AAAA,0EASyC;
|
|
1
|
+
{"version":3,"file":"mindedCheckpointSaver.js","sourceRoot":"","sources":["../../src/platform/mindedCheckpointSaver.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ export declare class MindedConnection {
|
|
|
13
13
|
private getMindedToken;
|
|
14
14
|
on: (event: MindedConnectionSocketMessageType, callback: (message: BaseMindedConnectionSocketMessage) => void) => void;
|
|
15
15
|
emit: (event: MindedConnectionSocketMessageType, message: BaseMindedConnectionSocketMessage) => void;
|
|
16
|
+
awaitEmit: <T, R>(event: MindedConnectionSocketMessageType, message: T, timeoutMs?: number) => Promise<R>;
|
|
16
17
|
private connect;
|
|
17
18
|
start(): Promise<void>;
|
|
18
19
|
}
|
|
@@ -38,6 +38,7 @@ const socket_io_client_1 = require("socket.io-client");
|
|
|
38
38
|
const readline = __importStar(require("readline"));
|
|
39
39
|
const fs = __importStar(require("fs"));
|
|
40
40
|
const path = __importStar(require("path"));
|
|
41
|
+
const flatted_1 = require("flatted");
|
|
41
42
|
class MindedConnection {
|
|
42
43
|
constructor() {
|
|
43
44
|
this.socket = null;
|
|
@@ -55,6 +56,29 @@ class MindedConnection {
|
|
|
55
56
|
this.socket.emit(event, message);
|
|
56
57
|
}
|
|
57
58
|
};
|
|
59
|
+
this.awaitEmit = (event, message, timeoutMs = 5000) => {
|
|
60
|
+
return new Promise((resolve, reject) => {
|
|
61
|
+
if (!this.socket) {
|
|
62
|
+
reject(new Error('Socket is not connected'));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// Set up timeout
|
|
66
|
+
const timeout = setTimeout(() => {
|
|
67
|
+
reject(new Error(`Acknowledgement timeout after ${timeoutMs}ms`));
|
|
68
|
+
}, timeoutMs);
|
|
69
|
+
// Emit with acknowledgement callback
|
|
70
|
+
this.socket.emit(event, (0, flatted_1.stringify)(message), (response) => {
|
|
71
|
+
clearTimeout(timeout);
|
|
72
|
+
// Check if the response indicates an error
|
|
73
|
+
if (response && response.error) {
|
|
74
|
+
reject(new Error(response.error));
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
resolve(response);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
};
|
|
58
82
|
if (!process.env.MINDED_CONNECTION_TOKEN && !this.getSavedToken()) {
|
|
59
83
|
this.initializeReadline();
|
|
60
84
|
}
|
|
@@ -105,7 +129,7 @@ class MindedConnection {
|
|
|
105
129
|
});
|
|
106
130
|
}
|
|
107
131
|
async connect(token) {
|
|
108
|
-
this.socket = (0, socket_io_client_1.io)(
|
|
132
|
+
this.socket = (0, socket_io_client_1.io)(process.env.MINDED_SERVER, {
|
|
109
133
|
path: '/minded-connect',
|
|
110
134
|
query: {
|
|
111
135
|
token,
|
|
@@ -127,6 +151,7 @@ class MindedConnection {
|
|
|
127
151
|
var _a;
|
|
128
152
|
console.error('Server error:', error.message);
|
|
129
153
|
if (error.message.includes('Invalid token')) {
|
|
154
|
+
console.log('Invalid token');
|
|
130
155
|
// Delete saved token on connection error
|
|
131
156
|
if (fs.existsSync(this.tokenPath)) {
|
|
132
157
|
fs.unlinkSync(this.tokenPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mindedConnection.js","sourceRoot":"","sources":["../../src/platform/mindedConnection.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uDAA8C;AAC9C,mDAAqC;AAErC,uCAAyB;AACzB,2CAA6B;
|
|
1
|
+
{"version":3,"file":"mindedConnection.js","sourceRoot":"","sources":["../../src/platform/mindedConnection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,48 @@
|
|
|
1
|
+
import type { CheckpointListOptions, CheckpointMetadata, PendingWrite, Checkpoint, ChannelVersions, CheckpointTuple } from '@langchain/langgraph-checkpoint';
|
|
2
|
+
import type { RunnableConfig } from '@langchain/core/runnables';
|
|
1
3
|
export declare enum MindedConnectionSocketMessageType {
|
|
2
|
-
OnAppTrigger = "on-app-trigger"
|
|
4
|
+
OnAppTrigger = "on-app-trigger",
|
|
5
|
+
CHECKPOINT_GET_TUPLE = "checkpoint-get-tuple",
|
|
6
|
+
CHECKPOINT_PUT = "checkpoint-put",
|
|
7
|
+
CHECKPOINT_LIST = "checkpoint-list",
|
|
8
|
+
CHECKPOINT_PUT_WRITES = "checkpoint-put-writes"
|
|
3
9
|
}
|
|
4
10
|
export interface BaseMindedConnectionSocketMessage {
|
|
5
11
|
type: MindedConnectionSocketMessageType;
|
|
6
12
|
}
|
|
13
|
+
export interface BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
14
|
+
error?: string;
|
|
15
|
+
}
|
|
7
16
|
export interface OnAppTrigger extends BaseMindedConnectionSocketMessage {
|
|
8
17
|
name: string;
|
|
9
18
|
agentId: string;
|
|
10
19
|
body: Record<string, any>;
|
|
11
20
|
cnvId: string;
|
|
12
21
|
}
|
|
22
|
+
export interface OnCheckpointPut extends BaseMindedConnectionSocketMessage {
|
|
23
|
+
config: RunnableConfig;
|
|
24
|
+
checkpoint: Checkpoint;
|
|
25
|
+
metadata: CheckpointMetadata;
|
|
26
|
+
newVersions: ChannelVersions;
|
|
27
|
+
}
|
|
28
|
+
export interface OnCheckpointPutResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
29
|
+
config: RunnableConfig;
|
|
30
|
+
}
|
|
31
|
+
export interface OnCheckpointPutWrites extends BaseMindedConnectionSocketMessage {
|
|
32
|
+
config: RunnableConfig;
|
|
33
|
+
writes: PendingWrite[];
|
|
34
|
+
taskId: string;
|
|
35
|
+
}
|
|
36
|
+
export interface OnCheckpointGetTupleResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
37
|
+
tuple?: CheckpointTuple | undefined;
|
|
38
|
+
}
|
|
39
|
+
export interface OnCheckpointGetTuple extends BaseMindedConnectionSocketMessage {
|
|
40
|
+
config: RunnableConfig;
|
|
41
|
+
}
|
|
42
|
+
export interface OnCheckpointList extends BaseMindedConnectionSocketMessage {
|
|
43
|
+
config: RunnableConfig;
|
|
44
|
+
options?: CheckpointListOptions;
|
|
45
|
+
}
|
|
46
|
+
export interface OnCheckpointListResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
47
|
+
checkpoints?: CheckpointTuple[];
|
|
48
|
+
}
|
|
@@ -4,5 +4,9 @@ exports.MindedConnectionSocketMessageType = void 0;
|
|
|
4
4
|
var MindedConnectionSocketMessageType;
|
|
5
5
|
(function (MindedConnectionSocketMessageType) {
|
|
6
6
|
MindedConnectionSocketMessageType["OnAppTrigger"] = "on-app-trigger";
|
|
7
|
+
MindedConnectionSocketMessageType["CHECKPOINT_GET_TUPLE"] = "checkpoint-get-tuple";
|
|
8
|
+
MindedConnectionSocketMessageType["CHECKPOINT_PUT"] = "checkpoint-put";
|
|
9
|
+
MindedConnectionSocketMessageType["CHECKPOINT_LIST"] = "checkpoint-list";
|
|
10
|
+
MindedConnectionSocketMessageType["CHECKPOINT_PUT_WRITES"] = "checkpoint-put-writes";
|
|
7
11
|
})(MindedConnectionSocketMessageType || (exports.MindedConnectionSocketMessageType = MindedConnectionSocketMessageType = {}));
|
|
8
12
|
//# sourceMappingURL=mindedConnectionTypes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mindedConnectionTypes.js","sourceRoot":"","sources":["../../src/platform/mindedConnectionTypes.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"mindedConnectionTypes.js","sourceRoot":"","sources":["../../src/platform/mindedConnectionTypes.ts"],"names":[],"mappings":";;;AAUA,IAAY,iCAMX;AAND,WAAY,iCAAiC;IAC3C,oEAA+B,CAAA;IAC/B,kFAA6C,CAAA;IAC7C,sEAAiC,CAAA;IACjC,wEAAmC,CAAA;IACnC,oFAA+C,CAAA;AACjD,CAAC,EANW,iCAAiC,iDAAjC,iCAAiC,QAM5C"}
|
|
@@ -81,6 +81,24 @@ agent.on(events.TRIGGER_EVENT, async ({ triggerName, triggerBody }) => {
|
|
|
81
81
|
|
|
82
82
|
Prompt nodes process input through LLM to generate intelligent responses or invoke tools.
|
|
83
83
|
|
|
84
|
+
**Optional Properties:**
|
|
85
|
+
- `humanInTheLoop?: boolean` - When `true`, pauses execution after this node for human input before continuing
|
|
86
|
+
- `canStayOnNode?: boolean` - When `true`, allows the node to route back to itself for iterative processing. Usually combined with `humanInTheLoop: true` to allow for iteration over human input.
|
|
87
|
+
|
|
88
|
+
**Example Usage:**
|
|
89
|
+
```yaml
|
|
90
|
+
- type: promptNode
|
|
91
|
+
name: Content Reviewer
|
|
92
|
+
prompt: "Ask user to review the content and approve or request changes."
|
|
93
|
+
humanInTheLoop: true # Pause for human approval before proceeding
|
|
94
|
+
|
|
95
|
+
- type: promptNode
|
|
96
|
+
name: Research Assistant
|
|
97
|
+
prompt: "Request user for more information until you have gathered all necessary information."
|
|
98
|
+
canStayOnNode: true # Allow iterative research until complete
|
|
99
|
+
humanInTheLoop: true # Pause for human approval before proceeding
|
|
100
|
+
```
|
|
101
|
+
|
|
84
102
|
### Basic Configuration
|
|
85
103
|
|
|
86
104
|
```yaml
|
|
@@ -11,11 +11,31 @@ interface Tool<Input extends z.ZodSchema, Memory> {
|
|
|
11
11
|
name: string; // Unique tool identifier
|
|
12
12
|
description: string; // What the tool does (used by LLM)
|
|
13
13
|
input: Input; // Zod schema for input validation
|
|
14
|
-
isGlobal?: boolean; // Optional: available across all
|
|
14
|
+
isGlobal?: boolean; // Optional: available across all LLM calls
|
|
15
15
|
execute: ({ input, memory }) => Promise<{ memory?, result? }>;
|
|
16
16
|
}
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
+
## Execute Function Signature
|
|
20
|
+
|
|
21
|
+
The `execute` function is the core of every tool. It receives validated input from the LLM and current memory state, then returns updated memory and/or result tool result which will be added to the message history and be available for future LLM calls.
|
|
22
|
+
|
|
23
|
+
### Parameters
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
execute: ({ input, memory }) => Promise<{ memory?, result? }>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
- **`input`**: Validated data matching your Zod schema - contains the parameters the LLM extracted from the conversation
|
|
30
|
+
- **`memory`**: Current conversation memory state - contains all the context and data accumulated during the flow
|
|
31
|
+
|
|
32
|
+
### Return Value
|
|
33
|
+
|
|
34
|
+
The execute function returns a Promise with an object containing:
|
|
35
|
+
|
|
36
|
+
- **`memory?`** (optional): Updated memory state that will be merged with existing memory
|
|
37
|
+
- **`result?`** (optional): Result that gets sent back to the LLM as the tool's response
|
|
38
|
+
|
|
19
39
|
## Basic Tool Example
|
|
20
40
|
|
|
21
41
|
Here's a simple refund processing tool:
|
|
@@ -15,7 +15,7 @@ nodes:
|
|
|
15
15
|
canStayOnNode: true
|
|
16
16
|
prompt: "You are a customer support agent (Alex) tasked with identifying the issue and escalating it if necessary. Introduce yourself and make sure to collect the customer's name, the issue they are having, and the order id they are referring to. make sure you got all the details you need before continue with the flow. You don't need to further help the customer."
|
|
17
17
|
llmConfig:
|
|
18
|
-
name: '
|
|
18
|
+
name: 'AzureChatOpenAI'
|
|
19
19
|
properties:
|
|
20
20
|
model: 'gpt-4o'
|
|
21
21
|
edges:
|
|
@@ -5,12 +5,12 @@ import tools from './tools';
|
|
|
5
5
|
import { HumanMessage } from '@langchain/core/messages';
|
|
6
6
|
import { events } from '../../src/index';
|
|
7
7
|
import mindedConfig from './minded.json';
|
|
8
|
-
|
|
8
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
9
|
+
const sessionId = `123_${uuidv4()}`;
|
|
9
10
|
const agent = new Agent({
|
|
10
11
|
memorySchema,
|
|
11
12
|
config: mindedConfig,
|
|
12
13
|
tools,
|
|
13
|
-
platformToken: '123',
|
|
14
14
|
});
|
|
15
15
|
|
|
16
16
|
agent.on(events.AI_MESSAGE, async ({ message }) => {
|
|
@@ -54,9 +54,9 @@ if (process.env.NO_PLATFORM_CONNECT === 'true') {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
await agent.invoke({
|
|
57
|
-
triggerBody: userInput,
|
|
57
|
+
triggerBody: { event: { text: userInput } },
|
|
58
58
|
triggerName: 'New Direct Message (Instant)',
|
|
59
|
-
sessionId:
|
|
59
|
+
sessionId: sessionId,
|
|
60
60
|
});
|
|
61
61
|
|
|
62
62
|
rl.prompt();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@minded-ai/mindedjs",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.24",
|
|
4
4
|
"description": "MindedJS is a TypeScript library for building agents.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
"@langchain/langgraph": "^0.2.72",
|
|
43
43
|
"@types/js-yaml": "^4.0.9",
|
|
44
44
|
"axios": "^1.9.0",
|
|
45
|
+
"flatted": "^3.3.3",
|
|
45
46
|
"js-yaml": "^4.1.0",
|
|
46
47
|
"langchain": "^0.3.25",
|
|
47
48
|
"socket.io-client": "^4.8.1",
|
package/src/agent.ts
CHANGED
|
@@ -56,9 +56,7 @@ export class Agent {
|
|
|
56
56
|
this.tools = tools;
|
|
57
57
|
this.platformToken = platformToken;
|
|
58
58
|
this.llm = createLlmInstance(config.llm);
|
|
59
|
-
this.checkpointer = memorySaver || createCheckpointSaver('');
|
|
60
59
|
this.validate();
|
|
61
|
-
this.compiledGraph = this.initializeGraph();
|
|
62
60
|
|
|
63
61
|
if (process.env.NODE_ENV !== 'test' && process.env.NO_PLATFORM_CONNECT !== 'true') {
|
|
64
62
|
this.mindedConnection = new MindedConnection();
|
|
@@ -72,6 +70,8 @@ export class Agent {
|
|
|
72
70
|
});
|
|
73
71
|
});
|
|
74
72
|
}
|
|
73
|
+
this.checkpointer = memorySaver || createCheckpointSaver(this.mindedConnection);
|
|
74
|
+
this.compiledGraph = this.initializeGraph();
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
private loadFlowsFromDirectory(flowsDirectories: string[]): Flow[] {
|
|
@@ -140,11 +140,18 @@ export class Agent {
|
|
|
140
140
|
|
|
141
141
|
// Add edges
|
|
142
142
|
edgeFactory({ graph, edges, nodes: nodesObject, llm: this.llm });
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
143
|
+
|
|
144
|
+
// Add edge from start to first node if no triggers exist
|
|
145
|
+
const hasTrigger = nodes.some((node) => node.type === NodeType.TRIGGER);
|
|
146
|
+
if (!hasTrigger && nodes.length > 0) {
|
|
147
|
+
graph.addEdge('__start__', nodes[0].name as any);
|
|
148
|
+
} else {
|
|
149
|
+
nodes.forEach((node) => {
|
|
150
|
+
if (node.type === NodeType.TRIGGER) {
|
|
151
|
+
graph.addEdge('__start__', node.name as any);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
}
|
|
148
155
|
|
|
149
156
|
// Compile the graph
|
|
150
157
|
return graph.compile({ checkpointer: this.checkpointer }) as CompiledGraph;
|
|
@@ -1,31 +1,18 @@
|
|
|
1
1
|
import { BaseCheckpointSaver, MemorySaver } from '@langchain/langgraph';
|
|
2
2
|
import { MindedCheckpointSaver } from '../platform/mindedCheckpointSaver';
|
|
3
|
+
import { MindedConnection } from '../platform/mindedConnection';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
|
-
* Factory function to create the appropriate checkpoint saver based on environment variables
|
|
6
|
+
* Factory function to create the appropriate checkpoint saver based on environment variables.
|
|
6
7
|
* @param platformToken - Optional platform token for remote checkpoint saving
|
|
7
8
|
* @returns BaseCheckpointSaver instance (either MemorySaver or MindedCheckpointSaver)
|
|
8
9
|
*/
|
|
9
|
-
export function createCheckpointSaver(
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
if (!useRemoteCheckpointSaver || process.env.NODE_ENV === 'test') {
|
|
13
|
-
console.log('Using in-memory checkpoint saver');
|
|
14
|
-
return new MemorySaver();
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// // If not using in-memory, check for platform token and MINDED_SERVER
|
|
18
|
-
// if (!platformToken) {
|
|
19
|
-
// console.warn('No platform token provided, falling back to in-memory checkpoint saver');
|
|
20
|
-
// return new MemorySaver();
|
|
21
|
-
// }
|
|
22
|
-
|
|
23
|
-
const mindedServer = process.env.MINDED_SERVER;
|
|
24
|
-
if (!mindedServer) {
|
|
25
|
-
console.warn('MINDED_SERVER environment variable not set, falling back to in-memory checkpoint saver');
|
|
10
|
+
export function createCheckpointSaver(mindedConnection: MindedConnection | null): BaseCheckpointSaver {
|
|
11
|
+
if (!mindedConnection) {
|
|
12
|
+
console.warn('mindedConnection not set, falling back to in-memory checkpoint saver');
|
|
26
13
|
return new MemorySaver();
|
|
27
14
|
}
|
|
28
15
|
|
|
29
|
-
console.log(`Using remote checkpoint saver
|
|
30
|
-
return new MindedCheckpointSaver(
|
|
16
|
+
console.log(`Using remote checkpoint saver`);
|
|
17
|
+
return new MindedCheckpointSaver(mindedConnection);
|
|
31
18
|
}
|
package/src/cli/index.ts
CHANGED
|
@@ -9,20 +9,31 @@ import {
|
|
|
9
9
|
CheckpointPendingWrite,
|
|
10
10
|
} from '@langchain/langgraph-checkpoint';
|
|
11
11
|
import type { RunnableConfig } from '@langchain/core/runnables';
|
|
12
|
-
import {
|
|
12
|
+
import { MindedConnection } from './mindedConnection';
|
|
13
|
+
import {
|
|
14
|
+
MindedConnectionSocketMessageType,
|
|
15
|
+
OnCheckpointGetTuple,
|
|
16
|
+
OnCheckpointGetTupleResponse,
|
|
17
|
+
OnCheckpointList,
|
|
18
|
+
OnCheckpointListResponse,
|
|
19
|
+
OnCheckpointPut,
|
|
20
|
+
OnCheckpointPutResponse,
|
|
21
|
+
OnCheckpointPutWrites,
|
|
22
|
+
} from './mindedConnectionTypes';
|
|
13
23
|
|
|
14
24
|
export class MindedCheckpointSaver extends BaseCheckpointSaver<number> {
|
|
15
|
-
constructor(private
|
|
25
|
+
constructor(private mindedConnection: MindedConnection) {
|
|
16
26
|
super();
|
|
17
27
|
}
|
|
18
28
|
|
|
19
29
|
async getTuple(config: RunnableConfig<Record<string, any>>): Promise<CheckpointTuple | undefined> {
|
|
20
|
-
const response = await
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
30
|
+
const response = await this.mindedConnection.awaitEmit<OnCheckpointGetTuple, OnCheckpointGetTupleResponse>(
|
|
31
|
+
MindedConnectionSocketMessageType.CHECKPOINT_GET_TUPLE,
|
|
32
|
+
{
|
|
33
|
+
type: MindedConnectionSocketMessageType.CHECKPOINT_GET_TUPLE,
|
|
34
|
+
config,
|
|
35
|
+
},
|
|
36
|
+
);
|
|
26
37
|
|
|
27
38
|
if (!response.tuple) {
|
|
28
39
|
return undefined;
|
|
@@ -64,17 +75,16 @@ export class MindedCheckpointSaver extends BaseCheckpointSaver<number> {
|
|
|
64
75
|
}
|
|
65
76
|
|
|
66
77
|
async *list(config: RunnableConfig<Record<string, any>>, options?: CheckpointListOptions): AsyncGenerator<CheckpointTuple, any, any> {
|
|
67
|
-
const response = await
|
|
68
|
-
|
|
69
|
-
{
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
});
|
|
78
|
+
const response = await this.mindedConnection.awaitEmit<OnCheckpointList, OnCheckpointListResponse>(
|
|
79
|
+
MindedConnectionSocketMessageType.CHECKPOINT_LIST,
|
|
80
|
+
{
|
|
81
|
+
type: MindedConnectionSocketMessageType.CHECKPOINT_LIST,
|
|
82
|
+
config,
|
|
83
|
+
options,
|
|
84
|
+
},
|
|
85
|
+
);
|
|
76
86
|
|
|
77
|
-
for (const tuple of response.checkpoints) {
|
|
87
|
+
for (const tuple of response.checkpoints || []) {
|
|
78
88
|
// Re-serialize and deserialize checkpoint to restore class information
|
|
79
89
|
const [checkpointType, serializedCheckpoint] = this.serde.dumpsTyped(tuple.checkpoint);
|
|
80
90
|
const checkpoint = (await this.serde.loadsTyped(checkpointType, serializedCheckpoint)) as Checkpoint;
|
|
@@ -102,30 +112,34 @@ export class MindedCheckpointSaver extends BaseCheckpointSaver<number> {
|
|
|
102
112
|
metadata: CheckpointMetadata,
|
|
103
113
|
newVersions: ChannelVersions,
|
|
104
114
|
): Promise<RunnableConfig<Record<string, any>>> {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
115
|
+
try {
|
|
116
|
+
const response = await this.mindedConnection.awaitEmit<OnCheckpointPut, OnCheckpointPutResponse>(
|
|
117
|
+
MindedConnectionSocketMessageType.CHECKPOINT_PUT,
|
|
118
|
+
{
|
|
119
|
+
type: MindedConnectionSocketMessageType.CHECKPOINT_PUT,
|
|
120
|
+
config,
|
|
121
|
+
checkpoint,
|
|
122
|
+
metadata,
|
|
123
|
+
newVersions,
|
|
124
|
+
},
|
|
125
|
+
);
|
|
126
|
+
return response.config;
|
|
127
|
+
} catch (error) {
|
|
128
|
+
console.error('Error putting checkpoint:', error);
|
|
129
|
+
return config;
|
|
130
|
+
}
|
|
121
131
|
}
|
|
122
132
|
|
|
123
133
|
async putWrites(config: RunnableConfig<Record<string, any>>, writes: PendingWrite[], taskId: string): Promise<void> {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
134
|
+
try {
|
|
135
|
+
await this.mindedConnection.awaitEmit<OnCheckpointPutWrites, any>(MindedConnectionSocketMessageType.CHECKPOINT_PUT_WRITES, {
|
|
136
|
+
type: MindedConnectionSocketMessageType.CHECKPOINT_PUT_WRITES,
|
|
137
|
+
config,
|
|
138
|
+
writes,
|
|
139
|
+
taskId,
|
|
140
|
+
});
|
|
141
|
+
} catch (error) {
|
|
142
|
+
console.error('Error putting writes:', error);
|
|
143
|
+
}
|
|
130
144
|
}
|
|
131
145
|
}
|
|
@@ -3,6 +3,7 @@ import * as readline from 'readline';
|
|
|
3
3
|
import { BaseMindedConnectionSocketMessage, MindedConnectionSocketMessageType } from './mindedConnectionTypes';
|
|
4
4
|
import * as fs from 'fs';
|
|
5
5
|
import * as path from 'path';
|
|
6
|
+
import { stringify } from 'flatted';
|
|
6
7
|
|
|
7
8
|
export class MindedConnection {
|
|
8
9
|
private socket: Socket | null = null;
|
|
@@ -81,8 +82,35 @@ export class MindedConnection {
|
|
|
81
82
|
}
|
|
82
83
|
};
|
|
83
84
|
|
|
85
|
+
public awaitEmit = <T, R>(event: MindedConnectionSocketMessageType, message: T, timeoutMs: number = 5000): Promise<R> => {
|
|
86
|
+
return new Promise((resolve, reject) => {
|
|
87
|
+
if (!this.socket) {
|
|
88
|
+
reject(new Error('Socket is not connected'));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Set up timeout
|
|
93
|
+
const timeout = setTimeout(() => {
|
|
94
|
+
reject(new Error(`Acknowledgement timeout after ${timeoutMs}ms`));
|
|
95
|
+
}, timeoutMs);
|
|
96
|
+
|
|
97
|
+
// Emit with acknowledgement callback
|
|
98
|
+
|
|
99
|
+
this.socket.emit(event, stringify(message), (response: any) => {
|
|
100
|
+
clearTimeout(timeout);
|
|
101
|
+
|
|
102
|
+
// Check if the response indicates an error
|
|
103
|
+
if (response && response.error) {
|
|
104
|
+
reject(new Error(response.error));
|
|
105
|
+
} else {
|
|
106
|
+
resolve(response);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
|
|
84
112
|
private async connect(token: string) {
|
|
85
|
-
this.socket = io(
|
|
113
|
+
this.socket = io(process.env.MINDED_SERVER, {
|
|
86
114
|
path: '/minded-connect',
|
|
87
115
|
query: {
|
|
88
116
|
token,
|
|
@@ -108,6 +136,7 @@ export class MindedConnection {
|
|
|
108
136
|
console.error('Server error:', error.message);
|
|
109
137
|
|
|
110
138
|
if (error.message.includes('Invalid token')) {
|
|
139
|
+
console.log('Invalid token');
|
|
111
140
|
// Delete saved token on connection error
|
|
112
141
|
if (fs.existsSync(this.tokenPath)) {
|
|
113
142
|
fs.unlinkSync(this.tokenPath);
|
|
@@ -1,14 +1,64 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
CheckpointListOptions,
|
|
3
|
+
CheckpointMetadata,
|
|
4
|
+
PendingWrite,
|
|
5
|
+
Checkpoint,
|
|
6
|
+
ChannelVersions,
|
|
7
|
+
CheckpointTuple,
|
|
8
|
+
} from '@langchain/langgraph-checkpoint';
|
|
9
|
+
import type { RunnableConfig } from '@langchain/core/runnables';
|
|
10
|
+
|
|
1
11
|
export enum MindedConnectionSocketMessageType {
|
|
2
12
|
OnAppTrigger = 'on-app-trigger',
|
|
13
|
+
CHECKPOINT_GET_TUPLE = 'checkpoint-get-tuple',
|
|
14
|
+
CHECKPOINT_PUT = 'checkpoint-put',
|
|
15
|
+
CHECKPOINT_LIST = 'checkpoint-list',
|
|
16
|
+
CHECKPOINT_PUT_WRITES = 'checkpoint-put-writes',
|
|
3
17
|
}
|
|
4
18
|
|
|
5
19
|
export interface BaseMindedConnectionSocketMessage {
|
|
6
20
|
type: MindedConnectionSocketMessageType;
|
|
7
21
|
}
|
|
8
22
|
|
|
23
|
+
export interface BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
24
|
+
error?: string;
|
|
25
|
+
}
|
|
9
26
|
export interface OnAppTrigger extends BaseMindedConnectionSocketMessage {
|
|
10
27
|
name: string;
|
|
11
28
|
agentId: string;
|
|
12
29
|
body: Record<string, any>;
|
|
13
30
|
cnvId: string;
|
|
14
31
|
}
|
|
32
|
+
|
|
33
|
+
export interface OnCheckpointPut extends BaseMindedConnectionSocketMessage {
|
|
34
|
+
config: RunnableConfig;
|
|
35
|
+
checkpoint: Checkpoint;
|
|
36
|
+
metadata: CheckpointMetadata;
|
|
37
|
+
newVersions: ChannelVersions;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface OnCheckpointPutResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
41
|
+
config: RunnableConfig;
|
|
42
|
+
}
|
|
43
|
+
export interface OnCheckpointPutWrites extends BaseMindedConnectionSocketMessage {
|
|
44
|
+
config: RunnableConfig;
|
|
45
|
+
writes: PendingWrite[];
|
|
46
|
+
taskId: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface OnCheckpointGetTupleResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
50
|
+
tuple?: CheckpointTuple | undefined;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface OnCheckpointGetTuple extends BaseMindedConnectionSocketMessage {
|
|
54
|
+
config: RunnableConfig;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface OnCheckpointList extends BaseMindedConnectionSocketMessage {
|
|
58
|
+
config: RunnableConfig;
|
|
59
|
+
options?: CheckpointListOptions;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface OnCheckpointListResponse extends BaseSdkConnectionSocketMessageResponseCallbackAck {
|
|
63
|
+
checkpoints?: CheckpointTuple[];
|
|
64
|
+
}
|
|
@@ -2,19 +2,21 @@ import { expect } from 'chai';
|
|
|
2
2
|
import { describe, it, beforeEach, afterEach } from 'mocha';
|
|
3
3
|
import * as sinon from 'sinon';
|
|
4
4
|
import { MindedCheckpointSaver } from '../../src/platform/mindedCheckpointSaver';
|
|
5
|
-
import * as mindedRequestModule from '../../src/platform/mindedRequest';
|
|
6
5
|
import { Checkpoint, CheckpointTuple, CheckpointMetadata, emptyCheckpoint, CheckpointListOptions } from '@langchain/langgraph-checkpoint';
|
|
7
6
|
import { RunnableConfig } from '@langchain/core/runnables';
|
|
8
7
|
import { HumanMessage, AIMessage, SystemMessage } from '@langchain/core/messages';
|
|
8
|
+
import { MindedConnection } from '../../src/platform/mindedConnection';
|
|
9
|
+
import { MindedConnectionSocketMessageType } from '../../src/platform/mindedConnectionTypes';
|
|
9
10
|
|
|
10
11
|
describe('MindedCheckpointSaver - List Method', function () {
|
|
11
12
|
let checkpointSaver: MindedCheckpointSaver;
|
|
12
|
-
let
|
|
13
|
-
|
|
13
|
+
let mindedConnection: MindedConnection;
|
|
14
|
+
let awaitEmitStub: sinon.SinonStub;
|
|
14
15
|
|
|
15
16
|
beforeEach(() => {
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
mindedConnection = new MindedConnection();
|
|
18
|
+
checkpointSaver = new MindedCheckpointSaver(mindedConnection);
|
|
19
|
+
awaitEmitStub = sinon.stub(mindedConnection, 'awaitEmit');
|
|
18
20
|
});
|
|
19
21
|
|
|
20
22
|
afterEach(() => {
|
|
@@ -77,8 +79,8 @@ describe('MindedCheckpointSaver - List Method', function () {
|
|
|
77
79
|
],
|
|
78
80
|
};
|
|
79
81
|
|
|
80
|
-
// Mock the
|
|
81
|
-
|
|
82
|
+
// Mock the awaitEmit response
|
|
83
|
+
awaitEmitStub.resolves(mockServerResponse);
|
|
82
84
|
|
|
83
85
|
const config: RunnableConfig = { configurable: { thread_id: 'test-thread' } };
|
|
84
86
|
const options: CheckpointListOptions = { limit: 10 };
|
|
@@ -88,13 +90,13 @@ describe('MindedCheckpointSaver - List Method', function () {
|
|
|
88
90
|
results.push(tuple);
|
|
89
91
|
}
|
|
90
92
|
|
|
91
|
-
// Verify the
|
|
92
|
-
expect(
|
|
93
|
-
expect(
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
93
|
+
// Verify the awaitEmit was called correctly
|
|
94
|
+
expect(awaitEmitStub.calledOnce).to.equal(true);
|
|
95
|
+
expect(awaitEmitStub.firstCall.args[0]).to.equal(MindedConnectionSocketMessageType.CHECKPOINT_LIST);
|
|
96
|
+
expect(awaitEmitStub.firstCall.args[1]).to.deep.equal({
|
|
97
|
+
type: MindedConnectionSocketMessageType.CHECKPOINT_LIST,
|
|
98
|
+
config,
|
|
99
|
+
options,
|
|
98
100
|
});
|
|
99
101
|
|
|
100
102
|
// Verify we got the correct number of results
|
|
@@ -123,7 +125,7 @@ describe('MindedCheckpointSaver - List Method', function () {
|
|
|
123
125
|
});
|
|
124
126
|
|
|
125
127
|
it('should handle empty checkpoint list', async () => {
|
|
126
|
-
|
|
128
|
+
awaitEmitStub.resolves({ checkpoints: [] });
|
|
127
129
|
|
|
128
130
|
const config: RunnableConfig = { configurable: { thread_id: 'empty-thread' } };
|
|
129
131
|
|
|
@@ -2,19 +2,21 @@ import { expect } from 'chai';
|
|
|
2
2
|
import { describe, it, beforeEach, afterEach } from 'mocha';
|
|
3
3
|
import * as sinon from 'sinon';
|
|
4
4
|
import { MindedCheckpointSaver } from '../../src/platform/mindedCheckpointSaver';
|
|
5
|
-
import * as mindedRequestModule from '../../src/platform/mindedRequest';
|
|
6
5
|
import { Checkpoint, CheckpointMetadata, emptyCheckpoint } from '@langchain/langgraph-checkpoint';
|
|
7
6
|
import { RunnableConfig } from '@langchain/core/runnables';
|
|
8
7
|
import { HumanMessage, AIMessage } from '@langchain/core/messages';
|
|
8
|
+
import { MindedConnection } from '../../src/platform/mindedConnection';
|
|
9
|
+
import { MindedConnectionSocketMessageType } from '../../src/platform/mindedConnectionTypes';
|
|
9
10
|
|
|
10
11
|
describe('MindedCheckpointSaver', function () {
|
|
11
12
|
let checkpointSaver: MindedCheckpointSaver;
|
|
12
|
-
let
|
|
13
|
-
|
|
13
|
+
let mindedConnection: MindedConnection;
|
|
14
|
+
let awaitEmitStub: sinon.SinonStub;
|
|
14
15
|
|
|
15
16
|
beforeEach(() => {
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
mindedConnection = new MindedConnection();
|
|
18
|
+
checkpointSaver = new MindedCheckpointSaver(mindedConnection);
|
|
19
|
+
awaitEmitStub = sinon.stub(mindedConnection, 'awaitEmit');
|
|
18
20
|
});
|
|
19
21
|
|
|
20
22
|
afterEach(() => {
|
|
@@ -58,19 +60,18 @@ describe('MindedCheckpointSaver', function () {
|
|
|
58
60
|
},
|
|
59
61
|
};
|
|
60
62
|
|
|
61
|
-
// Mock the
|
|
62
|
-
|
|
63
|
+
// Mock the awaitEmit response
|
|
64
|
+
awaitEmitStub.resolves(mockServerResponse);
|
|
63
65
|
|
|
64
66
|
const config: RunnableConfig = { configurable: { thread_id: 'test-thread' } };
|
|
65
67
|
const result = await checkpointSaver.getTuple(config);
|
|
66
68
|
|
|
67
|
-
// Verify the
|
|
68
|
-
expect(
|
|
69
|
-
expect(
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
token: testToken,
|
|
69
|
+
// Verify the awaitEmit was called correctly
|
|
70
|
+
expect(awaitEmitStub.calledOnce).to.equal(true);
|
|
71
|
+
expect(awaitEmitStub.firstCall.args[0]).to.equal(MindedConnectionSocketMessageType.CHECKPOINT_GET_TUPLE);
|
|
72
|
+
expect(awaitEmitStub.firstCall.args[1]).to.deep.equal({
|
|
73
|
+
type: MindedConnectionSocketMessageType.CHECKPOINT_GET_TUPLE,
|
|
74
|
+
config,
|
|
74
75
|
});
|
|
75
76
|
|
|
76
77
|
// Verify the result structure
|
|
@@ -88,7 +89,7 @@ describe('MindedCheckpointSaver', function () {
|
|
|
88
89
|
});
|
|
89
90
|
|
|
90
91
|
it('should return undefined when server returns no tuple', async () => {
|
|
91
|
-
|
|
92
|
+
awaitEmitStub.resolves({ tuple: undefined });
|
|
92
93
|
|
|
93
94
|
const config: RunnableConfig = { configurable: { thread_id: 'test-thread' } };
|
|
94
95
|
const result = await checkpointSaver.getTuple(config);
|