.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
comments.mddocs/api/comments.md← api15,583 B← Back to the app

Comments API

Comments are threaded discussions anchored to a page, block, database record, or a text selection inside a block. They support replies, resolve/reopen, emoji reactions, and mentions (@user, @team, @page, @database) which fan out notifications.

Shared conventions (auth, error model, pagination, rate limits): authentication.md.

Permission note: commenting requires at least COMMENT on the anchored resource (pages inherit it from the workspace/team/parent chain). Editing or deleting requires the comment to be yours (or you hold EDIT+ on the resource to remove others' comments). Resolving/reopening is allowed for the author and anyone with EDIT on the resource.

Comment object (used by all endpoints):

{
  "id": "cmt_01J9ZKQA1B3C5D7E9F1A3B5C7",
  "workspaceId": "wks_01J9ZKP5C9H7J9K1L3M5N7P9Q1",
  "teamId": "tm_01J9ZKP8G5I7J9L1M3N5P7Q9R1",
  "pageId": "pg_01J9ZKQ4F8H5I7J9L1M3N5P7Q9",
  "blockId": "blk_01J9ZKQ6B1C3D5E7F9A1B3C5D7",
  "recordId": null,
  "selection": null,
  "body": "Can we move the GA date to May? @Ada @Engineering",
  "mentions": [
    { "type": "user", "id": "usr_01J9ZKQX4V2M8N3P5R7T9W1Y3A", "name": "Ada Lovelace" },
    { "type": "team", "id": "tm_01J9ZKP8G5I7J9L1M3N5P7Q9R1", "name": "Engineering" }
  ],
  "pageMentions": [
    { "type": "page", "id": "pg_01J9ZKQ8G2H4I6J8L0M2N4P6Q8", "title": "Q2 Launch Checklist" }
  ],
  "status": "open",
  "resolvedAt": null,
  "resolvedBy": null,
  "replyCount": 2,
  "reactions": [
    { "emoji": "👍", "count": 2, "userIds": ["usr_01J9ZKQ1U3V5W7X9Y1Z3A5B7C9", "usr_01J9ZKQ2V4W6X8Y0Z2A4B6C8D0"] },
    { "emoji": "🔥", "count": 1, "userIds": ["usr_01J9ZKQX4V2M8N3P5R7T9W1Y3A"] }
  ],
  "author": { "id": "usr_01J9ZKQ1U3V5W7X9Y1Z3A5B7C9", "name": "Charles Babbage", "avatarUrl": null },
  "createdAt": "2025-01-02T10:15:00.000Z",
  "updatedAt": "2025-01-02T10:42:00.000Z"
}

body is plain text with inline mention tokens; the server parses them into mentions / pageMentions on write (see §8 Mentions).


1. Anchor Types

One of pageId, blockId, recordId must be present; a selection may be added on top of pageId/blockId.

Anchor Fields Notes
Page pageId Comment on the whole page (page footer / sidebar).
Block pageId + blockId Hover/inline comment on a block. pageId is required for validation (a block id alone is accepted and resolved, but pageId is cheaper to send).
Text selection pageId + blockId + selection selection: { "startOffset": 6, "endOffset": 12, "quotedText": "world" } — offsets into the block's content.text at comment-creation time. If the block text changes so the offsets no longer match, the selection is kept (best-effort) and the UI re-anchors to the nearest text.
Record pageId + recordId Comment on a database record. pageId is the record's 1:1 page (sent so the comment also appears in the page's comment list). recordId alone is accepted and the page is resolved.

teamId is optional and defaults to the team of the anchored page (for scoping mentions/notifications).


2. Create a Comment

POST /comments

Request:

{
  "pageId": "pg_01J9ZKQ4F8H5I7J9L1M3N5P7Q9",
  "blockId": "blk_01J9ZKQ6B1C3D5E7F9A1B3C5D7",
  "selection": { "startOffset": 20, "endOffset": 31, "quotedText": "2025-04-30" },
  "body": "Can we move the GA date to May? @Ada @Engineering",
  "mentions": [
    { "type": "user", "id": "usr_01J9ZKQX4V2M8N3P5R7T9W1Y3A" },
    { "type": "team", "id": "tm_01J9ZKP8G5I7J9L1M3N5P7Q9R1" }
  ]
}
Field Required Notes
Anchor fields one of the anchors (§1)
body yes (1–5000 chars)
mentions no Explicit mention objects; if omitted the server parses @… tokens from body. Explicit entries win over parsing.
teamId no

Mention validation: unknown user/team ids are dropped from mentions (the raw @text stays in body) — a comment never fails because of a stale mention. Mentioning a page/database uses { "type": "page"|"database", "id" }.

201 Created — the full comment object (as in the top of this doc), with reactions: [] and replyCount: 0.

Errors: 400 VALIDATION_ERROR (no anchor, empty body), 401 UNAUTHORIZED, 403 FORBIDDEN (no COMMENT on the resource), 404 NOT_FOUND (page/block/record invisible), 429 RATE_LIMITED (120 comments / hour / user).

Events emitted: comment.created (payload includes the resolved mentions — the notification worker uses it to fan out MENTION/COMMENT notifications).


3. List Comments

GET /pages/:pageId/comments

All comment threads on a page (top-level comments; replies are embedded via ?include=replies or fetched per thread). Also returns record comments whose record page belongs to this page id (1:1 mapping).

Query params:

Param Type Default Notes
blockId string – Only comments anchored to this block.
recordId string – Only comments anchored to this record.
status open | resolved | all all
include list reactions replies embeds each thread's replies (ordered ascending).
cursor, limit – 20 / max 100 Ordered by createdAt DESC (newest threads first).

200 OK

{
  "data": [
    {
      "id": "cmt_01J9ZKQA1B3C5D7E9F1A3B5C7",
      "pageId": "pg_01J9ZKQ4F8H5I7J9L1M3N5P7Q9",
      "blockId": "blk_01J9ZKQ6B1C3D5E7F9A1B3C5D7",
      "body": "Can we move the GA date to May? @Ada @Engineering",
      "status": "open",
      "replyCount": 2,
      "reactions": [ { "emoji": "👍", "count": 2, "userIds": ["usr_01J9ZKQ1U3V5W7X9Y1Z3A5B7C9"] } ],
      "author": { "id": "usr_01J9ZKQ1U3V5W7X9Y1Z3A5B7C9", "name": "Charles Babbage" },
      "createdAt": "2025-01-02T10:15:00.000Z",
      "replies": [
        {
          "id": "crr_01J9ZKQB2C4D6E8F0A2B4C6D8",
          "body": "May works for infra — let's target May 15.",
          "author": { "id": "usr_01J9ZKQX4V2M8N3P5R7T9W1Y3A", "name": "Ada Lovelace" },
          "createdAt": "2025-01-02T10:30:00.000Z",
          "updatedAt": "2025-01-02T10:30:00.000Z"
        },
        {
          "id": "crr_01J9ZKQC3D5E7F9A1B3C5D7E9",
          "body": "Marketing is fine with that too.",
          "author": { "id": "usr_01J9ZKQ2V4W6X8Y0Z2A4B6C8D0", "name": "Augusta Ada" },
          "createdAt": "2025-01-02T10:42:00.000Z",
          "updatedAt": "2025-01-02T10:42:00.000Z"
        }
      ]
    }
  ],
  "nextCursor": null
}

Errors: 401 UNAUTHORIZED, 403 FORBIDDEN, 404 NOT_FOUND.


GET /comments/:commentId

One thread with its replies and reactions.

200 OK — comment object with replies: [ … ] (ascending) embedded.

Errors: 401 UNAUTHORIZED, 403 FORBIDDEN, 404 NOT_FOUND.


4. Edit

PATCH /comments/:commentId

Request:

{ "body": "Can we move the GA date to May 15? @Ada @Engineering" }

Re-parses mentions on save (old mention notifications are not re-sent unless a mention is newly added — newly mentioned users get a MENTION notification).

200 OK — updated comment object (updatedAt bumped; mentions refreshed).

Errors: 400 VALIDATION_ERROR, 401 UNAUTHORIZED, 403 FORBIDDEN (not author), 404 NOT_FOUND.

Events emitted: comment.updated (+ comment.mentioned per newly added mention).


5. Replies

POST /comments/:commentId/replies

Request:

{
  "body": "Agreed — updating the plan page.",
  "mentions": [ { "type": "user", "id": "usr_01J9ZKQ1U3V5W7X9Y1Z3A5B7C9" } ]
}

201 Created — the reply object:

{
  "data": {
    "id": "crr_01J9ZKQC3D5E7F9A1B3C5D7E9",
    "commentId": "cmt_01J9ZKQA1B3C5D7E9F1A3B5C7",
    "body": "Agreed — updating the plan page.",
    "mentions": [ { "type": "user", "id": "usr_01J9ZKQ1U3V5W7X9Y1Z3A5B7C9", "name": "Charles Babbage" } ],
    "author": { "id": "usr_01J9ZKQ2V4W6X8Y0Z2A4B6C8D0", "name": "Augusta Ada" },
    "createdAt": "2025-01-02T10:42:00.000Z",
    "updatedAt": "2025-01-02T10:42:00.000Z"
  }
}

Errors: 400 VALIDATION_ERROR, 403 FORBIDDEN, 404 NOT_FOUND, 429 RATE_LIMITED.

Events emitted: comment.reply_created (notifications: thread author + mentions).

DELETE /comments/:commentId/replies/:replyId

204 No Content

Events emitted: comment.reply_deleted.


6. Delete a Thread

DELETE /comments/:commentId

Deletes the thread and all its replies.

204 No Content

Errors: 401 UNAUTHORIZED, 403 FORBIDDEN, 404 NOT_FOUND.

Events emitted: comment.deleted.


7. Resolve & Reopen

POST /comments/:commentId/resolve

200 OK

{
  "data": {
    "id": "cmt_01J9ZKQA1B3C5D7E9F1A3B5C7",
    "status": "resolved",
    "resolvedAt": "2025-01-03T09:00:00.000Z",
    "resolvedBy": "usr_01J9ZKQX4V2M8N3P5R7T9W1Y3A"
  }
}

Resolving is idempotent (resolving an already-resolved thread returns the same object).

POST /comments/:commentId/reopen

Same auth; sets status: "open", resolvedAt: null.

200 OK — comment object with status: "open".

Errors (both): 401 UNAUTHORIZED, 403 FORBIDDEN, 404 NOT_FOUND.

Events emitted: comment.resolved / comment.reopened.


8. Mentions & Notifications

Mentions are written as @Token in body or as explicit objects in mentions. Server-side resolution:

Token pattern Resolution
@Full Name / @first last Match against workspace members' name and displayName (case-insensitive, first token). On a match → mentionType: "user".
@Team Name Match against workspace teams.
@page / @database Only via explicit objects `{ "type": "page"

Rules:

Example notification fan-out for the comment in §2 (author Charles mentions Ada and the Engineering team of 4, of which Ada is also a member):

Ada          → MENTION (deduped against team mention)
Other Eng ×3 → MENTION (team)
No COMMENT notification (no prior participants)

9. Reactions

Emoji reactions on threads and replies. One reaction per (user, emoji, comment/reply) — re-adding is idempotent (returns the existing aggregate).

POST /comments/:commentId/reactions

Request:

{ "emoji": "👍" }
Field Notes
emoji Any single emoji (1–4 UTF-16 code units). Validated against a built-in allowed list of 100 common emojis; unknown → 400 VALIDATION_ERROR (details: [{field: "emoji", issue: "not_supported"}]).
replyId Optional — react to a reply instead of the thread.

200 OK

{
  "data": {
    "commentId": "cmt_01J9ZKQA1B3C5D7E9F1A3B5C7",
    "emoji": "👍",
    "count": 3,
    "userIds": ["usr_01J9ZKQ1U3V5W7X9Y1Z3A5B7C9", "usr_01J9ZKQ2V4W6X8Y0Z2A4B6C8D0", "usr_01J9ZKQX4V2M8N3P5R7T9W1Y3A"]
  }
}

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

Events emitted: comment.reaction_added.

DELETE /comments/:commentId/reactions

Query: ?emoji=👍 (URL-encoded; required). Optional &replyId=….

200 OK — the updated aggregate for that emoji (with the user removed), or 204 No Content when the last reactor removes it.

Events emitted: comment.reaction_removed.


10. curl Examples

# Comment on a block with a text selection
curl -s -X POST https://factory.example.com/api/v1/comments \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H 'Content-Type: application/json' \
  -d '{
    "pageId": "pg_01J9ZKQ4F8H5I7J9L1M3N5P7Q9",
    "blockId": "blk_01J9ZKQ6B1C3D5E7F9A1B3C5D7",
    "selection": { "startOffset": 20, "endOffset": 31, "quotedText": "2025-04-30" },
    "body": "Can we move the GA date to May? @Ada @Engineering"
  }'

# List page threads with replies
curl -s "https://factory.example.com/api/v1/pages/pg_01J9ZKQ4F8H5I7J9L1M3N5P7Q9/comments?status=open&include=replies" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

# Reply to a thread
curl -s -X POST https://factory.example.com/api/v1/comments/cmt_01J9ZKQA1B3C5D7E9F1A3B5C7/replies \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H 'Content-Type: application/json' \
  -d '{"body": "Agreed — updating the plan page."}'

# Resolve
curl -s -X POST https://factory.example.com/api/v1/comments/cmt_01J9ZKQA1B3C5D7E9F1A3B5C7/resolve \
  -H "Authorization: Bearer $ACCESS_TOKEN"

# React
curl -s -X POST https://factory.example.com/api/v1/comments/cmt_01J9ZKQA1B3C5D7E9F1A3B5C7/reactions \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H 'Content-Type: application/json' \
  -d '{"emoji": "👍"}'

# Edit own comment
curl -s -X PATCH https://factory.example.com/api/v1/comments/cmt_01J9ZKQA1B3C5D7E9F1A3B5C7 \
  -H "Authorization: Bearer $ACCESS_TOKEN" -H 'Content-Type: application/json' \
  -d '{"body": "Can we move the GA date to May 15? @Ada @Engineering"}'

11. Events Summary

Operation Domain event(s)
Create comment comment.created (+ comment.mentioned per resolved mention)
Edit comment comment.updated (+ comment.mentioned for new mentions)
Create reply comment.reply_created
Delete reply comment.reply_deleted
Delete thread comment.deleted
Resolve / reopen comment.resolved / comment.reopened
Reaction add / remove comment.reaction_added / comment.reaction_removed

All comment events carry workspaceId, the anchor (pageId/blockId/ recordId), authorId, and the resolved mentions list — the same payload is delivered to webhook subscribers of comment.created.