.github/9
ISSUE_TEMPLATE/3bug_report.md config.yml feature_request.md
workflows/3ci.yml clean-clone.yml release.yml
CODEOWNERS dependabot.yml pull_request_template.md
apps/630
api/250
src/243
common/30
__tests__/3authorize.test.ts bigint-serialization.interceptor.test.ts files-limits.test.ts
filters/1all-exceptions.filter.ts
guards/3auth.guard.ts internal-service.guard.ts rate-limit.guard.ts
interceptors/2actor-context.interceptor.ts bigint-serialization.interceptor.ts
middleware/2idempotency.test.ts idempotency.ts
pipes/1zod-validation.pipe.ts
actor-context.ts audit.service.ts cache.test.ts cache.ts cookies.ts core.module.ts deprecation.ts email.service.ts errors.ts event-bus.ts log-scrubber.test.ts log-scrubber.ts logger.ts permission-cache-bridge.ts prisma.service.ts redis.service.ts trace-metadata.ts types.ts
config/1env.ts
lib/11
__tests__/5crypto.test.ts filter-builder.test.ts jwt.test.ts pagination.test.ts positions.test.ts
authorize.ts crypto.ts filter-builder.ts jwt.ts pagination.ts positions.ts
modules/197
ai/28
__tests__/4ai-writing.test.ts database-ai.test.ts generate-executor.test.ts prompts.test.ts
generator/4executor.ts generate.controller.ts generate.dto.ts generate.service.ts
ai-chat.service.ts ai-rate-limit.ts ai-writing.controller.ts ai-writing.dto.ts ai-writing.service.ts ai.controller.ts ai.module.ts ai.service.ts budget-guard.service.ts database-ai.controller.ts database-ai.dto.ts database-ai.service.ts db-prompts.ts dto.ts gateway-provider.ts ledger.service.ts prompts.ts rag.controller.ts rag.dto.ts rag.service.ts
api-keys/3api-keys.controller.ts api-keys.module.ts api-keys.service.ts
audit/2audit-log.controller.ts audit.module.ts
auth/4auth.controller.ts auth.module.ts auth.service.ts dto.ts
automations/5automations.controller.ts automations.module.ts automations.service.ts dto.ts webhook-incoming.controller.ts
blocks/5
__tests__/1batch-version-cas.test.ts
block.service.ts blocks.controller.ts blocks.module.ts dto.ts
comments/4comments.controller.ts comments.module.ts comments.service.ts dto.ts
databases/9
__tests__/3normalize-select-options.test.ts option-id-canonicalization.test.ts record-open-query-shape.test.ts
database.service.ts databases.controller.ts databases.module.ts dto.ts property-cache-schema.ts query.service.ts
docs/2docs.controller.ts docs.module.ts
files/10
__tests__/1quota.test.ts
dto.ts files.controller.ts files.module.ts files.service.ts quota.ts record.ts s3.ts uploads.controller.ts uploads.service.ts
forms/18debug.controller.ts form.dto.ts forms.controller.ts forms.module.ts forms.service.ts markdown.test.ts markdown.ts optional-auth.guard.ts public-forms.controller.ts public-forms.service.ts question.dto.ts questions.service.ts rate-limit.ts recaptcha.ts slug.ts submissions.controller.ts submissions.service.ts submit-schema.ts
health/3health.controller.ts health.module.ts health.service.ts
integrations/3integrations.controller.ts integrations.module.ts integrations.service.ts
internal/12
__tests__/2flush-query-shape.test.ts internal.endpoints.test.ts
ai-test-seam.controller.ts ai-test-seam.dto.ts ai-test-seam.service.ts internal.controller.ts internal.dto.ts internal.module.ts internal.service.ts test-seam.controller.ts test-seam.dto.ts test-seam.service.ts
notifications/3notifications.controller.ts notifications.module.ts notifications.service.ts
oauth/6
__tests__/1oauth.scopes.test.ts
oauth.controller.ts oauth.module.ts oauth.service.ts scopes.ts token-keys.ts
org/15audit.service.ts embed-preview.controller.ts guards.ts members.service.ts org-admin.controller.ts org-policy.service.ts org.module.ts overview.service.ts policy-effective.controller.ts policy.schema.ts policy.test.ts retention.service.ts totp.test.ts totp.ts two-factor.service.ts
orgs/5dto.ts orgs.controller.ts orgs.module.ts orgs.service.ts util.ts
pages/4dto.ts page.service.ts pages.controller.ts pages.module.ts
scim/15
__tests__/3email-mapping.test.ts etag.test.ts filters.test.ts
etag.ts filters.ts groups.service.ts schemas.ts scim-admin.controller.ts scim-admin.service.ts scim-auth.guard.ts scim-auth.service.ts scim-errors.ts scim.controller.ts scim.module.ts users.service.ts
search/4
__tests__/1search.service.test.ts
search.controller.ts search.module.ts search.service.ts
sessions/3sessions.controller.ts sessions.module.ts sessions.service.ts
share/3share.controller.ts share.module.ts share.service.ts
sso/16
__tests__/4enforcement.test.ts oidc.verify.test.ts provisioning.test.ts saml.validate.test.ts
enforcement.ts oidc.controller.ts oidc.service.ts oidc.ts provisioning.service.ts saml.controller.ts saml.ts schemas.ts sso-admin.controller.ts sso-admin.service.ts sso-secrets.ts sso.module.ts
teams/4dto.ts teams.controller.ts teams.module.ts teams.service.ts
users/4dto.ts users.controller.ts users.module.ts users.service.ts
webhooks/3webhooks.controller.ts webhooks.module.ts webhooks.service.ts
workspaces/4dto.ts workspaces.controller.ts workspaces.module.ts workspaces.service.ts
types/1xmldom.d.ts
app.module.ts constants.ts main.ts
_probe_rawbody.cjs .env.example Dockerfile package.json README.md tsconfig.json vitest.config.ts
realtime/33
src/17auth.ts comments.ts config.ts event-source.ts http-store.ts index.ts metrics.ts notifications.ts page-updated-source.ts presence.ts prisma-store.ts protocol.ts rate-limit.ts room-key.ts rooms.ts server.ts update-log.ts
test/11auth.test.ts config.test.ts event-source.test.ts http-store.test.ts metrics-merge.test.ts page-updated-source.test.ts presence.test.ts protocol.test.ts rate-limit.test.ts rooms.test.ts task-0094-builders.test.ts
.env.example Dockerfile package.json README.md tsconfig.json
web/255
src/244
app/45
__tests__/1theme-tokens.test.ts
(app)/26
w/25
[workspace]/25
ask/1page.tsx
databases/1
[id]/1page.tsx
favorites/1page.tsx
files/1page.tsx
notifications/1page.tsx
page/4
[id]/4
[block]/1page.tsx
share/1page.tsx
layout.tsx page.tsx
search/1page.tsx
settings/10
appearance/1page.tsx
automations/3
[id]/1page.tsx
new/1page.tsx
page.tsx
billing/1page.tsx
developers/1page.tsx
members/1page.tsx
permissions/1page.tsx
teams/1page.tsx
page.tsx
shared/1page.tsx
templates/1page.tsx
trash/1page.tsx
layout.tsx page.tsx
layout.tsx
(auth)/4
login/1page.tsx
register/1page.tsx
reset-password/1page.tsx
layout.tsx
api/2
metrics/1route.ts
v1/1
health/1route.ts
f/1
[slug]/1page.tsx
health/1
ready/1route.ts
org/2
[orgId]/2
admin/2
integrations/1page.tsx
page.tsx
share/1
[id]/1page.tsx
error.tsx global-error.tsx globals.css layout.tsx not-found.tsx page.tsx providers.tsx
components/118
admin/10
org-admin/8ApiKeysTab.tsx AuditTab.tsx MembersTab.tsx OverviewTab.tsx PoliciesTab.tsx RetentionTab.tsx WebhooksTab.tsx WorkspacePicker.tsx
ScimCard.tsx SsoTabs.tsx
ai/6ai-panel.tsx ask-ai-submenu.tsx db-ai-dialog.tsx generate-page-dialog.tsx writing-actions-menu.tsx writing-diff.tsx
automations/5action-editor.tsx condition-editor.tsx lib.ts run-history.tsx trigger-editor.tsx
collaboration/6CursorLayer.tsx OfflineBanner.tsx PresenceBar.tsx README.md ReviewFailedDialog.tsx StatusChip.tsx
comments/3comment-panel.tsx comment-thread.tsx mention-input.tsx
database/27
__tests__/2cell-editor.test.tsx cell-renderer.test.tsx
AiExtractDialog.tsx AiFormulaDialog.tsx AiGenerateDialog.tsx board-view.tsx buttons-panel.tsx calendar-view.tsx cell-editor.tsx cell-renderer.tsx chart-view.tsx database-page-view.tsx database-toolbar.tsx database-view-renderer.tsx db-embedded.tsx filter-builder.tsx form-builder-view.tsx formula-editor.tsx gallery-view.tsx group-builder.tsx list-view.tsx property-editor.tsx record-header.tsx record-panel.tsx sort-builder.tsx table-view.tsx timeline-view.tsx
dialogs/7
__tests__/1move-to-dialog.test.tsx
create-dialog.tsx dialog.tsx file-permissions-dialog.tsx invite-dialog.tsx move-to-dialog.tsx share-dialog.tsx
editor/19
__tests__/3code-block-text.test.ts code-block.test.tsx expandable.test.tsx
block-card.tsx block-renderer.tsx block-save-queue.ts block-toolbar.tsx context-menu.tsx expandable.tsx history-popover.tsx inline-editor.tsx insert-dialog.tsx page-canvas.tsx page-spinner.tsx page-view.tsx selection-toolbar.tsx slash-menu.tsx template-dialog.tsx type-menu.tsx
files/4FileBlock.tsx FileBrowser.tsx FilePicker.tsx PreviewModal.tsx
form/4form-field.tsx form-renderer.tsx form-responses-view.tsx form-view.tsx
layout/8
__tests__/1page-tree-icon.test.tsx
command-palette.tsx factory-logo.tsx page-tree-node.tsx sidebar.tsx theme-provider.tsx topbar.tsx workspace-shell.tsx
mentions/3
__tests__/1mention-model.test.ts
mention-model.ts MentionPopup.tsx
search/3ask-ai-search.tsx results-list.tsx search-dialog.tsx
settings/10
api-keys/4ApiKeyCreateDialog.tsx ApiKeyRevealDialog.tsx ApiKeyTable.tsx ScopesBadge.tsx
webhooks/5CurlExamples.tsx DeliveryInspector.tsx EventExplorer.tsx OverviewTab.tsx WebhooksTab.tsx
settings-shell.tsx
ui/3confirm-dialog.tsx form.tsx toaster.tsx
hooks/21
__tests__/4realtime-frame-handler.test.ts use-blocks.test.ts use-database-options.test.ts use-workspace.test.tsx
realtime-frame-handler.ts use-ai-stream.ts use-auth.ts use-blocks.ts use-database.ts use-db-ai-stream.ts use-forms.ts use-members.ts use-mention-sources.ts use-notifications.ts use-offline-status.ts use-pages.ts use-presence-announcer.ts use-presence-toasts.ts use-presence.ts use-realtime.ts use-workspace.ts
lib/50
__tests__/21ai-database.test.ts ai-generate.test.ts ai-sse.test.ts ai-writing.test.ts api-keys.test.ts api-members.test.ts auth-refresh.test.ts auth-store.test.ts batch-queue-drop.test.ts block-content.test.ts clipboard-import.test.ts code-highlight.test.ts offline-status.test.ts presence-announcer.test.ts presence-color.test.ts presence-cursor.test.ts presence-emitter.test.ts realtime-url.test.ts search.test.ts utils.test.ts writing-diff.test.ts
files/7
__tests__/2picker.test.ts upload.test.ts
api.ts picker.ts upload-store.ts upload.ts use-file-uploads.ts
ai-database.ts ai.ts api-keys.ts api.ts auth-store.ts batch-queue.ts block-content.ts clipboard-import.ts code-highlight.ts constants.ts offline-status.ts org-admin.ts presence-announcer.ts presence-color.ts presence-cursor.ts presence-editor-views.ts presence-emitter.ts query-client.ts realtime.ts search.ts types.ts utils.ts
stores/8
__tests__/1block-patch-store.test.ts
block-patch-store.ts comment-pill-store.ts database-store.ts editor-store.ts offlineQueue.ts presence-store.ts ui-store.ts
instrumentation.ts middleware.ts
.env.example Dockerfile next-env.d.ts next.config.mjs package.json postcss.config.mjs README.md tailwind.config.ts tsconfig.json tsconfig.tsbuildinfo vitest.config.ts
worker/92
src/87
__tests__/13ai-embedding.test.ts ai-request.test.ts ai-usage-budget.test.ts audit-export.test.ts email-decision.test.ts encrypt.test.ts health-search-index-lag.test.ts mime.test.ts retention.test.ts s3-sign.test.ts search-index.test.ts smtp.test.ts webhook-sign.test.ts
health/1server.ts
lib/12
__tests__/1clamav.test.ts
clamav.ts encrypt.ts job-otel.ts mime.ts notify.ts prisma.ts redis-stream.ts redis.ts s3.ts sharp.ts smtp.ts
processors/56
automations/28
__tests__/3condition-evaluator.spec.ts executors.spec.ts run-pipeline.spec.ts
executors/17assign-user.ts call-integration.ts change-status.ts classify.ts create-notification.ts create-page.ts email-cap.ts helpers.ts integration-registry.ts permission.ts record-write.ts registry.ts run-ai-action.ts send-email.ts send-webhook.ts types.ts update-record.ts
condition-evaluator.ts dead-letter.ts log.ts matcher.ts pipeline.ts run-state.ts schedule.ts watchdog.ts
files/15
__tests__/4errors.test.ts scan-gate.test.ts status.test.ts temp.test.ts
steps/4finalize.ts metadata.ts scan.ts thumbnails.ts
cleanup.ts errors.ts generateThumbs.ts processor.ts status.ts temp.ts types.ts
search-index/4builders.ts grants.ts index.ts processor.ts
ai-embedding.ts ai.processor.ts audit-export.ts automations.processor.ts email-decision.processor.ts email.processor.ts maintenance.processor.ts retention.ts webhooks.processor.ts
config.ts events.ts index.ts logger.ts queues.ts
.env.example Dockerfile package.json README.md tsconfig.json
docs/73
api/17ai.md authentication.md automations.md blocks.md comments.md databases.md files.md forms.md openapi.yaml org-admin.md pages.md scim.md search.md sso.md versioning.md webhooks.md workspaces.md
architecture/10ai-architecture.md automation.md backend-architecture.md database-architecture.md frontend-architecture.md realtime-architecture.md search-architecture.md security-architecture.md storage.md system-architecture.md
database/2database-architecture.md redis-keys.md
development/8admin-guide.md coding-standards.md deployment.md development-guide.md files-pipeline.md perf-report.md performance.md testing.md
product/4functional-requirements.md non-functional-requirements.md product-requirements.md ux-requirements.md
requirements/1requirements-matrix.md
security/5audit-report.md files.md forms.md license-allowlist.md security-architecture.md
tasks/16phase-00-foundation.md phase-01-authentication.md phase-02-workspace.md phase-03-pages.md phase-04-editor.md phase-05-databases.md phase-06-relations.md phase-07-collaboration.md phase-08-search.md phase-09-files.md phase-10-forms.md phase-11-automation.md phase-12-ai.md phase-13-api.md phase-14-enterprise.md phase-15-production.md
ui/9ai.md automations.md design-system.md developers.md files.md forms.md org-admin.md scim.md sso.md
support-matrix.md
infrastructure/71
caddy/1Caddyfile
docker/6
init/101-extensions.sql
opensearch/1init-indices.json
.env.docker docker-compose.yml opensearch-init.sh README.md
kubernetes/40
observability/20
alertmanager/1alertmanager.yaml
grafana/8
dashboards/6ai.json api-overview.json infra.json realtime.json search.json workers-queues.json
provisioning/2
dashboards/1dashboards.yaml
datasources/1datasource.yaml
prometheus/3alerts.yaml recording-rules.yaml scrape.yaml
scripts/1sync-sources.mjs
alertmanager.yaml grafana.yaml kustomization.yaml namespace.yaml node-exporter.yaml otel-collector.yaml prometheus.yaml
postgres/7configmap.yaml cronjob-backup.yaml cronjob-opensearch-snapshot.yaml pgbouncer.yaml replica.yaml statefulset.yaml walg-iam-policy.yaml
api.yaml configmap.yaml ingress.yaml kustomization.yaml namespace.yaml networkpolicy.yaml pdb.yaml README.md realtime.yaml redis.yaml secret.example.yaml web.yaml worker.yaml
nginx/2nginx.conf README.md
observability/14
alertmanager/1alertmanager.yaml
grafana/8
dashboards/6ai.json api-overview.json infra.json realtime.json search.json workers-queues.json
provisioning/2
dashboards/1dashboards.yaml
datasources/1datasource.yaml
prometheus/3alerts.yaml recording-rules.yaml scrape.yaml
scripts/1dashboard-completeness.mjs
README.md
terraform/8compute.tf data.tf main.tf network.tf outputs.tf README.md security.tf variables.tf
packages/289
ai/24
src/20
providers/7anthropic.ts google.ts http.ts index.ts openai-compatible.ts rag.test.ts writing.test.ts
schemas/2database.ts generate.ts
adapters.test.ts config.test.ts config.ts gateway.test.ts gateway.ts index.ts tools.test.ts tools.ts types.ts usage.test.ts usage.ts
package.json README.md tsconfig.json vitest.config.ts
auth/11
src/7index.ts passwords.test.ts passwords.ts sessions.test.ts sessions.ts tokens.test.ts tokens.ts
package.json README.md tsconfig.json vitest.config.ts
collaboration/17
src/13awareness.ts codec.test.ts codec.ts index.ts lww.test.ts lww.ts mapping.ts offline.ts outbox.test.ts outbox.ts provider.test.ts provider.ts types.ts
package.json README.md tsconfig.json vitest.config.ts
config/7
src/4eslint.base.js index.ts prettier.base.json tsconfig.base.json
package.json README.md tsconfig.json
database-client/5
src/2index.test.ts index.ts
package.json README.md tsconfig.json
database-engine/33
src/29
filter/2filter.test.ts index.ts
formula/8evaluator.ts formula.test.ts functions.ts index.ts lexer.ts parser.ts types.ts validate.ts
query/6group.ts index.ts paginate.ts pivot.ts query.test.ts sort.ts
relations/2index.ts relations.test.ts
rollups/2index.ts rollups.test.ts
values/5dates.ts index.ts registry.ts types.ts values.test.ts
views/3buttons.ts index.ts views.test.ts
index.ts
package.json README.md tsconfig.json vitest.config.ts
editor/25
src/21
marks/1highlight.ts
nodes/2equation.ts mention.ts
autosave.test.ts autosave.ts clipboard.test.ts clipboard.ts codec.test.ts codec.ts context-menu.test.ts context-menu.ts diff.test.ts diff.ts factory.ts history.test.ts history.ts index.ts positions.ts slash.test.ts slash.ts types.ts
package.json README.md tsconfig.json vitest.config.ts
observability/20
src/16
__tests__/8db-redis-metrics.test.ts metrics.test.ts otel.test.ts pino-otel.test.ts prometheus.test.ts resource.test.ts scrubber.test.ts traceparent.test.ts
index.ts metrics.ts otel.ts pino-otel.ts prometheus.ts resource.ts scrubber.ts traceparent.ts
package.json README.md tsconfig.json vitest.config.ts
permissions/11
src/7index.ts levels.test.ts levels.ts resolve.test.ts resolve.ts rules.test.ts rules.ts
package.json README.md tsconfig.json vitest.config.ts
search/22
src/18chunking.test.ts chunking.ts client.test.ts client.ts embeddings.test.ts embeddings.ts hybrid.test.ts hybrid.ts index.ts indexer.test.ts indexer.ts mapping.test.ts mapping.ts queries.test.ts queries.ts rrf.test.ts rrf.ts types.ts
package.json README.md tsconfig.json vitest.config.ts
shared/61
src/57
dto/17ai.dto.ts auth.dto.test.ts auth.dto.ts block.dto.ts browser-safety.test.ts comment.dto.ts database.dto.test.ts database.dto.ts file.dto.ts formula-ast.ts index.ts notification.dto.ts page.dto.ts search.dto.ts share.dto.ts webhook.dto.ts workspace.dto.ts
events/8audit-catalog.test.ts audit-catalog.ts audit-csv.test.ts audit-csv.ts audit-scope.test.ts audit-scope.ts catalog.test.ts catalog.ts
realtime/6comment-events.ts frames.test.ts frames.ts notification-policy.ts notification-prefs.ts task-0094.test.ts
automation.test.ts automation.ts constants.ts crypto.test.ts crypto.ts env.ts errors.ts events.test.ts events.ts forms.test.ts forms.ts index.ts markdown.test.ts markdown.ts mentions.test.ts mentions.ts net.test.ts net.ts positions.test.ts positions.ts presence.test.ts presence.ts security-headers.ts webhook-delivery.test.ts webhook-delivery.ts webhook-events.ts
package.json README.md tsconfig.json vitest.config.ts
storage/16
src/12client.test.ts client.ts index.ts keys.test.ts keys.ts mime.test.ts mime.ts presign.test.ts presign.ts thumbnails.test.ts thumbnails.ts types.ts
package.json README.md tsconfig.json vitest.config.ts
ui/37
src/33
components/19avatar.tsx badge.tsx button.tsx checkbox.tsx command.tsx context-menu.tsx dialog.tsx dropdown-menu.tsx empty-state.tsx index.ts popover.tsx separator.tsx skeleton.tsx slider.tsx spinner.tsx switch.tsx tabs.tsx toast.tsx tooltip.tsx
color.ts command-filter.test.ts command-filter.ts focus.test.ts focus.ts formatters.test.ts formatters.ts index.ts theme.test.ts theme.ts toast-store.test.ts toast-store.ts tokens.test.ts tokens.ts
package.json README.md tsconfig.json vitest.config.ts
prisma/16
migrations/13
20260927000000_init/1migration.sql
20260928000000_search_documents_content_hash/1migration.sql
20260929000000_workspace_usage_storage_bytes/1migration.sql
20260930000000_form_submitted_notification_type/1migration.sql
20261001000000_ai_phase12/1migration.sql
20261002000000_webhooks_secret_encrypted_dlq/1migration.sql
20261002111436_webhook_delivery_latency/1migration.sql
20261002120000_org_admin_2fa_retention_unique/1migration.sql
20261002215124_audit_export/1migration.sql
20261003210000_perf_indexes_hot_paths/1migration.sql
20261004004500_perf_indexes_hot_paths_2/1migration.sql
migration_lock.toml README.md
schema.prisma seed.ts verify.ts
scripts/7backup-health.ts docs-completeness.mjs generate-openapi.mjs minio-init.ts opensearch-reindex.ts storage-orphans.ts verify-clean-clone.sh
tests/169
e2e/63
.auth/1user.json
fixtures/7
files/6clip.mp4 clip.wav clip.webm hero-1400.png note.docx note.txt
realtime.ts
mocks/2oidc-issuer.ts saml-idp.ts
playwright-report/3
data/2a6557bae9c2714a658968d4eb8534195c08ebda8.png e3092d07d00a16063e46385c02a559a9054fa847.webm
index.html
reports/1files-security.json
specs/34ai-database.spec.ts ai-generate.spec.ts ai-rag.spec.ts ai-security.spec.ts ai-writing.spec.ts ai.spec.ts api-keys.spec.ts appearance-theme.spec.ts auth.spec.ts automation.spec.ts collab-two-tab.spec.ts comments.spec.ts databases.spec.ts default-workspace-alias.spec.ts developers.spec.ts editor.spec.ts files.spec.ts final-flow.spec.ts forms.spec.ts oauth.spec.ts org-admin.spec.ts pages.spec.ts performance.spec.ts presence-cursors.spec.ts qa-paste-toggle.spec.ts realtime.spec.ts scim.spec.ts search-index-lag.spec.ts search.spec.ts sharing.spec.ts sso.spec.ts task-0094-comments-notifications.spec.ts webhooks.spec.ts workspace.spec.ts
test-results-final-flow/3
final-flow-Release-v1-0-fi-6c06b-w-state-carries-sequential--chromium-desktop/2test-failed-1.png trace.zip
.last-run.json
utils/4api.ts dnd.ts search-lag.ts wait.ts
.gitignore fixtures.ts global-setup.ts package.json playwright.config.ts playwright.final-flow.config.ts README.md tsconfig.json
fixtures/1
files/1make-sparse.ts
integration/60
ai-capability/2ai-app.capability.test.ts gateway.capability.test.ts
drill/2seed-drill.mjs verify-restore.mjs
fixtures/5
files/5clip.mp4 clip.wav doc.pdf hero-1400.png note.txt
helpers/3api.ts containers.ts seed.ts
realtime/11control-channel.test.ts convergence.test.ts flush-rebase-http.test.ts handshake.test.ts heartbeat-limits.test.ts lifecycle.test.ts presence.test.ts rebase.test.ts resume.test.ts rt-helpers.ts task-0094-fanout.test.ts
ai-chat.integration.test.ts ai-database.integration.test.ts ai-generate.integration.test.ts ai-rag.integration.test.ts ai-writing.integration.test.ts api-keys.integration.test.ts audit-completeness.integration.test.ts audit-export-s3.integration.test.ts auth.integration.test.ts automation-pipeline.integration.test.ts automations.integration.test.ts blocks.integration.test.ts cache-invalidation.integration.test.ts comments.integration.test.ts databases.integration.test.ts files-lifecycle.integration.test.ts files-pipeline.integration.test.ts files-security.integration.test.ts files.integration.test.ts forms-responses.integration.test.ts forms.integration.test.ts oauth.integration.test.ts openapi.contract.test.ts org-admin.integration.test.ts package.json pages.integration.test.ts permissions.integration.test.ts README.md replica-routing.integration.test.ts retention-engine.integration.test.ts scim.integration.test.ts search.integration.test.ts sso.integration.test.ts tsconfig.json vitest.config.ts webhooks.integration.test.ts workspace.integration.test.ts
performance/28
fixtures/1search-100k.ts
helpers/2seed-100k.mjs seed-1k-load.mjs
reports/7api-load-smoke.json database-load-smoke.json editor-local.json realtime-load.json search-full.json search-last.json search-reduced.json
api-load.js api.js archive.tar database-load.js database.js editor-local.mjs extract-100k-env.mjs package.json README.md realtime-1k.js realtime-load.js realtime.js run-realtime-load.sh search-search.k6.js search-summary.json seed-100k.mjs threshold-breach-demo.js verify-zero-op-loss.mjs
security/16
helpers/1app.ts
audit-report.test.ts auth-paths.test.ts deps.test.ts formula-fuzz.test.ts gitleaks-config.test.ts headers.test.ts images.test.ts oracle.ts package.json permission-fuzz.test.ts rate-limits.test.ts README.md tsconfig.json upload-abuse.test.ts vitest.config.ts
README.md
.dockerignore .env .env.bak-task0125 .env.example .eslintrc.json .gitignore .npmrc .prettierignore .prettierrc.json AGENTS.md ARCHITECTURE.md CHANGELOG.md CONTRIBUTING.md gitleaks.toml LICENSE package.json pnpm-lock.yaml pnpm-workspace.yaml PRODUCT-SPEC.md README.md ROADMAP.md SECURITY.md tsconfig.json turbo.json
system-architecture.mddocs/architecture/system-architecture.md← architecture31,098 B← Back to the app

System Architecture

AI Software Factory — overall system design. This document is the top-level view; deep dives live in the sibling documents: frontend · backend · database · realtime · search · ai · security.

Authority order: ARCHITECTURE.md → this document → PRODUCT-SPEC.md. Conflicts are recorded in the relevant task file (docs/tasks/) rather than resolved by guesswork.


1. System Overview

AI Software Factory is a Notion-like, self-hostable, multi-tenant collaborative workspace platform. The system is a modular monolith plus four runtime apps, a set of shared packages, and five backing systems (PostgreSQL, Redis, S3-compatible object storage, OpenSearch, ClamAV).

 USERS (browsers)
   │  HTTPS (REST) / WSS (realtime)
   ▼
┌────────────────────────────────────────────────────────────────────┐
│  edge: nginx (TLS termination, WS upgrade, gzip, security headers) │
└────────────────────────────────────────────────────────────────────┘
   │                        │                          │
   ▼                        ▼                          ▼
┌──────────┐        ┌───────────────┐         ┌───────────────┐
│ apps/web │        │   apps/api    │         │ apps/realtime │
│ Next.js  │──REST──▶ NestJS        │         │ ws + Yjs sync │
│ 14 SSR   │        │ modular       │         │ rooms/presence│
│ + editor │        │ monolith      │         └───────┬───────┘
└──────────┘        └───────┬───────┘                 │
                            │                ┌────────┴────────┐
        ┌───────────────────┼────────────────┤                │
        ▼                   ▼                ▼                ▼
  ┌────────────┐     ┌──────────────┐  ┌──────────────┐  ┌───────────┐
  │ PostgreSQL │     │     Redis    │  │ apps/worker  │  │ OpenSearch│
  │ (Prisma,   │     │ cache+streams│  │ BullMQ: auto-│  │ full-text │
  │ system of  │     │ +queues      │  │ mation, files│  │ + kNN     │
  │ record)    │     └──────────────┘  │ index, hooks │  └───────────┘
  └────────────┘                        └──────┬───────┘        ▲
        ▲                                      │                │
        │                    ┌─────────────────┘                │
        ▼                    ▼                                  │
  ┌──────────────┐    ┌──────────────┐                          │
  │ S3 / MinIO   │    │ ClamAV       │        domain events ────┘
  │ objects      │    │ (scan)       │        (Redis streams)
  └──────────────┘    └──────────────┘

1.1 Runtime Apps

App Runtime Ports Responsibility Scales as
apps/web Next.js 14 (App Router), React 18 3000 UI, block editor, database views, offline client state, BFF route handlers Stateless, horizontally
apps/api Node 20, NestJS 4000 REST API v1, auth, all 16 domain modules, event bus producer Stateless, horizontally (HPA)
apps/worker Node 20, BullMQ — (queue consumer) Automation runs, file pipeline (scan/thumbnails), search indexing, webhooks, AI jobs, email Stateless consumers, horizontally per queue
apps/realtime Node 20, ws + Yjs 4001 Yjs CRDT sync, presence, cursors, realtime comments/notifications Sharded by page hash (sticky rooms)

1.2 Shared Packages

Package Responsibility
packages/shared DTOs, Zod schemas, domain event contracts, ApiError codes, constants — the single source of truth for wire format, used by web, api, worker, realtime
packages/auth JWT issuing/verification, refresh-token rotation, session management, SSO helpers (SAML/OIDC)
packages/permissions RBAC + resource-level permission engine (pure evaluation, used by api guards and search indexer)
packages/database-engine Properties, views, filters, sort, group, relations, rollups, safe formula AST evaluator, buttons — no Prisma imports
packages/editor Tiptap-based block editor: extensions, slash menu, context menus, DnD, fractional-position engine
packages/collaboration Yjs provider, awareness (presence/cursors), offline queue (IndexedDB), block tree ↔ Yjs doc codec
packages/search OpenSearch client, index schema, indexer logic, hybrid (keyword + semantic) query builders
packages/ai AI gateway + provider abstraction (OpenAI / Anthropic / Google / OSS / custom), RAG pipeline
packages/storage S3-compatible client, presigned upload pipeline, thumbnails, metadata extraction
packages/ui Design system: shadcn/ui components + CSS design tokens (light/dark/system)
packages/config Shared ESLint / Prettier / tsconfig presets

1.3 Backing Systems

System Role Self-hosted reference
PostgreSQL 15+ System of record (Prisma). All tenant data, versions, audit RDS or plain cluster + PITR
Redis 7+ Caching, BullMQ queues, domain-event streams (XADD/XREADGROUP), rate-limit counters, Yjs update log ElastiCache or single instance (dev)
S3-compatible storage File objects, private buckets, short-lived signed URLs MinIO (dev), S3/GCS/NFS-backed (prod)
OpenSearch 2.x Full-text (BM25), prefix/fuzzy, kNN vector store, metadata filters Single node (dev), cluster (prod)
ClamAV Virus scanning in the file pipeline Sidecar container

2. Data Flow Diagrams

2.1 Synchronous Request Path (REST)

Browser
  │ 1. HTTPS POST /v1/pages  (Bearer JWT or cookie)
  ▼
nginx ── 2. TLS terminate, X-Forwarded-For, security headers ──▶
apps/api (NestJS)
  │ 3. Global pipes: ZodValidationPipe (packages/shared schema)
  │ 4. Guards (in order):
  │      ApiKeyAuthGuard | JwtAuthGuard        → resolve principal (user/apiKey)
  │      TenantGuard                               → resolve workspaceId, attach to ctx
  │      PermissionGuard (packages/permissions)    → evaluate resource × level
  │      RateLimitGuard                            → Redis sliding window
  │ 5. Controller → ApplicationService
  │ 6. Service → Repository (Prisma) ──▶ PostgreSQL   [tx: mutation + audit_log row]
  │ 7. Service → EventBus.publish('page.created') ──▶ Redis XADD factory:events
  │ 8. Repository → DTO (packages/shared serializer)
  ▼
Browser ◀── 201 JSON { data: PageDto, error: null }

Key properties:

2.2 Event Path (async side effects)

 apps/api (or apps/realtime, or apps/worker)
   │  EventBus.publish('record.updated', envelope)
   ▼
 Redis stream  factory:events
   │  consumer groups (one per consumer, independent lag)
   ├──────────────────────┬──────────────────────┬───────────────────────┐
   ▼                      ▼                      ▼                       ▼
 search-indexer         webhook-dispatcher     automation-engine      notification-
 (worker: index into    (worker: sign payload,  (worker: match         fan-out (worker:
 OpenSearch, chunk +    POST w/ retry/backoff,  triggers → conditions  in-app rows +
 embed via AI gateway)  delivery log)           → actions → BullMQ)    email)

2.3 Realtime Path (editing)

Browser A (Tiptap + y-prosemirror)
  │ WebSocket /realtime?token=<JWT>&page=<pageId>
  ▼
apps/realtime (room = hash(workspaceId, pageId) → instance)
  │ 1. auth: verify JWT, check EDIT/VIEW permission for page
  │ 2. hydrate Y.Doc from PostgreSQL blocks (if no cached doc)
  │ 3. apply incoming Yjs updates to server doc (server is authoritative while editing)
  │ 4. broadcast update to other peers in room (≤ 200 ms p95 budget)
  │ 5. debounced (1 s) persist: server doc → block rows (re-encode Yjs → Block tree)
  │ 6. on persist: EventBus.publish('page.updated', { pageId, blockDelta, actor })
  ▼
PostgreSQL (source of truth at rest)

Full protocol, room model, resume, and failure modes: realtime.

2.4 Search Query Path

Browser (Cmd/Ctrl+K)
  │ POST /v1/search { query, types[], filters, mode: "fulltext"|"hybrid" }
  ▼
apps/api SearchModule ──▶ packages/search
  │ build OpenSearch query:
  │   • bool: must(match/multi_match/prefix/fuzzy)
  │           + filter(terms: workspace_id, type,
  │                    permission grants snapshot  ← packages/permissions)
  │   • hybrid mode: BM25 ⊕ kNN (top_k) → RRF fusion
  │   • hybrid+answer: top-N chunks → AI gateway (RAG) → answer + citations
  ▼
OpenSearch ◀── filtered, ranked docs ──▶ JSON results (≤ 500 ms p95)

Indexing pipeline and lag SLA: search.

2.5 AI Generation Path (structured tool calls)

Browser "generate a product launch plan page"
  │ POST /v1/ai/generate { intent, context: {parentId} }
  ▼
apps/api AIModule → packages/ai gateway
  │ 1. RAG retrieval: hybrid search for relevant workspace context (optional)
  │ 2. LLM call with tool schemas: create_page, add_blocks, create_database, ...
  │ 3. LLM returns tool calls (NOT raw SQL / raw block JSON)
  │ 4. Gateway validates each call against Zod tool schemas
  │ 5. Tool executor calls the SAME application services the REST API uses
  │    (PageService.create, BlockService.bulkCreate, DatabaseService.create)
  │      → each performs its own permission check, audit row, domain event
  ▼
Browser receives { generated: [{type: "page", id}, {type: "database", id}] }

Design: ai.


3. Deployment Topology

3.1 Local Development

infrastructure/docker/docker-compose.yml:

Service Image Notes
postgres postgres:15 volume, port 5432, init from prisma/
redis redis:7 port 6379
minio + minio-console minio/minio ports 9000/9001, buckets factory-files, factory-thumbs
opensearch opensearchproject/opensearch:2.x single node, security plugin disabled in dev
clamav clamav/clamav (optional) port 3310

Apps run via pnpm dev (Turborepo): web :3000, api :4000, worker, realtime :4001.

3.2 Production (Kubernetes)

                     ┌────────────────────────────────────────────┐
                     │                ingress (TLS)               │
                     └──────┬───────────────┬────────────────────┘
                            │               │ /realtime (WSS upgrade)
                    ┌───────▼──────┐  ┌─────▼──────────┐
                    │  web ×2      │  │ realtime ×N    │
                    │  (HPA: CPU)  │  │ (HPA: conns,   │
                    └───────┬──────┘  │  room sharding)│
                            │         └─────┬──────────┘
                    ┌───────▼───────────────▼──────┐
                    │  nginx (app tier proxy):      │
                    │  gzip, headers, client_max_   │
                    │  body 512m (multipart), WSS   │
                    └───────┬───────────────────────┘
                            │ /v1 → api, /share → web
                    ┌───────▼────────────┐
                    │  api ×N (HPA: CPU) │  PDB: minAvailable 2
                    └───────┬────────────┘
                            │ XADD / BRPOP
        ┌───────────────────┼──────────────────────────┐
        ▼                   ▼                          ▼
 ┌─────────────┐    ┌──────────────────┐      ┌────────────────┐
 │ worker-     │    │ worker-files     │      │ worker-        │
 │ automation  │    │ (scan/thumbs,    │      │ search+webhooks│
 │ + email     │    │  concurrency 4)  │      │ + ai           │
 │ (HPA: queue │    │ (HPA: queue)     │      │ (HPA: queue)   │
 │  depth)     │    └──────────────────┘      └────────────────┘
 └─────────────┘
 external: RDS Postgres (multi-AZ) · ElastiCache Redis · S3 · OpenSearch cluster

Manifests: infrastructure/kubernetes/ (Deployments, HPA, Ingress, PDB, NetworkPolicy); secrets via an external secret store (never baked into images); nginx config: infrastructure/nginx/; cloud reference: infrastructure/terraform/.

Statelessness contract: api, worker, web replicas hold no local state; all mutable state lives in Postgres/Redis/S3/OpenSearch. Realtime is the one stateful tier — it keeps in-memory Yjs documents and is sharded by room hash (§6).

3.3 Environment Configuration

All configuration is env-driven and validated at boot with Zod (apps/api/src/config); the process refuses to start on missing/invalid keys. .env.example documents every key. Secrets (DB URL, Redis URL, JWT secret, encryption keys, S3 credentials, provider API keys) come exclusively from the environment / secret store — never from source or image layers. See security, §8.


4. Service Responsibilities (module map)

apps/api contains 16 NestJS modules. Their responsibilities and key endpoint families:

# Module Responsibility Key endpoints
1 AuthModule register, login, logout, refresh rotation, password reset, email verification, SSO entry POST /v1/auth/*
2 UsersModule profile, avatar, security settings GET/PATCH /v1/users/me
3 OrganizationModule org CRUD, org members, policies, SSO/SCIM config, retention GET/PATCH /v1/organizations/:id
4 WorkspaceModule workspace CRUD, members, invitations, teams POST /v1/workspaces, POST /v1/workspaces/:id/invitations
5 PageModule page CRUD, tree, nesting, trash/restore, favorites, versions, sharing GET /v1/workspaces/:wid/pages/tree, PATCH /v1/pages/:id
6 BlockModule block CRUD, batch ops, fractional positioning, synced blocks, versions POST /v1/pages/:id/blocks, PATCH /v1/blocks/:id/batch
7 DatabaseModule databases, properties, views, records (record = page), query engine (filter/sort/group/paginate) POST /v1/databases/:id/query, POST /v1/databases/:id/records
8 RelationModule relations, relation links, rollups, formulas (safe AST), buttons, recompute jobs POST /v1/databases/:id/relations
9 FileModule presigned upload/download, pipeline status, thumbnails POST /v1/files, GET /v1/files/:id/download
10 CommentModule threads, replies, resolve/reopen, reactions, mentions POST /v1/pages/:id/comments
11 SearchModule query API over OpenSearch, suggestions, recent searches POST /v1/search
12 NotificationModule in-app list, mark read, email channel config GET /v1/notifications
13 AutomationModule automation CRUD, manual trigger, run history, pause/resume POST /v1/automations/:id/trigger
14 AIModule chat (Ask AI), page/database/formula/template/task generation, RAG search, usage/budgets POST /v1/ai/chat, POST /v1/ai/generate
15 IntegrationModule (+ ApiKeyModule, WebhookModule, ShareModule, TemplateModule) public API keys, OAuth2, webhook subscriptions + deliveries, public share links, templates POST /v1/api-keys, POST /v1/webhooks, GET /share/:token
16 AuditModule audit log query/export (enterprise), retention enforcement GET /v1/audit-logs

(15/16 are grouped because IntegrationModule owns the adjacent API-key, webhook, share, and template concerns; each is a separately registrable Nest module.)

Cross-cutting concerns live in apps/api/src/common/: guards (JwtAuthGuard, ApiKeyAuthGuard, TenantGuard, PermissionGuard, RateLimitGuard), interceptors (serialize, logging, audit), filters (AllExceptionsFilter), pipes (ZodValidationPipe), and common/repositories/ (all Prisma implementations).


5. Architectural Decision Records (ADRs)

ADR-001 — Modular monolith (NestJS)

ADR-002 — Block tree with fractional positions

ADR-003 — Yjs as the realtime source of truth (while editing)

ADR-004 — OpenSearch as search and vector store

ADR-005 — Domain events via Redis streams

ADR-006 — Record = page


6. Scaling Strategy

6.1 General principles

  1. Stateless request tier. api/web scale with HPA on CPU; no session affinity needed (auth is token-based; cookies are read by any replica).
  2. Queue consumers scale on depth. Worker HPA watches queue depth (BullMQ metrics exposed via Prometheus /metrics); concurrency is per-queue.
  3. Hot reads go to caches. Redis caches page trees, permission decisions (short TTL), and search suggestions with explicit invalidation via domain events.
  4. Postgres reads scale out first. Read replicas handle search-indexer hydration, audit queries, and report/dashboard reads; writes always go to the primary. The repository layer selects the data source per operation (@ReadReplica decorator; writes and txs always primary).

6.2 Realtime sharding (room hash)

The realtime tier is stateful: each open page/database holds a Y.Doc in memory.

6.3 Queue consumers

Queue / stream consumer Concurrency Notes
automation (BullMQ) 10 run executors; retries w/ exponential backoff, dead-letter after 8
files (BullMQ) 4 CPU-heavy (thumbnails); ClamAV is a sidecar, not per-worker
webhook-deliveries (BullMQ) 20 per-URL concurrency 1 to preserve ordering; backoff 1m → 2h
search-index (stream) 8 upserts by (type, refId); idempotent
notifications (stream) 16 fan-out writes + email jobs
ai-jobs (BullMQ) 8 embedding + generation; per-workspace token budget enforced at submit
rollup-recompute (BullMQ, delayed) 16 event-driven on relation/record change

6.4 Read replicas & data-tier scaling

6.5 Capacity targets (Phase 15 load tests)

Scenario Target
API throughput 1,000 rps sustained, p95 < 300 ms
WebSocket clients 10,000 concurrent, p95 update < 200 ms
Database query 100,000-record database, filtered page of 100 rows < 300 ms
Page load 100k-block page tree metadata < 2 s (virtualized)
Search p95 < 500 ms at 10M indexed docs

7. Cross-Cutting Concerns

Concern Where Mechanism
Multi-tenancy every tenant-scoped table workspaceId column + repository-layer scoping; TenantGuard resolves the workspace from the JWT claim / API key / path; cross-tenant reads are structurally impossible at the repository level
Authorization apps/api/src/common/guards PermissionGuard + packages/permissions; every handler declares @RequirePermission(resource, level)
Input validation ZodValidationPipe Schemas from packages/shared; same schemas type the frontend
Errors AllExceptionsFilter Stable ApiError codes → consistent JSON envelope
Rate limiting RateLimitGuard Redis sliding window per user / API key / IP
Observability all apps OpenTelemetry traces (traceId in event envelopes), Prometheus metrics, structured JSON logs → Loki
Audit AuditService mandatory events, same-transaction writes

8. Non-Functional Summary

Dimension Commitment
Performance PRODUCT-SPEC §26 targets: page load < 2 s, editor interaction < 50 ms, local block move < 16 ms, search < 500 ms, API p95 < 300 ms, realtime < 200 ms
Availability No single-node hard dependency in production; realtime drains gracefully; DB PITR + S3 versioning; documented restore runbook
Security OWASP ASVS L2 (see security); server-side authorization always; secrets from env only
Portability Self-hostable: docker-compose for dev, plain-K8s manifests, no cloud-locked services (S3-compatible, Postgres, Redis, OpenSearch are all vanilla)
Testability Every engine (formula, permissions, positions, filter/sort, Yjs codec) is a pure shared package with standalone unit tests; integration via Testcontainers; E2E via Playwright