-- Fleet: user-connected local-hardware nodes. Each node runs the clawmates-node -- daemon, which dials home over an outbound control channel to report host health -- and accept workload-placement commands. (Phase 2 of the multi-node node-pool; -- agent_containers.node_id references the chosen node, 'local' by default.) CREATE TABLE nodes ( id UUID PRIMARY KEY, workspace_id UUID NOT NULL REFERENCES workspaces (id) ON DELETE CASCADE, name TEXT NOT NULL, status TEXT NOT NULL DEFAULT 'pending', -- pending | online | offline | draining token TEXT NOT NULL UNIQUE, -- shared secret the daemon presents on the channel agent_version TEXT, tailscale_ip TEXT, last_seen TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX nodes_workspace_idx ON nodes (workspace_id); -- Latest host-health snapshot per node (upserted by the daemon heartbeat). CREATE TABLE node_health ( node_id UUID PRIMARY KEY REFERENCES nodes (id) ON DELETE CASCADE, captured_at TIMESTAMPTZ NOT NULL DEFAULT now(), cpu_pct DOUBLE PRECISION NOT NULL DEFAULT 0, -- 0..100 mem_total BIGINT NOT NULL DEFAULT 0, -- bytes mem_used BIGINT NOT NULL DEFAULT 0, mem_pressure DOUBLE PRECISION NOT NULL DEFAULT 0, -- 0..1 (used/total, or PSI if available) swap_used BIGINT NOT NULL DEFAULT 0, disk_total BIGINT NOT NULL DEFAULT 0, disk_free BIGINT NOT NULL DEFAULT 0, load1 DOUBLE PRECISION NOT NULL DEFAULT 0, load5 DOUBLE PRECISION NOT NULL DEFAULT 0, load15 DOUBLE PRECISION NOT NULL DEFAULT 0, container_count INTEGER NOT NULL DEFAULT 0 ); -- Placement lookups (which containers run on which node, per workspace). CREATE INDEX agent_containers_node_idx ON agent_containers (node_id, workspace_id);