praisonai 1.2.2 → 1.2.3
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/simple.js +1 -1
- package/dist/cli/commands/auto.d.ts +12 -0
- package/dist/cli/commands/auto.js +109 -0
- package/dist/cli/commands/autonomy.d.ts +5 -0
- package/dist/cli/commands/autonomy.js +152 -0
- package/dist/cli/commands/cache.d.ts +9 -0
- package/dist/cli/commands/cache.js +143 -0
- package/dist/cli/commands/chat.d.ts +14 -0
- package/dist/cli/commands/chat.js +127 -0
- package/dist/cli/commands/checkpoints.d.ts +5 -0
- package/dist/cli/commands/checkpoints.js +236 -0
- package/dist/cli/commands/context.d.ts +11 -0
- package/dist/cli/commands/context.js +182 -0
- package/dist/cli/commands/cost.d.ts +5 -0
- package/dist/cli/commands/cost.js +146 -0
- package/dist/cli/commands/db.d.ts +9 -0
- package/dist/cli/commands/db.js +149 -0
- package/dist/cli/commands/eval.d.ts +17 -0
- package/dist/cli/commands/eval.js +247 -0
- package/dist/cli/commands/external-agents.d.ts +5 -0
- package/dist/cli/commands/external-agents.js +169 -0
- package/dist/cli/commands/fast-context.d.ts +5 -0
- package/dist/cli/commands/fast-context.js +126 -0
- package/dist/cli/commands/flow.d.ts +5 -0
- package/dist/cli/commands/flow.js +141 -0
- package/dist/cli/commands/git.d.ts +5 -0
- package/dist/cli/commands/git.js +178 -0
- package/dist/cli/commands/graph-rag.d.ts +9 -0
- package/dist/cli/commands/graph-rag.js +131 -0
- package/dist/cli/commands/guardrail.d.ts +11 -0
- package/dist/cli/commands/guardrail.js +156 -0
- package/dist/cli/commands/handoff.d.ts +9 -0
- package/dist/cli/commands/handoff.js +133 -0
- package/dist/cli/commands/help.d.ts +8 -0
- package/dist/cli/commands/help.js +167 -0
- package/dist/cli/commands/image.d.ts +13 -0
- package/dist/cli/commands/image.js +192 -0
- package/dist/cli/commands/interactive.d.ts +6 -0
- package/dist/cli/commands/interactive.js +79 -0
- package/dist/cli/commands/jobs.d.ts +5 -0
- package/dist/cli/commands/jobs.js +282 -0
- package/dist/cli/commands/knowledge.d.ts +9 -0
- package/dist/cli/commands/knowledge.js +226 -0
- package/dist/cli/commands/mcp.d.ts +9 -0
- package/dist/cli/commands/mcp.js +243 -0
- package/dist/cli/commands/memory.d.ts +10 -0
- package/dist/cli/commands/memory.js +198 -0
- package/dist/cli/commands/n8n.d.ts +5 -0
- package/dist/cli/commands/n8n.js +137 -0
- package/dist/cli/commands/observability.d.ts +9 -0
- package/dist/cli/commands/observability.js +145 -0
- package/dist/cli/commands/planning.d.ts +9 -0
- package/dist/cli/commands/planning.js +167 -0
- package/dist/cli/commands/prompt-expand.d.ts +11 -0
- package/dist/cli/commands/prompt-expand.js +100 -0
- package/dist/cli/commands/providers.d.ts +9 -0
- package/dist/cli/commands/providers.js +98 -0
- package/dist/cli/commands/query-rewrite.d.ts +12 -0
- package/dist/cli/commands/query-rewrite.js +102 -0
- package/dist/cli/commands/repo-map.d.ts +5 -0
- package/dist/cli/commands/repo-map.js +151 -0
- package/dist/cli/commands/reranker.d.ts +10 -0
- package/dist/cli/commands/reranker.js +144 -0
- package/dist/cli/commands/research.d.ts +12 -0
- package/dist/cli/commands/research.js +108 -0
- package/dist/cli/commands/router.d.ts +11 -0
- package/dist/cli/commands/router.js +142 -0
- package/dist/cli/commands/run.d.ts +14 -0
- package/dist/cli/commands/run.js +111 -0
- package/dist/cli/commands/sandbox.d.ts +5 -0
- package/dist/cli/commands/sandbox.js +135 -0
- package/dist/cli/commands/scheduler.d.ts +5 -0
- package/dist/cli/commands/scheduler.js +260 -0
- package/dist/cli/commands/session.d.ts +9 -0
- package/dist/cli/commands/session.js +238 -0
- package/dist/cli/commands/skills.d.ts +9 -0
- package/dist/cli/commands/skills.js +256 -0
- package/dist/cli/commands/telemetry.d.ts +9 -0
- package/dist/cli/commands/telemetry.js +146 -0
- package/dist/cli/commands/tools.d.ts +9 -0
- package/dist/cli/commands/tools.js +172 -0
- package/dist/cli/commands/vector.d.ts +10 -0
- package/dist/cli/commands/vector.js +171 -0
- package/dist/cli/commands/version.d.ts +8 -0
- package/dist/cli/commands/version.js +68 -0
- package/dist/cli/commands/voice.d.ts +10 -0
- package/dist/cli/commands/voice.js +162 -0
- package/dist/cli/commands/workflow.d.ts +13 -0
- package/dist/cli/commands/workflow.js +184 -0
- package/dist/cli/config/index.d.ts +6 -0
- package/dist/cli/config/index.js +22 -0
- package/dist/cli/config/load.d.ts +20 -0
- package/dist/cli/config/load.js +229 -0
- package/dist/cli/config/resolve.d.ts +28 -0
- package/dist/cli/config/resolve.js +70 -0
- package/dist/cli/config/schema.d.ts +15 -0
- package/dist/cli/config/schema.js +65 -0
- package/dist/cli/features/autonomy-mode.d.ts +98 -0
- package/dist/cli/features/autonomy-mode.js +266 -0
- package/dist/cli/features/background-jobs.d.ts +155 -0
- package/dist/cli/features/background-jobs.js +416 -0
- package/dist/cli/features/checkpoints.d.ts +126 -0
- package/dist/cli/features/checkpoints.js +288 -0
- package/dist/cli/features/cost-tracker.d.ts +101 -0
- package/dist/cli/features/cost-tracker.js +212 -0
- package/dist/cli/features/external-agents.d.ts +115 -0
- package/dist/cli/features/external-agents.js +294 -0
- package/dist/cli/features/fast-context.d.ts +126 -0
- package/dist/cli/features/fast-context.js +310 -0
- package/dist/cli/features/flow-display.d.ts +100 -0
- package/dist/cli/features/flow-display.js +254 -0
- package/dist/cli/features/git-integration.d.ts +138 -0
- package/dist/cli/features/git-integration.js +374 -0
- package/dist/cli/features/index.d.ts +17 -0
- package/dist/cli/features/index.js +102 -0
- package/dist/cli/features/interactive-tui.d.ts +114 -0
- package/dist/cli/features/interactive-tui.js +326 -0
- package/dist/cli/features/n8n-integration.d.ts +108 -0
- package/dist/cli/features/n8n-integration.js +296 -0
- package/dist/cli/features/repo-map.d.ts +101 -0
- package/dist/cli/features/repo-map.js +350 -0
- package/dist/cli/features/sandbox-executor.d.ts +89 -0
- package/dist/cli/features/sandbox-executor.js +314 -0
- package/dist/cli/features/scheduler.d.ts +111 -0
- package/dist/cli/features/scheduler.js +298 -0
- package/dist/cli/features/slash-commands.d.ts +77 -0
- package/dist/cli/features/slash-commands.js +316 -0
- package/dist/cli/index.d.ts +19 -15
- package/dist/cli/index.js +163 -123
- package/dist/cli/output/errors.d.ts +32 -0
- package/dist/cli/output/errors.js +72 -0
- package/dist/cli/output/index.d.ts +6 -0
- package/dist/cli/output/index.js +22 -0
- package/dist/cli/output/json.d.ts +17 -0
- package/dist/cli/output/json.js +54 -0
- package/dist/cli/output/pretty.d.ts +21 -0
- package/dist/cli/output/pretty.js +106 -0
- package/dist/cli/runtime/env.d.ts +12 -0
- package/dist/cli/runtime/env.js +49 -0
- package/dist/cli/runtime/exit.d.ts +11 -0
- package/dist/cli/runtime/exit.js +49 -0
- package/dist/cli/runtime/index.d.ts +6 -0
- package/dist/cli/runtime/index.js +22 -0
- package/dist/cli/runtime/lazy.d.ts +18 -0
- package/dist/cli/runtime/lazy.js +85 -0
- package/dist/cli/spec/cli-spec.d.ts +87 -0
- package/dist/cli/spec/cli-spec.js +478 -0
- package/dist/cli/spec/index.d.ts +4 -0
- package/dist/cli/spec/index.js +20 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.js +100 -7
- package/dist/memory/auto-memory.d.ts +136 -0
- package/dist/memory/auto-memory.js +301 -0
- package/dist/memory/file-memory.d.ts +88 -0
- package/dist/memory/file-memory.js +287 -0
- package/dist/memory/index.d.ts +2 -0
- package/dist/memory/index.js +11 -1
- package/dist/workflows/loop.d.ts +0 -0
- package/dist/workflows/loop.js +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Background Jobs - Persisted job queue with adapter support
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.JobQueue = exports.FileJobStorage = exports.MemoryJobStorage = void 0;
|
|
40
|
+
exports.createJobQueue = createJobQueue;
|
|
41
|
+
exports.createFileJobStorage = createFileJobStorage;
|
|
42
|
+
/**
|
|
43
|
+
* In-memory job storage adapter
|
|
44
|
+
*/
|
|
45
|
+
class MemoryJobStorage {
|
|
46
|
+
constructor() {
|
|
47
|
+
this.jobs = new Map();
|
|
48
|
+
}
|
|
49
|
+
async save(job) {
|
|
50
|
+
this.jobs.set(job.id, { ...job });
|
|
51
|
+
}
|
|
52
|
+
async get(id) {
|
|
53
|
+
return this.jobs.get(id) || null;
|
|
54
|
+
}
|
|
55
|
+
async getAll() {
|
|
56
|
+
return Array.from(this.jobs.values());
|
|
57
|
+
}
|
|
58
|
+
async getByStatus(status) {
|
|
59
|
+
return Array.from(this.jobs.values()).filter(j => j.status === status);
|
|
60
|
+
}
|
|
61
|
+
async update(id, updates) {
|
|
62
|
+
const job = this.jobs.get(id);
|
|
63
|
+
if (job) {
|
|
64
|
+
this.jobs.set(id, { ...job, ...updates });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async delete(id) {
|
|
68
|
+
this.jobs.delete(id);
|
|
69
|
+
}
|
|
70
|
+
async clear() {
|
|
71
|
+
this.jobs.clear();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.MemoryJobStorage = MemoryJobStorage;
|
|
75
|
+
/**
|
|
76
|
+
* File-based job storage adapter
|
|
77
|
+
*/
|
|
78
|
+
class FileJobStorage {
|
|
79
|
+
constructor(filePath) {
|
|
80
|
+
this.jobs = new Map();
|
|
81
|
+
this.initialized = false;
|
|
82
|
+
this.filePath = filePath;
|
|
83
|
+
}
|
|
84
|
+
async init() {
|
|
85
|
+
if (this.initialized)
|
|
86
|
+
return;
|
|
87
|
+
try {
|
|
88
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
89
|
+
const content = await fs.readFile(this.filePath, 'utf-8');
|
|
90
|
+
const data = JSON.parse(content);
|
|
91
|
+
for (const job of data) {
|
|
92
|
+
job.createdAt = new Date(job.createdAt);
|
|
93
|
+
if (job.startedAt)
|
|
94
|
+
job.startedAt = new Date(job.startedAt);
|
|
95
|
+
if (job.completedAt)
|
|
96
|
+
job.completedAt = new Date(job.completedAt);
|
|
97
|
+
this.jobs.set(job.id, job);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// File doesn't exist yet
|
|
102
|
+
}
|
|
103
|
+
this.initialized = true;
|
|
104
|
+
}
|
|
105
|
+
async persist() {
|
|
106
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
107
|
+
const data = Array.from(this.jobs.values());
|
|
108
|
+
await fs.writeFile(this.filePath, JSON.stringify(data, null, 2));
|
|
109
|
+
}
|
|
110
|
+
async save(job) {
|
|
111
|
+
await this.init();
|
|
112
|
+
this.jobs.set(job.id, { ...job });
|
|
113
|
+
await this.persist();
|
|
114
|
+
}
|
|
115
|
+
async get(id) {
|
|
116
|
+
await this.init();
|
|
117
|
+
return this.jobs.get(id) || null;
|
|
118
|
+
}
|
|
119
|
+
async getAll() {
|
|
120
|
+
await this.init();
|
|
121
|
+
return Array.from(this.jobs.values());
|
|
122
|
+
}
|
|
123
|
+
async getByStatus(status) {
|
|
124
|
+
await this.init();
|
|
125
|
+
return Array.from(this.jobs.values()).filter(j => j.status === status);
|
|
126
|
+
}
|
|
127
|
+
async update(id, updates) {
|
|
128
|
+
await this.init();
|
|
129
|
+
const job = this.jobs.get(id);
|
|
130
|
+
if (job) {
|
|
131
|
+
this.jobs.set(id, { ...job, ...updates });
|
|
132
|
+
await this.persist();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async delete(id) {
|
|
136
|
+
await this.init();
|
|
137
|
+
this.jobs.delete(id);
|
|
138
|
+
await this.persist();
|
|
139
|
+
}
|
|
140
|
+
async clear() {
|
|
141
|
+
this.jobs.clear();
|
|
142
|
+
await this.persist();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
exports.FileJobStorage = FileJobStorage;
|
|
146
|
+
/**
|
|
147
|
+
* Job Queue class
|
|
148
|
+
*/
|
|
149
|
+
class JobQueue {
|
|
150
|
+
constructor(config = {}) {
|
|
151
|
+
this.handlers = new Map();
|
|
152
|
+
this.running = false;
|
|
153
|
+
this.activeJobs = 0;
|
|
154
|
+
this.config = {
|
|
155
|
+
name: 'default',
|
|
156
|
+
concurrency: 1,
|
|
157
|
+
maxAttempts: 3,
|
|
158
|
+
retryDelay: 1000,
|
|
159
|
+
...config
|
|
160
|
+
};
|
|
161
|
+
this.storage = config.storage || new MemoryJobStorage();
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Register a job handler
|
|
165
|
+
*/
|
|
166
|
+
register(name, handler) {
|
|
167
|
+
this.handlers.set(name, handler);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Add a job to the queue
|
|
171
|
+
*/
|
|
172
|
+
async add(name, data, options = {}) {
|
|
173
|
+
const job = {
|
|
174
|
+
id: `job_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
|
|
175
|
+
name,
|
|
176
|
+
data,
|
|
177
|
+
status: 'pending',
|
|
178
|
+
priority: options.priority || 'normal',
|
|
179
|
+
attempts: 0,
|
|
180
|
+
maxAttempts: options.maxAttempts || this.config.maxAttempts || 3,
|
|
181
|
+
createdAt: new Date(),
|
|
182
|
+
metadata: options.metadata
|
|
183
|
+
};
|
|
184
|
+
await this.storage.save(job);
|
|
185
|
+
return job;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get a job by ID
|
|
189
|
+
*/
|
|
190
|
+
async get(id) {
|
|
191
|
+
return this.storage.get(id);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Get all jobs
|
|
195
|
+
*/
|
|
196
|
+
async getAll() {
|
|
197
|
+
return this.storage.getAll();
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Get jobs by status
|
|
201
|
+
*/
|
|
202
|
+
async getByStatus(status) {
|
|
203
|
+
return this.storage.getByStatus(status);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Cancel a job
|
|
207
|
+
*/
|
|
208
|
+
async cancel(id) {
|
|
209
|
+
const job = await this.storage.get(id);
|
|
210
|
+
if (!job || job.status === 'running' || job.status === 'completed') {
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
await this.storage.update(id, { status: 'cancelled' });
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Retry a failed job
|
|
218
|
+
*/
|
|
219
|
+
async retry(id) {
|
|
220
|
+
const job = await this.storage.get(id);
|
|
221
|
+
if (!job || job.status !== 'failed') {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
await this.storage.update(id, {
|
|
225
|
+
status: 'pending',
|
|
226
|
+
attempts: 0,
|
|
227
|
+
error: undefined
|
|
228
|
+
});
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Start processing jobs
|
|
233
|
+
*/
|
|
234
|
+
start() {
|
|
235
|
+
if (this.running)
|
|
236
|
+
return;
|
|
237
|
+
this.running = true;
|
|
238
|
+
this.processInterval = setInterval(() => this.process(), 100);
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Stop processing jobs
|
|
242
|
+
*/
|
|
243
|
+
stop() {
|
|
244
|
+
this.running = false;
|
|
245
|
+
if (this.processInterval) {
|
|
246
|
+
clearInterval(this.processInterval);
|
|
247
|
+
this.processInterval = undefined;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Process pending jobs
|
|
252
|
+
*/
|
|
253
|
+
async process() {
|
|
254
|
+
if (!this.running)
|
|
255
|
+
return;
|
|
256
|
+
if (this.activeJobs >= (this.config.concurrency || 1))
|
|
257
|
+
return;
|
|
258
|
+
const pendingJobs = await this.storage.getByStatus('pending');
|
|
259
|
+
// Sort by priority and creation time
|
|
260
|
+
const priorityOrder = {
|
|
261
|
+
critical: 0,
|
|
262
|
+
high: 1,
|
|
263
|
+
normal: 2,
|
|
264
|
+
low: 3
|
|
265
|
+
};
|
|
266
|
+
pendingJobs.sort((a, b) => {
|
|
267
|
+
const priorityDiff = priorityOrder[a.priority] - priorityOrder[b.priority];
|
|
268
|
+
if (priorityDiff !== 0)
|
|
269
|
+
return priorityDiff;
|
|
270
|
+
return a.createdAt.getTime() - b.createdAt.getTime();
|
|
271
|
+
});
|
|
272
|
+
for (const job of pendingJobs) {
|
|
273
|
+
if (this.activeJobs >= (this.config.concurrency || 1))
|
|
274
|
+
break;
|
|
275
|
+
this.runJob(job);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Run a single job
|
|
280
|
+
*/
|
|
281
|
+
async runJob(job) {
|
|
282
|
+
const handler = this.handlers.get(job.name);
|
|
283
|
+
if (!handler) {
|
|
284
|
+
await this.storage.update(job.id, {
|
|
285
|
+
status: 'failed',
|
|
286
|
+
error: `No handler registered for job type: ${job.name}`
|
|
287
|
+
});
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
this.activeJobs++;
|
|
291
|
+
await this.storage.update(job.id, {
|
|
292
|
+
status: 'running',
|
|
293
|
+
startedAt: new Date(),
|
|
294
|
+
attempts: job.attempts + 1
|
|
295
|
+
});
|
|
296
|
+
const context = {
|
|
297
|
+
updateProgress: async (progress) => {
|
|
298
|
+
await this.storage.update(job.id, { progress });
|
|
299
|
+
},
|
|
300
|
+
log: (message) => {
|
|
301
|
+
console.log(`[Job ${job.id}] ${message}`);
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
try {
|
|
305
|
+
const result = await handler(job, context);
|
|
306
|
+
await this.storage.update(job.id, {
|
|
307
|
+
status: 'completed',
|
|
308
|
+
completedAt: new Date(),
|
|
309
|
+
result,
|
|
310
|
+
progress: 100
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
const attempts = job.attempts + 1;
|
|
315
|
+
if (attempts < job.maxAttempts) {
|
|
316
|
+
// Retry after delay
|
|
317
|
+
setTimeout(async () => {
|
|
318
|
+
await this.storage.update(job.id, {
|
|
319
|
+
status: 'pending',
|
|
320
|
+
error: error.message
|
|
321
|
+
});
|
|
322
|
+
}, this.config.retryDelay || 1000);
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
await this.storage.update(job.id, {
|
|
326
|
+
status: 'failed',
|
|
327
|
+
completedAt: new Date(),
|
|
328
|
+
error: error.message
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
finally {
|
|
333
|
+
this.activeJobs--;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Process a job immediately (bypass queue)
|
|
338
|
+
*/
|
|
339
|
+
async processNow(id) {
|
|
340
|
+
const job = await this.storage.get(id);
|
|
341
|
+
if (!job)
|
|
342
|
+
throw new Error(`Job ${id} not found`);
|
|
343
|
+
const handler = this.handlers.get(job.name);
|
|
344
|
+
if (!handler)
|
|
345
|
+
throw new Error(`No handler for job type: ${job.name}`);
|
|
346
|
+
await this.storage.update(job.id, {
|
|
347
|
+
status: 'running',
|
|
348
|
+
startedAt: new Date()
|
|
349
|
+
});
|
|
350
|
+
const context = {
|
|
351
|
+
updateProgress: async (progress) => {
|
|
352
|
+
await this.storage.update(job.id, { progress });
|
|
353
|
+
},
|
|
354
|
+
log: console.log
|
|
355
|
+
};
|
|
356
|
+
try {
|
|
357
|
+
const result = await handler(job, context);
|
|
358
|
+
await this.storage.update(job.id, {
|
|
359
|
+
status: 'completed',
|
|
360
|
+
completedAt: new Date(),
|
|
361
|
+
result
|
|
362
|
+
});
|
|
363
|
+
return result;
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
await this.storage.update(job.id, {
|
|
367
|
+
status: 'failed',
|
|
368
|
+
completedAt: new Date(),
|
|
369
|
+
error: error.message
|
|
370
|
+
});
|
|
371
|
+
throw error;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Get queue stats
|
|
376
|
+
*/
|
|
377
|
+
async getStats() {
|
|
378
|
+
const all = await this.storage.getAll();
|
|
379
|
+
return {
|
|
380
|
+
pending: all.filter(j => j.status === 'pending').length,
|
|
381
|
+
running: all.filter(j => j.status === 'running').length,
|
|
382
|
+
completed: all.filter(j => j.status === 'completed').length,
|
|
383
|
+
failed: all.filter(j => j.status === 'failed').length,
|
|
384
|
+
cancelled: all.filter(j => j.status === 'cancelled').length
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Clear completed/failed jobs
|
|
389
|
+
*/
|
|
390
|
+
async cleanup(olderThan) {
|
|
391
|
+
const all = await this.storage.getAll();
|
|
392
|
+
let count = 0;
|
|
393
|
+
for (const job of all) {
|
|
394
|
+
if (job.status === 'completed' || job.status === 'failed' || job.status === 'cancelled') {
|
|
395
|
+
if (!olderThan || (job.completedAt && job.completedAt < olderThan)) {
|
|
396
|
+
await this.storage.delete(job.id);
|
|
397
|
+
count++;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return count;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
exports.JobQueue = JobQueue;
|
|
405
|
+
/**
|
|
406
|
+
* Create a job queue
|
|
407
|
+
*/
|
|
408
|
+
function createJobQueue(config) {
|
|
409
|
+
return new JobQueue(config);
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Create a file-based job storage
|
|
413
|
+
*/
|
|
414
|
+
function createFileJobStorage(filePath) {
|
|
415
|
+
return new FileJobStorage(filePath);
|
|
416
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checkpoints - Snapshot session/run state for recovery
|
|
3
|
+
*/
|
|
4
|
+
export interface CheckpointData {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
timestamp: Date;
|
|
8
|
+
sessionId?: string;
|
|
9
|
+
runId?: string;
|
|
10
|
+
agentId?: string;
|
|
11
|
+
state: Record<string, any>;
|
|
12
|
+
messages?: any[];
|
|
13
|
+
metadata?: Record<string, any>;
|
|
14
|
+
}
|
|
15
|
+
export interface CheckpointConfig {
|
|
16
|
+
storage?: CheckpointStorage;
|
|
17
|
+
autoSave?: boolean;
|
|
18
|
+
autoSaveInterval?: number;
|
|
19
|
+
maxCheckpoints?: number;
|
|
20
|
+
}
|
|
21
|
+
export interface CheckpointStorage {
|
|
22
|
+
save(checkpoint: CheckpointData): Promise<void>;
|
|
23
|
+
load(id: string): Promise<CheckpointData | null>;
|
|
24
|
+
list(): Promise<CheckpointData[]>;
|
|
25
|
+
delete(id: string): Promise<void>;
|
|
26
|
+
clear(): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* In-memory checkpoint storage
|
|
30
|
+
*/
|
|
31
|
+
export declare class MemoryCheckpointStorage implements CheckpointStorage {
|
|
32
|
+
private checkpoints;
|
|
33
|
+
save(checkpoint: CheckpointData): Promise<void>;
|
|
34
|
+
load(id: string): Promise<CheckpointData | null>;
|
|
35
|
+
list(): Promise<CheckpointData[]>;
|
|
36
|
+
delete(id: string): Promise<void>;
|
|
37
|
+
clear(): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* File-based checkpoint storage
|
|
41
|
+
*/
|
|
42
|
+
export declare class FileCheckpointStorage implements CheckpointStorage {
|
|
43
|
+
private dirPath;
|
|
44
|
+
constructor(dirPath: string);
|
|
45
|
+
private ensureDir;
|
|
46
|
+
private getFilePath;
|
|
47
|
+
save(checkpoint: CheckpointData): Promise<void>;
|
|
48
|
+
load(id: string): Promise<CheckpointData | null>;
|
|
49
|
+
list(): Promise<CheckpointData[]>;
|
|
50
|
+
delete(id: string): Promise<void>;
|
|
51
|
+
clear(): Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Checkpoint Manager class
|
|
55
|
+
*/
|
|
56
|
+
export declare class CheckpointManager {
|
|
57
|
+
private config;
|
|
58
|
+
private storage;
|
|
59
|
+
private autoSaveTimer?;
|
|
60
|
+
private currentState;
|
|
61
|
+
constructor(config?: CheckpointConfig);
|
|
62
|
+
/**
|
|
63
|
+
* Create a checkpoint
|
|
64
|
+
*/
|
|
65
|
+
create(name: string, options?: Partial<CheckpointData>): Promise<CheckpointData>;
|
|
66
|
+
/**
|
|
67
|
+
* Restore from a checkpoint
|
|
68
|
+
*/
|
|
69
|
+
restore(id: string): Promise<CheckpointData | null>;
|
|
70
|
+
/**
|
|
71
|
+
* Restore the latest checkpoint
|
|
72
|
+
*/
|
|
73
|
+
restoreLatest(): Promise<CheckpointData | null>;
|
|
74
|
+
/**
|
|
75
|
+
* Get a checkpoint by ID
|
|
76
|
+
*/
|
|
77
|
+
get(id: string): Promise<CheckpointData | null>;
|
|
78
|
+
/**
|
|
79
|
+
* List all checkpoints
|
|
80
|
+
*/
|
|
81
|
+
list(): Promise<CheckpointData[]>;
|
|
82
|
+
/**
|
|
83
|
+
* Delete a checkpoint
|
|
84
|
+
*/
|
|
85
|
+
delete(id: string): Promise<void>;
|
|
86
|
+
/**
|
|
87
|
+
* Clear all checkpoints
|
|
88
|
+
*/
|
|
89
|
+
clear(): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Update current state
|
|
92
|
+
*/
|
|
93
|
+
setState(state: Record<string, any>): void;
|
|
94
|
+
/**
|
|
95
|
+
* Get current state
|
|
96
|
+
*/
|
|
97
|
+
getState(): Record<string, any>;
|
|
98
|
+
/**
|
|
99
|
+
* Start auto-save
|
|
100
|
+
*/
|
|
101
|
+
startAutoSave(): void;
|
|
102
|
+
/**
|
|
103
|
+
* Stop auto-save
|
|
104
|
+
*/
|
|
105
|
+
stopAutoSave(): void;
|
|
106
|
+
/**
|
|
107
|
+
* Enforce maximum checkpoints limit
|
|
108
|
+
*/
|
|
109
|
+
private enforceMaxCheckpoints;
|
|
110
|
+
/**
|
|
111
|
+
* Export checkpoint to JSON string
|
|
112
|
+
*/
|
|
113
|
+
export(id: string): Promise<string | null>;
|
|
114
|
+
/**
|
|
115
|
+
* Import checkpoint from JSON string
|
|
116
|
+
*/
|
|
117
|
+
import(json: string): Promise<CheckpointData>;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Create a checkpoint manager
|
|
121
|
+
*/
|
|
122
|
+
export declare function createCheckpointManager(config?: CheckpointConfig): CheckpointManager;
|
|
123
|
+
/**
|
|
124
|
+
* Create file-based checkpoint storage
|
|
125
|
+
*/
|
|
126
|
+
export declare function createFileCheckpointStorage(dirPath: string): FileCheckpointStorage;
|