feat: Phase 2 tenant isolation — RLS on 11 session tables #134

Merged
chihlasm merged 16 commits from feat/tenant-isolation-phase-2 into main 2026-04-11 07:02:25 +00:00
4 changed files with 10 additions and 4 deletions
Showing only changes of commit bd29f590a2 - Show all commits

View File

@@ -196,6 +196,7 @@ async def start_session(
new_session = Session( new_session = Session(
tree_id=tree.id, tree_id=tree.id,
user_id=current_user.id, user_id=current_user.id,
account_id=current_user.account_id,
tree_snapshot=tree_snapshot, tree_snapshot=tree_snapshot,
path_taken=[], path_taken=[],
decisions=[], decisions=[],
@@ -693,6 +694,7 @@ async def prepare_session(
new_session = Session( new_session = Session(
tree_id=tree.id, tree_id=tree.id,
user_id=data.assigned_to_id or current_user.id, user_id=data.assigned_to_id or current_user.id,
account_id=current_user.account_id,
tree_snapshot=tree_snapshot, tree_snapshot=tree_snapshot,
path_taken=[], path_taken=[],
decisions=[], decisions=[],
@@ -770,6 +772,7 @@ async def batch_launch_sessions(
session = Session( session = Session(
tree_id=tree.id, tree_id=tree.id,
user_id=current_user.id, user_id=current_user.id,
account_id=current_user.account_id,
tree_snapshot=tree_snapshot, tree_snapshot=tree_snapshot,
path_taken=[], path_taken=[],
decisions=[], decisions=[],

View File

@@ -57,6 +57,7 @@ function loadTaskState(sessionId: string): TaskResponse[] | null {
} catch { return null } } catch { return null }
} }
// eslint-disable-next-line react-refresh/only-export-components
export function clearTaskState(sessionId: string) { export function clearTaskState(sessionId: string) {
try { sessionStorage.removeItem(`${TASK_LANE_STORAGE_KEY}:${sessionId}`) } catch { /* ignore */ } try { sessionStorage.removeItem(`${TASK_LANE_STORAGE_KEY}:${sessionId}`) } catch { /* ignore */ }
} }

View File

@@ -9,10 +9,10 @@ export function TeamSummary() {
const { isAccountOwner } = usePermissions() const { isAccountOwner } = usePermissions()
const navigate = useNavigate() const navigate = useNavigate()
const [escalationCount, setEscalationCount] = useState(0) const [escalationCount, setEscalationCount] = useState(0)
const [loading, setLoading] = useState(true) const [loading, setLoading] = useState(!!isAccountOwner)
useEffect(() => { useEffect(() => {
if (!isAccountOwner) { setLoading(false); return } if (!isAccountOwner) return
aiSessionsApi.getEscalationQueue() aiSessionsApi.getEscalationQueue()
.then((esc) => setEscalationCount(esc.length)) .then((esc) => setEscalationCount(esc.length))
.catch(() => {}) .catch(() => {})

View File

@@ -1,4 +1,4 @@
import { useCallback, useRef } from 'react' import { useCallback, useEffect, useRef } from 'react'
import Editor, { type BeforeMount } from '@monaco-editor/react' import Editor, { type BeforeMount } from '@monaco-editor/react'
import { resolutionFlowTheme, THEME_ID } from '@/components/tree-editor/code-mode/resolutionFlowTheme' import { resolutionFlowTheme, THEME_ID } from '@/components/tree-editor/code-mode/resolutionFlowTheme'
import { Spinner } from '@/components/common/Spinner' import { Spinner } from '@/components/common/Spinner'
@@ -11,7 +11,9 @@ interface Props {
export function ScriptBodyEditor({ value, onChange, disabled }: Props) { export function ScriptBodyEditor({ value, onChange, disabled }: Props) {
const lastValueRef = useRef(value) const lastValueRef = useRef(value)
lastValueRef.current = value useEffect(() => {
lastValueRef.current = value
}, [value])
const handleBeforeMount: BeforeMount = useCallback((monaco) => { const handleBeforeMount: BeforeMount = useCallback((monaco) => {
// Register our dark theme if not already defined // Register our dark theme if not already defined