spice-js 2.6.38 → 2.6.40

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.
@@ -0,0 +1,296 @@
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
+ if (_fs.default.existsSync(tempFilePath)) {
124
+ _fs.default.unlinkSync(tempFilePath);
125
+ }
126
+ }
127
+ })();
128
+ }
129
+
130
+ getMimeType(fileType) {
131
+ // Mapping of file extensions to MIME types
132
+ var mimeTypes = {
133
+ jpeg: "image/jpeg",
134
+ jpg: "image/jpeg",
135
+ // Adding 'jpg' as it's a common alias for 'jpeg'
136
+ png: "image/png",
137
+ gif: "image/gif",
138
+ bmp: "image/bmp",
139
+ webp: "image/webp",
140
+ svg: "image/svg+xml",
141
+ pdf: "application/pdf",
142
+ txt: "text/plain",
143
+ html: "text/html",
144
+ css: "text/css",
145
+ js: "application/javascript",
146
+ json: "application/json",
147
+ xml: "application/xml",
148
+ csv: "text/csv",
149
+ mp3: "audio/mpeg",
150
+ wav: "audio/wav",
151
+ mp4: "video/mp4",
152
+ avi: "video/x-msvideo",
153
+ mov: "video/quicktime",
154
+ zip: "application/zip",
155
+ rar: "application/vnd.rar",
156
+ "7z": "application/x-7z-compressed" // Add more MIME types as needed
157
+
158
+ }; // Ensure the fileType is a string and convert it to lowercase
159
+
160
+ if (typeof fileType !== "string") {
161
+ throw new TypeError("fileType must be a string");
162
+ }
163
+
164
+ var ext = fileType.toLowerCase(); // Return the MIME type if found, otherwise return the default
165
+
166
+ return mimeTypes[ext] || "application/octet-stream";
167
+ }
168
+
169
+ getFileType(filePath) {
170
+ return _asyncToGenerator(function* () {
171
+ return new Promise((resolve, reject) => {
172
+ var fileSignature = Buffer.alloc(8);
173
+
174
+ _fs.default.open(filePath, "r", (err, fd) => {
175
+ if (err) reject(err);
176
+
177
+ _fs.default.read(fd, fileSignature, 0, 8, 0, err => {
178
+ if (err) reject(err);
179
+
180
+ _fs.default.close(fd, err => {
181
+ if (err) console.error("Error closing file:", err);
182
+ });
183
+
184
+ var hex = fileSignature.toString("hex");
185
+
186
+ if (hex.startsWith("ffd8")) {
187
+ resolve("jpeg");
188
+ } else if (hex.startsWith("89504e47")) {
189
+ resolve("png");
190
+ } else if (fileSignature.toString("ascii").startsWith("%PDF")) {
191
+ resolve("pdf");
192
+ } else {
193
+ resolve("unknown");
194
+ }
195
+ });
196
+ });
197
+ });
198
+ })();
199
+ }
200
+
201
+ deleteFolderRecursive(dirPath) {
202
+ var _this2 = this;
203
+
204
+ return _asyncToGenerator(function* () {
205
+ if (_fs.default.existsSync(dirPath)) {
206
+ for (var entry of _fs.default.readdirSync(dirPath)) {
207
+ var entryPath = path.join(dirPath, entry);
208
+
209
+ if (_fs.default.lstatSync(entryPath).isDirectory()) {
210
+ yield _this2.deleteFolderRecursive(entryPath);
211
+ } else {
212
+ yield _fs.default.promises.unlink(entryPath);
213
+ }
214
+ }
215
+
216
+ yield _fs.default.promises.rmdir(dirPath);
217
+ }
218
+ })();
219
+ }
220
+
221
+ processFiles(files) {
222
+ var _this3 = this;
223
+
224
+ return _asyncToGenerator(function* () {
225
+ var types = _this3.getSupportedFileTypes();
226
+
227
+ var outputDir = _this3.createUniqueDirectory();
228
+
229
+ return (yield Promise.all(files.map(
230
+ /*#__PURE__*/
231
+ function () {
232
+ var _ref = _asyncToGenerator(function* (fileStream) {
233
+ //let type = await this.getFileType(fileStream);
234
+ var imagePaths = yield _this3.extractOrStoreFile(fileStream, outputDir, types);
235
+ return imagePaths;
236
+ });
237
+
238
+ return function (_x) {
239
+ return _ref.apply(this, arguments);
240
+ };
241
+ }()))).flat();
242
+ })();
243
+ }
244
+
245
+ getSupportedFileTypes(options) {
246
+ if (this.Provider === undefined) {
247
+ throw new Error("AI provider " + this.provider + " is not defined");
248
+ }
249
+
250
+ var provider = new this.Provider(this.options);
251
+ return provider.getSupportedTypes();
252
+ }
253
+
254
+ prompt(prompt, _ref2, options) {
255
+ var _this4 = this;
256
+
257
+ return _asyncToGenerator(function* () {
258
+ var {
259
+ files,
260
+ system_message,
261
+ prompt_options
262
+ } = _ref2;
263
+ var context_files = yield _this4.processFiles(files);
264
+
265
+ try {
266
+ if (options) {
267
+ _this4.options = _lodash.default.merge(_this4.options, options);
268
+ } //console.log(this.Provider);
269
+
270
+
271
+ if (_this4.Provider === undefined) {
272
+ throw new Error("AI provider " + _this4.provider + " is not defined");
273
+ }
274
+
275
+ var provider = new _this4.Provider(_this4.options);
276
+ return yield provider.prompt(prompt, {
277
+ prompt_options,
278
+ system_message,
279
+ files: context_files
280
+ });
281
+ } catch (e) {
282
+ console.error(e);
283
+ return {
284
+ error: e.message
285
+ };
286
+ } finally {
287
+ for (var context_file of context_files) {
288
+ yield _this4.deleteFolderRecursive(context_file);
289
+ }
290
+ }
291
+ })();
292
+ }
293
+
294
+ }
295
+
296
+ exports.default = AI;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+
3
+ module.exports = {};
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 koaBody = require("koa-body");
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('fs-extra');
11
-
12
- var path = require('path');
14
+ var fs = require("fs-extra");
13
15
 
14
- var open = require("open");
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('./'), 'storage/mail');
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,