@mono-agent/cron-adapter 0.2.0 → 0.2.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/README.md +21 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +77 -19
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/jobs-dir.d.ts +14 -0
- package/dist/jobs-dir.d.ts.map +1 -0
- package/dist/jobs-dir.js +134 -0
- package/dist/jobs-dir.js.map +1 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -33,11 +33,32 @@ const cron = startCronAdapter({
|
|
|
33
33
|
|
|
34
34
|
Only future ticks after startup are scheduled. Overlapping runs for the same job are skipped, not queued or run concurrently.
|
|
35
35
|
|
|
36
|
+
### Jobs as markdown files
|
|
37
|
+
|
|
38
|
+
Besides `cron.jobs` JSON / `MONO_AGENT_CRON_*` env, jobs can be authored as one `*.md` file per job in a cron folder. Frontmatter holds the schedule metadata and the markdown body is the prompt — convenient for refining long prompt templates:
|
|
39
|
+
|
|
40
|
+
```markdown
|
|
41
|
+
---
|
|
42
|
+
expression: 0 8 * * *
|
|
43
|
+
timezone: Europe/Warsaw
|
|
44
|
+
enabled: true
|
|
45
|
+
conversationId: daily-digest
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
Summarize yesterday across my channels and post a short digest.
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
- `id` defaults to the filename stem; `timezone` defaults to `UTC`; `enabled` defaults to `true`. The body is required and `expression` is required.
|
|
52
|
+
- The folder is resolved against the host working directory from `cron.dir` / `MONO_AGENT_CRON_DIR` (default `cron/`). A missing folder is not an error.
|
|
53
|
+
- Folder jobs are merged with config jobs; a duplicate `id` across sources is a hard error.
|
|
54
|
+
|
|
36
55
|
## Public API
|
|
37
56
|
|
|
38
57
|
- `startCronAdapter`
|
|
39
58
|
- `CronAdapterError`
|
|
40
59
|
- `loadCronAdapterConfig`
|
|
60
|
+
- `loadCronJobsFromDirectory`
|
|
61
|
+
- `parseCronJobMarkdown`
|
|
41
62
|
- `redactCronAdapterConfig`
|
|
42
63
|
- `cronFieldGroup`
|
|
43
64
|
- Cron adapter, job, result, metadata, config, and logger types
|
package/dist/config.d.ts
CHANGED
|
@@ -16,6 +16,10 @@ export interface LoadCronAdapterConfigInput {
|
|
|
16
16
|
readonly env: Record<string, string | undefined>;
|
|
17
17
|
readonly json?: SettingsJson;
|
|
18
18
|
readonly jsonPath?: string;
|
|
19
|
+
/** Base directory the cron jobs folder resolves against (usually the app cwd). */
|
|
20
|
+
readonly cwd?: string;
|
|
21
|
+
/** Overrides the cron jobs folder; defaults to `cron.dir` / `MONO_AGENT_CRON_DIR` / `cron`. */
|
|
22
|
+
readonly dir?: string;
|
|
19
23
|
}
|
|
20
24
|
export declare const cronFieldGroup: FieldGroup;
|
|
21
25
|
export declare function loadCronAdapterConfig(input: LoadCronAdapterConfigInput): Promise<CronAdapterConfig>;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGrE,OAAO,EAAoB,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;CACzC;AAED,MAAM,MAAM,yBAAyB,GAAG,iBAAiB,CAAC;AAE1D,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,kFAAkF;IAClF,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,+FAA+F;IAC/F,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AASD,eAAO,MAAM,cAAc,EAAE,UAmD3B,CAAC;AAEH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAKzG;AA2FD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,EAAE,CAU/D;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,yBAAyB,CAM5F"}
|
package/dist/config.js
CHANGED
|
@@ -1,13 +1,24 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
1
2
|
import { defineFieldGroup, layerJsonOntoEnv, normalizeOptionalString, readBoolean, readJsonSection, readSettingsJson, } from "@mono-agent/settings";
|
|
3
|
+
import { loadCronJobsFromDirectory } from "./jobs-dir.js";
|
|
2
4
|
import { CronAdapterError } from "./scheduler.js";
|
|
3
5
|
const DEFAULT_JOB_ID = "default";
|
|
4
6
|
const DEFAULT_TIMEZONE = "UTC";
|
|
7
|
+
const DEFAULT_CRON_DIR = "cron";
|
|
5
8
|
const invalidConfig = (message, details) => new CronAdapterError("invalid_config", message, details);
|
|
6
9
|
export const cronFieldGroup = defineFieldGroup({
|
|
7
10
|
id: "cron",
|
|
8
11
|
label: "Cron",
|
|
9
|
-
description: "Optional single-job cron invocation configuration. Use JSON for multiple jobs.",
|
|
12
|
+
description: "Optional single-job cron invocation configuration. Use JSON for multiple jobs, or `*.md` files in the cron folder.",
|
|
10
13
|
fields: [
|
|
14
|
+
{
|
|
15
|
+
id: "cron.dir",
|
|
16
|
+
label: "Cron folder",
|
|
17
|
+
description: "Folder of `*.md` cron jobs (frontmatter + prompt body), resolved against the app working directory.",
|
|
18
|
+
kind: "string",
|
|
19
|
+
placeholder: "cron",
|
|
20
|
+
path: ["cron", "dir"],
|
|
21
|
+
},
|
|
11
22
|
{
|
|
12
23
|
id: "cron.enabled",
|
|
13
24
|
label: "Enable cron",
|
|
@@ -49,23 +60,33 @@ export const cronFieldGroup = defineFieldGroup({
|
|
|
49
60
|
});
|
|
50
61
|
export async function loadCronAdapterConfig(input) {
|
|
51
62
|
const json = input.json ?? (input.jsonPath === undefined ? {} : (await readSettingsJson(input.jsonPath)).json);
|
|
52
|
-
const
|
|
63
|
+
const configJobs = loadConfigJobs(json, input.env);
|
|
64
|
+
const directoryJobs = await loadDirectoryJobs(json, input);
|
|
65
|
+
return { jobs: mergeJobs(configJobs, directoryJobs) };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Jobs defined inline in config: `MONO_AGENT_CRON_JOBS_JSON` (highest), then the
|
|
69
|
+
* `cron.jobs` array, then the single-job `MONO_AGENT_CRON_*` fields. Returns an
|
|
70
|
+
* empty list when nothing is configured (the cron folder may still add jobs).
|
|
71
|
+
*/
|
|
72
|
+
function loadConfigJobs(json, env) {
|
|
73
|
+
const jobsJson = normalizeOptionalString(env.MONO_AGENT_CRON_JOBS_JSON);
|
|
53
74
|
if (jobsJson !== undefined) {
|
|
54
|
-
return
|
|
75
|
+
return [...readJobsJson(jobsJson)];
|
|
55
76
|
}
|
|
56
77
|
const section = readJsonSection(json, "cron");
|
|
57
78
|
if (section.jobs !== undefined) {
|
|
58
79
|
if (!Array.isArray(section.jobs)) {
|
|
59
80
|
throw invalidConfig("cron.jobs must be an array of job objects.");
|
|
60
81
|
}
|
|
61
|
-
return
|
|
82
|
+
return section.jobs.map((entry, index) => normalizeJobConfig(entry, index));
|
|
62
83
|
}
|
|
63
|
-
const
|
|
64
|
-
const enabled = readBoolean(
|
|
65
|
-
const expression = normalizeOptionalString(
|
|
66
|
-
const prompt = normalizeOptionalString(
|
|
84
|
+
const layered = layerCronJsonOntoEnv(json, env);
|
|
85
|
+
const enabled = readBoolean(layered.MONO_AGENT_CRON_ENABLED, "MONO_AGENT_CRON_ENABLED", false, invalidConfig);
|
|
86
|
+
const expression = normalizeOptionalString(layered.MONO_AGENT_CRON_EXPRESSION);
|
|
87
|
+
const prompt = normalizeOptionalString(layered.MONO_AGENT_CRON_PROMPT);
|
|
67
88
|
if (!enabled && expression === undefined && prompt === undefined) {
|
|
68
|
-
return
|
|
89
|
+
return [];
|
|
69
90
|
}
|
|
70
91
|
if (expression === undefined) {
|
|
71
92
|
throw invalidConfig("Cron expression is required when cron is configured.");
|
|
@@ -73,17 +94,54 @@ export async function loadCronAdapterConfig(input) {
|
|
|
73
94
|
if (prompt === undefined) {
|
|
74
95
|
throw invalidConfig("Cron prompt is required when cron is configured.");
|
|
75
96
|
}
|
|
76
|
-
const conversationId = normalizeOptionalString(
|
|
77
|
-
return {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
97
|
+
const conversationId = normalizeOptionalString(layered.MONO_AGENT_CRON_CONVERSATION_ID);
|
|
98
|
+
return [{
|
|
99
|
+
id: DEFAULT_JOB_ID,
|
|
100
|
+
enabled,
|
|
101
|
+
expression,
|
|
102
|
+
timezone: normalizeOptionalString(layered.MONO_AGENT_CRON_TIMEZONE) ?? DEFAULT_TIMEZONE,
|
|
103
|
+
prompt,
|
|
104
|
+
...(conversationId === undefined ? {} : { conversationId }),
|
|
105
|
+
}];
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Jobs authored as `*.md` files in the cron folder. Skipped unless a base
|
|
109
|
+
* directory (`input.cwd`) is known, so a loader called without a host (e.g. a
|
|
110
|
+
* unit test) never scans the process working directory implicitly.
|
|
111
|
+
*/
|
|
112
|
+
async function loadDirectoryJobs(json, input) {
|
|
113
|
+
if (input.cwd === undefined) {
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
const section = readJsonSection(json, "cron");
|
|
117
|
+
if (section.dir !== undefined && typeof section.dir !== "string") {
|
|
118
|
+
throw invalidConfig("cron.dir must be a string.");
|
|
119
|
+
}
|
|
120
|
+
const dirName = normalizeOptionalString(input.dir) ??
|
|
121
|
+
normalizeOptionalString(input.env.MONO_AGENT_CRON_DIR) ??
|
|
122
|
+
asOptionalString(section.dir) ??
|
|
123
|
+
DEFAULT_CRON_DIR;
|
|
124
|
+
return await loadCronJobsFromDirectory(resolve(input.cwd, dirName));
|
|
125
|
+
}
|
|
126
|
+
/** Combine inline-config jobs with cron-folder jobs; a duplicate id is a hard error. */
|
|
127
|
+
function mergeJobs(configJobs, directoryJobs) {
|
|
128
|
+
const merged = [];
|
|
129
|
+
const sourceById = new Map();
|
|
130
|
+
const append = (job, source) => {
|
|
131
|
+
const prior = sourceById.get(job.id);
|
|
132
|
+
if (prior !== undefined) {
|
|
133
|
+
throw invalidConfig(`Duplicate cron job id "${job.id}" from ${prior} and ${source}.`, { id: job.id });
|
|
134
|
+
}
|
|
135
|
+
sourceById.set(job.id, source);
|
|
136
|
+
merged.push(job);
|
|
86
137
|
};
|
|
138
|
+
for (const job of configJobs) {
|
|
139
|
+
append(job, "config");
|
|
140
|
+
}
|
|
141
|
+
for (const job of directoryJobs) {
|
|
142
|
+
append(job, "cron folder");
|
|
143
|
+
}
|
|
144
|
+
return merged;
|
|
87
145
|
}
|
|
88
146
|
/**
|
|
89
147
|
* Project the loaded config down to the runtime {@link CronJob} shape consumed
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,WAAW,EACX,eAAe,EACf,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,gBAAgB,EAAgB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,4 +2,5 @@ export { CronAdapterError, startCronAdapter, } from "./scheduler.js";
|
|
|
2
2
|
export type { CronAdapterErrorCode, CronAdapterErrorDetails, CronAdapterLogger, CronAdapterOptions, CronAdapterStartResult, CronJob, CronJobResult, CronRequestMetadata, } from "./scheduler.js";
|
|
3
3
|
export { cronFieldGroup, loadCronAdapterConfig, redactCronAdapterConfig, toCronJobs, } from "./config.js";
|
|
4
4
|
export type { CronAdapterConfig, CronJobConfig, LoadCronAdapterConfigInput, RedactedCronAdapterConfig, } from "./config.js";
|
|
5
|
+
export { loadCronJobsFromDirectory, parseCronJobMarkdown, } from "./jobs-dir.js";
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,OAAO,EACP,aAAa,EACb,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,uBAAuB,EACvB,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,OAAO,EACP,aAAa,EACb,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,uBAAuB,EACvB,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { CronAdapterError, startCronAdapter, } from "./scheduler.js";
|
|
2
2
|
export { cronFieldGroup, loadCronAdapterConfig, redactCronAdapterConfig, toCronJobs, } from "./config.js";
|
|
3
|
+
export { loadCronJobsFromDirectory, parseCronJobMarkdown, } from "./jobs-dir.js";
|
|
3
4
|
//# 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,EACL,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAYxB,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,uBAAuB,EACvB,UAAU,GACX,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAYxB,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,uBAAuB,EACvB,UAAU,GACX,MAAM,aAAa,CAAC;AAQrB,OAAO,EACL,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CronJobConfig } from "./config.js";
|
|
2
|
+
/**
|
|
3
|
+
* Load every `*.md` cron job in {@link dir}. A missing directory is not an
|
|
4
|
+
* error (returns `[]`); files are read in sorted filename order for a stable
|
|
5
|
+
* job list. Two files that resolve to the same job `id` are a hard error.
|
|
6
|
+
*/
|
|
7
|
+
export declare function loadCronJobsFromDirectory(dir: string): Promise<CronJobConfig[]>;
|
|
8
|
+
/**
|
|
9
|
+
* Parse one cron job markdown file: frontmatter holds the schedule metadata and
|
|
10
|
+
* the markdown body is the prompt. `id` defaults to the filename stem, timezone
|
|
11
|
+
* to UTC, and enabled to true (an authored file is presumed live).
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseCronJobMarkdown(fileName: string, content: string): CronJobConfig;
|
|
14
|
+
//# sourceMappingURL=jobs-dir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs-dir.d.ts","sourceRoot":"","sources":["../src/jobs-dir.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAajD;;;;GAIG;AACH,wBAAsB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAsCrF;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CA6BrF"}
|
package/dist/jobs-dir.js
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { normalizeOptionalString, readBoolean } from "@mono-agent/settings";
|
|
4
|
+
import { CronAdapterError } from "./scheduler.js";
|
|
5
|
+
const DEFAULT_TIMEZONE = "UTC";
|
|
6
|
+
// Matches a leading YAML-style frontmatter block (`---` … `---`). Mirrors the
|
|
7
|
+
// shape used by the skill index, but cron-adapter must not depend on host or
|
|
8
|
+
// other-package code, so the parser is self-contained here. Cron frontmatter is
|
|
9
|
+
// flat scalars only, so a tiny line parser is enough — no YAML dependency.
|
|
10
|
+
const FRONTMATTER_PATTERN = /^---\n([\s\S]*?)\n---[ \t]*(?:\n|$)/u;
|
|
11
|
+
const invalidConfig = (message, details) => new CronAdapterError("invalid_config", message, details);
|
|
12
|
+
/**
|
|
13
|
+
* Load every `*.md` cron job in {@link dir}. A missing directory is not an
|
|
14
|
+
* error (returns `[]`); files are read in sorted filename order for a stable
|
|
15
|
+
* job list. Two files that resolve to the same job `id` are a hard error.
|
|
16
|
+
*/
|
|
17
|
+
export async function loadCronJobsFromDirectory(dir) {
|
|
18
|
+
let entries;
|
|
19
|
+
try {
|
|
20
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (isErrno(error, "ENOENT")) {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
throw invalidConfig("Unable to read cron jobs directory.", { dir, reason: errorToMessage(error) });
|
|
27
|
+
}
|
|
28
|
+
const files = entries
|
|
29
|
+
.filter((entry) => entry.isFile() && entry.name.toLowerCase().endsWith(".md"))
|
|
30
|
+
.map((entry) => entry.name)
|
|
31
|
+
.sort();
|
|
32
|
+
const jobs = [];
|
|
33
|
+
const seenIds = new Map();
|
|
34
|
+
for (const name of files) {
|
|
35
|
+
const filePath = join(dir, name);
|
|
36
|
+
let content;
|
|
37
|
+
try {
|
|
38
|
+
content = await readFile(filePath, "utf8");
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
throw invalidConfig("Unable to read cron job file.", { file: name, reason: errorToMessage(error) });
|
|
42
|
+
}
|
|
43
|
+
const job = parseCronJobMarkdown(name, content);
|
|
44
|
+
const prior = seenIds.get(job.id);
|
|
45
|
+
if (prior !== undefined) {
|
|
46
|
+
throw invalidConfig(`Duplicate cron job id "${job.id}" defined by ${prior} and ${name}.`, {
|
|
47
|
+
id: job.id,
|
|
48
|
+
file: name,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
seenIds.set(job.id, name);
|
|
52
|
+
jobs.push(job);
|
|
53
|
+
}
|
|
54
|
+
return jobs;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Parse one cron job markdown file: frontmatter holds the schedule metadata and
|
|
58
|
+
* the markdown body is the prompt. `id` defaults to the filename stem, timezone
|
|
59
|
+
* to UTC, and enabled to true (an authored file is presumed live).
|
|
60
|
+
*/
|
|
61
|
+
export function parseCronJobMarkdown(fileName, content) {
|
|
62
|
+
const normalized = content.replace(/\r\n?/g, "\n");
|
|
63
|
+
const match = FRONTMATTER_PATTERN.exec(normalized);
|
|
64
|
+
const frontmatter = match === null ? "" : (match[1] ?? "");
|
|
65
|
+
const body = match === null ? normalized : normalized.slice(match[0].length);
|
|
66
|
+
const meta = parseFrontmatter(frontmatter);
|
|
67
|
+
const expression = normalizeOptionalString(meta.expression);
|
|
68
|
+
if (expression === undefined) {
|
|
69
|
+
throw invalidConfig("Cron job markdown requires an `expression` in its frontmatter.", { file: fileName });
|
|
70
|
+
}
|
|
71
|
+
const prompt = body.trim();
|
|
72
|
+
if (prompt.length === 0) {
|
|
73
|
+
throw invalidConfig("Cron job markdown requires a non-empty prompt body.", { file: fileName });
|
|
74
|
+
}
|
|
75
|
+
const id = normalizeOptionalString(meta.id) ?? stripMarkdownExtension(fileName);
|
|
76
|
+
const timezone = normalizeOptionalString(meta.timezone) ?? DEFAULT_TIMEZONE;
|
|
77
|
+
const enabled = readBoolean(meta.enabled, `${fileName} frontmatter \`enabled\``, true, invalidConfig);
|
|
78
|
+
const conversationId = normalizeOptionalString(meta.conversationId);
|
|
79
|
+
return {
|
|
80
|
+
id,
|
|
81
|
+
enabled,
|
|
82
|
+
expression,
|
|
83
|
+
timezone,
|
|
84
|
+
prompt,
|
|
85
|
+
...(conversationId === undefined ? {} : { conversationId }),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Parse flat `key: value` frontmatter lines. The value is everything after the
|
|
90
|
+
* first colon, so a stepped cron expression (every five minutes, written with a
|
|
91
|
+
* slash) survives unquoted, with one layer of surrounding quotes stripped. Blank
|
|
92
|
+
* and `#` comment lines are ignored, as are lines without a colon.
|
|
93
|
+
*/
|
|
94
|
+
function parseFrontmatter(frontmatter) {
|
|
95
|
+
// Null-prototype so a `__proto__` (or `constructor`) key is stored as plain
|
|
96
|
+
// data and can never pollute the prototype or shadow a real reader like
|
|
97
|
+
// `meta.expression`.
|
|
98
|
+
const meta = Object.create(null);
|
|
99
|
+
for (const rawLine of frontmatter.split("\n")) {
|
|
100
|
+
const line = rawLine.trim();
|
|
101
|
+
if (line.length === 0 || line.startsWith("#")) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const colon = line.indexOf(":");
|
|
105
|
+
if (colon === -1) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const key = line.slice(0, colon).trim();
|
|
109
|
+
if (key.length === 0) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
meta[key] = stripQuotes(line.slice(colon + 1).trim());
|
|
113
|
+
}
|
|
114
|
+
return meta;
|
|
115
|
+
}
|
|
116
|
+
function stripQuotes(value) {
|
|
117
|
+
if (value.length >= 2) {
|
|
118
|
+
const first = value[0];
|
|
119
|
+
if ((first === '"' || first === "'") && value[value.length - 1] === first) {
|
|
120
|
+
return value.slice(1, -1);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return value;
|
|
124
|
+
}
|
|
125
|
+
function stripMarkdownExtension(fileName) {
|
|
126
|
+
return fileName.replace(/\.md$/iu, "");
|
|
127
|
+
}
|
|
128
|
+
function errorToMessage(error) {
|
|
129
|
+
return error instanceof Error ? error.message : String(error);
|
|
130
|
+
}
|
|
131
|
+
function isErrno(error, code) {
|
|
132
|
+
return typeof error === "object" && error !== null && error.code === code;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=jobs-dir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs-dir.js","sourceRoot":"","sources":["../src/jobs-dir.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mono-agent/cron-adapter",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Cron-based scheduled invocation adapter for agent responders.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"README.md"
|
|
19
19
|
],
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@mono-agent/agent-contracts": "0.2.
|
|
22
|
-
"@mono-agent/settings": "0.2.
|
|
21
|
+
"@mono-agent/agent-contracts": "0.2.2",
|
|
22
|
+
"@mono-agent/settings": "0.2.2",
|
|
23
23
|
"cron-parser": "^5.5.0"
|
|
24
24
|
},
|
|
25
25
|
"publishConfig": {
|