@mono-agent/cron-adapter 0.2.1 → 0.3.0

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 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>;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAErE,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;CAC5B;AAQD,eAAO,MAAM,cAAc,EAAE,UA2C3B,CAAC;AAEH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqCzG;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,EAAE,CAU/D;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,yBAAyB,CAM5F"}
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 jobsJson = normalizeOptionalString(input.env.MONO_AGENT_CRON_JOBS_JSON);
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 { jobs: readJobsJson(jobsJson) };
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 { jobs: section.jobs.map((entry, index) => normalizeJobConfig(entry, index)) };
82
+ return section.jobs.map((entry, index) => normalizeJobConfig(entry, index));
62
83
  }
63
- const env = layerCronJsonOntoEnv(json, input.env);
64
- const enabled = readBoolean(env.MONO_AGENT_CRON_ENABLED, "MONO_AGENT_CRON_ENABLED", false, invalidConfig);
65
- const expression = normalizeOptionalString(env.MONO_AGENT_CRON_EXPRESSION);
66
- const prompt = normalizeOptionalString(env.MONO_AGENT_CRON_PROMPT);
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 { jobs: [] };
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(env.MONO_AGENT_CRON_CONVERSATION_ID);
77
- return {
78
- jobs: [{
79
- id: DEFAULT_JOB_ID,
80
- enabled,
81
- expression,
82
- timezone: normalizeOptionalString(env.MONO_AGENT_CRON_TIMEZONE) ?? DEFAULT_TIMEZONE,
83
- prompt,
84
- ...(conversationId === undefined ? {} : { conversationId }),
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
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
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
@@ -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"}
@@ -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.1",
3
+ "version": "0.3.0",
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.1",
22
- "@mono-agent/settings": "0.2.1",
21
+ "@mono-agent/agent-contracts": "0.3.0",
22
+ "@mono-agent/settings": "0.3.0",
23
23
  "cron-parser": "^5.5.0"
24
24
  },
25
25
  "publishConfig": {