Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
6796aa5
feat(platform): add multi-tenancy and teams support
larryro Jan 16, 2026
94339ac
chore: optimize Docker build and add Linux native deps
larryro Jan 16, 2026
7023c65
fix(review): use correct ptw command for pytest-watch
larryro Jan 16, 2026
f62007d
fix(review): show toast when files exceed size limit during upload
larryro Jan 16, 2026
f713637
fix(review): add keyboard accessibility to upload area
larryro Jan 16, 2026
fc7579c
fix(review): convert RetryButton from nested function to JSX variable
larryro Jan 16, 2026
3af2586
fix(review): associate labels with checkbox inputs for a11y
larryro Jan 16, 2026
b50720d
fix(review): replace non-English example text with English
larryro Jan 16, 2026
8da5938
fix(review): require userId when updating teamTags
larryro Jan 16, 2026
1413f00
fix(review): guard resolveTeams against undefined/null input
larryro Jan 16, 2026
a34e5d0
fix(review): add authorization checks to team member operations
larryro Jan 16, 2026
392756f
fix(review): remove PII logging in trusted headers auth
larryro Jan 16, 2026
808f7c0
fix(review): fix Promise resolution detection in concurrent test
larryro Jan 16, 2026
d8ba244
fix(review): use getStatusLabel for consistent stale status label
larryro Jan 16, 2026
183b28c
fix(review): add window resize listener for minimap breakpoint
larryro Jan 16, 2026
8812b25
fix(review): implement cursor-based pagination for team memberships
larryro Jan 16, 2026
af3128c
fix(review): add model validators to enforce tenant scoping
larryro Jan 16, 2026
bb5dbd9
fix(review): use type guard instead of non-null assertion for identityId
larryro Jan 16, 2026
17a2074
fix(review): handle files without extension in getExtension
larryro Jan 16, 2026
3430dce
fix(review): add ref guard to prevent double-click duplicate reindex
larryro Jan 16, 2026
9d12878
fix(review): add onSuccess callback to DocumentUploadDialog
larryro Jan 16, 2026
921590e
fix(review): complete error message for deleteFileFailed
larryro Jan 16, 2026
92253a3
fix(review): add runtime validation for trusted auth data
larryro Jan 16, 2026
2f8c5eb
fix(review): improve dev-tools.sh script
larryro Jan 16, 2026
b65606a
fix(review): trim whitespace in Zod schema for team name validation
larryro Jan 16, 2026
2beabe4
fix(review): clarify docstring about parallel queries
larryro Jan 16, 2026
3d5ce14
fix(review): make dialog mounting consistent for Radix UI animations
larryro Jan 16, 2026
7994864
fix(review): conditionally render DocumentUploadDialog for proper laz…
larryro Jan 16, 2026
fb9c6a7
fix(review): stabilize schema memoization with extracted translation
larryro Jan 16, 2026
4f1075d
fix(review): add loading state to prevent double-submission in TeamDe…
larryro Jan 16, 2026
8d87fd1
fix(review): skip orgMembers query when dialog closed and optimize me…
larryro Jan 16, 2026
94b62d7
fix(review): add composite index for teamMember lookups (teamId, userId)
larryro Jan 16, 2026
52090d5
fix(review): handle string input in litellm aembedding patch
larryro Jan 16, 2026
268cf01
fix(review): remove dead code checking for user in add_kwargs
larryro Jan 16, 2026
d4b7fe5
fix(review): add await to FalkorDB is_empty query and validate DB URL
larryro Jan 16, 2026
c83de1c
fix(review): update comment to reflect FalkorDB instead of Neo4j
larryro Jan 16, 2026
6705ceb
fix(review): add build-system section to pyproject.toml
larryro Jan 16, 2026
f19bf06
fix(review): remove unused kuzu dependency from graph-db
larryro Jan 16, 2026
eb829e6
fix(review): add explicit auth validation for createdBy tracking
larryro Jan 16, 2026
601d7db
fix(review): use consistent nullish coalescing for trustedRole/truste…
larryro Jan 16, 2026
afcef48
fix(review): pin cognee-community-hybrid-adapter-falkor version
larryro Jan 16, 2026
5ce5615
feat(onedrive): add team tag support for imported documents
larryro Jan 16, 2026
434849a
fix(platform): include devDependencies in Docker build for TypeScript
larryro Jan 16, 2026
3b703bb
fix(platform): move NODE_ENV=production after npm install in Dockerfile
larryro Jan 16, 2026
23610c3
fix(platform): improve document name display in team tags dialog
larryro Jan 17, 2026
ecd998d
fix(platform): display filename only in document table
larryro Jan 17, 2026
58b6e33
fix(rag): improve logging, error handling, and file validation
larryro Jan 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,14 @@ coverage/
*.tmp
*.temp
.cache/

# ============================================================================
# Storybook
# ============================================================================
# Development-only UI component documentation
.storybook/
services/platform/.storybook/
**/*.stories.tsx
**/*.stories.ts
**/*.stories.jsx
**/*.stories.js
storybook-static/
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,13 +119,15 @@ TRUSTED_HEADERS_ENABLED=true
TRUSTED_EMAIL_HEADER=X-Auth-Email # optional, default shown
TRUSTED_NAME_HEADER=X-Auth-Name # optional, default shown
TRUSTED_ROLE_HEADER=X-Auth-Role # optional, default shown
TRUSTED_TEAMS_HEADER=X-Auth-Teams # optional, default shown
```

Your proxy must send these headers with every request:

- `X-Auth-Email`: User's email address
- `X-Auth-Name`: User's display name
- `X-Auth-Role`: One of `admin`, `developer`, `editor`, or `member`
- `X-Auth-Teams` (optional): Comma-separated list of teams in `id:name` format (e.g., `abc123:Engineering, def456:Design`). The external IdP is the single source of truth - team IDs are passed through directly without any internal database lookup. Omit the header to leave teams unchanged, send empty to remove from all teams.

⚠️ **Security**: Only enable this when Tale is behind a trusted proxy that strips these headers from external requests.

Expand Down
2 changes: 1 addition & 1 deletion compose.blue.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ services:
environment:
- RAG_CHUNK_SIZE=512
- RAG_CHUNK_OVERLAP=50
# Disable cognee multi-user access control mode (required for kuzu-remote)
# Disable cognee multi-user access control mode
- ENABLE_BACKEND_ACCESS_CONTROL=false

restart: unless-stopped
Expand Down
2 changes: 1 addition & 1 deletion compose.green.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ services:
environment:
- RAG_CHUNK_SIZE=512
- RAG_CHUNK_OVERLAP=50
# Disable cognee multi-user access control mode (required for kuzu-remote)
# Disable cognee multi-user access control mode
- ENABLE_BACKEND_ACCESS_CONTROL=false

restart: unless-stopped
Expand Down
112 changes: 58 additions & 54 deletions compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -90,45 +90,53 @@ services:
- internal

# ============================================================================
# Tale Graph DB (Kuzu)
# Tale Crawler (Crawl4AI)
# ============================================================================
# Stateful service - Kuzu requires exclusive file lock, cannot run two instances
graph-db:
# Stateless service - no container_name for blue-green deployment
crawler:
# Image from GHCR (used when PULL_POLICY=always)
image: ghcr.io/tale-project/tale/tale-graph-db:${VERSION:-latest}
image: ghcr.io/tale-project/tale/tale-crawler:${VERSION:-latest}
# Pull policy: 'build' for local dev, 'always' for production
pull_policy: ${PULL_POLICY:-build}
# Build from local Dockerfile (used when PULL_POLICY=build)
# Build configuration (used when PULL_POLICY=build)
build:
context: ./services/graph-db
dockerfile: Dockerfile
context: .
dockerfile: services/crawler/Dockerfile
args:
VERSION: ${VERSION:-dev}

# Container name - stateful service like db
container_name: tale-graph-db

# No port mapping needed - only accessed by other services (rag)
# internally via http://graph-db:8000
# Port mapping: host:container (for development)
# Access Crawler API at localhost:8002
ports:
- '8002:8002'

# Volume mounts
# Persist graph database data
volumes:
- graph-db-data:/data
# Environment file
# Create a .env file in the project root with your configuration
env_file:
- .env

# Restart policy
# Automatically restart the container if it crashes
restart: unless-stopped

# Health check - optimized for faster blue-green deployment
# Docker will check if the service is healthy
# Note: Using Python since curl is not available in python:3.11-slim
healthcheck:
test: ['CMD', 'python', '-c', 'import urllib.request; urllib.request.urlopen("http://localhost:8000/health")']
test: ['CMD', 'curl', '-f', 'http://localhost:8002/health']
interval: 5s
timeout: 3s
retries: 2
start_period: 10s
start_period: 40s

# Resource limits (optional, adjust based on your needs)
# deploy:
# resources:
# limits:
# cpus: '2'
# memory: 4G
# reservations:
# cpus: '1'
# memory: 2G

# Logging configuration
logging:
Expand All @@ -142,53 +150,52 @@ services:
- internal

# ============================================================================
# Tale Crawler (Crawl4AI)
# Tale Graph DB (FalkorDB)
# ============================================================================
# Stateless service - no container_name for blue-green deployment
crawler:
# Redis-based graph database optimized for GraphRAG
# - Native multi-tenant support (10K+ graphs per instance)
# - Low latency (~140ms p99)
# - Client-server architecture (no file-level locking issues)
# - Combined graph and vector storage via hybrid adapter
# Replaces embedded Kuzu (archived) and LanceDB
graph-db:
# Image from GHCR (used when PULL_POLICY=always)
image: ghcr.io/tale-project/tale/tale-crawler:${VERSION:-latest}
image: ghcr.io/tale-project/tale/tale-graph-db:${VERSION:-latest}
# Pull policy: 'build' for local dev, 'always' for production
pull_policy: ${PULL_POLICY:-build}
# Build configuration (used when PULL_POLICY=build)
build:
context: .
dockerfile: services/crawler/Dockerfile
dockerfile: services/graph-db/Dockerfile
args:
VERSION: ${VERSION:-dev}

# Port mapping: host:container (for development)
# Access Crawler API at localhost:8002
# Port mapping: host:container
# Access FalkorDB at localhost:6379 (Redis protocol)
# Access FalkorDB Browser UI at localhost:6380 (mapped from internal 3000)
ports:
- '8002:8002'
- '6379:6379'
- '6380:3000'

# Volume mounts
# Persist graph and vector data
# FalkorDB stores data in /var/lib/falkordb/data (not /data)
volumes:
- graph-db-data:/var/lib/falkordb/data

# Environment file
# Create a .env file in the project root with your configuration
env_file:
- .env

# Restart policy
# Automatically restart the container if it crashes
restart: unless-stopped

# Health check - optimized for faster blue-green deployment
# Docker will check if the service is healthy
# Health check
healthcheck:
test: ['CMD', 'curl', '-f', 'http://localhost:8002/health']
interval: 5s
timeout: 3s
retries: 2
start_period: 40s

# Resource limits (optional, adjust based on your needs)
# deploy:
# resources:
# limits:
# cpus: '2'
# memory: 4G
# reservations:
# cpus: '1'
# memory: 2G
test: ['CMD', 'redis-cli', 'ping']
interval: 10s
timeout: 5s
retries: 3

# Logging configuration
logging:
Expand Down Expand Up @@ -239,8 +246,6 @@ services:
# Smaller chunks (512) reduce LLM output size for knowledge graph extraction
- RAG_CHUNK_SIZE=512
- RAG_CHUNK_OVERLAP=50
# Disable cognee multi-user access control mode (required for kuzu-remote)
- ENABLE_BACKEND_ACCESS_CONTROL=false

# Restart policy
# Automatically restart the container if it crashes
Expand All @@ -256,7 +261,7 @@ services:
start_period: 40s

# Dependencies
# Wait for database and graph DB to be ready
# Wait for database and graph-db (FalkorDB) to be ready
depends_on:
- db
- graph-db
Expand Down Expand Up @@ -342,7 +347,6 @@ services:
# Wait for backend services to be ready
depends_on:
- db
- graph-db
- rag
- crawler
- search
Expand Down Expand Up @@ -539,12 +543,12 @@ volumes:
db-backup:
driver: local

# Persistent storage for graph database data (Kuzu)
graph-db-data:
# Persistent storage for RAG service data (temp files, document processing)
rag-data:
driver: local

# Persistent storage for RAG service data
rag-data:
# Persistent storage for graph-db (FalkorDB graph + vector data)
graph-db-data:
driver: local

# Persistent storage for Platform Convex local backend
Expand Down
Loading
Loading