@songsid/agend 0.0.1
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 +210 -0
- package/README.zh-TW.md +134 -0
- package/dist/access-path.d.ts +10 -0
- package/dist/access-path.js +32 -0
- package/dist/access-path.js.map +1 -0
- package/dist/adapter-world.d.ts +25 -0
- package/dist/adapter-world.js +41 -0
- package/dist/adapter-world.js.map +1 -0
- package/dist/agent-cli-instructions.md +50 -0
- package/dist/agent-cli.d.ts +2 -0
- package/dist/agent-cli.js +200 -0
- package/dist/agent-cli.js.map +1 -0
- package/dist/agent-endpoint.d.ts +25 -0
- package/dist/agent-endpoint.js +162 -0
- package/dist/agent-endpoint.js.map +1 -0
- package/dist/backend/antigravity.d.ts +17 -0
- package/dist/backend/antigravity.js +98 -0
- package/dist/backend/antigravity.js.map +1 -0
- package/dist/backend/claude-code.d.ts +23 -0
- package/dist/backend/claude-code.js +171 -0
- package/dist/backend/claude-code.js.map +1 -0
- package/dist/backend/codex.d.ts +18 -0
- package/dist/backend/codex.js +160 -0
- package/dist/backend/codex.js.map +1 -0
- package/dist/backend/factory.d.ts +2 -0
- package/dist/backend/factory.js +28 -0
- package/dist/backend/factory.js.map +1 -0
- package/dist/backend/gemini-cli.d.ts +17 -0
- package/dist/backend/gemini-cli.js +163 -0
- package/dist/backend/gemini-cli.js.map +1 -0
- package/dist/backend/index.d.ts +7 -0
- package/dist/backend/index.js +7 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/kiro.d.ts +17 -0
- package/dist/backend/kiro.js +147 -0
- package/dist/backend/kiro.js.map +1 -0
- package/dist/backend/marker-utils.d.ts +13 -0
- package/dist/backend/marker-utils.js +64 -0
- package/dist/backend/marker-utils.js.map +1 -0
- package/dist/backend/mock.d.ts +25 -0
- package/dist/backend/mock.js +85 -0
- package/dist/backend/mock.js.map +1 -0
- package/dist/backend/opencode.d.ts +16 -0
- package/dist/backend/opencode.js +136 -0
- package/dist/backend/opencode.js.map +1 -0
- package/dist/backend/types.d.ts +86 -0
- package/dist/backend/types.js +33 -0
- package/dist/backend/types.js.map +1 -0
- package/dist/channel/access-manager.d.ts +18 -0
- package/dist/channel/access-manager.js +153 -0
- package/dist/channel/access-manager.js.map +1 -0
- package/dist/channel/adapters/telegram.d.ts +63 -0
- package/dist/channel/adapters/telegram.js +646 -0
- package/dist/channel/adapters/telegram.js.map +1 -0
- package/dist/channel/attachment-handler.d.ts +15 -0
- package/dist/channel/attachment-handler.js +88 -0
- package/dist/channel/attachment-handler.js.map +1 -0
- package/dist/channel/factory.d.ts +12 -0
- package/dist/channel/factory.js +67 -0
- package/dist/channel/factory.js.map +1 -0
- package/dist/channel/ipc-bridge.d.ts +26 -0
- package/dist/channel/ipc-bridge.js +220 -0
- package/dist/channel/ipc-bridge.js.map +1 -0
- package/dist/channel/mcp-server.d.ts +10 -0
- package/dist/channel/mcp-server.js +288 -0
- package/dist/channel/mcp-server.js.map +1 -0
- package/dist/channel/mcp-tools.d.ts +17 -0
- package/dist/channel/mcp-tools.js +110 -0
- package/dist/channel/mcp-tools.js.map +1 -0
- package/dist/channel/message-bus.d.ts +17 -0
- package/dist/channel/message-bus.js +86 -0
- package/dist/channel/message-bus.js.map +1 -0
- package/dist/channel/message-queue.d.ts +39 -0
- package/dist/channel/message-queue.js +253 -0
- package/dist/channel/message-queue.js.map +1 -0
- package/dist/channel/tool-router.d.ts +6 -0
- package/dist/channel/tool-router.js +75 -0
- package/dist/channel/tool-router.js.map +1 -0
- package/dist/channel/tool-tracker.d.ts +13 -0
- package/dist/channel/tool-tracker.js +58 -0
- package/dist/channel/tool-tracker.js.map +1 -0
- package/dist/channel/types.d.ts +118 -0
- package/dist/channel/types.js +2 -0
- package/dist/channel/types.js.map +1 -0
- package/dist/chat-export.d.ts +4 -0
- package/dist/chat-export.js +91 -0
- package/dist/chat-export.js.map +1 -0
- package/dist/classic-channel-manager.d.ts +59 -0
- package/dist/classic-channel-manager.js +193 -0
- package/dist/classic-channel-manager.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +1833 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.js +118 -0
- package/dist/config.js.map +1 -0
- package/dist/context-guardian.d.ts +26 -0
- package/dist/context-guardian.js +73 -0
- package/dist/context-guardian.js.map +1 -0
- package/dist/cost-guard.d.ts +36 -0
- package/dist/cost-guard.js +147 -0
- package/dist/cost-guard.js.map +1 -0
- package/dist/daemon-entry.d.ts +1 -0
- package/dist/daemon-entry.js +29 -0
- package/dist/daemon-entry.js.map +1 -0
- package/dist/daemon.d.ts +152 -0
- package/dist/daemon.js +1714 -0
- package/dist/daemon.js.map +1 -0
- package/dist/daily-summary.d.ts +13 -0
- package/dist/daily-summary.js +55 -0
- package/dist/daily-summary.js.map +1 -0
- package/dist/event-log.d.ts +36 -0
- package/dist/event-log.js +100 -0
- package/dist/event-log.js.map +1 -0
- package/dist/export-import.d.ts +2 -0
- package/dist/export-import.js +162 -0
- package/dist/export-import.js.map +1 -0
- package/dist/fleet-context.d.ts +61 -0
- package/dist/fleet-context.js +4 -0
- package/dist/fleet-context.js.map +1 -0
- package/dist/fleet-dashboard-html.d.ts +6 -0
- package/dist/fleet-dashboard-html.js +443 -0
- package/dist/fleet-dashboard-html.js.map +1 -0
- package/dist/fleet-health-server.d.ts +35 -0
- package/dist/fleet-health-server.js +290 -0
- package/dist/fleet-health-server.js.map +1 -0
- package/dist/fleet-instructions.d.ts +5 -0
- package/dist/fleet-instructions.js +161 -0
- package/dist/fleet-instructions.js.map +1 -0
- package/dist/fleet-manager.d.ts +212 -0
- package/dist/fleet-manager.js +3655 -0
- package/dist/fleet-manager.js.map +1 -0
- package/dist/fleet-rpc-handlers.d.ts +42 -0
- package/dist/fleet-rpc-handlers.js +356 -0
- package/dist/fleet-rpc-handlers.js.map +1 -0
- package/dist/fleet-system-prompt.d.ts +11 -0
- package/dist/fleet-system-prompt.js +61 -0
- package/dist/fleet-system-prompt.js.map +1 -0
- package/dist/general-knowledge/skills.md +177 -0
- package/dist/hang-detector.d.ts +16 -0
- package/dist/hang-detector.js +53 -0
- package/dist/hang-detector.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/instance-lifecycle.d.ts +90 -0
- package/dist/instance-lifecycle.js +592 -0
- package/dist/instance-lifecycle.js.map +1 -0
- package/dist/instructions.d.ts +15 -0
- package/dist/instructions.js +90 -0
- package/dist/instructions.js.map +1 -0
- package/dist/logger.d.ts +7 -0
- package/dist/logger.js +84 -0
- package/dist/logger.js.map +1 -0
- package/dist/outbound-handlers.d.ts +51 -0
- package/dist/outbound-handlers.js +739 -0
- package/dist/outbound-handlers.js.map +1 -0
- package/dist/outbound-schemas.d.ts +238 -0
- package/dist/outbound-schemas.js +248 -0
- package/dist/outbound-schemas.js.map +1 -0
- package/dist/paths.d.ts +10 -0
- package/dist/paths.js +42 -0
- package/dist/paths.js.map +1 -0
- package/dist/plugin/agend/.claude-plugin/plugin.json +5 -0
- package/dist/quickstart.d.ts +1 -0
- package/dist/quickstart.js +595 -0
- package/dist/quickstart.js.map +1 -0
- package/dist/routing-engine.d.ts +22 -0
- package/dist/routing-engine.js +44 -0
- package/dist/routing-engine.js.map +1 -0
- package/dist/safe-async.d.ts +6 -0
- package/dist/safe-async.js +20 -0
- package/dist/safe-async.js.map +1 -0
- package/dist/scheduler/db.d.ts +37 -0
- package/dist/scheduler/db.js +360 -0
- package/dist/scheduler/db.js.map +1 -0
- package/dist/scheduler/db.test.d.ts +1 -0
- package/dist/scheduler/db.test.js +92 -0
- package/dist/scheduler/db.test.js.map +1 -0
- package/dist/scheduler/index.d.ts +4 -0
- package/dist/scheduler/index.js +4 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/scheduler.d.ts +44 -0
- package/dist/scheduler/scheduler.js +197 -0
- package/dist/scheduler/scheduler.js.map +1 -0
- package/dist/scheduler/scheduler.test.d.ts +1 -0
- package/dist/scheduler/scheduler.test.js +119 -0
- package/dist/scheduler/scheduler.test.js.map +1 -0
- package/dist/scheduler/types.d.ts +107 -0
- package/dist/scheduler/types.js +7 -0
- package/dist/scheduler/types.js.map +1 -0
- package/dist/service-installer.d.ts +17 -0
- package/dist/service-installer.js +182 -0
- package/dist/service-installer.js.map +1 -0
- package/dist/setup-wizard.d.ts +48 -0
- package/dist/setup-wizard.js +701 -0
- package/dist/setup-wizard.js.map +1 -0
- package/dist/statusline-watcher.d.ts +34 -0
- package/dist/statusline-watcher.js +73 -0
- package/dist/statusline-watcher.js.map +1 -0
- package/dist/stt.d.ts +10 -0
- package/dist/stt.js +33 -0
- package/dist/stt.js.map +1 -0
- package/dist/tmux-control.d.ts +52 -0
- package/dist/tmux-control.js +207 -0
- package/dist/tmux-control.js.map +1 -0
- package/dist/tmux-manager.d.ts +44 -0
- package/dist/tmux-manager.js +218 -0
- package/dist/tmux-manager.js.map +1 -0
- package/dist/topic-archiver.d.ts +40 -0
- package/dist/topic-archiver.js +103 -0
- package/dist/topic-archiver.js.map +1 -0
- package/dist/topic-commands.d.ts +28 -0
- package/dist/topic-commands.js +359 -0
- package/dist/topic-commands.js.map +1 -0
- package/dist/transcript-monitor.d.ts +23 -0
- package/dist/transcript-monitor.js +164 -0
- package/dist/transcript-monitor.js.map +1 -0
- package/dist/types.d.ts +211 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/dashboard.html +719 -0
- package/dist/web-api.d.ts +101 -0
- package/dist/web-api.js +648 -0
- package/dist/web-api.js.map +1 -0
- package/dist/webhook-emitter.d.ts +15 -0
- package/dist/webhook-emitter.js +41 -0
- package/dist/webhook-emitter.js.map +1 -0
- package/dist/workflow-templates/default.md +35 -0
- package/package.json +76 -0
- package/templates/launchd.plist.ejs +31 -0
- package/templates/systemd.service.ejs +16 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { SchedulerDb } from "./db.js";
|
|
2
|
+
import type { Schedule, CreateScheduleParams, UpdateScheduleParams, SchedulerConfig, ScheduleRun } from "./types.js";
|
|
3
|
+
export declare class Scheduler {
|
|
4
|
+
/** Cap how far back we look for missed fires on init. Avoids dumping
|
|
5
|
+
* dozens of "morning standup" pings on the user after a long outage,
|
|
6
|
+
* while still recovering from short crashes/restarts. */
|
|
7
|
+
private static readonly CATCHUP_WINDOW_MS;
|
|
8
|
+
readonly db: SchedulerDb;
|
|
9
|
+
private jobs;
|
|
10
|
+
private onTrigger;
|
|
11
|
+
private config;
|
|
12
|
+
private isValidInstance;
|
|
13
|
+
/** IDs of schedules whose onTrigger is currently in flight; guards against
|
|
14
|
+
* a manual trigger and a cron firing (or two cron fires) overlapping. */
|
|
15
|
+
private executing;
|
|
16
|
+
constructor(dbPath: string, onTrigger: (schedule: Schedule) => void | Promise<void>, config: SchedulerConfig, isValidInstance: (name: string) => boolean);
|
|
17
|
+
init(): void;
|
|
18
|
+
/**
|
|
19
|
+
* On startup, fire any schedule whose most recent expected run was missed
|
|
20
|
+
* within the catch-up window. Only one catch-up fire per schedule — we
|
|
21
|
+
* don't replay every missed minute of `* * * * *`. Schedules that haven't
|
|
22
|
+
* been triggered yet use `created_at` as the reference point so a new
|
|
23
|
+
* schedule registered while the daemon was down still gets caught up.
|
|
24
|
+
*/
|
|
25
|
+
private runCatchUp;
|
|
26
|
+
reload(): void;
|
|
27
|
+
shutdown(): void;
|
|
28
|
+
create(params: CreateScheduleParams): Schedule;
|
|
29
|
+
list(target?: string): Schedule[];
|
|
30
|
+
get(id: string): Schedule | null;
|
|
31
|
+
update(id: string, params: UpdateScheduleParams): Schedule;
|
|
32
|
+
delete(id: string): void;
|
|
33
|
+
trigger(id: string): void;
|
|
34
|
+
/** Invoke onTrigger while holding the per-schedule lock. Cleans up when
|
|
35
|
+
* the callback returns synchronously, throws, or settles a returned Promise. */
|
|
36
|
+
private runWithLock;
|
|
37
|
+
deleteByInstanceOrThread(instanceName: string, threadId: string): number;
|
|
38
|
+
recordRun(scheduleId: string, status: string, detail?: string): void;
|
|
39
|
+
getRuns(scheduleId: string, limit?: number): ScheduleRun[];
|
|
40
|
+
private registerAllJobs;
|
|
41
|
+
private registerJob;
|
|
42
|
+
private stopJob;
|
|
43
|
+
private stopAllJobs;
|
|
44
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { Cron } from "croner";
|
|
2
|
+
import { SchedulerDb } from "./db.js";
|
|
3
|
+
import { validateTimezone } from "../config.js";
|
|
4
|
+
export class Scheduler {
|
|
5
|
+
/** Cap how far back we look for missed fires on init. Avoids dumping
|
|
6
|
+
* dozens of "morning standup" pings on the user after a long outage,
|
|
7
|
+
* while still recovering from short crashes/restarts. */
|
|
8
|
+
static CATCHUP_WINDOW_MS = 24 * 60 * 60 * 1000;
|
|
9
|
+
db;
|
|
10
|
+
jobs = new Map();
|
|
11
|
+
onTrigger;
|
|
12
|
+
config;
|
|
13
|
+
isValidInstance;
|
|
14
|
+
/** IDs of schedules whose onTrigger is currently in flight; guards against
|
|
15
|
+
* a manual trigger and a cron firing (or two cron fires) overlapping. */
|
|
16
|
+
executing = new Set();
|
|
17
|
+
constructor(dbPath, onTrigger, config, isValidInstance) {
|
|
18
|
+
this.db = new SchedulerDb(dbPath);
|
|
19
|
+
this.onTrigger = onTrigger;
|
|
20
|
+
this.config = config;
|
|
21
|
+
this.isValidInstance = isValidInstance;
|
|
22
|
+
}
|
|
23
|
+
init() {
|
|
24
|
+
this.db.pruneOldRuns();
|
|
25
|
+
this.runCatchUp();
|
|
26
|
+
this.registerAllJobs();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* On startup, fire any schedule whose most recent expected run was missed
|
|
30
|
+
* within the catch-up window. Only one catch-up fire per schedule — we
|
|
31
|
+
* don't replay every missed minute of `* * * * *`. Schedules that haven't
|
|
32
|
+
* been triggered yet use `created_at` as the reference point so a new
|
|
33
|
+
* schedule registered while the daemon was down still gets caught up.
|
|
34
|
+
*/
|
|
35
|
+
runCatchUp() {
|
|
36
|
+
const now = Date.now();
|
|
37
|
+
const cutoff = now - Scheduler.CATCHUP_WINDOW_MS;
|
|
38
|
+
for (const schedule of this.db.list()) {
|
|
39
|
+
if (!schedule.enabled)
|
|
40
|
+
continue;
|
|
41
|
+
const refIso = schedule.last_triggered_at ?? schedule.created_at;
|
|
42
|
+
// SQLite datetime('now') stores UTC without 'Z' suffix — append it for correct parsing
|
|
43
|
+
const refMs = Date.parse(refIso.endsWith("Z") ? refIso : refIso + "Z");
|
|
44
|
+
if (Number.isNaN(refMs))
|
|
45
|
+
continue;
|
|
46
|
+
try {
|
|
47
|
+
const cron = new Cron(schedule.cron, { timezone: schedule.timezone });
|
|
48
|
+
const next = cron.nextRun(new Date(refMs));
|
|
49
|
+
if (!next)
|
|
50
|
+
continue;
|
|
51
|
+
const nextMs = next.getTime();
|
|
52
|
+
if (nextMs > now)
|
|
53
|
+
continue; // not yet due
|
|
54
|
+
if (nextMs < cutoff)
|
|
55
|
+
continue; // too old, don't spam
|
|
56
|
+
if (this.executing.has(schedule.id))
|
|
57
|
+
continue;
|
|
58
|
+
this.runWithLock(schedule);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Bad cron expression or croner edge case — skip rather than crash init
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
reload() {
|
|
67
|
+
this.stopAllJobs();
|
|
68
|
+
this.registerAllJobs();
|
|
69
|
+
}
|
|
70
|
+
shutdown() {
|
|
71
|
+
this.stopAllJobs();
|
|
72
|
+
this.db.close();
|
|
73
|
+
}
|
|
74
|
+
create(params) {
|
|
75
|
+
const tz = params.timezone ?? this.config.default_timezone;
|
|
76
|
+
validateTimezone(tz, "timezone");
|
|
77
|
+
try {
|
|
78
|
+
new Cron(params.cron, { timezone: tz });
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
throw new Error(`Invalid cron expression: ${err.message}`);
|
|
82
|
+
}
|
|
83
|
+
if (!this.isValidInstance(params.target)) {
|
|
84
|
+
throw new Error(`Instance "${params.target}" not found in fleet config.`);
|
|
85
|
+
}
|
|
86
|
+
const schedule = this.db.create(params, this.config.max_schedules);
|
|
87
|
+
this.registerJob(schedule);
|
|
88
|
+
return schedule;
|
|
89
|
+
}
|
|
90
|
+
list(target) {
|
|
91
|
+
return this.db.list(target);
|
|
92
|
+
}
|
|
93
|
+
get(id) {
|
|
94
|
+
return this.db.get(id);
|
|
95
|
+
}
|
|
96
|
+
update(id, params) {
|
|
97
|
+
if (params.timezone !== undefined) {
|
|
98
|
+
validateTimezone(params.timezone, "timezone");
|
|
99
|
+
}
|
|
100
|
+
if (params.cron !== undefined) {
|
|
101
|
+
try {
|
|
102
|
+
new Cron(params.cron, { timezone: params.timezone ?? this.db.get(id)?.timezone ?? this.config.default_timezone });
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
throw new Error(`Invalid cron expression: ${err.message}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (params.target !== undefined && !this.isValidInstance(params.target)) {
|
|
109
|
+
throw new Error(`Instance "${params.target}" not found in fleet config.`);
|
|
110
|
+
}
|
|
111
|
+
const updated = this.db.update(id, params);
|
|
112
|
+
this.stopJob(id);
|
|
113
|
+
if (updated.enabled) {
|
|
114
|
+
this.registerJob(updated);
|
|
115
|
+
}
|
|
116
|
+
return updated;
|
|
117
|
+
}
|
|
118
|
+
delete(id) {
|
|
119
|
+
this.stopJob(id);
|
|
120
|
+
this.db.delete(id);
|
|
121
|
+
}
|
|
122
|
+
trigger(id) {
|
|
123
|
+
const schedule = this.db.get(id);
|
|
124
|
+
if (!schedule)
|
|
125
|
+
throw new Error(`Schedule "${id}" not found.`);
|
|
126
|
+
if (this.executing.has(id)) {
|
|
127
|
+
throw new Error(`Schedule "${id}" is already running.`);
|
|
128
|
+
}
|
|
129
|
+
this.runWithLock(schedule);
|
|
130
|
+
}
|
|
131
|
+
/** Invoke onTrigger while holding the per-schedule lock. Cleans up when
|
|
132
|
+
* the callback returns synchronously, throws, or settles a returned Promise. */
|
|
133
|
+
runWithLock(schedule) {
|
|
134
|
+
this.executing.add(schedule.id);
|
|
135
|
+
let result;
|
|
136
|
+
try {
|
|
137
|
+
result = this.onTrigger(schedule);
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
this.executing.delete(schedule.id);
|
|
141
|
+
throw err;
|
|
142
|
+
}
|
|
143
|
+
if (result && typeof result.then === "function") {
|
|
144
|
+
result.finally(() => this.executing.delete(schedule.id));
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
this.executing.delete(schedule.id);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
deleteByInstanceOrThread(instanceName, threadId) {
|
|
151
|
+
const affected = this.db.list().filter((s) => s.target === instanceName || s.reply_thread_id === threadId);
|
|
152
|
+
for (const s of affected) {
|
|
153
|
+
this.stopJob(s.id);
|
|
154
|
+
}
|
|
155
|
+
return this.db.deleteByInstanceOrThread(instanceName, threadId);
|
|
156
|
+
}
|
|
157
|
+
recordRun(scheduleId, status, detail) {
|
|
158
|
+
this.db.recordRun(scheduleId, status, detail);
|
|
159
|
+
}
|
|
160
|
+
getRuns(scheduleId, limit) {
|
|
161
|
+
return this.db.getRuns(scheduleId, limit);
|
|
162
|
+
}
|
|
163
|
+
registerAllJobs() {
|
|
164
|
+
for (const schedule of this.db.list()) {
|
|
165
|
+
if (schedule.enabled) {
|
|
166
|
+
this.registerJob(schedule);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
registerJob(schedule) {
|
|
171
|
+
const job = new Cron(schedule.cron, { timezone: schedule.timezone }, () => {
|
|
172
|
+
const current = this.db.get(schedule.id);
|
|
173
|
+
if (!current || !current.enabled)
|
|
174
|
+
return;
|
|
175
|
+
// Skip if a previous fire (or manual trigger) is still in flight —
|
|
176
|
+
// avoids overlapping runs of the same schedule.
|
|
177
|
+
if (this.executing.has(current.id))
|
|
178
|
+
return;
|
|
179
|
+
this.runWithLock(current);
|
|
180
|
+
});
|
|
181
|
+
this.jobs.set(schedule.id, job);
|
|
182
|
+
}
|
|
183
|
+
stopJob(id) {
|
|
184
|
+
const job = this.jobs.get(id);
|
|
185
|
+
if (job) {
|
|
186
|
+
job.stop();
|
|
187
|
+
this.jobs.delete(id);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
stopAllJobs() {
|
|
191
|
+
for (const [, job] of this.jobs) {
|
|
192
|
+
job.stop();
|
|
193
|
+
}
|
|
194
|
+
this.jobs.clear();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/scheduler/scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { Scheduler } from "./scheduler.js";
|
|
6
|
+
import { DEFAULT_SCHEDULER_CONFIG } from "./types.js";
|
|
7
|
+
describe("Scheduler", () => {
|
|
8
|
+
let dir;
|
|
9
|
+
let scheduler;
|
|
10
|
+
let triggered;
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
dir = mkdtempSync(join(tmpdir(), "scheduler-engine-test-"));
|
|
13
|
+
triggered = [];
|
|
14
|
+
scheduler = new Scheduler(join(dir, "scheduler.db"), (schedule) => { triggered.push(schedule); }, DEFAULT_SCHEDULER_CONFIG, (instanceName) => true);
|
|
15
|
+
scheduler.init();
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
scheduler.shutdown();
|
|
19
|
+
rmSync(dir, { recursive: true, force: true });
|
|
20
|
+
});
|
|
21
|
+
it("creates a schedule and registers cron job", () => {
|
|
22
|
+
const s = scheduler.create({
|
|
23
|
+
cron: "0 7 * * *",
|
|
24
|
+
message: "hello",
|
|
25
|
+
source: "proj-a",
|
|
26
|
+
target: "proj-a",
|
|
27
|
+
reply_chat_id: "1",
|
|
28
|
+
reply_thread_id: null,
|
|
29
|
+
});
|
|
30
|
+
expect(s.id).toBeTruthy();
|
|
31
|
+
expect(scheduler.list()).toHaveLength(1);
|
|
32
|
+
});
|
|
33
|
+
it("rejects invalid cron expression", () => {
|
|
34
|
+
expect(() => scheduler.create({
|
|
35
|
+
cron: "not a cron",
|
|
36
|
+
message: "hello",
|
|
37
|
+
source: "a",
|
|
38
|
+
target: "a",
|
|
39
|
+
reply_chat_id: "1",
|
|
40
|
+
reply_thread_id: null,
|
|
41
|
+
})).toThrow(/cron/i);
|
|
42
|
+
});
|
|
43
|
+
it("rejects invalid target instance", () => {
|
|
44
|
+
const s2 = new Scheduler(join(dir, "scheduler2.db"), () => { }, DEFAULT_SCHEDULER_CONFIG, (name) => name === "proj-a");
|
|
45
|
+
s2.init();
|
|
46
|
+
expect(() => s2.create({
|
|
47
|
+
cron: "0 7 * * *",
|
|
48
|
+
message: "hello",
|
|
49
|
+
source: "proj-a",
|
|
50
|
+
target: "nonexistent",
|
|
51
|
+
reply_chat_id: "1",
|
|
52
|
+
reply_thread_id: null,
|
|
53
|
+
})).toThrow(/not found/i);
|
|
54
|
+
s2.shutdown();
|
|
55
|
+
});
|
|
56
|
+
it("manual trigger calls onTrigger callback", () => {
|
|
57
|
+
const s = scheduler.create({
|
|
58
|
+
cron: "0 7 * * *",
|
|
59
|
+
message: "hello",
|
|
60
|
+
source: "proj-a",
|
|
61
|
+
target: "proj-a",
|
|
62
|
+
reply_chat_id: "1",
|
|
63
|
+
reply_thread_id: null,
|
|
64
|
+
});
|
|
65
|
+
scheduler.trigger(s.id);
|
|
66
|
+
expect(triggered).toHaveLength(1);
|
|
67
|
+
expect(triggered[0].id).toBe(s.id);
|
|
68
|
+
});
|
|
69
|
+
it("delete removes schedule and cron job", () => {
|
|
70
|
+
const s = scheduler.create({
|
|
71
|
+
cron: "0 7 * * *",
|
|
72
|
+
message: "hello",
|
|
73
|
+
source: "a",
|
|
74
|
+
target: "a",
|
|
75
|
+
reply_chat_id: "1",
|
|
76
|
+
reply_thread_id: null,
|
|
77
|
+
});
|
|
78
|
+
scheduler.delete(s.id);
|
|
79
|
+
expect(scheduler.list()).toHaveLength(0);
|
|
80
|
+
});
|
|
81
|
+
it("update reschedules cron job", () => {
|
|
82
|
+
const s = scheduler.create({
|
|
83
|
+
cron: "0 7 * * *",
|
|
84
|
+
message: "hello",
|
|
85
|
+
source: "a",
|
|
86
|
+
target: "a",
|
|
87
|
+
reply_chat_id: "1",
|
|
88
|
+
reply_thread_id: null,
|
|
89
|
+
});
|
|
90
|
+
const updated = scheduler.update(s.id, { cron: "0 8 * * *" });
|
|
91
|
+
expect(updated.cron).toBe("0 8 * * *");
|
|
92
|
+
});
|
|
93
|
+
it("reload clears and re-registers all jobs", () => {
|
|
94
|
+
scheduler.create({
|
|
95
|
+
cron: "0 7 * * *",
|
|
96
|
+
message: "hello",
|
|
97
|
+
source: "a",
|
|
98
|
+
target: "a",
|
|
99
|
+
reply_chat_id: "1",
|
|
100
|
+
reply_thread_id: null,
|
|
101
|
+
});
|
|
102
|
+
scheduler.reload();
|
|
103
|
+
expect(scheduler.list()).toHaveLength(1);
|
|
104
|
+
});
|
|
105
|
+
it("deleteByInstanceOrThread cleans up and removes cron jobs", () => {
|
|
106
|
+
scheduler.create({
|
|
107
|
+
cron: "0 7 * * *",
|
|
108
|
+
message: "a",
|
|
109
|
+
source: "a",
|
|
110
|
+
target: "proj-a",
|
|
111
|
+
reply_chat_id: "1",
|
|
112
|
+
reply_thread_id: "42",
|
|
113
|
+
});
|
|
114
|
+
const count = scheduler.deleteByInstanceOrThread("proj-a", "42");
|
|
115
|
+
expect(count).toBe(1);
|
|
116
|
+
expect(scheduler.list()).toHaveLength(0);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
//# sourceMappingURL=scheduler.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.test.js","sourceRoot":"","sources":["../../src/scheduler/scheduler.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
export interface Schedule {
|
|
2
|
+
id: string;
|
|
3
|
+
cron: string;
|
|
4
|
+
message: string;
|
|
5
|
+
source: string;
|
|
6
|
+
target: string;
|
|
7
|
+
reply_chat_id: string;
|
|
8
|
+
reply_thread_id: string | null;
|
|
9
|
+
label: string | null;
|
|
10
|
+
enabled: boolean;
|
|
11
|
+
timezone: string;
|
|
12
|
+
created_at: string;
|
|
13
|
+
last_triggered_at: string | null;
|
|
14
|
+
last_status: string | null;
|
|
15
|
+
}
|
|
16
|
+
export interface ScheduleRun {
|
|
17
|
+
id: number;
|
|
18
|
+
schedule_id: string;
|
|
19
|
+
triggered_at: string;
|
|
20
|
+
status: "delivered" | "delivered_fallback" | "retry" | "instance_offline" | "channel_dead";
|
|
21
|
+
detail: string | null;
|
|
22
|
+
}
|
|
23
|
+
export interface CreateScheduleParams {
|
|
24
|
+
cron: string;
|
|
25
|
+
message: string;
|
|
26
|
+
source: string;
|
|
27
|
+
target: string;
|
|
28
|
+
reply_chat_id: string;
|
|
29
|
+
reply_thread_id: string | null;
|
|
30
|
+
label?: string;
|
|
31
|
+
timezone?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface UpdateScheduleParams {
|
|
34
|
+
cron?: string;
|
|
35
|
+
message?: string;
|
|
36
|
+
target?: string;
|
|
37
|
+
label?: string;
|
|
38
|
+
timezone?: string;
|
|
39
|
+
enabled?: boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface SchedulerConfig {
|
|
42
|
+
max_schedules: number;
|
|
43
|
+
default_timezone: string;
|
|
44
|
+
retry_count: number;
|
|
45
|
+
retry_interval_ms: number;
|
|
46
|
+
}
|
|
47
|
+
export declare const DEFAULT_SCHEDULER_CONFIG: SchedulerConfig;
|
|
48
|
+
export type DecisionStatus = "active" | "superseded" | "archived";
|
|
49
|
+
export type DecisionScope = "project" | "fleet";
|
|
50
|
+
export interface Decision {
|
|
51
|
+
id: string;
|
|
52
|
+
project_root: string;
|
|
53
|
+
scope: DecisionScope;
|
|
54
|
+
title: string;
|
|
55
|
+
content: string;
|
|
56
|
+
tags: string[];
|
|
57
|
+
status: DecisionStatus;
|
|
58
|
+
superseded_by: string | null;
|
|
59
|
+
created_by: string;
|
|
60
|
+
created_at: string;
|
|
61
|
+
expires_at: string | null;
|
|
62
|
+
updated_at: string;
|
|
63
|
+
}
|
|
64
|
+
export interface CreateDecisionParams {
|
|
65
|
+
project_root: string;
|
|
66
|
+
scope?: DecisionScope;
|
|
67
|
+
title: string;
|
|
68
|
+
content: string;
|
|
69
|
+
tags?: string[];
|
|
70
|
+
ttl_days?: number;
|
|
71
|
+
created_by: string;
|
|
72
|
+
supersedes?: string;
|
|
73
|
+
}
|
|
74
|
+
export interface UpdateDecisionParams {
|
|
75
|
+
content?: string;
|
|
76
|
+
tags?: string[];
|
|
77
|
+
ttl_days?: number;
|
|
78
|
+
}
|
|
79
|
+
export type TaskStatus = "open" | "claimed" | "done" | "blocked" | "cancelled";
|
|
80
|
+
export type TaskPriority = "low" | "normal" | "high" | "urgent";
|
|
81
|
+
export interface Task {
|
|
82
|
+
id: string;
|
|
83
|
+
title: string;
|
|
84
|
+
description: string | null;
|
|
85
|
+
status: TaskStatus;
|
|
86
|
+
priority: TaskPriority;
|
|
87
|
+
assignee: string | null;
|
|
88
|
+
created_by: string;
|
|
89
|
+
depends_on: string[];
|
|
90
|
+
result: string | null;
|
|
91
|
+
created_at: string;
|
|
92
|
+
updated_at: string;
|
|
93
|
+
}
|
|
94
|
+
export interface CreateTaskParams {
|
|
95
|
+
title: string;
|
|
96
|
+
description?: string;
|
|
97
|
+
priority?: TaskPriority;
|
|
98
|
+
assignee?: string;
|
|
99
|
+
depends_on?: string[];
|
|
100
|
+
created_by: string;
|
|
101
|
+
}
|
|
102
|
+
export interface UpdateTaskParams {
|
|
103
|
+
status?: TaskStatus;
|
|
104
|
+
assignee?: string;
|
|
105
|
+
result?: string;
|
|
106
|
+
priority?: TaskPriority;
|
|
107
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scheduler/types.ts"],"names":[],"mappings":"AAmDA,MAAM,CAAC,MAAM,wBAAwB,GAAoB;IACvD,aAAa,EAAE,GAAG;IAClB,gBAAgB,EAAE,aAAa;IAC/B,WAAW,EAAE,CAAC;IACd,iBAAiB,EAAE,MAAM;CAC1B,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface ServiceVars {
|
|
2
|
+
label: string;
|
|
3
|
+
execPath: string;
|
|
4
|
+
path?: string;
|
|
5
|
+
workingDirectory: string;
|
|
6
|
+
logPath: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function detectPlatform(): "macos" | "linux";
|
|
9
|
+
export declare function renderLaunchdPlist(vars: ServiceVars): string;
|
|
10
|
+
export declare function renderSystemdUnit(vars: ServiceVars): string;
|
|
11
|
+
export declare function uninstallService(label: string): boolean;
|
|
12
|
+
export declare function installService(vars: ServiceVars): string;
|
|
13
|
+
export declare function getServicePath(): string | null;
|
|
14
|
+
export declare function stopService(): boolean;
|
|
15
|
+
export declare function startService(): boolean;
|
|
16
|
+
export declare function activateService(plistPath: string, pidPath: string): void;
|
|
17
|
+
export {};
|