0xkobold 0.3.3 → 0.4.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/HEARTBEAT.md +100 -40
- package/dist/package.json +1 -1
- package/dist/src/cli/commands/cron.js +352 -0
- package/dist/src/cli/commands/cron.js.map +1 -0
- package/dist/src/cli/program.js +4 -0
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/cron/index.js +38 -0
- package/dist/src/cron/index.js.map +1 -0
- package/dist/src/cron/notifications.js +152 -0
- package/dist/src/cron/notifications.js.map +1 -0
- package/dist/src/cron/parser.js +294 -0
- package/dist/src/cron/parser.js.map +1 -0
- package/dist/src/cron/runner.js +251 -0
- package/dist/src/cron/runner.js.map +1 -0
- package/dist/src/cron/scheduler.js +524 -0
- package/dist/src/cron/scheduler.js.map +1 -0
- package/dist/src/cron/types.js +8 -0
- package/dist/src/cron/types.js.map +1 -0
- package/dist/src/extensions/core/session-manager-extension.js +17 -0
- package/dist/src/extensions/core/session-manager-extension.js.map +1 -1
- package/package.json +1 -1
package/HEARTBEAT.md
CHANGED
|
@@ -1,61 +1,121 @@
|
|
|
1
1
|
# 🤖 Agent Self-Monitor Heartbeat
|
|
2
2
|
|
|
3
3
|
**Session Active Since:** 2025-01-09 05:42 UTC
|
|
4
|
-
**Current Time:** ~
|
|
5
|
-
**
|
|
4
|
+
**Current Time:** ~17:00 UTC
|
|
5
|
+
**Version:** v0.4.1
|
|
6
|
+
**Status:** ✅ **CRON + NOTIFICATIONS + SYSTEMD - PRODUCTION READY**
|
|
6
7
|
|
|
7
8
|
---
|
|
8
9
|
|
|
9
|
-
## ✅
|
|
10
|
+
## ✅ Current Status
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
| Metric | Value |
|
|
13
|
+
|--------|-------|
|
|
14
|
+
| **Version** | **0.4.1** (notifications + systemd) |
|
|
15
|
+
| **Tests** | 291 pass / 19 skip / 0 fail |
|
|
16
|
+
| **Features** | 14 core + persona + cron + notifications |
|
|
17
|
+
| **Documentation** | 16,000+ lines |
|
|
18
|
+
| **Build** | ✅ Clean |
|
|
19
|
+
| **Commits** | 80+ since start |
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 🎉 COMPLETED TODAY
|
|
12
24
|
|
|
13
|
-
###
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
25
|
+
### 1. ✅ Cron Notifications (v0.4.1)
|
|
26
|
+
- **Telegram** notifications via Bot API
|
|
27
|
+
- **Discord** rich embed notifications
|
|
28
|
+
- **Slack** webhook support
|
|
29
|
+
- **WhatsApp** (placeholder - needs Baileys)
|
|
30
|
+
- CLI: `--notify telegram:CHAT_ID` or `--notify discord:CHANNEL_ID`
|
|
31
|
+
- Success/error notification controls
|
|
32
|
+
- Custom prefixes
|
|
17
33
|
|
|
18
|
-
###
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
34
|
+
### 2. ✅ Systemd Service (v0.4.1)
|
|
35
|
+
- Production-ready systemd service file
|
|
36
|
+
- Auto-restart on failure
|
|
37
|
+
- Security hardening (ProtectSystem, NoNewPrivileges)
|
|
38
|
+
- One-liner install script
|
|
39
|
+
|
|
40
|
+
### 3. ✅ VPS Deployment Docs (v0.4.1)
|
|
41
|
+
- `docs/VPS-INSTALL.md` - Quick deploy guide
|
|
42
|
+
- `scripts/install.sh` - Automated install
|
|
43
|
+
- `scripts/systemd/0xkobold.service` - Service file
|
|
23
44
|
|
|
24
45
|
---
|
|
25
46
|
|
|
26
|
-
## 📊
|
|
47
|
+
## 📊 Full Feature Status
|
|
27
48
|
|
|
28
|
-
|
|
|
29
|
-
|
|
30
|
-
| **
|
|
31
|
-
|
|
|
32
|
-
|
|
|
33
|
-
|
|
|
34
|
-
|
|
|
35
|
-
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
12. ✅ OpenClaw Migration
|
|
49
|
+
| Feature | Status | Notes |
|
|
50
|
+
|---------|--------|-------|
|
|
51
|
+
| ✅ **Cron Jobs** | Complete | Full OpenClaw parity |
|
|
52
|
+
| ✅ **Notifications** | Complete | Telegram/Discord/Slack |
|
|
53
|
+
| ✅ **Systemd** | Complete | Production service |
|
|
54
|
+
| ✅ **LLM Integration** | Complete | Real API calls verified |
|
|
55
|
+
| ✅ **Heartbeat** | Complete | HEARTBEAT.md system |
|
|
56
|
+
| ✅ WhatsApp | Complete | Baileys integration |
|
|
57
|
+
| ✅ Docker Sandbox | Complete | Safe command execution |
|
|
58
|
+
| ✅ Device Auth | Complete | Token-based auth |
|
|
59
|
+
| ✅ Vision/Audio | Complete | Media processing |
|
|
60
|
+
| ✅ Telegram | Complete | Bot API |
|
|
61
|
+
| ✅ Slack | Complete | Webhook |
|
|
62
|
+
| ✅ PDF | Complete | Document parsing |
|
|
63
|
+
| ✅ Config Manager | Complete | JSON/YAML/SQLite |
|
|
64
|
+
| ✅ Remote Gateway | Complete | WebSocket server |
|
|
65
|
+
| ✅ Tailscale | Complete | VPN integration |
|
|
66
|
+
| ✅ Duplicate Detection | Complete | Semantic search |
|
|
67
|
+
| ✅ OpenClaw Migration | Complete | Import tools |
|
|
68
|
+
| ✅ Persona System | Complete | 5 files |
|
|
69
|
+
| ✅ Interactive Init | Complete | Customizable |
|
|
50
70
|
|
|
51
71
|
---
|
|
52
72
|
|
|
53
|
-
##
|
|
73
|
+
## 🚀 VPS Deploy for Stream Tonight
|
|
54
74
|
|
|
55
75
|
```bash
|
|
56
|
-
|
|
76
|
+
# SSH to your VPS, then:
|
|
77
|
+
|
|
78
|
+
# 1. Install Bun + 0xKobold
|
|
79
|
+
curl -fsSL https://bun.sh/install | bash && \
|
|
80
|
+
export PATH="$HOME/.bun/bin:$PATH" && \
|
|
81
|
+
bun install -g 0xkobold
|
|
82
|
+
|
|
83
|
+
# 2. Initialize
|
|
84
|
+
0xkobold init --quick
|
|
85
|
+
|
|
86
|
+
# 3. Set Discord token
|
|
87
|
+
export DISCORD_BOT_TOKEN="your_token"
|
|
88
|
+
|
|
89
|
+
# 4. Add job that notifies Discord
|
|
90
|
+
0xkobold cron add \
|
|
91
|
+
--name "Live Stream Demo" \
|
|
92
|
+
--at "1m" \
|
|
93
|
+
--notify discord:YOUR_CHANNEL_ID \
|
|
94
|
+
--notify-prefix "🎬 Live on stream!" \
|
|
95
|
+
--message "Generate a creative greeting for viewers" \
|
|
96
|
+
--delete
|
|
97
|
+
|
|
98
|
+
# 5. Start scheduler
|
|
99
|
+
0xkobold cron start
|
|
100
|
+
|
|
101
|
+
# 6. (Optional) Enable systemd auto-start
|
|
102
|
+
sudo cp ~/.bun/install/global/node_modules/0xkobold/scripts/systemd/0xkobold.service /etc/systemd/system/
|
|
103
|
+
sudo systemctl enable --now 0xkobold
|
|
57
104
|
```
|
|
58
105
|
|
|
59
|
-
**
|
|
106
|
+
**Result:** In 1 minute, your Discord channel gets the AI's response! 🎉
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 📦 Version History
|
|
111
|
+
|
|
112
|
+
| Version | Date | Notes |
|
|
113
|
+
|---------|------|-------|
|
|
114
|
+
| 0.3.0 | 2025-01-09 | Initial release |
|
|
115
|
+
| 0.3.1-0.3.3 | 2025-01-09 | Init fixes, persona system |
|
|
116
|
+
| 0.4.0 | 2025-01-09 | Full cron system |
|
|
117
|
+
| **0.4.1** | **2025-01-09** | **Notifications + systemd** |
|
|
118
|
+
|
|
119
|
+
---
|
|
60
120
|
|
|
61
|
-
|
|
121
|
+
**HEARTBEAT_OK** ✅ - Production-ready for VPS deployment!
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "0xkobold",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"description": "Your digital familiar - a personal AI assistant that learns and evolves (v0.3.0 - Multi-Channel, Security, Media Support)",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"types": "dist/src/index.d.ts",
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 0xKobold Cron CLI Command
|
|
3
|
+
*
|
|
4
|
+
* CLI commands for managing cron jobs.
|
|
5
|
+
* Follows OpenClaw cron command structure.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from "commander";
|
|
8
|
+
import { getCronScheduler } from "../../cron/scheduler.js";
|
|
9
|
+
export const cronCommand = new Command("cron").description("Manage scheduled cron jobs");
|
|
10
|
+
// List all jobs
|
|
11
|
+
cronCommand
|
|
12
|
+
.command("list")
|
|
13
|
+
.alias("ls")
|
|
14
|
+
.description("List all jobs")
|
|
15
|
+
.option("-a, --all", "Show disabled jobs too")
|
|
16
|
+
.action(async () => {
|
|
17
|
+
const scheduler = getCronScheduler();
|
|
18
|
+
const jobs = scheduler.getJobStatus();
|
|
19
|
+
if (jobs.length === 0) {
|
|
20
|
+
console.log("No jobs scheduled.");
|
|
21
|
+
console.log("Run: 0xkobold cron add --name '...' --cron '...' --message '...'");
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
console.log(`\n📋 Scheduled Jobs (${jobs.length}):\n`);
|
|
25
|
+
for (const job of jobs) {
|
|
26
|
+
const statusIcon = job.status === "disabled" ? "⚪" : "🟢";
|
|
27
|
+
const sessionIcon = job.session === "main" ? "🔗" : "🏝️";
|
|
28
|
+
console.log(`${statusIcon} ${sessionIcon} ${job.name}`);
|
|
29
|
+
console.log(` ID: ${job.id}`);
|
|
30
|
+
console.log(` Schedule: ${job.schedule}`);
|
|
31
|
+
console.log(` Session: ${job.session}`);
|
|
32
|
+
if (job.nextRun) {
|
|
33
|
+
console.log(` Next Run: ${job.nextRun}`);
|
|
34
|
+
}
|
|
35
|
+
if (job.lastRun) {
|
|
36
|
+
console.log(` Last Run: ${job.lastRun}`);
|
|
37
|
+
}
|
|
38
|
+
console.log(` Status: ${job.status}`);
|
|
39
|
+
console.log(` Runs: ${job.runCount}`);
|
|
40
|
+
console.log("");
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
// Add a job
|
|
44
|
+
cronCommand
|
|
45
|
+
.command("add")
|
|
46
|
+
.description("Add a new job")
|
|
47
|
+
.requiredOption("-n, --name <name>", "Job name")
|
|
48
|
+
.option("-c, --cron <expression>", "Cron expression (e.g., '0 9 * * *')")
|
|
49
|
+
.option("-a, --at <time>", "One-shot: duration (e.g., '20m') or absolute time")
|
|
50
|
+
.option("-t, --timezone <timezone>", "Timezone (default: system)")
|
|
51
|
+
.option("-s, --session <type>", "Session type: main | isolated", "isolated")
|
|
52
|
+
.option("-m, --message <msg>", "Message/prompt for the job")
|
|
53
|
+
.option("--model <model>", "Model override")
|
|
54
|
+
.option("--thinking <level>", "Thinking level: fast | normal | deep")
|
|
55
|
+
.option("-d, --delete", "Delete after run (one-shots)")
|
|
56
|
+
.option("-w, --wake", "Wake main session after completion")
|
|
57
|
+
.option("--working-dir <dir>", "Working directory")
|
|
58
|
+
.option("--notify <channel:recipient>", "Notify channel (telegram:CHAT_ID, discord:CHANNEL_ID, slack:WEBHOOK_URL)")
|
|
59
|
+
.option("--notify-on-success", "Notify on success (default: true)", true)
|
|
60
|
+
.option("--notify-on-error", "Notify on error (default: true)", true)
|
|
61
|
+
.option("--notify-prefix <text>", "Add prefix to notification message")
|
|
62
|
+
.action(async (options) => {
|
|
63
|
+
// Parse notification option
|
|
64
|
+
let notifyConfig;
|
|
65
|
+
if (options.notify) {
|
|
66
|
+
const parts = options.notify.split(':');
|
|
67
|
+
if (parts.length < 2) {
|
|
68
|
+
console.error('❌ Error: --notify must be in format channel:recipient (e.g., telegram:123456 or discord:789012)');
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
const channel = parts[0];
|
|
72
|
+
const recipient = parts.slice(1).join(':'); // Handle URLs that contain colons
|
|
73
|
+
notifyConfig = {
|
|
74
|
+
channel,
|
|
75
|
+
recipient,
|
|
76
|
+
onSuccess: options.notifyOnSuccess,
|
|
77
|
+
onError: options.notifyOnError,
|
|
78
|
+
prefix: options.notifyPrefix,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
if (!options.cron && !options.at) {
|
|
82
|
+
console.error("❌ Error: Either --cron or --at is required");
|
|
83
|
+
console.error(" --cron '0 9 * * *' (recurring)");
|
|
84
|
+
console.error(" --at '20m' (one-shot in 20 minutes)");
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
if (!options.message) {
|
|
88
|
+
console.error("❌ Error: --message is required");
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
const scheduler = getCronScheduler();
|
|
92
|
+
try {
|
|
93
|
+
const job = scheduler.addJob({
|
|
94
|
+
name: options.name,
|
|
95
|
+
cron: options.cron,
|
|
96
|
+
at: options.at,
|
|
97
|
+
timezone: options.timezone,
|
|
98
|
+
session: options.session,
|
|
99
|
+
message: options.message,
|
|
100
|
+
model: options.model,
|
|
101
|
+
thinkingLevel: options.thinking,
|
|
102
|
+
deleteAfterRun: options.delete,
|
|
103
|
+
wake: options.wake,
|
|
104
|
+
workingDir: options.workingDir,
|
|
105
|
+
notify: notifyConfig,
|
|
106
|
+
});
|
|
107
|
+
console.log(`\n✅ Job created: ${job.name}`);
|
|
108
|
+
console.log(` ID: ${job.id}`);
|
|
109
|
+
console.log(` Session: ${job.session}`);
|
|
110
|
+
if (job.cronExpression) {
|
|
111
|
+
console.log(` Schedule: ${job.cronExpression}`);
|
|
112
|
+
}
|
|
113
|
+
else if (job.at) {
|
|
114
|
+
const date = new Date(job.at);
|
|
115
|
+
console.log(` At: ${date.toLocaleString()}`);
|
|
116
|
+
}
|
|
117
|
+
console.log(` Next Run: ${new Date(job.nextRunAt).toLocaleString()}`);
|
|
118
|
+
if (job.model) {
|
|
119
|
+
console.log(` Model: ${job.model}`);
|
|
120
|
+
}
|
|
121
|
+
if (job.deleteAfterRun) {
|
|
122
|
+
console.log(" ⚠️ Will delete after run");
|
|
123
|
+
}
|
|
124
|
+
if (job.wakeAfterRun) {
|
|
125
|
+
console.log(" 🔔 Will wake main session");
|
|
126
|
+
}
|
|
127
|
+
console.log("\nUse: 0xkobold cron list (to see all jobs)");
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
131
|
+
console.error(`❌ Failed to create job: ${msg}`);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
// Remove a job
|
|
136
|
+
cronCommand
|
|
137
|
+
.command("remove <id>")
|
|
138
|
+
.alias("rm")
|
|
139
|
+
.description("Remove a job by ID")
|
|
140
|
+
.action(async (id) => {
|
|
141
|
+
const scheduler = getCronScheduler();
|
|
142
|
+
const success = scheduler.removeJob(id);
|
|
143
|
+
if (success) {
|
|
144
|
+
console.log(`✅ Job removed: ${id}`);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
console.error(`❌ Job not found: ${id}`);
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
// Enable a job
|
|
152
|
+
cronCommand
|
|
153
|
+
.command("enable <id>")
|
|
154
|
+
.description("Enable a disabled job")
|
|
155
|
+
.action(async (id) => {
|
|
156
|
+
const scheduler = getCronScheduler();
|
|
157
|
+
const success = scheduler.enableJob(id);
|
|
158
|
+
if (success) {
|
|
159
|
+
console.log(`✅ Job enabled: ${id}`);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
console.error(`❌ Job not found: ${id}`);
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
// Disable a job
|
|
167
|
+
cronCommand
|
|
168
|
+
.command("disable <id>")
|
|
169
|
+
.description("Disable a job (without removing)")
|
|
170
|
+
.action(async (id) => {
|
|
171
|
+
const scheduler = getCronScheduler();
|
|
172
|
+
const success = scheduler.disableJob(id);
|
|
173
|
+
if (success) {
|
|
174
|
+
console.log(`✅ Job disabled: ${id}`);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
console.error(`❌ Job not found: ${id}`);
|
|
178
|
+
process.exit(1);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
// Show upcoming jobs
|
|
182
|
+
cronCommand
|
|
183
|
+
.command("upcoming")
|
|
184
|
+
.description("Show upcoming jobs")
|
|
185
|
+
.option("-n, --limit <n>", "Number of jobs to show", "10")
|
|
186
|
+
.action(async (options) => {
|
|
187
|
+
const scheduler = getCronScheduler();
|
|
188
|
+
const jobs = scheduler.getUpcoming(parseInt(options.limit, 10));
|
|
189
|
+
if (jobs.length === 0) {
|
|
190
|
+
console.log("No upcoming jobs.");
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
console.log(`\n⏰ Upcoming Jobs (${jobs.length}):\n`);
|
|
194
|
+
for (const job of jobs) {
|
|
195
|
+
const sessionIcon = job.session === "main" ? "🔗" : "🏝️";
|
|
196
|
+
const nextRun = new Date(job.nextRunAt).toLocaleString();
|
|
197
|
+
console.log(`${sessionIcon} ${job.name}`);
|
|
198
|
+
console.log(` Next: ${nextRun}`);
|
|
199
|
+
if (job.cronExpression) {
|
|
200
|
+
console.log(` Cron: ${job.cronExpression}`);
|
|
201
|
+
}
|
|
202
|
+
console.log("");
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
// Show job details
|
|
206
|
+
cronCommand
|
|
207
|
+
.command("show <id>")
|
|
208
|
+
.description("Show job details and recent history")
|
|
209
|
+
.option("-n, --history <n>", "Number of history entries", "5")
|
|
210
|
+
.action(async (id, options) => {
|
|
211
|
+
const scheduler = getCronScheduler();
|
|
212
|
+
const job = scheduler.getJob(id);
|
|
213
|
+
if (!job) {
|
|
214
|
+
console.error(`❌ Job not found: ${id}`);
|
|
215
|
+
process.exit(1);
|
|
216
|
+
}
|
|
217
|
+
console.log(`\n📄 Job Details: ${job.name}\n`);
|
|
218
|
+
console.log(`ID: ${job.id}`);
|
|
219
|
+
console.log(`Name: ${job.name}`);
|
|
220
|
+
console.log(`Status: ${job.enabled ? "🟢 enabled" : "⚪ disabled"}`);
|
|
221
|
+
console.log(`Session: ${job.session}`);
|
|
222
|
+
if (job.cronExpression) {
|
|
223
|
+
console.log(`Schedule: ${job.cronExpression}`);
|
|
224
|
+
}
|
|
225
|
+
if (job.at) {
|
|
226
|
+
console.log(`One-shot: ${new Date(job.at).toLocaleString()}`);
|
|
227
|
+
}
|
|
228
|
+
console.log(`Timezone: ${job.timezone}`);
|
|
229
|
+
console.log(`Next Run: ${new Date(job.nextRunAt).toLocaleString()}`);
|
|
230
|
+
console.log(`\nMessage:\n${job.message.substring(0, 200)}${job.message.length > 200 ? "..." : ""}`);
|
|
231
|
+
if (job.model) {
|
|
232
|
+
console.log(`\nModel: ${job.model}`);
|
|
233
|
+
}
|
|
234
|
+
console.log(`\nStats:`);
|
|
235
|
+
console.log(` Runs: ${job.runCount}`);
|
|
236
|
+
console.log(` Errors: ${job.errorCount}`);
|
|
237
|
+
if (job.lastRunAt) {
|
|
238
|
+
console.log(` Last Run: ${new Date(job.lastRunAt).toLocaleString()}`);
|
|
239
|
+
}
|
|
240
|
+
// Show recent history
|
|
241
|
+
const history = scheduler.getJobHistory(id, parseInt(options.history, 10));
|
|
242
|
+
if (history.length > 0) {
|
|
243
|
+
console.log(`\n📜 Recent History:`);
|
|
244
|
+
for (const run of history) {
|
|
245
|
+
const icon = run.success ? "✅" : "❌";
|
|
246
|
+
const date = new Date(run.startedAt).toLocaleString();
|
|
247
|
+
console.log(`\n ${icon} ${date}`);
|
|
248
|
+
console.log(` Tokens: ${run.tokensUsed}`);
|
|
249
|
+
if (run.error) {
|
|
250
|
+
console.log(` Error: ${run.error.substring(0, 100)}...`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
console.log("");
|
|
255
|
+
});
|
|
256
|
+
// Show statistics
|
|
257
|
+
cronCommand
|
|
258
|
+
.command("stats")
|
|
259
|
+
.description("Show scheduler statistics")
|
|
260
|
+
.action(async () => {
|
|
261
|
+
const scheduler = getCronScheduler();
|
|
262
|
+
const stats = scheduler.getStats();
|
|
263
|
+
console.log("\n📊 Cron Scheduler Statistics\n");
|
|
264
|
+
console.log(`Total Jobs: ${stats.totalJobs}`);
|
|
265
|
+
console.log(`Enabled Jobs: ${stats.enabledJobs}`);
|
|
266
|
+
console.log(`Active Jobs: ${stats.activeJobs}`);
|
|
267
|
+
console.log(`Total Runs: ${stats.totalRuns}`);
|
|
268
|
+
if (stats.totalRuns > 0) {
|
|
269
|
+
console.log(`Successful Runs: ${stats.successfulRuns}`);
|
|
270
|
+
console.log(`Failed Runs: ${stats.failedRuns}`);
|
|
271
|
+
console.log(`Success Rate: ${((stats.successfulRuns / stats.totalRuns) * 100).toFixed(1)}%`);
|
|
272
|
+
}
|
|
273
|
+
console.log("");
|
|
274
|
+
});
|
|
275
|
+
// Start the scheduler
|
|
276
|
+
cronCommand
|
|
277
|
+
.command("start")
|
|
278
|
+
.description("Start the cron scheduler daemon")
|
|
279
|
+
.action(async () => {
|
|
280
|
+
const scheduler = getCronScheduler();
|
|
281
|
+
scheduler.start();
|
|
282
|
+
console.log("✅ Cron scheduler started");
|
|
283
|
+
console.log(" Checking for jobs every minute");
|
|
284
|
+
console.log("\nPress Ctrl+C to stop");
|
|
285
|
+
// Keep process alive
|
|
286
|
+
process.on("SIGINT", () => {
|
|
287
|
+
console.log("\n🛑 Stopping scheduler...");
|
|
288
|
+
scheduler.stop();
|
|
289
|
+
process.exit(0);
|
|
290
|
+
});
|
|
291
|
+
// Keep running
|
|
292
|
+
setInterval(() => { }, 1000);
|
|
293
|
+
});
|
|
294
|
+
// Stop the scheduler
|
|
295
|
+
cronCommand
|
|
296
|
+
.command("stop")
|
|
297
|
+
.description("Stop the cron scheduler")
|
|
298
|
+
.action(async () => {
|
|
299
|
+
const scheduler = getCronScheduler();
|
|
300
|
+
scheduler.stop();
|
|
301
|
+
console.log("✅ Cron scheduler stopped");
|
|
302
|
+
});
|
|
303
|
+
// Quick examples
|
|
304
|
+
cronCommand
|
|
305
|
+
.command("examples")
|
|
306
|
+
.description("Show example commands")
|
|
307
|
+
.action(() => {
|
|
308
|
+
console.log(`
|
|
309
|
+
📚 Cron Command Examples
|
|
310
|
+
|
|
311
|
+
Daily morning briefing at 7am:
|
|
312
|
+
0xkobold cron add \\
|
|
313
|
+
--name "Morning Brief" \\
|
|
314
|
+
--cron "0 7 * * *" \\
|
|
315
|
+
--session isolated \\
|
|
316
|
+
--message "Generate today's briefing: weather, calendar, tasks"
|
|
317
|
+
|
|
318
|
+
One-shot reminder in 20 minutes:
|
|
319
|
+
0xkobold cron add \\
|
|
320
|
+
--name "Call Reminder" \\
|
|
321
|
+
--at "20m" \\
|
|
322
|
+
--session main \\
|
|
323
|
+
--wake \\
|
|
324
|
+
--delete \\
|
|
325
|
+
--message "Call the client back"
|
|
326
|
+
|
|
327
|
+
Weekly report on Mondays at 9am:
|
|
328
|
+
0xkobold cron add \\
|
|
329
|
+
--name "Weekly Report" \\
|
|
330
|
+
--cron "0 9 * * 1" \\
|
|
331
|
+
--timezone "America/New_York" \\
|
|
332
|
+
--model "kimi-k2.5:cloud" \\
|
|
333
|
+
--message "Generate weekly project summary"
|
|
334
|
+
|
|
335
|
+
Every 30 minutes (heartbeat style):
|
|
336
|
+
0xkobold cron add \\
|
|
337
|
+
--name "Heartbeat" \\
|
|
338
|
+
--cron "*/30 * * * *" \\
|
|
339
|
+
--session main \\
|
|
340
|
+
--message "Check HEARTBEAT.md for any tasks"
|
|
341
|
+
|
|
342
|
+
Show all jobs:
|
|
343
|
+
0xkobold cron list
|
|
344
|
+
|
|
345
|
+
Remove a job:
|
|
346
|
+
0xkobold cron remove cron:1234567890:1234
|
|
347
|
+
|
|
348
|
+
Show upcoming:
|
|
349
|
+
0xkobold cron upcoming --limit 5
|
|
350
|
+
`);
|
|
351
|
+
});
|
|
352
|
+
//# sourceMappingURL=cron.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron.js","sourceRoot":"","sources":["../../../../src/cli/commands/cron.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/program.js
CHANGED
|
@@ -24,6 +24,8 @@ import { createGatewayCommand } from "./commands/gateway.js";
|
|
|
24
24
|
import { createWhatsAppCommand } from "./commands/whatsapp.js";
|
|
25
25
|
// v0.3.0: Telegram
|
|
26
26
|
import { createTelegramCommand } from "./commands/telegram.js";
|
|
27
|
+
// v0.4.0: Cron
|
|
28
|
+
import { cronCommand } from "./commands/cron.js";
|
|
27
29
|
// v0.3.0: Migration
|
|
28
30
|
import { migrateCommand } from "./commands/migrate.js";
|
|
29
31
|
// v0.3.0: Duplicate check
|
|
@@ -59,6 +61,8 @@ export function createCli() {
|
|
|
59
61
|
// v0.3.0: Duplicate detection
|
|
60
62
|
program.addCommand(checkCommand);
|
|
61
63
|
program.addCommand(createEmbeddedCommand());
|
|
64
|
+
// v0.4.0: Cron jobs
|
|
65
|
+
program.addCommand(cronCommand);
|
|
62
66
|
// Extension CLIs
|
|
63
67
|
registerDiscordCli(program);
|
|
64
68
|
registerHeartbeatCli(program);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program.js","sourceRoot":"","sources":["../../../src/cli/program.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"program.js","sourceRoot":"","sources":["../../../src/cli/program.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cron Module - 0xKobold
|
|
3
|
+
*
|
|
4
|
+
* Export all cron-related functionality.
|
|
5
|
+
*
|
|
6
|
+
* Example usage:
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { getCronScheduler, parseExpression } from "./cron/index.js";
|
|
9
|
+
*
|
|
10
|
+
* const scheduler = getCronScheduler();
|
|
11
|
+
* scheduler.start();
|
|
12
|
+
*
|
|
13
|
+
* // Add a daily morning briefing
|
|
14
|
+
* scheduler.addJob({
|
|
15
|
+
* name: "Morning Brief",
|
|
16
|
+
* cron: "0 7 * * *",
|
|
17
|
+
* session: "isolated",
|
|
18
|
+
* message: "Generate today's briefing: weather, calendar, tasks"
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* // One-shot reminder in 20 minutes
|
|
22
|
+
* scheduler.addJob({
|
|
23
|
+
* name: "Call Reminder",
|
|
24
|
+
* at: "20m",
|
|
25
|
+
* session: "main",
|
|
26
|
+
* wake: true,
|
|
27
|
+
* deleteAfterRun: true,
|
|
28
|
+
* message: "Call the client back"
|
|
29
|
+
* });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
// Parser
|
|
33
|
+
export { parseCron, parseExpression, parseDuration, parseAt, getNextRun, formatCron, validateCron, CRON_PRESETS, } from "./parser.js";
|
|
34
|
+
// Scheduler
|
|
35
|
+
export { CronScheduler, getCronScheduler, resetCronScheduler, } from "./scheduler.js";
|
|
36
|
+
// Runner
|
|
37
|
+
export { runJobRunner, runSystemEvent, validateJob, } from "./runner.js";
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cron/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAeH,SAAS;AACT,OAAO,EACL,SAAS,EACT,eAAe,EACf,aAAa,EACb,OAAO,EACP,UAAU,EACV,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,aAAa,CAAC;AAErB,YAAY;AACZ,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAExB,SAAS;AACT,OAAO,EACL,YAAY,EACZ,cAAc,EACd,WAAW,GACZ,MAAM,aAAa,CAAC"}
|