133 lines
3.5 KiB
JavaScript
133 lines
3.5 KiB
JavaScript
#!/usr/bin/env node
|
||
/**
|
||
* Add Automation Cron Jobs
|
||
*
|
||
* Purpose: Add pattern detection and daily check crons
|
||
*/
|
||
|
||
const fs = require('fs');
|
||
const path = require('path');
|
||
const { randomUUID } = require('crypto');
|
||
|
||
const JOBS_FILE = path.join(process.env.HOME, '.openclaw/cron/jobs.json');
|
||
|
||
const NEW_JOBS = [
|
||
{
|
||
name: '패턴 탐지 (주간)',
|
||
schedule: '0 23 * * 0', // Every Sunday 23:00
|
||
message: `⚙️ **페르소나 지침**
|
||
- 모든 응답은 **한국어**로 작성
|
||
- 자비스 톤: 정중하지만 약간 건방진 영국식 위트
|
||
- 금지 표현: "알겠습니다", "완료", "처리", "Let me", "I'll"
|
||
|
||
---
|
||
|
||
🔍 **주간 패턴 탐지**
|
||
|
||
~/openclaw/scripts/detect-patterns.js 실행.
|
||
|
||
**목적**: 지난 7일간 반복된 실패/미흡 패턴 탐지
|
||
**임계치**: 3회 이상 반복 시 Discord 알림
|
||
**출력**: pattern-alerts-YYYY-MM-DD.json
|
||
|
||
실행 후 결과 요약만 간단히 보고 (한국어로).
|
||
패턴 발견 시 주요 개선 제안 포함.`,
|
||
model: 'anthropic/claude-haiku-4-5-20251001',
|
||
channel: '1469190688083280065' // jarvis-system
|
||
},
|
||
{
|
||
name: '일일 자가 체크',
|
||
schedule: '0 6 * * *', // Every day 06:00
|
||
message: `⚙️ **페르소나 지침**
|
||
- 모든 응답은 **한국어**로 작성
|
||
- 자비스 톤: 정중하지만 약간 건방진 영국식 위트
|
||
- 금지 표현: "알겠습니다", "완료", "처리", "Let me", "I'll"
|
||
|
||
---
|
||
|
||
🌅 **일일 자가 체크**
|
||
|
||
~/openclaw/scripts/daily-self-check.js 실행.
|
||
|
||
**목적**: 어제 self-review 검토, 최근 3일과 비교
|
||
**출력**: 반복 패턴 즉시 알림 (Discord)
|
||
|
||
실행 후:
|
||
- 반복 패턴 발견 시: 구체적 개선 제안
|
||
- 패턴 없음: NO_REPLY`,
|
||
model: 'anthropic/claude-haiku-4-5-20251001',
|
||
channel: '1469190688083280065' // jarvis-system
|
||
}
|
||
];
|
||
|
||
function main() {
|
||
console.log('➕ Adding Automation Cron Jobs\n');
|
||
|
||
// Load jobs
|
||
const data = JSON.parse(fs.readFileSync(JOBS_FILE, 'utf8'));
|
||
console.log(`Current jobs: ${data.jobs.length}\n`);
|
||
|
||
// Check if already exists
|
||
const existingNames = data.jobs.map(j => j.name);
|
||
let added = 0;
|
||
|
||
NEW_JOBS.forEach(newJob => {
|
||
if (existingNames.includes(newJob.name)) {
|
||
console.log(`⏭️ Skipped: ${newJob.name} (already exists)`);
|
||
return;
|
||
}
|
||
|
||
const job = {
|
||
id: randomUUID(),
|
||
agentId: 'main',
|
||
name: newJob.name,
|
||
enabled: true,
|
||
createdAtMs: Date.now(),
|
||
updatedAtMs: Date.now(),
|
||
schedule: {
|
||
kind: 'cron',
|
||
expr: newJob.schedule,
|
||
tz: 'Asia/Seoul'
|
||
},
|
||
sessionTarget: 'isolated',
|
||
wakeMode: 'next-heartbeat',
|
||
payload: {
|
||
deliver: true,
|
||
message: newJob.message,
|
||
channel: 'discord',
|
||
model: newJob.model,
|
||
kind: 'agentTurn',
|
||
to: `channel:${newJob.channel}`,
|
||
thinking: 'off'
|
||
},
|
||
state: {
|
||
nextRunAtMs: 0,
|
||
lastRunAtMs: 0,
|
||
lastStatus: 'pending',
|
||
lastDurationMs: 0
|
||
}
|
||
};
|
||
|
||
data.jobs.push(job);
|
||
console.log(`✅ Added: ${newJob.name}`);
|
||
console.log(` Schedule: ${newJob.schedule}`);
|
||
console.log(` Model: ${newJob.model}\n`);
|
||
added++;
|
||
});
|
||
|
||
console.log(`📊 Summary: ${added} jobs added\n`);
|
||
|
||
// Save
|
||
if (added > 0) {
|
||
fs.writeFileSync(JOBS_FILE, JSON.stringify(data, null, 2));
|
||
console.log('✅ Saved to:', JOBS_FILE);
|
||
console.log(`\nTotal jobs: ${data.jobs.length}`);
|
||
console.log('\n⚠️ Restart OpenClaw Gateway to apply changes:');
|
||
console.log(' openclaw gateway restart\n');
|
||
} else {
|
||
console.log('ℹ️ No jobs added.\n');
|
||
}
|
||
}
|
||
|
||
main();
|