.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
workspaces.mddocs/api/workspaces.md← api23,872 B← Back to the app

Workspaces API

Workspace management: CRUD, members, invitations, teams, and settings. Workspaces are the top-level tenant — every page, database, file, comment, webhook, and API key belongs to exactly one workspace. See authentication.md for the shared conventions (base URL, auth, error model, pagination) used throughout this document.


1. Workspaces

1.1 GET /workspaces

List the workspaces the caller belongs to (JWT). For API keys this endpoint returns only the key's home workspace.

Query params: cursor, limit (default 20, max 100).

200 OK

{
  "data": [
    {
      "id": "wks_01J9ZKP2B7F4H6J8K0L2M4N6P8",
      "name": "Ada Lovelace's Workspace",
      "slug": "ada-lovelace-7f3k9q",
      "iconUrl": null,
      "logoUrl": null,
      "description": null,
      "publicUrl": null,
      "isPersonal": true,
      "ownerId": "usr_01J9ZKQX4V2M8N3P5R7T9W1Y3A",
      "billingPlan": "free",
      "role": "OWNER",
      "createdAt": "2024-11-03T09:00:00.000Z",
      "updatedAt": "2025-01-02T08:12:00.000Z"
    },
    {
      "id": "wks_01J9ZKP5C9H7J9K1L3M5N7P9Q1",
      "name": "Analytical Engines Co.",
      "slug": "analytical-engines",
      "iconUrl": "https://factory.example.com/files/fil_01J9ZKP…/logo.png",
      "description": "Product, engineering and ops workspace.",
      "isPersonal": false,
      "ownerId": "usr_01J9ZKQ1U3V5W7X9Y1Z3A5B7C9",
      "billingPlan": "team",
      "role": "ADMIN",
      "createdAt": "2024-10-15T09:00:00.000Z",
      "updatedAt": "2025-01-01T17:40:00.000Z"
    }
  ],
  "nextCursor": null
}

Errors: 401 UNAUTHORIZED.


1.2 POST /workspaces

Create a shared (non-personal) workspace. The creator becomes OWNER. Rate limit: 10 / day / user.

Request:

{
  "name": "Analytical Engines Co.",
  "slug": "analytical-engines",
  "description": "Product, engineering and ops workspace.",
  "iconUrl": "https://factory.example.com/files/fil_01J9ZKP…/logo.png"
}
Field Type Required Notes
name string (1–100) yes Display name.
slug string (1–50, [a-z0-9-]) no Unique subdomain; generated from name when omitted.
description string (≤ 500) no
iconUrl string (url) no Upload the icon via the files API first.

201 Created

{
  "data": {
    "id": "wks_01J9ZKP5C9H7J9K1L3M5N7P9Q1",
    "name": "Analytical Engines Co.",
    "slug": "analytical-engines",
    "isPersonal": false,
    "ownerId": "usr_01J9ZKQX4V2M8N3P5R7T9W1Y3A",
    "settings": { "language": "en-US", "theme": "system", "shareLinks": { "allowed": true } },
    "billingPlan": "free",
    "usageLimits": { "members": 5, "storageBytes": 1073741824, "databases": 25 },
    "createdAt": "2025-01-02T10:00:00.000Z"
  }
}

Errors

Status Code When
400 VALIDATION_ERROR Bad name/slug.
403 FORBIDDEN API key used; workspace quota reached.
409 CONFLICT Slug taken.

Events emitted: workspace.created, workspace.member_added (creator, role OWNER).


1.3 GET /workspaces/:workspaceId

200 OK

{
  "data": {
    "id": "wks_01J9ZKP5C9H7J9K1L3M5N7P9Q1",
    "name": "Analytical Engines Co.",
    "slug": "analytical-engines",
    "iconUrl": "https://factory.example.com/files/fil_01J9ZKP…/logo.png",
    "logoUrl": "https://factory.example.com/files/fil_01J9ZKP…/logo.png",
    "description": "Product, engineering and ops workspace.",
    "publicUrl": "https://analytical-engines.factory.app",
    "isPersonal": false,
    "ownerId": "usr_01J9ZKQ1U3V5W7X9Y1Z3A5B7C9",
    "settings": {
      "language": "en-US",
      "theme": "system",
      "shareLinks": { "allowed": true },
      "trashRetentionDays": 30,
      "auditLogRetentionDays": 365,
      "sessionTimeoutDays": 30
    },
    "billingPlan": "team",
    "usageLimits": { "members": 15, "storageBytes": 10737418240, "databases": 100 },
    "usage": { "members": 6, "storageBytes": 838860800, "databases": 12 },
    "role": "ADMIN",
    "createdAt": "2024-10-15T09:00:00.000Z",
    "updatedAt": "2025-01-01T17:40:00.000Z"
  }
}

Errors: 401 UNAUTHORIZED, 403 FORBIDDEN (not a member), 404 NOT_FOUND.


1.4 PATCH /workspaces/:workspaceId

Update workspace metadata. Merge-patch: only provided fields change.

Request (any subset):

{
  "name": "Analytical Engines",
  "description": "The product & engineering home.",
  "iconUrl": "https://factory.example.com/files/fil_01J9ZKP…/logo-v2.png"
}

slug is immutable (it is the subdomain) — include it and you get 400 VALIDATION_ERROR with details: [{field: "slug", issue: "immutable"}].

200 OK — returns the updated workspace (same shape as GET).

Errors: 400 VALIDATION_ERROR, 401 UNAUTHORIZED, 403 FORBIDDEN, 404 NOT_FOUND, 409 CONFLICT (slug collision if you explicitly changed it).

Events emitted: workspace.updated.


1.5 DELETE /workspaces/:workspaceId

Delete a workspace and all of its content (pages, databases, files, comments, webhooks). Personal workspaces cannot be deleted (dissolve the account instead).

202 Accepted — deletion runs as a background job; the workspace enters deletedAt state immediately (all endpoints then return 410 GONE) and is hard-removed after the retention window (default 30 days).

{ "data": { "status": "deleting", "scheduledPurgeAt": "2025-02-01T10:00:00.000Z" } }

Errors

Status Code When
400 VALIDATION_ERROR Missing/wrong X-Confirm header.
403 FORBIDDEN Not the owner; API key.
404 NOT_FOUND No such workspace.
409 CONFLICT Personal workspace (details: [{reason: "personal_workspace"}]).

Events emitted: workspace.deleted (audit, all member ids recorded).


2. Settings

2.1 PATCH /workspaces/:workspaceId/settings

Update the workspace settings object (merge-patch, one level deep).

Request (any subset):

{
  "language": "en-GB",
  "theme": "dark",
  "shareLinks": { "allowed": false },
  "trashRetentionDays": 14,
  "auditLogRetentionDays": 730
}
Field Type Notes
language string (BCP-47) UI default for new members.
theme light | dark | system
shareLinks.allowed boolean Whether members may create public share links.
trashRetentionDays int (1–365) Days before trashed pages are purged (default 30).
auditLogRetentionDays int (30–3650) Enterprise.
sessionTimeoutDays int (1–90) Refresh-token inactivity window.

200 OK

{
  "data": {
    "id": "wks_01J9ZKP5C9H7J9K1L3M5N7P9Q1",
    "settings": {
      "language": "en-GB",
      "theme": "dark",
      "shareLinks": { "allowed": false },
      "trashRetentionDays": 14,
      "auditLogRetentionDays": 365,
      "sessionTimeoutDays": 30
    }
  }
}

Errors: 400 VALIDATION_ERROR, 401 UNAUTHORIZED, 403 FORBIDDEN, 404 NOT_FOUND.

Events emitted: workspace.settings_updated, permission.changed (audit) when a setting changes who can act.


3. Members

A membership is the row workspace_members (workspaceId × userId × role). Listing a member's team memberships is available via the ?include=teams query param.

3.1 GET /workspaces/:workspaceId/members

Query params: cursor, limit (default 50, max 100), role (filter: OWNER|ADMIN|MEMBER|GUEST), q (case-insensitive match on name/email), include=teams (adds teams: [{id, name, role}] per member).

200 OK

{
  "data": [
    {
      "id": "wm_01J9ZKP9D2H8J0L2M4N6P8Q0R2",
      "userId": "usr_01J9ZKQ1U3V5W7X9Y1Z3A5B7C9",
      "user": {
        "id": "usr_01J9ZKQ1U3V5W7X9Y1Z3A5B7C9",
        "name": "Charles Babbage",
        "displayName": "Charles",
        "email": "charles@example.com",
        "avatarUrl": null,
        "status": "ACTIVE"
      },
      "role": "OWNER",
      "invitedBy": null,
      "joinedAt": "2024-10-15T09:00:00.000Z",
      "createdAt": "2024-10-15T09:00:00.000Z"
    },
    {
      "id": "wm_01J9ZKP9E4H0J2L4M6N8P0Q2R4",
      "userId": "usr_01J9ZKQX4V2M8N3P5R7T9W1Y3A",
      "user": {
        "id": "usr_01J9ZKQX4V2M8N3P5R7T9W1Y3A",
        "name": "Ada Lovelace",
        "displayName": "Ada",
        "email": "ada@example.com",
        "avatarUrl": null,
        "status": "ACTIVE"
      },
      "role": "ADMIN",
      "invitedBy": "usr_01J9ZKQ1U3V5W7X9Y1Z3A5B7C9",
      "joinedAt": "2024-10-16T14:22:00.000Z",
      "createdAt": "2024-10-15T09:05:00.000Z"
    }
  ],
  "nextCursor": null
}

Errors: 401 UNAUTHORIZED, 403 FORBIDDEN, 404 NOT_FOUND.


3.2 POST /workspaces/:workspaceId/members

Add a member who already has an account. (To invite someone by email who may not have an account, use Invitations instead.)

Request:

{
  "userId": "usr_01J9ZKQ2V4W6X8Y0Z2A4B6C8D0",
  "role": "MEMBER"
}

201 Created — returns the membership (same shape as a list item).

Errors

Status Code When
400 VALIDATION_ERROR Bad role/userId.
403 FORBIDDEN Not allowed to grant that role; member quota reached.
404 NOT_FOUND User or workspace unknown to caller.
409 CONFLICT User is already a member.

Events emitted: workspace.member_added, notification to the user (PAGE_SHARED-style workspace.member_added in-app notification).


3.3 PATCH /workspaces/:workspaceId/members/:userId

Change a member's role.

Request:

{ "role": "GUEST" }

200 OK — returns the updated membership.

Errors

Status Code When
400 VALIDATION_ERROR Invalid role.
403 FORBIDDEN Insufficient privilege for the role change.
404 NOT_FOUND User is not a member.

Events emitted: workspace.member_updated, permission.changed (audit).


3.4 DELETE /workspaces/:workspaceId/members/:userId

Remove a member (their resource-level permissions on this workspace are revoked; content they created stays, re-parented under the workspace). The last remaining OWNER cannot be removed.

204 No Content

Errors

Status Code When
403 FORBIDDEN Insufficient privilege (e.g. Admin removing an Owner).
404 NOT_FOUND Not a member.
409 CONFLICT Target is the last owner.

Events emitted: workspace.member_removed, permission.changed (audit).


4. Invitations

Invitations are email-address-based; accepting one creates the account (or attaches an existing account with that email) and the membership. Invitation tokens are single-use, expire (default 7 days), and are hashed at rest.

4.1 POST /workspaces/:workspaceId/invitations

Request:

{
  "email": "augusta@example.com",
  "role": "MEMBER",
  "expiresInDays": 7
}
Field Type Required Notes
email string (email) yes Invitee address.
role OWNER | ADMIN | MEMBER | GUEST no Default MEMBER. OWNER only by the current owner.
expiresInDays int (1–30) no Default 7.

201 Created — the acceptUrl is the full link sent by email:

{
  "data": {
    "id": "inv_01J9ZKQ0F6H2J4L6M8N0P2Q4R6S8",
    "workspaceId": "wks_01J9ZKP5C9H7J9K1L3M5N7P9Q1",
    "email": "augusta@example.com",
    "role": "MEMBER",
    "invitedById": "usr_01J9ZKQ1U3V5W7X9Y1Z3A5B7C9",
    "acceptUrl": "https://factory.example.com/invite?token=itn_7a2f…",
    "expiresAt": "2025-01-09T10:00:00.000Z",
    "status": "PENDING",
    "createdAt": "2025-01-02T10:00:00.000Z"
  }
}

Errors

Status Code When
400 VALIDATION_ERROR Bad email/role.
403 FORBIDDEN Not allowed to grant role; quota.
404 NOT_FOUND Unknown workspace for caller.
409 CONFLICT An open invitation for the same email+role already exists, or the email is already a member.

Events emitted: workspace.invitation_sent (email job enqueued; audit).


4.2 GET /workspaces/:workspaceId/invitations

Query params: cursor, limit, status (PENDING|ACCEPTED|DECLINED|REVOKED|EXPIRED, default PENDING).

200 OK

{
  "data": [
    {
      "id": "inv_01J9ZKQ0F6H2J4L6M8N0P2Q4R6S8",
      "email": "augusta@example.com",
      "role": "MEMBER",
      "invitedById": "usr_01J9ZKQ1U3V5W7X9Y1Z3A5B7C9",
      "invitedBy": { "id": "usr_01J9ZKQ1U3V5W7X9Y1Z3A5B7C9", "name": "Charles Babbage", "email": "charles@example.com" },
      "status": "PENDING",
      "expiresAt": "2025-01-09T10:00:00.000Z",
      "createdAt": "2025-01-02T10:00:00.000Z"
    }
  ],
  "nextCursor": null
}

Errors: 401 UNAUTHORIZED, 403 FORBIDDEN, 404 NOT_FOUND.


4.3 POST /invitations/accept

Accept an invitation using the token from the email link. Works anonymously: if no account exists for the email, the request must include credentials to create one.

Request (new user):

{
  "token": "itn_7a2f9c1e4b6d8f0a2c4e6f8b0d1a3c5e",
  "password": "s3cure-Passphrase-42",
  "name": "Augusta Ada King"
}

Request (existing user, either send JWT or repeat email):

{
  "token": "itn_7a2f9c1e4b6d8f0a2c4e6f8b0d1a3c5e",
  "email": "augusta@example.com"
}

200 OK

{
  "data": {
    "user": { "id": "usr_01J9ZKQ2V4W6X8Y0Z2A4B6C8D0", "email": "augusta@example.com", "name": "Augusta Ada King" },
    "workspace": { "id": "wks_01J9ZKP5C9H7J9K1L3M5N7P9Q1", "name": "Analytical Engines Co." },
    "membership": { "role": "MEMBER", "joinedAt": "2025-01-02T11:30:00.000Z" },
    "accessToken": "eyJhbGciOiJIUzI1NiIs…",
    "refreshToken": "rft_…"
  }
}

Errors

Status Code When
400 VALIDATION_ERROR Missing fields for new-user accept.
403 FORBIDDEN JWT user email ≠ invitation email.
409 CONFLICT Invitation already accepted or revoked.
410 GONE Invitation expired.

Events emitted: workspace.invitation_accepted, workspace.member_added.


4.4 DELETE /workspaces/:workspaceId/invitations/:invitationId

Revoke a pending invitation (sends no email; the link stops working).

204 No Content — idempotent (already terminal invitations also return 204).

Errors: 401 UNAUTHORIZED, 403 FORBIDDEN, 404 NOT_FOUND.

Events emitted: workspace.invitation_revoked.


5. Teams

Teams (teamspace) group members and can own pages (Page.teamId) and be a grant scope for permissions and shares. Sidebar ordering uses the fractional position field.

5.1 GET /workspaces/:workspaceId/teams

Query params: cursor, limit. Ordered by position.

200 OK

{
  "data": [
    {
      "id": "tm_01J9ZKP8G5I7J9L1M3N5P7Q9R1",
      "name": "Engineering",
      "slug": "engineering",
      "description": "Product engineering.",
      "color": "#4F7CFF",
      "iconUrl": null,
      "position": "a0",
      "isPrivate": false,
      "memberCount": 4,
      "pageCount": 32,
      "createdAt": "2024-10-15T10:00:00.000Z",
      "updatedAt": "2025-01-01T12:00:00.000Z"
    },
    {
      "id": "tm_01J9ZKP8H7I9J1L3M5N7P9Q1R3",
      "name": "Founders Only",
      "slug": "founders",
      "description": null,
      "color": null,
      "iconUrl": null,
      "position": "a1",
      "isPrivate": true,
      "memberCount": 2,
      "pageCount": 9,
      "createdAt": "2024-11-01T10:00:00.000Z",
      "updatedAt": "2024-12-20T09:00:00.000Z"
    }
  ],
  "nextCursor": null
}

Errors: 401 UNAUTHORIZED, 403 FORBIDDEN, 404 NOT_FOUND.


5.2 POST /workspaces/:workspaceId/teams

Request:

{
  "name": "Engineering",
  "slug": "engineering",
  "description": "Product engineering.",
  "color": "#4F7CFF",
  "isPrivate": false,
  "position": "a1"
}
Field Type Required Notes
name string (1–60) yes
slug string (1–50) no Unique within workspace.
description string (≤ 500) no
color string (#rrggbb) no
isPrivate boolean no Default false. Private teams hide their pages from non-members.
position string (fractional) no Insert position in the sidebar; default appends after the last team.

201 Created — returns the team (same shape as list item).

Errors: 400 VALIDATION_ERROR, 403 FORBIDDEN, 404 NOT_FOUND, 409 CONFLICT (slug taken).

Events emitted: team.created.


5.3 GET /workspaces/:workspaceId/teams/:teamId

200 OK — team object (list item shape) plus members preview (first 10) and rootPages (top-level pages whose teamId matches).

Errors: 401 UNAUTHORIZED, 403 FORBIDDEN (private team, non-member), 404 NOT_FOUND.


5.4 PATCH /workspaces/:workspaceId/teams/:teamId

Request (any subset): { "name": "Platform Eng", "position": "a0V" }

200 OK — updated team.

Errors: 400 VALIDATION_ERROR, 403 FORBIDDEN, 404 NOT_FOUND, 409 CONFLICT (slug).

Events emitted: team.updated.


5.5 DELETE /workspaces/:workspaceId/teams/:teamId

202 Accepted

{ "data": { "status": "deleting", "unassignedPageCount": 12 } }

Errors: 403 FORBIDDEN, 404 NOT_FOUND.

Events emitted: team.deleted, permission.changed (audit).


5.6 Team Members

Team membership rows (team_members) only exist for users who are already workspace members.

GET /workspaces/:workspaceId/teams/:teamId/members

200 OK

{
  "data": [
    {
      "id": "tmm_01J9ZKP9I9J1L3M5N7P9Q1R3S5",
      "userId": "usr_01J9ZKQX4V2M8N3P5R7T9W1Y3A",
      "user": { "id": "usr_01J9ZKQX4V2M8N3P5R7T9W1Y3A", "name": "Ada Lovelace", "email": "ada@example.com" },
      "role": "ADMIN",
      "createdAt": "2024-10-16T14:25:00.000Z"
    }
  ],
  "nextCursor": null
}

POST /workspaces/:workspaceId/teams/:teamId/members

Request:

{ "userId": "usr_01J9ZKQ2V4W6X8Y0Z2A4B6C8D0", "role": "MEMBER" }

201 Created — team member object.

Errors: 403 FORBIDDEN, 404 NOT_FOUND (user not a workspace member → details: [{reason: "must_be_workspace_member"}]), 409 CONFLICT (already in team).

Events emitted: team.member_added.

PATCH /workspaces/:workspaceId/teams/:teamId/members/:userId

Request: { "role": "ADMIN" } → 200 OK updated team member.

Events emitted: team.member_updated.

DELETE /workspaces/:workspaceId/teams/:teamId/members/:userId

204 No Content

Events emitted: team.member_removed.


6. curl Examples

# Create a workspace
curl -s -X POST https://factory.example.com/api/v1/workspaces \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"name":"Analytical Engines Co.","slug":"analytical-engines"}'

# Invite a member
curl -s -X POST https://factory.example.com/api/v1/workspaces/wks_01J9ZKP5C9H7J9K1L3M5N7P9Q1/invitations \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"email":"augusta@example.com","role":"MEMBER"}'

# Accept an invitation (new user)
curl -s -X POST https://factory.example.com/api/v1/invitations/accept \
  -H 'Content-Type: application/json' \
  -d '{"token":"itn_7a2f9c1e4b6d8f0a2c4e6f8b0d1a3c5e","password":"s3cure-Passphrase-42","name":"Augusta Ada King"}'

# Change a member role
curl -s -X PATCH https://factory.example.com/api/v1/workspaces/wks_01J9ZKP5C9H7J9K1L3M5N7P9Q1/members/usr_01J9ZKQ2V4W6X8Y0Z2A4B6C8D0 \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"role":"GUEST"}'

# Create a team (inserted between existing teams via fractional position)
curl -s -X POST https://factory.example.com/api/v1/workspaces/wks_01J9ZKP5C9H7J9K1L3M5N7P9Q1/teams \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"name":"Platform Eng","slug":"platform","position":"a0V"}'

# Workspace settings
curl -s -X PATCH https://factory.example.com/api/v1/workspaces/wks_01J9ZKP5C9H7J9K1L3M5N7P9Q1/settings \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"theme":"dark","trashRetentionDays":14}'

7. Events Summary

Operation Domain event(s)
Create workspace workspace.created, workspace.member_added
Update workspace workspace.updated
Delete workspace workspace.deleted
Update settings workspace.settings_updated, permission.changed (audit when access changes)
Add member workspace.member_added
Change member role workspace.member_updated, permission.changed (audit)
Remove member workspace.member_removed, permission.changed (audit)
Send invitation workspace.invitation_sent
Accept invitation workspace.invitation_accepted, workspace.member_added
Revoke invitation workspace.invitation_revoked
Team CRUD team.created / team.updated / team.deleted
Team member CRUD team.member_added / team.member_updated / team.member_removed