opencode-cron-job 0.1.3 → 0.1.5
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 +2 -0
- package/dist/index.d.ts +1 -4
- package/dist/index.js +120 -84
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -53,6 +53,7 @@ The agent calls the following tools internally — you don't need to use them di
|
|
|
53
53
|
| `cron_list` | List all scheduled tasks |
|
|
54
54
|
| `cron_run` | Run a task immediately |
|
|
55
55
|
| `cron_delete` | Delete a task |
|
|
56
|
+
| `cron_once` | Schedule a one-shot delay task |
|
|
56
57
|
|
|
57
58
|
### Task file format
|
|
58
59
|
|
|
@@ -125,6 +126,7 @@ Agent 内部会调用以下工具来完成,你不需要直接使用:
|
|
|
125
126
|
| `cron_list` | 列出所有任务 |
|
|
126
127
|
| `cron_run` | 立即执行一个任务 |
|
|
127
128
|
| `cron_delete` | 删除任务 |
|
|
129
|
+
| `cron_once` | 定时一次性延迟任务 |
|
|
128
130
|
|
|
129
131
|
### 任务文件格式
|
|
130
132
|
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import { readFileSync, existsSync,
|
|
1
|
+
import { readFileSync, existsSync, appendFileSync, mkdirSync, writeFileSync } from "fs";
|
|
2
2
|
import { join } from "path";
|
|
3
|
-
import { homedir } from "os";
|
|
4
|
-
import { execSync } from "child_process";
|
|
5
3
|
import cron from "node-cron";
|
|
6
4
|
import { tool } from "@opencode-ai/plugin";
|
|
7
|
-
const CURRENT_VERSION = "0.1.3";
|
|
8
5
|
function parseDelay(s) {
|
|
9
6
|
const m = s.match(/^(\d+)\s*(s|sec|second|seconds|m|min|minute|minutes|h|hr|hour|hours|d|day|days)?$/);
|
|
10
7
|
if (!m)
|
|
@@ -22,7 +19,7 @@ function parseDelay(s) {
|
|
|
22
19
|
return n * 60000;
|
|
23
20
|
}
|
|
24
21
|
function parseTasks(content) {
|
|
25
|
-
const
|
|
22
|
+
const result = [];
|
|
26
23
|
const sections = content.split(/^## /m).filter((s) => s.trim());
|
|
27
24
|
for (const section of sections) {
|
|
28
25
|
const lines = section.split("\n");
|
|
@@ -34,81 +31,126 @@ function parseTasks(content) {
|
|
|
34
31
|
const t = line.trim();
|
|
35
32
|
if (t.startsWith("- cron:"))
|
|
36
33
|
schedule = t.slice("- cron:".length).trim();
|
|
34
|
+
else if (t.startsWith("- delay:"))
|
|
35
|
+
schedule = t.slice("- delay:".length).trim();
|
|
37
36
|
else if (t.startsWith("- prompt:"))
|
|
38
37
|
prompt = t.slice("- prompt:".length).trim();
|
|
39
38
|
}
|
|
40
39
|
if (schedule && prompt)
|
|
41
|
-
|
|
40
|
+
result.push({ name, schedule, prompt });
|
|
42
41
|
}
|
|
43
|
-
return
|
|
42
|
+
return result;
|
|
44
43
|
}
|
|
45
44
|
let jobs = [];
|
|
46
45
|
let nextId = 1;
|
|
47
|
-
async
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
message: `opencode-cron-job updated: v${CURRENT_VERSION} → v${data.version}. Restart to apply.`,
|
|
67
|
-
variant: "success",
|
|
68
|
-
},
|
|
69
|
-
});
|
|
46
|
+
export const CronPlugin = async ({ client, directory }) => {
|
|
47
|
+
const tasksFile = join(directory, ".cron-job", "tasks.md");
|
|
48
|
+
async function fire(job) {
|
|
49
|
+
try {
|
|
50
|
+
const res = await client.session.list({ query: { directory } });
|
|
51
|
+
const sessions = res.data;
|
|
52
|
+
if (!sessions || sessions.length === 0)
|
|
53
|
+
return;
|
|
54
|
+
sessions.sort((a, b) => b.time.updated - a.time.updated);
|
|
55
|
+
await client.session.promptAsync({
|
|
56
|
+
path: { id: sessions[0].id },
|
|
57
|
+
body: {
|
|
58
|
+
parts: [{ type: "text", text: job.prompt }],
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
process.stderr.write(`[cron] fire error: ${e.message}\n`);
|
|
64
|
+
}
|
|
70
65
|
}
|
|
71
|
-
|
|
72
|
-
|
|
66
|
+
function scheduleCron(job) {
|
|
67
|
+
job.task = cron.schedule(job.schedule, () => {
|
|
68
|
+
if (job.cancelled)
|
|
69
|
+
return;
|
|
70
|
+
fire(job);
|
|
71
|
+
});
|
|
73
72
|
}
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
73
|
+
function scheduleDelay(job) {
|
|
74
|
+
const ms = parseDelay(job.schedule);
|
|
75
|
+
if (ms <= 0)
|
|
76
|
+
return;
|
|
77
|
+
job.timer = setTimeout(() => {
|
|
78
|
+
if (job.cancelled)
|
|
79
|
+
return;
|
|
80
|
+
fire(job);
|
|
81
|
+
removeJobFromFile(job.name);
|
|
82
|
+
const idx = jobs.indexOf(job);
|
|
83
|
+
if (idx !== -1)
|
|
84
|
+
jobs.splice(idx, 1);
|
|
85
|
+
}, ms);
|
|
81
86
|
}
|
|
82
|
-
function
|
|
83
|
-
|
|
84
|
-
|
|
87
|
+
function startJob(item) {
|
|
88
|
+
const job = { ...item, id: String(nextId++), task: null, timer: null, cancelled: false };
|
|
89
|
+
if (cron.validate(job.schedule)) {
|
|
90
|
+
scheduleCron(job);
|
|
85
91
|
}
|
|
92
|
+
else {
|
|
93
|
+
scheduleDelay(job);
|
|
94
|
+
}
|
|
95
|
+
return job;
|
|
86
96
|
}
|
|
87
|
-
|
|
88
|
-
|
|
97
|
+
function stopJob(job) {
|
|
98
|
+
job.cancelled = true;
|
|
99
|
+
job.task?.stop();
|
|
100
|
+
if (job.timer)
|
|
101
|
+
clearTimeout(job.timer);
|
|
102
|
+
}
|
|
103
|
+
function reloadJobs() {
|
|
104
|
+
for (const j of jobs)
|
|
105
|
+
stopJob(j);
|
|
106
|
+
jobs = [];
|
|
107
|
+
if (!existsSync(tasksFile))
|
|
108
|
+
return;
|
|
89
109
|
const items = parseTasks(readFileSync(tasksFile, "utf-8"));
|
|
90
110
|
for (const item of items) {
|
|
91
|
-
|
|
92
|
-
schedule(job);
|
|
93
|
-
jobs.push(job);
|
|
111
|
+
jobs.push(startJob(item));
|
|
94
112
|
}
|
|
95
113
|
}
|
|
96
|
-
|
|
97
|
-
|
|
114
|
+
function removeJobFromFile(name) {
|
|
115
|
+
try {
|
|
116
|
+
const content = readFileSync(tasksFile, "utf-8");
|
|
117
|
+
const tasks = parseTasks(content);
|
|
118
|
+
const remaining = tasks.filter((t) => t.name !== name);
|
|
119
|
+
const lines = ["# 周期任务"];
|
|
120
|
+
for (const t of remaining) {
|
|
121
|
+
lines.push("");
|
|
122
|
+
lines.push(`## ${t.name}`);
|
|
123
|
+
lines.push(cron.validate(t.schedule) ? `- cron: ${t.schedule}` : `- delay: ${t.schedule}`);
|
|
124
|
+
lines.push(`- prompt: ${t.prompt}`);
|
|
125
|
+
}
|
|
126
|
+
writeFileSync(tasksFile, lines.join("\n") + "\n");
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
process.stderr.write(`[cron] remove file error: ${e.message}\n`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Load from file on startup
|
|
133
|
+
reloadJobs();
|
|
98
134
|
return {
|
|
99
135
|
tool: {
|
|
100
136
|
cron_create: tool({
|
|
101
|
-
description: "Create a new cron job.
|
|
137
|
+
description: "Create a new cron job. Writes to .cron-job/tasks.md and schedules it.",
|
|
102
138
|
args: {
|
|
103
139
|
name: tool.schema.string().describe("Unique name for this job"),
|
|
104
|
-
schedule: tool.schema.string().describe("Cron expression
|
|
105
|
-
prompt: tool.schema.string().describe("
|
|
140
|
+
schedule: tool.schema.string().describe("Cron expression, e.g. '0 9 * * *'"),
|
|
141
|
+
prompt: tool.schema.string().describe("Prompt to inject when the job fires"),
|
|
106
142
|
},
|
|
107
143
|
async execute(args) {
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
144
|
+
const entry = `\n## ${args.name}\n- cron: ${args.schedule}\n- prompt: ${args.prompt}\n\n`;
|
|
145
|
+
if (!existsSync(tasksFile)) {
|
|
146
|
+
mkdirSync(join(directory, ".cron-job"), { recursive: true });
|
|
147
|
+
appendFileSync(tasksFile, `# 周期任务\n${entry}`);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
appendFileSync(tasksFile, entry);
|
|
151
|
+
}
|
|
152
|
+
jobs.push(startJob({ name: args.name, schedule: args.schedule, prompt: args.prompt }));
|
|
153
|
+
return `Created: ${args.name} (${args.schedule})`;
|
|
112
154
|
},
|
|
113
155
|
}),
|
|
114
156
|
cron_list: tool({
|
|
@@ -121,9 +163,9 @@ const _CronPlugin = async ({ client, directory }) => {
|
|
|
121
163
|
},
|
|
122
164
|
}),
|
|
123
165
|
cron_run: tool({
|
|
124
|
-
description: "Run a job immediately
|
|
166
|
+
description: "Run a job immediately",
|
|
125
167
|
args: {
|
|
126
|
-
jobId: tool.schema.string().describe("ID
|
|
168
|
+
jobId: tool.schema.string().describe("Job ID. Get it from cron_list."),
|
|
127
169
|
},
|
|
128
170
|
async execute(args) {
|
|
129
171
|
const job = jobs.find((j) => j.id === args.jobId);
|
|
@@ -134,52 +176,46 @@ const _CronPlugin = async ({ client, directory }) => {
|
|
|
134
176
|
},
|
|
135
177
|
}),
|
|
136
178
|
cron_delete: tool({
|
|
137
|
-
description: "Delete a cron job
|
|
179
|
+
description: "Delete a cron job from .cron-job/tasks.md",
|
|
138
180
|
args: {
|
|
139
|
-
jobId: tool.schema.string().describe("ID
|
|
181
|
+
jobId: tool.schema.string().describe("Job ID. Get it from cron_list."),
|
|
140
182
|
},
|
|
141
183
|
async execute(args) {
|
|
142
184
|
const idx = jobs.findIndex((j) => j.id === args.jobId);
|
|
143
185
|
if (idx === -1)
|
|
144
186
|
return `Job ${args.jobId} not found.`;
|
|
145
|
-
const
|
|
146
|
-
job
|
|
147
|
-
|
|
148
|
-
|
|
187
|
+
const job = jobs[idx];
|
|
188
|
+
stopJob(job);
|
|
189
|
+
jobs.splice(idx, 1);
|
|
190
|
+
removeJobFromFile(job.name);
|
|
149
191
|
return `${job.name}: deleted`;
|
|
150
192
|
},
|
|
151
193
|
}),
|
|
152
194
|
cron_once: tool({
|
|
153
|
-
description: "Schedule a one-shot prompt after a delay.
|
|
195
|
+
description: "Schedule a one-shot prompt after a delay. Saved to .cron-job/tasks.md for persistence across restarts.",
|
|
154
196
|
args: {
|
|
155
|
-
prompt: tool.schema.string().describe("
|
|
156
|
-
delay: tool.schema.string().describe("Delay
|
|
157
|
-
name: tool.schema.string().optional().describe("Optional name
|
|
197
|
+
prompt: tool.schema.string().describe("Prompt to inject when timer fires"),
|
|
198
|
+
delay: tool.schema.string().describe("Delay: '5m', '30s', '2h', '1d'"),
|
|
199
|
+
name: tool.schema.string().optional().describe("Optional name"),
|
|
158
200
|
},
|
|
159
201
|
async execute(args) {
|
|
160
202
|
const ms = parseDelay(args.delay);
|
|
161
203
|
if (ms <= 0)
|
|
162
|
-
return `Invalid delay: ${args.delay}
|
|
204
|
+
return `Invalid delay: ${args.delay}`;
|
|
163
205
|
const name = args.name || `reminder-${nextId}`;
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
jobs.splice(idx, 1);
|
|
174
|
-
}, ms);
|
|
175
|
-
jobs.push(job);
|
|
206
|
+
const entry = `\n## ${name}\n- delay: ${args.delay}\n- prompt: ${args.prompt}\n\n`;
|
|
207
|
+
if (!existsSync(tasksFile)) {
|
|
208
|
+
mkdirSync(join(directory, ".cron-job"), { recursive: true });
|
|
209
|
+
appendFileSync(tasksFile, `# 周期任务\n${entry}`);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
appendFileSync(tasksFile, entry);
|
|
213
|
+
}
|
|
214
|
+
jobs.push(startJob({ name, schedule: args.delay, prompt: args.prompt }));
|
|
176
215
|
return `Scheduled: ${name} (fires in ${args.delay})`;
|
|
177
216
|
},
|
|
178
217
|
}),
|
|
179
218
|
},
|
|
180
219
|
};
|
|
181
220
|
};
|
|
182
|
-
export default {
|
|
183
|
-
server: _CronPlugin,
|
|
184
|
-
};
|
|
185
221
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|