psadk 1.1.0 → 1.1.2
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/README.md +6 -0
- package/build/main/index.d.ts +5 -0
- package/build/main/index.js +7 -1
- package/build/main/lib/PSAI.d.ts +1 -1
- package/build/main/lib/PSAgent.d.ts +11 -0
- package/build/main/lib/PSAgent.js +59 -30
- package/build/main/lib/PSAgentConfig.d.ts +1 -1
- package/build/main/lib/PSAgentLogger.d.ts +7 -0
- package/build/main/lib/PSAgentLogger.js +20 -5
- package/build/main/lib/jwt.js +3 -1
- package/build/main/lib/tools/BraveWebSearchTool.d.ts +11 -0
- package/build/main/lib/tools/BraveWebSearchTool.js +89 -0
- package/build/main/lib/tools/PSCommandLineTool.d.ts +10 -0
- package/build/main/lib/tools/PSCommandLineTool.js +74 -0
- package/build/main/lib/tools/PSMemoryTool.d.ts +45 -0
- package/build/main/lib/tools/PSMemoryTool.js +485 -0
- package/build/main/lib/tools/PSReadFileTool.d.ts +10 -0
- package/build/main/lib/tools/PSReadFileTool.js +68 -0
- package/build/main/lib/tools/PSSubAgentTool.js +141 -14
- package/build/main/lib/tools/PSWriteFileTool.d.ts +10 -0
- package/build/main/lib/tools/PSWriteFileTool.js +74 -0
- package/build/main/lib/tools/ReadFileTool.d.ts +10 -0
- package/build/main/lib/tools/ReadFileTool.js +68 -0
- package/build/main/lib/tools/TodoTool.d.ts +57 -0
- package/build/main/lib/tools/TodoTool.js +220 -0
- package/build/main/lib/tools/WebSearchTool.d.ts +9 -0
- package/build/main/lib/tools/WebSearchTool.js +92 -0
- package/build/main/lib/tools/WriteFileTool.d.ts +10 -0
- package/build/main/lib/tools/WriteFileTool.js +74 -0
- package/build/main/lib/utils/debuglogger.d.ts +7 -0
- package/build/main/lib/utils/debuglogger.js +25 -0
- package/build/main/lib/utils/helpers.d.ts +4 -0
- package/build/main/lib/utils/helpers.js +41 -0
- package/build/module/index.d.ts +5 -0
- package/build/module/index.js +29 -7
- package/build/module/lib/PSAI.d.ts +4 -0
- package/build/module/lib/PSAI.js +101 -24
- package/build/module/lib/PSAgent.d.ts +21 -10
- package/build/module/lib/PSAgent.js +126 -85
- package/build/module/lib/PSAgentConfig.d.ts +23 -0
- package/build/module/lib/PSAgentConfig.js +3 -0
- package/build/module/lib/PSAgentLogger.d.ts +20 -0
- package/build/module/lib/PSAgentLogger.js +51 -0
- package/build/module/lib/PSAgentTask.d.ts +12 -0
- package/build/module/lib/PSAgentTask.js +33 -0
- package/build/module/lib/PSAgentTool.d.ts +56 -0
- package/build/module/lib/PSAgentTool.js +91 -0
- package/build/module/lib/jwt.d.ts +41 -0
- package/build/module/lib/jwt.js +75 -0
- package/build/module/lib/tools/BraveWebSearchTool.d.ts +11 -0
- package/build/module/lib/tools/BraveWebSearchTool.js +90 -0
- package/build/module/lib/tools/PSArtifactTool.d.ts +7 -0
- package/build/module/lib/tools/PSArtifactTool.js +79 -0
- package/build/module/lib/tools/PSCommandLineTool.d.ts +10 -0
- package/build/module/lib/tools/PSCommandLineTool.js +75 -0
- package/build/module/lib/tools/PSMemoryTool.d.ts +45 -0
- package/build/module/lib/tools/PSMemoryTool.js +487 -0
- package/build/module/lib/tools/PSReadFileTool.d.ts +10 -0
- package/build/module/lib/tools/PSReadFileTool.js +68 -0
- package/build/module/lib/tools/PSSubAgentTool.d.ts +20 -0
- package/build/module/lib/tools/PSSubAgentTool.js +289 -0
- package/build/module/lib/tools/PSWriteFileTool.d.ts +10 -0
- package/build/module/lib/tools/PSWriteFileTool.js +74 -0
- package/build/module/lib/tools/TodoTool.d.ts +57 -0
- package/build/module/lib/tools/TodoTool.js +224 -0
- package/build/module/lib/utils/debuglogger.d.ts +7 -0
- package/build/module/lib/utils/debuglogger.js +25 -0
- package/build/module/lib/utils/helpers.d.ts +4 -0
- package/build/module/lib/utils/helpers.js +41 -0
- package/package.json +1 -1
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.PSTodoWriteTool = exports.PSTodoReadTool = exports.TaskStore = exports.TodoPriority = exports.TodoStatus = void 0;
|
|
8
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
9
|
+
const v4_1 = require("zod/v4");
|
|
10
|
+
const PSAgentTool_1 = require("../PSAgentTool");
|
|
11
|
+
var TodoStatus;
|
|
12
|
+
(function (TodoStatus) {
|
|
13
|
+
TodoStatus["PENDING"] = "pending";
|
|
14
|
+
TodoStatus["IN_PROGRESS"] = "in_progress";
|
|
15
|
+
TodoStatus["COMPLETED"] = "completed";
|
|
16
|
+
})(TodoStatus || (exports.TodoStatus = TodoStatus = {}));
|
|
17
|
+
var TodoPriority;
|
|
18
|
+
(function (TodoPriority) {
|
|
19
|
+
TodoPriority["HIGH"] = "high";
|
|
20
|
+
TodoPriority["MEDIUM"] = "medium";
|
|
21
|
+
TodoPriority["LOW"] = "low";
|
|
22
|
+
})(TodoPriority || (exports.TodoPriority = TodoPriority = {}));
|
|
23
|
+
class TaskStore {
|
|
24
|
+
lastModified = new Date().toISOString();
|
|
25
|
+
todos;
|
|
26
|
+
filename;
|
|
27
|
+
constructor(todos, filename) {
|
|
28
|
+
this.lastModified = new Date().toISOString();
|
|
29
|
+
this.todos = todos || [];
|
|
30
|
+
this.filename = filename;
|
|
31
|
+
if (filename) {
|
|
32
|
+
try {
|
|
33
|
+
if (node_fs_1.default.existsSync(filename)) {
|
|
34
|
+
const data = node_fs_1.default.readFileSync(filename, 'utf-8');
|
|
35
|
+
this.todos = JSON.parse(data);
|
|
36
|
+
this.lastModified = new Date().toISOString();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error("Error loading todos from file:", error);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
get LastModified() {
|
|
45
|
+
return this.lastModified;
|
|
46
|
+
}
|
|
47
|
+
get Todos() {
|
|
48
|
+
return this.todos;
|
|
49
|
+
}
|
|
50
|
+
set Todos(todos) {
|
|
51
|
+
this.todos = todos;
|
|
52
|
+
this.lastModified = new Date().toISOString();
|
|
53
|
+
if (this.filename) {
|
|
54
|
+
node_fs_1.default.writeFileSync(this.filename, JSON.stringify(this.todos, null, 2));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.TaskStore = TaskStore;
|
|
59
|
+
class PSTodoReadTool extends PSAgentTool_1.PSAgentTool {
|
|
60
|
+
static toolName = "read_todo";
|
|
61
|
+
store;
|
|
62
|
+
constructor(options) {
|
|
63
|
+
super({
|
|
64
|
+
name: PSTodoReadTool.toolName,
|
|
65
|
+
description: `Read the current task list.\nReturns a list of todos with their current state.`,
|
|
66
|
+
type: "API",
|
|
67
|
+
local_execution: true,
|
|
68
|
+
hitl: true,
|
|
69
|
+
inputschema: {
|
|
70
|
+
url: "http://localhost/read_todo",
|
|
71
|
+
method: "POST",
|
|
72
|
+
requestBody: v4_1.z.toJSONSchema(v4_1.z.null().meta({
|
|
73
|
+
title: "read_todo_request_body",
|
|
74
|
+
description: "The request body parameters for the read_todo tool.",
|
|
75
|
+
}), { "io": "input" }),
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
this.store = options.store || new TaskStore([]);
|
|
79
|
+
}
|
|
80
|
+
run(_input, log) {
|
|
81
|
+
const logger = log || console;
|
|
82
|
+
return new Promise((resolve, reject) => {
|
|
83
|
+
try {
|
|
84
|
+
logger.info(`📋 Referring to tasks list.`);
|
|
85
|
+
const output = this.store.Todos;
|
|
86
|
+
return resolve({
|
|
87
|
+
status: 'success',
|
|
88
|
+
output,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
logger.error('Error reading todos:', error);
|
|
93
|
+
reject(error);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.PSTodoReadTool = PSTodoReadTool;
|
|
99
|
+
class PSTodoWriteTool extends PSAgentTool_1.PSAgentTool {
|
|
100
|
+
static toolName = "write_todo";
|
|
101
|
+
store;
|
|
102
|
+
constructor(options) {
|
|
103
|
+
super({
|
|
104
|
+
name: PSTodoWriteTool.toolName,
|
|
105
|
+
description: `Update the entire task list (complete replacement).
|
|
106
|
+
Parameters:
|
|
107
|
+
todos: List of todo items, each containing:
|
|
108
|
+
- id: Unique identifier for the task
|
|
109
|
+
- content: Task description
|
|
110
|
+
- status: Current status (pending, in_progress, completed)
|
|
111
|
+
- priority: Task priority (high, medium, low)
|
|
112
|
+
- metadata: Optional additional data
|
|
113
|
+
|
|
114
|
+
Returns success status and count of todos written.`,
|
|
115
|
+
type: "API",
|
|
116
|
+
local_execution: true,
|
|
117
|
+
hitl: true,
|
|
118
|
+
inputschema: {
|
|
119
|
+
url: "http://localhost/write_todo",
|
|
120
|
+
method: "POST",
|
|
121
|
+
requestBody: v4_1.z.toJSONSchema(v4_1.z.object({
|
|
122
|
+
todos: v4_1.z.array(v4_1.z.object({
|
|
123
|
+
id: v4_1.z.string().meta({
|
|
124
|
+
title: "id",
|
|
125
|
+
description: "The unique identifier for the todo item."
|
|
126
|
+
}),
|
|
127
|
+
content: v4_1.z.string().max(500).meta({
|
|
128
|
+
title: "content",
|
|
129
|
+
description: "The content of the todo item.",
|
|
130
|
+
}),
|
|
131
|
+
status: v4_1.z.enum(TodoStatus).meta({
|
|
132
|
+
title: "status",
|
|
133
|
+
description: "The current status of the todo item."
|
|
134
|
+
}),
|
|
135
|
+
priority: v4_1.z.enum(TodoPriority).meta({
|
|
136
|
+
title: "priority",
|
|
137
|
+
description: "The priority level of the todo item."
|
|
138
|
+
}),
|
|
139
|
+
created_at: v4_1.z.iso.date().meta({
|
|
140
|
+
title: "created_at",
|
|
141
|
+
description: "The creation date of the todo item."
|
|
142
|
+
}),
|
|
143
|
+
updated_at: v4_1.z.iso.date().meta({
|
|
144
|
+
title: "updated_at",
|
|
145
|
+
description: "The last update date of the todo item."
|
|
146
|
+
}),
|
|
147
|
+
metadata: v4_1.z.record(v4_1.z.string(), v4_1.z.any()).optional().meta({
|
|
148
|
+
description: "Additional metadata for the todo item."
|
|
149
|
+
})
|
|
150
|
+
})).meta({
|
|
151
|
+
title: "todos",
|
|
152
|
+
description: "The list of todos to write."
|
|
153
|
+
}),
|
|
154
|
+
}).meta({
|
|
155
|
+
title: "write_todo_request_body",
|
|
156
|
+
description: "The request body parameters for the write_todo tool.",
|
|
157
|
+
}), { "io": "input" }),
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
this.store = options.store || new TaskStore([]);
|
|
161
|
+
}
|
|
162
|
+
get Todos() {
|
|
163
|
+
return this.store.Todos;
|
|
164
|
+
}
|
|
165
|
+
run(input, log) {
|
|
166
|
+
if (!input.todos || !Array.isArray(input.todos)) {
|
|
167
|
+
throw new Error("Invalid todos provided.");
|
|
168
|
+
}
|
|
169
|
+
const logger = log || console;
|
|
170
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
171
|
+
let updateCount = 0;
|
|
172
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
173
|
+
let addCount = 0;
|
|
174
|
+
return new Promise((resolve, reject) => {
|
|
175
|
+
const todos = input.todos;
|
|
176
|
+
try {
|
|
177
|
+
//logger.info(`🛠️ Writing \`${todos.length}\` todos.`);
|
|
178
|
+
for (const t of todos) {
|
|
179
|
+
const idx = this.store.Todos.findIndex((todo) => todo.id === t.id);
|
|
180
|
+
if (idx >= 0) {
|
|
181
|
+
updateCount++;
|
|
182
|
+
this.store.Todos[idx] = {
|
|
183
|
+
id: t.id,
|
|
184
|
+
content: t.content,
|
|
185
|
+
status: t.status,
|
|
186
|
+
priority: t.priority,
|
|
187
|
+
created_at: t.created_at,
|
|
188
|
+
updated_at: t.updated_at,
|
|
189
|
+
metadata: t.metadata || {}
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
addCount++;
|
|
194
|
+
this.store.Todos.push({
|
|
195
|
+
id: t.id,
|
|
196
|
+
content: t.content,
|
|
197
|
+
status: t.status,
|
|
198
|
+
priority: t.priority,
|
|
199
|
+
created_at: t.created_at,
|
|
200
|
+
updated_at: t.updated_at,
|
|
201
|
+
metadata: t.metadata || {}
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
const output = `📋 Updated task list with ${todos.length} items.`;
|
|
206
|
+
logger.info(output);
|
|
207
|
+
console.info("Tasks:");
|
|
208
|
+
for (const todo of this.store.Todos) {
|
|
209
|
+
console.info(`- [${todo.status === TodoStatus.COMPLETED ? '✅' : (todo.status === TodoStatus.IN_PROGRESS ? '⏳' : ' ')}] (${todo.priority}) ${todo.content} (ID: ${todo.id})`);
|
|
210
|
+
}
|
|
211
|
+
return resolve({
|
|
212
|
+
status: 'success',
|
|
213
|
+
output,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
logger.error('Error writing todos:', error);
|
|
218
|
+
reject(error);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
exports.PSTodoWriteTool = PSTodoWriteTool;
|
|
224
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9kb1Rvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Rvb2xzL1RvZG9Ub29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx1REFBdUQ7Ozs7OztBQUV2RCxzREFBeUI7QUFFekIsK0JBQTJCO0FBRzNCLGdEQUE2QztBQUU3QyxJQUFZLFVBSVg7QUFKRCxXQUFZLFVBQVU7SUFDbEIsaUNBQW1CLENBQUE7SUFDbkIseUNBQTJCLENBQUE7SUFDM0IscUNBQXVCLENBQUE7QUFDM0IsQ0FBQyxFQUpXLFVBQVUsMEJBQVYsVUFBVSxRQUlyQjtBQUVELElBQVksWUFJWDtBQUpELFdBQVksWUFBWTtJQUNwQiw2QkFBYSxDQUFBO0lBQ2IsaUNBQWlCLENBQUE7SUFDakIsMkJBQVcsQ0FBQTtBQUNmLENBQUMsRUFKVyxZQUFZLDRCQUFaLFlBQVksUUFJdkI7QUFZRCxNQUFhLFNBQVM7SUFDVixZQUFZLEdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNoRCxLQUFLLENBQVM7SUFDZCxRQUFRLENBQVM7SUFDekIsWUFBWSxLQUFhLEVBQUUsUUFBZ0I7UUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDO2dCQUNILElBQUksaUJBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDNUIsTUFBTSxJQUFJLEdBQUcsaUJBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNoRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFB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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export default function debugLogger(prefix: string): {
|
|
2
|
+
debug: (msg: string, ...args: any[]) => void;
|
|
3
|
+
info: (msg: string, ...args: any[]) => void;
|
|
4
|
+
warn: (msg: string, ...args: any[]) => void;
|
|
5
|
+
error: (msg: string, ...args: any[]) => void;
|
|
6
|
+
done: (msg: string, ...args: any[]) => void;
|
|
7
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.default = debugLogger;
|
|
8
|
+
const debug_1 = __importDefault(require("debug"));
|
|
9
|
+
function debugLogger(prefix) {
|
|
10
|
+
const logFn = (0, debug_1.default)(prefix);
|
|
11
|
+
logFn.enabled = true;
|
|
12
|
+
const debugLog = logFn.extend('debug');
|
|
13
|
+
const infoLog = logFn.extend('info');
|
|
14
|
+
const warnLog = logFn.extend('warn');
|
|
15
|
+
const errorLog = logFn.extend('error');
|
|
16
|
+
const doneLog = logFn.extend('done');
|
|
17
|
+
return {
|
|
18
|
+
debug: (msg, ...args) => debugLog(msg, ...args),
|
|
19
|
+
info: (msg, ...args) => infoLog(msg, ...args),
|
|
20
|
+
warn: (msg, ...args) => warnLog(msg, ...args),
|
|
21
|
+
error: (msg, ...args) => errorLog(msg, ...args),
|
|
22
|
+
done: (msg, ...args) => doneLog(msg, ...args),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVidWdsb2dnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3V0aWxzL2RlYnVnbG9nZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx1REFBdUQ7Ozs7O0FBSXZELDhCQWVDO0FBakJELGtEQUEwQjtBQUUxQixTQUF3QixXQUFXLENBQUMsTUFBYztJQUNoRCxNQUFNLEtBQUssR0FBRyxJQUFBLGVBQUssRUFBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUNyQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsT0FBTztRQUNMLEtBQUssRUFBRSxDQUFDLEdBQVcsRUFBRSxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztRQUM5RCxJQUFJLEVBQUUsQ0FBQyxHQUFXLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDNUQsSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLEdBQUcsSUFBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQzVELEtBQUssRUFBRSxDQUFDLEdBQVcsRUFBRSxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztRQUM5RCxJQUFJLEVBQUUsQ0FBQyxHQUFXLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7S0FDN0QsQ0FBQztBQUNKLENBQUMifQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function sleep(ms: number): Promise<unknown>;
|
|
2
|
+
export declare function formatFileSize(bytes: number, decimalPoint?: number): string;
|
|
3
|
+
export declare function truncateString(str: string, num: number): string;
|
|
4
|
+
export declare function unEscapeHTML(text: string): string;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sleep = sleep;
|
|
4
|
+
exports.formatFileSize = formatFileSize;
|
|
5
|
+
exports.truncateString = truncateString;
|
|
6
|
+
exports.unEscapeHTML = unEscapeHTML;
|
|
7
|
+
async function sleep(ms) {
|
|
8
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
9
|
+
}
|
|
10
|
+
function formatFileSize(bytes, decimalPoint = 2) {
|
|
11
|
+
if (bytes === 0)
|
|
12
|
+
return '0 Bytes';
|
|
13
|
+
const k = 1024;
|
|
14
|
+
const dm = decimalPoint < 0 ? 0 : decimalPoint;
|
|
15
|
+
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
|
16
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
17
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
|
|
18
|
+
}
|
|
19
|
+
function truncateString(str, num) {
|
|
20
|
+
if (str.length <= num) {
|
|
21
|
+
return str;
|
|
22
|
+
}
|
|
23
|
+
return str.slice(0, num) + '...';
|
|
24
|
+
}
|
|
25
|
+
function unEscapeHTML(text) {
|
|
26
|
+
const map = {
|
|
27
|
+
'&': '&',
|
|
28
|
+
'<': '<',
|
|
29
|
+
'>': '>',
|
|
30
|
+
'"': '"',
|
|
31
|
+
''': "'",
|
|
32
|
+
};
|
|
33
|
+
let result = text.replace(/&|<|>|"|'/g, function (m) { return map[m]; });
|
|
34
|
+
// Unescape Unicode sequences
|
|
35
|
+
result = result.replace(/\\u[\dA-Fa-f]{4}/g, (unicode) => {
|
|
36
|
+
const codePoint = parseInt(unicode.slice(2), 16);
|
|
37
|
+
return String.fromCharCode(codePoint);
|
|
38
|
+
});
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdXRpbHMvaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNCQUVDO0FBR0Qsd0NBT0M7QUFFRCx3Q0FLQztBQUVELG9DQWdCQztBQXJDTSxLQUFLLFVBQVUsS0FBSyxDQUFDLEVBQVU7SUFDcEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBR0QsU0FBZ0IsY0FBYyxDQUFDLEtBQWEsRUFBRSxZQUFZLEdBQUcsQ0FBQztJQUM1RCxJQUFJLEtBQUssS0FBSyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2YsTUFBTSxFQUFFLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFDL0MsTUFBTSxLQUFLLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQsT0FBTyxVQUFVLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMsR0FBVyxFQUFFLEdBQVc7SUFDckQsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ25DLENBQUM7QUFFRCxTQUFnQixZQUFZLENBQUMsSUFBWTtJQUV2QyxNQUFNLEdBQUcsR0FBMkI7UUFDbEMsT0FBTyxFQUFFLEdBQUc7UUFDWixNQUFNLEVBQUUsR0FBRztRQUNYLE1BQU0sRUFBRSxHQUFHO1FBQ1gsUUFBUSxFQUFFLEdBQUc7UUFDYixRQUFRLEVBQUUsR0FBRztLQUNkLENBQUM7SUFDRixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxFQUFFLFVBQVMsQ0FBQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUYsNkJBQTZCO0lBQzdCLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDckQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakQsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyJ9
|