@aurora-foundation/obsidian-next 0.4.7 → 0.4.9
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/CHANGELOG.md +23 -0
- package/LICENSE +628 -190
- package/README.md +23 -9
- package/dist/auditLog-6WDBDNYL.js +8 -0
- package/dist/auditLog-HGPVDSDC.js +8 -0
- package/dist/auditLog-TDIKFBM4.js +8 -0
- package/dist/auditLog-XC2KY3ZZ.js +8 -0
- package/dist/chunk-2I235WNB.js +133 -0
- package/dist/chunk-2JWDGXTR.js +42 -0
- package/dist/chunk-2NOB6W2B.js +133 -0
- package/dist/chunk-3LFKVKKL.js +7199 -0
- package/dist/chunk-3U6WHPDX.js +4695 -0
- package/dist/chunk-3UCL6RYE.js +7272 -0
- package/dist/chunk-4GN2UQLI.js +130 -0
- package/dist/chunk-4MW33MZD.js +516 -0
- package/dist/chunk-4PUJBUKZ.js +4716 -0
- package/dist/chunk-4QHK6H6O.js +130 -0
- package/dist/chunk-55CQIHCO.js +133 -0
- package/dist/chunk-5LWINFWI.js +676 -0
- package/dist/chunk-5OKGLNQW.js +439 -0
- package/dist/chunk-5T6ETZEO.js +6183 -0
- package/dist/chunk-5WGIFUVL.js +4234 -0
- package/dist/chunk-66EW47T3.js +4237 -0
- package/dist/chunk-6TXUOTT2.js +581 -0
- package/dist/chunk-6YUYSYDA.js +130 -0
- package/dist/chunk-74VPNFMX.js +133 -0
- package/dist/chunk-77CGJRGV.js +6188 -0
- package/dist/chunk-7DS3VT4C.js +7135 -0
- package/dist/chunk-7FHX3VBT.js +133 -0
- package/dist/chunk-7MHF56YU.js +6178 -0
- package/dist/chunk-ABLPMV7G.js +133 -0
- package/dist/chunk-B77K6OQZ.js +687 -0
- package/dist/chunk-BKOXH66O.js +133 -0
- package/dist/chunk-BPP76UN2.js +130 -0
- package/dist/chunk-C4D56GRC.js +5936 -0
- package/dist/chunk-CCDPY4WE.js +370 -0
- package/dist/chunk-CHNVBJN3.js +7272 -0
- package/dist/chunk-CKBZI576.js +7229 -0
- package/dist/chunk-CW5HBSJ2.js +7198 -0
- package/dist/chunk-DGHDJEY7.js +133 -0
- package/dist/chunk-DPNIQWKZ.js +439 -0
- package/dist/chunk-DU4T3V2T.js +214 -0
- package/dist/chunk-DV3WFKNB.js +4679 -0
- package/dist/chunk-DZI2OVN2.js +516 -0
- package/dist/chunk-E45VILML.js +7198 -0
- package/dist/chunk-ECEUUYXC.js +7199 -0
- package/dist/chunk-EJRRSHPW.js +685 -0
- package/dist/chunk-EMBMLZFE.js +370 -0
- package/dist/chunk-EPG5V5OO.js +285 -0
- package/dist/chunk-F2R4HXXW.js +130 -0
- package/dist/chunk-FK6N66ES.js +581 -0
- package/dist/chunk-G3CZKGYA.js +197 -0
- package/dist/chunk-GUUPG4A7.js +7111 -0
- package/dist/chunk-HBAAUGUN.js +7230 -0
- package/dist/chunk-HHFJMK2Q.js +6177 -0
- package/dist/chunk-HINRQTCZ.js +196 -0
- package/dist/chunk-HRKJ3R2U.js +288 -0
- package/dist/chunk-HWVK4CVE.js +439 -0
- package/dist/chunk-JEYSADNZ.js +581 -0
- package/dist/chunk-JNEIL7UN.js +4252 -0
- package/dist/chunk-JTWSK277.js +676 -0
- package/dist/chunk-K4CHTTCJ.js +942 -0
- package/dist/chunk-K7R5KUDS.js +4695 -0
- package/dist/chunk-KNJFOURE.js +7151 -0
- package/dist/chunk-KY22FIT3.js +7256 -0
- package/dist/chunk-L2OTIJSF.js +4228 -0
- package/dist/chunk-LEEBUHP6.js +4655 -0
- package/dist/chunk-LK7UP2T7.js +130 -0
- package/dist/chunk-LPGNO3PK.js +284 -0
- package/dist/chunk-LYQYJMWS.js +133 -0
- package/dist/chunk-MBYFJXR3.js +130 -0
- package/dist/chunk-N3WX44L3.js +130 -0
- package/dist/chunk-N6AQWES3.js +6197 -0
- package/dist/chunk-NW4XSTQZ.js +130 -0
- package/dist/chunk-NWG2XURH.js +130 -0
- package/dist/chunk-O3GF3LJD.js +6142 -0
- package/dist/chunk-OHP5LD3Y.js +6188 -0
- package/dist/chunk-P5PQSFZT.js +6182 -0
- package/dist/chunk-PAADOWNP.js +130 -0
- package/dist/chunk-PERGND7L.js +7213 -0
- package/dist/chunk-PWA7V4XX.js +179 -0
- package/dist/chunk-QGCWEP6L.js +7111 -0
- package/dist/chunk-QVT2IHNJ.js +175 -0
- package/dist/chunk-QZNGYPMS.js +6161 -0
- package/dist/chunk-R6P2E2ZQ.js +207 -0
- package/dist/chunk-ROSDMGIL.js +4679 -0
- package/dist/chunk-RQZP7IKG.js +196 -0
- package/dist/chunk-RUQSPX3U.js +133 -0
- package/dist/chunk-S3BYHP5M.js +130 -0
- package/dist/chunk-S6GNETVE.js +438 -0
- package/dist/chunk-SDT2ZE2R.js +133 -0
- package/dist/chunk-SHQBXJFC.js +6166 -0
- package/dist/chunk-TJNISYTE.js +42 -0
- package/dist/chunk-TJW74HFF.js +130 -0
- package/dist/chunk-TPP72DTK.js +7096 -0
- package/dist/chunk-UOESII6R.js +42 -0
- package/dist/chunk-UWEDGLYJ.js +6142 -0
- package/dist/chunk-V5FYNAFX.js +133 -0
- package/dist/chunk-VPURF6UT.js +7198 -0
- package/dist/chunk-VQH6LWIZ.js +6184 -0
- package/dist/chunk-VS22YVX6.js +7111 -0
- package/dist/chunk-VSF5KBW7.js +367 -0
- package/dist/chunk-VV3JMCKY.js +214 -0
- package/dist/chunk-W5L7HOE3.js +133 -0
- package/dist/chunk-WFEVQISK.js +676 -0
- package/dist/chunk-WJZPSCEP.js +516 -0
- package/dist/chunk-WLV4MKEF.js +16 -0
- package/dist/chunk-WSEVQFFI.js +5428 -0
- package/dist/chunk-X7N2RNR3.js +5428 -0
- package/dist/chunk-XKZNMRNO.js +133 -0
- package/dist/chunk-Y7BVEC36.js +130 -0
- package/dist/chunk-YG7YSNNU.js +4226 -0
- package/dist/chunk-YHM62466.js +261 -0
- package/dist/chunk-YLTYJLDZ.js +7208 -0
- package/dist/chunk-YPMJD4YE.js +56 -0
- package/dist/chunk-YTX3FU2A.js +7199 -0
- package/dist/chunk-ZEQ3EBBN.js +214 -0
- package/dist/chunk-ZIWLQSLK.js +42 -0
- package/dist/chunk-ZJELNTEO.js +516 -0
- package/dist/chunk-ZOSSVNGK.js +370 -0
- package/dist/config-EYK32F2E.js +10 -0
- package/dist/config-FJPPPYTY.js +10 -0
- package/dist/config-VAHPVILX.js +10 -0
- package/dist/context-2YGE4U75.js +10 -0
- package/dist/context-5UFVYKES.js +9 -0
- package/dist/context-ANZF4J72.js +10 -0
- package/dist/context-GLUNCUBQ.js +10 -0
- package/dist/context-M5ULPZKQ.js +10 -0
- package/dist/context-NYOIRZKV.js +10 -0
- package/dist/context-YP2REI6A.js +10 -0
- package/dist/database-MP2JBLMF.js +8 -0
- package/dist/index.js +6177 -4688
- package/dist/keyManager-P2SZONKE.js +8 -0
- package/dist/mcp/index.js +127 -47
- package/dist/memory-BPGJAL4J.js +13 -0
- package/dist/memory-FRQOUI6W.js +13 -0
- package/dist/memory-OAMK27IZ.js +13 -0
- package/dist/memory-OZ734ALL.js +13 -0
- package/dist/memory-PQ2EWRMU.js +13 -0
- package/dist/memory-PXL45M6W.js +13 -0
- package/dist/memory-QZTBTYPH.js +13 -0
- package/dist/migrations-TLJ3WRVW.js +188 -0
- package/dist/resume-2NHDK6EI.js +17 -0
- package/dist/resume-44L2PDB2.js +17 -0
- package/dist/resume-4MXIWUJO.js +7 -0
- package/dist/resume-72VJX66I.js +17 -0
- package/dist/resume-7ZW4XM3B.js +15 -0
- package/dist/resume-AZHYQ657.js +17 -0
- package/dist/resume-CNLXSYHV.js +17 -0
- package/dist/resume-DPN4Q777.js +16 -0
- package/dist/resume-DSFHVNPI.js +15 -0
- package/dist/resume-GHLQJJTO.js +17 -0
- package/dist/resume-HJ6SBWTF.js +17 -0
- package/dist/resume-HRLYHY2L.js +17 -0
- package/dist/resume-ISIQFKO6.js +17 -0
- package/dist/resume-JQDEA6PS.js +15 -0
- package/dist/resume-KP3Y3Y7P.js +17 -0
- package/dist/resume-M4KHR5OI.js +17 -0
- package/dist/resume-N62OAMBG.js +17 -0
- package/dist/resume-NNMA5POT.js +17 -0
- package/dist/resume-ODYT3J4H.js +17 -0
- package/dist/resume-PCFJXA5O.js +17 -0
- package/dist/resume-PLF4XGBD.js +15 -0
- package/dist/resume-Q2PFX57V.js +17 -0
- package/dist/resume-QB4XI2J5.js +17 -0
- package/dist/resume-R5MFTUPF.js +17 -0
- package/dist/resume-SVA7223Z.js +17 -0
- package/dist/resume-TYKKDJZI.js +17 -0
- package/dist/resume-XIS45HKV.js +17 -0
- package/dist/resume-YCSEJTU7.js +17 -0
- package/dist/resume-YD76GI2J.js +15 -0
- package/dist/resume-YDN7EL77.js +17 -0
- package/dist/resume-YE7DB4ZA.js +17 -0
- package/dist/resume-YKAKOXWV.js +15 -0
- package/dist/resume-ZHBCVFDY.js +17 -0
- package/dist/scheduler-2CK24A2Q.js +14 -0
- package/dist/scheduler-7OAF2XKX.js +14 -0
- package/dist/scheduler-AS23AAB5.js +14 -0
- package/dist/scheduler-PCOYQJA5.js +14 -0
- package/dist/scheduler-V2ECBQPK.js +14 -0
- package/dist/scheduler-VEWZ6L7V.js +13 -0
- package/dist/scheduler-W37QMGDQ.js +14 -0
- package/dist/session-2E2JKPD7.js +15 -0
- package/dist/session-2VSF257B.js +14 -0
- package/dist/session-4APFTDJU.js +14 -0
- package/dist/session-5YS5LNNL.js +16 -0
- package/dist/session-6MO5ZPOB.js +16 -0
- package/dist/session-6XMGPRTQ.js +14 -0
- package/dist/session-7DJR77R7.js +16 -0
- package/dist/session-7DQHPWTR.js +14 -0
- package/dist/session-ADKIQCR5.js +16 -0
- package/dist/session-AOGH2GGI.js +16 -0
- package/dist/session-C4W6GDYG.js +16 -0
- package/dist/session-DCGNGGMV.js +14 -0
- package/dist/session-F5JKZAN2.js +16 -0
- package/dist/session-G6F3O2FQ.js +16 -0
- package/dist/session-GFBSARRO.js +16 -0
- package/dist/session-H5IWAIUI.js +16 -0
- package/dist/session-IPFA6AHC.js +14 -0
- package/dist/session-IWG2UOAX.js +14 -0
- package/dist/session-KJ2K4Y4M.js +14 -0
- package/dist/session-KPXFBW6Q.js +14 -0
- package/dist/session-KR256UL5.js +16 -0
- package/dist/session-M72LJXPR.js +16 -0
- package/dist/session-MBK3FODN.js +14 -0
- package/dist/session-MOUFAU7G.js +16 -0
- package/dist/session-NRC6ZXFQ.js +16 -0
- package/dist/session-NRPQMV4K.js +16 -0
- package/dist/session-O5IFFJZQ.js +14 -0
- package/dist/session-OF5BGKDE.js +16 -0
- package/dist/session-OGRZMIM7.js +14 -0
- package/dist/session-OJOFAJG3.js +16 -0
- package/dist/session-OKU4N3SP.js +16 -0
- package/dist/session-P2VAOSFB.js +14 -0
- package/dist/session-PKOVZD4M.js +16 -0
- package/dist/session-POAIMUVN.js +16 -0
- package/dist/session-PSHFONFE.js +16 -0
- package/dist/session-QKYVVZFV.js +16 -0
- package/dist/session-QPWGBMUS.js +14 -0
- package/dist/session-R5UG5PZR.js +14 -0
- package/dist/session-RAY6BZRQ.js +16 -0
- package/dist/session-S3VATHMU.js +16 -0
- package/dist/session-SYTD7RHW.js +14 -0
- package/dist/session-UHMMVO4J.js +16 -0
- package/dist/session-WEX5K3ZY.js +14 -0
- package/dist/session-XFLOXGU3.js +14 -0
- package/dist/session-XV2A4HHG.js +14 -0
- package/dist/settings-3VPJYD4D.js +8 -0
- package/dist/settings-GZTJJTBK.js +8 -0
- package/dist/settings-YKJFSKMO.js +8 -0
- package/dist/shell-FM34624T.js +8 -0
- package/package.json +14 -4
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import {
|
|
2
|
+
auditLog
|
|
3
|
+
} from "./chunk-EJRRSHPW.js";
|
|
4
|
+
import {
|
|
5
|
+
context
|
|
6
|
+
} from "./chunk-DPNIQWKZ.js";
|
|
7
|
+
import {
|
|
8
|
+
bus
|
|
9
|
+
} from "./chunk-WQM6FFSD.js";
|
|
10
|
+
import {
|
|
11
|
+
db
|
|
12
|
+
} from "./chunk-R6P2E2ZQ.js";
|
|
13
|
+
|
|
14
|
+
// src/core/scheduler.ts
|
|
15
|
+
import cronParser from "cron-parser";
|
|
16
|
+
var parseExpression = cronParser.parseExpression || cronParser.default?.parseExpression || cronParser.parse || cronParser.default?.parse;
|
|
17
|
+
var MAX_CONSECUTIVE_FAILURES = 3;
|
|
18
|
+
var Scheduler = class _Scheduler {
|
|
19
|
+
static instance;
|
|
20
|
+
abilities = /* @__PURE__ */ new Map();
|
|
21
|
+
timer = null;
|
|
22
|
+
isRunning = false;
|
|
23
|
+
failureCounts = /* @__PURE__ */ new Map();
|
|
24
|
+
constructor() {
|
|
25
|
+
}
|
|
26
|
+
static getInstance() {
|
|
27
|
+
if (!_Scheduler.instance) {
|
|
28
|
+
_Scheduler.instance = new _Scheduler();
|
|
29
|
+
}
|
|
30
|
+
return _Scheduler.instance;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Initialize the scheduler loop
|
|
34
|
+
*/
|
|
35
|
+
start() {
|
|
36
|
+
if (this.isRunning) return;
|
|
37
|
+
this.isRunning = true;
|
|
38
|
+
this.tick().catch(
|
|
39
|
+
(err) => bus.emitAgent({
|
|
40
|
+
type: "error",
|
|
41
|
+
message: `[Scheduler] Initial tick failed: ${err instanceof Error ? err.message : String(err)}`
|
|
42
|
+
})
|
|
43
|
+
);
|
|
44
|
+
this.timer = setInterval(() => this.tick(), 1e4);
|
|
45
|
+
bus.emitAgent({
|
|
46
|
+
type: "thought",
|
|
47
|
+
content: "[Obsidian] Started background task monitor [Active Heartbeat]"
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
stop() {
|
|
51
|
+
if (this.timer) {
|
|
52
|
+
clearInterval(this.timer);
|
|
53
|
+
this.timer = null;
|
|
54
|
+
}
|
|
55
|
+
this.isRunning = false;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Register a new ability that can be scheduled
|
|
59
|
+
*/
|
|
60
|
+
registerAbility(name, func) {
|
|
61
|
+
this.abilities.set(name, func);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get list of registered abilities
|
|
65
|
+
*/
|
|
66
|
+
getAbilities() {
|
|
67
|
+
return Array.from(this.abilities.keys());
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Schedule a new task
|
|
71
|
+
*/
|
|
72
|
+
async scheduleTask(cronExpression, abilityName, params = {}) {
|
|
73
|
+
try {
|
|
74
|
+
parseExpression(cronExpression);
|
|
75
|
+
} catch (err) {
|
|
76
|
+
throw new Error(`Invalid cron expression: ${cronExpression}`);
|
|
77
|
+
}
|
|
78
|
+
if (!this.abilities.has(abilityName)) {
|
|
79
|
+
throw new Error(`Unknown ability: ${abilityName}`);
|
|
80
|
+
}
|
|
81
|
+
const id = `task_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`;
|
|
82
|
+
const sessionId = context.get().session_id;
|
|
83
|
+
const task = {
|
|
84
|
+
id,
|
|
85
|
+
session_id: sessionId,
|
|
86
|
+
cron_expression: cronExpression,
|
|
87
|
+
command: abilityName,
|
|
88
|
+
params: JSON.stringify(params),
|
|
89
|
+
last_run_at: Date.now(),
|
|
90
|
+
active: 1
|
|
91
|
+
};
|
|
92
|
+
db.getDb().prepare(
|
|
93
|
+
`
|
|
94
|
+
INSERT INTO scheduled_tasks (id, session_id, cron_expression, command, params, last_run_at, active)
|
|
95
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
96
|
+
`
|
|
97
|
+
).run(
|
|
98
|
+
task.id,
|
|
99
|
+
task.session_id,
|
|
100
|
+
task.cron_expression,
|
|
101
|
+
task.command,
|
|
102
|
+
task.params,
|
|
103
|
+
task.last_run_at,
|
|
104
|
+
task.active
|
|
105
|
+
);
|
|
106
|
+
bus.emitAgent({
|
|
107
|
+
type: "thought",
|
|
108
|
+
content: `[Scheduler] Scheduled ${abilityName} (${cronExpression})`
|
|
109
|
+
});
|
|
110
|
+
return task;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* List all active tasks
|
|
114
|
+
*/
|
|
115
|
+
listTasks() {
|
|
116
|
+
const tasks = db.getDb().prepare(
|
|
117
|
+
`
|
|
118
|
+
SELECT * FROM scheduled_tasks WHERE active = 1
|
|
119
|
+
`
|
|
120
|
+
).all();
|
|
121
|
+
return tasks.map((t) => {
|
|
122
|
+
try {
|
|
123
|
+
const interval = parseExpression(t.cron_expression);
|
|
124
|
+
t.next_run_at = interval.next().getTime();
|
|
125
|
+
} catch {
|
|
126
|
+
t.next_run_at = 0;
|
|
127
|
+
}
|
|
128
|
+
return t;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Main execution loop
|
|
133
|
+
*/
|
|
134
|
+
async tick() {
|
|
135
|
+
const tasks = this.listTasks();
|
|
136
|
+
const now = Date.now();
|
|
137
|
+
for (const task of tasks) {
|
|
138
|
+
try {
|
|
139
|
+
const baseline = task.last_run_at || now - 61e3;
|
|
140
|
+
let taskParams = {};
|
|
141
|
+
try {
|
|
142
|
+
taskParams = task.params ? JSON.parse(task.params) : {};
|
|
143
|
+
} catch {
|
|
144
|
+
}
|
|
145
|
+
if (taskParams.__once && taskParams.__target) {
|
|
146
|
+
if (now >= taskParams.__target) {
|
|
147
|
+
await this.executeTask(task);
|
|
148
|
+
}
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
const interval = parseExpression(task.cron_expression, {
|
|
152
|
+
currentDate: baseline
|
|
153
|
+
});
|
|
154
|
+
const nextRun = interval.next().getTime();
|
|
155
|
+
if (nextRun <= now) {
|
|
156
|
+
await this.executeTask(task);
|
|
157
|
+
}
|
|
158
|
+
} catch (error) {
|
|
159
|
+
bus.emitAgent({
|
|
160
|
+
type: "error",
|
|
161
|
+
message: `[Scheduler] Error checking task ${task.id}: ${error instanceof Error ? error.message : String(error)}`
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async executeTask(task) {
|
|
167
|
+
const ability = this.abilities.get(task.command);
|
|
168
|
+
if (!ability) {
|
|
169
|
+
bus.emitAgent({
|
|
170
|
+
type: "error",
|
|
171
|
+
message: `[Scheduler] Ability "${task.command}" not found. Disabling task ${task.id}.`
|
|
172
|
+
});
|
|
173
|
+
db.getDb().prepare("UPDATE scheduled_tasks SET active = 0 WHERE id = ?").run(task.id);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
bus.emitAgent({
|
|
177
|
+
type: "scheduler_task_started",
|
|
178
|
+
taskId: task.id,
|
|
179
|
+
command: task.command
|
|
180
|
+
});
|
|
181
|
+
try {
|
|
182
|
+
let params = {};
|
|
183
|
+
if (task.params) {
|
|
184
|
+
try {
|
|
185
|
+
params = JSON.parse(task.params);
|
|
186
|
+
} catch {
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
await ability(params);
|
|
190
|
+
bus.emitAgent({
|
|
191
|
+
type: "scheduler_task_completed",
|
|
192
|
+
taskId: task.id,
|
|
193
|
+
command: task.command
|
|
194
|
+
});
|
|
195
|
+
this.failureCounts.delete(task.id);
|
|
196
|
+
if (params.__once) {
|
|
197
|
+
db.getDb().prepare(`UPDATE scheduled_tasks SET active = 0 WHERE id = ?`).run(task.id);
|
|
198
|
+
bus.emitAgent({
|
|
199
|
+
type: "thought",
|
|
200
|
+
content: `[Scheduler] One-time task ${task.id} completed and deactivated.`
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
} catch (error) {
|
|
204
|
+
await auditLog.logSystemEvent("scheduler_error", {
|
|
205
|
+
taskId: task.id,
|
|
206
|
+
error: error.message
|
|
207
|
+
});
|
|
208
|
+
bus.emitAgent({
|
|
209
|
+
type: "scheduler_task_failed",
|
|
210
|
+
taskId: task.id,
|
|
211
|
+
command: task.command,
|
|
212
|
+
error: error.message
|
|
213
|
+
});
|
|
214
|
+
const failures = (this.failureCounts.get(task.id) || 0) + 1;
|
|
215
|
+
this.failureCounts.set(task.id, failures);
|
|
216
|
+
if (failures >= MAX_CONSECUTIVE_FAILURES) {
|
|
217
|
+
db.getDb().prepare("UPDATE scheduled_tasks SET active = 0 WHERE id = ?").run(task.id);
|
|
218
|
+
this.failureCounts.delete(task.id);
|
|
219
|
+
bus.emitAgent({
|
|
220
|
+
type: "error",
|
|
221
|
+
message: `[Scheduler] Task ${task.id} (${task.command}) disabled after ${MAX_CONSECUTIVE_FAILURES} consecutive failures.`
|
|
222
|
+
});
|
|
223
|
+
} else {
|
|
224
|
+
bus.emitAgent({
|
|
225
|
+
type: "error",
|
|
226
|
+
message: `[Scheduler] Task ${task.id} (${task.command}) failed: ${error.message} (${failures}/${MAX_CONSECUTIVE_FAILURES} before auto-disable)`
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
} finally {
|
|
230
|
+
db.getDb().prepare(
|
|
231
|
+
`
|
|
232
|
+
UPDATE scheduled_tasks SET last_run_at = ? WHERE id = ?
|
|
233
|
+
`
|
|
234
|
+
).run(Date.now(), task.id);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Remove (deactivate) a scheduled task
|
|
239
|
+
*/
|
|
240
|
+
async removeTask(taskId) {
|
|
241
|
+
const result = db.getDb().prepare(
|
|
242
|
+
`
|
|
243
|
+
UPDATE scheduled_tasks SET active = 0 WHERE id = ?
|
|
244
|
+
`
|
|
245
|
+
).run(taskId);
|
|
246
|
+
if (result.changes && result.changes > 0) {
|
|
247
|
+
bus.emitAgent({
|
|
248
|
+
type: "thought",
|
|
249
|
+
content: `[Scheduler] Deactivated task: ${taskId}`
|
|
250
|
+
});
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
var scheduler = Scheduler.getInstance();
|
|
257
|
+
|
|
258
|
+
export {
|
|
259
|
+
Scheduler,
|
|
260
|
+
scheduler
|
|
261
|
+
};
|