Bast AI Platform Architecture¶
Document Purpose¶
This document defines the complete platform architecture for Bast AI, covering the service hierarchy from Environment to Organization to CAT, including infrastructure setup, UI integration, and operational workflows.
Table of Contents¶
- Service Hierarchy Overview
- Environment Layer (ENV)
- Organization Layer (ORG)
- CAT Layer
- User Roles and Access
- Infrastructure on DuploCloud/AWS
- Data Architecture (HIPAA/SOC2)
- UI Integration Flows
- Service Creation Workflows
- Monitoring and Observability
- Compliance Requirements
Service Hierarchy Overview¶
Three-Tier Service Model¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ENVIRONMENT (ENV) β
β One deployment environment (dev, demo, prod) β
β Contains: Shared infrastructure, UI services, platform services β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β ORGANIZATION (ORG/Tenant) β β
β β One per customer/organization β β
β β Contains: org-services, org data, org configurations β β
β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β CAT β β β
β β β One per use case within an org β β β
β β β Contains: cat-runtime, CAT OS, Knowledge Domains, Agent Pool β β β
β β β β β β
β β β Components: β β β
β β β - 1 CAT OS (execution ontology) β β β
β β β - N Knowledge Domains β β β
β β β - 1 Agent Pool β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Cardinality Summary¶
| Parent | Child | Relationship |
|---|---|---|
| ENV | ORG | 1 : N (one env has many orgs) |
| ORG | CAT | 1 : N (one org has many CATs) |
| ORG | CAT OS | 1 : N (one org has many CAT OSs) |
| ORG | Knowledge Domain | 1 : N (one org has many knowledge domains) |
| ORG | Agent Pool | 1 : N (one org has many agent pools) |
| CAT | CAT OS | 1 : 1 (one CAT uses one CAT OS) |
| CAT | Knowledge Domain | 1 : N (one CAT uses many knowledge domains) |
| CAT | Agent Pool | 1 : 1 (one CAT uses one agent pool) |
Environment Layer (ENV)¶
Definition¶
An Environment is a complete deployment of the Bast AI platform, isolated from other environments. Each environment contains shared infrastructure and services that support multiple organizations.
Environment Types¶
| Environment | Purpose | Branch | Stability | Infrastructure |
|---|---|---|---|---|
| dev | Development, testing | dev |
May be unstable | dev-shared |
| demo | Customer demos, UAT | main |
Should be stable | demo-shared |
| prod | Production workloads | main (tagged) |
Must be stable | prod-shared |
DuploCloud Tenant Structure¶
Each environment has a shared tenant for platform services and org-specific tenants for organization services:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DUPLOCLOUD TENANT STRUCTURE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β DEV ENVIRONMENT (Infrastructure: dev-shared) β
β ββββββββββββββββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β SHARED TENANT: dev-shared β β
β β β β
β β Services: β β
β β - dev-admin-ui (Platform Admin, CAT Builder UI) β β
β β - dev-chat-ui (End User Chat UI) β β
β β - dev-bff (Backend-for-Frontend) β β
β β - platform-api (Platform management + Authentication) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βββββββββββββββββΌββββββββββββββββ β
β βΌ βΌ βΌ β
β ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ β
β β ORG TENANT: β β ORG TENANT: β β ORG TENANT: β β
β β dev-bastai β β dev-craigh β β dev-{org} β β
β β β β β β β β
β β - org-services β β - org-services β β - org-services β β
β β - cat-runtime-* β β - cat-runtime-* β β - cat-runtime-* β β
β β - monitoring β β - monitoring β β - monitoring β β
β ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β DEMO ENVIRONMENT (Infrastructure: demo-shared) β
β βββββββββββββββββββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β SHARED TENANT: demo-shared β β
β β β β
β β Services: β β
β β - demo-admin-ui, demo-chat-ui, demo-bff β β
β β - platform-api (includes auth) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βββββββββββββββββΌββββββββββββββββ β
β βΌ βΌ βΌ β
β ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ β
β β demo-bastai β β demo-craigh β β demo-{org} β β
β ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β PROD ENVIRONMENT (Infrastructure: prod-shared) β
β βββββββββββββββββββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β SHARED TENANT: prod-shared β β
β β β β
β β Services: β β
β β - admin-ui, chat-ui, bff β β
β β - platform-api (includes auth) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βββββββββββββββββΌββββββββββββββββ β
β βΌ βΌ βΌ β
β ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ β
β β prod-bastai β β prod-craigh β β prod-{org} β β
β ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Naming Convention¶
| Component | Pattern | Dev Example | Demo Example | Prod Example |
|---|---|---|---|---|
| Infrastructure | {env}-shared | dev-shared | demo-shared | prod-shared |
| Shared Tenant | {env}-shared | dev-shared | demo-shared | prod-shared |
| Org Tenant | {env}-{org} | dev-bastai | demo-bastai | prod-bastai |
| UI Services | {env}-{service} | dev-admin-ui | demo-admin-ui | admin-ui |
Services Per Environment¶
1. Infrastructure Services (AWS)¶
| Service | Purpose | Scope | Count |
|---|---|---|---|
| MongoDB Atlas | Primary database | See Data Architecture | Per org (prod) / Shared (dev) |
| Redis/ElastiCache | Caching, sessions | Per environment | 1 cluster |
| S3 Buckets | Object storage | Per org | 1 per org |
| ECR | Container registry | Per environment | 1 |
| ALB/Ingress | Load balancing | Per tenant | 1+ per tenant |
| Route53 | DNS | Global | 1 hosted zone |
| Secrets Manager | Secrets storage | Per environment | 1 |
Note: MongoDB Atlas architecture follows HIPAA/SOC2 compliance requirements with separate clusters per production org. See Data Architecture for details.
2. Shared Tenant Services ({env}-shared)¶
These services run in the shared tenant and serve all organizations:
| Service | Port | Purpose | Dev Name | Demo Name | Prod Name |
|---|---|---|---|---|---|
| admin-ui | 9090 | Org management, CAT Builder | dev-admin-ui | demo-admin-ui | admin-ui |
| chat-ui | 9090 | End-user chat interface | dev-chat-ui | demo-chat-ui | chat-ui |
| bff | 4000 | Backend-for-Frontend, API gateway | dev-bff | demo-bff | bff |
| platform-api | 8080 | Platform management, org provisioning, authentication | platform-api | platform-api | platform-api |
3. Org Tenant Services ({env}-{org})¶
These services run in each org's dedicated tenant:
| Service | Port | Purpose | Count per Org |
|---|---|---|---|
| org-services | 8080 | Org-level APIs (CAT Builder, Security, Analytics) | 1 |
| cat-runtime-{type} | 9090 | CAT execution runtime | 1 per CAT |
| monitoring | 9100 | Prometheus, Grafana (org-scoped metrics) | 1 |
Environment Architecture Diagram¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DEMO ENVIRONMENT (Infrastructure: demo-shared) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β INFRASTRUCTURE SERVICES (AWS) ββ
β β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ ββ
β β β MongoDB β β Redis β β S3 β β ECR β β Route53 β ββ
β β β (Atlas) β β(Elasti- β β Buckets β β Registry β β DNS β ββ
β β β β β Cache) β β β β β β β ββ
β β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β SHARED TENANT: demo-shared ββ
β β ββ
β β ββββββββββββββ ββββββββββββββ ββββββββββββββ βββββββββββββββββββββββββββββ
β β βdemo-admin- β βdemo-chat- β β demo-bff β β platform-api βββ
β β β ui β β ui β β β β (org mgmt + auth) βββ
β β β :9090 β β :9090 β β :4000 β β :8080 βββ
β β ββββββββββββββ ββββββββββββββ ββββββββββββββ βββββββββββββββββββββββββββββ
β β ββ
β β Routes requests to org tenants based on JWT/org_id ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β
β ββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββ β
β βΌ βΌ βΌ β
β βββββββββββββββββββββββ βββββββββββββββββββββββ βββββββββββββββββββββββ β
β β ORG TENANT: β β ORG TENANT: β β ORG TENANT: β β
β β demo-bastai β β demo-craigh β β demo-{org} β β
β β β β β β β β
β β βββββββββββββββββββ β β βββββββββββββββββββ β β βββββββββββββββββββ β β
β β β org-services β β β β org-services β β β β org-services β β β
β β β :8080 β β β β :8080 β β β β :8080 β β β
β β βββββββββββββββββββ β β βββββββββββββββββββ β β βββββββββββββββββββ β β
β β βββββββββββββββββββ β β βββββββββββββββββββ β β βββββββββββββββββββ β β
β β βcat-runtime- β β β βcat-runtime- β β β βcat-runtime- β β β
β β β advisor :9090 β β β β helper :9090 β β β β {cat} :9090 β β β
β β βcat-runtime- β β β β β β β β β β β
β β β support :9090 β β β β β β β β β β β
β β βββββββββββββββββββ β β βββββββββββββββββββ β β βββββββββββββββββββ β β
β β βββββββββββββββββββ β β βββββββββββββββββββ β β βββββββββββββββββββ β β
β β β monitoring β β β β monitoring β β β β monitoring β β β
β β β :9100 β β β β :9100 β β β β :9100 β β β
β β βββββββββββββββββββ β β βββββββββββββββββββ β β βββββββββββββββββββ β β
β βββββββββββββββββββββββ βββββββββββββββββββββββ βββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Organization Layer (ORG)¶
Definition¶
An Organization (also called Tenant) represents a customer or business unit within an environment. Each organization has isolated data and configurations but shares platform infrastructure.
Services Per Organization¶
| Service | Port | Purpose | Count |
|---|---|---|---|
| org-services | 8080 | Org-level APIs (CAT Builder, Security, Analytics) | 1 per org |
Organization Data Entities¶
| Entity | Description | Storage |
|---|---|---|
| Organization Config | Org settings, branding, features | MongoDB |
| Users | Org users, roles, permissions | MongoDB + Platform API (Auth) |
| CAT OS Configs | Execution ontology definitions | MongoDB |
| Knowledge Domains | Knowledge base configurations | MongoDB + Vector DB |
| Agent Pools | Agent configurations and pools | MongoDB |
| Themes | Visual appearance and branding configurations | MongoDB |
| CATs | CAT configurations | MongoDB |
Organization Infrastructure Model¶
The Platform API stores deployment tracking information for each organization:
OrganizationInDB
βββ infrastructure: InfrastructureConfig
βββ tenant: DuploCloudTenantConfig
β βββ tenant_name: str # e.g., "dev-acme-corp"
β βββ tenant_id: str # DuploCloud UUID
β βββ infrastructure_name: str # e.g., "nonprod" (same as dev-shared)
β βββ plan_id: str # e.g., "dev-shared"
β βββ status: DeploymentStatus # pending, deploying, running, etc.
β
βββ mongodb: MongoDBConfig
β βββ database_name: str # e.g., "acme-corp_data"
β βββ mongodb_uri: str # Connection string
β
βββ org_services: ServiceDeployment # One per org
β βββ service_name: str # DuploCloud service name
β βββ image: str # Docker image
β βββ image_tag: str # Version tag
β βββ status: DeploymentStatus
β βββ replicas: int
β βββ internal_endpoint: str # Internal URL
β βββ env_vars: dict # Non-sensitive env vars
β
βββ cat_runtimes: List[CATRuntimeDeployment] # Multiple per org
βββ cat_id: str # CAT ID
βββ cat_uuid: str # e.g., "PREFIX-ABC123"
βββ service_name: str # DuploCloud service name
βββ image: str # CAT runtime image
βββ status: DeploymentStatus
βββ replicas: int
βββ internal_endpoint: str
Environment Variables for Platform API:
| Variable | Description | Example |
|---|---|---|
PLATFORM_MONGODB_URI |
MongoDB connection string for Platform API | See below |
PORT |
API port (optional, default: 8080) | 8080 |
DUPLO_HOST |
DuploCloud host URL | https://<duplocloud-host> |
DUPLO_TOKEN |
DuploCloud API token | <token> |
Platform MongoDB Connection Strings:
| Environment | Connection String |
|---|---|
| Local Dev | mongodb+srv://<user>:<password>@<cluster>.mongodb.net/bast_platform?retryWrites=true&w=majority |
| Dev | mongodb+srv://<user>:<password>@<cluster>.mongodb.net/bast_platform?retryWrites=true&w=majority |
Note: Database name for Platform API is always
bast_platform.
Environment Variables for org-services:
| Variable | Description | Example |
|---|---|---|
ORG_ID |
Organization ID (MongoDB ObjectId) | 678e5903c5e17b32d40d1234 |
ORG_SLUG |
Organization slug (for DB naming) | acme-corp |
ORG_MONGODB_URI |
MongoDB connection string | mongodb+srv://<user>:<password>@<cluster>.mongodb.net/ |
Database Naming Convention:
| Environment | Database Name | Example |
|---|---|---|
| Dev | {org_slug}_data |
acme-corp_data |
| Demo | {org_slug}_data |
acme-corp_data |
| Prod | {org_slug}_data |
acme-corp_data |
Collections within each org database: cats, cat_os, knowledge_domains, agent_pools, themes
Organization Architecture Diagram¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ORGANIZATION: bastai β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β ORG SERVICES ββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ
β β β org-services β ββ
β β β (ORG_NAME=bastai) β ββ
β β β Port: 8080 β ββ
β β β β ββ
β β β APIs: β ββ
β β β - /api/v1/cat-builder/* (CAT OS, Knowledge, Agent Pools, CATs) β ββ
β β β - /api/v1/security/* (AuthZ, permissions) β ββ
β β β - /api/v1/analytics/* (usage, metrics) β ββ
β β β - /api/v1/org/* (org settings, users) β ββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β ORG CONFIGURATIONS (MongoDB) ββ
β β ββ
β β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ ββ
β β β CAT OS β β Knowledge β β Agent β β CATs β ββ
β β β Configs β β Domains β β Pools β β β ββ
β β β β β β β β β β ββ
β β β - advisor-osβ β - products β β - gpt4-pool β β - advisor β ββ
β β β - support-osβ β - policies β β - claude- β β - support β ββ
β β β - sales-os β β - faqs β β pool β β - sales β ββ
β β β β β - manuals β β β β β ββ
β β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β CAT RUNTIME SERVICES ββ
β β ββ
β β βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ ββ
β β β cat-runtime- β β cat-runtime- β β cat-runtime- β ββ
β β β advisor β β support β β sales β ββ
β β β β β β β β ββ
β β β CAT_TYPE=advisorβ β CAT_TYPE=supportβ β CAT_TYPE=sales β ββ
β β β Port: 9090 β β Port: 9090 β β Port: 9090 β ββ
β β βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β MONITORING (Per-Org) ββ
β β ββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ
β β β Prometheus + Grafana β ββ
β β β Port: 9100 β ββ
β β β β ββ
β β β Metrics: β ββ
β β β - CAT runtime performance β ββ
β β β - org-services API latency β ββ
β β β - Knowledge retrieval metrics β ββ
β β β - Agent pool utilization β ββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
CAT Layer¶
Definition¶
A CAT (Conversational AI Thing) is a specific AI assistant configuration within an organization. Each CAT has its own runtime service and is composed of reusable components (CAT OS, Knowledge Domains, Agent Pool).
CAT Components¶
| Component | Relationship | Purpose |
|---|---|---|
| CAT OS | 1:1 | Execution ontology - defines how the CAT behaves |
| Knowledge Domains | 1:N | Knowledge bases the CAT can access |
| Agent Pool | 1:1 | LLM and agent configurations |
| Theme | 1:1 (optional) | Visual appearance and branding configuration |
CAT Runtime Service¶
Each CAT gets its own cat-runtime service instance:
| Service | Port | Environment Variables |
|---|---|---|
cat-runtime-{cat_type} |
9090 | ORG_NAME, CAT_TYPE, MONGODB_URI, OPENAI_API_KEY, DVC_REGISTRY_URL |
CAT Architecture Diagram¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CAT: advisor β
β ORG: bastai β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β cat-runtime-advisor ββ
β β (Kubernetes Service) ββ
β β ββ
β β Environment: ββ
β β - ORG_NAME=bastai ββ
β β - CAT_TYPE=advisor ββ
β β - MONGODB_URI=mongodb+srv://<user>:<password>@<cluster>.mongodb.net/ ββ
β β - OPENAI_API_KEY=sk-... ββ
β β - DVC_REGISTRY_URL=s3://... ββ
β β ββ
β β Endpoints: ββ
β β - POST /api/v1/cat/chat ββ
β β - GET /api/v1/cat/chat/history ββ
β β - GET /api/v1/cat/chat/conversations ββ
β β - POST /api/v1/feedback/send ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β
β Loads configuration at startup β
β β β
β ββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββ
β β βΌ ββ
β β βββββββββββββββββββ βββββββββββββββββββββββββββββββ βββββββββββββββββββ ββ
β β β CAT OS β β Knowledge Domains β β Agent Pool β ββ
β β β (1:1) β β (1:N) β β (1:1) β ββ
β β β β β β β β ββ
β β β advisor-os β β - products (hybrid search) β β gpt4-pool β ββ
β β β β β - policies (vector) β β β ββ
β β β Defines: β β - faqs (text search) β β Defines: β ββ
β β β - Intents β β β β - Model (GPT-4) β ββ
β β β - Workflows β β Each domain has: β β - Temperature β ββ
β β β - Behaviors β β - Document store β β - Max tokens β ββ
β β β - Guardrails β β - Vector embeddings β β - Fallbacks β ββ
β β β β β - Search config β β β ββ
β β βββββββββββββββββββ βββββββββββββββββββββββββββββββ βββββββββββββββββββ ββ
β β ββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ
β β β Theme (1:1 optional) β ββ
β β β β ββ
β β β advisor-theme β ββ
β β β β ββ
β β β Defines: β ββ
β β β - Colors (primary, secondary, accent, background, text, etc.) β ββ
β β β - Typography (font family) β ββ
β β β - Radius (corner roundness) β ββ
β β β - Shadow depth β ββ
β β β - Button style (filled/outline/ghost) β ββ
β β β - Background style (flat/gradient) β ββ
β β β - CAT avatar β ββ
β β β - Logo URL β ββ
β β β - Brand text β ββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
User Roles and Access¶
Role Hierarchy¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β USER ROLES β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β PLATFORM LEVEL ββ
β β βββββββββββββββββββ ββ
β β β Platform Admin β - Manage environments ββ
β β β β - Create/delete organizations ββ
β β β β - Platform-wide settings ββ
β β β β - View all orgs ββ
β β βββββββββββββββββββ ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β ORGANIZATION LEVEL ββ
β β βββββββββββββββββββ βββββββββββββββββββ ββ
β β β Org Admin β β CAT Builder β ββ
β β β (Super-user) β β (Super-user) β ββ
β β β β β β ββ
β β β - Manage org β β - Create CAT OS β ββ
β β β - Manage users β β - Create KDs β ββ
β β β - View analyticsβ β - Create Agents β ββ
β β β - All CAT accessβ β - Create CATs β ββ
β β βββββββββββββββββββ βββββββββββββββββββ ββ
β β ββ
β β UI: admin-ui (https://admin.bast.ai) ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β CAT LEVEL ββ
β β βββββββββββββββββββ ββ
β β β End User β ββ
β β β (Normal user) β ββ
β β β β ββ
β β β - Chat with CAT β ββ
β β β - View history β ββ
β β β - Send feedback β ββ
β β βββββββββββββββββββ ββ
β β ββ
β β UI: chat-ui (https://chat.bast.ai) ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
UI to Role Mapping¶
| UI | Target Users | Capabilities |
|---|---|---|
| admin-ui | Platform Admin, Org Admin, CAT Builder | Org management, CAT configuration, analytics |
| chat-ui | End Users | Chat with CATs, view history, feedback |
Infrastructure on DuploCloud/AWS¶
DuploCloud Architecture¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DUPLOCLOUD / AWS β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β AWS ACCOUNT ββ
β β ββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β DUPLOCLOUD INFRASTRUCTURES βββ
β β β βββ
β β β βββββββββββββββββ βββββββββββββββββ βββββββββββββββββ βββ
β β β β dev-shared β β demo-shared β β prod-shared β βββ
β β β β (Dev) β β (Demo) β β (Prod) β βββ
β β β β β β β β β βββ
β β β β - VPC β β - VPC β β - VPC β βββ
β β β β - EKS Cluster β β - EKS Cluster β β - EKS Cluster β βββ
β β β β - ALB/Ingress β β - ALB/Ingress β β - ALB/Ingress β βββ
β β β β - IAM/IRSA β β - IAM/IRSA β β - IAM/IRSA β βββ
β β β βββββββββββββββββ βββββββββββββββββ βββββββββββββββββ βββ
β β β βββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β ββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β DEV TENANTS (dev-shared) βββ
β β β βββ
β β β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββ
β β β β dev-shared β β dev-bastai β β dev-craigh β βββ
β β β β (shared svc)β β (org svc) β β (org svc) β βββ
β β β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββ
β β β βββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β ββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β DEMO TENANTS (demo-shared) βββ
β β β βββ
β β β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββ
β β β β demo-shared β β demo-bastai β β demo-craigh β βββ
β β β β (shared svc)β β (org svc) β β (org svc) β βββ
β β β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββ
β β β βββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β ββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β PROD TENANTS (prod-shared) βββ
β β β βββ
β β β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββ
β β β β prod-shared β β prod-bastai β β prod-craigh β βββ
β β β β (shared svc)β β (org svc) β β (org svc) β βββ
β β β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββ
β β β βββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β EXTERNAL SERVICES ββ
β β ββ
β β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ ββ
β β β MongoDB β β OpenAI β β WorkOS β β S3/DVC β ββ
β β β Atlas β β API β β Auth β β Registry β ββ
β β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
DuploCloud Infrastructure & Tenant Strategy¶
| Infrastructure | Environment | Purpose |
|---|---|---|
| dev-shared | Dev | Development infrastructure |
| demo-shared | Demo | Demo/UAT infrastructure |
| prod-shared | Prod | Production infrastructure (us-east-1) |
| Tenant | Infrastructure | Type | Services |
|---|---|---|---|
| dev-shared | dev-shared | Shared | UI services, platform services |
| dev-bastai | dev-shared | Org | org-services, cat-runtime-* |
| dev-craigh | dev-shared | Org | org-services, cat-runtime-* |
| demo-shared | demo-shared | Shared | UI services, platform services |
| demo-bastai | demo-shared | Org | org-services, cat-runtime-* |
| demo-craigh | demo-shared | Org | org-services, cat-runtime-* |
| prod-shared | prod-shared | Shared | UI services, platform services |
| prod-bastai | prod-shared | Org | org-services, cat-runtime-* |
| prod-craigh | prod-shared | Org | org-services, cat-runtime-* |
AWS Resources per Environment¶
| Resource | Dev (dev-shared) | Demo (demo-shared) | Prod (prod-shared) |
|---|---|---|---|
| EKS Cluster | 1 | 1 | 1 |
| ECR Repositories | Shared across all | Shared across all | Shared across all |
| S3 Buckets | 1 per org | 1 per org | 1 per org |
| MongoDB Cluster | 1 shared (bast-nonprod) | 1 shared (bast-demo) | 1 per org (prod-{org}) |
| Redis/ElastiCache | 1 shared | 1 shared | 1 per org |
| ALB/Ingress | 1 per tenant | 1 per tenant | 1 per tenant |
| Secrets Manager | 1 | 1 | 1 |
Data Architecture (HIPAA/SOC2)¶
Overview¶
To meet HIPAA and SOC2 compliance requirements, the platform uses a hybrid MongoDB architecture: - Non-Production: Shared cluster (no PHI/PII) - Production: Dedicated cluster per organization (PHI/PII isolation)
MongoDB Atlas Architecture¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MONGODB ATLAS ARCHITECTURE β
β (HIPAA/SOC2 Compliant) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β DEV ENVIRONMENT (No PHI/PII) β β
β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Shared Cluster: bast-nonprod β β β
β β β Tier: M10 (development) β β β
β β β β β β
β β β βββββββββββββββ βββββββββββββββ βββββββββββββββ β β β
β β β β DB: np_bastaiβ β DB: np_craighβ β DB: dev_{org}β β β β
β β β βββββββββββββββ βββββββββββββββ βββββββββββββββ β β β
β β β β β β
β β β Requirements: β β β
β β β - NO PHI/PII data β β β
β β β - Synthetic/anonymized data only β β β
β β β - VPC peering to dev-shared infrastructure β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β DEMO ENVIRONMENT (No PHI/PII) β β
β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Shared Cluster: bast-demo β β β
β β β Tier: M10/M30 (demo) β β β
β β β β β β
β β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β β β
β β β βDB: demo_bastaiβ βDB: demo_craighβ βDB: demo_{org}β β β β
β β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β β β
β β β β β β
β β β Requirements: β β β
β β β - NO PHI/PII data (use synthetic data for demos) β β β
β β β - Customer-facing demos β β β
β β β - VPC peering to demo-shared infrastructure β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β PROD ENVIRONMENT (PHI/PII - HIPAA Compliant) β β
β β β β
β β βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ β β
β β β Cluster: β β Cluster: β β Cluster: β β β
β β β prod-bastai β β prod-craigh β β prod-{org} β β β
β β β β β β β β β β
β β β Tier: M30+ β β Tier: M30+ β β Tier: M30+ β β β
β β β (HIPAA eligible)β β (HIPAA eligible)β β (HIPAA eligible)β β β
β β β β β β β β β β
β β β Features: β β Features: β β Features: β β β
β β β - Dedicated β β - Dedicated β β - Dedicated β β β
β β β - BAA signed β β - BAA signed β β - BAA signed β β β
β β β - Encryption β β - Encryption β β - Encryption β β β
β β β - Audit logs β β - Audit logs β β - Audit logs β β β
β β β - BYOK option β β - BYOK option β β - BYOK option β β β
β β β - VPC peering β β - VPC peering β β - VPC peering β β β
β β βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ β β
β β β β
β β Each production cluster has: β β
β β - Dedicated resources (no noisy neighbor) β β
β β - Isolated network (VPC peering to prod-shared infrastructure) β β
β β - Independent backup/restore β β
β β - Org-specific connection string β β
β β - Audit logging enabled β β
β β - BAA signed with MongoDB Atlas β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
MongoDB Cluster Requirements by Environment¶
| Environment | Cluster Name | Cluster Type | Tier | PHI/PII | BAA Required | Encryption |
|---|---|---|---|---|---|---|
| Dev | bast-nonprod | Shared (all orgs) | M10 | No | No | TLS + At-rest |
| Demo | bast-demo | Shared (all orgs) | M10/M30 | No (synthetic) | No | TLS + At-rest |
| Prod | prod-{org} | Dedicated per Org | M30+ | Yes | Yes | TLS + At-rest + BYOK |
Connection String Management¶
Each environment/org has its own MongoDB connection string stored in AWS Secrets Manager:
| Secret Name | Description | Used By |
|---|---|---|
bast/dev/mongodb/shared |
Shared dev cluster (bast-nonprod) | dev-{org} services |
bast/demo/mongodb/shared |
Shared demo cluster (bast-demo) | demo-{org} services |
bast/prod/mongodb/{org} |
Org-specific prod cluster | prod-{org} services |
Examples:
# Dev Environment (shared cluster, separate databases)
bast/dev/mongodb/shared β mongodb+srv://<user>:<password>@<cluster>.mongodb.net/
# Demo Environment (shared cluster, separate databases)
bast/demo/mongodb/shared β mongodb+srv://<user>:<password>@<cluster>.mongodb.net/
# Prod Environment (dedicated cluster per org)
bast/prod/mongodb/bastai β mongodb+srv://<user>:<password>@<cluster>.mongodb.net/
bast/prod/mongodb/craigh β mongodb+srv://<user>:<password>@<cluster>.mongodb.net/
Database Selection:
- Dev: Services connect to bast-nonprod cluster, use database dev_{org} (e.g., np_bastai)
- Demo: Services connect to bast-demo cluster, use database demo_{org} (e.g., demo_bastai)
- Prod: Services connect to dedicated prod-{org} cluster, use default database
Data Isolation per Org (Production)¶
Each production org cluster contains these collections:
| Collection | Description |
|---|---|
organizations |
Org configuration |
users |
Org users and roles |
cats |
CAT configurations |
cat_os |
CAT OS definitions |
knowledge_domains |
Knowledge domain configs |
agent_pools |
Agent pool configurations |
themes |
Theme/branding configurations |
conversations |
Chat conversations (PHI) |
feedback |
User feedback |
analytics |
Usage analytics |
audit_logs |
Security audit trail |
UI Integration Flows¶
Flow 1: Organization Creation (Platform Admin)¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ORGANIZATION CREATION FLOW β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β
β β Platform β β admin- β βplatform- β β DuploCloudβ β
β β Admin β β ui β β api β β API β β
β ββββββ¬ββββββ ββββββ¬ββββββ ββββββ¬ββββββ ββββββ¬ββββββ β
β β β β β β
β β 1. Login β β β β
β ββββββββββββββββ>β β β β
β β β 2. Create Org β β β
β β β Request β β β
β β ββββββββββββββββ>β β β
β β β β β β
β β β β 3. Provision β β
β β β β Resources β β
β β β ββββββββββββββββ>β β
β β β β β β
β β β β 3a. Create β β
β β β β K8s Service β β
β β β β (org-svc) β β
β β β β<ββββββββββββββββ β
β β β β β β
β β β 4. Create DB β β β
β β β Collections β β β
β β β (MongoDB) β β β
β β β β β β
β β β 5. Create S3 β β β
β β β Bucket β β β
β β β β β β
β β β 6. Return β β β
β β 7. Success β Success β β β
β β<ββββββββββββββββ<ββββββββββββββββ β β
β β β β β β
β β
β RESULT: β
β - org-services deployed (ORG_NAME=new-org) β
β - MongoDB collections: organizations, users, cats, cat_os, etc. β
β - S3 bucket: s3://bast-{env}-{org}-data β
β - Org admin user created β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Flow 2: CAT OS / Knowledge Domain / Agent Pool Creation (CAT Builder)¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CAT COMPONENT CREATION FLOW β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β
β β CAT β β admin- β β bff β β org- β β
β β Builder β β ui β β β β services β β
β ββββββ¬ββββββ ββββββ¬ββββββ ββββββ¬ββββββ ββββββ¬ββββββ β
β β β β β β
β β 1. Login β β β β
β β (org context) β β β β
β ββββββββββββββββ>β β β β
β β β β β β
β β 2a. Create β 3. tRPC Call β 4. API Call β β
β β CAT OS ββββββββββββββββ>ββββββββββββββββ>β β
β ββββββββββββββββ>β β β β
β β β β 5. Save to β β
β β β β MongoDB β β
β β β β (cat_os β β
β β β β collection) β β
β β β β β β
β β 2b. Create β β β β
β β Knowledge ββββββββββββββββ>ββββββββββββββββ>β β
β β Domain β β β β
β ββββββββββββββββ>β β 6. Save to β β
β β β β MongoDB + β β
β β β β Init Vector β β
β β β β Index β β
β β β β β β
β β 2c. Create β β β β
β β Agent Pool ββββββββββββββββ>ββββββββββββββββ>β β
β ββββββββββββββββ>β β β β
β β β β 7. Save to β β
β β β β MongoDB β β
β β β β (agent_pools β β
β β β β collection) β β
β β β β β β
β β
β NOTE: These are configuration-only operations. β
β No new services are deployed at this stage. β
β Configurations are stored in MongoDB and used when CAT is created. β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Flow 3: CAT Creation (CAT Builder)¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CAT CREATION FLOW β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β
β β CAT β β admin- β β bff β β org- β β DuploCloudβ β
β β Builder β β ui β β β β services β β API β β
β ββββββ¬ββββββ ββββββ¬ββββββ ββββββ¬ββββββ ββββββ¬ββββββ ββββββ¬ββββββ β
β β β β β β β
β β 1. Create β β β β β
β β CAT Form β β β β β
β ββββββββββββββ>β β β β β
β β β β β β β
β β Select: β β β β β
β β - CAT OS β β β β β
β β - Knowledge β β β β β
β β Domains β β β β β
β β - Agent Pool β β β β β
β β β β β β β
β β 2. Submit β 3. tRPC β 4. Create β β β
β ββββββββββββββ>ββββββββββββββ>ββββββββββββββ>β β β
β β β β β β β
β β β β 5. Save CAT β β β
β β β β config to β β β
β β β β MongoDB β β β
β β β β β β β
β β β β 6. Trigger β β β
β β β β Service β β β
β β β β Creation β β β
β β β ββββββββββββββ>ββββββββββββββ>β β
β β β β β β β
β β β β β 7. Create β β
β β β β β cat-runtime- β β
β β β β β {cat_type} β β
β β β β β β β
β β β β β Env vars: β β
β β β β β - ORG_NAME β β
β β β β β - CAT_TYPE β β
β β β β β - MONGODB_URIβ β
β β β β β - OPENAI_KEY β β
β β β β β β β
β β β β 8. Wait for β β β
β β β β healthy β β β
β β β β<ββββββββββββββ<ββββββββββββββ β
β β β β β β β
β β 9. Success β β β β β
β β<ββββββββββββββ<ββββββββββββββ<ββββββββββββββ β β
β β β β β β β
β β
β RESULT: β
β - CAT configuration saved to MongoDB β
β - cat-runtime-{cat_type} service deployed β
β - Service is ready to handle chat requests β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Flow 4: End User Chat (Normal User)¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β END USER CHAT FLOW β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β
β β End β β chat- β β bff β β cat- β β MongoDB β β
β β User β β ui β β β β runtime β β β β
β ββββββ¬ββββββ ββββββ¬ββββββ ββββββ¬ββββββ ββββββ¬ββββββ ββββββ¬ββββββ β
β β β β β β β
β β 1. Access β β β β β
β β chat.bast.ai β β β β β
β ββββββββββββββ>β β β β β
β β β β β β β
β β 2. Login β 3. Auth β β β β
β β (org/CAT β (WorkOS/ β β β β
β β context) β Google/MS) β β β β
β ββββββββββββββ>ββββββββββββββ>β β β β
β β β β β β β
β β 4. Send β 5. tRPC β 6. Route to β β β
β β Message β chat.send β cat-runtime β β β
β ββββββββββββββ>ββββββββββββββ>ββββββββββββββ>β β β
β β β β β β β
β β β β β 7. Load CAT β β
β β β β β config β β
β β β β ββββββββββββββ>β β
β β β β β β β
β β β β β 8. Process β β
β β β β β with: β β
β β β β β - CAT OS β β
β β β β β - Knowledge β β
β β β β β - Agents β β
β β β β β β β
β β β β β 9. Save β β
β β β β β conversation β β
β β β β ββββββββββββββ>β β
β β β β β β β
β β 10. Stream β β β β β
β β Response β<ββββββββββββββ<ββββββββββββββ β β
β β<ββββββββββββββ β β β β
β β β β β β β
β β
β BFF ROUTING LOGIC: β
β - Extract org_id and cat_type from JWT or request β
β - Route to: cat-runtime-{cat_type} service β
β - Each cat-runtime knows its ORG_NAME and CAT_TYPE from env vars β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Deployment Methods¶
Overview¶
The platform uses three deployment methods depending on the resource type:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DEPLOYMENT METHODS BY RESOURCE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β TERRAFORM (Infrastructure) CI/CD PIPELINE (Code Deployments) β
β βββββββββββββββββββββββββββββ βββββββββββββββββββββββββββββββββ β
β β’ DuploCloud Infrastructure β’ cat-runtime image updates β
β β’ Shared Tenants (dev-shared) β’ org-services image updates β
β β’ AWS Services (S3, Secrets) β’ UI services (admin-ui, chat-ui, bff) β
β β’ ECR Repositories β’ Rollbacks β
β β’ Initial service templates β’ Triggered by: git merge/tag β
β β’ Triggered by: manual CLI β
β β
β ADMIN UI (Self-Service) BOTH PATHS AVAILABLE β
β βββββββββββββββββββββββ ββββββββββββββββββββ β
β β’ Create Organization β deploys β’ Organization: Admin UI (standard) β
β tenant + org-services or Terraform (custom) β
β β’ Create CAT β deploys cat-runtime β’ Org Tenant: Admin UI or Terraform β
β β’ CAT OS (config only) β’ CAT Runtime: Admin UI β
β β’ Knowledge Domains (config only) β
β β’ Agent Pools (config only) β
β β’ User management β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Method Summary Table¶
| Resource | Admin UI | Terraform | CI/CD Pipeline | Notes |
|---|---|---|---|---|
| Infrastructure | - | Yes | - | One-time setup |
| Shared Tenant | - | Yes | - | {env}-shared |
| Organization | Yes | Yes | - | Admin UI recommended |
| Org Tenant | Auto | Yes | - | Created with org |
| org-services | Auto | Yes | Yes | Auto-deployed with org |
| CAT | Yes | - | - | Admin UI only |
| cat-runtime | Auto | - | Yes | Auto-deployed with CAT |
| CAT OS | Yes | - | - | Config only |
| Knowledge Domain | Yes | - | - | Config only |
| Agent Pool | Yes | - | - | Config only |
| UI Services | - | Yes | Yes | Pipeline for updates |
When to Use Each Method¶
| Scenario | Recommended Method |
|---|---|
| New environment setup | Terraform |
| Standard org onboarding | Admin UI |
| Custom org config (HIPAA/SOC2) | Terraform + Admin UI |
| Bulk org creation | Terraform |
| New CAT deployment | Admin UI |
| Code deployment/update | CI/CD Pipeline |
| Emergency rollback | Terraform or DuploCloud Console |
| Infrastructure scaling | Terraform |
Service Creation Workflows¶
Workflow 1: Environment Setup (One-time)¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ENVIRONMENT SETUP CHECKLIST β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β 1. AWS/DuploCloud Infrastructure β
β [ ] Create DuploCloud infrastructure (bast-infra) β
β [ ] Configure EKS cluster β
β [ ] Set up VPC, subnets, security groups β
β [ ] Create ECR repositories (bastai-cat, bast-org-services, bast-cat-runtime)β
β [ ] Configure IAM roles and IRSA β
β β
β 2. DuploCloud Tenant (per environment) β
β [ ] Create tenant (dev-bastai for dev, prod-bastai for demo/prod) β
β [ ] Configure tenant network policies β
β [ ] Set up ingress/ALB β
β β
β 3. External Services β
β [ ] MongoDB Atlas cluster setup β
β [ ] Create databases and initial collections β
β [ ] Configure network peering (VPC to Atlas) β
β [ ] Set up connection strings as secrets β
β β
β 4. Platform Services β
β [ ] Deploy platform-api (includes auth endpoints) β
β [ ] Configure external auth provider (WorkOS) if needed β
β β
β 5. UI Services (Shared) β
β [ ] Deploy admin-ui (dev-admin-ui, demo-admin-ui) β
β [ ] Deploy chat-ui (dev-chat-ui, demo-chat-ui) β
β [ ] Deploy bff (dev-bff, demo-bff) β
β [ ] Configure ingress routes β
β β
β 6. Bitbucket Pipeline Configuration β
β [ ] Set repository variables (ECR, AWS, DUPLO, etc.) β
β [ ] Test dev branch pipeline β
β [ ] Test main branch pipeline β
β β
β 7. DNS and Certificates β
β [ ] Configure Route53 records β
β [ ] Set up SSL certificates (ACM) β
β [ ] Verify HTTPS access to all services β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Workflow 2: User Registration, Login & Organization Access¶
This workflow defines how users register, authenticate, and gain access to organizations.
Implementation Status: β Full Stack Complete
| Component | Status | Location |
|---|---|---|
| User DTOs | β Complete | src/apis/platform/bast_platform_api/dto/user.py |
| Auth Service (JWT) | β Complete | src/apis/platform/bast_platform_api/svc/auth_service.py |
| User Service | β Complete | src/apis/platform/bast_platform_api/svc/user_service.py |
| Auth Router | β Complete | src/apis/platform/bast_platform_api/bp/auth.py |
| OAuth Router (Google/Microsoft) | β Complete | src/apis/platform/bast_platform_api/bp/oauth.py |
| BFF Auth Router | β Complete | bast-admin-ui/apps/bff/src/trpc/auth.ts |
| Admin UI Auth Types | β Complete | bast-admin-ui/apps/admin-ui/src/types/auth.ts |
| Admin UI Auth Context | β Complete | bast-admin-ui/apps/admin-ui/src/lib/auth-context.tsx |
| Admin UI Login Screen | β Complete | bast-admin-ui/apps/admin-ui/src/components/auth/LoginScreen.tsx |
| Admin UI Register Screen | β Complete | bast-admin-ui/apps/admin-ui/src/components/auth/RegisterScreen.tsx |
| Admin UI Auth Callback | β Complete | bast-admin-ui/apps/admin-ui/src/components/auth/AuthCallback.tsx |
Implemented Endpoints:
| Endpoint | Method | Description |
|----------|--------|-------------|
| /api/v1/platform/auth/register | POST | Register new user (with optional invite_token) |
| /api/v1/platform/auth/login | POST | Login, returns JWT access + refresh tokens |
| /api/v1/platform/auth/refresh | POST | Refresh access token |
| /api/v1/platform/auth/me | GET | Get current user info (requires Bearer token) |
| /api/v1/platform/auth/password/change | POST | Change password |
| /api/v1/platform/auth/invitations/{token} | GET | Get invitation details |
| /api/v1/platform/auth/invitations/{token}/accept | POST | Accept invitation |
OAuth Endpoints (Sign in with Google/Microsoft):
| Endpoint | Method | Description |
|----------|--------|-------------|
| /api/v1/platform/auth/oauth/google/auth | GET | Initiate Google OAuth flow (redirects to Google) |
| /api/v1/platform/auth/oauth/google/callback | GET | Google OAuth callback (creates user, redirects to frontend) |
| /api/v1/platform/auth/oauth/microsoft/auth | GET | Initiate Microsoft OAuth flow (redirects to Microsoft) |
| /api/v1/platform/auth/oauth/microsoft/callback | GET | Microsoft OAuth callback (creates user, redirects to frontend) |
| /api/v1/platform/auth/oauth/exchange-token | POST | Exchange OAuth session token for JWT tokens |
OAuth Flow:
1. Frontend redirects user to /auth/oauth/google/auth or /auth/oauth/microsoft/auth
2. User authenticates with OAuth provider
3. Provider redirects to callback URL with authorization code
4. Platform API creates/updates user, generates session token
5. Redirects to frontend /auth/callback?session_token=<token>
6. Frontend calls /auth/oauth/exchange-token with session token
7. Returns JWT tokens + user info (same format as login)
JWT Token Configuration: - Access Token: 15 minutes expiry - Refresh Token: 7 days expiry - Algorithm: HS256 - Claims: sub (user_id), email, name, orgs, current_org
BFF Auth Router (tRPC):
The BFF provides a tRPC router that proxies auth requests to the Platform API:
| Procedure | Type | Description |
|---|---|---|
auth.register |
Mutation | Register new user (proxies to Platform API) |
auth.login |
Mutation | Email/password login |
auth.refresh |
Mutation | Refresh JWT access token |
auth.me |
Query | Get current user info |
auth.changePassword |
Mutation | Change user password |
auth.getInvitation |
Query | Get invitation details by token |
auth.acceptInvitation |
Mutation | Accept organization invitation |
auth.getGoogleAuthUrl |
Query | Get Google OAuth redirect URL |
auth.getMicrosoftAuthUrl |
Query | Get Microsoft OAuth redirect URL |
auth.exchangeOAuthToken |
Mutation | Exchange OAuth session token for JWT |
Admin UI Auth Architecture:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ADMIN UI AUTH ARCHITECTURE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β main.tsx β
β βββββββββ β
β <TRPCProvider> β
β <AuthProvider> β Auth context wraps entire app β
β <App /> β
β </AuthProvider> β
β </TRPCProvider> β
β β
β AuthProvider (lib/auth-context.tsx) β
β βββββββββββββββββββββββββββββββββββ β
β - Manages auth state (user, tokens, currentOrg, isAuthenticated) β
β - Persists tokens/user to localStorage β
β - Provides methods: login, register, logout, loginWithGoogle, β
β loginWithMicrosoft, exchangeOAuthToken, β
β setCurrentOrg, refreshTokens β
β β
β Auth Screens (components/auth/) β
β βββββββββββββββββββββββββββββββ β
β - LoginScreen.tsx Email/password + Google/Microsoft OAuth buttons β
β - RegisterScreen.tsx Account creation with password validation β
β - AuthCallback.tsx OAuth callback handler (exchanges session token) β
β β
β Auth Types (types/auth.ts) β
β βββββββββββββββββββββββββ β
β - User, TokenPair, OrgMembership β
β - AuthState, AuthContextType β
β - LoginInput, RegisterInput β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Auth State Flow:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β AUTH STATE FLOW β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β 1. App Start β
β βββββββββ β
β AuthProvider checks localStorage for existing tokens/user β
β If valid β isAuthenticated = true, show dashboard β
β If invalid β isAuthenticated = false, show LoginScreen β
β β
β 2. Email/Password Login β
β βββββββββββββββββββββ β
β LoginScreen β useAuth().login() β BFF auth.login β Platform API β
β On success: store tokens + user in localStorage, set isAuthenticated β
β β
β 3. OAuth Login β
β βββββββββββ β
β a) User clicks "Continue with Google/Microsoft" β
β b) loginWithGoogle/Microsoft() redirects to Platform API OAuth endpoint β
β c) Platform API redirects to provider (Google/Microsoft) β
β d) User authenticates, provider redirects to callback β
β e) Platform API creates user, generates session token β
β f) Redirects to Admin UI /auth/callback?session_token=xxx β
β g) AuthCallback component calls exchangeOAuthToken() β
β h) BFF auth.exchangeOAuthToken β Platform API β
β i) On success: store tokens, set isAuthenticated β
β β
β 4. Token Storage β
β βββββββββββββ β
β localStorage keys: β
β - bast_auth_tokens: { access_token, refresh_token, token_type, expires_in }β
β - bast_auth_user: { id, email, name, status, organizations, ... } β
β β
β 5. Logout β
β ββββββ β
β useAuth().logout() β clear localStorage β set isAuthenticated = false β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β USER REGISTRATION & AUTHENTICATION β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β FLOW 1: New User Registration ββ
β β βββββββββββββββββββββββββββββ ββ
β β ββ
β β βββββββββββββββ βββββββββββββββ βββββββββββββββββββββββββββββββ ββ
β β β Admin UI βββββ>β BFF βββββ>β Platform API β ββ
β β β /register β β β β POST /auth/register β ββ
β β βββββββββββββββ βββββββββββββββ βββββββββββββββββββββββββββββββ ββ
β β β ββ
β β Input: β ββ
β β β’ email βΌ ββ
β β β’ password βββββββββββββββββββ ββ
β β β’ name β MongoDB β ββ
β β β users (status: β ββ
β β Process: β "pending" or β ββ
β β 1. Validate email uniqueness β "active") β ββ
β β 2. Hash password (bcrypt) βββββββββββββββββββ ββ
β β 3. Create user with status="active" ββ
β β 4. Generate JWT tokens ββ
β β 5. User has NO organizations yet ββ
β β ββ
β β Result: ββ
β β β’ User logged in but with empty organizations[] ββ
β β β’ Redirect to "Create Organization" screen ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β FLOW 2: User Login ββ
β β βββββββββββββββββ ββ
β β ββ
β β βββββββββββββββ βββββββββββββββ βββββββββββββββββββββββββββββββ ββ
β β β Admin UI βββββ>β BFF βββββ>β Platform API β ββ
β β β /login β β β β POST /auth/login β ββ
β β βββββββββββββββ βββββββββββββββ βββββββββββββββββββββββββββββββ ββ
β β β ββ
β β Input: β ββ
β β β’ email βΌ ββ
β β β’ password βββββββββββββββββββ ββ
β β β Validate creds β ββ
β β Process: β Generate JWT β ββ
β β 1. Validate credentials β Update last_ β ββ
β β 2. Generate access + refresh tokens β login β ββ
β β 3. Check user.organizations[] βββββββββββββββββββ ββ
β β ββ
β β Routing based on organizations: ββ
β β ββ
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ
β β β IF organizations.length == 0: β ββ
β β β β Redirect to "Create Organization" screen β ββ
β β β β User CANNOT access any other features until org created β ββ
β β β β ββ
β β β IF organizations.length == 1: β ββ
β β β β Auto-select that organization β ββ
β β β β Redirect to Dashboard β ββ
β β β β ββ
β β β IF organizations.length > 1: β ββ
β β β β Show "Select Organization" screen β ββ
β β β β User picks org, then redirect to Dashboard β ββ
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β FLOW 3: First Organization Creation (User becomes Owner) ββ
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ
β β ββ
β β Trigger: User with 0 organizations clicks "Create Organization" ββ
β β ββ
β β βββββββββββββββ βββββββββββββββ βββββββββββββββββββββββββββββββ ββ
β β β Admin UI βββββ>β BFF βββββ>β Platform API β ββ
β β β Create Org β β β β POST /organizations β ββ
β β β Form β β β β (with user_id from JWT) β ββ
β β βββββββββββββββ βββββββββββββββ βββββββββββββββββββββββββββββββ ββ
β β β ββ
β β Input: β ββ
β β β’ org name βΌ ββ
β β β’ org slug βββββββββββββββββββ ββ
β β β’ environment (dev/demo/prod) β Platform API β ββ
β β β’ (user_id from JWT automatically) β Operations: β ββ
β β β β ββ
β β Process: β 1. Create org β ββ
β β 1. Create organization record β 2. Add user as β ββ
β β 2. Add creating user as "owner" β owner β ββ
β β 3. Trigger provisioning if auto_prov β 3. Provision β ββ
β β 4. Update user.organizations[] β (optional) β ββ
β β 5. Issue new JWT with org access βββββββββββββββββββ ββ
β β ββ
β β User Document Update: ββ
β β ```json ββ
β β { ββ
β β "organizations": [ ββ
β β { ββ
β β "org_id": "<new_org_id>", ββ
β β "role": "owner", ββ
β β "permissions": ["*"], // Full access ββ
β β "joined_at": "<timestamp>" ββ
β β } ββ
β β ] ββ
β β } ββ
β β ``` ββ
β β ββ
β β Result: User now has org access β Redirect to Dashboard ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TEAM MEMBER INVITATION WORKFLOW β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β FLOW 4: Invite Team Member ββ
β β βββββββββββββββββββββββββββββ ββ
β β ββ
β β Trigger: Org owner/admin invites a user by email ββ
β β ββ
β β βββββββββββββββ βββββββββββββββ βββββββββββββββββββββββββββββββ ββ
β β β Admin UI βββββ>β BFF βββββ>β Platform API β ββ
β β β Team Page β β β β POST /orgs/{id}/invitationsβ ββ
β β β "Invite" β β β β β ββ
β β βββββββββββββββ βββββββββββββββ βββββββββββββββββββββββββββββββ ββ
β β β ββ
β β Input: β ββ
β β β’ invitee_email βΌ ββ
β β β’ role (admin/member/viewer) βββββββββββββββββββ ββ
β β β Check if user β ββ
β β β exists β ββ
β β ββββββββββ¬βββββββββ ββ
β β β ββ
β β ββββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββ ββ
β β βΌ βΌ ββ
β β βββββββββββββββββββ βββββββββββββββ ββ
β β β User EXISTS β βUser NOT β ββ
β β β β βEXISTS β ββ
β β ββββββββββ¬βββββββββ ββββββββ¬βββββββ ββ
β β β β ββ
β β βΌ βΌ ββ
β β βββββββββββββββββββ βββββββββββββββ ββ
β β β Create β βCreate β ββ
β β β invitation β βinvitation β ββ
β β β (status: β β(status: β ββ
β β β pending) β β pending) β ββ
β β ββββββββββ¬βββββββββ ββββββββ¬βββββββ ββ
β β β β ββ
β β βΌ βΌ ββ
β β βββββββββββββββββββ βββββββββββββββ ββ
β β β Send email: β βSend email: β ββ
β β β "You've been β β"You've been β ββ
β β β invited to β βinvited to β ββ
β β β {org}. Login β β{org}. β ββ
β β β to accept." β βRegister to β ββ
β β β β βjoin." β ββ
β β β Link: /login β βLink: β ββ
β β β ?invite={token} β β/register β ββ
β β β β β?invite= β ββ
β β β β β{token} β ββ
β β βββββββββββββββββββ βββββββββββββββ ββ
β β ββ
β β Invitation Document (MongoDB: invitations): ββ
β β ```json ββ
β β { ββ
β β "_id": ObjectId, ββ
β β "org_id": ObjectId, ββ
β β "email": "invitee@example.com", ββ
β β "role": "member", ββ
β β "token": "<secure_random_token>", ββ
β β "status": "pending", // pending | accepted | expired | revoked ββ
β β "invited_by": ObjectId, // user who sent invite ββ
β β "created_at": datetime, ββ
β β "expires_at": datetime, // 7 days from creation ββ
β β "accepted_at": datetime // null until accepted ββ
β β } ββ
β β ``` ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β FLOW 5a: Accept Invitation (Existing User) ββ
β β βββββββββββββββββββββββββββββββββββββββββββ ββ
β β ββ
β β βββββββββββββββββ βββββββββββββββ βββββββββββββββββββββββββββββββ ββ
β β β Email Link βββββ>β Admin UI βββββ>β Platform API β ββ
β β β /login?invite β β (Login) β β POST /invitations/{token}/ β ββ
β β β ={token} β β β β accept β ββ
β β βββββββββββββββββ βββββββββββββββ βββββββββββββββββββββββββββββββ ββ
β β β ββ
β β Process: β ββ
β β 1. User logs in normally βΌ ββ
β β 2. Detect ?invite={token} param βββββββββββββββββββ ββ
β β 3. Validate token (not expired) β 1. Validate β ββ
β β 4. Show "Accept invitation" prompt β token β ββ
β β 5. On accept: β 2. Add org to β ββ
β β - Add org to user.organizations[] β user β ββ
β β - Mark invitation as accepted β 3. Update β ββ
β β - Issue new JWT with org access β invitation β ββ
β β βββββββββββββββββββ ββ
β β ββ
β β User Document Update: ββ
β β ```json ββ
β β { ββ
β β "organizations": [ ββ
β β { "org_id": "existing_org", "role": "owner" }, ββ
β β { "org_id": "invited_org", "role": "member", "joined_at": "..." } ββ
β β ] ββ
β β } ββ
β β ``` ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β FLOW 5b: Accept Invitation (New User - Register First) ββ
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ
β β ββ
β β βββββββββββββββββ βββββββββββββββ βββββββββββββββββββββββββββββββ ββ
β β β Email Link βββββ>β Admin UI βββββ>β Platform API β ββ
β β β/register? β β (Register) β β POST /auth/register β ββ
β β βinvite={token} β β β β (with invite_token) β ββ
β β βββββββββββββββββ βββββββββββββββ βββββββββββββββββββββββββββββββ ββ
β β β ββ
β β Process: β ββ
β β 1. User fills registration form βΌ ββ
β β 2. Email pre-filled from invitation βββββββββββββββββββ ββ
β β 3. Submit with invite_token β 1. Create user β ββ
β β 4. Create user account β 2. Auto-accept β ββ
β β 5. Auto-accept invitation β invitation β ββ
β β 6. Add org to user.organizations[] β 3. Add org β ββ
β β 7. Issue JWT with org access β 4. Issue JWT β ββ
β β βββββββββββββββββββ ββ
β β ββ
β β New User Document: ββ
β β ```json ββ
β β { ββ
β β "email": "invitee@example.com", ββ
β β "name": "New User", ββ
β β "status": "active", ββ
β β "organizations": [ ββ
β β { "org_id": "invited_org", "role": "member", "joined_at": "..." } ββ
β β ] ββ
β β } ββ
β β ``` ββ
β β ββ
β β Result: New user directly lands in Dashboard (has org access) ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ACCESS CONTROL SUMMARY β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β User State Transitions: β
β βββββββββββββββββββββββββ β
β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β Guest ββββ>β Registered ββββ>β Has Org ββββ>β Active β β
β β (No Auth) β β (No Org) β β Access β β User β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β β β β β
β β β β β β
β Can only: Can only: Can access: Full access: β
β - Register - Create org - Dashboard - All features β
β - Login - Accept invite - Org settings - Team mgmt β
β - View "no org" - CAT Builder - Billing β
β screen β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Roles & Permissions (per Organization) ββ
β β ββββββββββββββββββββββββββββββββββββββ ββ
β β ββ
β β ββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ
β β β Role β Permissions β ββ
β β ββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ ββ
β β β owner β All permissions + delete org + transfer ownership β ββ
β β β admin β Team management + CAT CRUD + settings β ββ
β β β member β CAT read/write + knowledge management β ββ
β β β viewer β Read-only access to CATs and analytics β ββ
β β ββββββββββββββ΄ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β Protected Routes (Admin UI): β
β ββββββββββββββββββββββββββββ β
β β
β Public (no auth): Auth Required: Org Required: β
β - /login - /create-org - /dashboard β
β - /register - /select-org - /cat-builder/* β
β - /forgot-password - /invitations - /team β
β - /reset-password - /settings β
β - /analytics β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Workflow 3: New Organization Onboarding¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β NEW ORGANIZATION ONBOARDING β
β (HIPAA/SOC2 Compliant) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Trigger: Platform Admin creates org via admin-ui β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β PHASE 1: MongoDB Cluster Provisioning (Production Only) ββ
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ
β β ββ
β β 1. [ ] Create MongoDB Atlas cluster: prod-{org} ββ
β β - Tier: M30 or higher (HIPAA eligible) ββ
β β - Region: Same as DuploCloud tenant ββ
β β - Encryption: At-rest enabled ββ
β β ββ
β β 2. [ ] Configure cluster security: ββ
β β - [ ] Enable audit logging ββ
β β - [ ] Configure IP allowlist (VPC peering) ββ
β β - [ ] Create database user with least privilege ββ
β β - [ ] Enable TLS 1.2+ enforcement ββ
β β ββ
β β 3. [ ] Sign BAA (Business Associate Agreement): ββ
β β - [ ] MongoDB Atlas BAA for cluster ββ
β β - [ ] Document BAA reference in org record ββ
β β ββ
β β 4. [ ] Set up VPC peering: ββ
β β - [ ] Peer Atlas cluster to DuploCloud VPC ββ
β β - [ ] Configure security groups ββ
β β ββ
β β 5. [ ] Store connection string: ββ
β β - [ ] AWS Secrets Manager: bast/prod/mongodb/{org} ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β PHASE 2: Database Setup ββ
β β ββββββββββββββββββββββ ββ
β β ββ
β β 1. [ ] Create database collections: ββ
β β - organizations ββ
β β - users ββ
β β - cats ββ
β β - cat_os ββ
β β - knowledge_domains ββ
β β - agent_pools ββ
β β - themes ββ
β β - conversations ββ
β β - feedback ββ
β β - analytics ββ
β β - audit_logs ββ
β β ββ
β β 2. [ ] Create indexes for performance ββ
β β ββ
β β 3. [ ] Initialize org record with: ββ
β β - org_id, org_name ββ
β β - baa_signed: true, baa_date: <date> ββ
β β - compliance: ["HIPAA", "SOC2"] ββ
β β - created_at, created_by ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β PHASE 3: AWS Resources ββ
β β ββββββββββββββββββββ ββ
β β ββ
β β 1. [ ] Create S3 bucket: s3://bast-prod-{org}-data ββ
β β - [ ] Enable encryption (SSE-S3 or SSE-KMS) ββ
β β - [ ] Enable versioning ββ
β β - [ ] Configure lifecycle policies ββ
β β - [ ] Block public access ββ
β β ββ
β β 2. [ ] Create DuploCloud tenant: prod-{org} ββ
β β - [ ] Configure namespace ββ
β β - [ ] Set up ingress/ALB ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β PHASE 4: Service Deployment ββ
β β ββββββββββββββββββββββββββ ββ
β β ββ
β β 1. [ ] Deploy org-services: ββ
β β - Service name: org-services ββ
β β - Env: ORG_ID={org_id} (MongoDB ObjectId) ββ
β β - Env: ORG_SLUG={org_slug} (e.g., "acme-corp") ββ
β β - Env: ORG_MONGODB_URI=<from secrets manager> ββ
β β - Database: {org_slug}_data (e.g., "acme-corp_data") ββ
β β ββ
β β 2. [ ] Update org infrastructure record: ββ
β β - Set tenant info (tenant_name, tenant_id, infrastructure_name) ββ
β β - Set org_services deployment info ββ
β β - Set mongodb_uri in infrastructure.mongodb ββ
β β ββ
β β 3. [ ] Verify deployment: ββ
β β - [ ] Health check: /health returns 200 ββ
β β - [ ] Info check: /info returns org_id, org_slug, databases ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β PHASE 5: User Setup ββ
β β βββββββββββββββββ ββ
β β ββ
β β 1. [ ] Create org admin user: ββ
β β - [ ] Add to auth service (WorkOS/Google/MS) ββ
β β - [ ] Assign Org Admin role ββ
β β - [ ] Add to org's users collection ββ
β β ββ
β β 2. [ ] Send welcome email: ββ
β β - [ ] Login URL ββ
β β - [ ] Initial setup instructions ββ
β β - [ ] Security best practices ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β Verification Checklist: β
β βββββββββββββββββββββββ β
β [ ] MongoDB cluster healthy and accessible β
β [ ] BAA documentation complete β
β [ ] org-services /health returns healthy β
β [ ] Org admin can login to admin-ui β
β [ ] Org admin sees empty CAT Builder dashboard β
β [ ] Audit logging captures login event β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Workflow 2b: Non-Production Organization Setup¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β NON-PRODUCTION ORG SETUP (Dev/Demo) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β For dev/demo environments - uses shared MongoDB cluster β
β β
β Steps: β
β ββββββ β
β 1. [ ] Create database in shared cluster: {org_slug}_data β
β - Example: "acme-corp_data" for org slug "acme-corp" β
β - Collections: cats, cat_os, knowledge_domains, agent_pools, themes β
β β
β 2. [ ] Create DuploCloud tenant: {env}-{org_slug} β
β - Example: "dev-acme-corp" within nonprod infrastructure β
β β
β 3. [ ] Deploy org-services to org tenant: β
β - Env: ORG_ID={org_id} β
β - Env: ORG_SLUG={org_slug} β
β - Env: ORG_MONGODB_URI=mongodb://shared-cluster/... β
β β
β 4. [ ] Update org infrastructure record in Platform API β
β β
β 5. [ ] Create test users β
β β
β IMPORTANT: β
β - NO PHI/PII data in non-production β
β - Use synthetic/anonymized data only β
β - No BAA required β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Workflow 3: New CAT Deployment¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β NEW CAT DEPLOYMENT β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Trigger: CAT Builder creates CAT via admin-ui β
β β
β Prerequisites: β
β ββββββββββββββ β
β [ ] At least one CAT OS created β
β [ ] At least one Knowledge Domain created (optional but recommended) β
β [ ] At least one Agent Pool created β
β β
β Automated Steps: β
β βββββββββββββββββ β
β 1. [ ] Validate CAT configuration β
β - CAT OS exists and is valid β
β - Knowledge Domains exist (if specified) β
β - Agent Pool exists β
β 2. [ ] Save CAT config to MongoDB (cats collection) β
β 3. [ ] Trigger cat-runtime service creation: β
β - Service name: cat-runtime-{cat_type} β
β - Image: bast-cat-runtime:latest β
β - Env: ORG_NAME, CAT_TYPE, MONGODB_URI, OPENAI_API_KEY β
β 4. [ ] Wait for service to be healthy β
β 5. [ ] Update CAT status to "active" β
β 6. [ ] Configure BFF routing (if dynamic) β
β β
β Service Creation (DuploCloud): β
β βββββββββββββββββββββββββββββββ β
β ```bash β
β cat <<'EOF' | duploctl service create --tenant {tenant} --file - β
β { β
β "Name": "cat-runtime-{cat_type}", β
β "DockerImage": "{ecr}/bast-cat-runtime:latest", β
β "AgentPlatform": 7, β
β "Replicas": 1, β
β "OtherDockerConfig": { β
β "Env": [ β
β {"Name": "ORG_NAME", "Value": "{org}"}, β
β {"Name": "CAT_TYPE", "Value": "{cat_type}"}, β
β {"Name": "MONGODB_URI", "Value": "..."}, β
β {"Name": "OPENAI_API_KEY", "Value": "..."} β
β ] β
β } β
β } β
β EOF β
β ``` β
β β
β Verification: β
β βββββββββββββ β
β [ ] cat-runtime-{cat_type} /health returns healthy β
β [ ] CAT appears in admin-ui CAT list β
β [ ] End user can access CAT via chat-ui β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Monitoring and Observability¶
Monitoring Architecture¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MONITORING ARCHITECTURE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β METRICS COLLECTION ββ
β β ββ
β β Services expose: ββ
β β - /metrics (Prometheus format) ββ
β β - /health (liveness) ββ
β β - /ready (readiness) ββ
β β ββ
β β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ ββ
β β β org-servicesβ βcat-runtime-*β β admin-ui β β chat-ui β ββ
β β β :8080 β β :9090 β β :9090 β β :9090 β ββ
β β ββββββββ¬βββββββ ββββββββ¬βββββββ ββββββββ¬βββββββ ββββββββ¬βββββββ ββ
β β β β β β ββ
β β ββββββββββββββββββ΄βββββββββββββββββ΄βββββββββββββββββ ββ
β β β ββ
β β βΌ ββ
β β βββββββββββββββββββ ββ
β β β Prometheus β ββ
β β β (scraping) β ββ
β β ββββββββββ¬βββββββββ ββ
β β β ββ
β β βΌ ββ
β β βββββββββββββββββββ ββ
β β β Grafana β ββ
β β β (dashboards) β ββ
β β βββββββββββββββββββ ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β LOGGING ββ
β β ββ
β β All services log to stdout (JSON format) ββ
β β ββ
β β βββββββββββββββ βββββββββββββββ βββββββββββββββ ββ
β β β CloudWatch β or β Datadog β or β ELK β ββ
β β β Logs β β β β Stack β ββ
β β βββββββββββββββ βββββββββββββββ βββββββββββββββ ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β ALERTING ββ
β β ββ
β β Alert Rules: ββ
β β - Service down (health check fails) ββ
β β - High error rate (> 5% 5xx) ββ
β β - High latency (p99 > 5s) ββ
β β - Resource exhaustion (CPU > 80%, Memory > 80%) ββ
β β ββ
β β Channels: ββ
β β - Slack ββ
β β - PagerDuty ββ
β β - Email ββ
β β ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Key Metrics per Service¶
| Service | Key Metrics |
|---|---|
| org-services | Request rate, error rate, latency, DB connection pool |
| cat-runtime | Chat messages/sec, LLM latency, knowledge retrieval time |
| admin-ui | Page load time, API call latency, error rate |
| chat-ui | Message send latency, WebSocket connections, stream errors |
| bff | Request routing latency, upstream errors, connection pool |
Summary: Service Count Formula¶
Per Environment¶
| Component | Count |
|---|---|
| Shared Infrastructure | Fixed (MongoDB, Redis, S3, ECR, ALB) |
| Platform Services | 1 (platform-api with auth) |
| UI Services | 3 (admin-ui, chat-ui, bff) |
| Total Shared | ~6-8 services |
Per Organization¶
| Component | Count |
|---|---|
| org-services | 1 |
| monitoring | 1 (Prometheus + Grafana) |
| Total per Org | 2 services + cat-runtimes |
Per CAT¶
| Component | Count |
|---|---|
| cat-runtime-{type} | 1 |
| Total per CAT | 1 service |
Example: 3 Orgs with varying CATs¶
| Org | org-services | CAT Runtimes | Total |
|---|---|---|---|
| bastai | 1 | 3 (advisor, support, sales) | 4 |
| lurie | 1 | 2 (patient, scheduling) | 3 |
| acme | 1 | 1 (demo) | 2 |
| Org Total | 3 | 6 | 9 |
Grand Total: 8 shared + 9 org/CAT = 17 services
Compliance Requirements¶
HIPAA Compliance Checklist¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β HIPAA COMPLIANCE CHECKLIST β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Technical Safeguards: β
β βββββββββββββββββββββ β
β [ ] Access Control β
β - [ ] Unique user identification (user IDs) β
β - [ ] Automatic logoff (session timeout) β
β - [ ] Encryption at rest (MongoDB, S3) β
β - [ ] Encryption in transit (TLS 1.2+) β
β β
β [ ] Audit Controls β
β - [ ] MongoDB audit logging enabled β
β - [ ] Application-level audit logs β
β - [ ] CloudWatch/logging aggregation β
β - [ ] Log retention (6+ years) β
β β
β [ ] Integrity Controls β
β - [ ] Data validation on input β
β - [ ] Checksums for data transfer β
β β
β [ ] Transmission Security β
β - [ ] TLS 1.2+ for all connections β
β - [ ] VPC peering (no public internet for DB) β
β - [ ] API authentication (JWT/OAuth) β
β β
β Administrative Safeguards: β
β ββββββββββββββββββββββββββ β
β [ ] BAA signed with: β
β - [ ] MongoDB Atlas (per production cluster) β
β - [ ] AWS β
β - [ ] DuploCloud β
β - [ ] OpenAI (if using for PHI) β
β β
β [ ] Workforce training documentation β
β [ ] Security incident procedures β
β [ ] Data backup and disaster recovery plan β
β β
β Physical Safeguards: β
β ββββββββββββββββββββ β
β [ ] Cloud provider certifications (AWS, MongoDB Atlas) β
β [ ] No on-premise PHI storage β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
SOC2 Compliance Checklist¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SOC2 COMPLIANCE CHECKLIST β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Security (Common Criteria): β
β βββββββββββββββββββββββββββ β
β [ ] Access control policies β
β [ ] Network security (firewalls, VPC) β
β [ ] Vulnerability management β
β [ ] Security monitoring and alerting β
β [ ] Incident response procedures β
β β
β Availability: β
β βββββββββββββ β
β [ ] Uptime SLA defined (99.9%) β
β [ ] Disaster recovery plan β
β [ ] Backup procedures (daily, tested) β
β [ ] Multi-AZ deployment β
β β
β Confidentiality: β
β ββββββββββββββββ β
β [ ] Data classification β
β [ ] Encryption at rest and in transit β
β [ ] Data retention policies β
β [ ] Secure data disposal β
β β
β Processing Integrity: β
β βββββββββββββββββββββ β
β [ ] Input validation β
β [ ] Error handling β
β [ ] Quality assurance processes β
β β
β Privacy: β
β ββββββββ β
β [ ] Privacy notice β
β [ ] Consent management β
β [ ] Data subject rights (access, deletion) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
BAA Tracking¶
| Vendor | BAA Required | BAA Signed | Date | Reference |
|---|---|---|---|---|
| AWS | Yes | [ ] | - | - |
| MongoDB Atlas | Yes (per cluster) | [ ] | - | - |
| DuploCloud | Yes | [ ] | - | - |
| OpenAI | Conditional* | [ ] | - | - |
| WorkOS | Yes | [ ] | - | - |
*OpenAI BAA required only if PHI is sent to OpenAI APIs. Consider using Azure OpenAI with BAA for healthcare use cases.
Per-Organization Compliance Record¶
Each production org should have documentation for:
| Item | Description | Location |
|---|---|---|
| BAA Record | MongoDB Atlas BAA for org's cluster | org.baa_reference |
| Encryption Keys | KMS key ARN (if BYOK) | AWS Secrets Manager |
| Data Classification | PHI/PII data inventory | org.data_classification |
| Access Log | Who has access to org data | org.access_log |
| Audit Trail | Security events | audit_logs collection |
Document History¶
| Date | Author | Changes |
|---|---|---|
| 2026-01-10 | Claude | Initial architecture document |
| 2026-01-10 | Claude | Added HIPAA/SOC2 compliant MongoDB architecture (separate cluster per prod org) |
| 2026-01-10 | Claude | Updated org onboarding workflow with BAA and compliance phases |
| 2026-01-10 | Claude | Added Compliance Requirements section with HIPAA/SOC2 checklists |
| 2026-01-10 | Claude | Updated environment structure: dev-shared/demo-shared/prod-shared infrastructures |
| 2026-01-10 | Claude | Added shared tenant per env ({env}-shared) + org tenants ({env}-{org}) |
| 2026-01-10 | Claude | Updated MongoDB: bast-nonprod (dev), bast-demo (demo), prod-{org} (prod) |
| 2026-01-10 | Claude | Replaced np-poc with dev-shared infrastructure; standardized naming to {env}-shared pattern |
| 2026-01-10 | Claude | Added Deployment Methods section clarifying Terraform vs CI/CD vs Admin UI deployment paths |
| 2026-01-10 | Claude | Implemented Platform API Authentication: user DTOs, auth service (JWT/bcrypt), user service (CRUD, memberships, invitations), auth router with register/login/refresh/me endpoints |
| 2026-01-10 | Claude | Added OAuth support (Google/Microsoft Sign-In) to Platform API with oauth.py router, session token exchange flow |
| 2026-01-10 | Claude | Implemented Admin UI Authentication: BFF auth tRPC router (auth.ts), auth context (auth-context.tsx), auth types (auth.ts), LoginScreen with OAuth buttons, RegisterScreen with password validation, AuthCallback for OAuth flow handling |
| 2026-01-26 | Claude | Added Theme management to CAT model: Theme entity (1:N with Org, 1:1 optional with CAT), themes collection, theme_id field in CAT, ThemeConfig properties (colors, typography, radius, shadow, button_style, etc.) |