spice-js 2.6.39 → 2.6.41
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/build/artificial_intelligence/AI.js +299 -0
- package/build/config/ai.js +3 -0
- package/build/index.js +8 -2
- package/build/mail/providers/File.js +9 -5
- package/build/models/SpiceModel.js +147 -265
- package/build/storage/providers/Local.js +6 -12
- package/build/utility/RestHelper.js +9 -3
- package/package.json +13 -13
- package/src/artificial_intelligence/Ai.js +246 -0
- package/src/config/ai.js +3 -0
- package/src/index.js +2 -1
- package/src/mail/providers/File.js +28 -28
- package/src/models/SpiceModel.js +174 -290
- package/src/storage/providers/Local.js +69 -60
- package/src/utility/RestHelper.js +33 -29
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.default = void 0;
|
|
5
|
+
|
|
6
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
7
|
+
|
|
8
|
+
var _fs = _interopRequireWildcard(require("fs"));
|
|
9
|
+
|
|
10
|
+
var _promises = require("stream/promises");
|
|
11
|
+
|
|
12
|
+
var _child_process = require("child_process");
|
|
13
|
+
|
|
14
|
+
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
|
|
15
|
+
|
|
16
|
+
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
17
|
+
|
|
18
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
+
|
|
20
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
21
|
+
|
|
22
|
+
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
23
|
+
|
|
24
|
+
var crypto = require("crypto");
|
|
25
|
+
|
|
26
|
+
var path = require("path");
|
|
27
|
+
|
|
28
|
+
class AI {
|
|
29
|
+
constructor(args) {
|
|
30
|
+
if (args === void 0) {
|
|
31
|
+
args = {};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
this.provider = args.provider || spice.config.ai.default_driver;
|
|
35
|
+
console.log(this.provider, args.provider, spice.config.ai.default_driver);
|
|
36
|
+
this.options = _lodash.default.merge(spice.config.ai.drivers[this.provider], args.options); //console.log(this.provider_name, spice.config.ai.providers)
|
|
37
|
+
|
|
38
|
+
this.Provider = spice.config.ai.providers[this.provider];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
createUniqueDirectory() {
|
|
42
|
+
var timestamp = new Date().toISOString().replace(/[:.-]/g, "");
|
|
43
|
+
var randomString = crypto.randomBytes(4).toString("hex");
|
|
44
|
+
var uniqueDirName = "job_" + timestamp + "_" + randomString;
|
|
45
|
+
var project_root = path.resolve(spice.root_path, "..");
|
|
46
|
+
var storageDir = path.join(project_root, "storage/jobs");
|
|
47
|
+
var uniqueDir = path.join(storageDir, uniqueDirName);
|
|
48
|
+
|
|
49
|
+
if (!_fs.default.existsSync(storageDir)) {
|
|
50
|
+
_fs.default.mkdirSync(storageDir, {
|
|
51
|
+
recursive: true
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
_fs.default.mkdirSync(uniqueDir);
|
|
56
|
+
|
|
57
|
+
return uniqueDir;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
extractOrStoreFile(fileStream, outputDir, supportedFileTypes) {
|
|
61
|
+
var _this = this;
|
|
62
|
+
|
|
63
|
+
return _asyncToGenerator(function* () {
|
|
64
|
+
// Ensure the output directory exists
|
|
65
|
+
if (!_fs.default.existsSync(outputDir)) {
|
|
66
|
+
_fs.default.mkdirSync(outputDir, {
|
|
67
|
+
recursive: true
|
|
68
|
+
});
|
|
69
|
+
} // Create a temporary file to store the input
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
var tempFilePath = path.join(outputDir, "temp_input");
|
|
73
|
+
yield (0, _promises.pipeline)(fileStream, _fs.default.createWriteStream(tempFilePath));
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
// Check file type
|
|
77
|
+
var fileType = yield _this.getFileType(tempFilePath);
|
|
78
|
+
|
|
79
|
+
if (_lodash.default.includes(supportedFileTypes, fileType)) {
|
|
80
|
+
// If it's a JPEG or PNG, just move it to the output directory
|
|
81
|
+
var timestamp = new Date().toISOString().replace(/[:.-]/g, "");
|
|
82
|
+
var extension = fileType === "jpeg" ? "jpg" : fileType;
|
|
83
|
+
var outputPath = path.join(outputDir, timestamp + "." + extension);
|
|
84
|
+
|
|
85
|
+
_fs.default.renameSync(tempFilePath, outputPath);
|
|
86
|
+
|
|
87
|
+
return [{
|
|
88
|
+
type: fileType,
|
|
89
|
+
media_type: _this.getMimeType(fileType),
|
|
90
|
+
path: outputPath
|
|
91
|
+
}];
|
|
92
|
+
} else {
|
|
93
|
+
// If it's a PDF, extract pages
|
|
94
|
+
if (fileType === "pdf") {
|
|
95
|
+
var outputPrefix = path.join(outputDir, "page"); // Use pdftoppm (part of poppler-utils) to convert PDF to images
|
|
96
|
+
|
|
97
|
+
yield new Promise((resolve, reject) => {
|
|
98
|
+
var process = (0, _child_process.spawn)("pdftoppm", ["-jpeg", tempFilePath, outputPrefix]);
|
|
99
|
+
process.on("close", code => {
|
|
100
|
+
if (code === 0) resolve();else reject(new Error("pdftoppm process exited with code " + code));
|
|
101
|
+
});
|
|
102
|
+
}); // Get a list of extracted images
|
|
103
|
+
|
|
104
|
+
var files = _fs.default.readdirSync(outputDir);
|
|
105
|
+
|
|
106
|
+
var images = files.filter(file => file.startsWith("page") && file.endsWith(".jpg"));
|
|
107
|
+
return images.map(image => {
|
|
108
|
+
return {
|
|
109
|
+
type: "jpeg",
|
|
110
|
+
media_type: _this.getMimeType("jpeg"),
|
|
111
|
+
path: path.join(outputDir, image)
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
} else {
|
|
115
|
+
throw new Error("Unsupported file type. Only PDF, JPEG, and PNG are supported.");
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
} catch (error) {
|
|
119
|
+
console.error("Error processing file:", error);
|
|
120
|
+
throw error;
|
|
121
|
+
} finally {
|
|
122
|
+
// Clean up the temporary input file
|
|
123
|
+
console.log("Cleaning up temporary file:", tempFilePath);
|
|
124
|
+
|
|
125
|
+
if (_fs.default.existsSync(tempFilePath)) {
|
|
126
|
+
_fs.default.unlinkSync(tempFilePath);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
})();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
getMimeType(fileType) {
|
|
133
|
+
// Mapping of file extensions to MIME types
|
|
134
|
+
var mimeTypes = {
|
|
135
|
+
jpeg: "image/jpeg",
|
|
136
|
+
jpg: "image/jpeg",
|
|
137
|
+
// Adding 'jpg' as it's a common alias for 'jpeg'
|
|
138
|
+
png: "image/png",
|
|
139
|
+
gif: "image/gif",
|
|
140
|
+
bmp: "image/bmp",
|
|
141
|
+
webp: "image/webp",
|
|
142
|
+
svg: "image/svg+xml",
|
|
143
|
+
pdf: "application/pdf",
|
|
144
|
+
txt: "text/plain",
|
|
145
|
+
html: "text/html",
|
|
146
|
+
css: "text/css",
|
|
147
|
+
js: "application/javascript",
|
|
148
|
+
json: "application/json",
|
|
149
|
+
xml: "application/xml",
|
|
150
|
+
csv: "text/csv",
|
|
151
|
+
mp3: "audio/mpeg",
|
|
152
|
+
wav: "audio/wav",
|
|
153
|
+
mp4: "video/mp4",
|
|
154
|
+
avi: "video/x-msvideo",
|
|
155
|
+
mov: "video/quicktime",
|
|
156
|
+
zip: "application/zip",
|
|
157
|
+
rar: "application/vnd.rar",
|
|
158
|
+
"7z": "application/x-7z-compressed" // Add more MIME types as needed
|
|
159
|
+
|
|
160
|
+
}; // Ensure the fileType is a string and convert it to lowercase
|
|
161
|
+
|
|
162
|
+
if (typeof fileType !== "string") {
|
|
163
|
+
throw new TypeError("fileType must be a string");
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
var ext = fileType.toLowerCase(); // Return the MIME type if found, otherwise return the default
|
|
167
|
+
|
|
168
|
+
return mimeTypes[ext] || "application/octet-stream";
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
getFileType(filePath) {
|
|
172
|
+
return _asyncToGenerator(function* () {
|
|
173
|
+
return new Promise((resolve, reject) => {
|
|
174
|
+
var fileSignature = Buffer.alloc(8);
|
|
175
|
+
|
|
176
|
+
_fs.default.open(filePath, "r", (err, fd) => {
|
|
177
|
+
if (err) reject(err);
|
|
178
|
+
|
|
179
|
+
_fs.default.read(fd, fileSignature, 0, 8, 0, err => {
|
|
180
|
+
if (err) reject(err);
|
|
181
|
+
|
|
182
|
+
_fs.default.close(fd, err => {
|
|
183
|
+
if (err) console.error("Error closing file:", err);
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
var hex = fileSignature.toString("hex");
|
|
187
|
+
|
|
188
|
+
if (hex.startsWith("ffd8")) {
|
|
189
|
+
resolve("jpeg");
|
|
190
|
+
} else if (hex.startsWith("89504e47")) {
|
|
191
|
+
resolve("png");
|
|
192
|
+
} else if (fileSignature.toString("ascii").startsWith("%PDF")) {
|
|
193
|
+
resolve("pdf");
|
|
194
|
+
} else {
|
|
195
|
+
resolve("unknown");
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
})();
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
deleteFolderRecursive(dirPath) {
|
|
204
|
+
var _this2 = this;
|
|
205
|
+
|
|
206
|
+
return _asyncToGenerator(function* () {
|
|
207
|
+
if (_fs.default.existsSync(dirPath)) {
|
|
208
|
+
for (var entry of _fs.default.readdirSync(dirPath)) {
|
|
209
|
+
var entryPath = path.join(dirPath, entry);
|
|
210
|
+
|
|
211
|
+
if (_fs.default.lstatSync(entryPath).isDirectory()) {
|
|
212
|
+
yield _this2.deleteFolderRecursive(entryPath);
|
|
213
|
+
} else {
|
|
214
|
+
yield _fs.default.promises.unlink(entryPath);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
yield _fs.default.promises.rmdir(dirPath);
|
|
219
|
+
}
|
|
220
|
+
})();
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
processFiles(files) {
|
|
224
|
+
var _this3 = this;
|
|
225
|
+
|
|
226
|
+
return _asyncToGenerator(function* () {
|
|
227
|
+
var types = _this3.getSupportedFileTypes();
|
|
228
|
+
|
|
229
|
+
var outputDir = _this3.createUniqueDirectory();
|
|
230
|
+
|
|
231
|
+
return (yield Promise.all(files.map(
|
|
232
|
+
/*#__PURE__*/
|
|
233
|
+
function () {
|
|
234
|
+
var _ref = _asyncToGenerator(function* (fileStream) {
|
|
235
|
+
//let type = await this.getFileType(fileStream);
|
|
236
|
+
var imagePaths = yield _this3.extractOrStoreFile(fileStream, outputDir, types);
|
|
237
|
+
return imagePaths;
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
return function (_x) {
|
|
241
|
+
return _ref.apply(this, arguments);
|
|
242
|
+
};
|
|
243
|
+
}()))).flat();
|
|
244
|
+
})();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
getSupportedFileTypes(options) {
|
|
248
|
+
if (this.Provider === undefined) {
|
|
249
|
+
throw new Error("AI provider " + this.provider + " is not defined");
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
var provider = new this.Provider(this.options);
|
|
253
|
+
return provider.getSupportedTypes();
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
prompt(prompt, _ref2, options) {
|
|
257
|
+
var _this4 = this;
|
|
258
|
+
|
|
259
|
+
return _asyncToGenerator(function* () {
|
|
260
|
+
var {
|
|
261
|
+
files,
|
|
262
|
+
system_message,
|
|
263
|
+
prompt_options
|
|
264
|
+
} = _ref2;
|
|
265
|
+
var context_files = yield _this4.processFiles(files);
|
|
266
|
+
|
|
267
|
+
try {
|
|
268
|
+
if (options) {
|
|
269
|
+
_this4.options = _lodash.default.merge(_this4.options, options);
|
|
270
|
+
} //console.log(this.Provider);
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
if (_this4.Provider === undefined) {
|
|
274
|
+
throw new Error("AI provider " + _this4.provider + " is not defined");
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
var provider = new _this4.Provider(_this4.options);
|
|
278
|
+
return yield provider.prompt(prompt, {
|
|
279
|
+
prompt_options,
|
|
280
|
+
system_message,
|
|
281
|
+
files: context_files
|
|
282
|
+
});
|
|
283
|
+
} catch (e) {
|
|
284
|
+
console.error(e);
|
|
285
|
+
return {
|
|
286
|
+
error: e.message
|
|
287
|
+
};
|
|
288
|
+
} finally {
|
|
289
|
+
for (var context_file of context_files) {
|
|
290
|
+
var directory = path.dirname(context_file.path);
|
|
291
|
+
yield _this4.deleteFolderRecursive(directory);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
})();
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
exports.default = AI;
|
package/build/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
exports.__esModule = true;
|
|
4
|
-
exports.default = exports.status = exports.addTask = exports.MapType = exports.SpiceCache = exports.MailFile = exports.Storage = exports.LocalStorage = exports.DebugStorage = exports.MailDebug = exports.DataType = exports.Mail = exports.RestHelper = exports.Serializer = exports.Crypt = exports.SpiceModel = exports.ResourceLifecycleTriggered = exports.SocketEventDriver = exports.SpiceEventDriver = exports.EventDebugger = exports.Event = void 0;
|
|
4
|
+
exports.default = exports.status = exports.addTask = exports.MapType = exports.SpiceCache = exports.MailFile = exports.AI = exports.Storage = exports.LocalStorage = exports.DebugStorage = exports.MailDebug = exports.DataType = exports.Mail = exports.RestHelper = exports.Serializer = exports.Crypt = exports.SpiceModel = exports.ResourceLifecycleTriggered = exports.SocketEventDriver = exports.SpiceEventDriver = exports.EventDebugger = exports.Event = void 0;
|
|
5
5
|
|
|
6
6
|
var _Event = _interopRequireDefault(require("./events/Event"));
|
|
7
7
|
|
|
@@ -65,6 +65,10 @@ var _Storage = _interopRequireDefault(require("./storage/Storage"));
|
|
|
65
65
|
|
|
66
66
|
exports.Storage = _Storage.default;
|
|
67
67
|
|
|
68
|
+
var _Ai = _interopRequireDefault(require("./artificial_intelligence/Ai.js"));
|
|
69
|
+
|
|
70
|
+
exports.AI = _Ai.default;
|
|
71
|
+
|
|
68
72
|
var _File = _interopRequireDefault(require("./mail/providers/File"));
|
|
69
73
|
|
|
70
74
|
exports.MailFile = _File.default;
|
|
@@ -104,7 +108,9 @@ require("dotenv").config({
|
|
|
104
108
|
|
|
105
109
|
var Validate = require("koa-validation");
|
|
106
110
|
|
|
107
|
-
var
|
|
111
|
+
var {
|
|
112
|
+
koaBody
|
|
113
|
+
} = require("koa-body");
|
|
108
114
|
|
|
109
115
|
spice.parent_app_dir = path.resolve("./");
|
|
110
116
|
spice.root_path = path.resolve("./build/");
|
|
@@ -3,15 +3,17 @@
|
|
|
3
3
|
exports.__esModule = true;
|
|
4
4
|
exports.default = void 0;
|
|
5
5
|
|
|
6
|
+
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
|
|
7
|
+
|
|
8
|
+
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
9
|
+
|
|
6
10
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
7
11
|
|
|
8
12
|
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
9
13
|
|
|
10
|
-
var fs = require(
|
|
11
|
-
|
|
12
|
-
var path = require('path');
|
|
14
|
+
var fs = require("fs-extra");
|
|
13
15
|
|
|
14
|
-
var
|
|
16
|
+
var path = require("path");
|
|
15
17
|
|
|
16
18
|
class File {
|
|
17
19
|
constructor(args) {
|
|
@@ -22,7 +24,7 @@ class File {
|
|
|
22
24
|
this.sender = args.sender;
|
|
23
25
|
this.subject = args.subject;
|
|
24
26
|
this.htmlText = args.htmlText;
|
|
25
|
-
this.dest = path.join(path.resolve(
|
|
27
|
+
this.dest = path.join(path.resolve("./"), "storage/mail");
|
|
26
28
|
|
|
27
29
|
if (args.path) {
|
|
28
30
|
this.dest = path.resolve(args.path);
|
|
@@ -37,6 +39,8 @@ class File {
|
|
|
37
39
|
options = {};
|
|
38
40
|
}
|
|
39
41
|
|
|
42
|
+
var openModule = yield Promise.resolve().then(() => _interopRequireWildcard(require("open")));
|
|
43
|
+
var open = openModule.default;
|
|
40
44
|
var email = {
|
|
41
45
|
to: options.to,
|
|
42
46
|
from: options.sender || _this.sender,
|