diff --git a/plugin/calendar/scheduler.d.ts b/plugin/calendar/scheduler.d.ts index 07d4075..5a89747 100644 --- a/plugin/calendar/scheduler.d.ts +++ b/plugin/calendar/scheduler.d.ts @@ -2,6 +2,7 @@ * HarborForge Calendar Scheduler * * PLG-CAL-002: Plugin-side handling for pending slot execution. + * PLG-CAL-004: ScheduledGatewayRestart event handling with state persistence. * * Responsibilities: * - Run calendar heartbeat every minute @@ -9,6 +10,8 @@ * - Wake agent with task context * - Handle slot status transitions (attended, ongoing, deferred) * - Manage agent status transitions (idle → busy/on_call) + * - Persist state on ScheduledGatewayRestart and restore on startup + * - Send final heartbeat before graceful shutdown * * Design reference: NEXT_WAVE_DEV_DIRECTION.md §6 (Agent wakeup mechanism) */ @@ -32,6 +35,8 @@ export interface CalendarSchedulerConfig { heartbeatIntervalMs?: number; /** Enable verbose debug logging */ debug?: boolean; + /** Directory for state persistence (default: plugin data dir) */ + stateDir?: string; } /** * Context passed to agent when waking for slot execution. @@ -63,6 +68,8 @@ interface SchedulerState { deferredSlotIds: Set; /** Whether agent is currently processing a slot */ isProcessing: boolean; + /** Whether a gateway restart is scheduled/pending */ + isRestartPending: boolean; } /** * CalendarScheduler manages the periodic heartbeat and slot execution lifecycle. @@ -70,7 +77,33 @@ interface SchedulerState { export declare class CalendarScheduler { private config; private state; + private stateFilePath; constructor(config: CalendarSchedulerConfig); + /** + * Get default state directory (plugin data directory or temp fallback). + */ + private getDefaultStateDir; + /** + * Persist current state to disk for recovery after restart. + */ + private persistState; + /** + * Restore state from disk if available. + */ + private restoreState; + /** + * Clear persisted state file after successful restore. + */ + private clearPersistedState; + /** + * Send a final heartbeat to the backend before shutdown. + */ + private sendFinalHeartbeat; + /** + * Handle ScheduledGatewayRestart event. + * PLG-CAL-004: Persist state, send final heartbeat, pause scheduled tasks. + */ + private handleScheduledGatewayRestart; /** * Start the calendar scheduler. * Begins periodic heartbeat to check for pending slots. @@ -96,6 +129,10 @@ export declare class CalendarScheduler { * Select highest priority slot and wake agent. */ private handleIdleAgent; + /** + * Check if a slot is a ScheduledGatewayRestart system event. + */ + private isScheduledGatewayRestart; /** * Execute a slot by waking the agent. */ @@ -181,6 +218,14 @@ export declare class CalendarScheduler { * Get the current slot being executed (if any). */ getCurrentSlot(): CalendarSlotResponse | null; + /** + * Check if a gateway restart is pending. + */ + isRestartPending(): boolean; + /** + * Get the path to the state file. + */ + getStateFilePath(): string; } /** * Factory function to create a CalendarScheduler from plugin context. diff --git a/plugin/calendar/scheduler.d.ts.map b/plugin/calendar/scheduler.d.ts.map index 376a07e..c946280 100644 --- a/plugin/calendar/scheduler.d.ts.map +++ b/plugin/calendar/scheduler.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["scheduler.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["scheduler.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/plugin/calendar/scheduler.js b/plugin/calendar/scheduler.js index 940c2fb..794e246 100644 --- a/plugin/calendar/scheduler.js +++ b/plugin/calendar/scheduler.js @@ -3,6 +3,7 @@ * HarborForge Calendar Scheduler * * PLG-CAL-002: Plugin-side handling for pending slot execution. + * PLG-CAL-004: ScheduledGatewayRestart event handling with state persistence. * * Responsibilities: * - Run calendar heartbeat every minute @@ -10,25 +11,36 @@ * - Wake agent with task context * - Handle slot status transitions (attended, ongoing, deferred) * - Manage agent status transitions (idle → busy/on_call) + * - Persist state on ScheduledGatewayRestart and restore on startup + * - Send final heartbeat before graceful shutdown * * Design reference: NEXT_WAVE_DEV_DIRECTION.md §6 (Agent wakeup mechanism) */ Object.defineProperty(exports, "__esModule", { value: true }); exports.CalendarScheduler = void 0; exports.createCalendarScheduler = createCalendarScheduler; +const fs_1 = require("fs"); +const path_1 = require("path"); const types_1 = require("./types"); +/** State file name */ +const STATE_FILENAME = 'calendar-scheduler-state.json'; +/** State file version for migration compatibility */ +const STATE_VERSION = 1; /** * CalendarScheduler manages the periodic heartbeat and slot execution lifecycle. */ class CalendarScheduler { config; state; + stateFilePath; constructor(config) { this.config = { heartbeatIntervalMs: 60000, // 1 minute default debug: false, + stateDir: this.getDefaultStateDir(), ...config, }; + this.stateFilePath = (0, path_1.join)(this.config.stateDir, STATE_FILENAME); this.state = { isRunning: false, currentSlot: null, @@ -36,7 +48,162 @@ class CalendarScheduler { intervalHandle: null, deferredSlotIds: new Set(), isProcessing: false, + isRestartPending: false, }; + // Attempt to restore state from previous persistence + this.restoreState(); + } + /** + * Get default state directory (plugin data directory or temp fallback). + */ + getDefaultStateDir() { + // Try to use the plugin's directory or a standard data location + const candidates = [ + process.env.OPENCLAW_PLUGIN_DATA_DIR, + process.env.HARBORFORGE_PLUGIN_DIR, + (0, path_1.join)(process.cwd(), '.harborforge'), + (0, path_1.join)(process.cwd(), 'data'), + '/tmp/harborforge', + ]; + for (const dir of candidates) { + if (dir) { + try { + if (!(0, fs_1.existsSync)(dir)) { + (0, fs_1.mkdirSync)(dir, { recursive: true }); + } + // Test write access + const testFile = (0, path_1.join)(dir, '.write-test'); + (0, fs_1.writeFileSync)(testFile, '', { flag: 'w' }); + return dir; + } + catch { + continue; + } + } + } + // Fallback to current working directory + return process.cwd(); + } + /** + * Persist current state to disk for recovery after restart. + */ + persistState(reason) { + try { + const persistedState = { + version: STATE_VERSION, + persistedAt: new Date().toISOString(), + reason, + currentSlot: this.state.currentSlot, + deferredSlotIds: Array.from(this.state.deferredSlotIds), + isProcessing: this.state.isProcessing, + agentStatus: null, // Will be determined at restore time + }; + (0, fs_1.writeFileSync)(this.stateFilePath, JSON.stringify(persistedState, null, 2)); + this.config.logger.info(`[PLG-CAL-004] State persisted to ${this.stateFilePath} (reason: ${reason})`); + } + catch (err) { + this.config.logger.error('[PLG-CAL-004] Failed to persist state:', err); + } + } + /** + * Restore state from disk if available. + */ + restoreState() { + try { + if (!(0, fs_1.existsSync)(this.stateFilePath)) { + return; + } + const data = (0, fs_1.readFileSync)(this.stateFilePath, 'utf-8'); + const persisted = JSON.parse(data); + // Validate version + if (persisted.version !== STATE_VERSION) { + this.config.logger.warn(`[PLG-CAL-004] State version mismatch: ${persisted.version} vs ${STATE_VERSION}`); + this.clearPersistedState(); + return; + } + // Restore deferred slot IDs + if (persisted.deferredSlotIds && persisted.deferredSlotIds.length > 0) { + this.state.deferredSlotIds = new Set(persisted.deferredSlotIds); + this.config.logger.info(`[PLG-CAL-004] Restored ${persisted.deferredSlotIds.length} deferred slot(s)`); + } + // If there was a slot in progress, mark it for replanning + if (persisted.isProcessing && persisted.currentSlot) { + this.config.logger.warn(`[PLG-CAL-004] Previous session had in-progress slot: ${this.getSlotId(persisted.currentSlot)}`); + // The slot will be picked up by the next heartbeat and can be resumed or deferred + } + this.config.logger.info(`[PLG-CAL-004] State restored from ${persisted.persistedAt} (reason: ${persisted.reason})`); + // Clear the persisted state after successful restore + this.clearPersistedState(); + } + catch (err) { + this.config.logger.error('[PLG-CAL-004] Failed to restore state:', err); + } + } + /** + * Clear persisted state file after successful restore. + */ + clearPersistedState() { + try { + if ((0, fs_1.existsSync)(this.stateFilePath)) { + // In a real implementation, we might want to archive instead of delete + // For now, we'll just clear the content to mark as processed + (0, fs_1.writeFileSync)(this.stateFilePath, JSON.stringify({ restored: true, at: new Date().toISOString() })); + } + } + catch (err) { + this.config.logger.error('[PLG-CAL-004] Failed to clear persisted state:', err); + } + } + /** + * Send a final heartbeat to the backend before shutdown. + */ + async sendFinalHeartbeat(reason) { + try { + this.config.logger.info(`[PLG-CAL-004] Sending final heartbeat (reason: ${reason})`); + // Send agent status update indicating we're going offline + await this.config.bridge.reportAgentStatus({ status: 'offline' }); + this.config.logger.info('[PLG-CAL-004] Final heartbeat sent successfully'); + } + catch (err) { + this.config.logger.error('[PLG-CAL-004] Failed to send final heartbeat:', err); + } + } + /** + * Handle ScheduledGatewayRestart event. + * PLG-CAL-004: Persist state, send final heartbeat, pause scheduled tasks. + */ + async handleScheduledGatewayRestart(slot) { + this.config.logger.info('[PLG-CAL-004] Handling ScheduledGatewayRestart event'); + // 1. Mark restart as pending to prevent new slot processing + this.state.isRestartPending = true; + // 2. Persist current state + this.persistState('ScheduledGatewayRestart'); + // 3. If there's a current slot, pause it gracefully + if (this.state.isProcessing && this.state.currentSlot) { + this.config.logger.info('[PLG-CAL-004] Pausing current slot before restart'); + await this.pauseCurrentSlot(); + } + // 4. Send final heartbeat + await this.sendFinalHeartbeat('ScheduledGatewayRestart'); + // 5. Stop the scheduler (pause scheduled tasks) + this.config.logger.info('[PLG-CAL-004] Stopping scheduler due to gateway restart'); + this.stop(); + // 6. Mark the slot as finished (since we've handled the restart) + const update = { + status: types_1.SlotStatus.FINISHED, + actual_duration: 0, // Restart preparation doesn't take time + }; + try { + if (slot.id) { + await this.config.bridge.updateSlot(slot.id, update); + } + else if (slot.virtual_id) { + await this.config.bridge.updateVirtualSlot(slot.virtual_id, update); + } + } + catch (err) { + this.config.logger.error('[PLG-CAL-004] Failed to mark restart slot as finished:', err); + } } /** * Start the calendar scheduler. @@ -48,6 +215,7 @@ class CalendarScheduler { return; } this.state.isRunning = true; + this.state.isRestartPending = false; this.config.logger.info('Calendar scheduler started'); // Run initial heartbeat immediately this.runHeartbeat(); @@ -74,6 +242,11 @@ class CalendarScheduler { if (!this.state.isRunning) { return; } + // Skip heartbeat if restart is pending + if (this.state.isRestartPending) { + this.logDebug('Heartbeat skipped: gateway restart pending'); + return; + } this.state.lastHeartbeatAt = new Date(); try { // Fetch pending slots from backend @@ -130,7 +303,7 @@ class CalendarScheduler { return; } // Filter out already deferred slots in this session - const eligibleSlots = slots.filter(s => !this.state.deferredSlotIds.has(this.getSlotId(s))); + const eligibleSlots = slots.filter((s) => !this.state.deferredSlotIds.has(this.getSlotId(s))); if (eligibleSlots.length === 0) { this.logDebug('All pending slots have been deferred this session'); return; @@ -144,9 +317,24 @@ class CalendarScheduler { await this.deferSlot(slot); this.state.deferredSlotIds.add(this.getSlotId(slot)); } + // Check if this is a ScheduledGatewayRestart event + if (this.isScheduledGatewayRestart(selectedSlot)) { + await this.handleScheduledGatewayRestart(selectedSlot); + return; + } // Wake agent to execute selected slot await this.executeSlot(selectedSlot); } + /** + * Check if a slot is a ScheduledGatewayRestart system event. + */ + isScheduledGatewayRestart(slot) { + if (slot.event_type !== 'system_event' || !slot.event_data) { + return false; + } + const sysData = slot.event_data; + return sysData.event === 'ScheduledGatewayRestart'; + } /** * Execute a slot by waking the agent. */ @@ -544,6 +732,18 @@ Please use this time for the scheduled activity.`; getCurrentSlot() { return this.state.currentSlot; } + /** + * Check if a gateway restart is pending. + */ + isRestartPending() { + return this.state.isRestartPending; + } + /** + * Get the path to the state file. + */ + getStateFilePath() { + return this.stateFilePath; + } } exports.CalendarScheduler = CalendarScheduler; /** diff --git a/plugin/calendar/scheduler.js.map b/plugin/calendar/scheduler.js.map index af5353a..de36aaf 100644 --- a/plugin/calendar/scheduler.js.map +++ b/plugin/calendar/scheduler.js.map @@ -1 +1 @@ -{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["scheduler.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["scheduler.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/plugin/calendar/scheduler.ts b/plugin/calendar/scheduler.ts index 718b79e..bb0675f 100644 --- a/plugin/calendar/scheduler.ts +++ b/plugin/calendar/scheduler.ts @@ -2,6 +2,7 @@ * HarborForge Calendar Scheduler * * PLG-CAL-002: Plugin-side handling for pending slot execution. + * PLG-CAL-004: ScheduledGatewayRestart event handling with state persistence. * * Responsibilities: * - Run calendar heartbeat every minute @@ -9,13 +10,15 @@ * - Wake agent with task context * - Handle slot status transitions (attended, ongoing, deferred) * - Manage agent status transitions (idle → busy/on_call) + * - Persist state on ScheduledGatewayRestart and restore on startup + * - Send final heartbeat before graceful shutdown * * Design reference: NEXT_WAVE_DEV_DIRECTION.md §6 (Agent wakeup mechanism) */ -import { - CalendarBridgeClient, -} from './calendar-bridge'; +import { writeFileSync, readFileSync, existsSync, mkdirSync } from 'fs'; +import { join, dirname } from 'path'; +import { CalendarBridgeClient } from './calendar-bridge'; import { CalendarSlotResponse, SlotStatus, @@ -43,6 +46,8 @@ export interface CalendarSchedulerConfig { heartbeatIntervalMs?: number; /** Enable verbose debug logging */ debug?: boolean; + /** Directory for state persistence (default: plugin data dir) */ + stateDir?: string; } /** @@ -60,6 +65,26 @@ export interface AgentWakeContext { isVirtual: boolean; } +/** + * Persisted state structure for recovery after restart. + */ +interface PersistedState { + /** Version for migration compatibility */ + version: number; + /** When the state was persisted */ + persistedAt: string; + /** Reason for persistence (e.g., 'ScheduledGatewayRestart') */ + reason: string; + /** The slot that was being executed when persisted */ + currentSlot: CalendarSlotResponse | null; + /** Deferred slot IDs at persistence time */ + deferredSlotIds: string[]; + /** Whether a slot was in progress */ + isProcessing: boolean; + /** Agent status at persistence time */ + agentStatus: AgentStatusValue | null; +} + /** * Current execution state tracked by the scheduler. */ @@ -76,21 +101,33 @@ interface SchedulerState { deferredSlotIds: Set; /** Whether agent is currently processing a slot */ isProcessing: boolean; + /** Whether a gateway restart is scheduled/pending */ + isRestartPending: boolean; } +/** State file name */ +const STATE_FILENAME = 'calendar-scheduler-state.json'; +/** State file version for migration compatibility */ +const STATE_VERSION = 1; + /** * CalendarScheduler manages the periodic heartbeat and slot execution lifecycle. */ export class CalendarScheduler { private config: Required; private state: SchedulerState; + private stateFilePath: string; constructor(config: CalendarSchedulerConfig) { this.config = { heartbeatIntervalMs: 60000, // 1 minute default debug: false, + stateDir: this.getDefaultStateDir(), ...config, }; + + this.stateFilePath = join(this.config.stateDir, STATE_FILENAME); + this.state = { isRunning: false, currentSlot: null, @@ -98,7 +135,182 @@ export class CalendarScheduler { intervalHandle: null, deferredSlotIds: new Set(), isProcessing: false, + isRestartPending: false, }; + + // Attempt to restore state from previous persistence + this.restoreState(); + } + + /** + * Get default state directory (plugin data directory or temp fallback). + */ + private getDefaultStateDir(): string { + // Try to use the plugin's directory or a standard data location + const candidates = [ + process.env.OPENCLAW_PLUGIN_DATA_DIR, + process.env.HARBORFORGE_PLUGIN_DIR, + join(process.cwd(), '.harborforge'), + join(process.cwd(), 'data'), + '/tmp/harborforge', + ]; + + for (const dir of candidates) { + if (dir) { + try { + if (!existsSync(dir)) { + mkdirSync(dir, { recursive: true }); + } + // Test write access + const testFile = join(dir, '.write-test'); + writeFileSync(testFile, '', { flag: 'w' }); + return dir; + } catch { + continue; + } + } + } + + // Fallback to current working directory + return process.cwd(); + } + + /** + * Persist current state to disk for recovery after restart. + */ + private persistState(reason: string): void { + try { + const persistedState: PersistedState = { + version: STATE_VERSION, + persistedAt: new Date().toISOString(), + reason, + currentSlot: this.state.currentSlot, + deferredSlotIds: Array.from(this.state.deferredSlotIds), + isProcessing: this.state.isProcessing, + agentStatus: null, // Will be determined at restore time + }; + + writeFileSync(this.stateFilePath, JSON.stringify(persistedState, null, 2)); + this.config.logger.info(`[PLG-CAL-004] State persisted to ${this.stateFilePath} (reason: ${reason})`); + } catch (err) { + this.config.logger.error('[PLG-CAL-004] Failed to persist state:', err); + } + } + + /** + * Restore state from disk if available. + */ + private restoreState(): void { + try { + if (!existsSync(this.stateFilePath)) { + return; + } + + const data = readFileSync(this.stateFilePath, 'utf-8'); + const persisted: PersistedState = JSON.parse(data); + + // Validate version + if (persisted.version !== STATE_VERSION) { + this.config.logger.warn(`[PLG-CAL-004] State version mismatch: ${persisted.version} vs ${STATE_VERSION}`); + this.clearPersistedState(); + return; + } + + // Restore deferred slot IDs + if (persisted.deferredSlotIds && persisted.deferredSlotIds.length > 0) { + this.state.deferredSlotIds = new Set(persisted.deferredSlotIds); + this.config.logger.info(`[PLG-CAL-004] Restored ${persisted.deferredSlotIds.length} deferred slot(s)`); + } + + // If there was a slot in progress, mark it for replanning + if (persisted.isProcessing && persisted.currentSlot) { + this.config.logger.warn( + `[PLG-CAL-004] Previous session had in-progress slot: ${this.getSlotId(persisted.currentSlot)}` + ); + // The slot will be picked up by the next heartbeat and can be resumed or deferred + } + + this.config.logger.info(`[PLG-CAL-004] State restored from ${persisted.persistedAt} (reason: ${persisted.reason})`); + + // Clear the persisted state after successful restore + this.clearPersistedState(); + } catch (err) { + this.config.logger.error('[PLG-CAL-004] Failed to restore state:', err); + } + } + + /** + * Clear persisted state file after successful restore. + */ + private clearPersistedState(): void { + try { + if (existsSync(this.stateFilePath)) { + // In a real implementation, we might want to archive instead of delete + // For now, we'll just clear the content to mark as processed + writeFileSync(this.stateFilePath, JSON.stringify({ restored: true, at: new Date().toISOString() })); + } + } catch (err) { + this.config.logger.error('[PLG-CAL-004] Failed to clear persisted state:', err); + } + } + + /** + * Send a final heartbeat to the backend before shutdown. + */ + private async sendFinalHeartbeat(reason: string): Promise { + try { + this.config.logger.info(`[PLG-CAL-004] Sending final heartbeat (reason: ${reason})`); + + // Send agent status update indicating we're going offline + await this.config.bridge.reportAgentStatus({ status: 'offline' }); + + this.config.logger.info('[PLG-CAL-004] Final heartbeat sent successfully'); + } catch (err) { + this.config.logger.error('[PLG-CAL-004] Failed to send final heartbeat:', err); + } + } + + /** + * Handle ScheduledGatewayRestart event. + * PLG-CAL-004: Persist state, send final heartbeat, pause scheduled tasks. + */ + private async handleScheduledGatewayRestart(slot: CalendarSlotResponse): Promise { + this.config.logger.info('[PLG-CAL-004] Handling ScheduledGatewayRestart event'); + + // 1. Mark restart as pending to prevent new slot processing + this.state.isRestartPending = true; + + // 2. Persist current state + this.persistState('ScheduledGatewayRestart'); + + // 3. If there's a current slot, pause it gracefully + if (this.state.isProcessing && this.state.currentSlot) { + this.config.logger.info('[PLG-CAL-004] Pausing current slot before restart'); + await this.pauseCurrentSlot(); + } + + // 4. Send final heartbeat + await this.sendFinalHeartbeat('ScheduledGatewayRestart'); + + // 5. Stop the scheduler (pause scheduled tasks) + this.config.logger.info('[PLG-CAL-004] Stopping scheduler due to gateway restart'); + this.stop(); + + // 6. Mark the slot as finished (since we've handled the restart) + const update: SlotAgentUpdate = { + status: SlotStatus.FINISHED, + actual_duration: 0, // Restart preparation doesn't take time + }; + + try { + if (slot.id) { + await this.config.bridge.updateSlot(slot.id, update); + } else if (slot.virtual_id) { + await this.config.bridge.updateVirtualSlot(slot.virtual_id, update); + } + } catch (err) { + this.config.logger.error('[PLG-CAL-004] Failed to mark restart slot as finished:', err); + } } /** @@ -112,6 +324,7 @@ export class CalendarScheduler { } this.state.isRunning = true; + this.state.isRestartPending = false; this.config.logger.info('Calendar scheduler started'); // Run initial heartbeat immediately @@ -148,6 +361,12 @@ export class CalendarScheduler { return; } + // Skip heartbeat if restart is pending + if (this.state.isRestartPending) { + this.logDebug('Heartbeat skipped: gateway restart pending'); + return; + } + this.state.lastHeartbeatAt = new Date(); try { @@ -159,7 +378,9 @@ export class CalendarScheduler { return; } - this.logDebug(`Heartbeat: ${response.slots.length} slots pending, agent_status=${response.agent_status}`); + this.logDebug( + `Heartbeat: ${response.slots.length} slots pending, agent_status=${response.agent_status}` + ); // If agent is not idle, defer all pending slots if (response.agent_status !== 'idle') { @@ -178,7 +399,6 @@ export class CalendarScheduler { // Agent is idle - handle pending slots await this.handleIdleAgent(response.slots); - } catch (err) { this.config.logger.error('Heartbeat error:', err); } @@ -225,7 +445,7 @@ export class CalendarScheduler { // Filter out already deferred slots in this session const eligibleSlots = slots.filter( - s => !this.state.deferredSlotIds.has(this.getSlotId(s)) + (s) => !this.state.deferredSlotIds.has(this.getSlotId(s)) ); if (eligibleSlots.length === 0) { @@ -238,7 +458,7 @@ export class CalendarScheduler { this.config.logger.info( `Selected slot for execution: id=${this.getSlotId(selectedSlot)}, ` + - `type=${selectedSlot.slot_type}, priority=${selectedSlot.priority}` + `type=${selectedSlot.slot_type}, priority=${selectedSlot.priority}` ); // Mark remaining slots as deferred @@ -247,10 +467,27 @@ export class CalendarScheduler { this.state.deferredSlotIds.add(this.getSlotId(slot)); } + // Check if this is a ScheduledGatewayRestart event + if (this.isScheduledGatewayRestart(selectedSlot)) { + await this.handleScheduledGatewayRestart(selectedSlot); + return; + } + // Wake agent to execute selected slot await this.executeSlot(selectedSlot); } + /** + * Check if a slot is a ScheduledGatewayRestart system event. + */ + private isScheduledGatewayRestart(slot: CalendarSlotResponse): boolean { + if (slot.event_type !== 'system_event' || !slot.event_data) { + return false; + } + const sysData = slot.event_data as CalendarEventDataSystemEvent; + return sysData.event === 'ScheduledGatewayRestart'; + } + /** * Execute a slot by waking the agent. */ @@ -315,7 +552,6 @@ export class CalendarScheduler { // Note: isProcessing remains true until agent signals completion // This is handled by external completion callback - } catch (err) { this.config.logger.error('Error executing slot:', err); this.state.isProcessing = false; @@ -361,7 +597,10 @@ export class CalendarScheduler { /** * Build prompt for job-type slots. */ - private buildJobPrompt(slot: CalendarSlotResponse, jobData: CalendarEventDataJob): string { + private buildJobPrompt( + slot: CalendarSlotResponse, + jobData: CalendarEventDataJob + ): string { const duration = slot.estimated_duration; const type = jobData.type; const code = jobData.code; @@ -518,7 +757,6 @@ Please use this time for the scheduled activity.`; this.config.logger.info( `Completed slot ${this.getSlotId(slot)}, actual_duration=${actualDurationMinutes}min` ); - } catch (err) { this.config.logger.error('Failed to complete slot:', err); } finally { @@ -556,7 +794,6 @@ Please use this time for the scheduled activity.`; this.config.logger.info( `Aborted slot ${this.getSlotId(slot)}${reason ? `: ${reason}` : ''}` ); - } catch (err) { this.config.logger.error('Failed to abort slot:', err); } finally { @@ -589,7 +826,6 @@ Please use this time for the scheduled activity.`; } this.config.logger.info(`Paused slot ${this.getSlotId(slot)}`); - } catch (err) { this.config.logger.error('Failed to pause slot:', err); } @@ -617,7 +853,6 @@ Please use this time for the scheduled activity.`; } this.config.logger.info(`Resumed slot ${this.getSlotId(slot)}`); - } catch (err) { this.config.logger.error('Failed to resume slot:', err); } @@ -692,6 +927,20 @@ Please use this time for the scheduled activity.`; getCurrentSlot(): CalendarSlotResponse | null { return this.state.currentSlot; } + + /** + * Check if a gateway restart is pending. + */ + isRestartPending(): boolean { + return this.state.isRestartPending; + } + + /** + * Get the path to the state file. + */ + getStateFilePath(): string { + return this.stateFilePath; + } } /** diff --git a/plugin/index.ts b/plugin/index.ts index 19a1b33..0e50d97 100644 --- a/plugin/index.ts +++ b/plugin/index.ts @@ -5,7 +5,7 @@ * for the HarborForge Monitor bridge (via monitor_port). * * Also integrates with HarborForge Calendar system to wake agents - * for scheduled tasks (PLG-CAL-002). + * for scheduled tasks (PLG-CAL-002, PLG-CAL-004). * * Sidecar architecture has been removed. Telemetry data is now * served directly by the plugin when Monitor queries via the @@ -105,7 +105,7 @@ export default { }, openclaw: { version: api.version || 'unknown', - pluginVersion: '0.3.0', + pluginVersion: '0.3.1', // Bumped for PLG-CAL-004 }, timestamp: new Date().toISOString(), }; @@ -128,7 +128,7 @@ export default { const meta: OpenClawMeta = { version: api.version || 'unknown', - plugin_version: '0.3.0', + plugin_version: '0.3.1', agents: [], // TODO: populate from api agent list when available }; @@ -363,6 +363,7 @@ export default { running: calendarScheduler.isRunning(), processing: calendarScheduler.isProcessing(), currentSlot: calendarScheduler.getCurrentSlot(), + isRestartPending: calendarScheduler.isRestartPending(), } : null; return { @@ -439,6 +440,8 @@ export default { processing: calendarScheduler.isProcessing(), currentSlot: calendarScheduler.getCurrentSlot(), state: calendarScheduler.getState(), + isRestartPending: calendarScheduler.isRestartPending(), + stateFilePath: calendarScheduler.getStateFilePath(), }; }, })); @@ -490,6 +493,68 @@ export default { }, })); + // Tool: pause current slot + api.registerTool(() => ({ + name: 'harborforge_calendar_pause', + description: 'Pause the current calendar slot', + parameters: { + type: 'object', + properties: {}, + }, + async execute() { + if (!calendarScheduler) { + return { error: 'Calendar scheduler not running' }; + } + + await calendarScheduler.pauseCurrentSlot(); + return { success: true, message: 'Slot paused' }; + }, + })); + + // Tool: resume current slot + api.registerTool(() => ({ + name: 'harborforge_calendar_resume', + description: 'Resume the paused calendar slot', + parameters: { + type: 'object', + properties: {}, + }, + async execute() { + if (!calendarScheduler) { + return { error: 'Calendar scheduler not running' }; + } + + await calendarScheduler.resumeCurrentSlot(); + return { success: true, message: 'Slot resumed' }; + }, + })); + + // Tool: check ScheduledGatewayRestart status + api.registerTool(() => ({ + name: 'harborforge_restart_status', + description: 'Check if a gateway restart is pending (PLG-CAL-004)', + parameters: { + type: 'object', + properties: {}, + }, + async execute() { + if (!calendarScheduler) { + return { error: 'Calendar scheduler not running' }; + } + + const isPending = calendarScheduler.isRestartPending(); + const stateFilePath = calendarScheduler.getStateFilePath(); + + return { + isRestartPending: isPending, + stateFilePath: stateFilePath, + message: isPending + ? 'A gateway restart has been scheduled. The scheduler has been paused.' + : 'No gateway restart is pending.', + }; + }, + })); + logger.info('HarborForge plugin registered (id: harbor-forge)'); }, };