-- ============================================ -- Virtual Foreman — Supabase schema (DELTA) -- Apply via Supabase SQL editor (read README.md first) -- ============================================ -- -- The host project already ships with these tables (do NOT drop): -- public.projects — owned by an earlier deployment; columns -- are: name, contract_number, client, -- tech_supervisor, contractor, -- responsible_foreman, chief_engineer, -- id, created_at -- public.workflow_history — used by an n8n workflow; keep as-is -- -- This file only ADDS the table that Virtual Foreman needs and is -- idempotent (safe to re-run). -- Inference history: one row per /work/infer call. create table if not exists inference_history ( id uuid primary key default gen_random_uuid(), -- project_id is left unconstrained because the host project's -- `projects` table uses different columns; valid UUIDs are accepted -- even when the foreign-table link is broken. project_id uuid, request_id text not null, source_text text, payload jsonb not null, model_used text, created_at timestamptz not null default now() ); create index if not exists idx_inference_history_created_at on inference_history(created_at desc); create index if not exists idx_inference_history_project_id on inference_history(project_id); alter table inference_history enable row level security; drop policy if exists "service_role_all_inference_history" on inference_history; create policy "service_role_all_inference_history" on inference_history for all using (true) with check (true); comment on table inference_history is 'Virtual Foreman: audit trail of /work/infer responses'; -- ============================================ -- Project-document ingestion (Phase 2) -- Persists the uploaded PDF + per-page extracted text so a VLM call -- can later reference its sibling pages as context. -- ============================================ create table if not exists blueprint_uploads ( id uuid primary key default gen_random_uuid(), project_id uuid, file_name text not null, storage_path text, -- relative path under /uploads / bucket sha256 text not null, page_count int, has_native_text bool default true, mime_type text not null, status text default 'uploaded', created_at timestamptz not null default now() ); create index if not exists idx_blueprint_uploads_project on blueprint_uploads(project_id); create index if not exists idx_blueprint_uploads_created_at on blueprint_uploads(created_at desc); alter table blueprint_uploads enable row level security; drop policy if exists "service_role_all_blueprint_uploads" on blueprint_uploads; create policy "service_role_all_blueprint_uploads" on blueprint_uploads for all using (true) with check (true); comment on table blueprint_uploads is 'Virtual Foreman: stored upload artefacts (PDF/JPG/HEIC)'; create table if not exists blueprint_pages ( id uuid primary key default gen_random_uuid(), upload_id uuid not null references blueprint_uploads(id) on delete cascade, page_no int not null, text text, -- full extracted text (native or empty) stamp text, -- e.g. 'АР-1', 'КЖ-3' title_guess text, -- first non-trivial line / stamp label char_count int default 0, -- to spot light vs text-heavy pages created_at timestamptz not null default now(), unique(upload_id, page_no) ); create index if not exists idx_blueprint_pages_upload on blueprint_pages(upload_id, page_no); alter table blueprint_pages enable row level security; drop policy if exists "service_role_all_blueprint_pages" on blueprint_pages; create policy "service_role_all_blueprint_pages" on blueprint_pages for all using (true) with check (true); comment on table blueprint_pages is 'Virtual Foreman: per-page extracted text + stamp heuristics';