Split monolithic scan_updates into individual subsystems (updates/storage/system/docker). Scanners now run in parallel via goroutines - cuts scan time roughly in half, maybe more. Agent changes: - Orchestrator pattern for scanner management - New scanners: storage (disk metrics), system (cpu/mem/processes) - New commands: scan_storage, scan_system, scan_docker - Wrapped existing scanners (APT/DNF/Docker/Windows/Winget) with common interface - Version bump to 0.1.20 Server changes: - Migration 015: agent_subsystems table with trigger for auto-init - Subsystem CRUD: enable/disable, interval (5min-24hr), auto-run toggle - API routes: /api/v1/agents/:id/subsystems/* (9 endpoints) - Stats tracking per subsystem Web UI changes: - ChatTimeline shows subsystem-specific labels and icons - AgentScanners got interactive toggles, interval dropdowns, manual trigger buttons - TypeScript types added for subsystems Backward compatible with legacy scan_updates - for now. Bugs probably exist somewhere.
82 lines
3.5 KiB
PL/PgSQL
82 lines
3.5 KiB
PL/PgSQL
-- Migration: 013_agent_subsystems
|
|
-- Purpose: Add agent subsystems table for granular command scheduling and management
|
|
-- Version: 0.1.20
|
|
-- Date: 2025-11-01
|
|
|
|
-- Create agent_subsystems table for tracking individual subsystem configurations per agent
|
|
CREATE TABLE IF NOT EXISTS agent_subsystems (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
agent_id UUID NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
|
|
subsystem VARCHAR(50) NOT NULL,
|
|
enabled BOOLEAN DEFAULT true,
|
|
interval_minutes INTEGER DEFAULT 15,
|
|
auto_run BOOLEAN DEFAULT false,
|
|
last_run_at TIMESTAMP,
|
|
next_run_at TIMESTAMP,
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
|
updated_at TIMESTAMP DEFAULT NOW(),
|
|
UNIQUE(agent_id, subsystem)
|
|
);
|
|
|
|
-- Create indexes for efficient querying
|
|
CREATE INDEX IF NOT EXISTS idx_agent_subsystems_agent ON agent_subsystems(agent_id);
|
|
CREATE INDEX IF NOT EXISTS idx_agent_subsystems_next_run ON agent_subsystems(next_run_at)
|
|
WHERE enabled = true AND auto_run = true;
|
|
CREATE INDEX IF NOT EXISTS idx_agent_subsystems_subsystem ON agent_subsystems(subsystem);
|
|
|
|
-- Create a composite index for common queries (agent + subsystem)
|
|
CREATE INDEX IF NOT EXISTS idx_agent_subsystems_lookup ON agent_subsystems(agent_id, subsystem, enabled);
|
|
|
|
-- Default subsystems for existing agents
|
|
-- Only insert for agents that don't already have subsystems configured
|
|
INSERT INTO agent_subsystems (agent_id, subsystem, enabled, interval_minutes, auto_run)
|
|
SELECT id, 'updates', true, 15, false FROM agents
|
|
WHERE NOT EXISTS (
|
|
SELECT 1 FROM agent_subsystems WHERE agent_subsystems.agent_id = agents.id AND subsystem = 'updates'
|
|
)
|
|
UNION ALL
|
|
SELECT id, 'storage', true, 15, false FROM agents
|
|
WHERE NOT EXISTS (
|
|
SELECT 1 FROM agent_subsystems WHERE agent_subsystems.agent_id = agents.id AND subsystem = 'storage'
|
|
)
|
|
UNION ALL
|
|
SELECT id, 'system', true, 30, false FROM agents
|
|
WHERE NOT EXISTS (
|
|
SELECT 1 FROM agent_subsystems WHERE agent_subsystems.agent_id = agents.id AND subsystem = 'system'
|
|
)
|
|
UNION ALL
|
|
SELECT id, 'docker', false, 15, false FROM agents
|
|
WHERE NOT EXISTS (
|
|
SELECT 1 FROM agent_subsystems WHERE agent_subsystems.agent_id = agents.id AND subsystem = 'docker'
|
|
);
|
|
|
|
-- Create trigger to automatically insert default subsystems for new agents
|
|
CREATE OR REPLACE FUNCTION create_default_subsystems()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
-- Insert default subsystems for new agent
|
|
INSERT INTO agent_subsystems (agent_id, subsystem, enabled, interval_minutes, auto_run)
|
|
VALUES
|
|
(NEW.id, 'updates', true, 15, false),
|
|
(NEW.id, 'storage', true, 15, false),
|
|
(NEW.id, 'system', true, 30, false),
|
|
(NEW.id, 'docker', false, 15, false);
|
|
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE TRIGGER trigger_create_default_subsystems
|
|
AFTER INSERT ON agents
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION create_default_subsystems();
|
|
|
|
-- Add comment for documentation
|
|
COMMENT ON TABLE agent_subsystems IS 'Per-agent subsystem configurations for granular command scheduling';
|
|
COMMENT ON COLUMN agent_subsystems.subsystem IS 'Subsystem name: updates, storage, system, docker';
|
|
COMMENT ON COLUMN agent_subsystems.enabled IS 'Whether this subsystem is enabled for the agent';
|
|
COMMENT ON COLUMN agent_subsystems.interval_minutes IS 'How often to run this subsystem (in minutes)';
|
|
COMMENT ON COLUMN agent_subsystems.auto_run IS 'Whether the server should auto-schedule this subsystem';
|
|
COMMENT ON COLUMN agent_subsystems.last_run_at IS 'Last time this subsystem was executed';
|
|
COMMENT ON COLUMN agent_subsystems.next_run_at IS 'Next scheduled run time for auto-run subsystems';
|