openjob 1.0.3

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.
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.REGISTRY_PATH = exports.JOBS_DIR = exports.AGENTS_DIR = void 0;
37
+ exports.jobDir = jobDir;
38
+ exports.jobFile = jobFile;
39
+ exports.initRegistry = initRegistry;
40
+ exports.readRegistry = readRegistry;
41
+ exports.writeRegistry = writeRegistry;
42
+ exports.addJob = addJob;
43
+ exports.removeJob = removeJob;
44
+ exports.enableJob = enableJob;
45
+ exports.disableJob = disableJob;
46
+ exports.getJob = getJob;
47
+ exports.listJobs = listJobs;
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ exports.AGENTS_DIR = path.join(process.env.HOME || process.cwd(), '.agents');
51
+ exports.JOBS_DIR = path.join(exports.AGENTS_DIR, 'jobs');
52
+ exports.REGISTRY_PATH = path.join(exports.AGENTS_DIR, 'jobs.json');
53
+ function jobDir(name) {
54
+ return path.join(exports.JOBS_DIR, name);
55
+ }
56
+ function jobFile(name) {
57
+ return path.join(jobDir(name), 'JOB.md');
58
+ }
59
+ function initRegistry() {
60
+ const dir = path.dirname(exports.REGISTRY_PATH);
61
+ if (!fs.existsSync(dir))
62
+ fs.mkdirSync(dir, { recursive: true });
63
+ if (!fs.existsSync(exports.JOBS_DIR))
64
+ fs.mkdirSync(exports.JOBS_DIR, { recursive: true });
65
+ if (!fs.existsSync(exports.REGISTRY_PATH)) {
66
+ fs.writeFileSync(exports.REGISTRY_PATH, JSON.stringify({ version: '1.0.0', jobs: [] }, null, 2));
67
+ }
68
+ return readRegistry();
69
+ }
70
+ function readRegistry() {
71
+ if (!fs.existsSync(exports.REGISTRY_PATH))
72
+ return { version: '1.0.0', jobs: [] };
73
+ return JSON.parse(fs.readFileSync(exports.REGISTRY_PATH, 'utf8'));
74
+ }
75
+ function writeRegistry(registry) {
76
+ const dir = path.dirname(exports.REGISTRY_PATH);
77
+ if (!fs.existsSync(dir))
78
+ fs.mkdirSync(dir, { recursive: true });
79
+ if (!fs.existsSync(exports.JOBS_DIR))
80
+ fs.mkdirSync(exports.JOBS_DIR, { recursive: true });
81
+ fs.writeFileSync(exports.REGISTRY_PATH, JSON.stringify(registry, null, 2));
82
+ }
83
+ function addJob(job) {
84
+ initRegistry();
85
+ const sourcePath = job.sourcePath || job.source;
86
+ if (!sourcePath || !fs.existsSync(sourcePath)) {
87
+ throw new Error(`Job source not found: ${sourcePath}`);
88
+ }
89
+ const targetDir = jobDir(job.name);
90
+ const targetFile = jobFile(job.name);
91
+ if (!fs.existsSync(targetDir))
92
+ fs.mkdirSync(targetDir, { recursive: true });
93
+ if (path.resolve(sourcePath) !== path.resolve(targetFile)) {
94
+ fs.copyFileSync(sourcePath, targetFile);
95
+ }
96
+ const registry = readRegistry();
97
+ const existing = registry.jobs.findIndex(j => j.name === job.name);
98
+ const entry = {
99
+ name: job.name,
100
+ source: targetFile,
101
+ originalSource: sourcePath,
102
+ sourcePath: targetFile,
103
+ cron: job.cron || '',
104
+ description: job.description || '',
105
+ condition: job.condition || '',
106
+ allowedSkills: job.allowedSkills || [],
107
+ timeout: job.timeout || 60,
108
+ retry: job.retry || 0,
109
+ tags: job.tags || [],
110
+ command: job.command || '',
111
+ cwd: job.cwd || '',
112
+ enabled: true,
113
+ installedAt: new Date().toISOString(),
114
+ lastRun: null,
115
+ lastStartedAt: null,
116
+ lastFinishedAt: null,
117
+ lastSuccessAt: null,
118
+ lastFailureAt: null,
119
+ nextRun: null,
120
+ lastStatus: 'idle',
121
+ lastError: null,
122
+ lastExitReason: null,
123
+ runCount: 0,
124
+ consecutiveFailures: 0,
125
+ history: [],
126
+ pid: null
127
+ };
128
+ if (existing >= 0) {
129
+ registry.jobs[existing] = entry;
130
+ }
131
+ else {
132
+ registry.jobs.push(entry);
133
+ }
134
+ writeRegistry(registry);
135
+ return entry;
136
+ }
137
+ function removeJob(name) {
138
+ const registry = readRegistry();
139
+ registry.jobs = registry.jobs.filter(j => j.name !== name);
140
+ writeRegistry(registry);
141
+ fs.rmSync(jobDir(name), { recursive: true, force: true });
142
+ }
143
+ function enableJob(name) {
144
+ const registry = readRegistry();
145
+ const job = registry.jobs.find(j => j.name === name);
146
+ if (!job)
147
+ throw new Error(`Job "${name}" not found`);
148
+ job.enabled = true;
149
+ writeRegistry(registry);
150
+ }
151
+ function disableJob(name) {
152
+ const registry = readRegistry();
153
+ const job = registry.jobs.find(j => j.name === name);
154
+ if (!job)
155
+ throw new Error(`Job "${name}" not found`);
156
+ job.enabled = false;
157
+ writeRegistry(registry);
158
+ }
159
+ function getJob(name) {
160
+ const registry = readRegistry();
161
+ return registry.jobs.find(j => j.name === name);
162
+ }
163
+ function listJobs() {
164
+ return readRegistry().jobs;
165
+ }
166
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
package/lib/state.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ import { Registry, Job, RunRecord, DaemonState, JobSummary } from './types';
2
+ export declare const STATE_DIR: string;
3
+ export declare const RUNS_DIR: string;
4
+ export declare const DAEMON_STATE_PATH: string;
5
+ export declare function ensureStateDir(): void;
6
+ export declare function getMachineId(): string;
7
+ export declare const MACHINE_ID: string;
8
+ export declare function nowIso(): string;
9
+ export declare function safeNextRun(cron: string, currentDate?: Date): string | null;
10
+ export declare function normalizeJob(job: Partial<Job> & {
11
+ name: string;
12
+ }): Job;
13
+ export declare function normalizeRegistry(registry?: Partial<Registry>): Registry;
14
+ export declare function ensureRegistryState(): Registry;
15
+ export declare function updateJob(name: string, updater: ((job: Job) => Partial<Job>) | Partial<Job>): Job;
16
+ export declare function appendRunLog(name: string, record: RunRecord): string;
17
+ export declare function readRunLog(name: string, limit?: number): RunRecord[];
18
+ export declare function writeDaemonState(partial: Partial<DaemonState>): DaemonState;
19
+ export declare function readDaemonState(): DaemonState;
20
+ export declare function summarizeJobs(): JobSummary[];
21
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE5E,eAAO,MAAM,SAAS,QAAsC,CAAC;AAC7D,eAAO,MAAM,QAAQ,QAA+B,CAAC;AACrD,eAAO,MAAM,iBAAiB,QAAsC,CAAC;AAErE,wBAAgB,cAAc,IAAI,IAAI,CAGrC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAcrC;AAED,eAAO,MAAM,UAAU,QAAiB,CAAC;AAEzC,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,GAAE,IAAiB,GAAG,MAAM,GAAG,IAAI,CAMvF;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,CA+BtE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,OAAO,CAAC,QAAQ,CAAkB,GAAG,QAAQ,CAKxF;AAED,wBAAgB,mBAAmB,IAAI,QAAQ,CAQ9C;AAED,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GACnD,GAAG,CAWL;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,MAAM,CAMpE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,SAAS,EAAE,CAYhE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAW3E;AAED,wBAAgB,eAAe,IAAI,WAAW,CAU7C;AAED,wBAAgB,aAAa,IAAI,UAAU,EAAE,CAe5C"}
package/lib/state.js ADDED
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MACHINE_ID = exports.DAEMON_STATE_PATH = exports.RUNS_DIR = exports.STATE_DIR = void 0;
37
+ exports.ensureStateDir = ensureStateDir;
38
+ exports.getMachineId = getMachineId;
39
+ exports.nowIso = nowIso;
40
+ exports.safeNextRun = safeNextRun;
41
+ exports.normalizeJob = normalizeJob;
42
+ exports.normalizeRegistry = normalizeRegistry;
43
+ exports.ensureRegistryState = ensureRegistryState;
44
+ exports.updateJob = updateJob;
45
+ exports.appendRunLog = appendRunLog;
46
+ exports.readRunLog = readRunLog;
47
+ exports.writeDaemonState = writeDaemonState;
48
+ exports.readDaemonState = readDaemonState;
49
+ exports.summarizeJobs = summarizeJobs;
50
+ const fs = __importStar(require("fs"));
51
+ const path = __importStar(require("path"));
52
+ const os = __importStar(require("os"));
53
+ const cron_parser_1 = require("cron-parser");
54
+ const registry_1 = require("./registry");
55
+ exports.STATE_DIR = path.join(registry_1.AGENTS_DIR, 'jobs-state');
56
+ exports.RUNS_DIR = path.join(exports.STATE_DIR, 'runs');
57
+ exports.DAEMON_STATE_PATH = path.join(exports.STATE_DIR, 'daemon.json');
58
+ function ensureStateDir() {
59
+ if (!fs.existsSync(exports.STATE_DIR))
60
+ fs.mkdirSync(exports.STATE_DIR, { recursive: true });
61
+ if (!fs.existsSync(exports.RUNS_DIR))
62
+ fs.mkdirSync(exports.RUNS_DIR, { recursive: true });
63
+ }
64
+ function getMachineId() {
65
+ try {
66
+ const interfaces = os.networkInterfaces();
67
+ for (const name of Object.keys(interfaces)) {
68
+ for (const iface of interfaces[name] || []) {
69
+ if (iface.family === 'IPv4' && !iface.internal && iface.mac) {
70
+ return iface.mac;
71
+ }
72
+ }
73
+ }
74
+ return os.hostname();
75
+ }
76
+ catch {
77
+ return 'unknown';
78
+ }
79
+ }
80
+ exports.MACHINE_ID = getMachineId();
81
+ function nowIso() {
82
+ return new Date().toISOString();
83
+ }
84
+ function safeNextRun(cron, currentDate = new Date()) {
85
+ try {
86
+ return (0, cron_parser_1.parseExpression)(cron, { currentDate }).next().toISOString();
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ }
92
+ function normalizeJob(job) {
93
+ return {
94
+ name: job.name,
95
+ cron: job.cron || '',
96
+ description: job.description || '',
97
+ source: job.source || '',
98
+ sourcePath: job.sourcePath || job.source || '',
99
+ condition: job.condition || '',
100
+ allowedSkills: job.allowedSkills || [],
101
+ timeout: job.timeout ?? 60,
102
+ retry: job.retry ?? 0,
103
+ tags: job.tags || [],
104
+ command: job.command || '',
105
+ cwd: job.cwd || '',
106
+ body: job.body || '',
107
+ enabled: job.enabled !== false,
108
+ installedAt: job.installedAt || nowIso(),
109
+ lastRun: job.lastRun ?? null,
110
+ lastStartedAt: job.lastStartedAt ?? null,
111
+ lastFinishedAt: job.lastFinishedAt ?? null,
112
+ lastSuccessAt: job.lastSuccessAt ?? null,
113
+ lastFailureAt: job.lastFailureAt ?? null,
114
+ lastStatus: job.lastStatus || 'idle',
115
+ lastError: job.lastError ?? null,
116
+ lastExitReason: job.lastExitReason ?? null,
117
+ runCount: Number.isFinite(job.runCount) ? job.runCount : 0,
118
+ consecutiveFailures: Number.isFinite(job.consecutiveFailures) ? job.consecutiveFailures : 0,
119
+ nextRun: job.nextRun ?? safeNextRun(job.cron || '* * * * *'),
120
+ history: Array.isArray(job.history) ? job.history.slice(-20) : [],
121
+ pid: job.pid ?? null
122
+ };
123
+ }
124
+ function normalizeRegistry(registry = (0, registry_1.readRegistry)()) {
125
+ return {
126
+ version: registry.version || '1.1.0',
127
+ jobs: (registry.jobs || []).map(j => normalizeJob(j))
128
+ };
129
+ }
130
+ function ensureRegistryState() {
131
+ if (!fs.existsSync(registry_1.REGISTRY_PATH)) {
132
+ (0, registry_1.writeRegistry)({ version: '1.1.0', jobs: [] });
133
+ }
134
+ const normalized = normalizeRegistry((0, registry_1.readRegistry)());
135
+ (0, registry_1.writeRegistry)(normalized);
136
+ ensureStateDir();
137
+ return normalized;
138
+ }
139
+ function updateJob(name, updater) {
140
+ const registry = normalizeRegistry((0, registry_1.readRegistry)());
141
+ const index = registry.jobs.findIndex(job => job.name === name);
142
+ if (index < 0)
143
+ throw new Error(`Job "${name}" not found`);
144
+ const current = registry.jobs[index];
145
+ const updates = typeof updater === 'function' ? updater(current) : updater;
146
+ const next = normalizeJob({ ...current, ...updates });
147
+ registry.jobs[index] = next;
148
+ (0, registry_1.writeRegistry)(registry);
149
+ return next;
150
+ }
151
+ function appendRunLog(name, record) {
152
+ ensureStateDir();
153
+ const logPath = path.join(exports.RUNS_DIR, `${name}.jsonl`);
154
+ const enriched = { ...record, machineId: exports.MACHINE_ID };
155
+ fs.appendFileSync(logPath, `${JSON.stringify(enriched)}\n`);
156
+ return logPath;
157
+ }
158
+ function readRunLog(name, limit = 50) {
159
+ ensureStateDir();
160
+ const logPath = path.join(exports.RUNS_DIR, `${name}.jsonl`);
161
+ if (!fs.existsSync(logPath))
162
+ return [];
163
+ const rows = fs.readFileSync(logPath, 'utf8').trim().split('\n').filter(Boolean);
164
+ return rows.slice(-limit).map(line => {
165
+ try {
166
+ return JSON.parse(line);
167
+ }
168
+ catch {
169
+ return null;
170
+ }
171
+ }).filter((r) => r !== null);
172
+ }
173
+ function writeDaemonState(partial) {
174
+ ensureStateDir();
175
+ let current;
176
+ try {
177
+ current = JSON.parse(fs.readFileSync(exports.DAEMON_STATE_PATH, 'utf8'));
178
+ }
179
+ catch {
180
+ current = { status: 'stopped', pid: null, startedAt: null, heartbeatAt: null, lastWakeGapMs: 0 };
181
+ }
182
+ const next = { ...current, ...partial };
183
+ fs.writeFileSync(exports.DAEMON_STATE_PATH, JSON.stringify(next, null, 2));
184
+ return next;
185
+ }
186
+ function readDaemonState() {
187
+ ensureStateDir();
188
+ if (!fs.existsSync(exports.DAEMON_STATE_PATH)) {
189
+ return writeDaemonState({});
190
+ }
191
+ try {
192
+ return JSON.parse(fs.readFileSync(exports.DAEMON_STATE_PATH, 'utf8'));
193
+ }
194
+ catch {
195
+ return writeDaemonState({ status: 'stopped', pid: null, startedAt: null, heartbeatAt: null, lastWakeGapMs: 0 });
196
+ }
197
+ }
198
+ function summarizeJobs() {
199
+ const registry = normalizeRegistry((0, registry_1.readRegistry)());
200
+ return registry.jobs.map(job => ({
201
+ name: job.name,
202
+ description: job.description,
203
+ cron: job.cron,
204
+ enabled: job.enabled,
205
+ nextRun: job.nextRun,
206
+ lastRun: job.lastRun,
207
+ lastStatus: job.lastStatus,
208
+ lastError: job.lastError,
209
+ lastExitReason: job.lastExitReason,
210
+ runCount: job.runCount,
211
+ consecutiveFailures: job.consecutiveFailures
212
+ }));
213
+ }
214
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
package/lib/sync.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { Registry, ClaudeTask } from './types';
2
+ export declare function readClaudeTasks(): ClaudeTask[];
3
+ export declare function writeClaudeTasks(tasks: ClaudeTask[]): void;
4
+ export declare function syncToClaude(registry: Registry): {
5
+ synced: number;
6
+ removed: number;
7
+ };
8
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAI/C,wBAAgB,eAAe,IAAI,UAAU,EAAE,CAQ9C;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,CAI1D;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAwBpF"}
package/lib/sync.js ADDED
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.readClaudeTasks = readClaudeTasks;
37
+ exports.writeClaudeTasks = writeClaudeTasks;
38
+ exports.syncToClaude = syncToClaude;
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const crypto = __importStar(require("crypto"));
42
+ const prompt_1 = require("./prompt");
43
+ const CLAUDE_TASKS_PATH = path.join(process.env.HOME || '', '.claude', 'scheduled_tasks.json');
44
+ function readClaudeTasks() {
45
+ if (!fs.existsSync(CLAUDE_TASKS_PATH))
46
+ return [];
47
+ try {
48
+ return JSON.parse(fs.readFileSync(CLAUDE_TASKS_PATH, 'utf8'));
49
+ }
50
+ catch {
51
+ return [];
52
+ }
53
+ }
54
+ function writeClaudeTasks(tasks) {
55
+ const dir = path.dirname(CLAUDE_TASKS_PATH);
56
+ if (!fs.existsSync(dir))
57
+ fs.mkdirSync(dir, { recursive: true });
58
+ fs.writeFileSync(CLAUDE_TASKS_PATH, JSON.stringify(tasks, null, 2));
59
+ }
60
+ function syncToClaude(registry) {
61
+ const claudeTasks = readClaudeTasks();
62
+ const ourPrefix = '## Scheduled Job:';
63
+ const otherTasks = claudeTasks.filter(t => !t.prompt || !t.prompt.includes(ourPrefix));
64
+ const enabledJobs = registry.jobs.filter(j => j.enabled);
65
+ const newTasks = enabledJobs.map(job => ({
66
+ id: crypto.randomUUID().slice(0, 8),
67
+ cron: job.cron,
68
+ prompt: (0, prompt_1.generatePrompt)({
69
+ name: job.name,
70
+ source: job.source,
71
+ description: job.description,
72
+ timeout: job.timeout,
73
+ retry: job.retry,
74
+ allowedSkills: job.allowedSkills,
75
+ condition: job.condition
76
+ }),
77
+ createdAt: Date.now(),
78
+ recurring: true
79
+ }));
80
+ writeClaudeTasks([...otherTasks, ...newTasks]);
81
+ return { synced: enabledJobs.length, removed: claudeTasks.length - otherTasks.length };
82
+ }
83
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,0CAQC;AAED,4CAIC;AAED,oCAwBC;AAhDD,uCAAyB;AACzB,2CAA6B;AAC7B,+CAAiC;AACjC,qCAA0C;AAG1C,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,SAAS,EAAE,sBAAsB,CAAC,CAAC;AAE/F,SAAgB,eAAe;IAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAAE,OAAO,EAAE,CAAC;IACjD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAiB,CAAC;IAChF,CAAC;IACD,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAgB,gBAAgB,CAAC,KAAmB;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,EAAE,CAAC,aAAa,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,SAAgB,YAAY,CAAC,QAAkB;IAC7C,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,mBAAmB,CAAC;IACtC,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAEvF,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAiB,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrD,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,MAAM,EAAE,IAAA,uBAAc,EAAC;YACrB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC;QACF,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC,CAAC;IAEJ,gBAAgB,CAAC,CAAC,GAAG,UAAU,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC/C,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;AACzF,CAAC"}
package/lib/types.d.ts ADDED
@@ -0,0 +1,123 @@
1
+ /** Job 运行时状态 */
2
+ export type JobStatus = 'idle' | 'running' | 'success' | 'failed' | 'skipped' | 'missed';
3
+ /** 触发方式 */
4
+ export type TriggerType = 'manual' | 'scheduled' | 'dashboard_manual';
5
+ /** 退出原因 */
6
+ export type ExitReason = `exit:${number}` | `signal:${string}` | 'timeout' | 'condition_not_met' | 'condition_requires_ai_evaluation' | 'sleep_missed' | 'runner_exception' | 'no_executable_command' | `condition_script_not_found:${string}`;
7
+ /** Daemon 状态 */
8
+ export type DaemonStatus = 'stopped' | 'starting' | 'running' | 'degraded';
9
+ /** Job 定义(从 JOB.md 解析) */
10
+ export interface JobDefinition {
11
+ name: string;
12
+ cron: string;
13
+ description: string;
14
+ condition?: string;
15
+ allowedSkills?: string[];
16
+ timeout?: number;
17
+ retry?: number;
18
+ tags?: string[];
19
+ command?: string;
20
+ cwd?: string;
21
+ body?: string;
22
+ source: string;
23
+ sourcePath: string;
24
+ }
25
+ /** Job 完整记录(包含运行时状态) */
26
+ export interface Job extends JobDefinition {
27
+ enabled: boolean;
28
+ installedAt: string;
29
+ lastRun: string | null;
30
+ lastStartedAt: string | null;
31
+ lastFinishedAt: string | null;
32
+ lastSuccessAt: string | null;
33
+ lastFailureAt: string | null;
34
+ nextRun: string | null;
35
+ lastStatus: JobStatus;
36
+ lastError: string | null;
37
+ lastExitReason: ExitReason | null;
38
+ runCount: number;
39
+ consecutiveFailures: number;
40
+ history: RunRecord[];
41
+ pid: number | null;
42
+ originalSource: string;
43
+ }
44
+ /** 运行记录 */
45
+ export interface RunRecord {
46
+ jobName: string;
47
+ trigger: TriggerType;
48
+ startedAt: string;
49
+ finishedAt: string;
50
+ status: JobStatus;
51
+ exitReason: ExitReason | string;
52
+ stdout: string;
53
+ stderr: string;
54
+ pid?: number;
55
+ machineId?: string;
56
+ }
57
+ /** Registry 结构 */
58
+ export interface Registry {
59
+ version: string;
60
+ jobs: Job[];
61
+ }
62
+ /** Daemon 状态 */
63
+ export interface DaemonState {
64
+ status: DaemonStatus;
65
+ pid: number | null;
66
+ machineId?: string;
67
+ startedAt: string | null;
68
+ heartbeatAt: string | null;
69
+ lastWakeGapMs: number;
70
+ lastError?: string;
71
+ }
72
+ /** 任务运行时配置 */
73
+ export interface JobRuntime {
74
+ parsed: JobDefinition;
75
+ cwd: string;
76
+ command: string;
77
+ commandBlocks: string[];
78
+ }
79
+ /** Shell 执行结果 */
80
+ export interface ShellResult {
81
+ code: number | null;
82
+ signal: NodeJS.Signals | null;
83
+ stdout: string;
84
+ stderr: string;
85
+ timedOut: boolean;
86
+ pid: number;
87
+ }
88
+ /** Condition 检查结果 */
89
+ export interface ConditionCheck {
90
+ skipped: boolean;
91
+ reason?: ExitReason | string;
92
+ script?: string;
93
+ }
94
+ /** Dashboard API 响应 */
95
+ export interface OverviewResponse {
96
+ daemon: DaemonState;
97
+ jobs: JobSummary[];
98
+ machineId: string;
99
+ }
100
+ /** 任务摘要(用于列表展示) */
101
+ export interface JobSummary {
102
+ name: string;
103
+ description: string;
104
+ cron: string;
105
+ enabled: boolean;
106
+ nextRun: string | null;
107
+ lastRun: string | null;
108
+ lastStatus: JobStatus;
109
+ lastError: string | null;
110
+ lastExitReason: ExitReason | null;
111
+ runCount: number;
112
+ consecutiveFailures: number;
113
+ history?: RunRecord[];
114
+ }
115
+ /** Claude Task 结构 */
116
+ export interface ClaudeTask {
117
+ id: string;
118
+ cron: string;
119
+ prompt: string;
120
+ createdAt: number;
121
+ recurring: boolean;
122
+ }
123
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/lib/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map