CREATE TABLE IF NOT EXISTS workbench_balances ( tenant_id bigint NOT NULL, user_id varchar(36) NOT NULL, balance bigint NOT NULL DEFAULT 0, reserved bigint NOT NULL DEFAULT 0 CHECK (reserved >= 0), updated_at timestamptz NOT NULL DEFAULT now(), PRIMARY KEY (tenant_id,user_id) ); CREATE TABLE IF NOT EXISTS workbench_transactions ( id varchar(36) PRIMARY KEY, tenant_id bigint NOT NULL, user_id varchar(36) NOT NULL, delta bigint NOT NULL, kind varchar(32) NOT NULL, reason text NOT NULL DEFAULT '', actor_id varchar(36) NOT NULL DEFAULT '', idempotency_key varchar(180) NOT NULL, metadata jsonb NOT NULL DEFAULT '{}', created_at timestamptz NOT NULL DEFAULT now(), UNIQUE(tenant_id,idempotency_key) ); CREATE INDEX IF NOT EXISTS wb_transactions_owner ON workbench_transactions(tenant_id,user_id,created_at DESC); CREATE TABLE IF NOT EXISTS workbench_usage ( id varchar(36) PRIMARY KEY, tenant_id bigint NOT NULL, owner_id varchar(36) NOT NULL, job_id varchar(64) NOT NULL DEFAULT '', call_id varchar(64) NOT NULL, agent_id varchar(64) NOT NULL DEFAULT '', model_id varchar(64) NOT NULL DEFAULT '', action varchar(100) NOT NULL DEFAULT '', input_tokens bigint NOT NULL DEFAULT 0, output_tokens bigint NOT NULL DEFAULT 0, points bigint NOT NULL DEFAULT 0, status varchar(32) NOT NULL DEFAULT '', metadata jsonb NOT NULL DEFAULT '{}', created_at timestamptz NOT NULL DEFAULT now(), UNIQUE(tenant_id,call_id) ); CREATE INDEX IF NOT EXISTS wb_usage_owner ON workbench_usage(tenant_id,owner_id,created_at DESC); CREATE TABLE IF NOT EXISTS workbench_balance_holds ( id varchar(36) PRIMARY KEY, tenant_id bigint NOT NULL, user_id varchar(36) NOT NULL, amount bigint NOT NULL CHECK(amount >= 0), status varchar(20) NOT NULL DEFAULT 'reserved', expires_at timestamptz NOT NULL, created_at timestamptz NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS wb_holds_expiry ON workbench_balance_holds(status,expires_at); CREATE TABLE IF NOT EXISTS workbench_consumption ( id varchar(36) PRIMARY KEY, tenant_id bigint NOT NULL, owner_id varchar(36) NOT NULL, agent_id varchar(64) NOT NULL, kb_id varchar(64) NOT NULL, chunk_id varchar(200) NOT NULL, knowledge_id varchar(64) NOT NULL DEFAULT '', file_name text NOT NULL DEFAULT '', category text NOT NULL DEFAULT '', excerpt text NOT NULL DEFAULT '', resource_id varchar(64) NOT NULL DEFAULT '', segment_id varchar(64) NOT NULL DEFAULT '', job_id varchar(64) NOT NULL DEFAULT '', status varchar(32) NOT NULL DEFAULT 'open', banned boolean NOT NULL DEFAULT false, lease_until timestamptz, created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now(), UNIQUE(tenant_id,owner_id,agent_id,kb_id,chunk_id) ); CREATE INDEX IF NOT EXISTS wb_consumption_owner ON workbench_consumption(tenant_id,owner_id,kb_id,status); CREATE INDEX IF NOT EXISTS wb_consumption_job ON workbench_consumption(job_id,status); CREATE TABLE IF NOT EXISTS workbench_operation_logs ( id varchar(36) PRIMARY KEY, tenant_id bigint NOT NULL, owner_id varchar(36) NOT NULL DEFAULT '', owner_name text NOT NULL DEFAULT '', kind varchar(32) NOT NULL, level varchar(20) NOT NULL, action text NOT NULL DEFAULT '', message text NOT NULL DEFAULT '', resource_id text NOT NULL DEFAULT '', trace_id varchar(100) NOT NULL DEFAULT '', status integer NOT NULL DEFAULT 0, metadata jsonb NOT NULL DEFAULT '{}', created_at timestamptz NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS wb_logs_scope ON workbench_operation_logs(tenant_id,kind,created_at DESC); CREATE TABLE IF NOT EXISTS workbench_pending_memories ( id varchar(36) PRIMARY KEY, tenant_id bigint NOT NULL, owner_id varchar(36) NOT NULL, agent_id varchar(64) NOT NULL DEFAULT '', content text NOT NULL, source_ref text NOT NULL DEFAULT '', status varchar(32) NOT NULL DEFAULT 'pending', reviewed_by varchar(36) NOT NULL DEFAULT '', created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS wb_memories_scope ON workbench_pending_memories(tenant_id,owner_id,agent_id,status); CREATE TABLE IF NOT EXISTS workbench_history ( id varchar(36) PRIMARY KEY, tenant_id bigint NOT NULL, owner_id varchar(36) NOT NULL DEFAULT '', source_kind varchar(64) NOT NULL, source_id varchar(100) NOT NULL, payload jsonb NOT NULL, created_at timestamptz NOT NULL DEFAULT now(), UNIQUE(tenant_id,source_kind,source_id) );