CREATE TABLE resources ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), space_id uuid NOT NULL REFERENCES spaces(id) ON DELETE CASCADE, slug text NOT NULL, name text NOT NULL, runtime_type text NOT NULL CHECK (runtime_type IN ('lxc','vm','docker','bare-metal')), host text, url text, version text, status text NOT NULL DEFAULT 'unknown' CHECK (status IN ('running','stopped','down','unknown')), monitoring jsonb NOT NULL DEFAULT '{}'::jsonb, metadata jsonb NOT NULL DEFAULT '{}'::jsonb, last_check timestamptz, maintenance_until timestamptz, created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now(), UNIQUE (space_id, slug) ); CREATE TABLE resource_dependencies ( resource_id uuid NOT NULL REFERENCES resources(id) ON DELETE CASCADE, depends_on uuid NOT NULL REFERENCES resources(id) ON DELETE CASCADE, kind text, PRIMARY KEY (resource_id, depends_on), CHECK (resource_id <> depends_on) ); CREATE TABLE resource_credentials ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), resource_id uuid NOT NULL REFERENCES resources(id) ON DELETE CASCADE, label text NOT NULL, vault_path text NOT NULL, kind text, notes text, created_at timestamptz NOT NULL DEFAULT now() ); CREATE TABLE source_docs ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), resource_id uuid REFERENCES resources(id) ON DELETE CASCADE, name text NOT NULL, upstream_url text NOT NULL, version text, format text, sync_source text, local_path text, body_text text, embedding vector(1024), last_synced timestamptz, metadata jsonb NOT NULL DEFAULT '{}'::jsonb, created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now() ); CREATE INDEX idx_resources_space ON resources(space_id); CREATE INDEX idx_source_docs_resource ON source_docs(resource_id); CREATE INDEX idx_source_docs_fts ON source_docs USING GIN (to_tsvector('english', coalesce(body_text,''))); CREATE INDEX idx_source_docs_embed ON source_docs USING hnsw (embedding vector_cosine_ops);