Files
attune/scripts/seed_core_pack.sql

438 lines
12 KiB
SQL

-- Seed Core Pack with Generic Timer Triggers, Sensors, and Basic Actions
-- This script creates the core pack with the new trigger/sensor architecture
SET search_path TO attune, public;
-- Insert core pack
INSERT INTO attune.pack (ref, label, description, version)
VALUES (
'core',
'Core Pack',
'Built-in core functionality including timer triggers and basic actions',
'1.0.0'
)
ON CONFLICT (ref) DO UPDATE SET
label = EXCLUDED.label,
description = EXCLUDED.description,
version = EXCLUDED.version,
updated = NOW();
-- Get pack ID for reference
DO $$
DECLARE
v_pack_id BIGINT;
v_action_runtime_id BIGINT;
v_sensor_runtime_id BIGINT;
v_intervaltimer_id BIGINT;
v_crontimer_id BIGINT;
v_datetimetimer_id BIGINT;
v_echo_action_id BIGINT;
v_sensor_10s_id BIGINT;
BEGIN
-- Get core pack ID
SELECT id INTO v_pack_id FROM attune.pack WHERE ref = 'core';
-- Create shell runtime
INSERT INTO attune.runtime (ref, pack, pack_ref, name, description, distributions)
VALUES (
'core.shell',
v_pack_id,
'core',
'Shell',
'Shell (bash/sh) runtime for script execution - always available',
'{"verification": {"always_available": true}}'::jsonb
)
ON CONFLICT (ref) DO UPDATE SET
name = EXCLUDED.name,
description = EXCLUDED.description,
updated = NOW()
RETURNING id INTO v_action_runtime_id;
-- Use the native runtime for sensors that are compiled binaries
SELECT id INTO v_sensor_runtime_id
FROM attune.runtime
WHERE ref = 'core.native';
-- If core.native doesn't exist yet (shouldn't happen), create it
IF v_sensor_runtime_id IS NULL THEN
INSERT INTO attune.runtime (ref, pack, pack_ref, name, description, distributions, execution_config)
VALUES (
'core.native',
v_pack_id,
'core',
'Native',
'Native compiled runtime (Rust, Go, C, etc.) - executes binaries directly without an interpreter',
'{"verification": {"always_available": true, "check_required": false}}'::jsonb,
'{}'::jsonb
)
ON CONFLICT (ref) DO UPDATE SET
name = EXCLUDED.name,
description = EXCLUDED.description,
updated = NOW()
RETURNING id INTO v_sensor_runtime_id;
END IF;
-- Create generic timer triggers (these define trigger types, not instances)
-- Interval Timer Trigger Type
INSERT INTO attune.trigger (
ref,
pack,
pack_ref,
label,
description,
enabled,
param_schema,
out_schema
)
VALUES (
'core.intervaltimer',
v_pack_id,
'core',
'Interval Timer',
'Fires at regular intervals based on specified time unit and interval',
true,
'{
"type": "object",
"properties": {
"unit": {
"type": "string",
"enum": ["seconds", "minutes", "hours"],
"description": "Time unit for the interval"
},
"interval": {
"type": "integer",
"minimum": 1,
"description": "Number of time units between each trigger"
}
},
"required": ["unit", "interval"]
}'::jsonb,
'{
"type": "object",
"properties": {
"type": {"type": "string", "const": "interval"},
"interval_seconds": {"type": "integer"},
"fired_at": {"type": "string", "format": "date-time"}
}
}'::jsonb
)
ON CONFLICT (ref) DO UPDATE SET
label = EXCLUDED.label,
description = EXCLUDED.description,
param_schema = EXCLUDED.param_schema,
out_schema = EXCLUDED.out_schema,
updated = NOW()
RETURNING id INTO v_intervaltimer_id;
-- Cron Timer Trigger Type
INSERT INTO attune.trigger (
ref,
pack,
pack_ref,
label,
description,
enabled,
param_schema,
out_schema
)
VALUES (
'core.crontimer',
v_pack_id,
'core',
'Cron Timer',
'Fires based on a cron schedule expression',
true,
'{
"type": "object",
"properties": {
"expression": {
"type": "string",
"description": "Cron expression (e.g., \"0 0 * * * *\" for every hour)"
}
},
"required": ["expression"]
}'::jsonb,
'{
"type": "object",
"properties": {
"type": {"type": "string", "const": "cron"},
"fired_at": {"type": "string", "format": "date-time"},
"scheduled_at": {"type": "string", "format": "date-time"}
}
}'::jsonb
)
ON CONFLICT (ref) DO UPDATE SET
label = EXCLUDED.label,
description = EXCLUDED.description,
param_schema = EXCLUDED.param_schema,
out_schema = EXCLUDED.out_schema,
updated = NOW()
RETURNING id INTO v_crontimer_id;
-- Datetime Timer Trigger Type
INSERT INTO attune.trigger (
ref,
pack,
pack_ref,
label,
description,
enabled,
param_schema,
out_schema
)
VALUES (
'core.datetimetimer',
v_pack_id,
'core',
'Datetime Timer',
'Fires once at a specific date and time',
true,
'{
"type": "object",
"properties": {
"fire_at": {
"type": "string",
"format": "date-time",
"description": "ISO 8601 timestamp when the timer should fire"
}
},
"required": ["fire_at"]
}'::jsonb,
'{
"type": "object",
"properties": {
"type": {"type": "string", "const": "one_shot"},
"fire_at": {"type": "string", "format": "date-time"},
"fired_at": {"type": "string", "format": "date-time"}
}
}'::jsonb
)
ON CONFLICT (ref) DO UPDATE SET
label = EXCLUDED.label,
description = EXCLUDED.description,
param_schema = EXCLUDED.param_schema,
out_schema = EXCLUDED.out_schema,
updated = NOW()
RETURNING id INTO v_datetimetimer_id;
-- Create actions
-- Echo action
INSERT INTO attune.action (
ref,
pack,
pack_ref,
label,
description,
entrypoint,
runtime,
param_schema,
out_schema
)
VALUES (
'core.echo',
v_pack_id,
'core',
'Echo',
'Echo a message to stdout',
'echo "${message}"',
v_action_runtime_id,
jsonb_build_object(
'type', 'object',
'properties', jsonb_build_object(
'message', jsonb_build_object(
'type', 'string',
'description', 'Message to echo',
'default', 'Hello World'
)
),
'required', jsonb_build_array('message')
),
jsonb_build_object(
'type', 'object',
'properties', jsonb_build_object(
'stdout', jsonb_build_object('type', 'string'),
'stderr', jsonb_build_object('type', 'string'),
'exit_code', jsonb_build_object('type', 'integer')
)
)
)
ON CONFLICT (ref) DO UPDATE SET
label = EXCLUDED.label,
description = EXCLUDED.description,
entrypoint = EXCLUDED.entrypoint,
param_schema = EXCLUDED.param_schema,
out_schema = EXCLUDED.out_schema,
updated = NOW()
RETURNING id INTO v_echo_action_id;
-- Sleep action
INSERT INTO attune.action (
ref,
pack,
pack_ref,
label,
description,
entrypoint,
runtime,
param_schema,
out_schema
)
VALUES (
'core.sleep',
v_pack_id,
'core',
'Sleep',
'Sleep for a specified number of seconds',
'sleep ${seconds}',
v_action_runtime_id,
jsonb_build_object(
'type', 'object',
'properties', jsonb_build_object(
'seconds', jsonb_build_object(
'type', 'integer',
'description', 'Number of seconds to sleep',
'default', 1,
'minimum', 0
)
),
'required', jsonb_build_array('seconds')
),
jsonb_build_object(
'type', 'object',
'properties', jsonb_build_object(
'exit_code', jsonb_build_object('type', 'integer')
)
)
)
ON CONFLICT (ref) DO UPDATE SET
label = EXCLUDED.label,
description = EXCLUDED.description,
entrypoint = EXCLUDED.entrypoint,
param_schema = EXCLUDED.param_schema,
out_schema = EXCLUDED.out_schema,
updated = NOW();
-- Noop (no operation) action
INSERT INTO attune.action (
ref,
pack,
pack_ref,
label,
description,
entrypoint,
runtime,
param_schema,
out_schema
)
VALUES (
'core.noop',
v_pack_id,
'core',
'No Operation',
'Does nothing - useful for testing',
'exit 0',
v_action_runtime_id,
jsonb_build_object(
'type', 'object',
'properties', jsonb_build_object()
),
jsonb_build_object(
'type', 'object',
'properties', jsonb_build_object(
'exit_code', jsonb_build_object('type', 'integer')
)
)
)
ON CONFLICT (ref) DO UPDATE SET
label = EXCLUDED.label,
description = EXCLUDED.description,
entrypoint = EXCLUDED.entrypoint,
param_schema = EXCLUDED.param_schema,
out_schema = EXCLUDED.out_schema,
updated = NOW();
-- Create example sensor: 10-second interval timer
INSERT INTO attune.sensor (
ref,
pack,
pack_ref,
label,
description,
entrypoint,
runtime,
runtime_ref,
trigger,
trigger_ref,
enabled,
config
)
VALUES (
'core.timer_10s_sensor',
v_pack_id,
'core',
'10 Second Timer Sensor',
'Timer sensor that fires every 10 seconds',
'attune-core-timer-sensor',
v_sensor_runtime_id,
'core.native',
v_intervaltimer_id,
'core.intervaltimer',
true,
'{"unit": "seconds", "interval": 10}'::jsonb
)
ON CONFLICT (ref) DO UPDATE SET
label = EXCLUDED.label,
description = EXCLUDED.description,
config = EXCLUDED.config,
updated = NOW()
RETURNING id INTO v_sensor_10s_id;
-- Create example rule: 10-second timer triggers echo action with "hello, world"
INSERT INTO attune.rule (
ref,
pack,
pack_ref,
label,
description,
action,
action_ref,
trigger,
trigger_ref,
conditions,
action_params,
enabled
)
VALUES (
'core.rule.timer_10s_echo',
v_pack_id,
'core',
'Echo Hello World Every 10 Seconds',
'Example rule that echoes "hello, world" every 10 seconds',
v_echo_action_id,
'core.echo',
v_intervaltimer_id,
'core.intervaltimer',
jsonb_build_object(), -- No conditions
jsonb_build_object(
'message', 'hello, world'
),
true
)
ON CONFLICT (ref) DO UPDATE SET
label = EXCLUDED.label,
description = EXCLUDED.description,
action_params = EXCLUDED.action_params,
updated = NOW();
RAISE NOTICE 'Core pack seeded successfully';
RAISE NOTICE 'Pack ID: %', v_pack_id;
RAISE NOTICE 'Action Runtime ID: %', v_action_runtime_id;
RAISE NOTICE 'Sensor Runtime ID: %', v_sensor_runtime_id;
RAISE NOTICE 'Trigger Types: intervaltimer=%, crontimer=%, datetimetimer=%', v_intervaltimer_id, v_crontimer_id, v_datetimetimer_id;
RAISE NOTICE 'Actions: core.echo, core.sleep, core.noop';
RAISE NOTICE 'Sensors: core.timer_10s_sensor (id=%)', v_sensor_10s_id;
RAISE NOTICE 'Rules: core.rule.timer_10s_echo';
END $$;