Scheduler System
Last Updated: 2025-01-16
Primary Source: docs/project_status.md
Service Files: backend/src/services/scheduler.service.ts
Models: backend/src/models/scheduledTask.model.ts, backend/src/models/scheduledTaskRun.model.ts
Overview
The Scheduler System manages scheduled tasks that run automatically based on cron expressions. It supports various task types including diary generation, summaries, reflections, awareness reports, and custom tasks. The system tracks task execution history, handles errors gracefully, and provides manual triggering capabilities.
Architecture
Scheduler System Flow
Core Components
1. Scheduler Service
File: backend/src/services/scheduler.service.ts
Key Functions:
initializeScheduler()
- Loads all active tasks from database
- Schedules tasks using node-cron
- Called on server startup
scheduleTask(task)
- Schedules task using cron expression
- Validates cron expression
- Stores job in activeCronJobs map
- Handles timezone configuration
unscheduleTask(taskId)
- Stops and removes scheduled task
- Cleans up cron job
executeTask(task)
- Executes task based on type
- Creates task run record
- Updates task statistics
- Handles errors gracefully
triggerTask(taskId)
- Manually triggers task execution
- Bypasses cron schedule
- Returns execution result
2. Task Types
Diary Task (diary)
Purpose: Each Level-5 Yexian instance writes its own diary
Process:
- Get Level-5 instances (specific or all)
- Auto-create instances for users with activity (if configured)
- For each instance:
- Get events in time window
- Generate diary entry using LLM
- Save to memory (if configured)
- Create timeline event
Configuration:
instanceId- Specific instance (optional)timeWindowHours- Time window (default: 24)summaryPrompt- Custom prompt (optional)saveToMemory- Save to memory (default: true)memorySource- Memory source (default: 'diary')autoCreateInstances- Auto-create instances (default: true)firstTimeFromStart- First diary from start (default: true)limit- Event limit (default: 1000)
First-Time Behavior:
- If no diary exists, gets all events from start
- Subsequent runs use configured time window
Summary Task (summary)
Purpose: General summarization
Process:
- Uses same logic as diary task
- Alias for diary task
Reflection Task (reflection)
Purpose: Meta-cognitive self-reflection using Observer Core
Process:
- If
useObserverCoreenabled:- Uses Observer Core for Level-8 reflection
- Generates reflection using unified timeline
- Otherwise:
- Falls back to basic reflection
- Uses recent memories and events
- Generates reflection using LLM
Configuration:
timeWindowHours- Time window (default: 24)useObserverCore- Use Observer Core (default: true)
Awareness Task (awareness)
Purpose: Generates explicit "I know" statements for Level-8
Process:
- Get Level-8 observer instance
- Generate awareness report
- Return report summary and statement count
Configuration:
observerInstanceId- Specific observer (optional)
Custom Task (custom)
Purpose: User-defined behavior
Supported Actions:
observer_cycle- Run observer cycle
Configuration:
action- Custom action typeobserverInstanceId- Observer instance (optional)
Task Model
ScheduledTask
Table: scheduled_tasks
Fields:
id- Primary key (UUID)name- Task namedescription- Task descriptiontaskType- Task type (diary, summary, reflection, awareness, custom)cronExpression- Cron expressionconfig- Task configuration (JSONB)isActive- Active statuslastRunAt- Last run timestampnextRunAt- Next run timestamprunCount- Total run counterrorCount- Error countlastError- Last error messagemetadata- Additional metadata (JSONB)
ScheduledTaskRun
Table: scheduled_task_runs
Fields:
id- Primary key (UUID)taskId- Task IDstatus- Run status (running, completed, failed)startedAt- Start timestampcompletedAt- Completion timestampdurationMs- Duration in millisecondsresult- Execution result (JSONB)error- Error messagemetadata- Additional metadata (JSONB)
Task Lifecycle
1. Creation
Function: createTask(data)
Process:
- Create task record
- Set default values (runCount: 0, errorCount: 0)
- Schedule task if active
- Return created task
2. Scheduling
Function: scheduleTask(task)
Process:
- Unschedule existing job (if exists)
- Validate cron expression
- Create cron job
- Store job in activeCronJobs map
- Log scheduling
3. Execution
Function: executeTask(task)
Process:
- Create task run record (status: running)
- Execute task based on type
- Update task run (status: completed/failed)
- Update task statistics
- Return execution result
4. Update
Function: updateTask(taskId, data)
Process:
- Update task record
- Reschedule if cron/active changed
- Return updated task
5. Deletion
Function: deleteTask(taskId)
Process:
- Unschedule task
- Delete task record
Cron Expressions
Format
Standard cron format: minute hour day month weekday
Examples:
0 0 * * *- Daily at midnight0 */6 * * *- Every 6 hours0 0 * * 0- Weekly on Sunday*/30 * * * *- Every 30 minutes
Timezone
Configured via TZ environment variable (default: UTC)
Task Execution Details
Diary Task Execution
Process:
- Get instances to process
- Auto-create instances if configured
- For each instance:
- Determine time window (first-time vs subsequent)
- Get events for instance
- Generate diary using LLM
- Save to memory
- Create timeline event
- Return summary
LLM Prompt:
- Includes instance name and source
- Includes time span description
- Includes events text
- Requests introspective, emotional reflection
Reflection Task Execution
Observer Core Path:
- Get Level-8 observer instance
- Generate reflection using Observer Core
- Returns reflection with context
Basic Path:
- Get recent memories and events
- Generate reflection using LLM
- Save to memory
- Return reflection
Awareness Task Execution
Process:
- Get Level-8 observer instance
- Generate awareness report
- Return report summary
Data Flow
API Endpoints
Task Management
GET /api/scheduler/tasks- Get all tasksGET /api/scheduler/tasks/:id- Get task by IDPOST /api/scheduler/tasks- Create taskPUT /api/scheduler/tasks/:id- Update taskDELETE /api/scheduler/tasks/:id- Delete taskPOST /api/scheduler/tasks/:id/trigger- Manually trigger taskPOST /api/scheduler/tasks/:id/reload- Reload task schedule
Task Runs
GET /api/scheduler/tasks/:id/runs- Get task run history
Source Files
Primary Sources:
backend/src/services/scheduler.service.ts- Main scheduler servicebackend/src/models/scheduledTask.model.ts- Task modelbackend/src/models/scheduledTaskRun.model.ts- Task run model
Related Files:
backend/src/services/observerCore.service.ts- Observer Core reflectionbackend/src/services/awareness.service.ts- Awareness reportsbackend/src/services/yexianInstance.service.ts- Instance management
Related Documentation
- Observer System - Level-8 meta-consciousness
- Memory System - Memory storage
- Timeline System - Event tracking
- 00-OVERVIEW.md - Complete system overview