@phtngyn/cms 0.2.0-beta.1 → 0.2.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/README.md +38 -45
- package/package.json +3 -1
- package/src/ApplicationTypes.d.ts +7 -5
- package/src/{Configuration-CjVUBBwa.js → Configuration-BU-UyGoH.js} +4 -4
- package/src/{Configuration-CjVUBBwa.js.map → Configuration-BU-UyGoH.js.map} +1 -1
- package/src/Configuration.d.ts +41 -24
- package/src/Configuration.js.map +1 -1
- package/src/Content.js +1 -1
- package/src/{ContentTransfer-CTzGGKFV.js → ContentTransfer-BhF9G56s.js} +2 -2
- package/src/{ContentTransfer-CTzGGKFV.js.map → ContentTransfer-BhF9G56s.js.map} +1 -1
- package/src/{DocumentEngine-BbhfnTAc.js → DocumentEngine-ClhFXW9M.js} +4 -4
- package/src/{DocumentEngine-BbhfnTAc.js.map → DocumentEngine-ClhFXW9M.js.map} +1 -1
- package/src/DocumentModel.d.ts +6 -1
- package/src/DocumentModel.js +4 -3
- package/src/DocumentModel.js.map +1 -1
- package/src/{Forms-CfcI3tPU.js → Forms-BbkE7QfC.js} +47 -16
- package/src/Forms-BbkE7QfC.js.map +1 -0
- package/src/{Forms-02-p8qEw.js → Forms-DoB56hfe.js} +24 -7
- package/src/Forms-DoB56hfe.js.map +1 -0
- package/src/{Forms-BorTcIlp.d.ts → Forms-R0HoTR-o.d.ts} +30 -9
- package/src/Forms.d.ts +16 -15
- package/src/Forms.js.map +1 -1
- package/src/{I18n-BXlVunfa.d.ts → I18n-zbqpWxki.d.ts} +3 -1
- package/src/I18n.d.ts +1 -1
- package/src/Module.js +4 -2
- package/src/Module.js.map +1 -1
- package/src/{S3MediaObjects-DC0c8sYC.js → S3MediaObjects-D5Ns4FM6.js} +14 -12
- package/src/S3MediaObjects-D5Ns4FM6.js.map +1 -0
- package/src/cli.js +60 -34
- package/src/cli.js.map +1 -1
- package/src/{connection-BPf4BQUZ.js → connection-D5S9Iph-.js} +2 -2
- package/src/{connection-BPf4BQUZ.js.map → connection-D5S9Iph-.js.map} +1 -1
- package/src/{dev-lifecycle-vQLxwCFq.js → dev-lifecycle-CZ7iCzG9.js} +129 -42
- package/src/dev-lifecycle-CZ7iCzG9.js.map +1 -0
- package/src/{installation-DsGst1BH.js → installation-BNuoRDOz.js} +43 -31
- package/src/installation-BNuoRDOz.js.map +1 -0
- package/src/internal/authoring-catalog.js +2 -2
- package/src/internal/authoring-metadata.js +1 -1
- package/src/internal/configuration.js +149 -50
- package/src/internal/configuration.js.map +1 -1
- package/src/internal/dev-lifecycle.js +2 -2
- package/src/internal/diagnostics.js +47 -0
- package/src/internal/diagnostics.js.map +1 -0
- package/src/internal/document-model.js +2 -2
- package/src/internal/form-capabilities.js +1 -1
- package/src/internal/i18n.js +6 -1
- package/src/internal/i18n.js.map +1 -1
- package/src/{location-BgYhXEZp.js → location-CPX7oj0o.js} +2 -2
- package/src/{location-BgYhXEZp.js.map → location-CPX7oj0o.js.map} +1 -1
- package/src/{models-k2nXyD6q.js → models-C9kF9JlQ.js} +2 -2
- package/src/{models-k2nXyD6q.js.map → models-C9kF9JlQ.js.map} +1 -1
- package/src/{models-DgkGTFus.js → models-ChRxBChy.js} +4 -2
- package/src/{models-DgkGTFus.js.map → models-ChRxBChy.js.map} +1 -1
- package/src/runtime/delivery/context.js +1 -1
- package/src/runtime/delivery/plugin.js +3 -2
- package/src/runtime/delivery/plugin.js.map +1 -1
- package/src/runtime/forms/document.js +1 -1
- package/src/runtime/forms/useCmsForm.js +28 -24
- package/src/runtime/forms/useCmsForm.js.map +1 -1
- package/src/runtime/i18n/useCmsI18n.d.ts +1 -1
- package/src/runtime/installation.js +1 -1
- package/src/runtime/plugin.js +12 -4
- package/src/runtime/plugin.js.map +1 -1
- package/src/runtime/preview/connection.js +1 -1
- package/src/runtime/preview/controller.js +2 -2
- package/src/runtime/preview/plugin.client.js +3 -3
- package/src/runtime/preview/store.js +1 -1
- package/src/runtime/sitemap.js +1 -1
- package/src/{store-BYgSt7E3.js → store-B49J21NA.js} +3 -3
- package/src/{store-BYgSt7E3.js.map → store-B49J21NA.js.map} +1 -1
- package/studio/{CreateDocumentDialog-BdiM77bb.js → CreateDocumentDialog-DJ8c0WZb.js} +3 -3
- package/studio/{documentPlanning-B7fyUj9r.js → documentPlanning-CDb31mnl.js} +6417 -6358
- package/studio/host.css +1 -1
- package/studio/host.js +7608 -7250
- package/src/Forms-02-p8qEw.js.map +0 -1
- package/src/Forms-CfcI3tPU.js.map +0 -1
- package/src/S3MediaObjects-DC0c8sYC.js.map +0 -1
- package/src/dev-lifecycle-vQLxwCFq.js.map +0 -1
- package/src/installation-DsGst1BH.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"installation-DsGst1BH.js","names":["ActivityEntrySchema","CursorPayload","cursors","ActivityCursorInvalidError","EffectRuntime","ActivityPageSchema","isJsonObject","decodeJson","EffectRuntime","SchemaRuntime","ChangeOutcomeSchema","UserSchema","UserSchema","unavailable","initializationUnavailable","decodeUser","unavailable","initializationUnavailable","unavailable","initializationUnavailable","DocumentIdSchema","DocumentVersionSchema","DocumentMutationResultSchema","isJsonObject","EffectSchema","isJsonObject","isJsonObject","editorSchema","MarkdownDocumentSchema","editorSchema","decodeJson","decodeJsonObject","SourcePathSchema","sameBytes","isDocumentNotFound","conflict","ActivityContextSchema","CollaborationServerMessageSchema","broadcastMessage","StudioActorSchema","WorkingDocumentRefSchema","isAccessDenied","isDocumentNotFound","isDocumentVersionConflict","isDocumentGenerationConflict","sendMessage","StudioRequestContextSchema","broadcastMessage","MediaCleanupReportSchema","InstallationService","SchemaRuntime","MediaInvalidError","MediaIdSchema","MediaCursorSchema","MediaAssetSchema","MediaNotFoundError","MediaPageSchema","MediaTooLargeError","MediaInvalidError","ActivityUnavailableError","MediaCleanupReportSchema","MediaIntegrityReportSchema","Seo.seoLayer","Seo.makeDefaultSeoOptions","InitializationStateSchema","InitializationAlreadyCompletedError","InitializationProofInvalidError","unavailable","unavailable","UserSelfRoleChangeDeniedError","UserAdministrationUnavailableError","UserNotFoundError","UserSelfRemovalDeniedError","UserAlreadyExistsError","AccessDeniedError","DocumentNotFoundError","isAccessDenied","AccessDeniedError","isDocumentNotFound","DocumentNotFoundError","DocumentVersionConflictError","DocumentMediaUnavailableError","DocumentValidationFailedError","AccessDeniedError","MediaInvalidError","MediaNotFoundError","MediaTooLargeError","MediaConflictError","MediaReferencedError","installCms","unavailable","mapUnavailable","isUnavailable","Cause","Option","documentRefinements","timestampRefinements","systemActivity","ActivityContextSchema","persistenceFailure","readSnapshot","mapPersistenceFailure","MediaObjectKeySchema","timestampRefinements","MediaReferenceSchema","persistenceFailure","mapPersistenceFailure","mapStoreFailure","mapStoreFailure","mapPersistenceFailure","persistenceFailure","MediaObjectKeySchema","WorkingDocumentChangeSchema","installNodeCms"],"sources":["../../../../sql-pg/src/internal/database/embedded-migrations.generated.ts","../../../../sql-pg/src/internal/database/table-helpers.ts","../../../../sql-pg/src/internal/documents/tables.ts","../../../../sql-pg/src/internal/initialization/tables.ts","../../../../sql-pg/src/internal/database/migrations.ts","../../../../sql-pg/src/internal/postgres/scoped-client.ts","../../../../auth/src/internal/user.ts","../../../../auth/src/internal/better-auth.ts","../../../../server/src/internal/activity/activity-storage.ts","../../../../server/src/internal/activity/activity-entry.ts","../../../../server/src/internal/activity/activity.ts","../../../../server/src/adapter/Authentication.ts","../../../../server/src/internal/initialization/identity.ts","../../../../server/src/internal/users/administration/identity.ts","../../../../server/src/internal/sha256.ts","../../../../server/src/internal/change-journal/change.ts","../../../../server/src/internal/change-journal/change-journal.ts","../../../../server/src/internal/identity/user-identity.ts","../../../../server/src/internal/initialization/initial-administrator-change.ts","../../../../server/src/internal/users/administration/user-change.ts","../../../../auth/src/internal/activity-hooks.ts","../../../../auth/src/internal/handler.ts","../../../../server/src/internal/initialization/initialization-store.ts","../../../../server/src/internal/initialization/initialization-failures.ts","../../../../auth/src/internal/errors.ts","../../../../auth/src/internal/provider.ts","../../../../auth/src/internal/identity.ts","../../../../auth/src/internal/initialization.ts","../../../../auth/src/internal/recovery.ts","../../../../auth/src/BetterAuth.ts","../../../../platform-node/src/internal/http/form-ingress.ts","../../../../server/src/Readiness.ts","../../../../server/src/internal/working-documents/working-document-model.ts","../../../../server/src/internal/working-documents/working-document.ts","../../../../document/src/internal/editor/identity-extension.ts","../../../../document/src/internal/editor/schema.ts","../../../../document/src/internal/editor/to-comark.ts","../../../../document/src/EditorDocument.ts","../../../../document/src/internal/collaboration/fields.ts","../../../../document/src/internal/collaboration/document.ts","../../../../document/src/internal/collaboration/error.ts","../../../../document/src/internal/collaboration/state.ts","../../../../document/src/CollaborationDocument.ts","../../../../server/src/internal/working-documents/working-document-record.ts","../../../../server/src/internal/working-documents/working-document-changes.ts","../../../../server/src/internal/working-documents/working-document-store.ts","../../../../server/src/internal/working-documents/working-document-format.ts","../../../../server/src/internal/working-documents/working-document-source.ts","../../../../server/src/internal/working-documents/working-document-reconciliation.ts","../../../../server/src/internal/working-documents/document-locks.ts","../../../../server/src/internal/working-documents/working-documents.ts","../../../../platform-node/src/internal/realtime/gateway-lifecycle.ts","../../../../platform-node/src/internal/realtime/keyed-operations.ts","../../../../platform-node/src/internal/realtime/room-name.ts","../../../../platform-node/src/internal/realtime/messages.ts","../../../../platform-node/src/internal/realtime/wake-dispatcher.ts","../../../../platform-node/src/internal/realtime/room-host.ts","../../../../protocol/src/SignedToken.ts","../../../../platform-node/src/internal/realtime/tickets.ts","../../../../platform-node/src/internal/realtime/gateway.ts","../../../../platform-node/src/internal/realtime/websocket.ts","../../../../platform-node/src/internal/installation/host.ts","../../../../platform-node/src/internal/installation/runtime.ts","../../../../server/src/internal/media/media-change.ts","../../../../server/src/internal/media/media-reconciliation.ts","../../../../server/src/internal/media/media-store.ts","../../../../server/src/internal/media/media-upload.ts","../../../../server/src/internal/media/media-library.ts","../../../../server/src/ProductModules.ts","../../../../server/src/internal/initialization/initialization.ts","../../../../platform-node/src/internal/http/authentication.ts","../../../../server/src/internal/users/administration/user-command-fence.ts","../../../../server/src/internal/users/administration/user-administration.ts","../../../../server/src/Forms.ts","../../../../platform-node/src/internal/http/forms.ts","../../../../platform-node/src/internal/http/errors.ts","../../../../platform-node/src/internal/http/collaboration.ts","../../../../platform-node/src/internal/http/documents.ts","../../../../platform-node/src/internal/http/media.ts","../../../../platform-node/src/internal/http/preview.ts","../../../../platform-node/src/internal/http/delivery.ts","../../../../platform-node/src/internal/http/administration.ts","../../../../platform-node/src/internal/http/user-administration.ts","../../../../platform-node/src/internal/http/api.ts","../../../../platform-node/src/internal/installation/error.ts","../../../../platform-node/src/internal/installation/layer.ts","../../../../platform-node/src/Installation.ts","../../../../sql-pg/src/internal/activity/tables.ts","../../../../sql-pg/src/internal/activity/row-schema.ts","../../../../sql-pg/src/internal/activity/activity-storage.ts","../../../../sql-pg/src/internal/change-journal/tables.ts","../../../../sql-pg/src/internal/change-journal/row-schema.ts","../../../../sql-pg/src/internal/change-journal/change-journal.ts","../../../../sql-pg/src/internal/documents/commands.ts","../../../../sql-pg/src/internal/documents/document-activity.ts","../../../../sql-pg/src/internal/documents/row-schema.ts","../../../../sql-pg/src/internal/documents/records.ts","../../../../sql-pg/src/internal/database/media-reference-lock.ts","../../../../sql-pg/src/internal/media/tables.ts","../../../../sql-pg/src/internal/documents/document-store.ts","../../../../sql-pg/src/internal/postgres/advisory-lock.ts","../../../../sql-pg/src/internal/initialization/initialization-store.ts","../../../../sql-pg/src/internal/seo/tables.ts","../../../../sql-pg/src/internal/media/row-schema.ts","../../../../sql-pg/src/internal/media/records.ts","../../../../sql-pg/src/internal/media/media-store.ts","../../../../sql-pg/src/internal/seo/seo-store.ts","../../../../sql-pg/src/internal/user-administration/user-command-fence.ts","../../../../sql-pg/src/internal/working-documents/working-document-change-message.ts","../../../../sql-pg/src/internal/working-documents/working-document-changes.ts","../../../../sql-pg/src/internal/working-documents/tables.ts","../../../../sql-pg/src/internal/working-documents/row-schema.ts","../../../../sql-pg/src/internal/working-documents/records.ts","../../../../sql-pg/src/internal/working-documents/storage.ts","../../../../sql-pg/src/internal/working-documents/working-document-store.ts","../../../../sql-pg/src/Postgres.ts","../../../src/runtime/installation.ts"],"sourcesContent":["import type { MigrationMeta } from 'drizzle-orm/migrator'\n\n// Generated file. Do not edit.\n// The separate drizzle/*/migration.sql files are the canonical migration history.\nexport const embeddedMigrations: Array<MigrationMeta> = [\n {\n sql: [\n \"CREATE TABLE \\\"activity_entries\\\" (\\n\\t\\\"id\\\" uuid PRIMARY KEY DEFAULT gen_random_uuid(),\\n\\t\\\"action\\\" text NOT NULL,\\n\\t\\\"actor_id\\\" text NOT NULL,\\n\\t\\\"actor_email\\\" text NOT NULL,\\n\\t\\\"actor_name\\\" text NOT NULL,\\n\\t\\\"actor_roles\\\" jsonb NOT NULL,\\n\\t\\\"request_id\\\" uuid NOT NULL,\\n\\t\\\"reason\\\" text,\\n\\t\\\"target_kind\\\" text NOT NULL,\\n\\t\\\"target_id\\\" text,\\n\\t\\\"details\\\" jsonb DEFAULT '{}' NOT NULL,\\n\\t\\\"occurred_at\\\" timestamp with time zone DEFAULT transaction_timestamp() NOT NULL,\\n\\tCONSTRAINT \\\"activity_entries_action_check\\\" CHECK (\\\"action\\\" in ('document.created', 'document.updated', 'document.moved', 'document.trashed', 'document.revision.restored', 'document.untrashed', 'document.published', 'media.uploaded', 'media.replaced', 'media.removed', 'media.cleaned', 'user.created', 'user.removed', 'user.role.changed', 'user.sessions.revoked', 'authentication.signed-in', 'authentication.signed-out', 'authentication.password.changed', 'authentication.password.reset')),\\n\\tCONSTRAINT \\\"activity_entries_target_kind_check\\\" CHECK (\\\"target_kind\\\" in ('document', 'media', 'media-library', 'user')),\\n\\tCONSTRAINT \\\"activity_entries_target_check\\\" CHECK ((\\\"target_kind\\\" = 'media-library' AND \\\"target_id\\\" IS NULL)\\n OR (\\\"target_kind\\\" <> 'media-library' AND \\\"target_id\\\" IS NOT NULL)),\\n\\tCONSTRAINT \\\"activity_entries_actor_roles_check\\\" CHECK (jsonb_typeof(\\\"actor_roles\\\") = 'array'),\\n\\tCONSTRAINT \\\"activity_entries_details_check\\\" CHECK (jsonb_typeof(\\\"details\\\") = 'object')\\n);\\n\",\n '\\nCREATE TABLE \"auth_accounts\" (\\n\\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid(),\\n\\t\"issuer\" text NOT NULL,\\n\\t\"account_id\" text NOT NULL,\\n\\t\"provider_id\" text NOT NULL,\\n\\t\"user_id\" uuid NOT NULL,\\n\\t\"access_token\" text,\\n\\t\"refresh_token\" text,\\n\\t\"id_token\" text,\\n\\t\"access_token_expires_at\" timestamp with time zone,\\n\\t\"refresh_token_expires_at\" timestamp with time zone,\\n\\t\"scope\" text,\\n\\t\"password\" text,\\n\\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\\n\\t\"updated_at\" timestamp with time zone DEFAULT now() NOT NULL\\n);\\n',\n '\\nCREATE TABLE \"auth_rate_limits\" (\\n\\t\"key\" text PRIMARY KEY,\\n\\t\"count\" bigint NOT NULL,\\n\\t\"last_request\" bigint NOT NULL\\n);\\n',\n '\\nCREATE TABLE \"auth_sessions\" (\\n\\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid(),\\n\\t\"expires_at\" timestamp with time zone NOT NULL,\\n\\t\"token\" text NOT NULL UNIQUE,\\n\\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\\n\\t\"updated_at\" timestamp with time zone DEFAULT now() NOT NULL,\\n\\t\"ip_address\" text,\\n\\t\"user_agent\" text,\\n\\t\"user_id\" uuid NOT NULL,\\n\\t\"impersonated_by\" text\\n);\\n',\n '\\nCREATE TABLE \"auth_users\" (\\n\\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid(),\\n\\t\"name\" text NOT NULL,\\n\\t\"email\" text NOT NULL UNIQUE,\\n\\t\"email_verified\" boolean DEFAULT false NOT NULL,\\n\\t\"image\" text,\\n\\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\\n\\t\"updated_at\" timestamp with time zone DEFAULT now() NOT NULL,\\n\\t\"role\" text DEFAULT \\'editor\\' NOT NULL,\\n\\t\"banned\" boolean DEFAULT false NOT NULL,\\n\\t\"ban_reason\" text,\\n\\t\"ban_expires\" timestamp with time zone,\\n\\t\"cms_creation_change_id\" uuid UNIQUE,\\n\\t\"cms_sessions_revoked_change_id\" uuid UNIQUE,\\n\\tCONSTRAINT \"auth_users_role_check\" CHECK (\"role\" in (\\'administrator\\', \\'editor\\', \\'viewer\\'))\\n);\\n',\n '\\nCREATE TABLE \"auth_verifications\" (\\n\\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid(),\\n\\t\"identifier\" text NOT NULL,\\n\\t\"value\" text NOT NULL,\\n\\t\"expires_at\" timestamp with time zone NOT NULL,\\n\\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\\n\\t\"updated_at\" timestamp with time zone DEFAULT now() NOT NULL\\n);\\n',\n '\\nCREATE TABLE \"change_receipts\" (\\n\\t\"change_id\" uuid PRIMARY KEY,\\n\\t\"fingerprint\" text NOT NULL,\\n\\t\"outcome\" text NOT NULL,\\n\\t\"activity_id\" uuid UNIQUE,\\n\\t\"completed_at\" timestamp with time zone DEFAULT transaction_timestamp() NOT NULL,\\n\\tCONSTRAINT \"change_receipts_outcome_check\" CHECK ((\"outcome\" = \\'applied\\' AND \"activity_id\" IS NOT NULL)\\n OR (\"outcome\" = \\'cancelled\\' AND \"activity_id\" IS NULL))\\n);\\n',\n '\\nCREATE TABLE \"cms_state\" (\\n\\t\"singleton\" boolean PRIMARY KEY DEFAULT true,\\n\\t\"generation\" bigint DEFAULT 0 NOT NULL,\\n\\tCONSTRAINT \"cms_state_singleton_check\" CHECK (\"singleton\"),\\n\\tCONSTRAINT \"cms_state_generation_check\" CHECK (\"generation\" >= 0)\\n);\\n',\n '\\nCREATE TABLE \"document_heads\" (\\n\\t\"document_id\" uuid PRIMARY KEY,\\n\\t\"authored_revision_id\" uuid NOT NULL,\\n\\t\"published_revision_id\" uuid\\n);\\n',\n '\\nCREATE TABLE \"document_media_references\" (\\n\\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid(),\\n\\t\"document_id\" uuid NOT NULL,\\n\\t\"object_key\" text NOT NULL,\\n\\t\"path\" text NOT NULL,\\n\\t\"source_path\" text NOT NULL,\\n\\t\"node_path\" integer[] NOT NULL,\\n\\tCONSTRAINT \"document_media_references_identity_unique\" UNIQUE(\"document_id\",\"source_path\",\"node_path\",\"object_key\"),\\n\\tCONSTRAINT \"document_media_references_object_key_check\" CHECK (char_length(\"object_key\") between 1 and 1024\\n AND btrim(\"object_key\") = \"object_key\"\\n AND \"object_key\" !~ \\'(^/|/$|//|(^|/)\\\\.{1,2}(/|$)|[[:cntrl:]])\\'\\n AND position(chr(92) in \"object_key\") = 0),\\n\\tCONSTRAINT \"document_media_references_node_path_check\" CHECK (array_position(\"node_path\", NULL) IS NULL AND 0 <= ALL(\"node_path\"))\\n);\\n',\n '\\nCREATE TABLE \"document_revisions\" (\\n\\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid(),\\n\\t\"document_id\" uuid NOT NULL,\\n\\t\"action\" text NOT NULL,\\n\\t\"source_path\" text NOT NULL,\\n\\t\"markdown\" text NOT NULL,\\n\\t\"actor_id\" text NOT NULL,\\n\\t\"actor_email\" text NOT NULL,\\n\\t\"actor_name\" text NOT NULL,\\n\\t\"actor_roles\" jsonb NOT NULL,\\n\\t\"request_id\" uuid NOT NULL,\\n\\t\"reason\" text,\\n\\t\"activity_details\" jsonb DEFAULT \\'{}\\' NOT NULL,\\n\\t\"created_at\" timestamp with time zone DEFAULT transaction_timestamp() NOT NULL,\\n\\tCONSTRAINT \"document_revisions_document_id_unique\" UNIQUE(\"document_id\",\"id\"),\\n\\tCONSTRAINT \"document_revisions_action_check\" CHECK (\"action\" in (\\'document.create\\', \\'document.move\\', \\'document.remove\\', \\'document.restore\\', \\'document.undelete\\', \\'document.update\\'))\\n);\\n',\n '\\nCREATE TABLE \"documents\" (\\n\\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid(),\\n\\t\"source_path\" text NOT NULL,\\n\\t\"deleted_at\" timestamp with time zone,\\n\\t\"created_at\" timestamp with time zone DEFAULT transaction_timestamp() NOT NULL,\\n\\t\"updated_at\" timestamp with time zone DEFAULT transaction_timestamp() NOT NULL\\n);\\n',\n '\\nCREATE TABLE \"initialization_state\" (\\n\\t\"singleton\" boolean PRIMARY KEY DEFAULT true,\\n\\t\"state\" text DEFAULT \\'uninitialized\\' NOT NULL,\\n\\t\"change_id\" uuid,\\n\\t\"claim\" jsonb,\\n\\tCONSTRAINT \"initialization_state_singleton_check\" CHECK (\"singleton\"),\\n\\tCONSTRAINT \"initialization_state_state_check\" CHECK (\"state\" in (\\'uninitialized\\', \\'claiming\\', \\'ready\\')),\\n\\tCONSTRAINT \"initialization_state_claim_check\" CHECK ((\"state\" = \\'claiming\\' AND \"change_id\" IS NOT NULL AND jsonb_typeof(\"claim\") = \\'object\\')\\n OR (\"state\" <> \\'claiming\\' AND \"change_id\" IS NULL AND \"claim\" IS NULL))\\n);\\n',\n '\\nCREATE TABLE \"media_assets\" (\\n\\t\"id\" uuid PRIMARY KEY,\\n\\t\"object_key\" text NOT NULL UNIQUE,\\n\\t\"name\" text NOT NULL,\\n\\t\"folder\" text DEFAULT \\'\\' NOT NULL,\\n\\t\"mime_type\" text NOT NULL,\\n\\t\"byte_size\" bigint NOT NULL,\\n\\t\"status\" text DEFAULT \\'uploading\\' NOT NULL,\\n\\t\"created_at\" timestamp with time zone DEFAULT transaction_timestamp() NOT NULL,\\n\\t\"updated_at\" timestamp with time zone DEFAULT transaction_timestamp() NOT NULL,\\n\\tCONSTRAINT \"media_assets_byte_size_check\" CHECK (\"byte_size\" > 0 AND \"byte_size\" <= 9007199254740991),\\n\\tCONSTRAINT \"media_assets_mime_type_check\" CHECK (\"mime_type\" in (\\'image/avif\\', \\'image/gif\\', \\'image/jpeg\\', \\'image/png\\', \\'image/webp\\')),\\n\\tCONSTRAINT \"media_assets_status_check\" CHECK (\"status\" in (\\'uploading\\', \\'ready\\', \\'deleting\\')),\\n\\tCONSTRAINT \"media_assets_name_check\" CHECK (char_length(\"name\") between 1 and 255\\n AND btrim(\"name\") = \"name\"\\n AND \"name\" not in (\\'.\\', \\'..\\')\\n AND \"name\" !~ \\'[[:cntrl:]/]\\'\\n AND position(chr(92) in \"name\") = 0),\\n\\tCONSTRAINT \"media_assets_folder_check\" CHECK (char_length(\"folder\") <= 512\\n AND btrim(\"folder\") = \"folder\"\\n AND \"folder\" !~ \\'(^/|/$|//|(^|/)\\\\.{1,2}(/|$)|[[:cntrl:]])\\'\\n AND position(chr(92) in \"folder\") = 0),\\n\\tCONSTRAINT \"media_assets_object_key_check\" CHECK (\"object_key\" ~ \\'^media/[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\\\\.(avif|gif|jpg|png|webp)$\\')\\n);\\n',\n '\\nCREATE TABLE \"media_replacements\" (\\n\\t\"media_id\" uuid PRIMARY KEY,\\n\\t\"object_key\" text NOT NULL,\\n\\t\"staging_object_key\" text NOT NULL UNIQUE,\\n\\t\"name\" text NOT NULL,\\n\\t\"folder\" text NOT NULL,\\n\\t\"mime_type\" text NOT NULL,\\n\\t\"byte_size\" bigint NOT NULL,\\n\\t\"staged\" boolean DEFAULT false NOT NULL,\\n\\t\"created_at\" timestamp with time zone DEFAULT transaction_timestamp() NOT NULL,\\n\\t\"updated_at\" timestamp with time zone DEFAULT transaction_timestamp() NOT NULL,\\n\\tCONSTRAINT \"media_replacements_byte_size_check\" CHECK (\"byte_size\" > 0 AND \"byte_size\" <= 9007199254740991),\\n\\tCONSTRAINT \"media_replacements_mime_type_check\" CHECK (\"mime_type\" in (\\'image/avif\\', \\'image/gif\\', \\'image/jpeg\\', \\'image/png\\', \\'image/webp\\')),\\n\\tCONSTRAINT \"media_replacements_name_check\" CHECK (char_length(\"name\") between 1 and 255\\n AND btrim(\"name\") = \"name\"\\n AND \"name\" not in (\\'.\\', \\'..\\')\\n AND \"name\" !~ \\'[[:cntrl:]/]\\'\\n AND position(chr(92) in \"name\") = 0),\\n\\tCONSTRAINT \"media_replacements_folder_check\" CHECK (char_length(\"folder\") <= 512\\n AND btrim(\"folder\") = \"folder\"\\n AND \"folder\" !~ \\'(^/|/$|//|(^|/)\\\\.{1,2}(/|$)|[[:cntrl:]])\\'\\n AND position(chr(92) in \"folder\") = 0),\\n\\tCONSTRAINT \"media_replacements_object_key_check\" CHECK (\"object_key\" ~ \\'^media/[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\\\\.(avif|gif|jpg|png|webp)$\\'),\\n\\tCONSTRAINT \"media_replacements_staging_object_key_check\" CHECK (\"staging_object_key\" ~ \\'^media/replacements/[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\\\\.(avif|gif|jpg|png|webp)$\\'),\\n\\tCONSTRAINT \"media_replacements_distinct_object_keys_check\" CHECK (\"staging_object_key\" <> \"object_key\")\\n);\\n',\n '\\nCREATE TABLE \"pending_changes\" (\\n\\t\"id\" uuid PRIMARY KEY,\\n\\t\"action\" text NOT NULL,\\n\\t\"subject\" text NOT NULL,\\n\\t\"scope\" text NOT NULL,\\n\\t\"actor_id\" text NOT NULL,\\n\\t\"actor_email\" text NOT NULL,\\n\\t\"actor_name\" text NOT NULL,\\n\\t\"actor_roles\" jsonb NOT NULL,\\n\\t\"request_id\" uuid NOT NULL,\\n\\t\"reason\" text,\\n\\t\"target_kind\" text,\\n\\t\"target_id\" text,\\n\\t\"intent\" jsonb NOT NULL,\\n\\t\"fingerprint\" text NOT NULL,\\n\\t\"created_at\" timestamp with time zone DEFAULT transaction_timestamp() NOT NULL,\\n\\t\"updated_at\" timestamp with time zone DEFAULT transaction_timestamp() NOT NULL,\\n\\tCONSTRAINT \"pending_changes_action_check\" CHECK (\"action\" in (\\'document.created\\', \\'document.updated\\', \\'document.moved\\', \\'document.trashed\\', \\'document.revision.restored\\', \\'document.untrashed\\', \\'document.published\\', \\'media.uploaded\\', \\'media.replaced\\', \\'media.removed\\', \\'media.cleaned\\', \\'user.created\\', \\'user.removed\\', \\'user.role.changed\\', \\'user.sessions.revoked\\', \\'authentication.signed-in\\', \\'authentication.signed-out\\', \\'authentication.password.changed\\', \\'authentication.password.reset\\')),\\n\\tCONSTRAINT \"pending_changes_scope_check\" CHECK (\"scope\" in (\\'initialization\\', \\'media\\', \\'users\\')),\\n\\tCONSTRAINT \"pending_changes_subject_check\" CHECK (char_length(\"subject\") between 1 and 1024 AND btrim(\"subject\") = \"subject\"),\\n\\tCONSTRAINT \"pending_changes_actor_roles_check\" CHECK (jsonb_typeof(\"actor_roles\") = \\'array\\'),\\n\\tCONSTRAINT \"pending_changes_intent_check\" CHECK (jsonb_typeof(\"intent\") = \\'object\\'),\\n\\tCONSTRAINT \"pending_changes_target_check\" CHECK ((\"target_kind\" IS NULL AND \"target_id\" IS NULL)\\n OR (\"target_kind\" = \\'media-library\\' AND \"target_id\" IS NULL)\\n OR (\"target_kind\" in (\\'document\\', \\'media\\', \\'user\\')\\n AND \"target_id\" IS NOT NULL))\\n);\\n',\n '\\nCREATE TABLE \"working_document_publish_attempts\" (\\n\\t\"id\" uuid PRIMARY KEY,\\n\\t\"activity\" jsonb NOT NULL,\\n\\t\"document_id\" uuid NOT NULL,\\n\\t\"expected_generation\" uuid NOT NULL,\\n\\t\"expected_version\" uuid NOT NULL,\\n\\t\"high_watermark\" bigint NOT NULL,\\n\\t\"markdown_hash\" text NOT NULL,\\n\\t\"state\" bytea NOT NULL,\\n\\t\"state_vector\" bytea NOT NULL,\\n\\t\"checkpoint_version\" uuid,\\n\\t\"phase\" text DEFAULT \\'pending\\' NOT NULL,\\n\\t\"failure\" text,\\n\\t\"created_at\" timestamp with time zone DEFAULT transaction_timestamp() NOT NULL,\\n\\t\"updated_at\" timestamp with time zone DEFAULT transaction_timestamp() NOT NULL,\\n\\tCONSTRAINT \"working_document_publish_attempts_phase_check\" CHECK (\"phase\" in (\\'pending\\', \\'checkpointed\\', \\'published\\', \\'failed\\')),\\n\\tCONSTRAINT \"working_document_publish_attempts_high_watermark_check\" CHECK (\"high_watermark\" between 0 and 9007199254740991),\\n\\tCONSTRAINT \"working_document_publish_attempts_markdown_hash_check\" CHECK (char_length(\"markdown_hash\") between 1 and 128),\\n\\tCONSTRAINT \"working_document_publish_attempts_state_check\" CHECK (octet_length(\"state\") > 0),\\n\\tCONSTRAINT \"working_document_publish_attempts_state_vector_check\" CHECK (octet_length(\"state_vector\") > 0),\\n\\tCONSTRAINT \"working_document_publish_attempts_payload_check\" CHECK ((\\n \"phase\" = \\'pending\\'\\n AND \"checkpoint_version\" IS NULL\\n AND \"failure\" IS NULL\\n ) OR (\\n \"phase\" in (\\'checkpointed\\', \\'published\\')\\n AND \"checkpoint_version\" IS NOT NULL\\n AND \"failure\" IS NULL\\n ) OR (\\n \"phase\" = \\'failed\\'\\n AND \"checkpoint_version\" IS NULL\\n AND char_length(\"failure\") between 1 and 128\\n ))\\n);\\n',\n '\\nCREATE TABLE \"working_document_updates\" (\\n\\t\"document_id\" uuid,\\n\\t\"generation_id\" uuid NOT NULL,\\n\\t\"sequence\" bigint,\\n\\t\"update\" bytea NOT NULL,\\n\\t\"created_at\" timestamp with time zone DEFAULT transaction_timestamp() NOT NULL,\\n\\tCONSTRAINT \"working_document_updates_pkey\" PRIMARY KEY(\"document_id\",\"sequence\"),\\n\\tCONSTRAINT \"working_document_updates_sequence_check\" CHECK (\"sequence\" between 1 and 9007199254740991),\\n\\tCONSTRAINT \"working_document_updates_update_check\" CHECK (octet_length(\"update\") > 0)\\n);\\n',\n '\\nCREATE TABLE \"working_documents\" (\\n\\t\"document_id\" uuid PRIMARY KEY,\\n\\t\"format_version\" integer NOT NULL,\\n\\t\"generation_id\" uuid NOT NULL,\\n\\t\"state\" bytea NOT NULL,\\n\\t\"saved_state_vector\" bytea NOT NULL,\\n\\t\"saved_version\" uuid NOT NULL,\\n\\t\"next_update_sequence\" bigint DEFAULT 1 NOT NULL,\\n\\t\"updated_at\" timestamp with time zone DEFAULT transaction_timestamp() NOT NULL,\\n\\tCONSTRAINT \"working_documents_generation_unique\" UNIQUE(\"document_id\",\"generation_id\"),\\n\\tCONSTRAINT \"working_documents_format_version_check\" CHECK (\"format_version\" = 1),\\n\\tCONSTRAINT \"working_documents_state_check\" CHECK (octet_length(\"state\") > 0),\\n\\tCONSTRAINT \"working_documents_saved_state_vector_check\" CHECK (octet_length(\"saved_state_vector\") > 0),\\n\\tCONSTRAINT \"working_documents_next_update_sequence_check\" CHECK (\"next_update_sequence\" between 1 and 9007199254740991)\\n);\\n',\n '\\nCREATE INDEX \"activity_entries_history\" ON \"activity_entries\" (\"occurred_at\" DESC NULLS LAST,\"id\" DESC NULLS LAST);',\n '\\nCREATE INDEX \"activity_entries_actor\" ON \"activity_entries\" (\"actor_id\",\"occurred_at\" DESC NULLS LAST,\"id\" DESC NULLS LAST);',\n '\\nCREATE INDEX \"activity_entries_target\" ON \"activity_entries\" (\"target_kind\",\"target_id\",\"occurred_at\" DESC NULLS LAST,\"id\" DESC NULLS LAST);',\n '\\nCREATE INDEX \"activity_entries_request\" ON \"activity_entries\" (\"request_id\");',\n '\\nCREATE INDEX \"auth_accounts_user_id\" ON \"auth_accounts\" (\"user_id\");',\n '\\nCREATE UNIQUE INDEX \"auth_accounts_identity\" ON \"auth_accounts\" (\"issuer\",\"account_id\");',\n '\\nCREATE INDEX \"auth_sessions_user_id\" ON \"auth_sessions\" (\"user_id\");',\n '\\nCREATE INDEX \"auth_verifications_identifier\" ON \"auth_verifications\" (\"identifier\");',\n '\\nCREATE INDEX \"change_receipts_activity\" ON \"change_receipts\" (\"activity_id\");',\n '\\nCREATE INDEX \"document_media_references_object_key\" ON \"document_media_references\" (\"object_key\");',\n '\\nCREATE INDEX \"document_revisions_history\" ON \"document_revisions\" (\"document_id\",\"created_at\" DESC NULLS LAST,\"id\" DESC NULLS LAST);',\n '\\nCREATE UNIQUE INDEX \"documents_active_path\" ON \"documents\" (\"source_path\") WHERE \"deleted_at\" is null;',\n '\\nCREATE INDEX \"media_assets_catalog\" ON \"media_assets\" (\"created_at\" DESC NULLS LAST,\"id\" DESC NULLS LAST) WHERE \"status\" = \\'ready\\';',\n '\\nCREATE INDEX \"media_assets_folder\" ON \"media_assets\" (\"folder\",\"created_at\" DESC NULLS LAST,\"id\" DESC NULLS LAST) WHERE \"status\" = \\'ready\\';',\n '\\nCREATE INDEX \"media_assets_recovery\" ON \"media_assets\" (\"updated_at\",\"id\") WHERE \"status\" <> \\'ready\\';',\n '\\nCREATE INDEX \"media_replacements_recovery\" ON \"media_replacements\" (\"updated_at\",\"media_id\");',\n '\\nCREATE UNIQUE INDEX \"pending_changes_subject\" ON \"pending_changes\" (\"subject\");',\n '\\nCREATE INDEX \"pending_changes_recovery\" ON \"pending_changes\" (\"scope\",\"updated_at\",\"id\");',\n '\\nCREATE UNIQUE INDEX \"working_document_publish_attempts_active\" ON \"working_document_publish_attempts\" (\"document_id\") WHERE \"phase\" in (\\'pending\\', \\'checkpointed\\');',\n '\\nCREATE INDEX \"working_document_publish_attempts_recovery\" ON \"working_document_publish_attempts\" (\"document_id\",\"created_at\" DESC NULLS LAST,\"id\" DESC NULLS LAST);',\n '\\nALTER TABLE \"auth_accounts\" ADD CONSTRAINT \"auth_accounts_user_id_auth_users_id_fkey\" FOREIGN KEY (\"user_id\") REFERENCES \"auth_users\"(\"id\") ON DELETE CASCADE;',\n '\\nALTER TABLE \"auth_sessions\" ADD CONSTRAINT \"auth_sessions_user_id_auth_users_id_fkey\" FOREIGN KEY (\"user_id\") REFERENCES \"auth_users\"(\"id\") ON DELETE CASCADE;',\n '\\nALTER TABLE \"change_receipts\" ADD CONSTRAINT \"change_receipts_activity_id_activity_entries_id_fkey\" FOREIGN KEY (\"activity_id\") REFERENCES \"activity_entries\"(\"id\") ON DELETE RESTRICT;',\n '\\nALTER TABLE \"document_heads\" ADD CONSTRAINT \"document_heads_document_id_documents_id_fkey\" FOREIGN KEY (\"document_id\") REFERENCES \"documents\"(\"id\") ON DELETE RESTRICT;',\n '\\nALTER TABLE \"document_heads\" ADD CONSTRAINT \"document_heads_authored_revision_fkey\" FOREIGN KEY (\"document_id\",\"authored_revision_id\") REFERENCES \"document_revisions\"(\"document_id\",\"id\") ON DELETE RESTRICT;',\n '\\nALTER TABLE \"document_heads\" ADD CONSTRAINT \"document_heads_published_revision_fkey\" FOREIGN KEY (\"document_id\",\"published_revision_id\") REFERENCES \"document_revisions\"(\"document_id\",\"id\") ON DELETE RESTRICT;',\n '\\nALTER TABLE \"document_media_references\" ADD CONSTRAINT \"document_media_references_document_id_documents_id_fkey\" FOREIGN KEY (\"document_id\") REFERENCES \"documents\"(\"id\") ON DELETE CASCADE;',\n '\\nALTER TABLE \"document_revisions\" ADD CONSTRAINT \"document_revisions_document_id_documents_id_fkey\" FOREIGN KEY (\"document_id\") REFERENCES \"documents\"(\"id\") ON DELETE RESTRICT;',\n '\\nALTER TABLE \"media_replacements\" ADD CONSTRAINT \"media_replacements_media_id_media_assets_id_fkey\" FOREIGN KEY (\"media_id\") REFERENCES \"media_assets\"(\"id\") ON DELETE RESTRICT;',\n '\\nALTER TABLE \"working_document_publish_attempts\" ADD CONSTRAINT \"working_document_publish_attempts_document_generation_fkey\" FOREIGN KEY (\"document_id\",\"expected_generation\") REFERENCES \"working_documents\"(\"document_id\",\"generation_id\") ON DELETE CASCADE;',\n '\\nALTER TABLE \"working_document_publish_attempts\" ADD CONSTRAINT \"working_document_publish_attempts_expected_version_fkey\" FOREIGN KEY (\"document_id\",\"expected_version\") REFERENCES \"document_revisions\"(\"document_id\",\"id\") ON DELETE RESTRICT;',\n '\\nALTER TABLE \"working_document_publish_attempts\" ADD CONSTRAINT \"working_document_publish_attempts_checkpoint_version_fkey\" FOREIGN KEY (\"document_id\",\"checkpoint_version\") REFERENCES \"document_revisions\"(\"document_id\",\"id\") ON DELETE RESTRICT;',\n '\\nALTER TABLE \"working_document_updates\" ADD CONSTRAINT \"working_document_updates_document_generation_fkey\" FOREIGN KEY (\"document_id\",\"generation_id\") REFERENCES \"working_documents\"(\"document_id\",\"generation_id\") ON DELETE CASCADE;',\n '\\nALTER TABLE \"working_documents\" ADD CONSTRAINT \"working_documents_document_id_documents_id_fkey\" FOREIGN KEY (\"document_id\") REFERENCES \"documents\"(\"id\") ON DELETE CASCADE;',\n '\\nALTER TABLE \"working_documents\" ADD CONSTRAINT \"working_documents_saved_version_fkey\" FOREIGN KEY (\"document_id\",\"saved_version\") REFERENCES \"document_revisions\"(\"document_id\",\"id\") ON DELETE RESTRICT;',\n ],\n bps: true,\n folderMillis: 1788466567000,\n hash: '943a4996ef8c4324bd58280a80103e5a1632b088880164904b3857686e26f33e',\n name: '20260903201607_cms_baseline',\n },\n {\n sql: [\n 'ALTER TABLE \"auth_rate_limits\" ADD COLUMN \"id\" uuid DEFAULT gen_random_uuid();',\n '\\nALTER TABLE \"auth_rate_limits\" DROP CONSTRAINT \"auth_rate_limits_pkey\";',\n '\\nALTER TABLE \"auth_rate_limits\" ADD PRIMARY KEY (\"id\");',\n '\\nALTER TABLE \"auth_rate_limits\" ADD CONSTRAINT \"auth_rate_limits_key_key\" UNIQUE(\"key\");',\n ],\n bps: true,\n folderMillis: 1788587191000,\n hash: '78b837c6b72a3de22d68e8db90bd211e61a0b97ff29bf8d16a0bba245eefa7ed',\n name: '20260905054631_burly_northstar',\n },\n {\n sql: [\n 'ALTER TABLE \"auth_accounts\" DROP COLUMN \"issuer\";',\n '\\nCREATE UNIQUE INDEX \"auth_accounts_identity\" ON \"auth_accounts\" (\"provider_id\",\"account_id\");',\n ],\n bps: true,\n folderMillis: 1788759370000,\n hash: 'e442485fa6c2d611e3dae508a12d245481bc5ec8f2dd4f5d853910df34484787',\n name: '20260907053610_fancy_lady_deathstrike',\n },\n {\n sql: [\n \"ALTER TABLE \\\"activity_entries\\\" DROP CONSTRAINT \\\"activity_entries_action_check\\\", ADD CONSTRAINT \\\"activity_entries_action_check\\\" CHECK (\\\"action\\\" in ('document.created', 'document.updated', 'document.moved', 'document.trashed', 'document.revision.restored', 'document.untrashed', 'document.published', 'document.unpublished', 'media.uploaded', 'media.replaced', 'media.removed', 'media.cleaned', 'user.created', 'user.removed', 'user.role.changed', 'user.sessions.revoked', 'authentication.signed-in', 'authentication.signed-out', 'authentication.password.changed', 'authentication.password.reset'));\",\n \"\\nALTER TABLE \\\"pending_changes\\\" DROP CONSTRAINT \\\"pending_changes_action_check\\\", ADD CONSTRAINT \\\"pending_changes_action_check\\\" CHECK (\\\"action\\\" in ('document.created', 'document.updated', 'document.moved', 'document.trashed', 'document.revision.restored', 'document.untrashed', 'document.published', 'document.unpublished', 'media.uploaded', 'media.replaced', 'media.removed', 'media.cleaned', 'user.created', 'user.removed', 'user.role.changed', 'user.sessions.revoked', 'authentication.signed-in', 'authentication.signed-out', 'authentication.password.changed', 'authentication.password.reset'));\",\n ],\n bps: true,\n folderMillis: 1788866265000,\n hash: '24c56a37796caf8d76c0a97128a382b31e71808aa5b0ca7e5bac96795f9e16c7',\n name: '20260908111745_classy_johnny_storm',\n },\n {\n sql: [\n 'CREATE TABLE \"seo_media_references\" (\\n\\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid(),\\n\\t\"scope\" text NOT NULL,\\n\\t\"media_id\" uuid NOT NULL,\\n\\tCONSTRAINT \"seo_media_references_scope_media_unique\" UNIQUE(\"scope\",\"media_id\"),\\n\\tCONSTRAINT \"seo_media_references_scope_check\" CHECK (\"scope\" in (\\'working\\', \\'published\\'))\\n);\\n',\n '\\nCREATE TABLE \"seo_revisions\" (\\n\\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid(),\\n\\t\"settings\" jsonb NOT NULL,\\n\\t\"actor_id\" text NOT NULL,\\n\\t\"actor_email\" text NOT NULL,\\n\\t\"actor_name\" text NOT NULL,\\n\\t\"actor_roles\" jsonb NOT NULL,\\n\\t\"request_id\" uuid NOT NULL,\\n\\t\"reason\" text,\\n\\t\"created_at\" timestamp with time zone DEFAULT transaction_timestamp() NOT NULL,\\n\\tCONSTRAINT \"seo_revisions_actor_roles_check\" CHECK (jsonb_typeof(\"actor_roles\") = \\'array\\'),\\n\\tCONSTRAINT \"seo_revisions_settings_check\" CHECK (jsonb_typeof(\"settings\") = \\'object\\')\\n);\\n',\n '\\nCREATE TABLE \"seo_state\" (\\n\\t\"singleton\" boolean PRIMARY KEY DEFAULT true,\\n\\t\"working_revision_id\" uuid NOT NULL,\\n\\t\"published_revision_id\" uuid NOT NULL,\\n\\tCONSTRAINT \"seo_state_singleton_check\" CHECK (\"singleton\")\\n);\\n',\n '\\nCREATE INDEX \"seo_media_references_media\" ON \"seo_media_references\" (\"media_id\");',\n '\\nCREATE INDEX \"seo_revisions_history\" ON \"seo_revisions\" (\"created_at\" DESC NULLS LAST,\"id\" DESC NULLS LAST);',\n '\\nALTER TABLE \"seo_media_references\" ADD CONSTRAINT \"seo_media_references_media_id_media_assets_id_fkey\" FOREIGN KEY (\"media_id\") REFERENCES \"media_assets\"(\"id\") ON DELETE RESTRICT;',\n '\\nALTER TABLE \"seo_state\" ADD CONSTRAINT \"seo_state_working_revision_fkey\" FOREIGN KEY (\"working_revision_id\") REFERENCES \"seo_revisions\"(\"id\") ON DELETE RESTRICT;',\n '\\nALTER TABLE \"seo_state\" ADD CONSTRAINT \"seo_state_published_revision_fkey\" FOREIGN KEY (\"published_revision_id\") REFERENCES \"seo_revisions\"(\"id\") ON DELETE RESTRICT;',\n \"\\nALTER TABLE \\\"activity_entries\\\" DROP CONSTRAINT \\\"activity_entries_action_check\\\", ADD CONSTRAINT \\\"activity_entries_action_check\\\" CHECK (\\\"action\\\" in ('document.created', 'document.updated', 'document.moved', 'document.trashed', 'document.revision.restored', 'document.untrashed', 'document.published', 'document.unpublished', 'media.uploaded', 'media.replaced', 'media.removed', 'media.cleaned', 'seo.saved', 'seo.published', 'user.created', 'user.removed', 'user.role.changed', 'user.sessions.revoked', 'authentication.signed-in', 'authentication.signed-out', 'authentication.password.changed', 'authentication.password.reset'));\",\n \"\\nALTER TABLE \\\"activity_entries\\\" DROP CONSTRAINT \\\"activity_entries_target_kind_check\\\", ADD CONSTRAINT \\\"activity_entries_target_kind_check\\\" CHECK (\\\"target_kind\\\" in ('document', 'media', 'media-library', 'seo', 'user'));\",\n '\\nALTER TABLE \"activity_entries\" DROP CONSTRAINT \"activity_entries_target_check\", ADD CONSTRAINT \"activity_entries_target_check\" CHECK ((\"target_kind\" in (\\'media-library\\', \\'seo\\') AND \"target_id\" IS NULL)\\n OR (\"target_kind\" not in (\\'media-library\\', \\'seo\\') AND \"target_id\" IS NOT NULL));',\n \"\\nALTER TABLE \\\"pending_changes\\\" DROP CONSTRAINT \\\"pending_changes_action_check\\\", ADD CONSTRAINT \\\"pending_changes_action_check\\\" CHECK (\\\"action\\\" in ('document.created', 'document.updated', 'document.moved', 'document.trashed', 'document.revision.restored', 'document.untrashed', 'document.published', 'document.unpublished', 'media.uploaded', 'media.replaced', 'media.removed', 'media.cleaned', 'seo.saved', 'seo.published', 'user.created', 'user.removed', 'user.role.changed', 'user.sessions.revoked', 'authentication.signed-in', 'authentication.signed-out', 'authentication.password.changed', 'authentication.password.reset'));\",\n ],\n bps: true,\n folderMillis: 1789233351000,\n hash: '8e6a6abf5385ab3ecf8eb083c1923ac9c74d72aa71bd1d444b7402d3e7e77000',\n name: '20260912171551_charming_valkyrie',\n },\n]\n","import type { SQLWrapper } from 'drizzle-orm'\nimport { sql } from 'drizzle-orm'\n\nexport const transactionTimestamp = sql`transaction_timestamp()`\n\nexport function isOneOf(column: SQLWrapper, values: readonly [string, ...string[]]) {\n return sql`${column} in (${sql.join(\n values.map((value) => sql`${value}`),\n sql`, `,\n )})`\n}\n","import type { Schema } from 'effect'\nimport { DOCUMENT_REVISION_ACTIONS } from '@internal/protocol/Documents'\nimport { sql } from 'drizzle-orm'\nimport {\n bigint,\n boolean,\n check,\n foreignKey,\n index,\n integer,\n jsonb,\n pgTable,\n text,\n timestamp,\n unique,\n uniqueIndex,\n uuid,\n} from 'drizzle-orm/pg-core'\nimport { isOneOf, transactionTimestamp } from '../database/table-helpers'\n\nexport const cmsState = pgTable(\n 'cms_state',\n {\n singleton: boolean().default(true).primaryKey(),\n generation: bigint({ mode: 'bigint' })\n .default(sql`0`)\n .notNull(),\n },\n (table) => [\n check('cms_state_singleton_check', sql`${table.singleton}`),\n check('cms_state_generation_check', sql`${table.generation} >= 0`),\n ],\n)\n\nexport const documentsTable = pgTable(\n 'documents',\n {\n id: uuid().defaultRandom().primaryKey(),\n sourcePath: text('source_path').notNull(),\n deletedAt: timestamp('deleted_at', { mode: 'string', withTimezone: true }),\n createdAt: timestamp('created_at', { mode: 'string', withTimezone: true }).default(transactionTimestamp).notNull(),\n updatedAt: timestamp('updated_at', { mode: 'string', withTimezone: true }).default(transactionTimestamp).notNull(),\n },\n (table) => [\n uniqueIndex('documents_active_path')\n .on(table.sourcePath)\n .where(sql`${table.deletedAt} is null`),\n ],\n)\n\nexport const documentRevisions = pgTable(\n 'document_revisions',\n {\n id: uuid().defaultRandom().primaryKey(),\n documentId: uuid('document_id')\n .notNull()\n .references(() => documentsTable.id, { onDelete: 'restrict' }),\n action: text({ enum: DOCUMENT_REVISION_ACTIONS }).notNull(),\n sourcePath: text('source_path').notNull(),\n markdown: text().notNull(),\n actorId: text('actor_id').notNull(),\n actorEmail: text('actor_email').notNull(),\n actorName: text('actor_name').notNull(),\n actorRoles: jsonb('actor_roles').$type<ReadonlyArray<string>>().notNull(),\n requestId: uuid('request_id').notNull(),\n reason: text(),\n activityDetails: jsonb('activity_details').$type<Schema.JsonObject>().default({}).notNull(),\n createdAt: timestamp('created_at', { mode: 'string', withTimezone: true }).default(transactionTimestamp).notNull(),\n },\n (table) => [\n check('document_revisions_action_check', isOneOf(table.action, DOCUMENT_REVISION_ACTIONS)),\n unique('document_revisions_document_id_unique').on(table.documentId, table.id),\n index('document_revisions_history').on(table.documentId, table.createdAt.desc(), table.id.desc()),\n ],\n)\n\nexport const documentHeads = pgTable(\n 'document_heads',\n {\n documentId: uuid('document_id')\n .primaryKey()\n .references(() => documentsTable.id, { onDelete: 'restrict' }),\n authoredRevisionId: uuid('authored_revision_id').notNull(),\n publishedRevisionId: uuid('published_revision_id'),\n },\n (table) => [\n foreignKey({\n columns: [table.documentId, table.authoredRevisionId],\n foreignColumns: [documentRevisions.documentId, documentRevisions.id],\n name: 'document_heads_authored_revision_fkey',\n }).onDelete('restrict'),\n foreignKey({\n columns: [table.documentId, table.publishedRevisionId],\n foreignColumns: [documentRevisions.documentId, documentRevisions.id],\n name: 'document_heads_published_revision_fkey',\n }).onDelete('restrict'),\n ],\n)\n\nexport const documentMediaReferences = pgTable(\n 'document_media_references',\n {\n id: uuid().defaultRandom().primaryKey(),\n documentId: uuid('document_id')\n .notNull()\n .references(() => documentsTable.id, { onDelete: 'cascade' }),\n objectKey: text('object_key').notNull(),\n path: text().notNull(),\n sourcePath: text('source_path').notNull(),\n nodePath: integer('node_path').array().notNull(),\n },\n (table) => [\n unique('document_media_references_identity_unique').on(\n table.documentId,\n table.sourcePath,\n table.nodePath,\n table.objectKey,\n ),\n check(\n 'document_media_references_object_key_check',\n sql`char_length(${table.objectKey}) between 1 and 1024\n AND btrim(${table.objectKey}) = ${table.objectKey}\n AND ${table.objectKey} !~ '(^/|/$|//|(^|/)\\\\.{1,2}(/|$)|[[:cntrl:]])'\n AND position(chr(92) in ${table.objectKey}) = 0`,\n ),\n check(\n 'document_media_references_node_path_check',\n sql`array_position(${table.nodePath}, NULL) IS NULL AND 0 <= ALL(${table.nodePath})`,\n ),\n index('document_media_references_object_key').on(table.objectKey),\n ],\n)\n","import type { Schema } from 'effect'\nimport { sql } from 'drizzle-orm'\nimport { boolean, check, jsonb, pgTable, text, uuid } from 'drizzle-orm/pg-core'\nimport { isOneOf } from '../database/table-helpers'\n\nconst INITIALIZATION_STATES = ['uninitialized', 'claiming', 'ready'] as const\n\nexport const initializationState = pgTable(\n 'initialization_state',\n {\n singleton: boolean().default(true).primaryKey(),\n state: text({ enum: INITIALIZATION_STATES }).default('uninitialized').notNull(),\n changeId: uuid('change_id'),\n claim: jsonb().$type<Schema.JsonObject>(),\n },\n (table) => [\n check('initialization_state_singleton_check', sql`${table.singleton}`),\n check('initialization_state_state_check', isOneOf(table.state, INITIALIZATION_STATES)),\n check(\n 'initialization_state_claim_check',\n sql`(${table.state} = 'claiming' AND ${table.changeId} IS NOT NULL AND jsonb_typeof(${table.claim}) = 'object')\n OR (${table.state} <> 'claiming' AND ${table.changeId} IS NULL AND ${table.claim} IS NULL)`,\n ),\n ],\n)\n","import { PgClient } from '@effect/sql-pg'\nimport { Effect, Layer } from 'effect'\nimport * as PgDrizzle from 'drizzle-orm/effect-postgres'\nimport { migrate } from 'drizzle-orm/pg-core/effect/session'\nimport { embeddedMigrations } from './embedded-migrations.generated'\nimport { cmsState } from '../documents/tables'\nimport { initializationState } from '../initialization/tables'\n\nconst MIGRATION_LOCK_KEY = 'cms:database-migrations:v1'\n\nexport const migrateCmsDatabase = Effect.fn('CmsDatabase.migrate')(function* (schema: string) {\n const postgres = yield* PgClient.PgClient\n const database = yield* PgDrizzle.makeWithDefaults()\n\n yield* postgres.withTransaction(\n Effect.gen(function* () {\n yield* postgres.unsafe('select pg_advisory_xact_lock(hashtextextended($1, 0))', [MIGRATION_LOCK_KEY])\n yield* migrate(embeddedMigrations, database._.session, {\n migrationsFolder: 'embedded',\n migrationsSchema: schema,\n migrationsTable: '__drizzle_migrations',\n })\n yield* database.insert(cmsState).values({}).onConflictDoNothing({ target: cmsState.singleton })\n yield* database\n .insert(initializationState)\n .values({})\n .onConflictDoNothing({ target: initializationState.singleton })\n }),\n )\n})\n\nexport function cmsDatabaseMigrationLayer(schema: string) {\n return Layer.effectDiscard(migrateCmsDatabase(schema))\n}\n","import type { PgPoolConfig } from '@effect/sql-pg/PgClient'\nimport { PgClient, PgPool } from '@effect/sql-pg'\nimport type * as Queue from 'effect/Queue'\nimport type * as Scope from 'effect/Scope'\nimport { Effect, Stream } from 'effect'\nimport * as Client from 'effect/unstable/sql/SqlClient'\nimport type { Borrower, Connection } from 'effect/unstable/sql/SqlConnection'\nimport type { SqlError } from 'effect/unstable/sql/SqlError'\nimport type { Custom } from 'effect/unstable/sql/Statement'\nimport * as Statement from 'effect/unstable/sql/Statement'\nimport type * as PgConnection from '@effect/sql-pg/PgConnection'\n\ninterface PgJson extends Custom<'PgJson', unknown> {}\n\nconst PgJson = Statement.custom<PgJson>('PgJson')\n\n/**\n * Builds a PostgreSQL client whose every physical pool connection starts in\n * the configured schema. The upstream driver does not yet expose PostgreSQL\n * startup parameters, so the initialization belongs at our pool seam.\n */\nconst makeSchemaClient = Effect.fn('Postgres.makeSchemaClient')(function* (options: PgPoolConfig, schema: string) {\n const pool = yield* PgPool.make(options)\n const initialized = new WeakSet<PgConnection.PgConnection>()\n const searchPath = `set search_path to \"${schema}\"`\n\n const initialize = (connection: PgConnection.PgConnection) =>\n initialized.has(connection)\n ? Effect.succeed(connection)\n : connection.query(searchPath).pipe(\n Effect.tap(() => Effect.sync(() => initialized.add(connection))),\n Effect.as(connection),\n )\n\n const acquirer = Effect.map(Effect.flatMap(pool.get, initialize), makeConnection)\n const transactionAcquirer = Effect.map(Effect.flatMap(pool.reserve, initialize), makeConnection)\n const listenAcquirer = Effect.flatMap(pool.reserve, initialize)\n\n const borrower: Borrower = (use) =>\n pool.use((connection) => Effect.flatMap(initialize(connection), (ready) => use(makeConnection(ready))))\n\n const compiler = PgClient.makeCompiler(options.transformQueryNames, options.transformJson)\n\n const transformRows = options.transformResultNames\n ? Statement.defaultTransforms(options.transformResultNames, options.transformJson).array\n : undefined\n\n const listen = (channel: string): Effect.Effect<Queue.Dequeue<PgConnection.Notification>, SqlError, Scope.Scope> =>\n Effect.flatMap(listenAcquirer, (connection) => connection.listen(channel))\n\n const json: PgClient.PgClient['json'] = (value) => Statement.fragment([PgJson(value, undefined, undefined)])\n\n return Object.assign(\n yield* Client.make({\n acquirer,\n borrower,\n compiler,\n prepareTransactionControls: true,\n spanAttributes: [\n ...(options.spanAttributes ? Object.entries(options.spanAttributes) : []),\n ['db.system.name', 'postgresql'],\n ['cms.database.schema', schema],\n ],\n transactionAcquirer,\n transformRows,\n }),\n {\n [PgClient.TypeId]: PgClient.TypeId,\n config: options,\n json,\n listen,\n notify: (channel: string, payload: string) =>\n Effect.asVoid(\n Effect.scoped(\n Effect.flatMap(acquirer, (connection) =>\n connection.executeRaw('select pg_notify($1, $2)', [channel, payload]),\n ),\n ),\n ),\n },\n ) satisfies PgClient.PgClient\n})\n\nclass ConnectionImpl implements Connection {\n readonly connection: PgConnection.PgConnection\n\n constructor(connection: PgConnection.PgConnection) {\n this.connection = connection\n }\n\n private run(query: string, params: ReadonlyArray<unknown>, prepare = true) {\n return Effect.map(this.connection.query(query, params, prepare), (result) => result.rows)\n }\n\n execute(\n sql: string,\n params: ReadonlyArray<unknown>,\n transformRows: (<A extends object>(rows: ReadonlyArray<A>) => ReadonlyArray<A>) | undefined,\n ) {\n const operation = this.run(sql, params)\n\n return transformRows ? Effect.map(operation, transformRows) : operation\n }\n\n executeRaw(sql: string, params: ReadonlyArray<unknown>) {\n return this.connection.query(sql, params)\n }\n\n executeWithoutTransform(sql: string, params: ReadonlyArray<unknown>) {\n return this.run(sql, params)\n }\n\n executeValues(sql: string, params: ReadonlyArray<unknown>) {\n return this.connection.queryValues(sql, params)\n }\n\n executeValuesUnprepared(sql: string, params: ReadonlyArray<unknown>) {\n return this.connection.queryValues(sql, params, false)\n }\n\n executeUnprepared(\n sql: string,\n params: ReadonlyArray<unknown>,\n transformRows: (<A extends object>(rows: ReadonlyArray<A>) => ReadonlyArray<A>) | undefined,\n ) {\n const operation = this.run(sql, params, false)\n\n return transformRows ? Effect.map(operation, transformRows) : operation\n }\n\n executeStream(\n sql: string,\n params: ReadonlyArray<unknown>,\n transformRows: (<A extends object>(rows: ReadonlyArray<A>) => ReadonlyArray<A>) | undefined,\n ) {\n const stream = this.connection.stream(sql, params)\n\n if (!transformRows) return stream\n\n return Stream.mapArray(stream, (rows) => {\n const transformed = transformRows(rows)\n const first = transformed[0]\n\n return first === undefined ? rows : [first, ...transformed.slice(1)]\n })\n }\n}\n\nfunction makeConnection(connection: PgConnection.PgConnection): Connection {\n return new ConnectionImpl(connection)\n}\n\nexport function schemaClientLayer(options: PgPoolConfig, schema: string) {\n return PgClient.layerFrom(makeSchemaClient(options, schema))\n}\n","import { StudioActor } from '@internal/protocol/AccessControl'\nimport { ActivityId } from '@internal/protocol/Activity'\nimport { User } from '@internal/protocol/Users'\nimport { Effect, Schema } from 'effect'\n\nexport const cmsUserCreationChangeField = 'cmsCreationChangeId'\n\nexport const cmsUserSessionsRevokedChangeField = 'cmsSessionsRevokedChangeId'\n\nconst BetterAuthUser = Schema.Struct({\n banned: Schema.optionalKey(Schema.NullOr(Schema.Boolean)),\n createdAt: Schema.Date,\n email: Schema.String,\n emailVerified: Schema.Boolean,\n id: Schema.String,\n name: Schema.String,\n role: Schema.optionalKey(Schema.NullOr(Schema.String)),\n updatedAt: Schema.Date,\n})\n\nconst BetterAuthUserRecoveryEvidence = Schema.Struct({\n [cmsUserCreationChangeField]: Schema.optionalKey(Schema.UndefinedOr(Schema.NullOr(ActivityId))),\n [cmsUserSessionsRevokedChangeField]: Schema.optionalKey(Schema.UndefinedOr(Schema.NullOr(ActivityId))),\n})\n\nexport type BetterAuthUserValue = typeof BetterAuthUser.Type\n\nexport interface BetterAuthUserRecoveryEvidenceValue extends BetterAuthUserValue {\n readonly cmsCreationChangeId?: string | null\n readonly cmsSessionsRevokedChangeId?: string | null\n}\n\nexport type BetterAuthActorValue = Pick<BetterAuthUserValue, 'email' | 'id' | 'name' | 'role'>\n\nexport function decodeBetterAuthUser(value: BetterAuthUserValue) {\n return Schema.decodeEffect(BetterAuthUser)(value).pipe(\n Effect.flatMap((user) =>\n Schema.decodeUnknownEffect(User)({\n banned: user.banned === true,\n createdAt: user.createdAt.toISOString(),\n email: user.email,\n emailVerified: user.emailVerified,\n id: user.id,\n name: user.name,\n role: user.role,\n updatedAt: user.updatedAt.toISOString(),\n }),\n ),\n )\n}\n\nexport function decodeBetterAuthActor(user: BetterAuthActorValue) {\n return Schema.decodeEffect(StudioActor)(betterAuthActorInput(user))\n}\n\nexport function decodeBetterAuthActorOption(user: BetterAuthActorValue) {\n return Schema.decodeOption(StudioActor)(betterAuthActorInput(user))\n}\n\nexport function decodeBetterAuthUserCreationChangeId(user: BetterAuthUserRecoveryEvidenceValue) {\n return decodeChangeId(user, cmsUserCreationChangeField)\n}\n\nexport function decodeBetterAuthUserSessionsRevokedChangeId(user: BetterAuthUserRecoveryEvidenceValue) {\n return decodeChangeId(user, cmsUserSessionsRevokedChangeField)\n}\n\nfunction decodeChangeId(\n user: BetterAuthUserRecoveryEvidenceValue,\n field: typeof cmsUserCreationChangeField | typeof cmsUserSessionsRevokedChangeField,\n) {\n return Schema.decodeEffect(BetterAuthUserRecoveryEvidence)(user).pipe(\n Effect.map((evidence) => evidence[field] ?? null),\n )\n}\n\nfunction betterAuthProviderRoles(value?: string | null): ReadonlyArray<string> {\n return value\n ? [\n ...new Set(\n value\n .split(',')\n .map((role) => role.trim())\n .filter(Boolean),\n ),\n ]\n : []\n}\n\nfunction betterAuthActorInput(user: BetterAuthActorValue) {\n return {\n email: user.email,\n id: user.id,\n name: user.name,\n roles: betterAuthProviderRoles(user.role),\n }\n}\n","import type { BetterAuthOptions } from 'better-auth'\nimport { betterAuth } from 'better-auth'\nimport { createAccessControl } from 'better-auth/plugins/access'\nimport { admin } from 'better-auth/plugins/admin'\nimport { defaultStatements } from 'better-auth/plugins/admin/access'\nimport type { CmsBetterAuthOptions } from '../BetterAuth'\nimport { CMS_AUTHENTICATION_PATH } from '@internal/protocol/HttpPaths'\nimport type { betterAuthActivityOptions } from './activity-hooks'\nimport { cmsUserCreationChangeField, cmsUserSessionsRevokedChangeField } from './user'\n\nconst cmsBetterAuthAccess = createAccessControl(defaultStatements)\n\ntype CmsBetterAuthRole = ReturnType<(typeof cmsBetterAuthAccess)['newRole']>\n\nconst cmsBetterAuthRoles = {\n administrator: cmsBetterAuthAccess.newRole({\n session: ['list', 'revoke'],\n user: ['create', 'list', 'get', 'set-role', 'delete', 'update'],\n }),\n editor: cmsBetterAuthAccess.newRole({ session: [], user: [] }),\n viewer: cmsBetterAuthAccess.newRole({ session: [], user: [] }),\n} satisfies Record<import('@internal/protocol/AccessControl').Role, CmsBetterAuthRole>\n\nconst timestampFields = { createdAt: 'created_at', updatedAt: 'updated_at' } as const\n\nexport function createCmsBetterAuthOptions(\n options: CmsBetterAuthOptions,\n activity?: ReturnType<typeof betterAuthActivityOptions>,\n) {\n return {\n advanced: { database: { generateId: 'uuid', joins: true } },\n appName: 'CMS Studio',\n basePath: options.basePath ?? CMS_AUTHENTICATION_PATH,\n baseURL: options.baseURL,\n database: options.database,\n emailAndPassword: {\n disableSignUp: true,\n enabled: true,\n ...activity?.emailAndPassword,\n },\n hooks: activity?.hooks,\n user: {\n additionalFields: {\n [cmsUserCreationChangeField]: hiddenChangeField('cms_creation_change_id'),\n [cmsUserSessionsRevokedChangeField]: hiddenChangeField('cms_sessions_revoked_change_id'),\n },\n modelName: 'auth_users',\n fields: { ...timestampFields, emailVerified: 'email_verified' },\n },\n session: {\n cookieCache: { enabled: false, strategy: 'jwt' },\n modelName: 'auth_sessions',\n fields: {\n ...timestampFields,\n expiresAt: 'expires_at',\n ipAddress: 'ip_address',\n userAgent: 'user_agent',\n userId: 'user_id',\n },\n },\n account: {\n modelName: 'auth_accounts',\n fields: {\n accessToken: 'access_token',\n accessTokenExpiresAt: 'access_token_expires_at',\n accountId: 'account_id',\n ...timestampFields,\n idToken: 'id_token',\n providerId: 'provider_id',\n refreshToken: 'refresh_token',\n refreshTokenExpiresAt: 'refresh_token_expires_at',\n userId: 'user_id',\n },\n },\n verification: {\n modelName: 'auth_verifications',\n fields: { ...timestampFields, expiresAt: 'expires_at' },\n },\n rateLimit: {\n enabled: true,\n storage: 'database',\n modelName: 'auth_rate_limits',\n fields: { lastRequest: 'last_request' },\n },\n plugins: [\n admin({\n ac: cmsBetterAuthAccess,\n adminRoles: ['administrator'],\n defaultRole: 'editor',\n roles: cmsBetterAuthRoles,\n schema: {\n session: { fields: { impersonatedBy: 'impersonated_by' } },\n user: {\n fields: {\n banExpires: 'ban_expires',\n banReason: 'ban_reason',\n banned: 'banned',\n role: 'role',\n },\n },\n },\n }),\n ],\n secret: options.secret,\n } satisfies BetterAuthOptions\n}\n\nexport function createCmsBetterAuth(\n options: CmsBetterAuthOptions,\n activity?: ReturnType<typeof betterAuthActivityOptions>,\n) {\n return betterAuth(createCmsBetterAuthOptions(options, activity))\n}\n\nexport type CmsBetterAuth = ReturnType<typeof createCmsBetterAuth>\n\nfunction hiddenChangeField(fieldName: string) {\n return {\n fieldName,\n input: false,\n required: false,\n returned: false,\n type: 'string',\n } as const\n}\n","import type { ActivityAction, ActivityEntry, ActivityTargetKind } from '@internal/protocol/Activity'\nimport type { ActivityUnavailable } from './activity'\nimport type { RequestId } from '@internal/protocol/Identity'\nimport type { DateTime, Effect } from 'effect'\nimport { Context } from 'effect'\n\nexport interface ActivityStoreCursor {\n readonly id: ActivityEntry['id']\n readonly occurredAt: DateTime.Utc\n}\n\nexport interface ActivityStoreQuery {\n readonly action?: ActivityAction\n readonly actorId?: string\n readonly cursor?: ActivityStoreCursor\n readonly limit: number\n readonly requestId?: RequestId\n readonly targetId?: string\n readonly targetKind?: ActivityTargetKind\n}\n\nexport interface ActivityStorePage {\n readonly entries: ReadonlyArray<ActivityEntry>\n readonly next?: ActivityStoreCursor\n readonly total: number\n}\n\nexport interface ActivityStoreApi {\n readonly append: (entry: ActivityEntry) => Effect.Effect<ActivityEntry, ActivityUnavailable>\n readonly list: (query: ActivityStoreQuery) => Effect.Effect<ActivityStorePage, ActivityUnavailable>\n}\n\nexport class ActivityStore extends Context.Service<ActivityStore, ActivityStoreApi>()(\n '@internal/server/ActivityStore',\n) {}\n","import type { ActivityEntry, ActivityEntryDraft } from '@internal/protocol/Activity'\nimport type { ActivityId } from '@internal/protocol/Activity'\nimport { ActivityEntry as ActivityEntrySchema } from '@internal/protocol/Activity'\nimport type { DateTime } from 'effect'\n\nexport function activityEntryFromDraft(\n id: ActivityId,\n draft: ActivityEntryDraft,\n occurredAt: DateTime.Utc,\n): ActivityEntry {\n const entry = {\n action: draft.action,\n actor: draft.context.actor,\n details: draft.details,\n id,\n occurredAt,\n requestId: draft.context.requestId,\n target: draft.target,\n }\n\n return draft.context.reason === undefined\n ? ActivityEntrySchema.make(entry)\n : ActivityEntrySchema.make({ ...entry, reason: draft.context.reason })\n}\n","import type { AccessDenied, StudioRequestContext } from '@internal/protocol/AccessControl'\nimport type { ActivityCursorInvalid, ActivityPage, ActivityQuery } from '@internal/protocol/Activity'\nimport {\n ActivityCursorInvalid as ActivityCursorInvalidError,\n ActivityPage as ActivityPageSchema,\n} from '@internal/protocol/Activity'\nimport { ActivityCursor, ActivityId } from '@internal/protocol/Activity'\nimport type { Effect } from 'effect'\nimport { Context, Effect as EffectRuntime, Layer, Schema } from 'effect'\nimport { AccessControl } from '../../AccessControl'\nimport { cursorCodec } from '../cursor'\nimport { ActivityStore } from './activity-storage'\n\nexport class ActivityUnavailable extends Schema.TaggedError<ActivityUnavailable>()('Activity.Unavailable', {\n operation: Schema.NonEmptyString,\n cause: Schema.Defect(),\n}) {}\n\nexport interface ActivityApi {\n readonly list: (\n context: StudioRequestContext,\n query: ActivityQuery,\n ) => Effect.Effect<ActivityPage, ActivityCursorInvalid | ActivityUnavailable | AccessDenied>\n}\n\nexport class Activity extends Context.Service<Activity, ActivityApi>()('@internal/server/Activity') {}\n\nconst CursorPayload = Schema.Struct({\n id: ActivityId,\n occurredAt: Schema.DateTimeUtcFromString,\n})\n\nconst cursors = cursorCodec(\n Schema.fromJsonString(CursorPayload),\n (value) => ActivityCursor.make(value),\n () => new ActivityCursorInvalidError(),\n)\n\nexport const activityLayer: Layer.Layer<Activity, never, ActivityStore | AccessControl> = Layer.effect(\n Activity,\n EffectRuntime.gen(function* () {\n const accessControl = yield* AccessControl\n const storage = yield* ActivityStore\n\n const list = EffectRuntime.fn('Activity.list')(function* (context: StudioRequestContext, query: ActivityQuery) {\n yield* accessControl.require(context, { action: 'activity.read', resource: { kind: 'activity' } })\n const cursor = query.cursor ? yield* EffectRuntime.fromResult(cursors.decode(query.cursor)) : undefined\n\n const page = yield* storage.list({\n action: query.action,\n actorId: query.actorId,\n cursor,\n limit: query.limit ?? 50,\n requestId: query.requestId,\n targetId: query.targetId,\n targetKind: query.targetKind,\n })\n\n const output = { entries: page.entries, total: page.total }\n\n return page.next\n ? ActivityPageSchema.make({ ...output, nextCursor: cursors.encode(page.next) })\n : ActivityPageSchema.make(output)\n })\n\n return Activity.of({ list })\n }),\n)\n","import type { StudioActor } from '@internal/protocol/AccessControl'\nimport type { StudioInternalError } from '@internal/protocol/StudioHttp'\nimport type { Effect } from 'effect'\nimport { Context } from 'effect'\nimport type { IdentityAuthority } from './Identity'\n\nexport interface AuthenticatedIdentity {\n readonly actor: StudioActor\n readonly authority: IdentityAuthority\n}\n\nexport interface AuthenticationApi {\n readonly authenticate: (\n headers: globalThis.Headers,\n ) => Effect.Effect<AuthenticatedIdentity | null, StudioInternalError>\n}\n\nexport class Authentication extends Context.Service<Authentication, AuthenticationApi>()(\n '@internal/server/Authentication',\n) {}\n\nexport interface AuthenticationHandlerApi {\n readonly handle: (request: Request) => Promise<Response>\n}\n\nexport class AuthenticationHandler extends Context.Service<AuthenticationHandler, AuthenticationHandlerApi>()(\n '@internal/server/AuthenticationHandler',\n) {}\n","import type { InitializationUnavailable } from './initialization-failures'\nimport type { User } from '@internal/protocol/Users'\nimport type { Effect } from 'effect'\nimport { Context, Data } from 'effect'\nimport type { InitialAdministratorIntent, InitialAdministratorObservation } from './initial-administrator-change'\n\nexport type InitialIdentityFailure = Data.TaggedEnum<{\n readonly Rejected: { readonly error: InitializationUnavailable }\n readonly Unknown: { readonly error: InitializationUnavailable }\n}>\n\nexport const InitialIdentityFailure = Data.taggedEnum<InitialIdentityFailure>()\n\nexport interface InitialIdentityPreparation {\n readonly apply: Effect.Effect<User, InitialIdentityFailure>\n readonly intent: InitialAdministratorIntent\n}\n\nexport interface InitialIdentityApi {\n readonly prepare: (input: {\n readonly email: string\n readonly name: string\n readonly password: string\n }) => InitialIdentityPreparation\n}\n\nexport class InitialIdentity extends Context.Service<InitialIdentity, InitialIdentityApi>()(\n '@internal/server/initialization/InitialIdentity',\n) {}\n\nexport interface InitialIdentityRecoveryApi {\n readonly observe: (\n intent: InitialAdministratorIntent,\n ) => Effect.Effect<InitialAdministratorObservation, InitializationUnavailable>\n}\n\nexport class InitialIdentityRecovery extends Context.Service<InitialIdentityRecovery, InitialIdentityRecoveryApi>()(\n '@internal/server/initialization/InitialIdentityRecovery',\n) {}\n","import type { ActivityId } from '@internal/protocol/Activity'\nimport type {\n CreateUserInput,\n User,\n UserAdministrationDenied,\n UserAlreadyExists,\n UserNotFound,\n UserPage,\n UserQuery,\n UserSelfRemovalDenied,\n UserSelfRoleChangeDenied,\n} from '@internal/protocol/Users'\nimport type { Effect } from 'effect'\nimport { Context, Data, Schema } from 'effect'\nimport type { UserChangeIntent, UserChangeObservation } from './user-change'\n\nexport class UserAdministrationUnavailable extends Schema.TaggedError<UserAdministrationUnavailable>()(\n 'UserAdministration.Unavailable',\n {\n operation: Schema.NonEmptyString,\n cause: Schema.Defect(),\n },\n) {}\n\nclass AuthorityValue {\n readonly #nominal = true\n\n toJSON(): never {\n void this.#nominal\n throw new TypeError('Identity authority cannot be serialized.')\n }\n}\n\nexport type IdentityAuthority = AuthorityValue\n\nexport function issueIdentityAuthority(): IdentityAuthority {\n return new AuthorityValue()\n}\n\nexport interface UserAdministrationRequest {\n readonly activity: import('@internal/protocol/AccessControl').StudioRequestContext\n readonly authority: IdentityAuthority\n}\n\nexport type IdentityCommand =\n | { readonly input: CreateUserInput; readonly kind: 'create' }\n | { readonly kind: 'remove'; readonly userId: string }\n | { readonly kind: 'change-role'; readonly role: User['role']; readonly userId: string }\n | { readonly kind: 'revoke-sessions'; readonly userId: string }\n\nexport type UserAdministrationError =\n | UserAdministrationDenied\n | UserAdministrationUnavailable\n | UserAlreadyExists\n | UserNotFound\n | UserSelfRemovalDenied\n | UserSelfRoleChangeDenied\n\nexport type IdentityApplyFailure = Data.TaggedEnum<{\n readonly Rejected: { readonly error: UserAdministrationError }\n readonly Unknown: { readonly error: UserAdministrationUnavailable }\n}>\n\nexport const IdentityApplyFailure = Data.taggedEnum<IdentityApplyFailure>()\n\nexport type IdentityPreparation = Data.TaggedEnum<{\n readonly Noop: { readonly user: User }\n readonly Prepared: {\n readonly apply: (changeId: ActivityId) => Effect.Effect<User, IdentityApplyFailure>\n readonly intent: UserChangeIntent\n readonly user?: User\n }\n}>\n\nexport const IdentityPreparation = Data.taggedEnum<IdentityPreparation>()\n\nexport interface IdentityAdministrationApi {\n readonly list: (\n authority: IdentityAuthority,\n query: UserQuery,\n ) => Effect.Effect<UserPage, UserAdministrationDenied | UserAdministrationUnavailable>\n readonly prepare: (\n authority: IdentityAuthority,\n command: IdentityCommand,\n ) => Effect.Effect<IdentityPreparation, UserAdministrationDenied | UserAdministrationUnavailable | UserNotFound>\n}\n\nexport class IdentityAdministration extends Context.Service<IdentityAdministration, IdentityAdministrationApi>()(\n '@internal/server/users/IdentityAdministration',\n) {}\n\nexport interface IdentityRecoveryApi {\n readonly observe: (intent: UserChangeIntent) => Effect.Effect<UserChangeObservation, UserAdministrationUnavailable>\n}\n\nexport class IdentityRecovery extends Context.Service<IdentityRecovery, IdentityRecoveryApi>()(\n '@internal/server/users/IdentityRecovery',\n) {}\n","const INITIAL = [\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n] as const\n\nconst ROUND = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98,\n 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8,\n 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819,\n 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7,\n 0xc67178f2,\n] as const\n\nexport function sha256Hex(value: string): string {\n const input = new TextEncoder().encode(value)\n const bitLength = BigInt(input.length) * 8n\n const paddedLength = Math.ceil((input.length + 9) / 64) * 64\n const padded = new Uint8Array(paddedLength)\n padded.set(input)\n padded[input.length] = 0x80\n const view = new DataView(padded.buffer)\n view.setBigUint64(paddedLength - 8, bitLength)\n\n const hash: Array<number> = [...INITIAL]\n const words = new Uint32Array(64)\n\n for (let offset = 0; offset < padded.length; offset += 64) {\n for (let index = 0; index < 16; index += 1) words[index] = view.getUint32(offset + index * 4)\n\n for (let index = 16; index < 64; index += 1) {\n const before15 = words[index - 15] ?? 0\n const before2 = words[index - 2] ?? 0\n const small0 = rotateRight(before15, 7) ^ rotateRight(before15, 18) ^ (before15 >>> 3)\n const small1 = rotateRight(before2, 17) ^ rotateRight(before2, 19) ^ (before2 >>> 10)\n words[index] = ((words[index - 16] ?? 0) + small0 + (words[index - 7] ?? 0) + small1) >>> 0\n }\n\n // SAFETY: the SHA-256 state is initialized with and always retains exactly eight words.\n let [a, b, c, d, e, f, g, h] = hash as [number, number, number, number, number, number, number, number]\n\n for (let index = 0; index < 64; index += 1) {\n const large1 = rotateRight(e, 6) ^ rotateRight(e, 11) ^ rotateRight(e, 25)\n const choose = (e & f) ^ (~e & g)\n const first = (h + large1 + choose + (ROUND[index] ?? 0) + (words[index] ?? 0)) >>> 0\n const large0 = rotateRight(a, 2) ^ rotateRight(a, 13) ^ rotateRight(a, 22)\n const majority = (a & b) ^ (a & c) ^ (b & c)\n\n const second = (large0 + majority) >>> 0\n\n ;[a, b, c, d, e, f, g, h] = [(first + second) >>> 0, a, b, c, (d + first) >>> 0, e, f, g]\n }\n\n ;[a, b, c, d, e, f, g, h].forEach((value, index) => {\n hash[index] = ((hash[index] ?? 0) + value) >>> 0\n })\n }\n\n return hash.map((word) => word.toString(16).padStart(8, '0')).join('')\n}\n\nfunction rotateRight(value: number, bits: number): number {\n return (value >>> bits) | (value << (32 - bits))\n}\n","import { ActivityAction, ActivityContext, ActivityTarget } from '@internal/protocol/Activity'\nimport { ActivityId } from '@internal/protocol/Activity'\nimport { flow, Result, Schema } from 'effect'\nimport { sha256Hex } from '../sha256'\n\nexport const ChangeScope = Schema.Literals(['initialization', 'media', 'users'])\n\nexport type ChangeScope = typeof ChangeScope.Type\n\nexport const ChangeOutcome = Schema.Literals(['applied', 'cancelled'])\n\nexport type ChangeOutcome = typeof ChangeOutcome.Type\n\nexport const ChangeSubject = Schema.NonEmptyString.check(Schema.isMaxLength(1_024)).pipe(Schema.brand('ChangeSubject'))\n\nexport type ChangeSubject = typeof ChangeSubject.Type\n\nexport const ChangeDraft = Schema.Struct({\n action: ActivityAction,\n context: ActivityContext,\n id: ActivityId,\n intent: Schema.JsonObject,\n scope: ChangeScope,\n subject: ChangeSubject,\n target: Schema.optionalKey(ActivityTarget),\n})\n\nexport interface ChangeDraft extends Schema.Schema.Type<typeof ChangeDraft> {}\n\nexport const PendingChange = ChangeDraft.pipe(\n Schema.fieldsAssign({\n createdAt: Schema.DateTimeUtcFromString,\n updatedAt: Schema.DateTimeUtcFromString,\n }),\n)\n\nexport interface PendingChange extends Schema.Schema.Type<typeof PendingChange> {}\n\nexport function changeFingerprint(change: ChangeDraft): string {\n const encoded = Result.getOrThrow(Schema.encodeResult(ChangeDraft)(change))\n\n return sha256Hex(JSON.stringify(canonicalJson(encoded)))\n}\n\nconst isJsonObject = Schema.is(Schema.JsonObject)\n\nconst decodeJson = flow(Schema.decodeUnknownResult(Schema.Json), Result.getOrThrow)\n\nfunction canonicalJson(value: Schema.Json): Schema.Json {\n if (Array.isArray(value)) return value.map(canonicalJson)\n\n if (!isJsonObject(value)) return value\n\n return Object.fromEntries(\n Object.keys(value)\n .sort((left, right) => left.localeCompare(right))\n .map((key) => [key, canonicalJson(decodeJson(value[key]))]),\n )\n}\n","import type { ActivityEntry, ActivityTarget } from '@internal/protocol/Activity'\nimport type { DateTime, Effect, Schema } from 'effect'\nimport { ActivityId } from '@internal/protocol/Activity'\nimport { Context, Data, Effect as EffectRuntime, Schema as SchemaRuntime } from 'effect'\nimport type { ChangeDraft, ChangeScope, ChangeSubject, PendingChange } from './change'\nimport { ChangeOutcome as ChangeOutcomeSchema } from './change'\n\nexport type ChangeBegin = Data.TaggedEnum<{\n readonly Cancelled: { readonly changeId: ActivityEntry['id'] }\n readonly Recorded: { readonly entry: ActivityEntry }\n readonly Unresolved: { readonly change: PendingChange }\n}>\n\nexport const ChangeBegin = Data.taggedEnum<ChangeBegin>()\n\nexport function requireUnresolvedChange(result: ChangeBegin): Effect.Effect<PendingChange, ChangeAlreadyResolved> {\n return ChangeBegin.$match(result, {\n Unresolved: ({ change }) => EffectRuntime.succeed(change),\n Recorded: ({ entry }) => EffectRuntime.fail(new ChangeAlreadyResolved({ changeId: entry.id, outcome: 'applied' })),\n Cancelled: ({ changeId }) => EffectRuntime.fail(new ChangeAlreadyResolved({ changeId, outcome: 'cancelled' })),\n })\n}\n\nexport interface AppliedChange {\n readonly kind: 'applied'\n readonly details: Schema.JsonObject\n readonly occurredAt?: DateTime.Utc\n readonly target?: ActivityTarget\n}\n\nexport interface CancelledChange {\n readonly kind: 'cancelled'\n}\n\nexport type ChangeResolution = AppliedChange | CancelledChange\n\nexport interface PendingChangeQuery {\n readonly before?: DateTime.Utc\n readonly limit: number\n readonly scope?: ChangeScope\n readonly subject?: ChangeSubject\n}\n\nexport interface PendingChangePage {\n readonly changes: ReadonlyArray<PendingChange>\n readonly total: number\n}\n\nexport interface ChangeJournalApi {\n readonly begin: (\n draft: ChangeDraft,\n ) => Effect.Effect<ChangeBegin, ChangeConflict | ChangeMismatch | ChangeJournalUnavailable>\n readonly pending: (\n query: PendingChangeQuery,\n ) => Effect.Effect<PendingChangePage, ChangeMismatch | ChangeJournalUnavailable>\n readonly resolve: (\n change: PendingChange,\n resolution: ChangeResolution,\n ) => Effect.Effect<ActivityEntry | void, ChangeMismatch | ChangeJournalUnavailable>\n}\n\nexport class ChangeJournal extends Context.Service<ChangeJournal, ChangeJournalApi>()(\n '@internal/server/ChangeJournal',\n) {}\n\nexport const findPendingChange = EffectRuntime.fn('ChangeJournal.findPending')(function* (\n journal: ChangeJournalApi,\n subject: ChangeSubject,\n) {\n const page = yield* journal.pending({ limit: 1, subject })\n\n return page.changes[0]\n})\n\nexport const requirePendingChangeFromJournal = EffectRuntime.fn('ChangeJournal.requirePending')(function* (\n journal: ChangeJournalApi,\n subject: ChangeSubject,\n action: PendingChange['action'],\n) {\n const change = yield* findPendingChange(journal, subject)\n\n if (!change || change.action !== action) return yield* new ChangeMismatch(change ? { changeId: change.id } : {})\n\n return change\n})\n\nexport class ChangeConflict extends SchemaRuntime.TaggedError<ChangeConflict>()('Change.Conflict', {\n changeId: ActivityId,\n pendingChangeId: ActivityId,\n}) {}\n\nexport class ChangeAlreadyResolved extends SchemaRuntime.TaggedError<ChangeAlreadyResolved>()(\n 'Change.AlreadyResolved',\n {\n changeId: ActivityId,\n outcome: ChangeOutcomeSchema,\n },\n) {}\n\nexport class ChangeMismatch extends SchemaRuntime.TaggedError<ChangeMismatch>()('Change.Mismatch', {\n changeId: SchemaRuntime.optionalKey(ActivityId),\n}) {}\n\nexport class ChangeJournalUnavailable extends SchemaRuntime.TaggedError<ChangeJournalUnavailable>()(\n 'Change.JournalUnavailable',\n {\n cause: SchemaRuntime.Defect(),\n operation: SchemaRuntime.NonEmptyString,\n },\n) {}\n","import { Schema } from 'effect'\nimport { ChangeSubject } from '../../adapter/ChangeJournal'\n\nexport const NormalizedUserEmail = Schema.NonEmptyString.pipe(Schema.brand('NormalizedUserEmail'))\n\nexport type NormalizedUserEmail = typeof NormalizedUserEmail.Type\n\nexport function normalizeUserEmail(email: string): NormalizedUserEmail {\n return NormalizedUserEmail.make(email.trim().toLowerCase())\n}\n\nexport function userEmailSubject(email: string): ChangeSubject {\n return ChangeSubject.make(`user-email:${normalizeUserEmail(email)}`)\n}\n\nexport type UserCommandFenceKey = `create-email:${string}` | `target-user:${string}` | `change-subject:${string}`\n\ntype UserFenceCommand =\n | { readonly input: { readonly email: string }; readonly kind: 'create' }\n | { readonly kind: 'remove' | 'change-role' | 'revoke-sessions'; readonly userId: string }\n\nexport function userCommandFenceKey(command: UserFenceCommand): UserCommandFenceKey {\n return command.kind === 'create'\n ? `create-email:${normalizeUserEmail(command.input.email)}`\n : `target-user:${command.userId}`\n}\n\nexport function userChangeSubjectFenceKey(subject: ChangeSubject): UserCommandFenceKey {\n return `change-subject:${subject}`\n}\n","import type { StudioRequestContext } from '@internal/protocol/AccessControl'\nimport type { User } from '@internal/protocol/Users'\nimport { ActivityId } from '@internal/protocol/Activity'\nimport { User as UserSchema } from '@internal/protocol/Users'\nimport { Result, Effect, Schema } from 'effect'\nimport type { ChangeJournalApi, PendingChange } from '../../adapter/ChangeJournal'\nimport { ChangeDraft, ChangeMismatch } from '../../adapter/ChangeJournal'\nimport { NormalizedUserEmail, normalizeUserEmail, userEmailSubject } from '../identity/user-identity'\n\nexport const InitialAdministratorIntent = Schema.Struct({\n kind: Schema.tag('create-initial-administrator'),\n name: UserSchema.fields.name,\n normalizedEmail: NormalizedUserEmail,\n role: Schema.Literal('administrator'),\n})\n\nexport interface InitialAdministratorIntent extends Schema.Schema.Type<typeof InitialAdministratorIntent> {}\n\nexport interface InitialAdministratorObservation {\n readonly credentialReady: boolean\n readonly user: User | null\n}\n\ninterface InitialAdministratorIdentity {\n readonly context: StudioRequestContext\n readonly id: ActivityId\n}\n\nexport function initialAdministratorIntent(input: {\n readonly email: string\n readonly name: string\n}): InitialAdministratorIntent {\n return InitialAdministratorIntent.make({\n kind: 'create-initial-administrator',\n name: input.name,\n normalizedEmail: normalizeUserEmail(input.email),\n role: 'administrator',\n })\n}\n\nexport function initialAdministratorDraft(\n identity: InitialAdministratorIdentity,\n intent: InitialAdministratorIntent,\n): ChangeDraft {\n return ChangeDraft.make({\n action: 'user.created',\n context: identity.context,\n id: identity.id,\n intent: Result.getOrThrow(Schema.encodeResult(InitialAdministratorIntent)(intent)),\n scope: 'initialization',\n subject: userEmailSubject(intent.normalizedEmail),\n })\n}\n\nconst decodeInitialAdministratorIntent = Effect.fn('InitialAdministrator.decodeIntent')(function* (\n change: PendingChange,\n) {\n return yield* Schema.decodeUnknownEffect(InitialAdministratorIntent)(change.intent).pipe(\n Effect.mapError(() => new ChangeMismatch({ changeId: change.id })),\n )\n})\n\nexport const reconcileInitialAdministrator = Effect.fn('InitialAdministrator.reconcile')(function* <E>(\n journal: ChangeJournalApi,\n change: PendingChange,\n observe: (intent: InitialAdministratorIntent) => Effect.Effect<InitialAdministratorObservation, E>,\n) {\n const intent = yield* decodeInitialAdministratorIntent(change)\n const observation = yield* observe(intent)\n\n if (!observation.user) {\n yield* journal.resolve(change, { kind: 'cancelled' })\n\n return { kind: 'cancelled' } as const\n }\n\n if (!observation.credentialReady || !matchesIntent(intent, observation.user)) {\n return { kind: 'ambiguous' } as const\n }\n\n yield* resolveInitialAdministrator(journal, change, observation.user)\n\n return { kind: 'applied', user: observation.user } as const\n})\n\nexport const resolveInitialAdministrator = Effect.fn('InitialAdministrator.resolve')(function* (\n journal: ChangeJournalApi,\n change: PendingChange,\n user: User,\n) {\n const intent = yield* decodeInitialAdministratorIntent(change)\n\n if (!matchesIntent(intent, user)) return yield* new ChangeMismatch({ changeId: change.id })\n\n return yield* journal.resolve(change, {\n details: { email: intent.normalizedEmail, name: intent.name, role: intent.role },\n kind: 'applied',\n target: { kind: 'user', userId: user.id },\n })\n})\n\nfunction matchesIntent(intent: InitialAdministratorIntent, user: User): boolean {\n return (\n normalizeUserEmail(user.email) === intent.normalizedEmail && user.name === intent.name && user.role === intent.role\n )\n}\n","import type { StudioRequestContext } from '@internal/protocol/AccessControl'\nimport type { User } from '@internal/protocol/Users'\nimport { Role } from '@internal/protocol/AccessControl'\nimport { ActivityId } from '@internal/protocol/Activity'\nimport { User as UserSchema } from '@internal/protocol/Users'\nimport { Result, Effect, Schema } from 'effect'\nimport type { ChangeJournalApi, PendingChange } from '../../../adapter/ChangeJournal'\nimport { ChangeDraft, ChangeMismatch } from '../../../adapter/ChangeJournal'\nimport {\n NormalizedUserEmail,\n normalizeUserEmail,\n userEmailSubject,\n type UserCommandFenceKey,\n} from '../../identity/user-identity'\nimport { sha256Hex } from '../../sha256'\n\nconst UserCreatedIntent = Schema.Struct({\n kind: Schema.tag('create'),\n name: UserSchema.fields.name,\n normalizedEmail: NormalizedUserEmail,\n role: Role,\n})\n\nconst UserRemovedIntent = Schema.Struct({\n email: UserSchema.fields.email,\n kind: Schema.tag('remove'),\n name: UserSchema.fields.name,\n role: Role,\n sessionFingerprints: Schema.Array(Schema.NonEmptyString),\n userId: UserSchema.fields.id,\n})\n\nconst UserRoleChangedIntent = Schema.Struct({\n email: UserSchema.fields.email,\n kind: Schema.tag('change-role'),\n name: UserSchema.fields.name,\n previousRole: Role,\n role: Role,\n userId: UserSchema.fields.id,\n})\n\nconst UserSessionsRevokedIntent = Schema.Struct({\n email: UserSchema.fields.email,\n kind: Schema.tag('revoke-sessions'),\n name: UserSchema.fields.name,\n sessionFingerprints: Schema.Array(Schema.NonEmptyString),\n userId: UserSchema.fields.id,\n})\n\nexport const UserChangeIntent = Schema.Union([\n UserCreatedIntent,\n UserRemovedIntent,\n UserRoleChangedIntent,\n UserSessionsRevokedIntent,\n]).pipe(Schema.toTaggedUnion('kind'))\n\nexport type UserChangeIntent = typeof UserChangeIntent.Type\n\nconst UserChangeFenceIntent = Schema.Union([\n Schema.Struct({ kind: Schema.tag('create'), normalizedEmail: NormalizedUserEmail }),\n Schema.Struct({ kind: Schema.tag('remove'), userId: UserSchema.fields.id }),\n Schema.Struct({ kind: Schema.tag('change-role'), userId: UserSchema.fields.id }),\n Schema.Struct({ kind: Schema.tag('revoke-sessions'), userId: UserSchema.fields.id }),\n]).pipe(Schema.toTaggedUnion('kind'))\n\nexport type UserChangeObservation =\n | {\n readonly creationChangeId: ActivityId | null\n readonly credentialReady: boolean\n readonly kind: 'create'\n readonly user: User | null\n }\n | {\n readonly kind: 'remove'\n readonly sessionFingerprints: ReadonlyArray<string>\n readonly user: User | null\n }\n | {\n readonly kind: 'revoke-sessions'\n readonly sessionFingerprints: ReadonlyArray<string>\n readonly sessionsRevokedChangeId: ActivityId | null\n readonly user: User | null\n }\n | {\n readonly kind: 'change-role'\n readonly user: User | null\n }\n\ninterface UserChangeIdentity {\n readonly context: StudioRequestContext\n readonly id: ActivityId\n}\n\nexport function sessionFingerprint(sessionId: string): string {\n return sha256Hex(sessionId)\n}\n\nexport function userCreationIntent(input: {\n readonly email: string\n readonly name: string\n readonly role: User['role']\n}): UserChangeIntent {\n return UserCreatedIntent.make({\n kind: 'create',\n name: input.name,\n normalizedEmail: normalizeUserEmail(input.email),\n role: input.role,\n })\n}\n\nexport function userRemovalIntent(user: User, sessionIds: ReadonlyArray<string>): UserChangeIntent {\n return UserRemovedIntent.make({\n email: user.email,\n kind: 'remove',\n name: user.name,\n role: user.role,\n sessionFingerprints: sessionIds.map(sessionFingerprint),\n userId: user.id,\n })\n}\n\nexport function userRoleChangeIntent(user: User, role: User['role']): UserChangeIntent {\n return UserRoleChangedIntent.make({\n email: user.email,\n kind: 'change-role',\n name: user.name,\n previousRole: user.role,\n role,\n userId: user.id,\n })\n}\n\nexport function userSessionsRevokedIntent(user: User, sessionIds: ReadonlyArray<string>): UserChangeIntent {\n return UserSessionsRevokedIntent.make({\n email: user.email,\n kind: 'revoke-sessions',\n name: user.name,\n sessionFingerprints: sessionIds.map(sessionFingerprint),\n userId: user.id,\n })\n}\n\nexport function userChangeDraft(identity: UserChangeIdentity, intent: UserChangeIntent): ChangeDraft {\n const base = {\n action: userChangeAction(intent),\n context: identity.context,\n id: identity.id,\n intent: Result.getOrThrow(Schema.encodeResult(UserChangeIntent)(intent)),\n scope: 'users' as const,\n subject: userEmailSubject(intent.kind === 'create' ? intent.normalizedEmail : intent.email),\n }\n\n return intent.kind === 'create'\n ? ChangeDraft.make(base)\n : ChangeDraft.make({ ...base, target: { kind: 'user', userId: intent.userId } })\n}\n\nconst decodeUserChangeIntent = Effect.fn('UserChange.decodeIntent')(function* (change: PendingChange) {\n return yield* Schema.decodeUnknownEffect(UserChangeIntent)(change.intent).pipe(\n Effect.mapError(() => new ChangeMismatch({ changeId: change.id })),\n )\n})\n\nexport const decodeUserChangeFenceKey = Effect.fn('UserChange.decodeFenceKey')(function* (change: PendingChange) {\n const intent = yield* Schema.decodeUnknownEffect(UserChangeFenceIntent)(change.intent).pipe(\n Effect.mapError(() => new ChangeMismatch({ changeId: change.id })),\n )\n\n return (\n intent.kind === 'create' ? `create-email:${intent.normalizedEmail}` : `target-user:${intent.userId}`\n ) satisfies UserCommandFenceKey\n})\n\nexport const reconcileUserChange = Effect.fn('UserChange.reconcile')(function* <E>(\n journal: ChangeJournalApi,\n change: PendingChange,\n observe: (intent: UserChangeIntent) => Effect.Effect<UserChangeObservation, E>,\n) {\n const intent = yield* decodeUserChangeIntent(change)\n const observation = yield* observe(intent)\n\n if (observation.kind !== intent.kind) return yield* new ChangeMismatch({ changeId: change.id })\n\n switch (intent.kind) {\n case 'create': {\n if (observation.kind !== 'create') return yield* new ChangeMismatch({ changeId: change.id })\n const user = observation.user\n\n if (!user) {\n yield* journal.resolve(change, { kind: 'cancelled' })\n\n return { kind: 'cancelled' } as const\n }\n\n if (observation.creationChangeId !== change.id) {\n yield* journal.resolve(change, { kind: 'cancelled' })\n\n return { kind: 'cancelled' } as const\n }\n\n if (!observation.credentialReady || !sameCreatedUser(intent, user)) return { kind: 'ambiguous' } as const\n yield* journal.resolve(change, appliedResolution(change, intent, user.id))\n\n return { kind: 'applied', user } as const\n }\n\n case 'remove': {\n if (observation.kind !== 'remove') return yield* new ChangeMismatch({ changeId: change.id })\n const user = observation.user\n\n if (!user) {\n yield* journal.resolve(change, appliedResolution(change, intent))\n\n return { kind: 'applied' } as const\n }\n\n const unchanged = sameExistingUser(intent, user)\n const remaining = retainedCount(intent.sessionFingerprints, observation.sessionFingerprints)\n\n if (unchanged && remaining === intent.sessionFingerprints.length) {\n yield* journal.resolve(change, { kind: 'cancelled' })\n\n return { kind: 'cancelled' } as const\n }\n\n return { kind: 'ambiguous' } as const\n }\n\n case 'change-role': {\n if (observation.kind !== 'change-role') return yield* new ChangeMismatch({ changeId: change.id })\n const user = observation.user\n\n if (!user) return { kind: 'ambiguous' } as const\n\n if (user.role === intent.previousRole) {\n yield* journal.resolve(change, { kind: 'cancelled' })\n\n return { kind: 'cancelled' } as const\n }\n\n if (user.role !== intent.role) return { kind: 'ambiguous' } as const\n yield* journal.resolve(change, appliedResolution(change, intent))\n\n return { kind: 'applied', user } as const\n }\n\n case 'revoke-sessions': {\n if (observation.kind !== 'revoke-sessions') return yield* new ChangeMismatch({ changeId: change.id })\n\n if (!observation.user) return { kind: 'ambiguous' } as const\n const remaining = retainedCount(intent.sessionFingerprints, observation.sessionFingerprints)\n\n if (observation.sessionsRevokedChangeId === change.id && remaining === 0) {\n yield* journal.resolve(change, appliedResolution(change, intent))\n\n return { kind: 'applied', user: observation.user } as const\n }\n\n if (observation.sessionsRevokedChangeId !== change.id && remaining === intent.sessionFingerprints.length) {\n yield* journal.resolve(change, { kind: 'cancelled' })\n\n return { kind: 'cancelled' } as const\n }\n\n return { kind: 'ambiguous' } as const\n }\n }\n})\n\nexport const resolveAppliedUserChange = Effect.fn('UserChange.resolveApplied')(function* (\n journal: ChangeJournalApi,\n change: PendingChange,\n user: User,\n) {\n const intent = yield* decodeUserChangeIntent(change)\n\n if (!resultMatches(intent, user)) return yield* new ChangeMismatch({ changeId: change.id })\n\n return yield* journal.resolve(change, appliedResolution(change, intent, user.id))\n})\n\nfunction userChangeDetails(intent: UserChangeIntent): Schema.JsonObject {\n switch (intent.kind) {\n case 'create':\n return { email: intent.normalizedEmail, name: intent.name, role: intent.role }\n case 'remove':\n return { email: intent.email, name: intent.name, previousRole: intent.role }\n case 'change-role':\n return {\n email: intent.email,\n name: intent.name,\n previousRole: intent.previousRole,\n role: intent.role,\n }\n case 'revoke-sessions':\n return { email: intent.email, name: intent.name, revokedCount: intent.sessionFingerprints.length }\n }\n}\n\nfunction userChangeAction(intent: UserChangeIntent): ChangeDraft['action'] {\n switch (intent.kind) {\n case 'create':\n return 'user.created'\n case 'remove':\n return 'user.removed'\n case 'change-role':\n return 'user.role.changed'\n case 'revoke-sessions':\n return 'user.sessions.revoked'\n }\n}\n\nfunction resultMatches(intent: UserChangeIntent, user: User): boolean {\n switch (intent.kind) {\n case 'create':\n return sameCreatedUser(intent, user)\n case 'remove':\n return sameExistingUser(intent, user)\n case 'change-role':\n return user.id === intent.userId && user.role === intent.role\n case 'revoke-sessions':\n return user.id === intent.userId\n }\n}\n\nfunction sameCreatedUser(intent: typeof UserCreatedIntent.Type, user: User): boolean {\n return (\n normalizeUserEmail(user.email) === intent.normalizedEmail && user.name === intent.name && user.role === intent.role\n )\n}\n\nfunction sameExistingUser(\n intent: typeof UserRemovedIntent.Type | typeof UserRoleChangedIntent.Type | typeof UserSessionsRevokedIntent.Type,\n user: User,\n): boolean {\n return (\n user.id === intent.userId &&\n user.email === intent.email &&\n user.name === intent.name &&\n ('role' in intent ? user.role === intent.role : true)\n )\n}\n\nfunction retainedCount(expected: ReadonlyArray<string>, observed: ReadonlyArray<string>): number {\n const current = new Set(observed)\n\n return expected.filter((fingerprint) => current.has(fingerprint)).length\n}\n\nfunction appliedResolution(change: PendingChange, intent: UserChangeIntent, userId?: string) {\n const target = userId === undefined ? change.target : ({ kind: 'user', userId } as const)\n\n return target === undefined\n ? { details: userChangeDetails(intent), kind: 'applied' as const }\n : { details: userChangeDetails(intent), kind: 'applied' as const, target }\n}\n","import { StudioActor } from '@internal/protocol/AccessControl'\nimport { ActivityEntryDraft, ActivityId } from '@internal/protocol/Activity'\nimport type { ActivityEntry, ActivityEntryDraft as ActivityDraft } from '@internal/protocol/Activity'\nimport { RequestId } from '@internal/protocol/Identity'\nimport type { ActivityStoreApi, ActivityUnavailable } from '@internal/server/adapter/ActivityStore'\nimport { activityEntryFromDraft } from '@internal/server/adapter/ActivityStore'\nimport { createAuthMiddleware, getSessionFromCtx, isAPIError } from 'better-auth/api'\nimport { Cause, Crypto, DateTime, Effect, Option } from 'effect'\nimport { decodeBetterAuthActorOption, type BetterAuthActorValue } from './user'\n\ntype WriteActivity = (draft: ActivityDraft) => Effect.Effect<ActivityEntry, ActivityUnavailable>\n\nexport function betterAuthActivityWriter(storage: ActivityStoreApi, crypto: Crypto.Crypto): WriteActivity {\n return Effect.fn('BetterAuthActivity.write')(function* (draft) {\n const id = ActivityId.make(yield* crypto.randomUUIDv4.pipe(Effect.orDie))\n\n return yield* storage.append(activityEntryFromDraft(id, draft, yield* DateTime.now))\n })\n}\n\nexport function betterAuthActivityOptions(\n writeActivity: WriteActivity,\n crypto: Crypto.Crypto,\n runPromise: typeof Effect.runPromise,\n) {\n const capturedActors = new WeakMap<object, StudioActor>()\n\n const write = (action: Parameters<typeof activityDraft>[0], actor: StudioActor) =>\n runPromise(\n crypto.randomUUIDv4.pipe(\n Effect.orDie,\n Effect.map((requestId) => activityDraft(action, actor, requestId)),\n Effect.flatMap(writeActivity),\n Effect.asVoid,\n Effect.catchCauseIf(\n (cause) => Cause.interruptors(cause).size === 0,\n () =>\n Effect.logWarning('Authentication Activity could not be recorded.', { action }).pipe(Effect.ignoreCause),\n ),\n ),\n )\n\n const before = createAuthMiddleware((context) => {\n // Better Auth 1.7.2 self-service revocation endpoints return only a boolean and do not expose\n // the exact committed deletion set to hooks. Emitting user.sessions.revoked here would invent\n // a completed fact; the fenced administrator workflow records that fact through its receipt.\n if (context.path !== '/sign-out' && context.path !== '/change-password') return Promise.resolve()\n\n return runPromise(\n Effect.tryPromise(() => getSessionFromCtx(context, { disableRefresh: true })).pipe(\n Effect.orElseSucceed(() => null),\n Effect.tap((session) =>\n Effect.sync(() => {\n const actor = session?.user ? decodeActor(session.user) : undefined\n\n if (actor) capturedActors.set(context.context, actor)\n }),\n ),\n Effect.asVoid,\n ),\n )\n })\n\n const after = createAuthMiddleware((context) => {\n if (isAPIError(context.context.returned)) return Promise.resolve()\n\n if (context.path === '/sign-in/email') {\n const actor = context.context.newSession?.user ? decodeActor(context.context.newSession.user) : undefined\n\n return actor ? write('authentication.signed-in', actor) : Promise.resolve()\n }\n\n const actor = capturedActors.get(context.context)\n capturedActors.delete(context.context)\n\n if (!actor) return Promise.resolve()\n\n if (context.path === '/sign-out') return write('authentication.signed-out', actor)\n\n if (context.path === '/change-password') return write('authentication.password.changed', actor)\n\n return Promise.resolve()\n })\n\n return {\n emailAndPassword: {\n onPasswordReset: ({ user }: { readonly user: BetterAuthActorValue }) => {\n const actor = decodeActor(user)\n\n return actor ? write('authentication.password.reset', actor) : Promise.resolve()\n },\n },\n hooks: { after, before },\n }\n}\n\nfunction activityDraft(\n action:\n | 'authentication.password.changed'\n | 'authentication.password.reset'\n | 'authentication.signed-in'\n | 'authentication.signed-out',\n actor: StudioActor,\n requestId: string,\n) {\n return ActivityEntryDraft.make({\n action,\n context: { actor, requestId: RequestId.make(requestId) },\n details: {},\n target: { kind: 'user', userId: actor.id },\n })\n}\n\nfunction decodeActor(user: BetterAuthActorValue): StudioActor | undefined {\n const option = decodeBetterAuthActorOption(user)\n\n return Option.getOrUndefined(option)\n}\n","export function rejectExternalAdminRoutes(\n handler: (request: Request) => Promise<Response>,\n basePath: string,\n): (request: Request) => Promise<Response> {\n const mountedAt = canonicalBasePath(basePath)\n\n return (request) => {\n const path = new URL(request.url).pathname\n\n const relative =\n mountedAt === '/'\n ? path\n : path === mountedAt\n ? '/'\n : path.startsWith(`${mountedAt}/`)\n ? path.slice(mountedAt.length)\n : path\n\n if (relative === '/admin' || relative.startsWith('/admin/')) {\n return Promise.resolve(new Response(null, { status: 404 }))\n }\n\n return handler(request)\n }\n}\n\nfunction canonicalBasePath(basePath: string): string {\n const withLeadingSlash = basePath.startsWith('/') ? basePath : `/${basePath}`\n\n return withLeadingSlash.replace(/\\/+$/u, '') || '/'\n}\n","import { ActivityContext } from '@internal/protocol/Activity'\nimport { ActivityId } from '@internal/protocol/Activity'\nimport { InitializationUnavailable } from './initialization-failures'\nimport { Context, Effect, Schema } from 'effect'\nimport { InitialAdministratorIntent } from './initial-administrator-change'\n\nexport const InitializationClaim = Schema.Struct({\n changeId: ActivityId,\n context: ActivityContext,\n intent: InitialAdministratorIntent,\n})\n\nexport interface InitializationClaim extends Schema.Schema.Type<typeof InitializationClaim> {}\n\nconst Uninitialized = Schema.Struct({ state: Schema.tag('uninitialized') })\n\nconst Claiming = Schema.Struct({ claim: InitializationClaim, state: Schema.tag('claiming') })\n\nconst Ready = Schema.Struct({ state: Schema.tag('ready') })\n\nexport const StoredInitializationState = Schema.Union([Uninitialized, Claiming, Ready]).pipe(\n Schema.toTaggedUnion('state'),\n)\n\nexport type StoredInitializationState = typeof StoredInitializationState.Type\n\nexport interface InitializationStoreApi {\n readonly claim: (claim: InitializationClaim) => Effect.Effect<boolean, InitializationUnavailable>\n readonly complete: (changeId: ActivityId) => Effect.Effect<void, InitializationUnavailable>\n readonly read: Effect.Effect<StoredInitializationState, InitializationUnavailable>\n readonly reset: (changeId: ActivityId) => Effect.Effect<void, InitializationUnavailable>\n /** Serializes Initialization workflows across every client sharing this Store backend. */\n readonly runExclusive: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | InitializationUnavailable, R>\n}\n\nexport class InitializationStore extends Context.Service<InitializationStore, InitializationStoreApi>()(\n '@internal/server/initialization/InitializationStore',\n) {}\n","import { Schema } from 'effect'\n\nexport class InitializationUnavailable extends Schema.TaggedError<InitializationUnavailable>()(\n 'Initialization.Unavailable',\n { operation: Schema.NonEmptyString, cause: Schema.Defect() },\n) {}\n","import type { CreateUserInput } from '@internal/protocol/Users'\nimport { InitializationUnavailable } from '@internal/server/adapter/InitializationStore'\nimport {\n UserAdministrationDenied,\n UserAlreadyExists,\n UserNotFound,\n UserSelfRemovalDenied,\n} from '@internal/protocol/Users'\nimport { Option, Schema } from 'effect'\nimport {\n IdentityApplyFailure,\n InitialIdentityFailure,\n type IdentityCommand,\n UserAdministrationUnavailable,\n} from '@internal/server/adapter/Identity'\n\ninterface BetterAuthErrorCodes {\n readonly INVALID_EMAIL: ErrorCode\n readonly INVALID_ROLE_TYPE: ErrorCode\n readonly USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL: ErrorCode\n readonly USER_NOT_FOUND: ErrorCode\n readonly YOU_ARE_NOT_ALLOWED_TO_CHANGE_USERS_ROLE: ErrorCode\n readonly YOU_ARE_NOT_ALLOWED_TO_CREATE_USERS: ErrorCode\n readonly YOU_ARE_NOT_ALLOWED_TO_DELETE_USERS: ErrorCode\n readonly YOU_ARE_NOT_ALLOWED_TO_GET_USER: ErrorCode\n readonly YOU_ARE_NOT_ALLOWED_TO_LIST_USERS: ErrorCode\n readonly YOU_ARE_NOT_ALLOWED_TO_LIST_USERS_SESSIONS: ErrorCode\n readonly YOU_ARE_NOT_ALLOWED_TO_REVOKE_USERS_SESSIONS: ErrorCode\n readonly YOU_ARE_NOT_ALLOWED_TO_SET_NON_EXISTENT_VALUE: ErrorCode\n readonly YOU_CANNOT_REMOVE_YOURSELF: ErrorCode\n}\n\ninterface ErrorCode {\n readonly code: string\n}\n\nexport function prepareError(\n codes: BetterAuthErrorCodes,\n operation: string,\n cause: unknown,\n): UserAdministrationDenied | UserAdministrationUnavailable\nexport function prepareError(\n codes: BetterAuthErrorCodes,\n operation: string,\n cause: unknown,\n userId: string,\n): UserAdministrationDenied | UserAdministrationUnavailable | UserNotFound\nexport function prepareError(codes: BetterAuthErrorCodes, operation: string, cause: unknown, userId?: string) {\n const code = apiErrorCode(cause)\n\n if (userId !== undefined && matches(code, codes.USER_NOT_FOUND)) return new UserNotFound({ userId })\n\n if (\n matches(\n code,\n codes.YOU_ARE_NOT_ALLOWED_TO_GET_USER,\n codes.YOU_ARE_NOT_ALLOWED_TO_LIST_USERS,\n codes.YOU_ARE_NOT_ALLOWED_TO_LIST_USERS_SESSIONS,\n )\n ) {\n return new UserAdministrationDenied()\n }\n\n return unavailable(operation, cause)\n}\n\nexport function applyError(codes: BetterAuthErrorCodes, operation: string, command: IdentityCommand, cause: unknown) {\n const code = apiErrorCode(cause)\n const rejection = commandRejection(codes, command, code)\n\n if (rejection) return IdentityApplyFailure.Rejected({ error: rejection })\n\n return IdentityApplyFailure.Unknown({ error: unavailable(operation, cause) })\n}\n\nexport function initialIdentityError(\n codes: BetterAuthErrorCodes,\n operation: string,\n input: CreateUserInput,\n cause: unknown,\n) {\n const code = apiErrorCode(cause)\n const command = { input, kind: 'create' } as const\n const error = initializationUnavailable(operation, cause)\n\n return commandRejection(codes, command, code) && code !== codes.USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL.code\n ? InitialIdentityFailure.Rejected({ error })\n : InitialIdentityFailure.Unknown({ error })\n}\n\nexport function unavailable(operation: string, cause: unknown): UserAdministrationUnavailable {\n return new UserAdministrationUnavailable({ cause, operation })\n}\n\nexport function initializationUnavailable(operation: string, cause: unknown): InitializationUnavailable {\n return new InitializationUnavailable({ cause, operation })\n}\n\ntype AdministrationRejection = UserAdministrationDenied | UserAlreadyExists | UserNotFound | UserSelfRemovalDenied\n\nfunction commandRejection(\n codes: BetterAuthErrorCodes,\n command: IdentityCommand,\n code: string | undefined,\n): AdministrationRejection | undefined {\n switch (command.kind) {\n case 'create': {\n if (matches(code, codes.USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL)) {\n return new UserAlreadyExists({ email: command.input.email })\n }\n\n return matches(\n code,\n codes.YOU_ARE_NOT_ALLOWED_TO_CREATE_USERS,\n codes.YOU_ARE_NOT_ALLOWED_TO_CHANGE_USERS_ROLE,\n codes.YOU_ARE_NOT_ALLOWED_TO_SET_NON_EXISTENT_VALUE,\n codes.INVALID_ROLE_TYPE,\n codes.INVALID_EMAIL,\n )\n ? new UserAdministrationDenied()\n : undefined\n }\n\n case 'remove': {\n if (matches(code, codes.YOU_CANNOT_REMOVE_YOURSELF)) {\n return new UserSelfRemovalDenied({ userId: command.userId })\n }\n\n if (matches(code, codes.USER_NOT_FOUND)) return new UserNotFound({ userId: command.userId })\n\n return matches(code, codes.YOU_ARE_NOT_ALLOWED_TO_DELETE_USERS) ? new UserAdministrationDenied() : undefined\n }\n\n case 'change-role': {\n if (matches(code, codes.USER_NOT_FOUND)) return new UserNotFound({ userId: command.userId })\n\n return matches(\n code,\n codes.YOU_ARE_NOT_ALLOWED_TO_CHANGE_USERS_ROLE,\n codes.YOU_ARE_NOT_ALLOWED_TO_SET_NON_EXISTENT_VALUE,\n codes.INVALID_ROLE_TYPE,\n )\n ? new UserAdministrationDenied()\n : undefined\n }\n\n case 'revoke-sessions':\n return matches(code, codes.YOU_ARE_NOT_ALLOWED_TO_REVOKE_USERS_SESSIONS)\n ? new UserAdministrationDenied()\n : undefined\n }\n}\n\nfunction matches(code: string | undefined, ...candidates: ReadonlyArray<ErrorCode>): boolean {\n return code !== undefined && candidates.some((candidate) => candidate.code === code)\n}\n\nfunction apiErrorCode(cause: unknown): string | undefined {\n if (!(cause instanceof Error) || cause.name !== 'APIError') return undefined\n\n const apiError = Schema.decodeUnknownOption(\n Schema.Struct({ body: Schema.Struct({ code: Schema.String }), statusCode: Schema.Int }),\n )(cause)\n\n return Option.map(apiError, ({ body }) => body.code).pipe(Option.getOrUndefined)\n}\n","import { Effect } from 'effect'\nimport type { CmsBetterAuth } from './better-auth'\n\nexport type BetterAuthInternalAdapter = Awaited<CmsBetterAuth['$context']>['internalAdapter']\n\nexport function providerCall<A, E>(\n operation: string,\n request: () => Promise<A>,\n onError: (operation: string, cause: unknown) => E,\n) {\n return Effect.tryPromise({ catch: (cause) => onError(operation, cause), try: request }).pipe(\n Effect.withSpan(operation),\n )\n}\n\nexport function providerAdapter<E>(\n auth: CmsBetterAuth,\n operation: string,\n onError: (operation: string, cause: unknown) => E,\n) {\n return providerCall(operation, () => auth.$context, onError).pipe(Effect.map((context) => context.internalAdapter))\n}\n","import { studioInternalError } from '@internal/protocol/StudioHttp'\nimport type { User, UserQuery } from '@internal/protocol/Users'\nimport { UserPage } from '@internal/protocol/Users'\nimport { Authentication, type AuthenticationApi } from '@internal/server/adapter/Authentication'\nimport {\n IdentityAdministration,\n IdentityApplyFailure,\n IdentityPreparation,\n issueIdentityAuthority,\n UserAdministrationUnavailable,\n type IdentityAdministrationApi,\n type IdentityAuthority,\n type IdentityCommand,\n} from '@internal/server/adapter/Identity'\nimport {\n userCreationIntent,\n userRemovalIntent,\n userRoleChangeIntent,\n userSessionsRevokedIntent,\n} from '@internal/server/adapter/Identity'\nimport { DateTime, Effect } from 'effect'\nimport type { CmsBetterAuth } from './better-auth'\nimport { applyError, prepareError, unavailable } from './errors'\nimport { providerCall } from './provider'\nimport {\n cmsUserCreationChangeField,\n cmsUserSessionsRevokedChangeField,\n decodeBetterAuthActor,\n decodeBetterAuthUser,\n} from './user'\n\nexport function betterAuthIdentity(auth: CmsBetterAuth) {\n const authorityHeaders = new WeakMap<IdentityAuthority, globalThis.Headers>()\n\n const authenticate: AuthenticationApi['authenticate'] = Effect.fn('BetterAuth.Authentication.authenticate')(\n function* (headers) {\n const providerHeaders = new globalThis.Headers(headers)\n\n const session = yield* providerCall(\n 'BetterAuth.getSession',\n () => auth.api.getSession({ headers: providerHeaders, query: { disableCookieCache: true } }),\n () => studioInternalError(),\n )\n\n if (!session?.user) return null\n const actor = yield* decodeBetterAuthActor(session.user).pipe(Effect.mapError(() => studioInternalError()))\n const authority = issueIdentityAuthority()\n authorityHeaders.set(authority, providerHeaders)\n\n return { actor, authority }\n },\n )\n\n const list: IdentityAdministrationApi['list'] = Effect.fn('BetterAuth.Administration.list')(function* (\n authority,\n query: UserQuery,\n ) {\n const headers = yield* requireAuthority(authorityHeaders, authority)\n\n const search = query.search\n ? { searchField: 'email' as const, searchOperator: 'contains' as const, searchValue: query.search }\n : undefined\n\n const result = yield* prepareOperation(auth, 'BetterAuth.listUsers', () =>\n auth.api.listUsers({\n headers,\n query: {\n limit: query.limit ?? 50,\n offset: query.offset ?? 0,\n sortBy: 'createdAt',\n sortDirection: 'asc',\n ...search,\n },\n }),\n )\n\n const users = yield* Effect.forEach(result.users, (user) => decodeUser(user, 'BetterAuth.listUsers'))\n\n return UserPage.make({ total: result.total, users })\n })\n\n const prepare: IdentityAdministrationApi['prepare'] = Effect.fn('BetterAuth.Administration.prepare')(function* (\n authority,\n command: IdentityCommand,\n ) {\n const headers = yield* requireAuthority(authorityHeaders, authority)\n\n switch (command.kind) {\n case 'create': {\n const intent = userCreationIntent(command.input)\n\n const apply: PreparedApply = (changeId) =>\n applyOperation(auth, 'BetterAuth.createUser', command, () =>\n auth.api.createUser({\n body: {\n data: { [cmsUserCreationChangeField]: changeId },\n email: command.input.email,\n name: command.input.name,\n password: command.input.password,\n role: command.input.role,\n },\n headers,\n }),\n ).pipe(Effect.flatMap((result) => decodeAppliedUser(result.user, 'BetterAuth.createUser')))\n\n return IdentityPreparation.Prepared({ apply, intent })\n }\n\n case 'remove': {\n const user = yield* getUser(auth, headers, command.userId)\n const sessions = yield* listSessions(auth, headers, command.userId)\n\n const intent = userRemovalIntent(\n user,\n sessions.map((session) => session.id),\n )\n\n const apply = () =>\n applyOperation(auth, 'BetterAuth.removeUser', command, () =>\n auth.api.removeUser({ body: { userId: command.userId }, headers }),\n ).pipe(Effect.as(user))\n\n return IdentityPreparation.Prepared({ apply, intent, user })\n }\n\n case 'change-role': {\n const user = yield* getUser(auth, headers, command.userId)\n\n if (user.role === command.role) return IdentityPreparation.Noop({ user })\n const intent = userRoleChangeIntent(user, command.role)\n\n const apply = () =>\n applyOperation(auth, 'BetterAuth.setRole', command, () =>\n auth.api.setRole({ body: { role: command.role, userId: command.userId }, headers }),\n ).pipe(Effect.flatMap((result) => decodeAppliedUser(result.user, 'BetterAuth.setRole')))\n\n return IdentityPreparation.Prepared({ apply, intent, user })\n }\n\n case 'revoke-sessions': {\n const user = yield* getUser(auth, headers, command.userId)\n const sessions = yield* listSessions(auth, headers, command.userId)\n const now = DateTime.toEpochMillis(yield* DateTime.now)\n const active = sessions.filter((session) => session.expiresAt.getTime() > now)\n\n if (active.length === 0) return IdentityPreparation.Noop({ user })\n\n const intent = userSessionsRevokedIntent(\n user,\n active.map((session) => session.id),\n )\n\n const apply: PreparedApply = (changeId) =>\n applyOperation(auth, 'BetterAuth.revokeUserSessions', command, () =>\n auth.api.revokeUserSessions({ body: { userId: command.userId }, headers }),\n ).pipe(\n Effect.flatMap(() =>\n providerCall(\n 'BetterAuth.adminUpdateUser.sessionRevocationReceipt',\n () =>\n auth.api.adminUpdateUser({\n body: {\n data: { [cmsUserSessionsRevokedChangeField]: changeId },\n userId: command.userId,\n },\n headers,\n }),\n (operation, cause) =>\n IdentityApplyFailure.Unknown({\n error: unavailable(operation, cause),\n }),\n ),\n ),\n Effect.as(user),\n )\n\n return IdentityPreparation.Prepared({ apply, intent, user })\n }\n }\n })\n\n return {\n administration: IdentityAdministration.of({ list, prepare }),\n authentication: Authentication.of({ authenticate }),\n }\n}\n\ntype PreparedApply = Extract<IdentityPreparation, { readonly _tag: 'Prepared' }>['apply']\n\nfunction prepareOperation<A>(auth: CmsBetterAuth, operation: string, request: () => Promise<A>) {\n return providerCall(operation, request, (name, cause) => prepareError(auth.$ERROR_CODES, name, cause))\n}\n\nfunction prepareUserOperation<A>(auth: CmsBetterAuth, operation: string, userId: string, request: () => Promise<A>) {\n return providerCall(operation, request, (name, cause) => prepareError(auth.$ERROR_CODES, name, cause, userId))\n}\n\nfunction applyOperation<A>(\n auth: CmsBetterAuth,\n operation: string,\n command: IdentityCommand,\n request: () => Promise<A>,\n) {\n return providerCall(operation, request, (name, cause) => applyError(auth.$ERROR_CODES, name, command, cause))\n}\n\nfunction requireAuthority(\n authorityHeaders: WeakMap<IdentityAuthority, globalThis.Headers>,\n authority: IdentityAuthority,\n) {\n const headers = authorityHeaders.get(authority)\n\n return headers\n ? Effect.succeed(headers)\n : Effect.fail(\n new UserAdministrationUnavailable({\n cause: new Error('Identity authority is invalid or expired.'),\n operation: 'BetterAuth.authority',\n }),\n )\n}\n\nfunction decodeAppliedUser(user: Parameters<typeof decodeUser>[0], operation: string) {\n return decodeUser(user, operation).pipe(Effect.mapError((error) => IdentityApplyFailure.Unknown({ error })))\n}\n\nfunction getUser(auth: CmsBetterAuth, headers: globalThis.Headers, userId: string) {\n return prepareUserOperation(auth, 'BetterAuth.getUser', userId, () =>\n auth.api.getUser({ headers, query: { id: userId } }),\n ).pipe(Effect.flatMap((user) => decodeUser(user, 'BetterAuth.getUser')))\n}\n\nfunction listSessions(auth: CmsBetterAuth, headers: globalThis.Headers, userId: string) {\n return prepareUserOperation(auth, 'BetterAuth.listUserSessions', userId, () =>\n auth.api.listUserSessions({ body: { userId }, headers }),\n ).pipe(Effect.map((result) => result.sessions))\n}\n\nfunction decodeUser(\n user: Parameters<typeof decodeBetterAuthUser>[0],\n operation: string,\n): Effect.Effect<User, UserAdministrationUnavailable> {\n return decodeBetterAuthUser(user).pipe(Effect.mapError((cause) => unavailable(operation, cause)))\n}\n","import { CreateUserInput } from '@internal/protocol/Users'\nimport { Effect } from 'effect'\nimport {\n InitialIdentity,\n InitialIdentityFailure,\n initialAdministratorIntent,\n type InitialIdentityApi,\n} from '@internal/server/adapter/Identity'\nimport type { CmsBetterAuth } from './better-auth'\nimport { initialIdentityError, initializationUnavailable } from './errors'\nimport { providerCall } from './provider'\nimport { decodeBetterAuthUser } from './user'\n\nexport function betterAuthInitialIdentity(auth: CmsBetterAuth): InitialIdentityApi {\n return InitialIdentity.of({\n prepare: (input) => {\n const createInput = CreateUserInput.make({ ...input, role: 'administrator' })\n const intent = initialAdministratorIntent(input)\n\n const apply = providerCall(\n 'BetterAuth.initialization.createUser',\n () =>\n auth.api.createUser({\n body: {\n data: { emailVerified: true },\n ...createInput,\n },\n }),\n (operation, cause) => initialIdentityError(auth.$ERROR_CODES, operation, createInput, cause),\n ).pipe(\n Effect.flatMap((result) =>\n decodeBetterAuthUser(result.user).pipe(\n Effect.mapError((cause) =>\n InitialIdentityFailure.Unknown({\n error: initializationUnavailable('BetterAuth.initialization.createUser', cause),\n }),\n ),\n ),\n ),\n )\n\n return { apply, intent }\n },\n })\n}\n","import { Effect } from 'effect'\nimport {\n IdentityRecovery,\n InitialIdentityRecovery,\n sessionFingerprint,\n type IdentityRecoveryApi,\n type InitialIdentityRecoveryApi,\n} from '@internal/server/adapter/Identity'\nimport type { CmsBetterAuth } from './better-auth'\nimport { initializationUnavailable, unavailable } from './errors'\nimport { providerAdapter, providerCall, type BetterAuthInternalAdapter } from './provider'\nimport {\n decodeBetterAuthUser,\n decodeBetterAuthUserCreationChangeId,\n decodeBetterAuthUserSessionsRevokedChangeId,\n} from './user'\n\ninterface BetterAuthRecovery {\n readonly initial: InitialIdentityRecoveryApi\n readonly users: IdentityRecoveryApi\n}\n\nexport function betterAuthRecovery(auth: CmsBetterAuth): BetterAuthRecovery {\n const userAdapter = providerAdapter(auth, 'BetterAuth.recovery.context', unavailable)\n\n const initialAdapter = providerAdapter(auth, 'BetterAuth.initialization.recovery.context', initializationUnavailable)\n\n const users: IdentityRecoveryApi = IdentityRecovery.of({\n observe: Effect.fn('BetterAuth.Recovery.observeUserChange')(function* (intent) {\n const adapter = yield* userAdapter\n\n switch (intent.kind) {\n case 'create': {\n const result = yield* providerCall(\n 'BetterAuth.recovery.findUserByEmail',\n () => adapter.findUserByEmail(intent.normalizedEmail, { includeAccounts: true }),\n unavailable,\n )\n\n if (!result) return { creationChangeId: null, credentialReady: false, kind: 'create', user: null }\n const user = yield* decodeUser(result.user, 'BetterAuth.recovery.findUserByEmail')\n\n return {\n creationChangeId: yield* decodeBetterAuthUserCreationChangeId(result.user).pipe(\n Effect.mapError((cause) => unavailable('BetterAuth.recovery.creationChangeId', cause)),\n ),\n credentialReady: hasCredential(result.accounts),\n kind: 'create',\n user,\n }\n }\n\n case 'remove': {\n const user = yield* findUser(adapter, intent.userId)\n const sessionFingerprints = yield* findSessionFingerprints(adapter, intent.userId)\n\n return { kind: 'remove', sessionFingerprints, user }\n }\n\n case 'change-role':\n return { kind: 'change-role', user: yield* findUser(adapter, intent.userId) }\n case 'revoke-sessions': {\n const rawUser = yield* findRawUser(adapter, intent.userId)\n const user = rawUser ? yield* decodeUser(rawUser, 'BetterAuth.recovery.findUserById') : null\n const sessionFingerprints = yield* findSessionFingerprints(adapter, intent.userId)\n\n return {\n kind: 'revoke-sessions',\n sessionFingerprints,\n sessionsRevokedChangeId: rawUser\n ? yield* decodeBetterAuthUserSessionsRevokedChangeId(rawUser).pipe(\n Effect.mapError((cause) => unavailable('BetterAuth.recovery.sessionsRevokedChangeId', cause)),\n )\n : null,\n user,\n }\n }\n }\n }),\n })\n\n const initial: InitialIdentityRecoveryApi = InitialIdentityRecovery.of({\n observe: Effect.fn('BetterAuth.Recovery.observeInitialAdministrator')(function* (intent) {\n const adapter = yield* initialAdapter\n\n const result = yield* providerCall(\n 'BetterAuth.recovery.findInitialAdministrator',\n () => adapter.findUserByEmail(intent.normalizedEmail, { includeAccounts: true }),\n initializationUnavailable,\n )\n\n if (!result) return { credentialReady: false, user: null }\n\n return {\n credentialReady: hasCredential(result.accounts),\n user: yield* decodeBetterAuthUser(result.user).pipe(\n Effect.mapError((cause) => initializationUnavailable('BetterAuth.recovery.findInitialAdministrator', cause)),\n ),\n }\n }),\n })\n\n return { initial, users }\n}\n\nfunction hasCredential(accounts: ReadonlyArray<{ readonly password?: string | null; readonly providerId: string }>) {\n return accounts.some((account) => account.providerId === 'credential' && (account.password?.length ?? 0) > 0)\n}\n\nfunction decodeUser(user: Parameters<typeof decodeBetterAuthUser>[0], operation: string) {\n return decodeBetterAuthUser(user).pipe(Effect.mapError((cause) => unavailable(operation, cause)))\n}\n\nfunction findUser(adapter: BetterAuthInternalAdapter, userId: string) {\n return findRawUser(adapter, userId).pipe(\n Effect.flatMap((user) => (user ? decodeUser(user, 'BetterAuth.recovery.findUserById') : Effect.succeed(null))),\n )\n}\n\nfunction findRawUser(adapter: BetterAuthInternalAdapter, userId: string) {\n return providerCall('BetterAuth.recovery.findUserById', () => adapter.findUserById(userId), unavailable)\n}\n\nfunction findSessionFingerprints(adapter: BetterAuthInternalAdapter, userId: string) {\n return providerCall('BetterAuth.recovery.listSessions', () => adapter.listSessions(userId), unavailable).pipe(\n Effect.map((sessions) => sessions.map((session) => sessionFingerprint(session.id))),\n )\n}\n","import type { BetterAuthOptions } from 'better-auth'\nimport { Context, Crypto, Effect, Layer } from 'effect'\nimport { CMS_AUTHENTICATION_PATH } from '@internal/protocol/HttpPaths'\nimport { ActivityStore } from '@internal/server/adapter/ActivityStore'\nimport { Authentication, AuthenticationHandler } from '@internal/server/adapter/Authentication'\nimport {\n IdentityAdministration,\n IdentityRecovery,\n InitialIdentity,\n InitialIdentityRecovery,\n} from '@internal/server/adapter/Identity'\nimport { betterAuthActivityOptions, betterAuthActivityWriter } from './internal/activity-hooks'\nimport { createCmsBetterAuth } from './internal/better-auth'\nimport { rejectExternalAdminRoutes } from './internal/handler'\nimport { betterAuthIdentity } from './internal/identity'\nimport { betterAuthInitialIdentity } from './internal/initialization'\nimport { betterAuthRecovery } from './internal/recovery'\n\nexport interface CmsBetterAuthOptions {\n readonly basePath?: string\n readonly baseURL?: string\n readonly database: NonNullable<BetterAuthOptions['database']>\n readonly secret: string\n}\n\nexport function betterAuthLayer(options: CmsBetterAuthOptions) {\n if (options.basePath !== undefined && options.basePath !== CMS_AUTHENTICATION_PATH) {\n throw new Error(`Authentication basePath must be ${CMS_AUTHENTICATION_PATH}.`)\n }\n\n return Layer.effectContext(\n Effect.gen(function* () {\n const crypto = yield* Crypto.Crypto\n const storage = yield* ActivityStore\n // Better Auth hooks return Promises; execute their Effects with this layer's services.\n const runPromise = Effect.runPromiseWith(yield* Effect.context<never>())\n\n const auth = createCmsBetterAuth(\n options,\n betterAuthActivityOptions(betterAuthActivityWriter(storage, crypto), crypto, runPromise),\n )\n\n const identity = betterAuthIdentity(auth)\n const recovery = betterAuthRecovery(auth)\n const initialization = betterAuthInitialIdentity(auth)\n const basePath = options.basePath ?? CMS_AUTHENTICATION_PATH\n const handler = AuthenticationHandler.of({ handle: rejectExternalAdminRoutes(auth.handler, basePath) })\n\n return Context.empty().pipe(\n Context.add(Authentication, identity.authentication),\n Context.add(IdentityAdministration, identity.administration),\n Context.add(IdentityRecovery, recovery.users),\n Context.add(InitialIdentity, initialization),\n Context.add(InitialIdentityRecovery, recovery.initial),\n Context.add(AuthenticationHandler, handler),\n )\n }),\n )\n}\n","import { Effect } from 'effect'\nimport { FORM_SUBMISSION_MAX_BYTES } from '@internal/protocol/Forms'\n\nexport function handleFormRequest(\n request: Request,\n handle: (request: Request) => Promise<Response>,\n): Promise<Response> {\n return Effect.runPromise(\n Effect.gen(function* () {\n const ingress = yield* Effect.gen(function* () {\n const origin = request.headers.get('origin')\n\n if (origin && origin !== new URL(request.url).origin)\n return Response.json({ error: 'Origin rejected.' }, { status: 403 })\n\n if (request.method !== 'POST') return new Response(null, { status: 405 })\n\n if (request.headers.get('content-type')?.split(';', 1)[0]?.trim().toLowerCase() !== 'application/json')\n return new Response(null, { status: 415 })\n const reader = request.body?.getReader()\n\n if (!reader) return new Response(null, { status: 400 })\n const chunks: Uint8Array[] = []\n let size = 0\n\n try {\n while (true) {\n const chunk = yield* Effect.tryPromise(() => reader.read())\n\n if (chunk.done) break\n size += chunk.value.byteLength\n\n if (size > FORM_SUBMISSION_MAX_BYTES) {\n yield* Effect.tryPromise(() => reader.cancel()).pipe(Effect.ignore)\n\n return new Response(null, { status: 413 })\n }\n\n chunks.push(chunk.value)\n }\n } finally {\n reader.releaseLock()\n }\n\n const body = new Uint8Array(size)\n let offset = 0\n\n for (const chunk of chunks) {\n body.set(chunk, offset)\n offset += chunk.byteLength\n }\n\n return body\n }).pipe(Effect.orElseSucceed(() => new Response(null, { status: 400 })))\n\n if (ingress instanceof Response) return ingress\n\n return yield* Effect.promise(() =>\n handle(\n new Request(request.url, { method: 'POST', headers: request.headers, body: ingress, signal: request.signal }),\n ),\n )\n }).pipe(\n Effect.map((response) => {\n response.headers.set('cache-control', 'no-store')\n\n return response\n }),\n ),\n )\n}\n","import { Context, DateTime, Effect, Layer, Schema } from 'effect'\nimport { ChangeJournal } from './adapter/ChangeJournal'\n\nexport class ReadinessFailed extends Schema.TaggedError<ReadinessFailed>()('Cms.ReadinessFailed', {\n cause: Schema.Defect(),\n}) {}\n\nexport interface ReadinessApi {\n readonly check: Effect.Effect<void, ReadinessFailed>\n}\n\nexport class Readiness extends Context.Service<Readiness, ReadinessApi>()('@internal/server/Readiness') {}\n\n/** A stale unresolved external change makes the installation unavailable until reconciliation resolves it. */\nexport const readinessLayer: Layer.Layer<Readiness, never, ChangeJournal> = Layer.effect(\n Readiness,\n Effect.gen(function* () {\n const journal = yield* ChangeJournal\n\n const check = Effect.gen(function* () {\n const now = yield* DateTime.now\n\n const pending = yield* journal\n .pending({ before: DateTime.subtractDuration(now, '30 seconds'), limit: 1 })\n .pipe(Effect.mapError((cause) => new ReadinessFailed({ cause })))\n\n const oldest = pending.changes[0]\n\n if (pending.total === 0) return\n\n if (oldest === undefined) {\n return yield* new ReadinessFailed({ cause: new Error('The pending change journal returned no change.') })\n }\n\n yield* Effect.logWarning('CMS readiness found a stale pending change.', {\n action: oldest.action,\n ageMillis: DateTime.toEpochMillis(now) - DateTime.toEpochMillis(oldest.updatedAt),\n changeId: oldest.id,\n phase: 'pending',\n })\n\n return yield* new ReadinessFailed({ cause: new Error('A stale change remains pending.') })\n }).pipe(Effect.withSpan('Installation.readiness'))\n\n return Readiness.of({ check })\n }),\n)\n","import { DocumentId } from '@internal/protocol/Documents'\nimport { Schema } from 'effect'\n\nexport const WorkingDocumentGenerationId = Schema.String.check(Schema.isUUID()).pipe(\n Schema.brand('WorkingDocumentGenerationId'),\n)\n\nexport type WorkingDocumentGenerationId = typeof WorkingDocumentGenerationId.Type\n\nexport const WorkingDocumentUpdateSequence = Schema.Int.check(Schema.isGreaterThan(0)).pipe(\n Schema.brand('WorkingDocumentUpdateSequence'),\n)\n\nexport type WorkingDocumentUpdateSequence = typeof WorkingDocumentUpdateSequence.Type\n\nexport const WorkingDocumentHighWatermark = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)).pipe(\n Schema.brand('WorkingDocumentHighWatermark'),\n)\n\nexport type WorkingDocumentHighWatermark = typeof WorkingDocumentHighWatermark.Type\n\nexport class WorkingDocumentPersistenceError extends Schema.TaggedError<WorkingDocumentPersistenceError>()(\n 'WorkingDocuments.PersistenceError',\n {\n operation: Schema.NonEmptyString,\n cause: Schema.Defect(),\n },\n) {}\n\nexport class WorkingDocumentSuperseded extends Schema.TaggedError<WorkingDocumentSuperseded>()(\n 'WorkingDocuments.Superseded',\n {\n documentId: DocumentId,\n expectedGeneration: WorkingDocumentGenerationId,\n actualGeneration: Schema.optionalKey(WorkingDocumentGenerationId),\n },\n) {}\n\nexport class WorkingDocumentConflict extends Schema.TaggedError<WorkingDocumentConflict>()(\n 'WorkingDocuments.Conflict',\n {\n documentId: DocumentId,\n operation: Schema.NonEmptyString,\n message: Schema.NonEmptyString,\n },\n) {}\n","import type { DocumentMutationError, DocumentProjectionError } from '../../Documents'\nimport type { CollaborationDocumentInvalid } from '@internal/document/CollaborationDocument'\nimport type { CollaborationDocument } from '@internal/document/CollaborationDocument'\nimport type { EditorDocumentInvalid, EditorRenderFailed } from '@internal/document/EditorDocument'\nimport type { AccessDenied, StudioRequestContext } from '@internal/protocol/AccessControl'\nimport type {\n CmsMarkdownDocument,\n DocumentMutationResult,\n DocumentNotFound,\n DocumentSource,\n DocumentValidationResult,\n DocumentVersionConflict,\n} from '@internal/protocol/Documents'\nimport type { DocumentVersion, DocumentId } from '@internal/protocol/Documents'\nimport type { WorkingDocumentHighWatermark, WorkingDocumentUpdateSequence } from './working-document-model'\nimport type { WorkingDocumentStoreError } from './working-document-store'\nimport { DocumentMutationResult as DocumentMutationResultSchema } from '@internal/protocol/Documents'\nimport { DocumentVersion as DocumentVersionSchema, DocumentId as DocumentIdSchema } from '@internal/protocol/Documents'\nimport { Context, Effect, Schema, Stream } from 'effect'\nimport { WorkingDocumentGenerationId } from './working-document-model'\n\nexport const WorkingDocumentRef = Schema.Struct({\n documentId: DocumentIdSchema,\n generationId: WorkingDocumentGenerationId,\n})\n\nexport interface WorkingDocumentRef extends Schema.Schema.Type<typeof WorkingDocumentRef> {}\n\nexport class WorkingDocumentInvalid extends Schema.TaggedError<WorkingDocumentInvalid>()('WorkingDocuments.Invalid', {\n documentId: DocumentIdSchema,\n message: Schema.NonEmptyString,\n cause: Schema.Defect(),\n}) {}\n\nexport class WorkingDocumentUnavailable extends Schema.TaggedError<WorkingDocumentUnavailable>()(\n 'WorkingDocuments.Unavailable',\n {\n operation: Schema.NonEmptyString,\n cause: Schema.Defect(),\n },\n) {}\n\n/** An authored or working baseline committed, but the publish workflow still needs recovery. */\nexport class WorkingDocumentCheckpointed extends Schema.TaggedError<WorkingDocumentCheckpointed>()(\n 'WorkingDocuments.Checkpointed',\n {\n checkpointVersion: DocumentVersionSchema,\n documentId: DocumentIdSchema,\n result: Schema.optionalKey(DocumentMutationResultSchema),\n stateVector: Schema.Uint8Array,\n cause: Schema.Defect(),\n },\n) {}\n\nexport type WorkingDocumentsError =\n | AccessDenied\n | WorkingDocumentStoreError\n | DocumentMutationError\n | DocumentNotFound\n | DocumentProjectionError\n | DocumentVersionConflict\n | CollaborationDocumentInvalid\n | EditorDocumentInvalid\n | EditorRenderFailed\n | WorkingDocumentCheckpointed\n | WorkingDocumentInvalid\n | WorkingDocumentUnavailable\n\nexport interface OpenWorkingDocument {\n readonly authoredStateVector: Uint8Array\n readonly ref: WorkingDocumentRef\n readonly source: DocumentSource\n readonly workingStateVector: Uint8Array\n}\n\nexport interface WorkingDocumentAppendResult {\n readonly compacted: boolean\n readonly sequence: WorkingDocumentUpdateSequence\n}\n\n/** An authoritative Working Document snapshot encoded relative to a caller's Yjs state vector. */\nexport interface WorkingDocumentSynchronization {\n readonly highWatermark: WorkingDocumentHighWatermark\n readonly stateVector: Uint8Array\n readonly update: Uint8Array\n}\n\nexport interface WorkingDocumentPreview {\n readonly body: CmsMarkdownDocument\n readonly markdown: string\n readonly stateVector: Uint8Array\n readonly validation: DocumentValidationResult\n}\n\nexport interface WorkingDocumentPublishResult {\n readonly checkpointVersion: DocumentVersion\n readonly result: DocumentMutationResult\n readonly stateVector: Uint8Array\n}\n\nexport const WorkingDocumentChange = Schema.Struct({\n kind: Schema.Literals(['updated', 'invalidated']),\n ref: WorkingDocumentRef,\n})\n\nexport interface WorkingDocumentChange extends Schema.Schema.Type<typeof WorkingDocumentChange> {}\n\nexport interface WorkingDocumentsApi {\n readonly appendUpdate: (\n ref: WorkingDocumentRef,\n update: Uint8Array,\n ) => Effect.Effect<WorkingDocumentAppendResult, WorkingDocumentsError>\n readonly changes: Stream.Stream<WorkingDocumentChange>\n readonly check: Effect.Effect<void, WorkingDocumentsError>\n readonly compact: (ref: WorkingDocumentRef) => Effect.Effect<void, WorkingDocumentsError>\n readonly load: (ref: WorkingDocumentRef) => Effect.Effect<CollaborationDocument, WorkingDocumentsError>\n readonly open: (\n context: StudioRequestContext,\n documentId: DocumentId,\n ) => Effect.Effect<OpenWorkingDocument, WorkingDocumentsError>\n readonly preview: (\n context: StudioRequestContext,\n ref: WorkingDocumentRef,\n document: CollaborationDocument,\n ) => Effect.Effect<WorkingDocumentPreview, WorkingDocumentsError>\n readonly publish: (\n context: StudioRequestContext,\n ref: WorkingDocumentRef,\n document: CollaborationDocument,\n ) => Effect.Effect<WorkingDocumentPublishResult, WorkingDocumentsError>\n readonly probe: (ref: WorkingDocumentRef) => Effect.Effect<WorkingDocumentHighWatermark, WorkingDocumentsError>\n readonly synchronize: (\n ref: WorkingDocumentRef,\n stateVector?: Uint8Array,\n ) => Effect.Effect<WorkingDocumentSynchronization, WorkingDocumentsError>\n}\n\nexport class WorkingDocuments extends Context.Service<WorkingDocuments, WorkingDocumentsApi>()(\n '@internal/server/WorkingDocuments',\n) {}\n","import type { EditorNodeId } from '@internal/protocol/Documents'\nimport type { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport type { Transaction } from '@tiptap/pm/state'\nimport { Extension } from '@tiptap/core'\nimport { ySyncPluginKey } from '@tiptap/y-tiptap'\nimport { createEditorNodeId, editorNodeId } from './identity'\n\ninterface IdentifiedPosition {\n readonly id: EditorNodeId\n readonly position: number\n}\n\nexport const EditorNodeIdentity = Extension.create({\n name: 'cmsNodeIdentity',\n priority: 10_000,\n dispatchTransaction({ transaction, next }) {\n if (transaction.docChanged) {\n if (transaction.getMeta(ySyncPluginKey)?.isChangeOrigin) assertCanonicalNodeIdentities(transaction.doc)\n else prepareNodeIdentities(transaction)\n }\n\n next(transaction)\n },\n})\n\nexport function prepareNodeIdentities(\n transaction: Transaction,\n createId: () => EditorNodeId = createEditorNodeId,\n): Transaction {\n assertCanonicalNodeIdentities(transaction.before)\n const occurrences = collectIdentityPositions(transaction.doc)\n const survivors = mappedIdentityPositions(transaction)\n const used = new Set<EditorNodeId>()\n\n for (const candidates of occurrences.values()) {\n const survivor = candidates.find((candidate) => survivors.has(positionKey(candidate))) || candidates[0]!\n used.add(survivor.id)\n }\n\n for (const candidates of occurrences.values()) {\n const survivor = candidates.find((candidate) => survivors.has(positionKey(candidate))) || candidates[0]!\n\n for (const candidate of candidates) {\n if (candidate === survivor) continue\n setFreshIdentity(transaction, candidate.position, used, createId)\n }\n }\n\n transaction.doc.descendants((node, position) => {\n if (isIdentifiedNode(node) && editorNodeId(node.attrs.cmsNodeId) === undefined)\n setFreshIdentity(transaction, position, used, createId)\n })\n assertCanonicalNodeIdentities(transaction.doc)\n\n return transaction\n}\n\nexport function assertCanonicalNodeIdentities(document: ProseMirrorNode): void {\n const seen = new Set<EditorNodeId>()\n document.descendants((node, position) => {\n if (!isIdentifiedNode(node)) return\n const id = editorNodeId(node.attrs.cmsNodeId)\n\n if (id === undefined) {\n throw new Error(`Authorable ${node.type.name} at position ${position} has no valid node identity.`)\n }\n\n if (seen.has(id)) {\n throw new Error(`Authorable ${node.type.name} at position ${position} duplicates node identity \"${id}\".`)\n }\n\n seen.add(id)\n })\n}\n\nfunction collectIdentityPositions(document: ProseMirrorNode): Map<EditorNodeId, IdentifiedPosition[]> {\n const result = new Map<EditorNodeId, IdentifiedPosition[]>()\n document.descendants((node, position) => {\n if (!isIdentifiedNode(node)) return\n const id = editorNodeId(node.attrs.cmsNodeId)\n\n if (id === undefined) return\n const candidate = { id, position }\n result.set(candidate.id, [...(result.get(candidate.id) ?? []), candidate])\n })\n\n return result\n}\n\nfunction mappedIdentityPositions(transaction: Transaction): Set<string> {\n const result = new Set<string>()\n transaction.before.descendants((node, position) => {\n if (!isIdentifiedNode(node)) return\n const id = editorNodeId(node.attrs.cmsNodeId)\n\n if (id === undefined) return\n const mapped = transaction.mapping.mapResult(position, 1)\n\n if (!mapped.deleted && transaction.doc.nodeAt(mapped.pos)?.attrs.cmsNodeId === id) {\n result.add(positionKey({ id, position: mapped.pos }))\n }\n })\n\n return result\n}\n\nfunction setFreshIdentity(\n transaction: Transaction,\n position: number,\n used: Set<EditorNodeId>,\n createId: () => EditorNodeId,\n): void {\n let id = createId()\n\n while (used.has(id)) id = createId()\n used.add(id)\n const node = transaction.doc.nodeAt(position)\n\n if (!node) throw new Error(`Cannot assign node identity at missing position ${position}.`)\n transaction.setNodeMarkup(position, undefined, { ...node.attrs, cmsNodeId: id })\n}\n\nfunction isIdentifiedNode(node: ProseMirrorNode): boolean {\n if (!Object.hasOwn(node.type.spec.attrs ?? {}, 'cmsNodeId')) return false\n\n if (node.attrs.cmsSynthetic === true || node.attrs.cmsTransient === true) return false\n\n return node.type.name !== 'paragraph' || node.content.size > 0\n}\n\nfunction positionKey(candidate: IdentifiedPosition): string {\n return `${candidate.id}:${candidate.position}`\n}\n","import type { NodeViewRenderer } from '@tiptap/core'\nimport type { Schema } from '@tiptap/pm/model'\nimport { Extension, getSchema, mergeAttributes, Node } from '@tiptap/core'\nimport StarterKit from '@tiptap/starter-kit'\nimport { Predicate, Schema as EffectSchema } from 'effect'\nimport { EDITOR_IMAGE_LAYOUT_ATTRIBUTE, normalizeEditorImageLayout } from './image'\nimport { EditorNodeIdentity } from './identity-extension'\nimport { EDITOR_MARK_TYPES } from './marks'\n\nexport interface EditorNodeViews {\n readonly block?: NodeViewRenderer\n readonly image?: NodeViewRenderer\n readonly inlineOpaque?: NodeViewRenderer\n readonly opaque?: NodeViewRenderer\n readonly slot?: NodeViewRenderer\n}\n\nexport interface CreateEditorExtensionsOptions {\n readonly nodeViews?: EditorNodeViews\n}\n\nconst AUTHORABLE_NODE_TYPES = [\n 'blockquote',\n 'bulletList',\n 'codeBlock',\n 'heading',\n 'horizontalRule',\n 'listItem',\n 'orderedList',\n 'paragraph',\n]\n\nconst isJsonObject = EffectSchema.is(EffectSchema.JsonObject)\n\nconst EditorDocument = Node.create({\n name: 'doc',\n topNode: true,\n content: 'cmsFrontmatter block*',\n})\n\nconst EditorAttributes = Extension.create({\n name: 'cmsEditorAttributes',\n addGlobalAttributes() {\n return [\n {\n types: AUTHORABLE_NODE_TYPES,\n attributes: {\n cmsNodeId: identityAttribute(),\n cmsProps: internalAttribute(null),\n cmsSynthetic: internalAttribute(false),\n },\n },\n {\n types: ['paragraph'],\n attributes: {\n cmsTransient: internalAttribute(false),\n },\n },\n {\n types: EDITOR_MARK_TYPES,\n attributes: {\n cmsProps: internalAttribute(null),\n },\n },\n ]\n },\n})\n\nconst EditorFrontmatter = Node.create({\n name: 'cmsFrontmatter',\n atom: true,\n isolating: true,\n selectable: false,\n addAttributes() {\n return {\n frontmatter: internalAttribute({}),\n }\n },\n parseHTML() {\n return [{ tag: 'section[data-cms-frontmatter]' }]\n },\n renderHTML() {\n return ['section', { 'data-cms-frontmatter': '', hidden: 'hidden' }]\n },\n})\n\nconst EditorBlock = Node.create({\n name: 'cmsBlock',\n group: 'block',\n content: 'cmsSlot*',\n defining: true,\n isolating: true,\n selectable: true,\n addAttributes() {\n return {\n bindings: internalAttribute({}),\n cmsNodeId: identityAttribute(),\n props: internalAttribute({}),\n tag: internalAttribute('component'),\n }\n },\n parseHTML() {\n return [{ tag: 'section[data-cms-component]' }]\n },\n renderHTML({ node }) {\n return [\n 'section',\n { 'data-cms-component': '', 'data-component-name': node.attrs.tag },\n ['header', { contenteditable: 'false' }, `<${String(node.attrs.tag)}>`],\n ['div', 0],\n ]\n },\n})\n\nconst EditorSlot = Node.create({\n name: 'cmsSlot',\n content: 'block+',\n defining: true,\n isolating: true,\n selectable: false,\n addAttributes() {\n return {\n cmsNodeId: identityAttribute(),\n implicit: internalAttribute(false),\n name: internalAttribute('default'),\n props: internalAttribute({}),\n }\n },\n parseHTML() {\n return [{ tag: 'div[data-cms-slot]' }]\n },\n renderHTML({ node }) {\n return [\n 'div',\n { 'data-cms-slot': '', 'data-slot-name': node.attrs.name },\n ['span', { contenteditable: 'false' }, String(node.attrs.name)],\n ['div', 0],\n ]\n },\n})\n\nconst EditorOpaque = Node.create({\n name: 'cmsOpaque',\n group: 'block',\n atom: true,\n selectable: true,\n addAttributes() {\n return {\n cmsNodeId: identityAttribute(),\n label: internalAttribute('Unsupported content'),\n node: internalAttribute(null),\n }\n },\n parseHTML() {\n return [{ tag: 'div[data-cms-opaque]' }]\n },\n renderHTML({ node }) {\n return ['div', { 'data-cms-opaque': '', contenteditable: 'false' }, String(node.attrs.label)]\n },\n})\n\nconst EditorInlineOpaque = Node.create({\n name: 'cmsInlineOpaque',\n group: 'inline',\n inline: true,\n atom: true,\n selectable: true,\n addAttributes() {\n return {\n label: internalAttribute('Unsupported content'),\n node: internalAttribute(null),\n }\n },\n parseHTML() {\n return [{ tag: 'span[data-cms-inline-opaque]' }]\n },\n renderHTML({ node }) {\n return ['span', { 'data-cms-inline-opaque': '', contenteditable: 'false' }, String(node.attrs.label)]\n },\n})\n\nconst EditorImage = Node.create({\n name: 'image',\n group: 'inline',\n inline: true,\n atom: true,\n draggable: true,\n addAttributes() {\n return {\n alt: {\n default: null,\n parseHTML: (element) => element.getAttribute('alt'),\n },\n cmsNodeId: identityAttribute(),\n cmsProps: {\n default: null,\n parseHTML: (element) => imageProperties(element),\n renderHTML: (attributes) => renderImageProperties(attributes.cmsProps),\n },\n cmsSynthetic: internalAttribute(false),\n layout: {\n default: 'natural',\n rendered: false,\n parseHTML: (element) => normalizeEditorImageLayout(element.getAttribute(EDITOR_IMAGE_LAYOUT_ATTRIBUTE)),\n },\n src: {\n default: null,\n parseHTML: (element) => element.getAttribute('src'),\n },\n title: {\n default: null,\n parseHTML: (element) => element.getAttribute('title'),\n },\n }\n },\n parseHTML() {\n return [{ tag: 'img[src]:not([src^=\"data:\"])' }]\n },\n renderHTML({ HTMLAttributes, node }) {\n const layout = normalizeEditorImageLayout(node.attrs.layout)\n\n return [\n 'img',\n mergeAttributes(HTMLAttributes, {\n [EDITOR_IMAGE_LAYOUT_ATTRIBUTE]: layout === 'natural' ? undefined : layout,\n }),\n ]\n },\n})\n\nexport function createEditorExtensions(options: CreateEditorExtensionsOptions = {}) {\n const nodeViews = options.nodeViews ?? {}\n\n return [\n EditorNodeIdentity,\n StarterKit.configure({\n document: false,\n trailingNode: { node: 'paragraph', notAfter: ['paragraph'] },\n undoRedo: false,\n }),\n EditorDocument,\n withNodeView(EditorImage, nodeViews.image),\n EditorAttributes,\n EditorFrontmatter,\n withNodeView(EditorBlock, nodeViews.block),\n withNodeView(EditorSlot, nodeViews.slot),\n withNodeView(EditorOpaque, nodeViews.opaque),\n withNodeView(EditorInlineOpaque, nodeViews.inlineOpaque),\n ]\n}\n\nexport function createEditorSchema(): Schema {\n return getSchema(createEditorExtensions())\n}\n\nfunction withNodeView(extension: Node, renderer: NodeViewRenderer | undefined): Node {\n return renderer ? extension.extend({ addNodeView: () => renderer }) : extension\n}\n\nfunction internalAttribute(defaultValue: EffectSchema.Json) {\n return { default: defaultValue, rendered: false }\n}\n\nfunction identityAttribute() {\n return { default: null, keepOnSplit: false, rendered: false }\n}\n\nfunction imageProperties(element: HTMLElement): Record<string, string> | null {\n const properties = Object.fromEntries(\n [\n ['class', element.getAttribute('class')],\n ['height', element.getAttribute('height')],\n ['width', element.getAttribute('width')],\n ].filter((entry): entry is [string, string] => !!entry[1]),\n )\n\n return Object.keys(properties).length ? properties : null\n}\n\nfunction renderImageProperties(value: EffectSchema.Json | undefined): Record<string, string> {\n if (!isJsonObject(value)) return {}\n\n return Object.fromEntries(\n ['class', 'height', 'width'].flatMap((name) => {\n const property = value[name]\n\n return Predicate.isString(property) && property ? [[name, property]] : []\n }),\n )\n}\n","import type { MarkdownNode as MarkdownNodeType } from '@internal/protocol/Documents'\nimport type { JSONContent } from '@tiptap/core'\nimport { MarkdownNode } from '@internal/protocol/Documents'\nimport { Option, Predicate, Schema } from 'effect'\nimport { encodeCmsEditorComponentAttributes } from '../comark/bindings'\nimport { encodeEditorImageAttributes } from './image'\nimport { assertCanonicalEditorContent, identifiedAttributes } from './metadata'\nimport { compactJsonAttributes, finiteNumberAttribute, nonEmptyStringAttribute } from './attributes'\nimport { comarkTagForEditorMark, isEditorMark } from './marks'\n\nconst isJsonObject = Schema.is(Schema.JsonObject)\n\ntype ElementMarkdownNode = Extract<MarkdownNodeType, readonly [string, Schema.JsonObject, ...MarkdownNodeType[]]>\n\ninterface InlineLeaf {\n readonly marks: ReadonlyArray<EditorMark>\n readonly node: MarkdownNodeType\n}\n\ninterface EditorMark {\n readonly attrs?: Schema.JsonObject\n readonly type: string\n}\n\nexport function editorToComark(content: JSONContent): MarkdownNodeType[] {\n assertCanonicalEditorContent(content)\n\n return encodeBlocks(content.content)\n}\n\nfunction encodeBlocks(content: JSONContent[] | undefined): MarkdownNodeType[] {\n const result: MarkdownNodeType[] = []\n\n for (const editorNode of content ?? []) {\n if (isTransientNode(editorNode) || isEmptyParagraph(editorNode)) continue\n\n if (editorNode.type === 'cmsSlot') {\n result.push(...encodeSlot(editorNode))\n continue\n }\n\n const node = encodeBlock(editorNode)\n\n if (node !== undefined) result.push(node)\n }\n\n return result\n}\n\nfunction encodeSlot(editorNode: JSONContent): MarkdownNodeType[] {\n const attrs = editorNode.attrs\n const name = nonEmptyStringAttribute(attrs?.name) ?? 'default'\n\n if (name === 'default' && attrs?.implicit === true) return encodeBlocks(editorNode.content)\n\n const props = jsonObject(attrs?.props)\n const children = encodeBlocks(editorNode.content)\n\n return [\n [\n 'template',\n identifiedAttributes(compactJsonAttributes(Object.assign({}, props, { name })), attrs?.cmsNodeId),\n ...unwrapSingleParagraph(children),\n ],\n ]\n}\n\nfunction encodeBlock(editorNode: JSONContent): MarkdownNodeType | undefined {\n const attrs = editorNode.attrs\n\n const cmsProps =\n editorNode.type === 'cmsFrontmatter' || attrs?.cmsSynthetic === true\n ? jsonObject(attrs?.cmsProps)\n : identifiedAttributes(jsonObject(attrs?.cmsProps), attrs?.cmsNodeId)\n\n switch (editorNode.type) {\n case 'paragraph':\n return ['p', cmsProps, ...encodeInlines(editorNode.content)]\n case 'heading':\n return [\n `h${Math.min(6, Math.max(1, finiteNumberAttribute(attrs?.level, 1)))}`,\n cmsProps,\n ...encodeInlines(editorNode.content),\n ]\n case 'blockquote': {\n const children = encodeBlocks(editorNode.content)\n\n return ['blockquote', cmsProps, ...unwrapSingleParagraph(children)]\n }\n\n case 'bulletList':\n return ['ul', cmsProps, ...encodeBlocks(editorNode.content)]\n case 'orderedList': {\n const start = finiteNumberAttribute(attrs?.start, 1)\n\n return [\n 'ol',\n compactJsonAttributes(Object.assign({}, cmsProps, { start: start === 1 ? undefined : start })),\n ...encodeBlocks(editorNode.content),\n ]\n }\n\n case 'listItem': {\n const children = encodeBlocks(editorNode.content)\n\n return ['li', cmsProps, ...unwrapFirstParagraph(children)]\n }\n\n case 'codeBlock': {\n const language = nonEmptyStringAttribute(attrs?.language)\n\n return [\n 'pre',\n compactJsonAttributes(Object.assign({}, cmsProps, { language })),\n ['code', language ? { class: `language-${language}` } : {}, plainText(editorNode.content)],\n ]\n }\n\n case 'horizontalRule':\n return ['hr', cmsProps]\n case 'cmsBlock': {\n const tag = nonEmptyStringAttribute(attrs?.tag) ?? 'component'\n const props = encodeCmsEditorComponentAttributes(jsonObject(attrs?.props), jsonObject(attrs?.bindings))\n\n const implicitSlotId = editorNode.content?.find(\n (node) => node.type === 'cmsSlot' && node.attrs?.implicit === true && node.attrs?.name === 'default',\n )?.attrs?.cmsNodeId\n\n return [\n tag,\n identifiedAttributes(props, attrs?.cmsNodeId, implicitSlotId),\n ...unwrapSingleParagraph(encodeBlocks(editorNode.content)),\n ]\n }\n\n case 'cmsOpaque':\n return restoreOpaqueNode(attrs?.node, attrs?.cmsNodeId)\n default:\n return undefined\n }\n}\n\nfunction encodeInlines(content: JSONContent[] | undefined): MarkdownNodeType[] {\n const leaves: InlineLeaf[] = []\n\n for (const editorNode of content ?? []) {\n let node: MarkdownNodeType | undefined\n const attrs = editorNode.attrs\n\n switch (editorNode.type) {\n case 'text':\n node = editorNode.text ?? ''\n break\n case 'hardBreak':\n node = ['br', {}]\n break\n case 'image':\n node = ['img', identifiedAttributes(encodeEditorImageAttributes(attrs), attrs?.cmsNodeId)]\n break\n case 'cmsInlineOpaque':\n node = restoreOpaqueNode(attrs?.node)\n break\n }\n\n if (node !== undefined && node !== '') {\n leaves.push({\n node,\n marks: normalizeMarks(editorNode.marks),\n })\n }\n }\n\n return wrapMarkedLeaves(leaves, 0)\n}\n\nfunction wrapMarkedLeaves(leaves: ReadonlyArray<InlineLeaf>, depth: number): MarkdownNodeType[] {\n const result: MarkdownNodeType[] = []\n\n for (let index = 0; index < leaves.length;) {\n const leaf = leaves[index]\n\n if (leaf === undefined) break\n const mark = leaf.marks[depth]\n\n if (mark === undefined) {\n result.push(leaf.node)\n index++\n continue\n }\n\n let end = index + 1\n\n while (end < leaves.length && sameMark(mark, leaves[end]?.marks[depth])) end++\n result.push(markNode(mark, wrapMarkedLeaves(leaves.slice(index, end), depth + 1)))\n index = end\n }\n\n return result\n}\n\nfunction markNode(mark: EditorMark, children: MarkdownNodeType[]): MarkdownNodeType {\n const attrs = jsonObject(mark.attrs?.cmsProps)\n\n if (mark.type === 'link') {\n return [\n 'a',\n compactJsonAttributes(\n Object.assign({}, attrs, {\n href: nonEmptyStringAttribute(mark.attrs?.href),\n title: nonEmptyStringAttribute(mark.attrs?.title),\n }),\n ),\n ...children,\n ]\n }\n\n const tag = comarkTagForEditorMark(mark.type) ?? 'span'\n\n return [tag, attrs, ...children]\n}\n\nfunction normalizeMarks(marks: JSONContent['marks']): ReadonlyArray<EditorMark> {\n return (marks ?? [])\n .filter((mark) => isEditorMark(mark.type))\n .sort((left, right) => Number(left.type === 'code') - Number(right.type === 'code'))\n .map((mark) => {\n const attrs = mark.attrs === undefined ? undefined : jsonObject(mark.attrs)\n\n return attrs === undefined ? { type: mark.type } : { attrs, type: mark.type }\n })\n}\n\nfunction sameMark(left: EditorMark, right: EditorMark | undefined): boolean {\n return right !== undefined && left.type === right.type && JSON.stringify(left.attrs) === JSON.stringify(right.attrs)\n}\n\nfunction unwrapSingleParagraph(nodes: MarkdownNodeType[]): MarkdownNodeType[] {\n const first = nodes[0]\n\n return nodes.length === 1 && isElementNode(first) && first[0] === 'p' ? elementChildren(first) : nodes\n}\n\nfunction unwrapFirstParagraph(nodes: MarkdownNodeType[]): MarkdownNodeType[] {\n const [first, ...rest] = nodes\n\n return isElementNode(first) && first[0] === 'p' ? [...elementChildren(first), ...rest] : nodes\n}\n\nfunction restoreOpaqueNode(\n value: Schema.Json | undefined,\n nodeId?: Schema.Json,\n): Exclude<MarkdownNodeType, string> | undefined {\n const decoded = Schema.decodeUnknownOption(MarkdownNode)(value)\n\n if (Option.isNone(decoded) || Predicate.isString(decoded.value)) return undefined\n const node = structuredClone(decoded.value)\n\n if (nodeId === undefined) return node\n\n if (node[0] === null) return [null, identifiedAttributes(node[1], nodeId), node[2]]\n const [tag, attributes, ...children] = node\n\n return [tag, identifiedAttributes(attributes, nodeId), ...children]\n}\n\nfunction jsonObject(value: Schema.Json | undefined): Schema.JsonObject {\n return isJsonObject(value) ? structuredClone(value) : {}\n}\n\nfunction plainText(content: JSONContent[] | undefined): string {\n return (content ?? []).map((node) => node.text ?? plainText(node.content)).join('')\n}\n\nfunction isElementNode(node: MarkdownNodeType | undefined): node is ElementMarkdownNode {\n return Array.isArray(node) && Predicate.isString(node[0])\n}\n\nfunction elementChildren(node: ElementMarkdownNode): MarkdownNodeType[] {\n const [, , ...children] = node\n\n return children\n}\n\nfunction isTransientNode(node: JSONContent): boolean {\n return node.attrs?.cmsTransient === true\n}\n\nfunction isEmptyParagraph(node: JSONContent): boolean {\n return node.type === 'paragraph' && !node.content?.length\n}\n","import type { CmsMarkdownDocument } from '@internal/protocol/Documents'\nimport type { JSONContent } from '@tiptap/core'\nimport { CmsMarkdownDocument as MarkdownDocumentSchema } from '@internal/protocol/Documents'\nimport { Effect, Schema } from 'effect'\nimport { createCmsComarkRenderData } from './internal/comark/document-adapter'\nimport { comarkToEditor } from './internal/comark/to-editor'\nimport { EditorDocumentInvalid } from './internal/editor/errors'\nimport { renderEditorMarkdown } from './internal/editor/render'\nimport { createEditorSchema } from './internal/editor/schema'\nimport { editorToComark } from './internal/editor/to-comark'\n\nconst isJsonObject = Schema.is(Schema.JsonObject)\n\n/** Canonical Tiptap projection plus the Markdown metadata that is not represented by editor nodes. */\nexport interface EditorDocument {\n readonly content: JSONContent\n readonly meta: Schema.JsonObject\n}\n\nexport interface EditorDocumentChange {\n readonly body: CmsMarkdownDocument\n readonly document: EditorDocument\n readonly markdown: string\n}\n\nconst editorSchema = createEditorSchema()\n\n/** Opens an immutable wire Document as a validated editor projection with fresh private node identities. */\nexport const openEditorDocument = Effect.fn('EditorDocument.open')((body: CmsMarkdownDocument) => {\n return Effect.try({\n try: () => {\n const content: JSONContent = {\n type: 'doc',\n content: [\n {\n type: 'cmsFrontmatter',\n attrs: {\n frontmatter: structuredClone(body.frontmatter),\n },\n },\n ...comarkToEditor(body.nodes, createCmsComarkRenderData(body)),\n ],\n }\n\n return {\n content: checkedEditorContent(content),\n meta: structuredClone(body.meta),\n } satisfies EditorDocument\n },\n catch: invalidDocument,\n })\n})\n\n/** Validates and encodes an editor projection, stripping private identities from durable Markdown. */\nexport const encodeEditorDocument = Effect.fn('EditorDocument.encode')(function* (document: EditorDocument) {\n const { content, nodes, frontmatter } = yield* Effect.try({\n try: () => {\n const content = checkedEditorContent(document.content)\n\n return { content, nodes: editorToComark(content), frontmatter: frontmatterFromContent(content) }\n },\n catch: invalidDocument,\n })\n\n const body = yield* Schema.decodeEffect(MarkdownDocumentSchema)({\n frontmatter,\n meta: document.meta,\n nodes,\n }).pipe(Effect.mapError(invalidDocument))\n\n const markdown = yield* renderEditorMarkdown(body)\n\n return {\n body,\n document: {\n content,\n meta: structuredClone(body.meta),\n },\n markdown,\n } satisfies EditorDocumentChange\n})\n\nfunction checkedEditorContent(content: JSONContent): JSONContent {\n if (content.type !== 'doc') throw new Error('Editor content must have a Tiptap document root.')\n const document = editorSchema.nodeFromJSON(content)\n document.check()\n\n return document.toJSON()\n}\n\nfunction frontmatterFromContent(content: JSONContent): Schema.JsonObject {\n const value = content.content?.[0]?.attrs?.frontmatter\n\n if (!isJsonObject(value)) throw new Error('Editor content must start with JSON object frontmatter.')\n\n return structuredClone(value)\n}\n\nfunction invalidDocument(cause: unknown): EditorDocumentInvalid {\n return new EditorDocumentInvalid({\n cause,\n message: cause instanceof Error && cause.message ? cause.message : 'The editor document is invalid.',\n })\n}\n\nexport { EditorDocumentInvalid, EditorRenderFailed } from './internal/editor/errors'\n\nexport type { EditorDocumentFocusTarget } from './internal/editor/focus'\n\nexport {\n documentSelectionForNode,\n editorDocumentFocusRequest,\n editorFocusTarget,\n focusEditorNode,\n shouldRevealDocumentFocus,\n} from './internal/editor/focus'\n\nexport type { EditorImageLayout } from './internal/editor/image'\n\nexport { createEditorNodeId } from './internal/editor/identity'\n\nexport { renderEditorMarkdown } from './internal/editor/render'\n\nexport { createEditorExtensions, createEditorSchema } from './internal/editor/schema'\n\nexport {\n canMoveBlock,\n createStructurePolicyExtension,\n insertParagraph,\n isSafeStructureChange,\n moveBlock,\n removeTransientParagraphs,\n replaceGapWithParagraph,\n} from './internal/editor/structure-policy'\n\nexport type { BlockDirection, ParagraphSide } from './internal/editor/structure-policy'\n\nexport type { CreateEditorExtensionsOptions, EditorNodeViews } from './internal/editor/schema'\n","import type { JSONContent } from '@tiptap/core'\nimport { EditorNodeId } from '@internal/protocol/Documents'\nimport { Result, flow, Predicate, Schema } from 'effect'\nimport * as Y from 'yjs'\nimport { createEditorSchema } from '../editor/schema'\n\nconst FRONTMATTER_NAME = 'frontmatter'\n\nconst PROPERTIES_NAME = 'properties'\n\nconst PROPS_PREFIX = 'props:'\n\nconst CMS_PROPS_PREFIX = 'cmsProps:'\n\nconst editorSchema = createEditorSchema()\n\nconst decodeEditorNodeId = flow(Schema.decodeUnknownResult(EditorNodeId), Result.getOrThrow)\n\nconst decodeJson = flow(Schema.decodeUnknownResult(Schema.Json), Result.getOrThrow)\n\nconst decodeJsonObject = flow(Schema.decodeUnknownResult(Schema.JsonObject), Result.getOrThrow)\n\nconst decodePath = flow(Schema.decodeUnknownResult(Schema.Array(Schema.String)), Result.getOrThrow)\n\ninterface GranularState {\n readonly frontmatter: Schema.JsonObject\n readonly properties: ReadonlyMap<string, Schema.JsonObject>\n}\n\nexport function seedCollaborationFields(document: Y.Doc, content: JSONContent): void {\n const state = extractGranularState(content)\n replaceMap(document.getMap<unknown>(FRONTMATTER_NAME), flatten(state.frontmatter))\n const properties = document.getMap<Y.Map<unknown>>(PROPERTIES_NAME)\n properties.clear()\n\n for (const [nodeId, values] of state.properties) {\n const fields = new Y.Map<unknown>()\n\n for (const [key, value] of Object.entries(values)) fields.set(key, structuredClone(value))\n properties.set(nodeId, fields)\n }\n}\n\n/** Adds the field maps to documents written before granular collaboration was introduced. */\nexport function normalizeCollaborationFields(document: Y.Doc, content: JSONContent): void {\n const hasFrontmatter = document.share.has(FRONTMATTER_NAME)\n const hasProperties = document.share.has(PROPERTIES_NAME)\n\n if (hasProperties) {\n for (const fields of document.getMap<Y.Map<unknown>>(PROPERTIES_NAME).values()) {\n const current = mapValues(fields)\n\n if (\n Object.keys(current).every(\n (key) => key.startsWith(`${PROPS_PREFIX}[`) || key.startsWith(`${CMS_PROPS_PREFIX}[`),\n )\n )\n continue\n\n const canonical = Object.assign(\n {},\n prefixValues(prefixedValues(current, PROPS_PREFIX), PROPS_PREFIX),\n prefixValues(prefixedValues(current, CMS_PROPS_PREFIX), CMS_PROPS_PREFIX),\n )\n\n if (\n Object.keys(current).some((key) => !Object.hasOwn(canonical, key)) ||\n Object.keys(canonical).some((key) => !sameJson(current[key], canonical[key]))\n )\n replaceMap(fields, canonical)\n }\n }\n\n if (hasFrontmatter && hasProperties) return\n\n const state = extractGranularState(content)\n document.transact(() => {\n if (!hasFrontmatter) replaceMap(document.getMap<unknown>(FRONTMATTER_NAME), flatten(state.frontmatter))\n\n if (!hasProperties) {\n const properties = document.getMap<Y.Map<unknown>>(PROPERTIES_NAME)\n\n for (const [nodeId, values] of state.properties) {\n const fields = new Y.Map<unknown>()\n\n for (const [key, value] of Object.entries(values)) fields.set(key, structuredClone(value))\n properties.set(nodeId, fields)\n }\n }\n })\n}\n\nexport function synchronizeCollaborationFields(document: Y.Doc, before: JSONContent, after: JSONContent): void {\n const previous = extractGranularState(checkedEditorContent(before))\n const next = extractGranularState(checkedEditorContent(after))\n document.transact(() => updateGranularFields(document, previous, next))\n}\n\nexport function applyCollaborationFields(document: Y.Doc, content: JSONContent): JSONContent {\n const result = structuredClone(content)\n\n const frontmatter = document.share.has(FRONTMATTER_NAME)\n ? unflatten(mapValues(document.getMap<unknown>(FRONTMATTER_NAME)))\n : undefined\n\n const properties = document.share.has(PROPERTIES_NAME) ? document.getMap<Y.Map<unknown>>(PROPERTIES_NAME) : undefined\n\n visit(result, (node) => {\n if (node.type === 'cmsFrontmatter') {\n if (frontmatter !== undefined) node.attrs = { ...node.attrs, frontmatter }\n\n return\n }\n\n if (properties === undefined) return\n const nodeId = optionalEditorNodeId(node.attrs?.cmsNodeId)\n\n if (nodeId === undefined) return\n const fields = properties.get(nodeId)\n const attributes = fields instanceof Y.Map ? mapValues(fields) : {}\n const nodeAttributes = { ...node.attrs }\n\n if (Object.hasOwn(nodeAttributes, 'props')) nodeAttributes.props = prefixedValues(attributes, PROPS_PREFIX)\n\n if (Object.hasOwn(nodeAttributes, 'cmsProps'))\n nodeAttributes.cmsProps = prefixedValues(attributes, CMS_PROPS_PREFIX)\n node.attrs = nodeAttributes\n })\n\n return result\n}\n\nexport function collaborationFrontmatter(document: Y.Doc): Y.Map<unknown> {\n return document.getMap<unknown>(FRONTMATTER_NAME)\n}\n\nexport function readCollaborationFrontmatter(document: Y.Doc): Schema.JsonObject {\n return unflatten(mapValues(collaborationFrontmatter(document)))\n}\n\nexport function writeCollaborationFrontmatter(document: Y.Doc, path: string, value: Schema.Json | undefined): void {\n const key = JSON.stringify(path.split('.').filter(Boolean))\n document.transact(() => {\n const map = collaborationFrontmatter(document)\n\n if (value === undefined || value === '') map.delete(key)\n else map.set(key, structuredClone(value))\n })\n}\n\nfunction updateGranularFields(document: Y.Doc, previous: GranularState, next: GranularState): void {\n updateMap(collaborationFrontmatter(document), flatten(previous.frontmatter), flatten(next.frontmatter))\n const properties = document.getMap<Y.Map<unknown>>(PROPERTIES_NAME)\n const nodeIds = new Set([...previous.properties.keys(), ...next.properties.keys()])\n\n for (const nodeId of nodeIds) {\n const oldValues = previous.properties.get(nodeId) ?? {}\n const nextValues = next.properties.get(nodeId)\n\n if (nextValues === undefined) {\n properties.delete(nodeId)\n continue\n }\n\n const fields = properties.get(nodeId) ?? new Y.Map<unknown>()\n\n if (!properties.has(nodeId)) properties.set(nodeId, fields)\n updateMap(fields, oldValues, nextValues)\n }\n}\n\nfunction extractGranularState(content: JSONContent): GranularState {\n let frontmatter: Schema.JsonObject = {}\n const properties = new Map<string, Schema.JsonObject>()\n visit(content, (node) => {\n if (node.type === 'cmsFrontmatter') {\n frontmatter = structuredClone(decodeJsonObject(node.attrs?.frontmatter))\n }\n\n const nodeId = optionalEditorNodeId(node.attrs?.cmsNodeId)\n\n if (nodeId === undefined) return\n\n const values = Object.assign(\n {},\n prefixValues(optionalJsonObject(node.attrs?.props), PROPS_PREFIX),\n prefixValues(optionalJsonObject(node.attrs?.cmsProps), CMS_PROPS_PREFIX),\n )\n\n if (Object.hasOwn(node.attrs ?? {}, 'props') || Object.hasOwn(node.attrs ?? {}, 'cmsProps'))\n properties.set(nodeId, values)\n })\n\n return { frontmatter, properties }\n}\n\nfunction checkedEditorContent(content: JSONContent): JSONContent {\n if (content.type !== 'doc') throw new Error('Editor content must have a Tiptap document root.')\n const document = editorSchema.nodeFromJSON(content)\n document.check()\n\n return document.toJSON()\n}\n\nfunction visit(content: JSONContent, visitor: (node: JSONContent) => void): void {\n visitor(content)\n\n for (const node of content.content ?? []) visit(node, visitor)\n}\n\nfunction flatten(value: Schema.JsonObject): Schema.JsonObject {\n const flattened: Record<string, Schema.Json> = {}\n\n const walk = (current: Schema.JsonObject, path: ReadonlyArray<string>): void => {\n for (const [key, child] of Object.entries(current)) {\n const nextPath = [...path, key]\n\n if (isJsonObject(child) && Object.keys(child).length > 0) walk(child, nextPath)\n else flattened[JSON.stringify(nextPath)] = structuredClone(child)\n }\n }\n\n walk(value, [])\n\n return decodeJsonObject(flattened)\n}\n\nfunction unflatten(value: Schema.JsonObject): Schema.JsonObject {\n const result: Record<string, Schema.Json> = {}\n\n for (const [encodedPath, child] of Object.entries(value).sort(\n ([left], [right]) =>\n decodePath(JSON.parse(left)).length - decodePath(JSON.parse(right)).length || left.localeCompare(right),\n )) {\n const path = decodePath(JSON.parse(encodedPath))\n\n if (path.length === 0) continue\n let current = result\n\n for (const segment of path.slice(0, -1)) {\n const existing = Object.hasOwn(current, segment) ? current[segment] : undefined\n const next = isJsonObject(existing) ? existing : {}\n define(current, segment, next)\n current = next\n }\n\n const finalSegment = path.at(-1)\n\n if (finalSegment !== undefined) define(current, finalSegment, structuredClone(child))\n }\n\n return decodeJsonObject(result)\n}\n\nfunction updateMap(map: Y.Map<unknown>, before: Schema.JsonObject, after: Schema.JsonObject): void {\n const keys = new Set([...Object.keys(before), ...Object.keys(after)])\n\n for (const key of keys) {\n if (!Object.hasOwn(after, key)) map.delete(key)\n else {\n const child = after[key]\n\n if (child !== undefined && !sameJson(before[key], child)) map.set(key, structuredClone(child))\n }\n }\n}\n\nfunction replaceMap(map: Y.Map<unknown>, value: Schema.JsonObject): void {\n map.clear()\n\n for (const [key, child] of Object.entries(value)) map.set(key, structuredClone(child))\n}\n\nfunction mapValues(map: Y.Map<unknown>): Schema.JsonObject {\n return decodeJsonObject(\n Object.fromEntries([...map.entries()].map(([key, value]) => [key, structuredClone(decodeJson(value))])),\n )\n}\n\nfunction prefixValues(value: Schema.JsonObject, prefix: string): Schema.JsonObject {\n return decodeJsonObject(\n Object.fromEntries(\n Object.entries(flatten(encodeLists(value))).map(([key, child]) => [`${prefix}${key}`, structuredClone(child)]),\n ),\n )\n}\n\nfunction prefixedValues(value: Schema.JsonObject, prefix: string): Schema.JsonObject {\n return decodeJsonObject(\n decodeLists(\n unflatten(\n Object.fromEntries(\n Object.entries(value)\n .filter(([key]) => key.startsWith(prefix))\n .map(([key, child]) => [\n key.slice(prefix.length).startsWith('[')\n ? key.slice(prefix.length)\n : JSON.stringify([key.slice(prefix.length)]),\n structuredClone(child),\n ]),\n ),\n ),\n ),\n )\n}\n\nfunction optionalJsonObject(value: Schema.Json | undefined): Schema.JsonObject {\n return value === null || value === undefined ? {} : structuredClone(decodeJsonObject(value))\n}\n\nfunction isJsonObject(value: Schema.Json | undefined): value is Schema.JsonObject {\n return Schema.is(Schema.JsonObject)(value)\n}\n\nfunction optionalEditorNodeId(value: Schema.Json | undefined): string | undefined {\n if (value === null || value === undefined) return undefined\n\n return decodeEditorNodeId(value)\n}\n\nfunction define(target: Record<string, Schema.Json>, key: string, value: Schema.Json): void {\n Object.defineProperty(target, key, { configurable: true, enumerable: true, value, writable: true })\n}\n\nfunction sameJson(left: Schema.Json | undefined, right: Schema.Json | undefined): boolean {\n return JSON.stringify(left) === JSON.stringify(right)\n}\n\n// Lists use identity-addressed fields. Ordering is independent of each item's values;\n// concurrent additions at the same position are ordered deterministically by identity.\nconst listMarker = '\\u0000cmsList'\n\nfunction encodeLists(value: Schema.JsonObject): Schema.JsonObject {\n return Object.fromEntries(\n Object.entries(value).map(([key, child]) => {\n if (Array.isArray(child) && child.every((item) => isJsonObject(item) && Predicate.isString(item.id))) {\n return [\n key,\n {\n [listMarker]: true,\n items: Object.fromEntries(\n child.flatMap((item, order) =>\n isJsonObject(item) && Predicate.isString(item.id)\n ? [[item.id, { order, value: encodeLists(item) }]]\n : [],\n ),\n ),\n },\n ]\n }\n\n return [key, isJsonObject(child) ? encodeLists(child) : child]\n }),\n )\n}\n\nfunction decodeLists(value: Schema.JsonObject): Schema.JsonObject {\n return Object.fromEntries(\n Object.entries(value).map(([key, child]) => {\n if (!isJsonObject(child)) return [key, child]\n\n if (child[listMarker] === true) {\n const items = isJsonObject(child.items) ? Object.entries(child.items) : []\n\n const ordered = items\n .flatMap(([id, item]) => {\n if (\n !isJsonObject(item) ||\n !isJsonObject(item.value) ||\n item.value.id !== id ||\n !Predicate.isNumber(item.order)\n )\n return []\n\n return [{ id, order: item.order, value: decodeLists(item.value) }]\n })\n .sort((left, right) => left.order - right.order || left.id.localeCompare(right.id))\n\n return [key, ordered.map((item) => item.value)]\n }\n\n return [key, decodeLists(child)]\n }),\n )\n}\n","import type { SourcePath } from '@internal/protocol/Documents'\nimport type { JSONContent } from '@tiptap/core'\nimport type * as Y from 'yjs'\nimport { SourcePath as SourcePathSchema } from '@internal/protocol/Documents'\nimport { prosemirrorJSONToYDoc, yXmlFragmentToProseMirrorRootNode } from '@tiptap/y-tiptap'\nimport { Result, flow, Schema } from 'effect'\nimport { createEditorSchema } from '../editor/schema'\nimport { applyCollaborationFields, seedCollaborationFields } from './fields'\n\nconst BODY_NAME = 'body'\n\nconst METADATA_NAME = 'cms'\n\nconst META_KEY = 'meta'\n\nconst SOURCE_PATH_KEY = 'sourcePath'\n\nconst editorSchema = createEditorSchema()\n\nconst decodeJson = flow(Schema.decodeUnknownResult(Schema.Json), Result.getOrThrow)\n\nconst decodeJsonObject = flow(Schema.decodeUnknownResult(Schema.JsonObject), Result.getOrThrow)\n\nconst decodeSourcePath = flow(Schema.decodeUnknownResult(SourcePathSchema), Result.getOrThrow)\n\nexport interface InspectedCollaborationDocument {\n readonly content: JSONContent\n readonly fragment: Y.XmlFragment\n readonly meta: Schema.JsonObject\n readonly sourcePath: SourcePath\n}\n\nexport function seedCollaborationDocument(sourcePath: SourcePath, seed: JSONContent, meta: Schema.JsonObject): Y.Doc {\n const document = prosemirrorJSONToYDoc(editorSchema, seed, BODY_NAME)\n\n try {\n document.transact(() => {\n seedCollaborationFields(document, seed)\n const metadata = document.getMap<unknown>(METADATA_NAME)\n metadata.set(META_KEY, structuredClone(meta))\n metadata.set(SOURCE_PATH_KEY, sourcePath)\n })\n\n return document\n } catch (cause) {\n document.destroy()\n throw cause\n }\n}\n\nexport function inspectCollaborationDocumentValue(document: Y.Doc): InspectedCollaborationDocument {\n const metadata = document.getMap<unknown>(METADATA_NAME)\n\n if (!metadata.has(META_KEY) || !metadata.has(SOURCE_PATH_KEY)) {\n throw new Error('Collaboration metadata must include meta and sourcePath.')\n }\n\n const sourcePath = decodeSourcePathValue(decodeJson(metadata.get(SOURCE_PATH_KEY)))\n const meta = structuredClone(decodeJsonObject(metadata.get(META_KEY)))\n const fragment = document.getXmlFragment(BODY_NAME)\n const root = yXmlFragmentToProseMirrorRootNode(fragment, editorSchema)\n const content = applyCollaborationFields(document, root.toJSON())\n\n return { content, fragment, meta, sourcePath }\n}\n\nfunction decodeSourcePathValue(value: Schema.Json): SourcePath {\n try {\n return decodeSourcePath(value)\n } catch (cause) {\n throw new Error('Collaboration metadata must contain a valid source path.', { cause })\n }\n}\n","import { Schema } from 'effect'\n\nexport class CollaborationDocumentInvalid extends Schema.TaggedError<CollaborationDocumentInvalid>()(\n 'CollaborationDocument.Invalid',\n {\n message: Schema.NonEmptyString,\n cause: Schema.Defect(),\n },\n) {}\n\nexport function invalidCollaboration(message: string, cause: unknown): CollaborationDocumentInvalid {\n return new CollaborationDocumentInvalid({ cause, message })\n}\n\nexport function collaborationErrorMessage(cause: unknown): string {\n return cause instanceof Error && cause.message ? cause.message : 'The collaborative editor document is invalid.'\n}\n","import type * as Y from 'yjs'\nimport { applyUpdate, encodeStateAsUpdate, encodeStateVector, Doc } from 'yjs'\n\nexport interface CollaborationStateSnapshot {\n readonly state: Uint8Array\n readonly stateVector: Uint8Array\n}\n\nexport function captureCollaborationState(document: Y.Doc): CollaborationStateSnapshot {\n return {\n state: Uint8Array.from(encodeStateAsUpdate(document)),\n stateVector: Uint8Array.from(encodeStateVector(document)),\n }\n}\n\nexport function restoreCollaborationSnapshot(snapshot: CollaborationStateSnapshot): Y.Doc {\n if (!(snapshot.state instanceof Uint8Array) || !(snapshot.stateVector instanceof Uint8Array)) {\n throw new Error('Collaboration snapshot state must be binary data.')\n }\n\n const document = restoreCollaborationUpdate(snapshot.state)\n\n if (!sameBytes(encodeStateVector(document), snapshot.stateVector)) {\n document.destroy()\n throw new Error('Collaboration snapshot state vector does not match its state.')\n }\n\n return document\n}\n\nexport function restoreCollaborationUpdate(state: Uint8Array): Y.Doc {\n if (!(state instanceof Uint8Array)) throw new Error('Collaboration state must be binary data.')\n const document = new Doc()\n\n try {\n applyUpdate(document, Uint8Array.from(state))\n\n return document\n } catch (cause) {\n document.destroy()\n throw cause\n }\n}\n\nexport function applyCollaborationStateUpdate(document: Y.Doc, update: Uint8Array): void {\n applyUpdate(document, Uint8Array.from(update))\n}\n\nexport function synchronizeCollaborationStateValue(document: Y.Doc, stateVector?: Uint8Array) {\n return {\n stateVector: Uint8Array.from(encodeStateVector(document)),\n update: Uint8Array.from(\n stateVector === undefined ? encodeStateAsUpdate(document) : encodeStateAsUpdate(document, stateVector),\n ),\n }\n}\n\nfunction sameBytes(left: Uint8Array, right: Uint8Array): boolean {\n return left.length === right.length && left.every((value, index) => value === right[index])\n}\n","import type { CmsMarkdownDocument, SourcePath } from '@internal/protocol/Documents'\nimport type { EditorDocumentChange } from './EditorDocument'\nimport type { CollaborationEditorBinding } from './internal/collaboration/editor-binding'\nimport { Effect } from 'effect'\nimport type * as Y from 'yjs'\nimport { openEditorDocument, encodeEditorDocument } from './EditorDocument'\nimport { inspectCollaborationDocumentValue, seedCollaborationDocument } from './internal/collaboration/document'\nimport { createCollaborationEditorBinding as createEditorBinding } from './internal/collaboration/editor-binding'\nimport {\n collaborationErrorMessage,\n CollaborationDocumentInvalid,\n invalidCollaboration,\n} from './internal/collaboration/error'\nimport {\n applyCollaborationStateUpdate,\n captureCollaborationState,\n restoreCollaborationSnapshot,\n restoreCollaborationUpdate,\n synchronizeCollaborationStateValue,\n} from './internal/collaboration/state'\n\n/** The canonical in-process collaboration value. Its Yjs representation remains owned here. */\nexport type CollaborationDocument = Y.Doc\n\nexport interface CreateCollaborationDocumentInput {\n readonly body: CmsMarkdownDocument\n readonly sourcePath: SourcePath\n}\n\nexport interface CollaborationDocumentChange extends EditorDocumentChange {\n readonly sourcePath: SourcePath\n}\n\nexport interface CollaborationDocumentSnapshot {\n readonly state: Uint8Array\n readonly stateVector: Uint8Array\n}\n\nexport interface CollaborationStateSynchronization {\n readonly stateVector: Uint8Array\n readonly update: Uint8Array\n}\n\nexport const createCollaborationDocument = Effect.fn('CollaborationDocument.create')(function* (\n input: CreateCollaborationDocumentInput,\n) {\n const seed = yield* openEditorDocument(input.body)\n\n return yield* Effect.try({\n try: () => seedCollaborationDocument(input.sourcePath, seed.content, seed.meta),\n catch: (cause) => invalidCollaboration('Could not create the collaborative editor document.', cause),\n })\n})\n\nexport const renderCollaborationDocument = Effect.fn('CollaborationDocument.render')(function* (\n document: CollaborationDocument,\n) {\n const inspected = yield* inspectCollaborationDocument(document)\n const change = yield* encodeEditorDocument({ content: inspected.content, meta: inspected.meta })\n\n return {\n ...change,\n sourcePath: inspected.sourcePath,\n } satisfies CollaborationDocumentChange\n})\n\nexport function createCollaborationEditorBinding(document: CollaborationDocument): CollaborationEditorBinding {\n try {\n const inspected = inspectCollaborationDocumentValue(document)\n\n return createEditorBinding(document, inspected.fragment, inspected.content)\n } catch (cause) {\n throw invalidCollaboration(collaborationErrorMessage(cause), cause)\n }\n}\n\n/** Captures caller-owned bytes; later mutations of the live document cannot alter them. */\nexport const captureCollaborationDocument = Effect.fn('CollaborationDocument.capture')(function* (\n document: CollaborationDocument,\n) {\n yield* inspectCollaborationDocument(document)\n\n return yield* Effect.try({\n try: () => captureCollaborationState(document) satisfies CollaborationDocumentSnapshot,\n catch: (cause) => invalidCollaboration('Could not capture the collaborative editor document.', cause),\n })\n})\n\nexport const restoreCollaborationDocument = Effect.fn('CollaborationDocument.restore')(function* (\n snapshot: CollaborationDocumentSnapshot,\n) {\n const document = yield* Effect.try({\n try: () => restoreCollaborationSnapshot(snapshot),\n catch: (cause) => invalidCollaboration('Could not restore the collaborative editor document.', cause),\n })\n\n return yield* validateRestoredDocument(document)\n})\n\nexport const restoreCollaborationState = Effect.fn('CollaborationDocument.restoreState')(function* (state: Uint8Array) {\n const document = yield* Effect.try({\n try: () => restoreCollaborationUpdate(state),\n catch: (cause) => invalidCollaboration('Could not restore the collaborative editor document.', cause),\n })\n\n return yield* validateRestoredDocument(document)\n})\n\nexport const applyCollaborationUpdate = Effect.fn('CollaborationDocument.applyUpdate')(\n (document: CollaborationDocument, update: Uint8Array) =>\n Effect.try({\n try: () => applyCollaborationStateUpdate(document, update),\n catch: (cause) => invalidCollaboration('Could not apply the collaborative document update.', cause),\n }),\n)\n\nexport const synchronizeCollaborationState = Effect.fn('CollaborationDocument.synchronizeState')(\n (document: CollaborationDocument, stateVector?: Uint8Array) =>\n Effect.try({\n try: () => synchronizeCollaborationStateValue(document, stateVector) satisfies CollaborationStateSynchronization,\n catch: (cause) => invalidCollaboration('Could not synchronize the collaborative document state.', cause),\n }),\n)\n\nexport function destroyCollaborationDocument(document: CollaborationDocument): Effect.Effect<void> {\n return Effect.sync(() => document.destroy())\n}\n\nconst inspectCollaborationDocument = Effect.fn('CollaborationDocument.inspect')((document: CollaborationDocument) =>\n Effect.try({\n try: () => inspectCollaborationDocumentValue(document),\n catch: (cause) => invalidCollaboration(collaborationErrorMessage(cause), cause),\n }),\n)\n\nfunction validateRestoredDocument(document: CollaborationDocument) {\n return inspectCollaborationDocument(document).pipe(\n Effect.as(document),\n Effect.tapError(() => Effect.sync(() => document.destroy())),\n )\n}\n\nexport { CollaborationDocumentInvalid }\n\nexport type { CollaborationEditorBinding }\n","import type { DocumentVersion, DocumentId } from '@internal/protocol/Documents'\nimport type { ActivityContext } from '@internal/protocol/Activity'\nimport { Schema } from 'effect'\nimport type {\n WorkingDocumentGenerationId,\n WorkingDocumentHighWatermark,\n WorkingDocumentUpdateSequence,\n} from './working-document-model'\n\nexport const WorkingDocumentPublishAttemptId = Schema.String.check(Schema.isUUID()).pipe(\n Schema.brand('WorkingDocumentPublishAttemptId'),\n)\n\nexport type WorkingDocumentPublishAttemptId = typeof WorkingDocumentPublishAttemptId.Type\n\nexport const WorkingDocumentFormatVersion = Schema.Literal(1)\n\nexport type WorkingDocumentFormatVersion = typeof WorkingDocumentFormatVersion.Type\n\nexport const WorkingDocumentPublishPhase = Schema.Literals(['pending', 'checkpointed', 'published', 'failed'])\n\nexport type WorkingDocumentPublishPhase = typeof WorkingDocumentPublishPhase.Type\n\nexport interface WorkingDocumentUpdate {\n readonly sequence: WorkingDocumentUpdateSequence\n readonly update: Uint8Array\n}\n\nexport interface WorkingDocumentSnapshotSeed {\n readonly documentId: DocumentId\n readonly formatVersion: WorkingDocumentFormatVersion\n readonly generationId: WorkingDocumentGenerationId\n readonly savedStateVector: Uint8Array\n readonly savedVersion: DocumentVersion\n readonly state: Uint8Array\n}\n\nexport interface WorkingDocumentSnapshot extends WorkingDocumentSnapshotSeed {\n readonly highWatermark: WorkingDocumentHighWatermark\n readonly updates: ReadonlyArray<WorkingDocumentUpdate>\n}\n\ninterface WorkingDocumentPublishAttemptBase {\n readonly activity: ActivityContext\n readonly documentId: DocumentId\n readonly expectedGeneration: WorkingDocumentGenerationId\n readonly expectedVersion: DocumentVersion\n readonly highWatermark: WorkingDocumentHighWatermark\n readonly id: WorkingDocumentPublishAttemptId\n readonly markdownHash: string\n readonly state: Uint8Array\n readonly stateVector: Uint8Array\n}\n\nexport interface WorkingDocumentPendingPublish extends WorkingDocumentPublishAttemptBase {\n readonly phase: 'pending'\n}\n\nexport interface WorkingDocumentCheckpointedPublish extends WorkingDocumentPublishAttemptBase {\n readonly checkpointVersion: DocumentVersion\n readonly phase: 'checkpointed'\n}\n\nexport interface WorkingDocumentPublishedAttempt extends WorkingDocumentPublishAttemptBase {\n readonly checkpointVersion: DocumentVersion\n readonly phase: 'published'\n}\n\nexport interface WorkingDocumentFailedPublish extends WorkingDocumentPublishAttemptBase {\n readonly failure: string\n readonly phase: 'failed'\n}\n\nexport type WorkingDocumentActivePublish = WorkingDocumentPendingPublish | WorkingDocumentCheckpointedPublish\n\nexport type WorkingDocumentPublishAttempt =\n | WorkingDocumentActivePublish\n | WorkingDocumentPublishedAttempt\n | WorkingDocumentFailedPublish\n\nexport type WorkingDocumentBeginPublishInput = Omit<WorkingDocumentPendingPublish, 'phase'>\n\nexport interface WorkingDocumentAppendUpdateInput {\n readonly documentId: DocumentId\n readonly expectedGeneration: WorkingDocumentGenerationId\n readonly update: Uint8Array\n}\n\nexport interface WorkingDocumentCompactInput {\n readonly documentId: DocumentId\n readonly expectedGeneration: WorkingDocumentGenerationId\n readonly state: Uint8Array\n readonly throughSequence: WorkingDocumentUpdateSequence\n}\n\nexport interface WorkingDocumentReplaceInput {\n readonly expectedGeneration: WorkingDocumentGenerationId\n readonly snapshot: WorkingDocumentSnapshotSeed\n}\n\nexport interface WorkingDocumentRemoveInput {\n readonly documentId: DocumentId\n readonly expectedGeneration: WorkingDocumentGenerationId\n}\n\nexport interface WorkingDocumentMarkCheckpointedInput {\n readonly attemptId: WorkingDocumentPublishAttemptId\n readonly checkpointVersion: DocumentVersion\n readonly documentId: DocumentId\n}\n\nexport interface WorkingDocumentCompletePublishInput {\n readonly attemptId: WorkingDocumentPublishAttemptId\n readonly documentId: DocumentId\n}\n\nexport interface WorkingDocumentFailPublishInput {\n readonly attemptId: WorkingDocumentPublishAttemptId\n readonly documentId: DocumentId\n readonly reason: string\n}\n","import type { WorkingDocumentChange } from './working-document'\nimport { Context, Effect, Schema, Stream } from 'effect'\n\nexport class WorkingDocumentChangesError extends Schema.TaggedError<WorkingDocumentChangesError>()(\n 'WorkingDocuments.ChangesError',\n {\n operation: Schema.NonEmptyString,\n cause: Schema.Defect(),\n },\n) {}\n\nexport interface WorkingDocumentChangesApi {\n readonly changes: Stream.Stream<WorkingDocumentChange>\n readonly check: Effect.Effect<void, WorkingDocumentChangesError>\n}\n\nexport class WorkingDocumentChanges extends Context.Service<WorkingDocumentChanges, WorkingDocumentChangesApi>()(\n '@internal/server/WorkingDocumentChanges',\n) {}\n","import type { DocumentId } from '@internal/protocol/Documents'\nimport type {\n WorkingDocumentActivePublish,\n WorkingDocumentAppendUpdateInput,\n WorkingDocumentBeginPublishInput,\n WorkingDocumentCheckpointedPublish,\n WorkingDocumentCompletePublishInput,\n WorkingDocumentCompactInput,\n WorkingDocumentFailedPublish,\n WorkingDocumentFailPublishInput,\n WorkingDocumentMarkCheckpointedInput,\n WorkingDocumentPublishedAttempt,\n WorkingDocumentRemoveInput,\n WorkingDocumentReplaceInput,\n WorkingDocumentSnapshot,\n WorkingDocumentSnapshotSeed,\n WorkingDocumentUpdate,\n} from './working-document-record'\nimport { Context, Effect, Option } from 'effect'\nimport type { WorkingDocumentHighWatermark } from './working-document-model'\nimport {\n WorkingDocumentConflict,\n WorkingDocumentPersistenceError,\n WorkingDocumentSuperseded,\n} from './working-document-model'\n\nexport type WorkingDocumentStoreError =\n | WorkingDocumentConflict\n | WorkingDocumentPersistenceError\n | WorkingDocumentSuperseded\n\nexport interface WorkingDocumentStoreApi {\n readonly appendUpdate: (\n input: WorkingDocumentAppendUpdateInput,\n ) => Effect.Effect<WorkingDocumentUpdate, WorkingDocumentStoreError>\n readonly beginPublish: (\n input: WorkingDocumentBeginPublishInput,\n ) => Effect.Effect<WorkingDocumentActivePublish, WorkingDocumentStoreError>\n readonly compact: (input: WorkingDocumentCompactInput) => Effect.Effect<void, WorkingDocumentStoreError>\n readonly completePublish: (\n input: WorkingDocumentCompletePublishInput,\n ) => Effect.Effect<WorkingDocumentPublishedAttempt, WorkingDocumentStoreError>\n readonly documentIds: Effect.Effect<ReadonlyArray<DocumentId>, WorkingDocumentPersistenceError>\n readonly failPublish: (\n input: WorkingDocumentFailPublishInput,\n ) => Effect.Effect<WorkingDocumentFailedPublish, WorkingDocumentStoreError>\n readonly initialize: (\n snapshot: WorkingDocumentSnapshotSeed,\n ) => Effect.Effect<WorkingDocumentSnapshot, WorkingDocumentPersistenceError>\n readonly load: (\n documentId: DocumentId,\n ) => Effect.Effect<Option.Option<WorkingDocumentSnapshot>, WorkingDocumentPersistenceError>\n readonly markCheckpointed: (\n input: WorkingDocumentMarkCheckpointedInput,\n ) => Effect.Effect<WorkingDocumentCheckpointedPublish, WorkingDocumentStoreError>\n readonly pendingPublish: (\n documentId: DocumentId,\n ) => Effect.Effect<Option.Option<WorkingDocumentActivePublish>, WorkingDocumentPersistenceError>\n /** Cheaply verifies the Working Document generation and returns its durable update cursor. */\n readonly probe: (\n documentId: DocumentId,\n expectedGeneration: WorkingDocumentSnapshot['generationId'],\n ) => Effect.Effect<WorkingDocumentHighWatermark, WorkingDocumentStoreError>\n readonly remove: (input: WorkingDocumentRemoveInput) => Effect.Effect<void, WorkingDocumentStoreError>\n readonly replace: (\n input: WorkingDocumentReplaceInput,\n ) => Effect.Effect<WorkingDocumentSnapshot, WorkingDocumentStoreError>\n}\n\nexport class WorkingDocumentStore extends Context.Service<WorkingDocumentStore, WorkingDocumentStoreApi>()(\n '@internal/server/WorkingDocumentStore',\n) {}\n","import type { CompiledDocument, DocumentSource } from '@internal/protocol/Documents'\nimport type { WorkingDocumentSnapshot } from './working-document-record'\nimport type { WorkingDocumentGenerationId } from './working-document-model'\nimport type { CollaborationDocument, CollaborationDocumentSnapshot } from '@internal/document/CollaborationDocument'\nimport type { Schema } from 'effect'\nimport {\n captureCollaborationDocument,\n createCollaborationDocument,\n CollaborationDocumentInvalid,\n applyCollaborationUpdate,\n destroyCollaborationDocument,\n renderCollaborationDocument,\n restoreCollaborationDocument,\n restoreCollaborationState,\n synchronizeCollaborationState,\n} from '@internal/document/CollaborationDocument'\nimport { Effect } from 'effect'\n\nexport function createWorkingSnapshot(\n source: DocumentSource,\n document: CompiledDocument,\n generationId: WorkingDocumentGenerationId,\n) {\n return Effect.acquireUseRelease(\n createCollaborationDocument({ body: document.body, sourcePath: source.sourcePath }),\n (working) =>\n captureCollaborationDocument(working).pipe(\n Effect.map((captured) => ({\n documentId: source.documentId,\n formatVersion: 1 as const,\n generationId,\n savedStateVector: captured.stateVector,\n savedVersion: source.version,\n state: captured.state,\n })),\n ),\n destroyCollaborationDocument,\n )\n}\n\nexport function restoreWorkingSnapshot(snapshot: WorkingDocumentSnapshot) {\n return restoreCollaborationState(snapshot.state).pipe(\n Effect.flatMap((document) =>\n Effect.forEach(snapshot.updates, (persisted) => applyCollaborationUpdate(document, persisted.update), {\n discard: true,\n }).pipe(\n Effect.andThen(renderCollaborationDocument(document)),\n Effect.as(document),\n Effect.tapError(() => destroyCollaborationDocument(document)),\n ),\n ),\n )\n}\n\nexport function useWorkingSnapshot<A, E, R>(\n snapshot: WorkingDocumentSnapshot,\n use: (document: CollaborationDocument) => Effect.Effect<A, E, R>,\n) {\n return Effect.acquireUseRelease(restoreWorkingSnapshot(snapshot), use, destroyCollaborationDocument)\n}\n\nfunction useCapturedDocument<A, E, R>(\n document: CollaborationDocument,\n use: (captured: CollaborationDocumentSnapshot, immutable: CollaborationDocument) => Effect.Effect<A, E, R>,\n) {\n return captureCollaborationDocument(document).pipe(\n Effect.flatMap((captured) =>\n Effect.acquireUseRelease(\n restoreCollaborationDocument(captured),\n (immutable) => use(captured, immutable),\n destroyCollaborationDocument,\n ),\n ),\n )\n}\n\n/**\n * Merges a live replica into the latest durable snapshot before taking the\n * immutable capture used by preview/publish workflows.\n */\nexport function useAuthoritativeWorkingDocument<A, E, R>(\n snapshot: WorkingDocumentSnapshot,\n replica: CollaborationDocument,\n use: (captured: CollaborationDocumentSnapshot, immutable: CollaborationDocument) => Effect.Effect<A, E, R>,\n) {\n return useWorkingSnapshot(snapshot, (authoritative) =>\n Effect.gen(function* () {\n const baseline = yield* renderCollaborationDocument(authoritative)\n const authoritativeState = yield* synchronizeCollaborationState(authoritative)\n const replicaDelta = yield* synchronizeCollaborationState(replica, authoritativeState.stateVector)\n yield* applyCollaborationUpdate(authoritative, replicaDelta.update)\n const merged = yield* renderCollaborationDocument(authoritative)\n\n if (merged.sourcePath !== baseline.sourcePath || !sameJson(merged.body.meta, baseline.body.meta)) {\n return yield* new CollaborationDocumentInvalid({\n cause: new Error('The live replica changes server-owned Working Document metadata.'),\n message: 'Collaborative updates cannot change sourcePath or meta.',\n })\n }\n\n return yield* useCapturedDocument(authoritative, use)\n }),\n )\n}\n\nexport function capturedWorkingSourcePath(snapshot: CollaborationDocumentSnapshot) {\n return Effect.acquireUseRelease(\n restoreCollaborationDocument(snapshot),\n (document) => renderCollaborationDocument(document).pipe(Effect.map((rendered) => rendered.sourcePath)),\n destroyCollaborationDocument,\n )\n}\n\nexport function workingSnapshotIsDirty(snapshot: WorkingDocumentSnapshot) {\n return useWorkingSnapshot(snapshot, (document) =>\n captureCollaborationDocument(document).pipe(\n Effect.map((captured) => !sameBytes(captured.stateVector, snapshot.savedStateVector)),\n ),\n )\n}\n\nexport function validateWorkingUpdate(snapshot: WorkingDocumentSnapshot, update: Uint8Array) {\n return useWorkingSnapshot(snapshot, (document) =>\n Effect.gen(function* () {\n const baseline = yield* renderCollaborationDocument(document)\n yield* applyCollaborationUpdate(document, update)\n const candidate = yield* renderCollaborationDocument(document)\n\n if (candidate.sourcePath !== baseline.sourcePath || !sameJson(candidate.body.meta, baseline.body.meta)) {\n return yield* new CollaborationDocumentInvalid({\n cause: new Error('The update changes server-owned Working Document metadata.'),\n message: 'Collaborative updates cannot change sourcePath or meta.',\n })\n }\n }),\n )\n}\n\nfunction sameBytes(left: Uint8Array, right: Uint8Array): boolean {\n return left.length === right.length && left.every((value, index) => value === right[index])\n}\n\nfunction sameJson(left: Schema.JsonObject, right: Schema.JsonObject): boolean {\n return JSON.stringify(left) === JSON.stringify(right)\n}\n","import type { CompiledDocument, DocumentSource } from '@internal/protocol/Documents'\nimport type { DocumentMaintenanceApi } from '../documents/documents'\nimport type { WorkingDocumentGenerationId } from './working-document-model'\nimport type { WorkingDocumentsError } from './working-document'\nimport { UpdateDocumentInput } from '@internal/protocol/Documents'\nimport { Effect } from 'effect'\nimport { createWorkingSnapshot } from './working-document-format'\nimport { WorkingDocumentInvalid } from './working-document'\n\nexport const validatedWorkingDocument = Effect.fn('WorkingDocuments.validateSource')(function* (\n source: DocumentSource,\n validate: DocumentMaintenanceApi['validate'],\n) {\n const validation = yield* validate(\n UpdateDocumentInput.make({\n documentId: source.documentId,\n expectedVersion: source.version,\n markdown: source.markdown,\n }),\n )\n\n if (!validation.valid || !validation.document) {\n return yield* new WorkingDocumentInvalid({\n cause: validation.issues,\n documentId: source.documentId,\n message: 'Authored document cannot initialize a Working Document.',\n })\n }\n\n return validation.document\n})\n\nexport const newWorkingSnapshot = Effect.fn('WorkingDocuments.newSnapshot')(function* (\n source: DocumentSource,\n document: CompiledDocument,\n generationId: (\n documentId: DocumentSource['documentId'],\n ) => Effect.Effect<WorkingDocumentGenerationId, WorkingDocumentsError>,\n) {\n return yield* createWorkingSnapshot(source, document, yield* generationId(source.documentId))\n})\n","import type { DocumentMaintenanceApi } from '../documents/documents'\nimport type { DocumentMutationResult, DocumentSource } from '@internal/protocol/Documents'\nimport type { DocumentGeneration, DocumentId } from '@internal/protocol/Documents'\nimport type { WorkingDocumentSnapshot, WorkingDocumentSnapshotSeed } from './working-document-record'\nimport type { WorkingDocumentStoreApi } from './working-document-store'\nimport type { WorkingDocumentChange, WorkingDocumentsError } from './working-document'\nimport {\n captureCollaborationDocument,\n type CollaborationDocumentSnapshot,\n} from '@internal/document/CollaborationDocument'\nimport { DocumentNotFound } from '@internal/protocol/Documents'\nimport { Effect, Option, PubSub, Queue, Ref, Schedule, Schema, Stream } from 'effect'\nimport { useWorkingSnapshot, workingSnapshotIsDirty } from './working-document-format'\nimport { WorkingDocumentRef, WorkingDocumentUnavailable } from './working-document'\nimport { newWorkingSnapshot, validatedWorkingDocument } from './working-document-source'\n\nconst isDocumentNotFound = Schema.is(DocumentNotFound)\n\ninterface WorkingDocumentReconciliationOptions {\n readonly changes: PubSub.PubSub<WorkingDocumentChange>\n readonly documents: DocumentMaintenanceApi\n readonly generationId: (\n documentId: DocumentId,\n ) => Effect.Effect<WorkingDocumentSnapshot['generationId'], WorkingDocumentsError>\n readonly store: WorkingDocumentStoreApi\n readonly recoverPublish: (source: DocumentSource) => Effect.Effect<DocumentSource, WorkingDocumentsError>\n readonly synchronized: <A, E, R>(documentId: DocumentId, effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>\n}\n\ninterface ReconciliationState {\n readonly cursor: DocumentGeneration\n readonly failure: WorkingDocumentsError | undefined\n readonly mutation: DocumentMutationResult | undefined\n readonly sweepRequired: boolean\n readonly target: DocumentGeneration\n}\n\nconst retrySchedule = Schedule.min([\n Schedule.exponential('100 millis').pipe(Schedule.jittered),\n Schedule.spaced('30 seconds'),\n])\n\nexport const startWorkingDocumentReconciliation = Effect.fn('WorkingDocuments.startReconciliation')(function* (\n options: WorkingDocumentReconciliationOptions,\n) {\n const subscription = yield* options.documents.subscribeMutations\n\n const publishChange = (snapshot: WorkingDocumentSnapshot) =>\n PubSub.publish(options.changes, {\n kind: 'invalidated' as const,\n ref: WorkingDocumentRef.make({ documentId: snapshot.documentId, generationId: snapshot.generationId }),\n }).pipe(Effect.asVoid)\n\n const currentSource = (documentId: DocumentId) =>\n options.documents.read(documentId).pipe(\n Effect.asSome,\n Effect.catchIf(isDocumentNotFound, () => Effect.succeedNone),\n )\n\n const rotateDirty = Effect.fn('WorkingDocuments.reconcile.rotateDirty')(function* (\n snapshot: WorkingDocumentSnapshot,\n ) {\n const generationId = yield* options.generationId(snapshot.documentId)\n\n const seed = yield* useWorkingSnapshot(snapshot, (document) =>\n captureCollaborationDocument(document).pipe(\n Effect.map((captured) => rotatedSeed(snapshot, generationId, captured)),\n ),\n )\n\n yield* options.store.replace({ expectedGeneration: snapshot.generationId, snapshot: seed })\n yield* publishChange(snapshot)\n })\n\n const reconcileDocument = Effect.fn('WorkingDocuments.reconcile.document')(function* (documentId: DocumentId) {\n yield* options.synchronized(\n documentId,\n Effect.gen(function* () {\n let loaded = yield* options.store.load(documentId)\n\n if (Option.isNone(loaded)) return\n let source = yield* currentSource(documentId)\n\n if (Option.isNone(source)) {\n const activePublish = yield* options.store.pendingPublish(documentId)\n\n if (Option.isSome(activePublish)) return\n } else {\n source = Option.some(yield* options.recoverPublish(source.value))\n loaded = yield* options.store.load(documentId)\n\n if (Option.isNone(loaded)) return\n }\n\n if (Option.isSome(source) && source.value.version === loaded.value.savedVersion) return\n\n if (yield* workingSnapshotIsDirty(loaded.value)) {\n yield* rotateDirty(loaded.value)\n\n return\n }\n\n if (Option.isNone(source)) {\n yield* options.store.remove({\n documentId,\n expectedGeneration: loaded.value.generationId,\n })\n yield* publishChange(loaded.value)\n\n return\n }\n\n const document = yield* validatedWorkingDocument(source.value, options.documents.validate)\n yield* options.store.replace({\n expectedGeneration: loaded.value.generationId,\n snapshot: yield* newWorkingSnapshot(source.value, document, options.generationId),\n })\n yield* publishChange(loaded.value)\n }),\n )\n })\n\n const sweep = Effect.fn('WorkingDocuments.reconcile.sweep')(function* () {\n const documentIds = yield* options.store.documentIds\n yield* Effect.forEach(documentIds, reconcileDocument, { discard: true })\n })\n\n const refresh = Effect.fn('WorkingDocuments.reconcile.refresh')(function* () {\n const generation = yield* options.documents.refresh\n yield* sweep()\n\n return generation\n })\n\n const reconcile = (result: DocumentMutationResult) =>\n result.action === 'document.publish' ? Effect.void : reconcileDocument(result.documentId)\n\n const initialGeneration = yield* refresh()\n\n const state = yield* Ref.make<ReconciliationState>({\n cursor: initialGeneration,\n failure: undefined,\n mutation: undefined,\n sweepRequired: false,\n target: initialGeneration,\n })\n\n const wakeups = yield* Effect.acquireRelease(Queue.dropping<void>(1), (queue) =>\n Queue.shutdown(queue).pipe(Effect.asVoid),\n )\n\n const observe = Effect.fn('WorkingDocuments.reconcile.observe')(function* (result: DocumentMutationResult) {\n const shouldWake = yield* Ref.modify(state, (current) => {\n if (\n generationAtOrBefore(result.generation, current.cursor) ||\n generationAtOrBefore(result.generation, current.target)\n ) {\n return [false, current]\n }\n\n return [\n true,\n {\n ...current,\n mutation: result,\n sweepRequired: current.sweepRequired || (result.affectedDocumentIds?.length ?? 0) > 1,\n target: result.generation,\n },\n ]\n })\n\n if (shouldWake) yield* Queue.offer(wakeups, undefined)\n })\n\n const recordFailure = (failure: WorkingDocumentsError) =>\n Ref.update(state, (current) => ({\n ...current,\n failure,\n sweepRequired: true,\n })).pipe(Effect.andThen(Effect.logError('Working document reconciliation failed.', failure)))\n\n const converge = Effect.fn('WorkingDocuments.reconcile.converge')(function* () {\n const current = yield* Ref.get(state)\n\n if (generationAtOrBefore(current.target, current.cursor)) return true\n\n let reconciledGeneration: DocumentGeneration\n\n if (current.sweepRequired || !current.mutation || !generationsAreAdjacent(current.cursor, current.target)) {\n reconciledGeneration = yield* refresh()\n } else {\n yield* reconcile(current.mutation)\n reconciledGeneration = current.target\n }\n\n return yield* Ref.modify(state, (latest) => {\n const cursor = generationAtOrBefore(reconciledGeneration, latest.cursor) ? latest.cursor : reconciledGeneration\n\n return [\n generationAtOrBefore(latest.target, cursor),\n {\n ...latest,\n cursor,\n failure: undefined,\n sweepRequired: false,\n },\n ]\n })\n })\n\n const drain = converge().pipe(\n Effect.tapError(recordFailure),\n Effect.retry(retrySchedule),\n Effect.repeat({ until: (caughtUp) => caughtUp }),\n Effect.asVoid,\n )\n\n const check = Ref.get(state).pipe(\n Effect.flatMap((current) => {\n if (current.failure) {\n return Effect.fail(\n new WorkingDocumentUnavailable({\n cause: current.failure,\n operation: 'WorkingDocuments.reconcile',\n }),\n )\n }\n\n return generationAtOrBefore(current.target, current.cursor)\n ? Effect.void\n : Effect.fail(\n new WorkingDocumentUnavailable({\n cause: {\n cursor: current.cursor,\n target: current.target,\n },\n operation: 'WorkingDocuments.reconcile',\n }),\n )\n }),\n )\n\n yield* subscription.mutations.pipe(Stream.runForEach(observe), Effect.forkScoped({ startImmediately: true }))\n yield* Stream.fromQueue(wakeups).pipe(\n Stream.runForEach(() => drain),\n Effect.forkScoped({ startImmediately: true }),\n )\n\n return { check }\n})\n\nfunction rotatedSeed(\n snapshot: WorkingDocumentSnapshot,\n generationId: WorkingDocumentSnapshot['generationId'],\n captured: CollaborationDocumentSnapshot,\n): WorkingDocumentSnapshotSeed {\n return {\n documentId: snapshot.documentId,\n formatVersion: snapshot.formatVersion,\n generationId,\n savedStateVector: Uint8Array.from(snapshot.savedStateVector),\n savedVersion: snapshot.savedVersion,\n state: Uint8Array.from(captured.state),\n }\n}\n\nfunction generationAtOrBefore(candidate: DocumentGeneration, current: DocumentGeneration): boolean {\n return BigInt(candidate) <= BigInt(current)\n}\n\nfunction generationsAreAdjacent(current: DocumentGeneration, candidate: DocumentGeneration): boolean {\n return BigInt(candidate) === BigInt(current) + 1n\n}\n","import type { DocumentId } from '@internal/protocol/Documents'\nimport { Effect, Semaphore } from 'effect'\n\ninterface DocumentLock {\n readonly semaphore: Semaphore.Semaphore\n users: number\n}\n\n/** Retain a lock only while an operation is running or waiting for that document. */\nexport function documentSynchronization() {\n const locks = new Map<DocumentId, DocumentLock>()\n\n return <A, E, R>(documentId: DocumentId, effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>\n Effect.acquireUseRelease(\n Effect.sync(() => {\n let lock = locks.get(documentId)\n\n if (!lock) {\n lock = { semaphore: Semaphore.makeUnsafe(1), users: 0 }\n locks.set(documentId, lock)\n }\n\n lock.users += 1\n\n return lock\n }),\n (lock) => lock.semaphore.withPermit(effect),\n (lock) =>\n Effect.sync(() => {\n lock.users -= 1\n\n if (lock.users === 0 && locks.get(documentId) === lock) locks.delete(documentId)\n }),\n )\n}\n","import type { DocumentMutationResult, DocumentSource } from '@internal/protocol/Documents'\nimport type { DocumentId } from '@internal/protocol/Documents'\nimport type { StudioRequestContext } from '@internal/protocol/AccessControl'\nimport type { ActivityContext } from '@internal/protocol/Activity'\nimport type { WorkingDocumentSnapshot } from './working-document-record'\nimport { Documents } from '../../Documents'\nimport { DocumentMaintenance } from '../documents/documents'\nimport {\n captureCollaborationDocument,\n renderCollaborationDocument,\n synchronizeCollaborationState,\n} from '@internal/document/CollaborationDocument'\nimport { UpdateDocumentInput } from '@internal/protocol/Documents'\nimport { ActivityContext as ActivityContextSchema } from '@internal/protocol/Activity'\nimport { Crypto, Effect, Layer, Option, PubSub, Stream } from 'effect'\nimport { AccessControl } from '../../AccessControl'\nimport { WorkingDocumentGenerationId, WorkingDocumentHighWatermark } from './working-document-model'\nimport { WorkingDocumentPublishAttemptId } from './working-document-record'\nimport { WorkingDocumentChanges } from './working-document-changes'\nimport { WorkingDocumentStore } from './working-document-store'\nimport { WorkingDocumentConflict, WorkingDocumentSuperseded } from './working-document-model'\nimport {\n capturedWorkingSourcePath,\n restoreWorkingSnapshot,\n useAuthoritativeWorkingDocument,\n useWorkingSnapshot,\n validateWorkingUpdate,\n workingSnapshotIsDirty,\n} from './working-document-format'\nimport { startWorkingDocumentReconciliation } from './working-document-reconciliation'\nimport { documentSynchronization } from './document-locks'\nimport { newWorkingSnapshot, validatedWorkingDocument } from './working-document-source'\nimport {\n WorkingDocumentCheckpointed,\n WorkingDocumentInvalid,\n WorkingDocumentRef,\n WorkingDocumentUnavailable,\n WorkingDocuments,\n} from './working-document'\nimport type { WorkingDocumentChange, WorkingDocumentsApi } from './working-document'\n\nexport interface WorkingDocumentsOptions {\n readonly compactAfterUpdates?: number\n}\n\nexport function workingDocumentsLayer(options: WorkingDocumentsOptions = {}) {\n return Layer.effect(WorkingDocuments, makeWorkingDocuments(options))\n}\n\nconst makeWorkingDocuments = Effect.fn('WorkingDocuments.make')(function* (options: WorkingDocumentsOptions) {\n const accessControl = yield* AccessControl\n const documents = yield* Documents\n const maintenance = yield* DocumentMaintenance\n const crypto = yield* Crypto.Crypto\n const store = yield* WorkingDocumentStore\n const changeSource = yield* WorkingDocumentChanges\n const changes = yield* Effect.acquireRelease(PubSub.bounded<WorkingDocumentChange>(64), PubSub.shutdown)\n const synchronized = documentSynchronization()\n const compactAfterUpdates = validCompactionLimit(options.compactAfterUpdates)\n\n const generationId = (documentId: DocumentId) =>\n crypto.randomUUIDv4.pipe(\n Effect.map((uuid) => WorkingDocumentGenerationId.make(uuid)),\n Effect.mapError((cause) => invalid(documentId, 'Could not create a working document generation.', cause)),\n )\n\n const attemptId = (documentId: DocumentId) =>\n crypto.randomUUIDv4.pipe(\n Effect.map((uuid) => WorkingDocumentPublishAttemptId.make(uuid)),\n Effect.mapError((cause) => invalid(documentId, 'Could not create a publish attempt.', cause)),\n )\n\n const markdownHash = (documentId: DocumentId, markdown: string) =>\n crypto.digest('SHA-256', new TextEncoder().encode(markdown)).pipe(\n Effect.map(hex),\n Effect.mapError((cause) => invalid(documentId, 'Could not fingerprint Working Document Markdown.', cause)),\n )\n\n const compactSnapshot = Effect.fn('WorkingDocuments.compactSnapshot')(function* (snapshot: WorkingDocumentSnapshot) {\n const lastUpdate = snapshot.updates.at(-1)\n\n if (!lastUpdate) return false\n\n return yield* useWorkingSnapshot(snapshot, (document) =>\n captureCollaborationDocument(document).pipe(\n Effect.flatMap((captured) =>\n store.compact({\n documentId: snapshot.documentId,\n expectedGeneration: snapshot.generationId,\n state: captured.state,\n throughSequence: lastUpdate.sequence,\n }),\n ),\n Effect.as(true),\n ),\n )\n })\n\n const snapshotFor = Effect.fn('WorkingDocuments.snapshotFor')(function* (ref: WorkingDocumentRef) {\n const snapshot = yield* store.load(ref.documentId)\n\n if (Option.isNone(snapshot)) {\n return yield* new WorkingDocumentSuperseded({\n documentId: ref.documentId,\n expectedGeneration: ref.generationId,\n })\n }\n\n if (snapshot.value.generationId !== ref.generationId) {\n return yield* new WorkingDocumentSuperseded({\n actualGeneration: snapshot.value.generationId,\n documentId: ref.documentId,\n expectedGeneration: ref.generationId,\n })\n }\n\n return snapshot.value\n })\n\n const recoverPublish = Effect.fn('WorkingDocuments.recoverPublish')(function* (source: DocumentSource) {\n const active = yield* store.pendingPublish(source.documentId)\n\n if (Option.isNone(active)) return source\n let attempt = active.value\n let currentSource = source\n\n if (attempt.phase === 'pending') {\n const currentHash = yield* markdownHash(source.documentId, source.markdown)\n\n if (currentHash === attempt.markdownHash) {\n const capturedSourcePath = yield* capturedWorkingSourcePath({\n state: attempt.state,\n stateVector: attempt.stateVector,\n })\n\n if (capturedSourcePath !== source.sourcePath) {\n yield* store.failPublish({\n attemptId: attempt.id,\n documentId: source.documentId,\n reason: 'source-path-changed',\n })\n\n return yield* conflict(\n source.documentId,\n 'recoverPublish',\n 'The document source path changed during interrupted publish recovery.',\n )\n }\n\n attempt = yield* store.markCheckpointed({\n attemptId: attempt.id,\n checkpointVersion: source.version,\n documentId: source.documentId,\n })\n } else if (source.version === attempt.expectedVersion) {\n yield* store.failPublish({\n attemptId: attempt.id,\n documentId: source.documentId,\n reason: 'update-not-committed',\n })\n\n return source\n } else {\n yield* store.failPublish({\n attemptId: attempt.id,\n documentId: source.documentId,\n reason: 'authored-document-changed',\n })\n\n return yield* conflict(\n source.documentId,\n 'recoverPublish',\n 'Authored document changed during interrupted publish recovery.',\n )\n }\n }\n\n if (currentSource.version !== attempt.checkpointVersion) {\n return yield* conflict(\n source.documentId,\n 'recoverPublish',\n 'Authored document changed after the Working Document checkpoint.',\n )\n }\n\n if (currentSource.publishedVersion !== attempt.checkpointVersion) {\n yield* maintenance.publish(\n {\n documentId: source.documentId,\n expectedVersion: attempt.checkpointVersion,\n },\n attempt.activity,\n )\n currentSource = yield* maintenance.read(source.documentId)\n }\n\n yield* store.completePublish({ attemptId: attempt.id, documentId: source.documentId })\n\n return currentSource\n })\n\n const ensureOpenSnapshot = Effect.fn('WorkingDocuments.ensureOpenSnapshot')(function* (source: DocumentSource) {\n const loaded = yield* store.load(source.documentId)\n\n if (Option.isNone(loaded)) {\n const document = yield* validatedWorkingDocument(source, maintenance.validate)\n const initialized = yield* store.initialize(yield* newWorkingSnapshot(source, document, generationId))\n\n if (initialized.savedVersion === source.version) return initialized\n\n if (yield* workingSnapshotIsDirty(initialized)) return initialized\n\n return yield* store.replace({\n expectedGeneration: initialized.generationId,\n snapshot: yield* newWorkingSnapshot(source, document, generationId),\n })\n }\n\n if (loaded.value.savedVersion === source.version) return loaded.value\n\n if (yield* workingSnapshotIsDirty(loaded.value)) return loaded.value\n const document = yield* validatedWorkingDocument(source, maintenance.validate)\n\n return yield* store.replace({\n expectedGeneration: loaded.value.generationId,\n snapshot: yield* newWorkingSnapshot(source, document, generationId),\n })\n })\n\n const open: WorkingDocumentsApi['open'] = (context, documentId) =>\n synchronized(\n documentId,\n Effect.gen(function* () {\n let source = yield* documents.read(context, documentId)\n source = yield* recoverPublish(source)\n const snapshot = yield* ensureOpenSnapshot(source)\n\n const workingStateVector = yield* useWorkingSnapshot(snapshot, (document) =>\n captureCollaborationDocument(document).pipe(Effect.map((captured) => captured.stateVector)),\n )\n\n return {\n authoredStateVector: Uint8Array.from(snapshot.savedStateVector),\n ref: WorkingDocumentRef.make({ documentId, generationId: snapshot.generationId }),\n source,\n workingStateVector,\n }\n }),\n )\n\n const load: WorkingDocumentsApi['load'] = (ref) =>\n synchronized(ref.documentId, snapshotFor(ref).pipe(Effect.flatMap(restoreWorkingSnapshot)))\n\n const synchronize: WorkingDocumentsApi['synchronize'] = (ref, stateVector) => {\n return synchronized(\n ref.documentId,\n snapshotFor(ref).pipe(\n Effect.flatMap((snapshot) =>\n useWorkingSnapshot(snapshot, (document) =>\n synchronizeCollaborationState(document, stateVector).pipe(\n Effect.map((synchronized) => ({ highWatermark: snapshot.highWatermark, ...synchronized })),\n ),\n ),\n ),\n ),\n )\n }\n\n const probe: WorkingDocumentsApi['probe'] = (ref) => store.probe(ref.documentId, ref.generationId)\n\n const compact: WorkingDocumentsApi['compact'] = (ref) =>\n synchronized(ref.documentId, snapshotFor(ref).pipe(Effect.flatMap(compactSnapshot), Effect.asVoid))\n\n const appendUpdate: WorkingDocumentsApi['appendUpdate'] = (ref, update) => {\n return synchronized(\n ref.documentId,\n Effect.gen(function* () {\n const current = yield* snapshotFor(ref)\n yield* validateWorkingUpdate(current, update)\n\n const appended = yield* store.appendUpdate({\n documentId: ref.documentId,\n expectedGeneration: ref.generationId,\n update: Uint8Array.from(update),\n })\n\n const snapshot = yield* snapshotFor(ref)\n const compacted = snapshot.updates.length >= compactAfterUpdates ? yield* compactSnapshot(snapshot) : false\n\n return { compacted, sequence: appended.sequence }\n }),\n )\n }\n\n const preview: WorkingDocumentsApi['preview'] = (context, ref, document) => {\n return synchronized(\n ref.documentId,\n Effect.gen(function* () {\n const snapshot = yield* snapshotFor(ref)\n\n return yield* useAuthoritativeWorkingDocument(snapshot, document, (captured, immutable) =>\n Effect.gen(function* () {\n const rendered = yield* renderCollaborationDocument(immutable)\n\n const validation = yield* documents.validate(\n context,\n UpdateDocumentInput.make({\n documentId: ref.documentId,\n expectedVersion: snapshot.savedVersion,\n markdown: rendered.markdown,\n }),\n )\n\n return {\n body: rendered.body,\n markdown: rendered.markdown,\n stateVector: Uint8Array.from(captured.stateVector),\n validation,\n }\n }),\n )\n }),\n )\n }\n\n const publish: WorkingDocumentsApi['publish'] = (context, ref, document) => {\n return synchronized(\n ref.documentId,\n Effect.gen(function* () {\n let source = yield* documents.read(context, ref.documentId)\n source = yield* recoverPublish(source)\n const snapshot = yield* snapshotFor(ref)\n\n return yield* useAuthoritativeWorkingDocument(snapshot, document, (captured, immutable) =>\n Effect.gen(function* () {\n if (snapshot.savedVersion !== source.version) {\n return yield* conflict(\n ref.documentId,\n 'publish',\n 'Authored document changed before the Working Document publish.',\n )\n }\n\n const rendered = yield* renderCollaborationDocument(immutable)\n\n if (rendered.sourcePath !== source.sourcePath) {\n return yield* conflict(ref.documentId, 'publish', 'The working document source path is stale.')\n }\n\n yield* accessControl.require(context, {\n action: 'document.publish',\n resource: { documentId: ref.documentId, kind: 'document' },\n })\n const id = yield* attemptId(ref.documentId)\n yield* store.beginPublish({\n activity: activityContext(context),\n documentId: ref.documentId,\n expectedGeneration: ref.generationId,\n expectedVersion: snapshot.savedVersion,\n highWatermark: WorkingDocumentHighWatermark.make(snapshot.highWatermark),\n id,\n markdownHash: yield* markdownHash(ref.documentId, rendered.markdown),\n state: captured.state,\n stateVector: captured.stateVector,\n })\n\n let checkpointVersion = source.version\n let checkpointResult: DocumentMutationResult | undefined\n\n if (rendered.markdown !== source.markdown) {\n const checkpoint = yield* documents\n .update(\n context,\n UpdateDocumentInput.make({\n documentId: ref.documentId,\n expectedVersion: source.version,\n markdown: rendered.markdown,\n }),\n )\n .pipe(\n Effect.tapError(() =>\n store\n .failPublish({ attemptId: id, documentId: ref.documentId, reason: 'document-update-failed' })\n .pipe(Effect.catchCause(() => Effect.void)),\n ),\n )\n\n checkpointResult = checkpoint\n checkpointVersion = checkpoint.version\n }\n\n const checkpointFailure = (cause: unknown) =>\n checkpointResult\n ? new WorkingDocumentCheckpointed({\n cause,\n checkpointVersion,\n documentId: ref.documentId,\n result: checkpointResult,\n stateVector: Uint8Array.from(captured.stateVector),\n })\n : new WorkingDocumentCheckpointed({\n cause,\n checkpointVersion,\n documentId: ref.documentId,\n stateVector: Uint8Array.from(captured.stateVector),\n })\n\n const markCheckpointed = store.markCheckpointed({\n attemptId: id,\n checkpointVersion,\n documentId: ref.documentId,\n })\n\n yield* checkpointResult ? markCheckpointed.pipe(Effect.mapError(checkpointFailure)) : markCheckpointed\n\n const result = yield* Effect.gen(function* () {\n const result = yield* maintenance.publish(\n {\n documentId: ref.documentId,\n expectedVersion: checkpointVersion,\n },\n activityContext(context),\n )\n\n yield* store.completePublish({ attemptId: id, documentId: ref.documentId })\n\n return result\n }).pipe(Effect.mapError(checkpointFailure))\n\n return {\n checkpointVersion,\n result,\n stateVector: Uint8Array.from(captured.stateVector),\n }\n }),\n )\n }),\n )\n }\n\n yield* changeSource.changes.pipe(\n Stream.runForEach((change) => PubSub.publish(changes, change)),\n Effect.forkScoped({ startImmediately: true }),\n )\n\n const reconciliation = yield* startWorkingDocumentReconciliation({\n changes,\n documents: maintenance,\n generationId,\n recoverPublish,\n store,\n synchronized,\n })\n\n return WorkingDocuments.of({\n appendUpdate,\n changes: Stream.fromPubSub(changes),\n check: changeSource.check.pipe(\n Effect.mapError((cause) => new WorkingDocumentUnavailable({ cause, operation: 'WorkingDocuments.check' })),\n Effect.andThen(reconciliation.check),\n ),\n compact,\n load,\n open,\n preview,\n probe,\n publish,\n synchronize,\n })\n})\n\nfunction validCompactionLimit(value: number | undefined): number {\n return value !== undefined && Number.isSafeInteger(value) && value > 0 ? value : 64\n}\n\nfunction invalid(documentId: DocumentId, message: string, cause: unknown): WorkingDocumentInvalid {\n return new WorkingDocumentInvalid({ cause, documentId, message })\n}\n\nfunction conflict(documentId: DocumentId, operation: string, message: string) {\n return Effect.fail(new WorkingDocumentConflict({ documentId, message, operation }))\n}\n\nfunction hex(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')\n}\n\nfunction activityContext(context: StudioRequestContext): ActivityContext {\n return ActivityContextSchema.make({ actor: context.actor, requestId: context.requestId })\n}\n","import type { Hocuspocus } from '@hocuspocus/server'\nimport { Effect, Result, Schema } from 'effect'\n\nexport class StudioRealtimeGatewayError extends Schema.TaggedError<StudioRealtimeGatewayError>()(\n 'StudioRealtime.GatewayError',\n {\n operation: Schema.NonEmptyString,\n cause: Schema.Defect(),\n },\n) {}\n\nconst isStudioRealtimeGatewayError = Schema.is(StudioRealtimeGatewayError)\n\nexport interface OperationTracker {\n readonly drain: () => Promise<void>\n readonly track: <A>(operation: Promise<A>) => Promise<A>\n}\n\nexport function createOperationTracker(): OperationTracker {\n const active = new Set<Promise<unknown>>()\n const drain = (): Promise<void> => (active.size === 0 ? Promise.resolve() : Promise.allSettled(active).then(drain))\n\n return {\n drain,\n track: (promise) => {\n active.add(promise)\n void promise.finally(() => active.delete(promise)).catch(() => undefined)\n\n return promise\n },\n }\n}\n\nexport function closeHocuspocus<Context>(\n hocuspocus: Hocuspocus<Context>,\n operations: OperationTracker,\n): Effect.Effect<void, StudioRealtimeGatewayError> {\n return Effect.gen(function* () {\n const documents = [...hocuspocus.documents.values()]\n\n const pendingMessages = documents.flatMap((document) =>\n document.getConnections().map((connection) => connection.waitForPendingMessages()),\n )\n\n hocuspocus.closeConnections()\n yield* Effect.promise(() => Promise.allSettled(pendingMessages))\n yield* Effect.promise(operations.drain)\n\n const stores = documents.flatMap((document) => {\n const store = hocuspocus.debouncer.executeNow(`onStoreDocument-${document.name}`)\n\n return store === undefined ? [] : [store]\n })\n\n const storeResults = yield* Effect.promise(() => Promise.allSettled(stores))\n yield* Effect.promise(operations.drain)\n\n const cleanupResults = yield* Effect.promise(() =>\n Promise.allSettled(\n documents.map((document) =>\n document.saveMutex.runExclusive(() => Promise.resolve()).then(() => hocuspocus.unloadDocument(document)),\n ),\n ),\n )\n\n const destroyResult = yield* Effect.result(\n Effect.tryPromise({\n try: () => hocuspocus.hooks('onDestroy', { instance: hocuspocus }),\n catch: (cause) => gatewayError('close', cause),\n }).pipe(Effect.asVoid),\n )\n\n const cleanupFailure = cleanupResults.find((result) => result.status === 'rejected')\n const storeFailure = storeResults.find((result) => result.status === 'rejected')\n\n if (storeFailure?.status === 'rejected') return yield* gatewayError('close', storeFailure.reason)\n\n if (cleanupFailure?.status === 'rejected') {\n return yield* gatewayError('close', cleanupFailure.reason)\n }\n\n if (Result.isFailure(destroyResult)) return yield* destroyResult.failure\n })\n}\n\nexport function gatewayError(operation: string, cause: unknown): StudioRealtimeGatewayError {\n return isStudioRealtimeGatewayError(cause) ? cause : new StudioRealtimeGatewayError({ cause, operation })\n}\n","interface KeyedOperations<E> {\n readonly drain: (name?: string) => Promise<void>\n readonly enqueue: <A>(name: string, poison: boolean, operation: () => Promise<A>) => Promise<A>\n readonly failure: () => E | undefined\n readonly reset: (name: string) => void\n}\n\nexport function createKeyedOperations<E>(options: {\n readonly expectedFailure: (cause: unknown) => boolean\n readonly poison: (cause: unknown) => E\n}): KeyedOperations<E> {\n const pending = new Map<string, Promise<void>>()\n const failures = new Map<string, E>()\n let firstFailure: E | undefined\n\n return {\n drain: (name) => {\n const active =\n name === undefined\n ? [...pending.values()]\n : [pending.get(name)].filter((operation): operation is Promise<void> => operation !== undefined)\n\n return active.length === 0 ? Promise.resolve() : Promise.allSettled(active).then(() => undefined)\n },\n enqueue: (name, poison, operation) => {\n const failed = failures.get(name)\n\n if (failed !== undefined) return Promise.reject(failed)\n\n const result = (pending.get(name) ?? Promise.resolve()).then(operation).catch((cause: unknown) => {\n if (!poison || options.expectedFailure(cause)) throw cause\n const failure = options.poison(cause)\n failures.set(name, failure)\n firstFailure ??= failure\n throw failure\n })\n\n const tail = result.then(\n () => undefined,\n () => undefined,\n )\n\n pending.set(name, tail)\n void tail.finally(() => {\n if (pending.get(name) === tail) pending.delete(name)\n })\n\n return result\n },\n failure: () => firstFailure,\n reset: (name) => failures.delete(name),\n }\n}\n","import type { WorkingDocumentRef } from '@internal/server/WorkingDocuments'\nimport { WorkingDocumentGenerationId } from '@internal/server/WorkingDocuments'\nimport { DocumentId } from '@internal/protocol/Documents'\nimport { Schema } from 'effect'\n\nconst roomNameFilter = Schema.makeFilter<string>(\n (value) => {\n const [documentId, generationId, extra] = value.split(':')\n\n return (\n extra === undefined &&\n documentId !== undefined &&\n generationId !== undefined &&\n Schema.is(DocumentId)(documentId) &&\n Schema.is(WorkingDocumentGenerationId)(generationId)\n )\n },\n { expected: 'a Studio realtime room name' },\n)\n\nexport const StudioRealtimeRoomName = Schema.String.check(roomNameFilter).pipe(Schema.brand('StudioRealtimeRoomName'))\n\nexport type StudioRealtimeRoomName = typeof StudioRealtimeRoomName.Type\n\nexport function studioRealtimeRoomName(ref: WorkingDocumentRef): StudioRealtimeRoomName {\n return StudioRealtimeRoomName.make(`${ref.documentId}:${ref.generationId}`)\n}\n\nexport function workingDocumentRef(name: StudioRealtimeRoomName): WorkingDocumentRef {\n const [documentId, generationId] = name.split(':')\n\n return {\n documentId: DocumentId.make(documentId ?? ''),\n generationId: WorkingDocumentGenerationId.make(generationId ?? ''),\n }\n}\n","import type { StudioActor } from '@internal/protocol/AccessControl'\nimport type { CollaborationServerMessage, CollaborationUser } from '@internal/protocol/Collaboration'\nimport {\n CollaborationClientMessage,\n CollaborationServerMessage as CollaborationServerMessageSchema,\n StateVector,\n} from '@internal/protocol/Collaboration'\nimport { Effect, Encoding, Schema } from 'effect'\nimport { StudioRealtimeRoomName } from './room-name'\n\nconst STUDIO_REALTIME_COLORS = ['#2563eb', '#7c3aed', '#db2777', '#dc2626', '#d97706', '#059669', '#0891b2'] as const\n\nexport const decodeClientMessage = Schema.decodeUnknownEffect(Schema.fromJsonString(CollaborationClientMessage))\n\nexport const decodeRoomName = Schema.decodeUnknownEffect(StudioRealtimeRoomName)\n\nconst encodeServerMessage = Schema.encodeEffect(Schema.fromJsonString(CollaborationServerMessageSchema))\n\nexport function sendRealtimeMessage(\n connection: { readonly sendStateless: (payload: string) => void },\n message: CollaborationServerMessage,\n): Effect.Effect<void> {\n return encodeServerMessage(message).pipe(\n Effect.flatMap((payload) => Effect.sync(() => connection.sendStateless(payload))),\n Effect.orDie,\n )\n}\n\nexport function broadcastRealtimeMessage(\n document: { readonly broadcastStateless: (payload: string) => void },\n message: CollaborationServerMessage,\n): Effect.Effect<void> {\n return encodeServerMessage(message).pipe(\n Effect.flatMap((payload) => Effect.sync(() => document.broadcastStateless(payload))),\n Effect.orDie,\n )\n}\n\nexport function encodeRealtimeStateVector(value: Uint8Array): StateVector {\n return StateVector.make(Encoding.encodeBase64(value))\n}\n\nexport function studioRealtimeUser(actor: StudioActor): CollaborationUser {\n const index = stableStringHash(actor.id) % STUDIO_REALTIME_COLORS.length\n\n return { color: STUDIO_REALTIME_COLORS[index] ?? STUDIO_REALTIME_COLORS[0], id: actor.id, name: actor.name }\n}\n\nfunction stableStringHash(value: string): number {\n let hash = 2_166_136_261\n\n for (const character of value) {\n hash ^= character.codePointAt(0) ?? 0\n hash = Math.imul(hash, 16_777_619)\n }\n\n return hash >>> 0\n}\n","import type { StudioRealtimeRoomName } from './room-name'\nimport { Effect, Fiber, Queue, Stream } from 'effect'\n\nconst DEFAULT_CAPACITY = 1_024\n\nconst DEFAULT_CONCURRENCY = 32\n\nexport const runStudioRealtimeWakeDispatcher = Effect.fn('StudioRealtimeWakeDispatcher.run')(function* (\n wakes: Stream.Stream<StudioRealtimeRoomName>,\n handle: (name: StudioRealtimeRoomName) => Effect.Effect<void>,\n options: { readonly capacity?: number; readonly concurrency?: number } = {},\n) {\n const queue = yield* Queue.dropping<StudioRealtimeRoomName>(options.capacity ?? DEFAULT_CAPACITY)\n const queued = new Set<string>()\n\n const consumer = yield* wakes.pipe(\n Stream.runForEach((name) =>\n Effect.suspend(() => {\n if (queued.has(name)) return Effect.void\n queued.add(name)\n\n return Queue.offer(queue, name).pipe(\n Effect.tap((accepted) =>\n accepted\n ? Effect.void\n : Effect.sync(() => {\n queued.delete(name)\n }),\n ),\n Effect.asVoid,\n )\n }),\n ),\n Effect.forkChild({ startImmediately: true }),\n )\n\n const workers = Stream.fromQueue(queue).pipe(\n Stream.mapEffect(\n (name) =>\n Effect.sync(() => {\n queued.delete(name)\n }).pipe(Effect.andThen(handle(name))),\n { concurrency: options.concurrency ?? DEFAULT_CONCURRENCY },\n ),\n Stream.runDrain,\n )\n\n yield* Effect.raceFirst(Fiber.join(consumer), workers)\n})\n","import type { Document as HocuspocusDocument, Extension, Hocuspocus, LocalTransactionOrigin } from '@hocuspocus/server'\nimport type { StudioActor } from '@internal/protocol/AccessControl'\nimport type { CollaborationServerMessage } from '@internal/protocol/Collaboration'\nimport type { Duration } from 'effect'\nimport { shouldSkipStoreHooks } from '@hocuspocus/server'\nimport { WorkingDocumentSuperseded, WorkingDocuments } from '@internal/server/WorkingDocuments'\nimport { Context, Effect, Fiber, Layer, Option, Schedule, Schema, Stream } from 'effect'\nimport * as Y from 'yjs'\nimport { createKeyedOperations } from './keyed-operations'\nimport {\n broadcastRealtimeMessage as broadcastMessage,\n decodeClientMessage,\n decodeRoomName,\n encodeRealtimeStateVector,\n} from './messages'\nimport { runStudioRealtimeWakeDispatcher } from './wake-dispatcher'\nimport { createOperationTracker } from './gateway-lifecycle'\nimport { StudioRealtimeRoomName, studioRealtimeRoomName, workingDocumentRef } from './room-name'\n\nconst REMOTE_ORIGIN = {\n source: 'local',\n skipStoreHooks: true,\n context: { source: 'studio-realtime-room-host' },\n} satisfies LocalTransactionOrigin\n\nconst DEFAULT_PROBE_INTERVAL = '5 seconds'\n\nconst isRoomReplaced = Schema.is(WorkingDocumentSuperseded)\n\nexport interface StudioRealtimeConnectionContext {\n readonly actor?: StudioActor\n readonly canWrite?: boolean\n readonly documentName?: StudioRealtimeRoomName\n readonly expiresAt?: number\n}\n\nclass StudioRealtimeRoomHostError extends Schema.TaggedError<StudioRealtimeRoomHostError>()(\n 'StudioRealtime.RoomHostError',\n {\n operation: Schema.NonEmptyString,\n cause: Schema.Defect(),\n },\n) {}\n\nexport interface StudioRealtimeRoomHostApi {\n /** Fences a connection against invalidation and synchronizes a reused room before authentication succeeds. */\n readonly accept: (name: StudioRealtimeRoomName) => Effect.Effect<void, StudioRealtimeRoomHostError>\n readonly check: Effect.Effect<void, StudioRealtimeRoomHostError>\n readonly extension: Extension<StudioRealtimeConnectionContext>\n /** Rejects new and in-flight room acceptance before gateway shutdown drains connections. */\n readonly fence: Effect.Effect<void>\n}\n\nexport class StudioRealtimeRoomHost extends Context.Service<StudioRealtimeRoomHost, StudioRealtimeRoomHostApi>()(\n '@internal/platform-node/StudioRealtimeRoomHost',\n) {}\n\nexport interface StudioRealtimeRoomHostOptions {\n readonly probeInterval?: Duration.Input\n}\n\ninterface HostedRoom {\n readonly document: HocuspocusDocument\n readonly name: StudioRealtimeRoomName\n cursor: number\n loading: boolean\n pendingWake: boolean\n wakeActive: boolean\n}\n\nexport function studioRealtimeRoomHostLayer(options: StudioRealtimeRoomHostOptions = {}) {\n return Layer.effect(StudioRealtimeRoomHost, makeStudioRealtimeRoomHost(options))\n}\n\nconst makeStudioRealtimeRoomHost = Effect.fn('StudioRealtimeRoomHost.make')(function* (\n options: StudioRealtimeRoomHostOptions,\n) {\n const documents = yield* WorkingDocuments\n const runPromise = Effect.runPromiseWith(yield* Effect.context<never>())\n const operations = createOperationTracker()\n\n const queue = createKeyedOperations({\n expectedFailure: isRoomReplaced,\n poison: (cause) => roomHostError('persist', cause),\n })\n\n const rooms = new Map<string, HostedRoom>()\n const unloading = new Map<string, HocuspocusDocument>()\n const invalidated = new Set<string>()\n let accepting = true\n let hocuspocus: Hocuspocus<StudioRealtimeConnectionContext> | undefined\n\n const runTracked = <A, E>(effect: Effect.Effect<A, E>): Promise<A> => operations.track(runPromise(effect))\n\n const current = (room: HostedRoom): boolean => rooms.get(room.name) === room && !invalidated.has(room.name)\n\n const discardFailedLoad = (name: string, document: HocuspocusDocument) =>\n Effect.sync(() => {\n const room = rooms.get(name)\n\n if (room?.document !== document) return\n rooms.delete(name)\n queue.reset(name)\n document.destroy()\n })\n\n const applySynchronization = Effect.fn('StudioRealtimeRoomHost.applySynchronization')(function* (room: HostedRoom) {\n if (!current(room) || room.loading) return\n const synchronized = yield* documents.synchronize(workingDocumentRef(room.name), Y.encodeStateVector(room.document))\n\n if (!current(room) || room.loading) return\n yield* Effect.tryPromise({\n try: () =>\n room.document.saveMutex.runExclusive(() => {\n if (current(room) && !room.loading) Y.applyUpdate(room.document, synchronized.update, REMOTE_ORIGIN)\n }),\n catch: (cause) => roomHostError('synchronize', cause),\n })\n\n if (current(room)) room.cursor = synchronized.highWatermark\n })\n\n const synchronizeRoom = (room: HostedRoom) =>\n Effect.tryPromise({\n try: () => queue.enqueue(room.name, false, () => runPromise(applySynchronization(room))),\n catch: (cause) => (isRoomReplaced(cause) ? cause : roomHostError('synchronize', cause)),\n })\n\n const unloadRoom = Effect.fn('StudioRealtimeRoomHost.unload')(function* (name: StudioRealtimeRoomName) {\n invalidated.add(name)\n const instance = hocuspocus\n const loading = instance?.loadingDocuments.get(name)\n\n if (loading !== undefined)\n yield* Effect.promise(() =>\n loading.then(\n () => undefined,\n () => undefined,\n ),\n )\n const room = rooms.get(name)\n\n if (instance === undefined || room === undefined) return\n const pendingMessages = room.document.getConnections().map((connection) => connection.waitForPendingMessages())\n instance.closeConnections(name)\n yield* Effect.promise(() => Promise.allSettled(pendingMessages))\n yield* Effect.promise(() => queue.drain(name))\n const store = instance.debouncer.executeNow(`onStoreDocument-${name}`)\n\n if (store !== undefined) yield* Effect.promise(() => Promise.resolve(store).then(() => undefined))\n yield* Effect.promise(() => queue.drain(name))\n yield* Effect.tryPromise({\n try: () => room.document.saveMutex.runExclusive(() => Promise.resolve()),\n catch: (cause) => roomHostError('unload', cause),\n })\n\n if (rooms.get(name) !== room) return\n yield* Effect.tryPromise({\n try: () => instance.unloadDocument(room.document),\n catch: (cause) => roomHostError('unload', cause),\n })\n\n if (rooms.get(name) === room) rooms.delete(name)\n })\n\n const invalidate = (name: StudioRealtimeRoomName) =>\n unloadRoom(name).pipe(\n Effect.catchCause((cause) => Effect.logError('Could not unload an invalid Studio realtime room.', cause)),\n )\n\n const handleRoomFailure = (instance: Hocuspocus, document: HocuspocusDocument, roomName: string, cause: unknown) => {\n if (!isRoomReplaced(cause)) return failRoom(instance, document, roomName, roomHostError('persist', cause))\n\n return decodeRoomName(roomName).pipe(\n Effect.flatMap(invalidate),\n Effect.catchCause((decodeCause) =>\n Effect.logError('Could not invalidate a stale Studio realtime room.', decodeCause),\n ),\n )\n }\n\n const ensureCurrent = Effect.fn('StudioRealtimeRoomHost.ensureCurrent')(function* (room: HostedRoom) {\n const cursor = yield* documents.probe(workingDocumentRef(room.name))\n\n if (current(room) && cursor > room.cursor) yield* synchronizeRoom(room)\n })\n\n const drainRoomWakes: (room: HostedRoom) => ReturnType<typeof ensureCurrent> = (room) =>\n ensureCurrent(room).pipe(\n Effect.andThen(\n Effect.suspend(() => {\n if (!current(room) || !room.pendingWake) return Effect.void\n room.pendingWake = false\n\n return drainRoomWakes(room)\n }),\n ),\n )\n\n const handleWake = (name: StudioRealtimeRoomName) =>\n Effect.suspend(() => {\n const room = rooms.get(name)\n\n if (room === undefined || invalidated.has(name)) return Effect.void\n\n if (room.loading || room.wakeActive) {\n room.pendingWake = true\n\n return Effect.void\n }\n\n room.wakeActive = true\n room.pendingWake = false\n\n return drainRoomWakes(room).pipe(\n Effect.ensuring(\n Effect.sync(() => {\n room.wakeActive = false\n }),\n ),\n )\n }).pipe(\n Effect.catchIf(isRoomReplaced, () => invalidate(name)),\n Effect.catchCause((cause) => Effect.logError('Could not synchronize a Studio realtime change.', cause)),\n )\n\n const accept: StudioRealtimeRoomHostApi['accept'] = (name) =>\n Effect.gen(function* () {\n if (!accepting || invalidated.has(name)) {\n return yield* roomHostError('accept', new Error('The Studio realtime room is not accepting connections.'))\n }\n\n const room = rooms.get(name)\n\n if (room === undefined || room.loading) {\n yield* documents.probe(workingDocumentRef(name))\n\n return\n }\n\n yield* ensureCurrent(room)\n }).pipe(\n Effect.catchIf(isRoomReplaced, (cause) =>\n invalidate(name).pipe(Effect.andThen(Effect.fail(roomHostError('accept', cause)))),\n ),\n Effect.mapError((cause) =>\n Schema.is(StudioRealtimeRoomHostError)(cause) ? cause : roomHostError('accept', cause),\n ),\n )\n\n const extension: Extension<StudioRealtimeConnectionContext> = {\n extensionName: 'cms-studio-realtime-room-host',\n onConfigure: (payload) => {\n hocuspocus = payload.instance\n\n return Promise.resolve()\n },\n onLoadDocument: (payload) => {\n hocuspocus = payload.instance\n\n return runTracked(\n Effect.gen(function* () {\n const name = yield* decodeRoomName(payload.documentName).pipe(\n Effect.mapError((cause) => roomHostError('load', cause)),\n )\n\n if (!accepting || invalidated.has(name)) {\n return yield* roomHostError('load', new Error('The Studio realtime room was invalidated while loading.'))\n }\n\n const room: HostedRoom = {\n cursor: 0,\n document: payload.document,\n loading: true,\n name,\n pendingWake: false,\n wakeActive: false,\n }\n\n queue.reset(name)\n rooms.set(name, room)\n const synchronized = yield* documents.synchronize(workingDocumentRef(name))\n\n if (!current(room)) {\n return yield* roomHostError('load', new Error('The Studio realtime room was invalidated while loading.'))\n }\n\n room.cursor = synchronized.highWatermark\n\n return synchronized.update\n }).pipe(\n Effect.tapError((cause) =>\n Effect.sync(() => {\n if (isRoomReplaced(cause)) invalidated.add(payload.documentName)\n }).pipe(Effect.andThen(discardFailedLoad(payload.documentName, payload.document))),\n ),\n Effect.mapError((cause) => roomHostError('load', cause)),\n ),\n )\n },\n afterLoadDocument: (payload) =>\n runTracked(\n Effect.gen(function* () {\n const name = yield* decodeRoomName(payload.documentName).pipe(\n Effect.mapError((cause) => roomHostError('load', cause)),\n )\n\n const room = rooms.get(name)\n\n if (room === undefined || room.document !== payload.document || invalidated.has(name)) {\n return yield* roomHostError('load', new Error('The Studio realtime room changed while loading.'))\n }\n\n room.loading = false\n const pendingWake = room.pendingWake\n room.pendingWake = false\n\n if (pendingWake) yield* synchronizeRoom(room)\n yield* ensureCurrent(room)\n }).pipe(\n Effect.tapError((cause) =>\n Effect.sync(() => {\n if (isRoomReplaced(cause)) invalidated.add(payload.documentName)\n }).pipe(Effect.andThen(discardFailedLoad(payload.documentName, payload.document))),\n ),\n Effect.mapError((cause) => roomHostError('load', cause)),\n ),\n ),\n onChange: (payload) => {\n if (shouldSkipStoreHooks(payload.transactionOrigin)) return Promise.resolve()\n const acknowledgedStateVector = Y.encodeStateVector(payload.document)\n\n return runTracked(\n Effect.gen(function* () {\n const name = yield* decodeRoomName(payload.documentName).pipe(\n Effect.mapError((cause) => roomHostError('persist', cause)),\n )\n\n const room = rooms.get(name)\n\n if (room === undefined || !current(room)) return\n yield* Effect.tryPromise({\n try: () =>\n queue.enqueue(name, true, () =>\n runPromise(\n Effect.gen(function* () {\n if (!current(room)) return\n\n const appended = yield* documents.appendUpdate(\n workingDocumentRef(name),\n Uint8Array.from(payload.update),\n )\n\n if (!current(room)) return\n\n if (appended.sequence === room.cursor + 1) room.cursor = appended.sequence\n else yield* applySynchronization(room)\n }),\n ),\n ),\n catch: (cause) => (isRoomReplaced(cause) ? cause : roomHostError('persist', cause)),\n })\n yield* broadcastMessage(payload.document, savedMessage(acknowledgedStateVector))\n }).pipe(\n Effect.catch((cause) => {\n const instance = hocuspocus\n\n return instance === undefined\n ? Effect.logError('Could not close a poisoned Studio realtime room.', cause)\n : handleRoomFailure(instance, payload.document, payload.documentName, cause)\n }),\n ),\n )\n },\n onStoreDocument: (payload) => {\n const acknowledgedStateVector = Y.encodeStateVector(payload.document)\n\n return runTracked(\n Effect.gen(function* () {\n const name = yield* decodeRoomName(payload.documentName).pipe(\n Effect.mapError((cause) => roomHostError('compact', cause)),\n )\n\n if (invalidated.has(name)) return\n yield* Effect.tryPromise({\n try: () => queue.enqueue(name, true, () => runPromise(documents.compact(workingDocumentRef(name)))),\n catch: (cause) => (isRoomReplaced(cause) ? cause : roomHostError('compact', cause)),\n })\n yield* broadcastMessage(payload.document, savedMessage(acknowledgedStateVector))\n }).pipe(\n Effect.catch((cause) => {\n const instance = hocuspocus\n\n return instance === undefined\n ? Effect.logError('Could not close a poisoned Studio realtime room.', cause)\n : handleRoomFailure(instance, payload.document, payload.documentName, cause)\n }),\n ),\n )\n },\n onStateless: (payload) =>\n runTracked(\n Effect.gen(function* () {\n const decoded = yield* Effect.option(decodeClientMessage(payload.payload))\n\n if (Option.isNone(decoded) || decoded.value.type !== 'checkpoint') return\n\n const name = yield* decodeRoomName(payload.documentName).pipe(\n Effect.mapError((cause) => roomHostError('checkpoint', cause)),\n )\n\n const stateVector = Y.encodeStateVector(payload.document)\n yield* Effect.tryPromise({\n try: () => queue.enqueue(name, true, () => runPromise(documents.compact(workingDocumentRef(name)))),\n catch: (cause) => (isRoomReplaced(cause) ? cause : roomHostError('checkpoint', cause)),\n })\n yield* broadcastMessage(payload.document, savedMessage(stateVector))\n }).pipe(\n Effect.catch((cause) => {\n const instance = hocuspocus\n\n return instance === undefined\n ? Effect.logError('Could not close a poisoned Studio realtime room.', cause)\n : handleRoomFailure(instance, payload.document, payload.documentName, cause)\n }),\n ),\n ),\n beforeUnloadDocument: (payload) =>\n runTracked(\n Effect.sync(() => {\n unloading.set(payload.documentName, payload.document)\n }),\n ),\n afterUnloadDocument: (payload) =>\n runTracked(\n Effect.sync(() => {\n const document = unloading.get(payload.documentName)\n unloading.delete(payload.documentName)\n const room = rooms.get(payload.documentName)\n\n if (document !== undefined && room?.document === document) {\n rooms.delete(payload.documentName)\n queue.reset(payload.documentName)\n }\n }),\n ),\n }\n\n const wakeConsumer = yield* runStudioRealtimeWakeDispatcher(\n documents.changes.pipe(\n Stream.filter((event) => event.kind === 'updated'),\n Stream.map((event) => studioRealtimeRoomName(event.ref)),\n ),\n handleWake,\n ).pipe(Effect.forkScoped({ startImmediately: true }))\n\n const invalidationConsumer = yield* documents.changes.pipe(\n Stream.filter((event) => event.kind === 'invalidated'),\n Stream.runForEach((event) => invalidate(studioRealtimeRoomName(event.ref))),\n Effect.forkScoped({ startImmediately: true }),\n )\n\n const probeInterval = options.probeInterval ?? DEFAULT_PROBE_INTERVAL\n\n const probeRooms = Effect.suspend(() =>\n Effect.forEach([...rooms.values()], (room) => handleWake(room.name), { concurrency: 'unbounded' }),\n )\n\n const probeConsumer = yield* probeRooms.pipe(\n Effect.repeat(Schedule.spaced(probeInterval)),\n Effect.delay(probeInterval),\n Effect.asVoid,\n Effect.forkScoped({ startImmediately: true }),\n )\n\n const stopConsumers = Effect.forEach(\n [wakeConsumer, invalidationConsumer, probeConsumer],\n (fiber) => Fiber.interrupt(fiber),\n { discard: true },\n )\n\n const fence = Effect.sync(() => {\n accepting = false\n })\n\n extension.onDestroy = () =>\n runPromise(\n fence.pipe(\n Effect.andThen(stopConsumers),\n Effect.andThen(Effect.promise(operations.drain)),\n Effect.andThen(Effect.promise(() => queue.drain())),\n Effect.andThen(\n Effect.suspend(() => {\n const failure = queue.failure()\n\n return failure === undefined ? Effect.void : Effect.fail(failure)\n }),\n ),\n ),\n )\n\n const check: StudioRealtimeRoomHostApi['check'] = Effect.suspend(() => {\n if (!accepting) {\n return Effect.fail(roomHostError('check', new Error('The Studio realtime room host is shutting down.')))\n }\n\n return documents.check.pipe(Effect.mapError((cause) => roomHostError('check', cause)))\n })\n\n return StudioRealtimeRoomHost.of({ accept, check, extension, fence })\n})\n\nfunction savedMessage(stateVector: Uint8Array): CollaborationServerMessage {\n return { type: 'working-saved', workingStateVector: encodeRealtimeStateVector(stateVector) }\n}\n\nfunction saveErrorMessage(cause: unknown): CollaborationServerMessage {\n const message = cause instanceof Error ? cause.message.trim() : ''\n const error = message || 'The Working Document update could not be saved.'\n\n return { type: 'working-save-error', error }\n}\n\nfunction failRoom(\n hocuspocus: Hocuspocus,\n document: HocuspocusDocument,\n name: string,\n cause: StudioRealtimeRoomHostError,\n): Effect.Effect<void> {\n return broadcastMessage(document, saveErrorMessage(cause)).pipe(\n Effect.andThen(Effect.sync(() => hocuspocus.closeConnections(name))),\n Effect.andThen(\n Effect.tryPromise({\n try: () => hocuspocus.unloadDocument(document),\n catch: (unloadCause) => roomHostError('unload-poisoned-room', unloadCause),\n }),\n ),\n Effect.catchCause((failureCause) =>\n Effect.logError('Failed to close a poisoned Studio realtime room.', failureCause),\n ),\n )\n}\n\nfunction roomHostError(operation: string, cause: unknown): StudioRealtimeRoomHostError {\n return Schema.is(StudioRealtimeRoomHostError)(cause) ? cause : new StudioRealtimeRoomHostError({ cause, operation })\n}\n","import { Effect, Redacted } from 'effect'\n\nconst MINIMUM_SECRET_BYTES = 32\n\ninterface SignedTokenCodec<TokenInvalid> {\n readonly sign: (payload: string) => Effect.Effect<string, TokenInvalid>\n readonly verify: (token: string, maximumLength: number) => Effect.Effect<string, TokenInvalid>\n}\n\n/** Builds a portable HMAC-SHA-256 codec with strict base64url framing and bounded verification. */\nexport function makeSignedTokenCodec<ConfigurationInvalid, TokenInvalid>(\n secret: Redacted.Redacted<string>,\n errors: {\n readonly configuration: () => ConfigurationInvalid\n readonly invalid: () => TokenInvalid\n },\n): Effect.Effect<SignedTokenCodec<TokenInvalid>, ConfigurationInvalid> {\n return Effect.gen(function* () {\n const secretBytes = new TextEncoder().encode(Redacted.value(secret))\n\n if (secretBytes.byteLength < MINIMUM_SECRET_BYTES) return yield* Effect.fail(errors.configuration())\n const key = yield* importSigningKey(secretBytes, errors.configuration)\n\n return {\n sign: (value) => {\n const payload = encodeBytes(new TextEncoder().encode(value))\n\n return sign(key, payload, errors.invalid).pipe(\n Effect.map((signature) => `${payload}.${encodeBytes(signature)}`),\n )\n },\n verify: (token, maximumLength) =>\n Effect.gen(function* () {\n if (token.length > maximumLength) return yield* Effect.fail(errors.invalid())\n const [payload, encodedSignature, extra] = token.split('.')\n\n if (!payload || !encodedSignature || extra !== undefined) return yield* Effect.fail(errors.invalid())\n const signature = yield* decodeBytes(encodedSignature, errors.invalid)\n\n if (!(yield* verifySignature(key, payload, signature))) return yield* Effect.fail(errors.invalid())\n\n return new TextDecoder().decode(yield* decodeBytes(payload, errors.invalid))\n }),\n }\n })\n}\n\nfunction importSigningKey<ConfigurationInvalid>(\n secret: Uint8Array,\n configurationInvalid: () => ConfigurationInvalid,\n): Effect.Effect<CryptoKey, ConfigurationInvalid> {\n return Effect.tryPromise({\n try: () =>\n crypto.subtle.importKey('raw', Uint8Array.from(secret), { hash: 'SHA-256', name: 'HMAC' }, false, [\n 'sign',\n 'verify',\n ]),\n catch: configurationInvalid,\n })\n}\n\nfunction sign<TokenInvalid>(\n key: CryptoKey,\n payload: string,\n tokenInvalid: () => TokenInvalid,\n): Effect.Effect<Uint8Array, TokenInvalid> {\n return Effect.tryPromise({\n try: () => crypto.subtle.sign('HMAC', key, new TextEncoder().encode(payload)),\n catch: tokenInvalid,\n }).pipe(Effect.map((buffer) => new Uint8Array(buffer)))\n}\n\nfunction verifySignature(key: CryptoKey, payload: string, signature: Uint8Array): Effect.Effect<boolean> {\n return Effect.tryPromise({\n try: () => crypto.subtle.verify('HMAC', key, Uint8Array.from(signature), new TextEncoder().encode(payload)),\n catch: () => false,\n }).pipe(Effect.orElseSucceed(() => false))\n}\n\nfunction encodeBytes(value: Uint8Array): string {\n let binary = ''\n\n for (const byte of value) binary += String.fromCharCode(byte)\n\n return btoa(binary).replaceAll('+', '-').replaceAll('/', '_').replace(/=+$/u, '')\n}\n\nfunction decodeBytes<TokenInvalid>(\n value: string,\n tokenInvalid: () => TokenInvalid,\n): Effect.Effect<Uint8Array, TokenInvalid> {\n return Effect.try({\n try: () => {\n const normalized = value.replaceAll('-', '+').replaceAll('_', '/')\n const binary = atob(normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '='))\n const bytes = Uint8Array.from(binary, (character) => character.codePointAt(0) ?? 0)\n\n if (encodeBytes(bytes) !== value) throw new Error('Noncanonical base64url encoding')\n\n return bytes\n },\n catch: tokenInvalid,\n })\n}\n","import type { StudioActor } from '@internal/protocol/AccessControl'\nimport type { WorkingDocumentRef } from '@internal/server/WorkingDocuments'\nimport { StudioActor as StudioActorSchema } from '@internal/protocol/AccessControl'\nimport { Clock, Context, Effect, Layer, Redacted, Schema } from 'effect'\nimport { WorkingDocumentRef as WorkingDocumentRefSchema } from '@internal/server/WorkingDocuments'\nimport { makeSignedTokenCodec } from '@internal/protocol/SignedToken'\nimport { studioRealtimeRoomName } from './room-name'\nimport type { StudioRealtimeRoomName } from './room-name'\n\nconst TICKET_LIFETIME_MILLIS = 60_000\n\nconst MAXIMUM_TICKET_LENGTH = 8_192\n\nconst TicketClaims = Schema.Struct({\n actor: StudioActorSchema,\n canWrite: Schema.Boolean,\n expiresAt: Schema.Int.check(Schema.isGreaterThan(0)),\n ref: WorkingDocumentRefSchema,\n})\n\nexport interface StudioRealtimeTicketClaims extends Schema.Schema.Type<typeof TicketClaims> {}\n\ninterface StudioRealtimeTicketSubject {\n readonly actor: StudioActor\n readonly canWrite: boolean\n readonly ref: WorkingDocumentRef\n}\n\nexport class StudioRealtimeTicketConfigurationInvalid extends Schema.TaggedError<StudioRealtimeTicketConfigurationInvalid>()(\n 'StudioRealtime.TicketConfigurationInvalid',\n { message: Schema.NonEmptyString },\n) {}\n\nexport class StudioRealtimeTicketInvalid extends Schema.TaggedError<StudioRealtimeTicketInvalid>()(\n 'StudioRealtime.TicketInvalid',\n { reason: Schema.Literals(['expired', 'invalid', 'wrong-room']) },\n) {}\n\ninterface StudioRealtimeTicketsApi {\n readonly issue: (subject: StudioRealtimeTicketSubject) => Effect.Effect<string, StudioRealtimeTicketInvalid>\n readonly verify: (\n token: string,\n expectedDocumentName: StudioRealtimeRoomName,\n ) => Effect.Effect<StudioRealtimeTicketClaims, StudioRealtimeTicketInvalid>\n}\n\nexport class StudioRealtimeTickets extends Context.Service<StudioRealtimeTickets, StudioRealtimeTicketsApi>()(\n '@internal/platform-node/StudioRealtimeTickets',\n) {}\n\nconst makeStudioRealtimeTickets = Effect.fn('StudioRealtimeTickets.make')(function* (\n secret: Redacted.Redacted<string>,\n) {\n const tokens = yield* makeSignedTokenCodec(secret, {\n configuration: () =>\n new StudioRealtimeTicketConfigurationInvalid({\n message: 'The collaboration ticket secret must be at least 32 bytes and usable for signing.',\n }),\n invalid: () => new StudioRealtimeTicketInvalid({ reason: 'invalid' }),\n })\n\n const issue = Effect.fn('StudioRealtimeTickets.issue')(function* (subject: StudioRealtimeTicketSubject) {\n const claims = {\n actor: subject.actor,\n canWrite: subject.canWrite,\n expiresAt: (yield* Clock.currentTimeMillis) + TICKET_LIFETIME_MILLIS,\n ref: subject.ref,\n }\n\n const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(TicketClaims))(claims).pipe(\n Effect.mapError(() => new StudioRealtimeTicketInvalid({ reason: 'invalid' })),\n )\n\n return yield* tokens\n .sign(encoded)\n .pipe(Effect.mapError(() => new StudioRealtimeTicketInvalid({ reason: 'invalid' })))\n })\n\n const verify = Effect.fn('StudioRealtimeTickets.verify')(function* (token: string, expectedDocumentName: string) {\n const payload = yield* tokens\n .verify(token, MAXIMUM_TICKET_LENGTH)\n .pipe(Effect.mapError(() => new StudioRealtimeTicketInvalid({ reason: 'invalid' })))\n\n const claims = yield* Schema.decodeEffect(Schema.fromJsonString(TicketClaims))(payload).pipe(\n Effect.mapError(() => new StudioRealtimeTicketInvalid({ reason: 'invalid' })),\n )\n\n if (studioRealtimeRoomName(claims.ref) !== expectedDocumentName)\n return yield* new StudioRealtimeTicketInvalid({ reason: 'wrong-room' })\n\n if (claims.expiresAt <= (yield* Clock.currentTimeMillis))\n return yield* new StudioRealtimeTicketInvalid({ reason: 'expired' })\n\n return claims\n })\n\n return StudioRealtimeTickets.of({ issue, verify })\n})\n\nexport function studioRealtimeTicketsLayer(secret: Redacted.Redacted<string>) {\n return Layer.effect(StudioRealtimeTickets, makeStudioRealtimeTickets(secret))\n}\n","import type { Connection as HocuspocusDocumentConnection, WebSocketLike } from '@hocuspocus/server'\nimport type { WorkingDocumentPreview, WorkingDocumentsApi } from '@internal/server/WorkingDocuments'\nimport type { StudioActor, StudioRequestContext } from '@internal/protocol/AccessControl'\nimport type {\n CollaborationClientMessage,\n CollaborationPreview,\n CollaborationServerMessage,\n} from '@internal/protocol/Collaboration'\nimport { Hocuspocus, IncomingMessage, MessageType } from '@hocuspocus/server'\nimport {\n WorkingDocumentCheckpointed,\n WorkingDocumentConflict,\n WorkingDocumentInvalid,\n WorkingDocumentSuperseded,\n WorkingDocuments,\n} from '@internal/server/WorkingDocuments'\nimport { DocumentGenerationConflict } from '@internal/server/Documents'\nimport { AccessDenied, StudioRequestContext as StudioRequestContextSchema } from '@internal/protocol/AccessControl'\nimport {\n DocumentNotFound,\n DocumentPathConflict,\n DocumentValidationFailed,\n DocumentVersionConflict,\n} from '@internal/protocol/Documents'\nimport { Clock, Context, Effect, Layer, Option, Schema } from 'effect'\nimport * as Y from 'yjs'\nimport { closeHocuspocus, StudioRealtimeGatewayError, createOperationTracker, gatewayError } from './gateway-lifecycle'\nimport { StudioRealtimeRoomHost, type StudioRealtimeConnectionContext } from './room-host'\nimport { type StudioRealtimeTicketClaims, StudioRealtimeTickets } from './tickets'\nimport {\n broadcastRealtimeMessage as broadcastMessage,\n decodeClientMessage,\n decodeRoomName,\n encodeRealtimeStateVector,\n sendRealtimeMessage as sendMessage,\n studioRealtimeUser,\n} from './messages'\nimport { StudioRealtimeRoomName, workingDocumentRef } from './room-name'\n\nconst STORE_DEBOUNCE_MILLIS = 1_000\n\nconst STORE_MAX_DEBOUNCE_MILLIS = 5_000\n\nconst CROSS_ORIGIN_CLOSE_CODE = 1_008\n\nconst CROSS_ORIGIN_CLOSE_REASON = 'Cross-origin collaboration is not allowed.'\n\nconst AUTHORIZATION_CLOSE_CODE = 1_008\n\nconst AUTHORIZATION_CLOSE_REASON = 'Collaboration access control is no longer valid.'\n\nconst TICKET_REFRESH_WINDOW_MILLIS = 15_000\n\nconst isTicketExpiry = Schema.is(Schema.Int.check(Schema.isGreaterThan(0)))\n\nconst isAccessDenied = Schema.is(AccessDenied)\n\nconst isDocumentNotFound = Schema.is(DocumentNotFound)\n\nconst isDocumentPathConflict = Schema.is(DocumentPathConflict)\n\nconst isDocumentValidationFailed = Schema.is(DocumentValidationFailed)\n\nconst isDocumentVersionConflict = Schema.is(DocumentVersionConflict)\n\nconst isDocumentGenerationConflict = Schema.is(DocumentGenerationConflict)\n\nconst isWorkingDocumentConflict = Schema.is(WorkingDocumentConflict)\n\nconst isWorkingDocumentSuperseded = Schema.is(WorkingDocumentSuperseded)\n\nconst isWorkingDocumentCheckpointed = Schema.is(WorkingDocumentCheckpointed)\n\nconst isWorkingDocumentInvalid = Schema.is(WorkingDocumentInvalid)\n\ninterface AuthenticatedRealtimeContext {\n readonly actor: StudioActor\n readonly canWrite: boolean\n readonly documentName: StudioRealtimeRoomName\n readonly expiresAt: number\n}\n\ninterface PublicFailure {\n readonly error: string\n readonly statusCode: number\n}\n\ntype NativeHocuspocusConnection = ReturnType<Hocuspocus<StudioRealtimeConnectionContext>['handleConnection']>\n\ntype StudioRealtimeGatewayConnection = Pick<NativeHocuspocusConnection, 'handleClose' | 'handleMessage'>\n\ntype PreviewRequest = Extract<CollaborationClientMessage, { readonly type: 'preview' }>\n\ntype PublishRequest = Extract<CollaborationClientMessage, { readonly type: 'publish' }>\n\nexport interface StudioRealtimeGatewayApi {\n readonly close: Effect.Effect<void, StudioRealtimeGatewayError>\n readonly handleConnection: (socket: WebSocketLike, request: Request) => StudioRealtimeGatewayConnection | undefined\n}\n\nexport class StudioRealtimeGateway extends Context.Service<StudioRealtimeGateway, StudioRealtimeGatewayApi>()(\n '@internal/platform-node/StudioRealtimeGateway',\n) {}\n\nconst makeStudioRealtimeGateway = Effect.gen(function* () {\n const documents = yield* WorkingDocuments\n const roomHost = yield* StudioRealtimeRoomHost\n const tickets = yield* StudioRealtimeTickets\n const runPromise = Effect.runPromiseWith(yield* Effect.context<never>())\n const operations = createOperationTracker()\n const refreshPending = new WeakSet<HocuspocusDocumentConnection<StudioRealtimeConnectionContext>>()\n\n const tokenRefreshes = new WeakMap<\n HocuspocusDocumentConnection<StudioRealtimeConnectionContext>,\n Promise<AuthenticatedRealtimeContext>\n >()\n\n const activeConnections = new Set<{\n readonly connection: NativeHocuspocusConnection\n readonly socket: WebSocketLike\n }>()\n\n let closed = false\n\n const runTracked = <A, E>(effect: Effect.Effect<A, E>): Promise<A> => operations.track(runPromise(effect))\n\n const hocuspocus = new Hocuspocus<StudioRealtimeConnectionContext>()\n hocuspocus.configure({\n debounce: STORE_DEBOUNCE_MILLIS,\n extensions: [roomHost.extension],\n maxDebounce: STORE_MAX_DEBOUNCE_MILLIS,\n onAuthenticate: (payload) =>\n runTracked(\n Effect.gen(function* () {\n const name = yield* decodeRoomName(payload.documentName)\n const claims = yield* tickets.verify(payload.token, name)\n const context = contextFromClaims(claims, name)\n yield* roomHost.accept(name).pipe(Effect.mapError((cause) => gatewayError('authenticate', cause)))\n payload.connectionConfig.readOnly = !claims.canWrite\n\n return context\n }),\n ),\n beforeHandleMessage: (payload) =>\n runTracked(\n Effect.gen(function* () {\n const tokenRefresh = tokenRefreshes.get(payload.connection)\n\n if (tokenRefresh !== undefined) yield* Effect.promise(() => tokenRefresh)\n const context = authenticatedContext(payload.connection.context, payload.documentName)\n const now = yield* Clock.currentTimeMillis\n\n if (context.expiresAt <= now) {\n payload.connection.readOnly = true\n refreshPending.delete(payload.connection)\n\n return yield* Effect.fail(authorizationCloseError())\n }\n\n if (\n !isAuthenticationMessage(payload.update) &&\n context.expiresAt - now <= TICKET_REFRESH_WINDOW_MILLIS &&\n !refreshPending.has(payload.connection)\n ) {\n refreshPending.add(payload.connection)\n payload.connection.requestToken()\n }\n }),\n ),\n onTokenSync: (payload) => {\n const refresh = runTracked(\n Effect.gen(function* () {\n const current = authenticatedContext(payload.connection.context, payload.documentName)\n const name = yield* decodeRoomName(payload.documentName)\n const claims = yield* tickets.verify(payload.token, name)\n const refreshed = contextFromClaims(claims, name)\n\n if (refreshed.actor.id !== current.actor.id) return yield* Effect.fail(authorizationCloseError())\n payload.connection.readOnly = !refreshed.canWrite\n payload.connection.context = refreshed\n\n return refreshed\n }).pipe(\n Effect.tapError(() =>\n Effect.sync(() => {\n payload.connection.readOnly = true\n }),\n ),\n Effect.mapError(() => authorizationCloseError()),\n Effect.ensuring(\n Effect.sync(() => {\n refreshPending.delete(payload.connection)\n }),\n ),\n ),\n )\n\n tokenRefreshes.set(payload.connection, refresh)\n void refresh\n .finally(() => {\n if (tokenRefreshes.get(payload.connection) === refresh) tokenRefreshes.delete(payload.connection)\n })\n .catch(() => undefined)\n\n return refresh\n },\n beforeHandleAwareness: (payload) =>\n runTracked(\n Effect.sync(() => {\n const context = authenticatedContext(payload.context, payload.documentName)\n const user = studioRealtimeUser(context.actor)\n\n for (const state of payload.states.values()) state.user = user\n }),\n ),\n onStateless: (payload) => {\n return runTracked(\n Effect.gen(function* () {\n const decoded = yield* Effect.option(decodeClientMessage(payload.payload))\n\n if (Option.isNone(decoded)) return\n const request = decoded.value\n const context = authenticatedContext(payload.connection.context, payload.documentName)\n\n if (request.type === 'checkpoint') return\n\n if (!context.canWrite) {\n yield* sendMessage(payload.connection, forbiddenMessage(request))\n\n return\n }\n\n const requestContext = StudioRequestContextSchema.make({\n actor: context.actor,\n requestId: request.requestId,\n })\n\n if (request.type === 'preview') {\n yield* Effect.tryPromise({\n try: () =>\n payload.document.saveMutex.runExclusive(() =>\n runPromise(\n handlePreview(documents, payload.connection, payload.document, context, requestContext, request),\n ),\n ),\n catch: (cause) => gatewayError('preview', cause),\n })\n\n return\n }\n\n yield* Effect.tryPromise({\n try: () =>\n payload.document.saveMutex.runExclusive(() =>\n runPromise(\n handlePublish(documents, payload.connection, payload.document, context, requestContext, request),\n ),\n ),\n catch: (cause) => gatewayError('publish', cause),\n })\n }),\n )\n },\n })\n\n const close = yield* Effect.cached(\n Effect.sync(() => {\n closed = true\n }).pipe(\n Effect.andThen(roomHost.fence),\n Effect.andThen(\n Effect.sync(() => {\n for (const active of activeConnections) {\n active.connection.handleClose({ code: 1_001, reason: 'The Studio realtime gateway is shutting down.' })\n active.socket.close(1_001, 'The Studio realtime gateway is shutting down.')\n }\n\n activeConnections.clear()\n }),\n ),\n Effect.andThen(closeHocuspocus(hocuspocus, operations)),\n ),\n )\n\n const handleConnection: StudioRealtimeGatewayApi['handleConnection'] = (socket, request) => {\n if (closed) {\n socket.close(1_001, 'The Studio realtime gateway is shutting down.')\n\n return undefined\n }\n\n if (!hasSameOrigin(request)) {\n socket.close(CROSS_ORIGIN_CLOSE_CODE, CROSS_ORIGIN_CLOSE_REASON)\n\n return undefined\n }\n\n const connection = hocuspocus.handleConnection(socket, request)\n const active = { connection, socket }\n activeConnections.add(active)\n\n return {\n handleClose: (event) => {\n activeConnections.delete(active)\n connection.handleClose(event)\n },\n handleMessage: (message) => connection.handleMessage(message),\n }\n }\n\n return StudioRealtimeGateway.of({ close, handleConnection })\n})\n\nfunction handlePreview(\n documents: WorkingDocumentsApi,\n connection: Parameters<typeof sendMessage>[0],\n document: Y.Doc,\n context: AuthenticatedRealtimeContext,\n requestContext: StudioRequestContext,\n request: PreviewRequest,\n): Effect.Effect<void> {\n return documents.preview(requestContext, workingDocumentRef(context.documentName), document).pipe(\n Effect.flatMap((preview) =>\n sendMessage(connection, {\n type: 'preview-result',\n requestId: request.requestId,\n outcome: { status: 'success', result: studioRealtimePreview(preview) },\n }),\n ),\n Effect.catch((cause) =>\n sendMessage(connection, {\n type: 'preview-result',\n requestId: request.requestId,\n outcome: { status: 'failure', ...publicFailure(cause) },\n }),\n ),\n )\n}\n\nfunction handlePublish(\n documents: WorkingDocumentsApi,\n connection: Parameters<typeof sendMessage>[0],\n document: Y.Doc & { readonly broadcastStateless: (payload: string) => void },\n context: AuthenticatedRealtimeContext,\n requestContext: StudioRequestContext,\n request: PublishRequest,\n): Effect.Effect<void> {\n return documents.publish(requestContext, workingDocumentRef(context.documentName), document).pipe(\n Effect.flatMap((published) =>\n broadcastMessage(document, {\n type: 'publish-result',\n requestId: request.requestId,\n outcome: {\n status: 'success',\n authoredStateVector: encodeRealtimeStateVector(published.stateVector),\n result: published.result,\n },\n }),\n ),\n Effect.catch((cause) => {\n const failure = publicFailure(isWorkingDocumentCheckpointed(cause) ? cause.cause : cause)\n\n const checkpoint = isWorkingDocumentCheckpointed(cause)\n ? Object.assign(\n { authoredStateVector: encodeRealtimeStateVector(cause.stateVector) },\n cause.result === undefined ? undefined : { result: cause.result },\n )\n : undefined\n\n const message: CollaborationServerMessage = {\n type: 'publish-result',\n requestId: request.requestId,\n outcome: Object.assign({ status: 'failure' as const, ...failure }, checkpoint ? { checkpoint } : undefined),\n }\n\n return checkpoint === undefined ? sendMessage(connection, message) : broadcastMessage(document, message)\n }),\n )\n}\n\nfunction studioRealtimePreview(preview: WorkingDocumentPreview): CollaborationPreview {\n const result = {\n valid: preview.validation.valid,\n issues: preview.validation.issues,\n markdown: preview.markdown,\n preview: { body: preview.body, fallbacks: {} },\n }\n\n return preview.validation.document === undefined\n ? result\n : Object.assign(result, { document: preview.validation.document })\n}\n\nfunction forbiddenMessage(request: PreviewRequest | PublishRequest): CollaborationServerMessage {\n const outcome = {\n status: 'failure' as const,\n error: 'Documents authoring permission is required.',\n statusCode: 403,\n }\n\n return request.type === 'preview'\n ? { type: 'preview-result', requestId: request.requestId, outcome }\n : { type: 'publish-result', requestId: request.requestId, outcome }\n}\n\nfunction authenticatedContext(\n context: StudioRealtimeConnectionContext | undefined,\n documentName: string,\n): AuthenticatedRealtimeContext {\n if (\n context?.actor === undefined ||\n context.canWrite === undefined ||\n context.documentName === undefined ||\n !isTicketExpiry(context.expiresAt) ||\n context.documentName !== documentName\n ) {\n throw new Error('The collaboration connection is not authorized for this working document.')\n }\n\n return {\n actor: context.actor,\n canWrite: context.canWrite,\n documentName: context.documentName,\n expiresAt: context.expiresAt,\n }\n}\n\nfunction contextFromClaims(\n claims: StudioRealtimeTicketClaims,\n name: StudioRealtimeRoomName,\n): AuthenticatedRealtimeContext {\n return {\n actor: claims.actor,\n canWrite: claims.canWrite,\n documentName: name,\n expiresAt: claims.expiresAt,\n }\n}\n\nfunction isAuthenticationMessage(update: Uint8Array): boolean {\n const message = new IncomingMessage(update)\n message.readVarString()\n\n return message.readVarUint() === MessageType.Auth\n}\n\nfunction authorizationCloseError(): Error & { readonly code: number; readonly reason: string } {\n return Object.assign(new Error(AUTHORIZATION_CLOSE_REASON), {\n code: AUTHORIZATION_CLOSE_CODE,\n reason: AUTHORIZATION_CLOSE_REASON,\n })\n}\n\nfunction publicFailure(cause: unknown): PublicFailure {\n if (isAccessDenied(cause)) return { error: 'Documents authoring permission is required.', statusCode: 403 }\n\n if (isDocumentNotFound(cause)) return { error: 'The document was not found.', statusCode: 404 }\n\n if (isDocumentValidationFailed(cause)) return { error: 'The collaborative document is invalid.', statusCode: 422 }\n\n if (\n isDocumentPathConflict(cause) ||\n isDocumentVersionConflict(cause) ||\n isDocumentGenerationConflict(cause) ||\n isWorkingDocumentConflict(cause) ||\n isWorkingDocumentSuperseded(cause)\n ) {\n return { error: 'The collaborative document changed; reopen the document and retry.', statusCode: 409 }\n }\n\n if (isWorkingDocumentInvalid(cause)) return { error: 'The collaborative document is invalid.', statusCode: 400 }\n\n return { error: 'The collaboration request could not be completed.', statusCode: 500 }\n}\n\nfunction hasSameOrigin(request: Request): boolean {\n const origin = request.headers.get('origin')\n\n if (origin === null) return true\n\n try {\n const originUrl = new URL(origin)\n const requestUrl = new URL(request.url)\n\n return originUrl.protocol === httpProtocol(requestUrl.protocol) && originUrl.host === requestUrl.host\n } catch {\n return false\n }\n}\n\nfunction httpProtocol(protocol: string): string {\n if (protocol === 'ws:') return 'http:'\n\n if (protocol === 'wss:') return 'https:'\n\n return protocol\n}\n\n/**\n * Owns process-local Hocuspocus connections and stateless protocol handling.\n *\n * StudioRealtimeRoomHost synchronizes durable Yjs state across replicas. Presence\n * and stateless broadcasts remain process-local until an ephemeral bus is added.\n */\nexport const studioRealtimeGatewayLayer = Layer.effect(\n StudioRealtimeGateway,\n Effect.acquireRelease(makeStudioRealtimeGateway, (gateway) =>\n gateway.close.pipe(\n Effect.tapError((error) => Effect.logError('Studio realtime gateway shutdown failed.', error)),\n Effect.orDie,\n ),\n ),\n)\n","import type { CmsWebSocket, CmsWebSocketBridge } from '../../Installation'\nimport type { StudioRealtimeGatewayApi } from './gateway'\n\nexport function studioRealtimeWebSocketBridge(gateway: StudioRealtimeGatewayApi): CmsWebSocketBridge {\n const connections = new WeakMap<CmsWebSocket, ReturnType<StudioRealtimeGatewayApi['handleConnection']>>()\n\n const release = (socket: CmsWebSocket) => {\n const connection = connections.get(socket)\n connections.delete(socket)\n\n return connection\n }\n\n return {\n close: (socket, details) =>\n release(socket)?.handleClose({ code: details?.code ?? 1_000, reason: details?.reason ?? '' }),\n error: (socket) => release(socket)?.handleClose(),\n message: (socket, message) => connections.get(socket)?.handleMessage(message),\n open: (connection) => {\n const handled = gateway.handleConnection(connection.socket, connection.request)\n\n if (handled !== undefined) connections.set(connection.socket, handled)\n },\n }\n}\n","import { handleFormRequest } from '../http/form-ingress'\nimport { CMS_FORM_SUBMIT_PATH } from '@internal/protocol/HttpPaths'\nimport type { StudioBootstrap } from '@internal/protocol/StudioHttp'\nimport type { CmsWebSocketBridge } from '../../Installation'\nimport type { MediaCleanupError } from '@internal/server/MediaLibrary'\nimport type { MediaCleanupReport } from '@internal/protocol/Media'\nimport type { StudioRequestContext as StudioRequestContextValue } from '@internal/protocol/AccessControl'\nimport {\n CMS_AUTHENTICATION_PATH,\n CMS_LIVENESS_PATH,\n CMS_READINESS_PATH,\n STUDIO_API_PATH,\n} from '@internal/protocol/HttpPaths'\nimport { StudioRequestContext } from '@internal/protocol/AccessControl'\nimport { RequestId } from '@internal/protocol/Identity'\nimport { MediaCleanupReport as MediaCleanupReportSchema } from '@internal/protocol/Media'\nimport { Context, Crypto, Effect, Layer, Scope } from 'effect'\nimport { FindMyWay, HttpEffect, HttpMiddleware, HttpRouter, HttpServerRequest } from 'effect/unstable/http'\nimport { AuthenticationHandler } from '@internal/server/adapter/Authentication'\nimport { Readiness } from '@internal/server/Readiness'\nimport { StudioRealtimeGateway } from '../realtime/gateway'\nimport { StudioRealtimeRoomHost } from '../realtime/room-host'\nimport { studioRealtimeWebSocketBridge } from '../realtime/websocket'\n\nexport interface CmsInstallationHealth {\n readonly live: true\n readonly ready: boolean\n}\n\nexport interface InstallationApi {\n readonly cleanupMedia: Effect.Effect<MediaCleanupReport, MediaCleanupError>\n readonly fetch: (request: Request) => Promise<Response>\n readonly health: Effect.Effect<CmsInstallationHealth>\n readonly webSocket: CmsWebSocketBridge\n}\n\nexport class Installation extends Context.Service<Installation, InstallationApi>()(\n '@internal/platform-node/Installation',\n) {}\n\nexport function installationHttpLayer<R>(\n bootstrap: StudioBootstrap,\n cleanup: (context: StudioRequestContextValue) => Effect.Effect<MediaCleanupReport, MediaCleanupError, R>,\n): Layer.Layer<\n Installation,\n never,\n | AuthenticationHandler\n | Readiness\n | StudioRealtimeGateway\n | StudioRealtimeRoomHost\n | Crypto.Crypto\n | HttpRouter.HttpRouter\n | R\n> {\n return Layer.effect(\n Installation,\n Effect.gen(function* () {\n const cleanupContext = yield* Effect.context<R>()\n const routerConfig = yield* HttpRouter.RouterConfig\n const router = yield* HttpRouter.HttpRouter\n\n const handle = HttpEffect.toWebHandlerWith<never, HttpServerRequest.HttpServerRequest | Scope.Scope>(\n yield* Effect.context<never>(),\n )(\n // oxlint-disable-next-line effecttsgo/any-unknown-in-error-context -- HttpRouter's dynamic route error is typed unknown and the HTTP boundary maps it to a response.\n router.asHttpEffect(),\n HttpMiddleware.logger,\n )\n\n return yield* makeInstallation(\n bootstrap,\n handle,\n (context) => cleanup(context).pipe(Effect.provide(cleanupContext)),\n routerConfig,\n )\n }),\n )\n}\n\nconst makeInstallation = Effect.fn('Installation.make')(function* (\n bootstrap: StudioBootstrap,\n handle: (request: Request) => Promise<Response>,\n cleanup: (context: StudioRequestContextValue) => Effect.Effect<MediaCleanupReport, MediaCleanupError>,\n routerConfig: Partial<FindMyWay.RouterConfig>,\n) {\n const authentication = yield* AuthenticationHandler\n const crypto = yield* Crypto.Crypto\n const realtime = yield* StudioRealtimeGateway\n const roomHost = yield* StudioRealtimeRoomHost\n const readiness = yield* Readiness\n // Match safeguards with the same path normalization and configuration as the application router.\n const protectedRoutes = FindMyWay.make<'form' | 'preview'>(routerConfig)\n protectedRoutes.all(CMS_FORM_SUBMIT_PATH, 'form')\n protectedRoutes.all(`${STUDIO_API_PATH}/preview/*`, 'preview')\n\n const health = readiness.check.pipe(\n Effect.andThen(roomHost.check),\n Effect.match({\n onFailure: (): CmsInstallationHealth => ({ live: true, ready: false }),\n onSuccess: (): CmsInstallationHealth => ({ live: true, ready: true }),\n }),\n )\n\n const runPromise = Effect.runPromiseWith(yield* Effect.context<never>())\n\n const cleanupMedia = bootstrap.media.enabled\n ? Effect.gen(function* () {\n const context = StudioRequestContext.make({\n actor: {\n email: 'maintenance@cms.invalid',\n id: 'cms-maintenance',\n name: 'CMS Maintenance',\n roles: ['administrator'],\n },\n requestId: RequestId.make(yield* crypto.randomUUIDv4.pipe(Effect.orDie)),\n })\n\n return yield* cleanup(context)\n }).pipe(Effect.withSpan('Installation.cleanupMedia'))\n : Effect.succeed(MediaCleanupReportSchema.make({ removedObjectKeys: [] }))\n\n return Installation.of({\n cleanupMedia,\n fetch: (request) => {\n const pathname = new URL(request.url).pathname\n const protection = protectedRoutes.find(request.method, pathname)?.handler\n\n if (protection === 'form') return handleFormRequest(request, handle)\n\n if (pathname === CMS_AUTHENTICATION_PATH || pathname.startsWith(`${CMS_AUTHENTICATION_PATH}/`)) {\n return authentication.handle(request)\n }\n\n if (pathname === CMS_LIVENESS_PATH) return Promise.resolve(healthResponse({ live: true, ready: true }, false))\n\n if (pathname === CMS_READINESS_PATH) return runPromise(health).then((status) => healthResponse(status, true))\n\n if (protection === 'preview') {\n return handle(request).then((response) => {\n response.headers.set('cache-control', 'private, no-store')\n\n return response\n })\n }\n\n return handle(request)\n },\n health,\n webSocket: studioRealtimeWebSocketBridge(realtime),\n })\n})\n\nfunction healthResponse(health: CmsInstallationHealth, readiness: boolean): Response {\n const available = !readiness || health.ready\n\n return Response.json(\n { status: readiness ? (available ? 'ready' : 'unavailable') : 'live' },\n {\n headers: { 'cache-control': 'no-store' },\n status: available ? 200 : 503,\n },\n )\n}\n","import type { CmsInstallation } from '../../Installation'\nimport type { CmsInstallationError } from './error'\nimport type { Installation } from './host'\nimport { Cause, Context, Effect, Exit, Layer, Schedule, Scope } from 'effect'\nimport { Installation as InstallationService } from './host'\n\nexport interface InstallationRuntimeOptions {\n readonly cleanup?: {\n readonly initialDelayMillis: number\n readonly intervalMillis: number\n }\n readonly layer: Layer.Layer<Installation, CmsInstallationError>\n}\n\nexport const startInstallation = Effect.fn('CmsInstallation.start')(function* (options: InstallationRuntimeOptions) {\n const scope = yield* Scope.make()\n yield* Effect.logInfo('Starting CMS installation').pipe(Effect.annotateLogs('event', 'cms.starting'))\n\n const context = yield* Layer.buildWithScope(options.layer, scope).pipe(\n Effect.tapCause((cause) =>\n Effect.logError('CMS installation failed to start').pipe(\n Effect.annotateLogs({ event: 'cms.startup.failed', cause: Cause.pretty(cause) }),\n Effect.andThen(Scope.close(scope, Exit.failCause(cause))),\n ),\n ),\n )\n\n const installation = Context.get(context, InstallationService)\n yield* Effect.logInfo('CMS installation ready').pipe(Effect.annotateLogs('event', 'cms.ready'))\n\n if (options.cleanup !== undefined) {\n const cleanup = installation.cleanupMedia.pipe(\n Effect.matchCauseEffect({\n onFailure: (cause) =>\n Effect.logError('CMS media maintenance failed').pipe(\n Effect.annotateLogs({ event: 'cms.maintenance.failed', cause: Cause.pretty(cause) }),\n ),\n onSuccess: (report) =>\n Effect.logInfo('CMS media maintenance completed').pipe(\n Effect.annotateLogs({\n event: 'cms.maintenance.completed',\n removedObjects: report.removedObjectKeys.length,\n }),\n ),\n }),\n )\n\n yield* cleanup.pipe(\n Effect.repeat(Schedule.spaced(options.cleanup.intervalMillis)),\n Effect.delay(options.cleanup.initialDelayMillis),\n Effect.forkIn(scope),\n )\n }\n\n const close = yield* Effect.cached(\n Effect.logInfo('Stopping CMS installation').pipe(\n Effect.annotateLogs('event', 'cms.stopping'),\n Effect.andThen(Scope.close(scope, Exit.void)),\n Effect.andThen(Effect.logInfo('CMS installation stopped').pipe(Effect.annotateLogs('event', 'cms.stopped'))),\n ),\n )\n\n const runPromise = Effect.runPromiseWith(yield* Effect.context<never>())\n\n return {\n close: () => runPromise(close),\n fetch: installation.fetch,\n webSocket: installation.webSocket,\n } satisfies CmsInstallation\n})\n","import type { Schema } from 'effect'\nimport type { PendingChange } from '../../adapter/ChangeJournal'\nimport { ChangeDraft, ChangeSubject } from '../../adapter/ChangeJournal'\nimport type { ChangeJournalApi } from '../../adapter/ChangeJournal'\nimport { ChangeMismatch, requirePendingChangeFromJournal } from '../../adapter/ChangeJournal'\nimport type { MediaChangeContext, MediaRecord, MediaReplacement } from './media-store'\nimport { ImageMimeType, MediaByteSize, MediaFolder, MediaId, MediaName, MediaObjectKey } from '@internal/protocol/Media'\nimport { Effect, Result, Schema as SchemaRuntime } from 'effect'\n\nconst MediaUploadIntent = SchemaRuntime.Struct({\n kind: SchemaRuntime.tag('upload'),\n byteSize: MediaByteSize,\n folder: MediaFolder,\n mediaId: MediaId,\n mimeType: ImageMimeType,\n name: MediaName,\n objectKey: MediaObjectKey,\n})\n\nconst MediaReplacementIntent = SchemaRuntime.Struct({\n kind: SchemaRuntime.tag('replace'),\n byteSize: MediaByteSize,\n folder: MediaFolder,\n mediaId: MediaId,\n mimeType: ImageMimeType,\n name: MediaName,\n objectKey: MediaObjectKey,\n previousByteSize: MediaByteSize,\n previousName: MediaName,\n stagingObjectKey: MediaObjectKey,\n})\n\nconst MediaRemovalIntent = SchemaRuntime.Struct({\n kind: SchemaRuntime.tag('remove'),\n mediaId: MediaId,\n name: MediaName,\n objectKey: MediaObjectKey,\n})\n\nconst MediaCleanupIntent = SchemaRuntime.Struct({\n kind: SchemaRuntime.tag('cleanup'),\n objectKeys: SchemaRuntime.Array(MediaObjectKey),\n})\n\nexport const MediaChangeIntent = SchemaRuntime.Union([\n MediaUploadIntent,\n MediaReplacementIntent,\n MediaRemovalIntent,\n MediaCleanupIntent,\n]).pipe(SchemaRuntime.toTaggedUnion('kind'))\n\nexport type MediaChangeIntent = typeof MediaChangeIntent.Type\n\nexport function mediaSubject(mediaId: MediaRecord['id']) {\n return ChangeSubject.make(`media:${mediaId}`)\n}\n\nexport function mediaCleanupSubject() {\n return ChangeSubject.make('media:cleanup')\n}\n\nexport function mediaUploadChange(record: MediaRecord, change: MediaChangeContext): ChangeDraft {\n return makeMediaChange({\n action: 'media.uploaded',\n change,\n intent: {\n byteSize: record.byteSize,\n folder: record.folder,\n kind: 'upload',\n mediaId: record.id,\n mimeType: record.mimeType,\n name: record.name,\n objectKey: record.objectKey,\n },\n subject: mediaSubject(record.id),\n target: { kind: 'media', mediaId: record.id },\n })\n}\n\nexport function mediaReplacementChange(\n current: MediaRecord,\n replacement: MediaReplacement,\n change: MediaChangeContext,\n): ChangeDraft {\n return makeMediaChange({\n action: 'media.replaced',\n change,\n intent: {\n byteSize: replacement.byteSize,\n folder: replacement.folder,\n kind: 'replace',\n mediaId: replacement.mediaId,\n mimeType: replacement.mimeType,\n name: replacement.name,\n objectKey: replacement.objectKey,\n previousByteSize: current.byteSize,\n previousName: current.name,\n stagingObjectKey: replacement.stagingObjectKey,\n },\n subject: mediaSubject(replacement.mediaId),\n target: { kind: 'media', mediaId: replacement.mediaId },\n })\n}\n\nexport function mediaRemovalChange(current: MediaRecord, change: MediaChangeContext): ChangeDraft {\n return makeMediaChange({\n action: 'media.removed',\n change,\n intent: { kind: 'remove', mediaId: current.id, name: current.name, objectKey: current.objectKey },\n subject: mediaSubject(current.id),\n target: { kind: 'media', mediaId: current.id },\n })\n}\n\nexport function mediaCleanupChange(\n objectKeys: ReadonlyArray<MediaRecord['objectKey']>,\n change: MediaChangeContext,\n): ChangeDraft {\n return makeMediaChange({\n action: 'media.cleaned',\n change,\n intent: { kind: 'cleanup', objectKeys: [...objectKeys] },\n subject: mediaCleanupSubject(),\n target: { kind: 'media-library' },\n })\n}\n\nexport const decodeMediaChangeIntent = Effect.fn('MediaChange.decodeIntent')(function* (change: PendingChange) {\n return yield* SchemaRuntime.decodeUnknownEffect(MediaChangeIntent)(change.intent).pipe(\n Effect.mapError(() => new ChangeMismatch({ changeId: change.id })),\n )\n})\n\nexport function mediaChangeDetails(intent: MediaChangeIntent): Schema.JsonObject {\n switch (intent.kind) {\n case 'upload':\n return {\n byteSize: intent.byteSize,\n folder: intent.folder,\n mimeType: intent.mimeType,\n name: intent.name,\n objectKey: intent.objectKey,\n }\n case 'replace':\n return {\n byteSize: intent.byteSize,\n name: intent.name,\n objectKey: intent.objectKey,\n previousByteSize: intent.previousByteSize,\n previousName: intent.previousName,\n }\n case 'remove':\n return { name: intent.name, objectKey: intent.objectKey }\n case 'cleanup':\n return { removedObjectKeys: intent.objectKeys }\n }\n}\n\nexport const requireMediaChange = Effect.fn('MediaChange.require')(function* (\n journal: ChangeJournalApi,\n subject: ChangeSubject,\n action: PendingChange['action'],\n) {\n const change = yield* requirePendingChangeFromJournal(journal, subject, action)\n const intent = yield* decodeMediaChangeIntent(change)\n\n return { change, intent }\n})\n\nexport const resolveMediaChange = Effect.fn('MediaChange.resolve')(function* (\n journal: ChangeJournalApi,\n change: PendingChange,\n) {\n const intent = yield* decodeMediaChangeIntent(change)\n\n return yield* journal.resolve(change, { details: mediaChangeDetails(intent), kind: 'applied' })\n})\n\nfunction makeMediaChange(input: {\n readonly action: ChangeDraft['action']\n readonly change: MediaChangeContext\n readonly intent: MediaChangeIntent\n readonly subject: ChangeSubject\n readonly target: NonNullable<ChangeDraft['target']>\n}): ChangeDraft {\n return ChangeDraft.make({\n action: input.action,\n context: input.change.context,\n id: input.change.id,\n intent: Result.getOrThrow(SchemaRuntime.encodeResult(MediaChangeIntent)(input.intent)),\n scope: 'media',\n subject: input.subject,\n target: input.target,\n })\n}\n","import type { MediaConflict, MediaId, MediaObjectKey } from '@internal/protocol/Media'\nimport type { MediaStorageError } from './media-failures'\nimport { MediaPersistenceError } from './media-failures'\nimport type { Duration } from 'effect'\nimport type { ChangeJournalApi } from '../../adapter/ChangeJournal'\nimport { findPendingChange } from '../../adapter/ChangeJournal'\nimport { mediaCleanupSubject, requireMediaChange, resolveMediaChange } from './media-change'\nimport type { MediaObjectStoreApi } from './media-object-store'\nimport type { MediaReplacement, MediaStoreApi } from './media-store'\nimport { DateTime, Effect, Option, Stream } from 'effect'\n\nexport interface MediaRecoveryCursor {\n readonly media?: MediaId\n readonly replacements?: MediaId\n}\n\nconst recoveryBatchSize = 100\n\nexport function recoverPendingMedia(\n store: MediaStoreApi,\n objectStore: MediaObjectStoreApi,\n operations: ChangeJournalApi,\n recoveryAge: Duration.Input,\n cursor: MediaRecoveryCursor = {},\n): Effect.Effect<MediaRecoveryCursor, MediaPersistenceError | MediaStorageError> {\n return Effect.gen(function* () {\n const before = DateTime.subtractDuration(yield* DateTime.now, recoveryAge)\n const pending = yield* store.pending({ after: cursor.media, before, limit: recoveryBatchSize })\n\n for (const record of pending) {\n if (record.status === 'deleting') {\n yield* objectStore.remove(record.objectKey)\n yield* store.finishDelete(record.id)\n continue\n }\n\n const stored = yield* objectStore.stat(record.objectKey)\n\n if (\n Option.isSome(stored) &&\n stored.value.byteSize === record.byteSize &&\n (stored.value.mimeType === undefined || stored.value.mimeType === record.mimeType)\n ) {\n yield* store.activate(record.id)\n } else {\n if (Option.isSome(stored)) {\n yield* objectStore.remove(record.objectKey)\n const remaining = yield* objectStore.stat(record.objectKey)\n\n if (Option.isSome(remaining)) continue\n }\n\n yield* store.abandonUpload(record.id)\n }\n }\n\n const replacements = yield* store.pendingReplacements({\n after: cursor.replacements,\n before,\n limit: recoveryBatchSize,\n })\n\n yield* Effect.forEach(\n replacements,\n (replacement) =>\n recoverReplacement(store, objectStore, replacement).pipe(Effect.catchTag('Media.Conflict', () => Effect.void)),\n { discard: true },\n )\n yield* recoverPendingMediaCleanup(operations, objectStore, before)\n\n return {\n media: pending.length < recoveryBatchSize ? undefined : pending.at(-1)?.id,\n replacements: replacements.length < recoveryBatchSize ? undefined : replacements.at(-1)?.mediaId,\n }\n })\n}\n\nexport function recoverPendingMediaCleanup(\n operations: ChangeJournalApi,\n objectStore: MediaObjectStoreApi,\n before?: DateTime.Utc,\n): Effect.Effect<void, MediaPersistenceError | MediaStorageError> {\n return Effect.gen(function* () {\n const pending = yield* findPendingChange(operations, mediaCleanupSubject()).pipe(\n mapChangeFailure('MediaReconciliation.cleanup.find'),\n )\n\n if (!pending) return\n\n if (before !== undefined && DateTime.toEpochMillis(pending.updatedAt) > DateTime.toEpochMillis(before)) {\n return\n }\n\n const { change, intent } = yield* requireMediaChange(operations, mediaCleanupSubject(), 'media.cleaned').pipe(\n mapChangeFailure('MediaReconciliation.cleanup.require'),\n )\n\n if (intent.kind !== 'cleanup') {\n return yield* new MediaPersistenceError({\n cause: new Error('The media cleanup journal contains a mismatched action.'),\n operation: 'MediaReconciliation.cleanup.require',\n })\n }\n\n yield* Effect.forEach(intent.objectKeys, (objectKey) => objectStore.remove(objectKey), {\n discard: true,\n })\n const remaining = yield* Effect.forEach(intent.objectKeys, (objectKey) => objectStore.stat(objectKey))\n\n if (remaining.some(Option.isSome)) return\n yield* resolveMediaChange(operations, change).pipe(mapChangeFailure('MediaReconciliation.cleanup.resolve'))\n })\n}\n\nfunction recoverReplacement(\n store: MediaStoreApi,\n objectStore: MediaObjectStoreApi,\n replacement: MediaReplacement,\n): Effect.Effect<void, MediaConflict | MediaPersistenceError | MediaStorageError> {\n return Effect.gen(function* () {\n const staged = yield* objectStore.stat(replacement.stagingObjectKey)\n\n if (Option.isNone(staged)) {\n yield* recoverReplacementWithoutStaging(store, objectStore, replacement)\n\n return\n }\n\n if (staged.value.byteSize !== replacement.byteSize || staged.value.mimeType !== replacement.mimeType) {\n yield* objectStore.remove(replacement.stagingObjectKey)\n const remaining = yield* objectStore.stat(replacement.stagingObjectKey)\n\n if (Option.isNone(remaining)) {\n yield* recoverReplacementWithoutStaging(store, objectStore, replacement)\n }\n\n return\n }\n\n const stagedReplacement = replacement.staged ? replacement : yield* store.markReplaceStaged(replacement)\n const promoted = yield* promoteOrReconcileMissingStaging(store, objectStore, stagedReplacement)\n\n if (!promoted) return\n yield* store.finishReplace(stagedReplacement)\n yield* removeStagingBestEffort(objectStore, stagedReplacement.stagingObjectKey)\n }).pipe(Effect.withSpan('MediaReconciliation.replacement'))\n}\n\nconst recoverReplacementWithoutStaging = Effect.fn('MediaReconciliation.replacement.withoutStaging')(function* (\n store: MediaStoreApi,\n objectStore: MediaObjectStoreApi,\n replacement: MediaReplacement,\n) {\n const state = yield* store.inspectReplacement(replacement)\n\n if (state !== 'pending') return\n\n if (!replacement.staged) {\n // CopyObject preserves its source. Before staging is confirmed, a missing source\n // proves promotion never entered the durable replacement lifecycle.\n yield* store.cancelReplace(replacement)\n\n return\n }\n\n const current = yield* store.find(replacement.mediaId)\n\n if (Option.isNone(current)) return\n const destination = yield* objectStore.stat(replacement.objectKey)\n\n if (Option.isNone(destination)) {\n yield* store.cancelReplace(replacement)\n\n return\n }\n\n const destinationMatchesReplacement =\n destination.value.byteSize === replacement.byteSize &&\n (destination.value.mimeType === undefined || destination.value.mimeType === replacement.mimeType)\n\n const destinationMatchesCurrent =\n destination.value.byteSize === current.value.byteSize &&\n (destination.value.mimeType === undefined || destination.value.mimeType === current.value.mimeType)\n\n if (destinationMatchesReplacement && !destinationMatchesCurrent) {\n yield* store.finishReplace(replacement)\n } else if (destinationMatchesCurrent && !destinationMatchesReplacement) {\n yield* store.cancelReplace(replacement)\n }\n})\n\nconst promoteOrReconcileMissingStaging = Effect.fn('MediaReconciliation.replacement.promote')(function* (\n store: MediaStoreApi,\n objectStore: MediaObjectStoreApi,\n replacement: MediaReplacement,\n) {\n return yield* objectStore\n .promote({\n byteSize: replacement.byteSize,\n destinationObjectKey: replacement.objectKey,\n mimeType: replacement.mimeType,\n sourceObjectKey: replacement.stagingObjectKey,\n })\n .pipe(\n Effect.as(true),\n Effect.catch((promotionError) =>\n objectStore.stat(replacement.stagingObjectKey).pipe(\n Effect.flatMap((staging) => {\n if (Option.isSome(staging)) return Effect.fail(promotionError)\n\n return store\n .inspectReplacement(replacement)\n .pipe(\n Effect.flatMap((state) => (state === 'pending' ? Effect.fail(promotionError) : Effect.succeed(false))),\n )\n }),\n ),\n ),\n )\n})\n\nexport function removeStagingBestEffort(objectStore: MediaObjectStoreApi, objectKey: MediaObjectKey) {\n return objectStore.remove(objectKey).pipe(\n Effect.matchEffect({\n onFailure: () => Effect.logWarning('Media replacement staging cleanup failed; orphan cleanup can retry it.'),\n onSuccess: () => Effect.void,\n }),\n )\n}\n\nexport function findOrphanedMediaObjects(\n store: MediaStoreApi,\n objectStore: MediaObjectStoreApi,\n): Effect.Effect<ReadonlyArray<MediaObjectKey>, MediaPersistenceError | MediaStorageError> {\n return Effect.gen(function* () {\n const objects = yield* objectStore.list.pipe(Stream.runCollect)\n const known = yield* store.knownObjectKeys\n\n return objects\n .map((object) => object.objectKey)\n .filter((objectKey) => !known.has(objectKey))\n .sort((left, right) => left.localeCompare(right))\n })\n}\n\nfunction mapChangeFailure(operation: string) {\n return <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, MediaPersistenceError, R> =>\n effect.pipe(Effect.mapError((cause) => new MediaPersistenceError({ cause, operation })))\n}\n","import type { ActivityContext } from '@internal/protocol/Activity'\nimport type { ActivityId } from '@internal/protocol/Activity'\nimport type {\n ImageMimeType,\n MediaByteSize,\n MediaFolder,\n MediaId,\n MediaConflict,\n MediaNotFound,\n MediaName,\n MediaObjectKey,\n MediaReferenced,\n MediaStatus,\n} from '@internal/protocol/Media'\nimport type { MediaPersistenceError } from './media-failures'\nimport { Context, DateTime, Effect, Option } from 'effect'\n\nexport interface MediaRecord {\n readonly byteSize: MediaByteSize\n readonly createdAt: DateTime.Utc\n readonly folder: MediaFolder\n readonly id: MediaId\n readonly mimeType: ImageMimeType\n readonly name: MediaName\n readonly objectKey: MediaObjectKey\n readonly status: MediaStatus\n readonly updatedAt: DateTime.Utc\n}\n\nexport interface MediaReplacement {\n readonly byteSize: MediaByteSize\n readonly createdAt: DateTime.Utc\n readonly folder: MediaFolder\n readonly mediaId: MediaId\n readonly mimeType: ImageMimeType\n readonly name: MediaName\n readonly objectKey: MediaObjectKey\n readonly staged: boolean\n readonly stagingObjectKey: MediaObjectKey\n readonly updatedAt: DateTime.Utc\n}\n\nexport type MediaReplacementState = 'absent' | 'completed' | 'pending'\n\nexport interface MediaStoreCursor {\n readonly createdAt: DateTime.Utc\n readonly id: MediaId\n}\n\nexport interface MediaStoreSearch {\n readonly cursor?: MediaStoreCursor\n readonly folder?: MediaFolder\n readonly limit: number\n readonly search?: string\n}\n\nexport interface MediaStorePage {\n readonly folders: ReadonlyArray<MediaFolder>\n readonly next?: MediaStoreCursor\n readonly records: ReadonlyArray<MediaRecord>\n readonly total: number\n}\n\nexport interface MediaPendingQuery {\n /** Scan eligible work in stable media-ID order, even when earlier entries remain pending. */\n readonly after?: MediaId\n readonly before: DateTime.Utc\n readonly limit: number\n}\n\nexport interface MediaChangeContext {\n readonly context: ActivityContext\n readonly id: ActivityId\n}\n\nexport interface MediaStoreApi {\n readonly abandonUpload: (id: MediaId) => Effect.Effect<void, MediaPersistenceError>\n readonly activate: (id: MediaId) => Effect.Effect<MediaRecord, MediaPersistenceError>\n readonly beginDelete: (\n id: MediaId,\n change: MediaChangeContext,\n ) => Effect.Effect<MediaRecord, MediaConflict | MediaNotFound | MediaPersistenceError | MediaReferenced>\n readonly beginReplace: (\n replacement: MediaReplacement,\n change: MediaChangeContext,\n ) => Effect.Effect<MediaReplacement, MediaConflict | MediaPersistenceError>\n readonly cancelReplace: (replacement: MediaReplacement) => Effect.Effect<void, MediaConflict | MediaPersistenceError>\n readonly find: (id: MediaId) => Effect.Effect<Option.Option<MediaRecord>, MediaPersistenceError>\n readonly finishDelete: (id: MediaId) => Effect.Effect<void, MediaPersistenceError>\n readonly inventory: Effect.Effect<ReadonlyArray<MediaRecord>, MediaPersistenceError>\n readonly inspectReplacement: (\n replacement: MediaReplacement,\n ) => Effect.Effect<MediaReplacementState, MediaConflict | MediaPersistenceError>\n readonly knownObjectKeys: Effect.Effect<ReadonlySet<MediaObjectKey>, MediaPersistenceError>\n readonly markReplaceStaged: (\n replacement: MediaReplacement,\n ) => Effect.Effect<MediaReplacement, MediaConflict | MediaPersistenceError>\n readonly pending: (query: MediaPendingQuery) => Effect.Effect<ReadonlyArray<MediaRecord>, MediaPersistenceError>\n readonly pendingReplacements: (\n query: MediaPendingQuery,\n ) => Effect.Effect<ReadonlyArray<MediaReplacement>, MediaPersistenceError>\n readonly reserve: (\n record: MediaRecord,\n change: MediaChangeContext,\n ) => Effect.Effect<MediaRecord, MediaPersistenceError>\n readonly finishReplace: (\n replacement: MediaReplacement,\n ) => Effect.Effect<MediaRecord, MediaConflict | MediaPersistenceError>\n readonly search: (query: MediaStoreSearch) => Effect.Effect<MediaStorePage, MediaPersistenceError>\n}\n\nexport class MediaStore extends Context.Service<MediaStore, MediaStoreApi>()('@internal/server/MediaStore') {}\n","import type { ImageMimeType, MediaInvalid, MediaUpload } from '@internal/protocol/Media'\nimport { MediaInvalid as MediaInvalidError } from '@internal/protocol/Media'\nimport { Effect, Pull, Ref, Result, Scope, Stream } from 'effect'\n\ninterface PreparedMediaUpload {\n readonly body: Stream.Stream<Uint8Array, MediaInvalid>\n readonly mimeType: ImageMimeType\n}\n\n/** Peeks only the image signature, then validates byte count while storage pulls the body. */\nexport function prepareMediaUpload(\n body: Stream.Stream<Uint8Array, MediaInvalid>,\n metadata: MediaUpload,\n): Effect.Effect<PreparedMediaUpload, MediaInvalid, Scope.Scope> {\n return Effect.gen(function* () {\n const pull = yield* Stream.toPull(body)\n const initialChunks: Array<Uint8Array> = []\n let initialByteSize = 0\n let complete = false\n\n while (initialByteSize < 32 && !complete) {\n const chunks = yield* pull.pipe(Pull.catchDone(() => Effect.void))\n\n if (!chunks) {\n complete = true\n continue\n }\n\n for (const chunk of chunks) {\n initialChunks.push(chunk)\n initialByteSize += chunk.byteLength\n }\n }\n\n if (initialByteSize === 0) {\n return yield* new MediaInvalidError({ message: 'The upload is not a supported image.' })\n }\n\n const mimeType = yield* Effect.fromResult(validateImage(imageHeader(initialChunks), metadata.declaredMimeType))\n const byteSize = yield* Ref.make(0)\n\n const streamed = Stream.concat(\n Stream.fromIterable(initialChunks),\n complete ? Stream.empty : Stream.fromPull(Effect.succeed(pull)),\n ).pipe(\n Stream.mapEffect((chunk) =>\n Effect.gen(function* () {\n const next = yield* Ref.updateAndGet(byteSize, (current) => current + chunk.byteLength)\n\n if (next > metadata.declaredByteSize) {\n return yield* new MediaInvalidError({ message: 'Media body contains more bytes than declared.' })\n }\n\n return chunk\n }),\n ),\n Stream.concat(\n Stream.fromEffect(\n Ref.get(byteSize).pipe(\n Effect.flatMap((actual) =>\n actual === metadata.declaredByteSize\n ? Effect.void\n : Effect.fail(new MediaInvalidError({ message: 'Media body size does not match its declaration.' })),\n ),\n ),\n ).pipe(Stream.drain),\n ),\n )\n\n return { body: streamed, mimeType }\n })\n}\n\nfunction imageHeader(chunks: ReadonlyArray<Uint8Array>): Uint8Array {\n const header = new Uint8Array(\n Math.min(\n 32,\n chunks.reduce((total, chunk) => total + chunk.byteLength, 0),\n ),\n )\n\n let offset = 0\n\n for (const chunk of chunks) {\n const length = Math.min(chunk.byteLength, header.byteLength - offset)\n header.set(chunk.subarray(0, length), offset)\n offset += length\n\n if (offset === header.byteLength) break\n }\n\n return header\n}\n\nexport function imageExtension(mimeType: ImageMimeType): string {\n return mimeType === 'image/jpeg' ? 'jpg' : mimeType.slice('image/'.length)\n}\n\nfunction validateImage(body: Uint8Array, declaredMimeType?: string): Result.Result<ImageMimeType, MediaInvalid> {\n const detected = detectImageMimeType(body)\n\n if (!detected) return Result.fail(new MediaInvalidError({ message: 'The upload is not a supported image.' }))\n const declared = declaredMimeType?.split(';', 1)[0]?.trim().toLocaleLowerCase()\n\n if (declared && declared !== 'application/octet-stream' && declared !== detected) {\n return Result.fail(new MediaInvalidError({ message: 'The upload does not match its declared image type.' }))\n }\n\n return Result.succeed(detected)\n}\n\nfunction detectImageMimeType(bytes: Uint8Array): ImageMimeType | undefined {\n return startsWith(bytes, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])\n ? 'image/png'\n : startsWith(bytes, [0xff, 0xd8, 0xff])\n ? 'image/jpeg'\n : ascii(bytes, 0, 6) === 'GIF87a' || ascii(bytes, 0, 6) === 'GIF89a'\n ? 'image/gif'\n : ascii(bytes, 0, 4) === 'RIFF' && ascii(bytes, 8, 12) === 'WEBP'\n ? 'image/webp'\n : ascii(bytes, 4, 8) === 'ftyp' && /avi[fs]/u.test(ascii(bytes, 8, Math.min(bytes.length, 32)))\n ? 'image/avif'\n : undefined\n}\n\nfunction startsWith(bytes: Uint8Array, prefix: ReadonlyArray<number>): boolean {\n return prefix.every((value, index) => bytes[index] === value)\n}\n\nfunction ascii(bytes: Uint8Array, start: number, end: number): string {\n return String.fromCharCode(...bytes.subarray(start, end))\n}\n","import type { AccessDenied, StudioRequestContext } from '@internal/protocol/AccessControl'\nimport type { ActivityUnavailable } from '../../Activity'\nimport type {\n MediaAsset,\n MediaByteSize,\n MediaCleanupReport,\n MediaConflict,\n MediaId,\n MediaIntegrityReport,\n MediaInvalid,\n MediaNotFound,\n MediaPage,\n MediaQuery,\n MediaReferenced,\n MediaTooLarge,\n MediaUpload,\n} from '@internal/protocol/Media'\nimport type { DocumentProjectionError } from '../../Documents'\nimport type { MediaRecord, MediaReplacement, MediaStoreApi } from './media-store'\nimport { ActivityUnavailable as ActivityUnavailableError } from '../../Activity'\nimport { ActivityId } from '@internal/protocol/Activity'\nimport {\n MediaAsset as MediaAssetSchema,\n MediaCleanupReport as MediaCleanupReportSchema,\n MediaCursor as MediaCursorSchema,\n MediaFolder,\n MediaId as MediaIdSchema,\n MediaIntegrityReport as MediaIntegrityReportSchema,\n MediaInvalid as MediaInvalidError,\n MediaNotFound as MediaNotFoundError,\n MediaObjectKey,\n MediaPage as MediaPageSchema,\n MediaTooLarge as MediaTooLargeError,\n} from '@internal/protocol/Media'\nimport { Context, Crypto, DateTime, Effect, Layer, Option, Ref, Schedule, Schema, Semaphore, Stream } from 'effect'\nimport type { Duration } from 'effect'\nimport { ChangeJournal, requireUnresolvedChange } from '../../adapter/ChangeJournal'\nimport { AccessControl } from '../../AccessControl'\nimport { DocumentMaintenance } from '../documents/documents'\nimport { cursorCodec } from '../cursor'\nimport { MediaObjectStore, mediaObjectPrefix, type MediaObjectStoreApi } from './media-object-store'\nimport {\n findOrphanedMediaObjects,\n recoverPendingMedia,\n recoverPendingMediaCleanup,\n removeStagingBestEffort,\n} from './media-reconciliation'\nimport { MediaStore } from './media-store'\nimport { imageExtension, prepareMediaUpload } from './media-upload'\nimport { mediaCleanupChange, resolveMediaChange } from './media-change'\nimport { MediaPersistenceError, MediaStorageError } from './media-failures'\n\nexport { MediaPersistenceError, MediaStorageError } from './media-failures'\n\nexport interface MediaLibraryOptions {\n readonly maxUploadBytes: MediaByteSize\n readonly pendingRecoveryAge?: Duration.Input\n readonly pendingRecoveryInterval?: Duration.Input | false\n readonly publicBaseUrl: string\n}\n\nexport interface MediaUploadInput {\n readonly body: Stream.Stream<Uint8Array, MediaInvalid>\n readonly metadata: MediaUpload\n}\n\nexport type MediaReadError = AccessDenied | MediaNotFound | MediaPersistenceError\n\nexport type MediaUploadError =\n | AccessDenied\n | ActivityUnavailable\n | MediaInvalid\n | MediaPersistenceError\n | MediaStorageError\n | MediaTooLarge\n\nexport type MediaRemoveError =\n | AccessDenied\n | ActivityUnavailable\n | MediaConflict\n | MediaNotFound\n | MediaPersistenceError\n | MediaReferenced\n | MediaStorageError\n\nexport type MediaIntegrityError = AccessDenied | DocumentProjectionError | MediaPersistenceError | MediaStorageError\n\nexport type MediaCleanupError = ActivityUnavailable | AccessDenied | MediaPersistenceError | MediaStorageError\n\nexport type MediaReplaceError = MediaUploadError | MediaConflict | MediaNotFound\n\nexport interface MediaLibraryApi {\n readonly cleanup: (context: StudioRequestContext) => Effect.Effect<MediaCleanupReport, MediaCleanupError>\n readonly get: (context: StudioRequestContext, id: MediaId) => Effect.Effect<MediaAsset, MediaReadError>\n readonly integrity: (context: StudioRequestContext) => Effect.Effect<MediaIntegrityReport, MediaIntegrityError>\n readonly remove: (context: StudioRequestContext, id: MediaId) => Effect.Effect<void, MediaRemoveError>\n readonly replace: (\n context: StudioRequestContext,\n id: MediaId,\n input: MediaUploadInput,\n ) => Effect.Effect<MediaAsset, MediaReplaceError>\n readonly search: (\n context: StudioRequestContext,\n query: MediaQuery,\n ) => Effect.Effect<MediaPage, AccessDenied | MediaInvalid | MediaPersistenceError>\n readonly upload: (\n context: StudioRequestContext,\n input: MediaUploadInput,\n ) => Effect.Effect<MediaAsset, MediaUploadError>\n}\n\nexport class MediaLibrary extends Context.Service<MediaLibrary, MediaLibraryApi>()('@internal/server/MediaLibrary') {}\n\nconst MEDIA_OPERATION_RECOVERY_INTERVAL = '30 seconds'\n\nconst CursorPayload = Schema.Struct({\n createdAt: Schema.DateTimeUtcFromString,\n id: MediaIdSchema,\n})\n\nconst CursorJson = Schema.fromJsonString(CursorPayload)\n\nconst cursors = cursorCodec(CursorJson, (value) => MediaCursorSchema.make(value), invalidCursor)\n\nexport function mediaLibraryLayer(\n options: MediaLibraryOptions,\n): Layer.Layer<\n MediaLibrary,\n MediaPersistenceError | MediaStorageError,\n ChangeJournal | AccessControl | DocumentMaintenance | Crypto.Crypto | MediaObjectStore | MediaStore\n> {\n return Layer.effect(MediaLibrary, makeMediaLibrary(options))\n}\n\nconst makeMediaLibrary = Effect.fn('MediaLibrary.make')(function* (options: MediaLibraryOptions) {\n const accessControl = yield* AccessControl\n const operations = yield* ChangeJournal\n const documentOperations = yield* DocumentMaintenance\n const crypto = yield* Crypto.Crypto\n const objectStore = yield* MediaObjectStore\n const store = yield* MediaStore\n const baseUrl = options.publicBaseUrl.replace(/\\/+$/gu, '')\n const pendingRecoveryAge = options.pendingRecoveryAge ?? '5 minutes'\n\n const recoveryCursor = yield* Ref.make(yield* recoverPendingMedia(store, objectStore, operations, pendingRecoveryAge))\n const mutations = yield* Semaphore.make(1)\n const recoveryInterval = options.pendingRecoveryInterval ?? MEDIA_OPERATION_RECOVERY_INTERVAL\n\n if (recoveryInterval !== false) {\n const recover = mutations\n .withPermits(1)(\n Effect.gen(function* () {\n const cursor = yield* Ref.get(recoveryCursor)\n const next = yield* recoverPendingMedia(store, objectStore, operations, pendingRecoveryAge, cursor)\n yield* Ref.set(recoveryCursor, next)\n }),\n )\n .pipe(\n Effect.catch((error) =>\n Effect.logWarning('Pending media change recovery sweep failed.', { errorTag: error._tag }),\n ),\n )\n\n yield* recover.pipe(\n Effect.repeat(Schedule.spaced(recoveryInterval)),\n Effect.delay(recoveryInterval),\n Effect.forkScoped({ startImmediately: true }),\n )\n }\n\n const toAsset = (record: MediaRecord): MediaAsset =>\n MediaAssetSchema.make({\n byteSize: record.byteSize,\n createdAt: record.createdAt,\n folder: record.folder,\n id: record.id,\n kind: 'image',\n mimeType: record.mimeType,\n name: record.name,\n objectKey: record.objectKey,\n status: record.status,\n updatedAt: record.updatedAt,\n url: `${baseUrl}/${record.objectKey.split('/').map(encodeURIComponent).join('/')}`,\n })\n\n const get = Effect.fn('MediaLibrary.get')(function* (context: StudioRequestContext, id: MediaId) {\n yield* accessControl.require(context, {\n action: 'media.read',\n resource: { kind: 'media-asset', mediaId: id },\n })\n const record = yield* store.find(id)\n\n return Option.isSome(record) ? toAsset(record.value) : yield* new MediaNotFoundError({ mediaId: id })\n })\n\n const search = Effect.fn('MediaLibrary.search')(function* (context: StudioRequestContext, query: MediaQuery) {\n yield* accessControl.require(context, {\n action: 'media.search',\n resource: query.folder ? { folder: query.folder, kind: 'media-folder' } : { kind: 'media-catalog' },\n })\n const cursor = query.cursor ? yield* Effect.fromResult(cursors.decode(query.cursor)) : undefined\n\n const page = yield* store.search({\n cursor,\n folder: query.folder,\n limit: query.limit ?? 30,\n search: query.search?.trim() || undefined,\n })\n\n const mediaPage = {\n assets: page.records.map(toAsset),\n folders: page.folders,\n total: page.total,\n }\n\n return page.next\n ? MediaPageSchema.make({ ...mediaPage, nextCursor: cursors.encode(page.next) })\n : MediaPageSchema.make(mediaPage)\n })\n\n const prepareUpload = Effect.fn('MediaLibrary.prepareUpload')(function* (input: MediaUploadInput) {\n if (input.metadata.declaredByteSize > options.maxUploadBytes) {\n return yield* new MediaTooLargeError({\n declaredByteSize: input.metadata.declaredByteSize,\n maxUploadBytes: options.maxUploadBytes,\n })\n }\n\n return yield* prepareMediaUpload(input.body, input.metadata)\n })\n\n const upload = Effect.fn('MediaLibrary.upload')(function* (context: StudioRequestContext, input: MediaUploadInput) {\n const folder = input.metadata.folder ?? MediaFolder.make('')\n yield* accessControl.require(context, {\n action: 'media.upload',\n resource: folder ? { folder, kind: 'media-folder' } : { kind: 'media-catalog' },\n })\n\n return yield* Effect.scoped(\n prepareUpload(input).pipe(\n Effect.flatMap((prepared) =>\n mutations.withPermits(1)(\n Effect.gen(function* () {\n const id = MediaIdSchema.make(yield* crypto.randomUUIDv4.pipe(Effect.orDie))\n const operationId = ActivityId.make(yield* crypto.randomUUIDv4.pipe(Effect.orDie))\n const objectKey = MediaObjectKey.make(`${mediaObjectPrefix}${id}.${imageExtension(prepared.mimeType)}`)\n const now = yield* DateTime.now\n\n const reserved = yield* store.reserve(\n {\n byteSize: input.metadata.declaredByteSize,\n createdAt: now,\n folder,\n id,\n mimeType: prepared.mimeType,\n name: input.metadata.name,\n objectKey,\n status: 'uploading',\n updatedAt: now,\n },\n { context, id: operationId },\n )\n\n yield* objectStore.put({\n body: prepared.body,\n byteSize: reserved.byteSize,\n mimeType: reserved.mimeType,\n objectKey: reserved.objectKey,\n })\n const asset = toAsset(yield* store.activate(reserved.id))\n\n return asset\n }),\n ),\n ),\n ),\n )\n })\n\n const replace = Effect.fn('MediaLibrary.replace')(function* (\n context: StudioRequestContext,\n id: MediaId,\n input: MediaUploadInput,\n ) {\n yield* accessControl.require(context, {\n action: 'media.replace',\n resource: { kind: 'media-asset', mediaId: id },\n })\n\n return yield* Effect.scoped(\n prepareUpload(input).pipe(\n Effect.flatMap((prepared) =>\n mutations.withPermits(1)(\n Effect.gen(function* () {\n const current = yield* store.find(id)\n\n if (Option.isNone(current)) return yield* new MediaNotFoundError({ mediaId: id })\n\n if (prepared.mimeType !== current.value.mimeType) {\n return yield* new MediaInvalidError({\n message: 'A media replacement must keep the original image type so existing references remain valid.',\n })\n }\n\n const operationId = ActivityId.make(yield* crypto.randomUUIDv4.pipe(Effect.orDie))\n const timestamp = yield* DateTime.now\n\n const replacement: MediaReplacement = {\n byteSize: input.metadata.declaredByteSize,\n createdAt: timestamp,\n folder: input.metadata.folder ?? current.value.folder,\n mediaId: current.value.id,\n mimeType: prepared.mimeType,\n name: input.metadata.name,\n objectKey: current.value.objectKey,\n staged: false,\n stagingObjectKey: MediaObjectKey.make(\n `${mediaObjectPrefix}replacements/${operationId}.${imageExtension(prepared.mimeType)}`,\n ),\n updatedAt: timestamp,\n }\n\n const pendingReplacement = yield* store.beginReplace(replacement, {\n context,\n id: operationId,\n })\n\n yield* objectStore\n .put({\n body: prepared.body,\n byteSize: pendingReplacement.byteSize,\n mimeType: pendingReplacement.mimeType,\n objectKey: pendingReplacement.stagingObjectKey,\n })\n .pipe(\n Effect.matchEffect({\n onFailure: (error) =>\n cleanupBeforePromotion(store, objectStore, pendingReplacement).pipe(\n Effect.andThen(Effect.fail(error)),\n ),\n onSuccess: () => Effect.void,\n }),\n )\n const stagedReplacement = yield* store.markReplaceStaged(pendingReplacement)\n yield* objectStore.promote({\n byteSize: stagedReplacement.byteSize,\n destinationObjectKey: stagedReplacement.objectKey,\n mimeType: stagedReplacement.mimeType,\n sourceObjectKey: stagedReplacement.stagingObjectKey,\n })\n const replaced = toAsset(yield* store.finishReplace(stagedReplacement))\n yield* removeStagingBestEffort(objectStore, stagedReplacement.stagingObjectKey)\n\n return replaced\n }),\n ),\n ),\n ),\n )\n })\n\n const remove = Effect.fn('MediaLibrary.remove')(function* (context: StudioRequestContext, id: MediaId) {\n yield* accessControl.require(context, {\n action: 'media.remove',\n resource: { kind: 'media-asset', mediaId: id },\n })\n yield* mutations.withPermits(1)(\n Effect.gen(function* () {\n const operationId = ActivityId.make(yield* crypto.randomUUIDv4.pipe(Effect.orDie))\n const deleting = yield* store.beginDelete(id, { context, id: operationId })\n yield* objectStore.remove(deleting.objectKey)\n yield* store.finishDelete(id)\n }),\n )\n })\n\n const cleanup = Effect.fn('MediaLibrary.cleanup')(function* (context: StudioRequestContext) {\n yield* accessControl.require(context, {\n action: 'media.cleanup',\n resource: { kind: 'media-catalog' },\n })\n\n return yield* mutations.withPermits(1)(\n Effect.gen(function* () {\n yield* recoverPendingMediaCleanup(operations, objectStore)\n const objectKeys = yield* findOrphanedMediaObjects(store, objectStore)\n\n if (objectKeys.length > 0) {\n const id = ActivityId.make(yield* crypto.randomUUIDv4.pipe(Effect.orDie))\n\n const change = yield* operations\n .begin(mediaCleanupChange(objectKeys, { context, id }))\n .pipe(\n Effect.flatMap(requireUnresolvedChange),\n Effect.mapError(activityFailure('MediaLibrary.cleanup.begin')),\n )\n\n yield* Effect.forEach(objectKeys, (objectKey) => objectStore.remove(objectKey), { discard: true })\n const remaining = yield* Effect.forEach(objectKeys, (objectKey) => objectStore.stat(objectKey))\n\n if (remaining.some(Option.isSome)) {\n return yield* new ActivityUnavailableError({\n cause: new Error('Media cleanup could not prove every orphaned object was removed.'),\n operation: 'MediaLibrary.cleanup.resolve',\n })\n }\n\n yield* resolveMediaChange(operations, change).pipe(\n Effect.mapError(activityFailure('MediaLibrary.cleanup.resolve')),\n )\n }\n\n return MediaCleanupReportSchema.make({ removedObjectKeys: objectKeys })\n }),\n )\n })\n\n const integrity = Effect.fn('MediaLibrary.integrity')(function* (context: StudioRequestContext) {\n yield* accessControl.require(context, {\n action: 'media.integrity',\n resource: { kind: 'media-catalog' },\n })\n const records = yield* store.inventory\n const knownObjectKeys = yield* store.knownObjectKeys\n const objects = yield* objectStore.list.pipe(Stream.runCollect)\n const references = yield* documentOperations.mediaReferences()\n const recordsByKey = new Map(records.map((record) => [record.objectKey, record]))\n const objectsByKey = new Map(objects.map((object) => [object.objectKey, object]))\n const referencedKeys = new Set(references.map((reference) => reference.objectKey))\n\n return MediaIntegrityReportSchema.make({\n missingAssets: references.filter((reference) => !recordsByKey.has(reference.objectKey)),\n missingObjects: records.filter((record) => !objectsByKey.has(record.objectKey)).map(toAsset),\n mismatchedObjects: records.flatMap((record) => {\n const object = objectsByKey.get(record.objectKey)\n\n if (\n object === undefined ||\n (object.byteSize === record.byteSize &&\n (object.mimeType === undefined || object.mimeType === record.mimeType))\n ) {\n return []\n }\n\n return [\n Object.assign(\n { asset: toAsset(record), storedByteSize: object.byteSize },\n object.mimeType === undefined ? undefined : { storedMimeType: object.mimeType },\n ),\n ]\n }),\n orphanedObjectKeys: objects\n .map((object) => object.objectKey)\n .filter((objectKey) => !knownObjectKeys.has(objectKey)),\n unusedAssets: records.filter((record) => !referencedKeys.has(record.objectKey)).map(toAsset),\n })\n })\n\n return MediaLibrary.of({ cleanup, get, integrity, remove, replace, search, upload })\n})\n\nfunction invalidCursor(): MediaInvalidError {\n return new MediaInvalidError({ message: 'The media cursor is invalid or expired.' })\n}\n\nfunction cleanupBeforePromotion(store: MediaStoreApi, objectStore: MediaObjectStoreApi, replacement: MediaReplacement) {\n return cleanupBeforePromotionBestEffort(\n Effect.gen(function* () {\n yield* objectStore.remove(replacement.stagingObjectKey).pipe(Effect.ignore)\n const staged = yield* objectStore.stat(replacement.stagingObjectKey)\n\n if (Option.isNone(staged)) yield* store.cancelReplace(replacement)\n }),\n )\n}\n\nfunction cleanupBeforePromotionBestEffort<E>(cleanup: Effect.Effect<void, E>) {\n return cleanup.pipe(\n Effect.matchEffect({\n onFailure: () => Effect.logWarning('Media replacement cleanup failed before promotion; recovery can retry it.'),\n onSuccess: () => Effect.void,\n }),\n )\n}\n\nfunction activityFailure(operation: string) {\n return (cause: unknown) => new ActivityUnavailableError({ cause, operation })\n}\n","import type { DocumentEngineOptions } from '@internal/document/DocumentEngine'\nimport type { PreviewOrigin } from '@internal/protocol/Preview'\nimport type { StudioBootstrap } from '@internal/protocol/StudioHttp'\nimport type { WorkingDocumentsOptions } from './WorkingDocuments'\nimport { Layer } from 'effect'\nimport { activityLayer } from './Activity'\nimport { defaultAccessControlLayer } from './AccessControl'\nimport { documentsLayer } from './Documents'\nimport { mediaLibraryLayer } from './MediaLibrary'\nimport { readinessLayer } from './Readiness'\nimport * as Seo from './Seo'\nimport { workingDocumentsLayer } from './WorkingDocuments'\n\nexport interface ProductModulesOptions {\n readonly baseUrl: PreviewOrigin\n readonly bootstrap: StudioBootstrap\n readonly documentEngine: DocumentEngineOptions\n readonly workingDocuments?: WorkingDocumentsOptions\n}\n\nexport function productModulesLayer(options: ProductModulesOptions) {\n const accessControl = defaultAccessControlLayer\n\n const seo = Seo.seoLayer(options.bootstrap.seo ?? Seo.makeDefaultSeoOptions(options.baseUrl)).pipe(\n Layer.provide(accessControl),\n )\n\n const authoredDocuments = documentsLayer(options.bootstrap.documents, {\n ...options.documentEngine,\n components: options.documentEngine.components ?? [],\n mediaBaseUrl: options.documentEngine.mediaBaseUrl ?? 'https://media.invalid',\n }).pipe(Layer.provide(accessControl))\n\n const documentAccess = Layer.merge(authoredDocuments, accessControl)\n const activity = activityLayer.pipe(Layer.provide(accessControl))\n const workingDocuments = workingDocumentsLayer(options.workingDocuments).pipe(Layer.provide(documentAccess))\n const seoDelivery = Seo.seoDeliveryLayer.pipe(Layer.provide(Layer.merge(documentAccess, seo)))\n\n return Layer.mergeAll(activity, documentAccess, workingDocuments, seo, seoDelivery, readinessLayer)\n}\n\nexport function productModulesWithMediaLayer(options: ProductModulesOptions & { readonly mediaPublicBaseUrl: string }) {\n const products = productModulesLayer({\n ...options,\n documentEngine: {\n ...options.documentEngine,\n mediaBaseUrl: options.documentEngine.mediaBaseUrl ?? options.mediaPublicBaseUrl,\n },\n })\n\n const media = mediaLibraryLayer({\n maxUploadBytes: options.bootstrap.media.maxUploadBytes,\n publicBaseUrl: options.mediaPublicBaseUrl,\n }).pipe(Layer.provide(products))\n\n return Layer.merge(products, media)\n}\n","import type {\n InitializationAlreadyCompleted,\n InitializationInput,\n InitializationProofInvalid,\n InitializationState,\n} from '@internal/protocol/Initialization'\nimport type { User } from '@internal/protocol/Users'\nimport { ActivityContext } from '@internal/protocol/Activity'\nimport { ActivityId } from '@internal/protocol/Activity'\nimport { RequestId } from '@internal/protocol/Identity'\nimport {\n InitializationAlreadyCompleted as InitializationAlreadyCompletedError,\n InitializationProofInvalid as InitializationProofInvalidError,\n InitializationState as InitializationStateSchema,\n} from '@internal/protocol/Initialization'\nimport { Context, Crypto, Effect, Layer, Predicate, Redacted, Result, Schema } from 'effect'\nimport { ChangeBegin, ChangeJournal } from '../../adapter/ChangeJournal'\nimport type { ChangeJournalApi } from '../../adapter/ChangeJournal'\nimport {\n initialAdministratorDraft,\n reconcileInitialAdministrator,\n resolveInitialAdministrator,\n} from './initial-administrator-change'\nimport { InitialIdentity, InitialIdentityFailure, InitialIdentityRecovery } from './identity'\nimport type { InitialIdentityRecoveryApi } from './identity'\nimport { InitializationClaim, InitializationStore, type InitializationStoreApi } from './initialization-store'\nimport { InitializationUnavailable } from './initialization-failures'\n\nexport { InitializationUnavailable } from './initialization-failures'\n\nconst InitializationUnavailableError = InitializationUnavailable\n\nexport interface InitializationOptions {\n readonly initializationToken: Redacted.Redacted<string>\n}\n\nexport type InitializationError =\n | InitializationAlreadyCompleted\n | InitializationProofInvalid\n | InitializationUnavailable\n\nexport interface InitializationApi {\n readonly claim: (input: InitializationInput) => Effect.Effect<User, InitializationError>\n readonly status: Effect.Effect<InitializationState, InitializationUnavailable>\n}\n\nexport class Initialization extends Context.Service<Initialization, InitializationApi>()(\n '@internal/server/Initialization',\n) {}\n\nexport function initializationLayer(\n options: InitializationOptions,\n): Layer.Layer<\n Initialization,\n never,\n ChangeJournal | Crypto.Crypto | InitialIdentity | InitialIdentityRecovery | InitializationStore\n> {\n return Layer.effect(\n Initialization,\n Effect.gen(function* () {\n const journal = yield* ChangeJournal\n const crypto = yield* Crypto.Crypto\n const identity = yield* InitialIdentity\n const recovery = yield* InitialIdentityRecovery\n const store = yield* InitializationStore\n const encoder = new TextEncoder()\n\n const expectedProof = yield* crypto\n .digest('SHA-256', encoder.encode(Redacted.value(options.initializationToken)))\n .pipe(Effect.orDie)\n\n yield* store.runExclusive(reconcileStored(store, journal, recovery)).pipe(\n Effect.catch((error) =>\n Effect.logWarning('Initialization recovery could not complete during startup.', {\n errorTag: error._tag,\n }),\n ),\n )\n\n const status = store.runExclusive(\n Effect.gen(function* () {\n const state = yield* reconcileStored(store, journal, recovery)\n\n return InitializationStateSchema.make({ needsAdministrator: state.state !== 'ready' })\n }),\n )\n\n const claim = Effect.fn('Initialization.claim')((input: InitializationInput) =>\n store.runExclusive(\n Effect.gen(function* () {\n const current = yield* reconcileStored(store, journal, recovery)\n\n if (current.state === 'ready') return yield* new InitializationAlreadyCompletedError()\n\n if (current.state === 'claiming') {\n return yield* initializationUnavailable(\n 'Initialization.claim',\n new Error('The initial administrator claim remains ambiguous.'),\n )\n }\n\n const suppliedProof = yield* crypto\n .digest('SHA-256', encoder.encode(input.initializationToken))\n .pipe(Effect.orDie)\n\n if (!constantTimeEqual(suppliedProof, expectedProof)) return yield* new InitializationProofInvalidError()\n\n const prepared = identity.prepare({ email: input.email, name: input.name, password: input.password })\n const changeId = ActivityId.make(yield* crypto.randomUUIDv4.pipe(Effect.orDie))\n\n const context = ActivityContext.make({\n actor: {\n email: input.email,\n id: 'cms-initialization',\n name: input.name,\n roles: ['administrator'],\n },\n reason: 'CMS initialization',\n requestId: RequestId.make(yield* crypto.randomUUIDv4.pipe(Effect.orDie)),\n })\n\n const durableClaim = InitializationClaim.make({ changeId, context, intent: prepared.intent })\n\n if (!(yield* store.claim(durableClaim))) return yield* new InitializationAlreadyCompletedError()\n\n const begin = yield* journal\n .begin(initialAdministratorDraft({ context, id: changeId }, prepared.intent))\n .pipe(Effect.mapError((cause) => unavailable('Initialization.begin', cause)))\n\n if (!ChangeBegin.$is('Unresolved')(begin)) {\n return yield* initializationUnavailable(\n 'Initialization.begin',\n new Error('A fresh initialization change was already resolved.'),\n )\n }\n\n const applied = yield* prepared.apply.pipe(Effect.result)\n\n if (Result.isFailure(applied)) {\n if (InitialIdentityFailure.$is('Rejected')(applied.failure)) {\n yield* journal\n .resolve(begin.change, { kind: 'cancelled' })\n .pipe(Effect.mapError((cause) => unavailable('Initialization.cancel', cause)))\n yield* store.reset(changeId)\n\n return yield* unavailable('Initialization.createAdministrator', applied.failure.error)\n }\n\n const resolution = yield* reconcileInitialAdministrator(journal, begin.change, recovery.observe).pipe(\n Effect.catch((cause) =>\n Effect.logWarning('Initial administrator recovery remains pending.', {\n changeId,\n errorTag: Schema.is(InitializationUnavailableError)(cause) ? cause._tag : 'Change.RecoveryFailed',\n }).pipe(Effect.as({ kind: 'ambiguous' } as const)),\n ),\n )\n\n if (resolution.kind === 'applied') {\n yield* completeBestEffort(store, changeId)\n\n return resolution.user\n }\n\n if (resolution.kind === 'cancelled') yield* store.reset(changeId)\n\n return yield* unavailable('Initialization.createAdministrator', applied.failure.error)\n }\n\n const finalized = yield* resolveInitialAdministrator(journal, begin.change, applied.success).pipe(\n Effect.result,\n )\n\n if (Result.isFailure(finalized)) {\n yield* Effect.logWarning('Initial administrator Activity finalization is pending recovery.', {\n changeId,\n })\n\n return applied.success\n }\n\n yield* completeBestEffort(store, changeId)\n\n return applied.success\n }),\n ),\n )\n\n return Initialization.of({ claim, status })\n }),\n )\n}\n\nconst reconcileStored = Effect.fn('Initialization.reconcileStored')(function* (\n store: InitializationStoreApi,\n journal: ChangeJournalApi,\n recovery: InitialIdentityRecoveryApi,\n) {\n const state = yield* store.read\n\n if (state.state !== 'claiming') return state\n\n const draft = initialAdministratorDraft(\n { context: state.claim.context, id: state.claim.changeId },\n state.claim.intent,\n )\n\n const begin = yield* journal\n .begin(draft)\n .pipe(Effect.mapError((cause) => unavailable('Initialization.recover', cause)))\n\n if (Predicate.isTagged('Recorded')(begin)) {\n yield* store.complete(state.claim.changeId)\n\n return yield* store.read\n }\n\n if (Predicate.isTagged('Cancelled')(begin)) {\n yield* store.reset(state.claim.changeId)\n\n return yield* store.read\n }\n\n if (Predicate.isTagged('Unresolved')(begin)) {\n const resolution = yield* reconcileInitialAdministrator(journal, begin.change, recovery.observe).pipe(\n Effect.mapError((cause) => unavailable('Initialization.recover', cause)),\n )\n\n if (resolution.kind === 'applied') yield* store.complete(state.claim.changeId)\n\n if (resolution.kind === 'cancelled') yield* store.reset(state.claim.changeId)\n\n return yield* store.read\n }\n\n return yield* store.read\n})\n\nfunction completeBestEffort(store: InitializationStoreApi, changeId: ActivityId) {\n return store\n .complete(changeId)\n .pipe(\n Effect.catch((error) =>\n Effect.logWarning('Initialization completion remains recoverable.', { changeId, errorTag: error._tag }),\n ),\n )\n}\n\nfunction unavailable(operation: string, cause: unknown): InitializationUnavailable {\n return Schema.is(InitializationUnavailableError)(cause)\n ? cause\n : new InitializationUnavailableError({ cause, operation })\n}\n\nfunction initializationUnavailable(operation: string, cause: unknown) {\n return Effect.fail(unavailable(operation, cause))\n}\n\nfunction constantTimeEqual(left: Uint8Array, right: Uint8Array): boolean {\n let difference = left.byteLength ^ right.byteLength\n const length = Math.max(left.byteLength, right.byteLength)\n\n for (let index = 0; index < length; index += 1) {\n difference |= (left[index] ?? 0) ^ (right[index] ?? 0)\n }\n\n return difference === 0\n}\n","import type { StudioRequestContext } from '@internal/protocol/AccessControl'\nimport { AuthenticationRequired, Role, StudioEntryDenied } from '@internal/protocol/AccessControl'\nimport { RequestId } from '@internal/protocol/Identity'\nimport { CurrentStudioRequest, StudioAuthentication, studioInternalError } from '@internal/protocol/StudioHttp'\nimport { Context, Crypto, Effect, Layer, Schema } from 'effect'\nimport { HttpServerRequest } from 'effect/unstable/http'\nimport { Authentication } from '@internal/server/adapter/Authentication'\nimport type { UserAdministrationRequest } from '@internal/server/UserAdministration'\n\nexport class CurrentUserAdministrationRequest extends Context.Service<\n CurrentUserAdministrationRequest,\n UserAdministrationRequest\n>()('@internal/platform-node/CurrentUserAdministrationRequest') {}\n\nexport const studioAuthenticationLayer: Layer.Layer<StudioAuthentication, never, Authentication | Crypto.Crypto> =\n Layer.effect(\n StudioAuthentication,\n Effect.gen(function* () {\n const authentication = yield* Authentication\n const crypto = yield* Crypto.Crypto\n\n return (httpEffect) =>\n Effect.gen(function* () {\n const request = yield* HttpServerRequest.HttpServerRequest\n\n const authenticated = yield* authentication.authenticate(\n new globalThis.Headers(Object.entries(request.headers)),\n )\n\n if (!authenticated) return yield* new AuthenticationRequired()\n\n if (!authenticated.actor.roles.some(Schema.is(Role))) return yield* new StudioEntryDenied()\n\n const activity: StudioRequestContext = {\n actor: authenticated.actor,\n requestId: RequestId.make(yield* crypto.randomUUIDv4.pipe(Effect.mapError(() => studioInternalError()))),\n }\n\n return yield* httpEffect.pipe(\n Effect.provideService(CurrentStudioRequest, activity),\n Effect.provideService(CurrentUserAdministrationRequest, {\n activity,\n authority: authenticated.authority,\n }),\n )\n })\n }),\n )\n","import type { UserAdministrationUnavailable } from './identity'\nimport type { Effect } from 'effect'\nimport { Context } from 'effect'\nimport type { UserCommandFenceKey } from '../../identity/user-identity'\n\nexport interface UserCommandFenceApi {\n readonly run: <A, E, R>(\n key: UserCommandFenceKey,\n use: (lease: UserCommandFenceLease) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | UserAdministrationUnavailable, R>\n}\n\nexport interface UserCommandFenceLease {\n readonly include: <A, E, R>(\n key: UserCommandFenceKey,\n effect: Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | UserAdministrationUnavailable, R>\n}\n\nexport class UserCommandFence extends Context.Service<UserCommandFence, UserCommandFenceApi>()(\n '@internal/server/users/UserCommandFence',\n) {}\n","import type { Role } from '@internal/protocol/AccessControl'\nimport type {\n CreateUserInput,\n User,\n UserAdministrationDenied,\n UserAlreadyExists,\n UserNotFound,\n UserPage,\n UserQuery,\n UserSelfRemovalDenied,\n UserSelfRoleChangeDenied,\n} from '@internal/protocol/Users'\nimport type { UserAdministrationUnavailable } from './identity'\nimport { ActivityId } from '@internal/protocol/Activity'\nimport {\n UserAlreadyExists as UserAlreadyExistsError,\n UserNotFound as UserNotFoundError,\n UserSelfRemovalDenied as UserSelfRemovalDeniedError,\n UserSelfRoleChangeDenied as UserSelfRoleChangeDeniedError,\n} from '@internal/protocol/Users'\nimport { UserAdministrationUnavailable as UserAdministrationUnavailableError } from './identity'\nimport { Context, Crypto, DateTime, Effect, Layer, Result, Schedule, Schema } from 'effect'\nimport type { ChangeJournalApi, ChangeSubject, PendingChange } from '../../../adapter/ChangeJournal'\nimport {\n ChangeJournal,\n changeFingerprint,\n findPendingChange,\n requireUnresolvedChange,\n} from '../../../adapter/ChangeJournal'\nimport {\n IdentityAdministration,\n IdentityApplyFailure,\n IdentityPreparation,\n IdentityRecovery,\n type IdentityRecoveryApi,\n type UserAdministrationRequest,\n} from './identity'\nimport { userChangeSubjectFenceKey, userCommandFenceKey, userEmailSubject } from '../../identity/user-identity'\nimport { UserCommandFence, type UserCommandFenceApi } from './user-command-fence'\nimport { decodeUserChangeFenceKey, reconcileUserChange, resolveAppliedUserChange, userChangeDraft } from './user-change'\n\nexport type UserAdministrationDirectoryError =\n | UserAdministrationDenied\n | UserAdministrationUnavailable\n | UserAlreadyExists\n\nexport type UserAdministrationTargetError =\n | UserAdministrationDenied\n | UserAdministrationUnavailable\n | UserNotFound\n | UserSelfRemovalDenied\n | UserSelfRoleChangeDenied\n\nexport interface UserAdministrationApi {\n readonly list: (\n request: UserAdministrationRequest,\n query: UserQuery,\n ) => Effect.Effect<UserPage, UserAdministrationDenied | UserAdministrationUnavailable>\n readonly create: (\n request: UserAdministrationRequest,\n input: CreateUserInput,\n ) => Effect.Effect<User, UserAdministrationDirectoryError>\n readonly remove: (\n request: UserAdministrationRequest,\n userId: string,\n ) => Effect.Effect<User, UserAdministrationTargetError>\n readonly changeRole: (\n request: UserAdministrationRequest,\n userId: string,\n role: Role,\n ) => Effect.Effect<User, UserAdministrationTargetError>\n readonly revokeSessions: (\n request: UserAdministrationRequest,\n userId: string,\n ) => Effect.Effect<User, UserAdministrationTargetError>\n}\n\nexport class UserAdministration extends Context.Service<UserAdministration, UserAdministrationApi>()(\n '@internal/server/UserAdministration',\n) {}\n\nconst USER_CHANGE_GRACE = '30 seconds'\n\nconst USER_CHANGE_RECOVERY_INTERVAL = '10 seconds'\n\nconst USER_CHANGE_RECOVERY_LIMIT = 100\n\nexport const userAdministrationLayer: Layer.Layer<\n UserAdministration,\n UserAdministrationUnavailable,\n ChangeJournal | Crypto.Crypto | IdentityAdministration | IdentityRecovery | UserCommandFence\n> = Layer.effect(\n UserAdministration,\n Effect.gen(function* () {\n const journal = yield* ChangeJournal\n const identity = yield* IdentityAdministration\n const recovery = yield* IdentityRecovery\n const crypto = yield* Crypto.Crypto\n const fence = yield* UserCommandFence\n\n const reconcileStaleChanges = Effect.fn('UserAdministration.reconcileStale')(function* () {\n const before = DateTime.subtractDuration(yield* DateTime.now, USER_CHANGE_GRACE)\n\n const pending = yield* journal\n .pending({ before, limit: USER_CHANGE_RECOVERY_LIMIT, scope: 'users' })\n .pipe(Effect.mapError(unavailable('UserAdministration.recover')))\n\n yield* Effect.forEach(pending.changes, (change) => recoverPending(journal, recovery, fence, change), {\n discard: true,\n })\n })\n\n yield* reconcileStaleChanges()\n yield* reconcileStaleChanges().pipe(\n Effect.catch((error) =>\n Effect.logWarning('Pending User change recovery sweep failed.', { errorTag: error._tag }),\n ),\n Effect.repeat(Schedule.spaced(USER_CHANGE_RECOVERY_INTERVAL)),\n Effect.delay(USER_CHANGE_RECOVERY_INTERVAL),\n Effect.forkScoped,\n )\n\n const list = Effect.fn('UserAdministration.list')((request: UserAdministrationRequest, query: UserQuery) =>\n identity.list(request.authority, query),\n )\n\n const execute = Effect.fn('UserAdministration.execute')(function* (\n request: UserAdministrationRequest,\n command: Parameters<typeof identity.prepare>[1],\n ) {\n return yield* fence.run(userCommandFenceKey(command), (lease) =>\n Effect.gen(function* () {\n const preparation = yield* identity.prepare(request.authority, command)\n\n if (IdentityPreparation.$is('Noop')(preparation)) return preparation.user\n\n if (command.kind === 'change-role' && request.activity.actor.id === command.userId) {\n return yield* new UserSelfRoleChangeDeniedError({ userId: command.userId })\n }\n\n const subject = userSubjectForIntent(preparation.intent)\n\n return yield* lease.include(\n userChangeSubjectFenceKey(subject),\n Effect.gen(function* () {\n yield* ensureSubjectAvailable(journal, recovery, subject)\n\n const change = yield* journal\n .begin(\n userChangeDraft(\n {\n context: request.activity,\n id: ActivityId.make(yield* crypto.randomUUIDv4.pipe(Effect.orDie)),\n },\n preparation.intent,\n ),\n )\n .pipe(Effect.flatMap(requireUnresolvedChange), Effect.mapError(unavailable('UserAdministration.begin')))\n\n const result = yield* preparation.apply(change.id).pipe(Effect.result)\n\n if (Result.isFailure(result)) {\n if (IdentityApplyFailure.$is('Rejected')(result.failure)) {\n yield* journal.resolve(change, { kind: 'cancelled' }).pipe(\n Effect.catch((error) =>\n Effect.logWarning('Rejected User change cancellation remains pending.', {\n action: change.action,\n changeId: change.id,\n errorTag: error._tag,\n }),\n ),\n )\n\n return yield* result.failure.error\n }\n\n const resolution = yield* reconcileAfterUnknown(journal, recovery, change)\n\n if (resolution.kind === 'applied') {\n const user = resolution.user ?? preparation.user\n\n if (user) return user\n }\n\n return yield* result.failure.error\n }\n\n yield* resolveAppliedUserChange(journal, change, result.success).pipe(\n Effect.catch((error) =>\n Effect.logWarning('User Activity finalization is pending recovery.', {\n action: change.action,\n changeId: change.id,\n errorTag: error._tag,\n }),\n ),\n )\n\n return result.success\n }),\n )\n }),\n )\n })\n\n const create = Effect.fn('UserAdministration.create')(\n (request: UserAdministrationRequest, input: CreateUserInput) =>\n execute(request, { input, kind: 'create' }).pipe(Effect.mapError(directoryError('UserAdministration.create'))),\n )\n\n const remove = Effect.fn('UserAdministration.remove')((request: UserAdministrationRequest, userId: string) =>\n execute(request, { kind: 'remove', userId }).pipe(Effect.mapError(targetError('UserAdministration.remove'))),\n )\n\n const changeRole = Effect.fn('UserAdministration.changeRole')(function* (\n request: UserAdministrationRequest,\n userId: string,\n role: Role,\n ) {\n return yield* execute(request, { kind: 'change-role', role, userId }).pipe(\n Effect.mapError(targetError('UserAdministration.changeRole')),\n )\n })\n\n const revokeSessions = Effect.fn('UserAdministration.revokeSessions')(\n (request: UserAdministrationRequest, userId: string) =>\n execute(request, { kind: 'revoke-sessions', userId }).pipe(\n Effect.mapError(targetError('UserAdministration.revokeSessions')),\n ),\n )\n\n return UserAdministration.of({ changeRole, create, list, remove, revokeSessions })\n }),\n)\n\nconst ensureSubjectAvailable = Effect.fn('UserAdministration.ensureSubjectAvailable')(function* (\n journal: ChangeJournalApi,\n recovery: IdentityRecoveryApi,\n subject: ChangeSubject,\n) {\n const existing = yield* findPendingChange(journal, subject).pipe(\n Effect.mapError(unavailable('UserAdministration.subject')),\n )\n\n if (!existing) return\n const staleBefore = DateTime.subtractDuration(yield* DateTime.now, USER_CHANGE_GRACE)\n\n if (DateTime.toEpochMillis(existing.updatedAt) > DateTime.toEpochMillis(staleBefore)) {\n return yield* unavailable('UserAdministration.subject')(new Error(`Change \"${existing.id}\" is still pending.`))\n }\n\n yield* reconcilePending(journal, recovery, existing)\n\n if (!(yield* findPendingChange(journal, subject).pipe(Effect.mapError(unavailable('UserAdministration.subject'))))) {\n return\n }\n\n return yield* unavailable('UserAdministration.subject')(new Error(`Change \"${existing.id}\" is still pending.`))\n})\n\nfunction reconcilePending(journal: ChangeJournalApi, recovery: IdentityRecoveryApi, change: PendingChange) {\n return reconcileUserChange(journal, change, recovery.observe).pipe(\n Effect.tap((resolution) =>\n resolution.kind === 'ambiguous'\n ? Effect.logWarning('User change remains ambiguous.', { action: change.action, changeId: change.id })\n : Effect.void,\n ),\n Effect.catch((error) =>\n Effect.logWarning('User change recovery failed.', {\n action: change.action,\n changeId: change.id,\n errorTag: Schema.is(UserAdministrationUnavailableError)(error) ? error._tag : 'Change.RecoveryFailed',\n }),\n ),\n )\n}\n\nconst recoverPending = Effect.fn('UserAdministration.recoverPending')(function* (\n journal: ChangeJournalApi,\n recovery: IdentityRecoveryApi,\n fence: UserCommandFenceApi,\n stale: PendingChange,\n) {\n const key = yield* decodeUserChangeFenceKey(stale)\n const subjectKey = userChangeSubjectFenceKey(stale.subject)\n yield* fence.run(key, (lease) =>\n lease.include(\n subjectKey,\n Effect.gen(function* () {\n const current = (yield* journal.pending({ limit: 1, scope: 'users', subject: stale.subject })).changes[0]\n\n if (!current || current.id !== stale.id || changeFingerprint(current) !== changeFingerprint(stale)) return\n yield* reconcilePending(journal, recovery, current)\n }),\n ),\n )\n}, recoverPendingFailure)\n\nfunction recoverPendingFailure<A, E, R>(\n effect: Effect.Effect<A, E, R>,\n _journal: ChangeJournalApi,\n _recovery: IdentityRecoveryApi,\n _fence: UserCommandFenceApi,\n change: PendingChange,\n) {\n return effect.pipe(\n Effect.catch((error) =>\n Effect.logWarning('User change recovery failed.', {\n action: change.action,\n changeId: change.id,\n errorTag: Schema.is(UserAdministrationUnavailableError)(error) ? error._tag : 'Change.RecoveryFailed',\n }),\n ),\n )\n}\n\nconst reconcileAfterUnknown = Effect.fn('UserAdministration.reconcileUnknown')(function* (\n journal: ChangeJournalApi,\n recovery: IdentityRecoveryApi,\n change: PendingChange,\n) {\n return yield* reconcileUserChange(journal, change, recovery.observe).pipe(\n Effect.catch((error) =>\n Effect.logWarning('User change could not be reconciled immediately.', {\n action: change.action,\n changeId: change.id,\n errorTag: Schema.is(UserAdministrationUnavailableError)(error) ? error._tag : 'Change.RecoveryFailed',\n }).pipe(Effect.as({ kind: 'ambiguous' } as const)),\n ),\n )\n})\n\nfunction userSubjectForIntent(intent: Parameters<typeof userChangeDraft>[1]): ChangeSubject {\n return userEmailSubject(intent.kind === 'create' ? intent.normalizedEmail : intent.email)\n}\n\nfunction unavailable(operation: string) {\n return (cause: unknown): UserAdministrationUnavailable =>\n Schema.is(UserAdministrationUnavailableError)(cause)\n ? cause\n : new UserAdministrationUnavailableError({ cause, operation })\n}\n\nfunction directoryError(operation: string) {\n return (error: import('./identity').UserAdministrationError): UserAdministrationDirectoryError =>\n Schema.is(UserNotFoundError)(error) ||\n Schema.is(UserSelfRemovalDeniedError)(error) ||\n Schema.is(UserSelfRoleChangeDeniedError)(error)\n ? unavailable(operation)(error)\n : error\n}\n\nfunction targetError(operation: string) {\n return (error: import('./identity').UserAdministrationError): UserAdministrationTargetError =>\n Schema.is(UserAlreadyExistsError)(error) ? unavailable(operation)(error) : error\n}\n","import type { ComponentDefinition } from '@internal/protocol/Configuration'\nimport type { FormDefinition, FormSubmission, FormValues } from '@internal/protocol/Forms'\nimport { FormResult } from '@internal/protocol/Forms'\nimport { documentForms, validateFormValues } from '@internal/document/Forms'\nimport { PublishedDocuments } from './Documents'\nimport { Effect, Predicate } from 'effect'\n\nexport type FormSubmissionHandler = (submission: {\n readonly form: FormDefinition\n readonly values: FormValues\n}) => void | PromiseLike<void>\n\nexport type FormHandlers = Readonly<Record<string, FormSubmissionHandler>>\n\n/** Only the currently published definition can authorize a submission. Never trust client rules. */\nexport const submitForm = Effect.fn('Forms.submit')(function* (\n input: FormSubmission,\n components: ReadonlyArray<ComponentDefinition>,\n handlers: FormHandlers,\n) {\n const documents = yield* PublishedDocuments\n\n const document = yield* documents\n .read({ kind: 'id', documentId: input.documentId })\n .pipe(Effect.orElseSucceed(() => undefined))\n\n if (!document) return FormResult.make({ status: 'unavailable', errors: {} })\n\n const form = documentForms(document, components).find(\n (candidate) => JSON.stringify(candidate.nodePath) === JSON.stringify(input.nodePath),\n )\n\n if (!form || form.revision !== input.revision) return FormResult.make({ status: 'stale', errors: {} })\n const handler = Object.hasOwn(handlers, form.name) ? handlers[form.name] : undefined\n\n if (!handler) return FormResult.make({ status: 'unavailable', errors: {} })\n const fields = form.steps.flatMap((step) => step.fields)\n const errors = validateFormValues(fields, input.values)\n\n if (Object.keys(input.values).some((id) => !fields.some((field) => field.id === id)))\n errors._form = 'The submission contains unknown answers.'\n\n if (Object.keys(errors).length) return FormResult.make({ status: 'invalid', errors })\n\n const values = Object.fromEntries(\n fields.map((field) => [\n field.id,\n normalizedAnswer(Object.hasOwn(input.values, field.id) ? input.values[field.id] : undefined),\n ]),\n )\n\n return yield* Effect.tryPromise(() => Promise.resolve(handler({ form, values }))).pipe(\n Effect.as(FormResult.make({ status: 'accepted', errors: {} })),\n Effect.orElseSucceed(() => FormResult.make({ status: 'failed', errors: {} })),\n )\n})\n\nfunction normalizedAnswer(value: FormValues[string] | undefined): FormValues[string] {\n return value === undefined || (Predicate.isString(value) && !value.trim()) ? null : value\n}\n","import { PublishedDocuments } from '@internal/server/Documents'\nimport type { ComponentDefinition } from '@internal/protocol/Configuration'\nimport type { FormHandlers } from '@internal/server/Forms'\nimport { submitForm } from '@internal/server/Forms'\nimport { StudioApi } from '@internal/protocol/StudioHttp'\nimport { FormResult } from '@internal/protocol/Forms'\nimport { Effect, Layer } from 'effect'\nimport { HttpApiBuilder } from 'effect/unstable/httpapi'\nimport { RateLimiter } from 'effect/unstable/persistence'\n\nexport function formsApiLayer(components: ReadonlyArray<ComponentDefinition>, handlers: FormHandlers) {\n return HttpApiBuilder.group(StudioApi, 'forms', (group) =>\n Effect.gen(function* () {\n const documents = yield* PublishedDocuments\n const limiter = yield* RateLimiter.RateLimiter\n\n return group.handle('submit', ({ payload }) =>\n limiter.consume({ key: 'cms-forms', limit: 60, window: '1 minute', onExceeded: 'fail' }).pipe(\n Effect.andThen(\n submitForm(payload, components, handlers).pipe(Effect.provideService(PublishedDocuments, documents)),\n ),\n Effect.orElseSucceed(() => FormResult.make({ status: 'unavailable', errors: {} })),\n ),\n )\n }),\n ).pipe(Layer.provide(RateLimiter.layer.pipe(Layer.provide(RateLimiter.layerStoreMemory))))\n}\n","import type { StudioRequestContext } from '@internal/protocol/AccessControl'\nimport {\n CurrentStudioRequest,\n StudioBadRequest,\n StudioInternalError,\n StudioSchemaError,\n studioInternalError,\n} from '@internal/protocol/StudioHttp'\nimport { Effect } from 'effect'\nimport { HttpApiError, HttpApiMiddleware } from 'effect/unstable/httpapi'\n\nexport const studioSchemaErrorLayer = HttpApiMiddleware.layerSchemaErrorTransform(StudioSchemaError, (error) =>\n Effect.fail(mapStudioSchemaError(error.kind)),\n)\n\nexport function mapStudioSchemaError(\n kind: HttpApiError.HttpApiSchemaError['kind'],\n): StudioBadRequest | StudioInternalError {\n return kind === 'Headers' || kind === 'Params' || kind === 'Payload' || kind === 'Query'\n ? new StudioBadRequest({ kind })\n : studioInternalError()\n}\n\nexport function withStudioRequest<A, E, R>(\n operation: (context: StudioRequestContext) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, E, R | CurrentStudioRequest> {\n return CurrentStudioRequest.pipe(Effect.flatMap(operation))\n}\n\nexport function preservePublicErrors<PublicError>(isPublic: (error: unknown) => error is PublicError) {\n return <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, (E & PublicError) | StudioInternalError, R> =>\n effect.pipe(Effect.mapError((error) => (isPublic(error) ? error : studioInternalError())))\n}\n\nexport function mapUnexpectedError<A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, StudioInternalError, R> {\n return effect.pipe(Effect.mapError(() => studioInternalError()))\n}\n","import type { StudioRequestContext } from '@internal/protocol/AccessControl'\nimport type { DocumentId } from '@internal/protocol/Documents'\nimport { WorkingDocuments } from '@internal/server/WorkingDocuments'\nimport { AccessDenied as AccessDeniedError } from '@internal/protocol/AccessControl'\nimport { DocumentNotFound as DocumentNotFoundError } from '@internal/protocol/Documents'\nimport { CollaborationTicket } from '@internal/protocol/Collaboration'\nimport { STUDIO_COLLABORATION_PATH } from '@internal/protocol/HttpPaths'\nimport { CurrentStudioRequest, StudioApi } from '@internal/protocol/StudioHttp'\nimport { Effect, Schema } from 'effect'\nimport { HttpApiBuilder } from 'effect/unstable/httpapi'\nimport { StudioRealtimeTickets } from '../realtime/tickets'\nimport { encodeRealtimeStateVector, studioRealtimeUser } from '../realtime/messages'\nimport { studioRealtimeRoomName } from '../realtime/room-name'\nimport { AccessControl } from '@internal/server/AccessControl'\nimport { preservePublicErrors } from './errors'\n\nconst PublicTicketError = Schema.Union([AccessDeniedError, DocumentNotFoundError])\n\nconst isPublicTicketError = Schema.is(PublicTicketError)\n\nexport const collaborationApiLayer = (authoringRevision: string) =>\n HttpApiBuilder.group(StudioApi, 'collaboration', (handlers) =>\n Effect.gen(function* () {\n const accessControl = yield* AccessControl\n const documents = yield* WorkingDocuments\n const tickets = yield* StudioRealtimeTickets\n\n return handlers.handle('ticket', ({ params }) =>\n CurrentStudioRequest.pipe(\n Effect.flatMap((context) => issueTicket(context, params.documentId)),\n preservePublicErrors(isPublicTicketError),\n ),\n )\n\n function issueTicket(context: StudioRequestContext, documentId: DocumentId) {\n return Effect.gen(function* () {\n const opened = yield* documents.open(context, documentId)\n const roomName = studioRealtimeRoomName(opened.ref)\n\n const canWrite = yield* accessControl\n .require(context, {\n action: 'document.update',\n resource: { documentId, kind: 'document' },\n })\n .pipe(Effect.match({ onFailure: () => false, onSuccess: () => true }))\n\n const token = yield* tickets.issue({\n actor: context.actor,\n canWrite,\n ref: opened.ref,\n })\n\n return CollaborationTicket.make({\n authoringRevision,\n authoredStateVector: encodeRealtimeStateVector(opened.authoredStateVector),\n documentName: roomName,\n source: opened.source,\n token,\n url: STUDIO_COLLABORATION_PATH,\n user: studioRealtimeUser(context.actor),\n workingStateVector: encodeRealtimeStateVector(opened.workingStateVector),\n })\n })\n }\n }),\n )\n","import type { AccessDenied } from '@internal/protocol/AccessControl'\nimport type {\n DocumentMediaUnavailable,\n DocumentNotFound,\n DocumentValidationFailed,\n DocumentVersionConflict,\n} from '@internal/protocol/Documents'\nimport type { DocumentCreateError, DocumentMutationError } from '@internal/server/Documents'\nimport { AccessDenied as AccessDeniedError } from '@internal/protocol/AccessControl'\nimport { ContentTransferConflict } from '@internal/protocol/ContentTransfer'\nimport {\n DocumentMediaUnavailable as DocumentMediaUnavailableError,\n DocumentNotFound as DocumentNotFoundError,\n DocumentPathConflict,\n DocumentValidationFailed as DocumentValidationFailedError,\n DocumentVersionConflict as DocumentVersionConflictError,\n MoveDocumentInput,\n DuplicateDocumentInput,\n UnpublishDocumentInput,\n PublishDocumentInput,\n RemoveDocumentInput,\n RestoreDocumentInput,\n UndeleteDocumentInput,\n UpdateDocumentInput,\n} from '@internal/protocol/Documents'\nimport {\n StudioApi,\n StudioInternalError,\n StudioRequestConflict,\n studioInternalError,\n} from '@internal/protocol/StudioHttp'\nimport { DocumentGenerationConflict, Documents } from '@internal/server/Documents'\nimport { Effect, Schema } from 'effect'\nimport { HttpApiBuilder } from 'effect/unstable/httpapi'\nimport { preservePublicErrors, withStudioRequest } from './errors'\n\nconst isAccessDenied = Schema.is(AccessDeniedError)\n\nconst isDocumentNotFound = Schema.is(DocumentNotFoundError)\n\nconst isDocumentVersionConflict = Schema.is(DocumentVersionConflictError)\n\nconst isDocumentGenerationConflict = Schema.is(DocumentGenerationConflict)\n\nconst isContentTransferConflict = Schema.is(ContentTransferConflict)\n\nconst isPublicMutationError = Schema.is(\n Schema.Union([\n AccessDeniedError,\n DocumentMediaUnavailableError,\n DocumentNotFoundError,\n DocumentPathConflict,\n DocumentValidationFailedError,\n DocumentVersionConflictError,\n ]),\n)\n\nexport const documentsApiLayer = HttpApiBuilder.group(StudioApi, 'documents', (handlers) =>\n Effect.gen(function* () {\n const documents = yield* Documents\n\n return handlers\n .handle('browse', ({ query }) =>\n withStudioRequest((context) => documents.browse(context, query)).pipe(preservePublicErrors(isAccessDenied)),\n )\n .handle('trash', () =>\n withStudioRequest((context) => documents.trash(context)).pipe(preservePublicErrors(isAccessDenied)),\n )\n .handle('read', ({ params }) =>\n withStudioRequest((context) => documents.read(context, params.documentId)).pipe(\n preservePublicErrors(\n (error): error is AccessDenied | DocumentNotFound => isAccessDenied(error) || isDocumentNotFound(error),\n ),\n ),\n )\n .handle('create', ({ payload }) =>\n withStudioRequest((context) => documents.create(context, payload)).pipe(mapMutationError),\n )\n .handle('update', ({ params, payload }) =>\n withStudioRequest((context) =>\n documents.update(context, UpdateDocumentInput.make({ documentId: params.documentId, ...payload })),\n ).pipe(mapMutationError),\n )\n .handle('validate', ({ params, payload }) =>\n withStudioRequest((context) =>\n documents.validate(context, UpdateDocumentInput.make({ documentId: params.documentId, ...payload })),\n ).pipe(\n preservePublicErrors(\n (error): error is AccessDenied | DocumentNotFound | DocumentVersionConflict =>\n isAccessDenied(error) || isDocumentNotFound(error) || isDocumentVersionConflict(error),\n ),\n ),\n )\n .handle('duplicate', ({ params, payload }) =>\n withStudioRequest((context) =>\n documents.duplicate(context, DuplicateDocumentInput.make({ documentId: params.documentId, ...payload })),\n ).pipe(mapMutationError),\n )\n .handle('unpublish', ({ params, payload }) =>\n withStudioRequest((context) =>\n documents.unpublish(context, UnpublishDocumentInput.make({ documentId: params.documentId, ...payload })),\n ).pipe(mapMutationError),\n )\n .handle('move', ({ params, payload }) =>\n withStudioRequest((context) =>\n documents.move(context, MoveDocumentInput.make({ documentId: params.documentId, ...payload })),\n ).pipe(mapMutationError),\n )\n .handle('publish', ({ params, payload }) =>\n withStudioRequest((context) =>\n documents.publish(context, PublishDocumentInput.make({ documentId: params.documentId, ...payload })),\n ).pipe(mapMutationError),\n )\n .handle('remove', ({ params, payload }) =>\n withStudioRequest((context) =>\n documents.remove(context, RemoveDocumentInput.make({ documentId: params.documentId, ...payload })),\n ).pipe(mapMutationError),\n )\n .handle('restore', ({ params, payload }) =>\n withStudioRequest((context) =>\n documents.restore(context, RestoreDocumentInput.make({ documentId: params.documentId, ...payload })),\n ).pipe(mapMutationError),\n )\n .handle('undelete', ({ params, payload }) =>\n withStudioRequest((context) =>\n documents.undelete(context, UndeleteDocumentInput.make({ documentId: params.documentId, ...payload })),\n ).pipe(mapMutationError),\n )\n }),\n)\n\nexport const contentApiLayer = HttpApiBuilder.group(StudioApi, 'content', (handlers) =>\n Effect.gen(function* () {\n const documents = yield* Documents\n\n return handlers\n .handle('snapshot', () =>\n withStudioRequest((context) => documents.contentSnapshot(context)).pipe(preservePublicErrors(isAccessDenied)),\n )\n .handle('plan', ({ payload }) =>\n withStudioRequest((context) => documents.contentPlan(context, payload)).pipe(\n preservePublicErrors(\n (error): error is AccessDenied | ContentTransferConflict =>\n isAccessDenied(error) || isContentTransferConflict(error),\n ),\n ),\n )\n .handle('apply', ({ payload }) =>\n withStudioRequest((context) => documents.contentApply(context, payload)).pipe(\n preservePublicErrors(\n (error): error is AccessDenied | ContentTransferConflict | DocumentValidationFailed =>\n isAccessDenied(error) ||\n isContentTransferConflict(error) ||\n Schema.is(DocumentValidationFailedError)(error),\n ),\n ),\n )\n }),\n)\n\nfunction mapMutationError<A, R>(\n effect: Effect.Effect<A, AccessDenied | DocumentCreateError | DocumentMutationError, R>,\n): Effect.Effect<\n A,\n | AccessDenied\n | DocumentMediaUnavailable\n | DocumentNotFound\n | DocumentValidationFailed\n | DocumentVersionConflict\n | InstanceType<typeof DocumentPathConflict>\n | StudioInternalError\n | StudioRequestConflict,\n R\n> {\n return effect.pipe(\n Effect.mapError((error) => {\n if (isPublicMutationError(error)) return error\n\n if (isDocumentGenerationConflict(error)) return new StudioRequestConflict({ retryable: true })\n\n return studioInternalError()\n }),\n )\n}\n","import type { MediaInvalid, MediaTooLarge } from '@internal/protocol/Media'\nimport type { MediaUploadQuery } from '@internal/protocol/StudioHttp'\nimport type { MediaUploadInput } from '@internal/server/MediaLibrary'\nimport { AccessDenied as AccessDeniedError } from '@internal/protocol/AccessControl'\nimport {\n MediaConflict as MediaConflictError,\n MediaInvalid as MediaInvalidError,\n MediaNotFound as MediaNotFoundError,\n MediaReferenced as MediaReferencedError,\n MediaTooLarge as MediaTooLargeError,\n MediaUpload,\n} from '@internal/protocol/Media'\nimport { StudioApi, StudioInternalError, studioInternalError } from '@internal/protocol/StudioHttp'\nimport { MediaLibrary } from '@internal/server/MediaLibrary'\nimport { Effect, Option, Predicate, Pull, Schema, Scope, Stream } from 'effect'\nimport { HttpServerResponse, Multipart } from 'effect/unstable/http'\nimport { HttpApiBuilder } from 'effect/unstable/httpapi'\nimport { preservePublicErrors, withStudioRequest } from './errors'\n\nconst isAccessDenied = Schema.is(AccessDeniedError)\n\nconst isMediaInvalid = Schema.is(MediaInvalidError)\n\nconst isPublicMediaReadError = Schema.is(Schema.Union([AccessDeniedError, MediaNotFoundError]))\n\nconst isPublicMediaSearchError = Schema.is(Schema.Union([AccessDeniedError, MediaInvalidError]))\n\nconst isPublicMediaUploadError = Schema.is(\n Schema.Union([AccessDeniedError, MediaInvalidError, MediaTooLargeError, StudioInternalError]),\n)\n\nconst isPublicMediaRemoveError = Schema.is(\n Schema.Union([AccessDeniedError, MediaConflictError, MediaNotFoundError, MediaReferencedError]),\n)\n\nconst isPublicMediaReplaceError = Schema.is(\n Schema.Union([\n AccessDeniedError,\n MediaConflictError,\n MediaInvalidError,\n MediaNotFoundError,\n MediaTooLargeError,\n StudioInternalError,\n ]),\n)\n\nexport function mediaApiLayer(enabled: boolean, maxUploadBytes: number) {\n return enabled ? enabledMediaApiLayer(maxUploadBytes) : disabledMediaApiLayer()\n}\n\nfunction enabledMediaApiLayer(maxUploadBytes: number) {\n return HttpApiBuilder.group(StudioApi, 'media', (handlers) =>\n Effect.gen(function* () {\n const media = yield* MediaLibrary\n\n return handlers\n .handle('search', ({ query }) =>\n withStudioRequest((context) => media.search(context, query)).pipe(\n preservePublicErrors(isPublicMediaSearchError),\n ),\n )\n .handle('upload', ({ payload, query }) =>\n Effect.scoped(\n withStudioRequest((context) =>\n decodeMediaUpload(payload, query, maxUploadBytes).pipe(\n Effect.flatMap((input) => media.upload(context, input)),\n ),\n ),\n ).pipe(preservePublicErrors(isPublicMediaUploadError)),\n )\n .handle('replace', ({ params, payload, query }) =>\n Effect.scoped(\n withStudioRequest((context) =>\n decodeMediaUpload(payload, query, maxUploadBytes).pipe(\n Effect.flatMap((input) => media.replace(context, params.mediaId, input)),\n ),\n ),\n ).pipe(preservePublicErrors(isPublicMediaReplaceError)),\n )\n .handle('cleanup', () =>\n withStudioRequest((context) => media.cleanup(context)).pipe(preservePublicErrors(isAccessDenied)),\n )\n .handle('integrity', () =>\n withStudioRequest((context) => media.integrity(context)).pipe(preservePublicErrors(isAccessDenied)),\n )\n .handle('get', ({ params }) =>\n withStudioRequest((context) => media.get(context, params.mediaId)).pipe(\n preservePublicErrors(isPublicMediaReadError),\n ),\n )\n .handle('remove', ({ params }) =>\n withStudioRequest((context) => media.remove(context, params.mediaId)).pipe(\n preservePublicErrors(isPublicMediaRemoveError),\n ),\n )\n }),\n )\n}\n\nfunction disabledMediaApiLayer() {\n const notFound = () => Effect.succeed(HttpServerResponse.empty({ status: 404 }))\n\n return HttpApiBuilder.group(StudioApi, 'media', (handlers) =>\n handlers\n .handleRaw('search', notFound)\n .handleRaw('upload', notFound)\n .handleRaw('replace', notFound)\n .handleRaw('cleanup', notFound)\n .handleRaw('integrity', notFound)\n .handleRaw('get', notFound)\n .handleRaw('remove', notFound),\n )\n}\n\nfunction decodeMediaUpload(\n payload: Stream.Stream<Multipart.Part, Multipart.MultipartError>,\n query: MediaUploadQuery,\n maxUploadBytes: number,\n): Effect.Effect<MediaUploadInput, MediaInvalid | MediaTooLarge | StudioInternalError, Scope.Scope> {\n return Effect.gen(function* () {\n if (query.declaredByteSize > maxUploadBytes) {\n return yield* new MediaTooLargeError({ declaredByteSize: query.declaredByteSize, maxUploadBytes })\n }\n\n const pull = yield* Stream.toPull(payload)\n\n const firstParts = yield* pull.pipe(\n Pull.catchDone(() => Effect.fail(invalidMultipart())),\n Effect.mapError(mapMultipartError),\n )\n\n const part = firstParts[0]\n\n if (!Multipart.isFile(part) || part.key !== 'file') return yield* invalidMultipart()\n\n const remainingParts = Stream.concat(\n Stream.fromIterable(firstParts.slice(1)),\n Stream.fromPull(Effect.succeed(pull)),\n )\n\n const metadataInput =\n query.folder === undefined\n ? {\n declaredByteSize: query.declaredByteSize,\n declaredMimeType: part.contentType,\n name: part.name,\n }\n : {\n declaredByteSize: query.declaredByteSize,\n declaredMimeType: part.contentType,\n folder: query.folder,\n name: part.name,\n }\n\n const metadata = yield* Schema.decodeEffect(MediaUpload)(metadataInput).pipe(\n Effect.mapError(() => invalidMultipart()),\n )\n\n const assertSinglePart = remainingParts.pipe(\n Stream.runHead,\n Effect.mapError(() => invalidMultipart()),\n Effect.flatMap((next) => (Option.isNone(next) ? Effect.void : Effect.fail(invalidMultipart()))),\n )\n\n return {\n body: part.content.pipe(\n Stream.mapError(() => invalidMultipart()),\n Stream.concat(Stream.fromEffect(assertSinglePart).pipe(Stream.drain)),\n ),\n metadata,\n }\n })\n}\n\nfunction mapMultipartError(error: MediaInvalid | Multipart.MultipartError): MediaInvalid | StudioInternalError {\n if (isMediaInvalid(error)) return error\n\n return Predicate.isTagged('InternalError')(error.reason) ? studioInternalError() : invalidMultipart()\n}\n\nfunction invalidMultipart(): MediaInvalidError {\n return new MediaInvalidError({ message: 'Upload exactly one file whose body matches its declared size.' })\n}\n","import { DocumentPreviews } from '@internal/server/Documents'\nimport { PreviewSeo, SeoDelivery } from '@internal/server/Seo'\nimport { AccessControl } from '@internal/server/AccessControl'\nimport { AccessDenied } from '@internal/protocol/AccessControl'\nimport { PublishedDocumentNotFound } from '@internal/protocol/Documents'\nimport { CurrentStudioRequest, StudioApi } from '@internal/protocol/StudioHttp'\nimport { Effect, Schema } from 'effect'\nimport { HttpApiBuilder } from 'effect/unstable/httpapi'\nimport { preservePublicErrors } from './errors'\n\nconst publicError = Schema.is(Schema.Union([AccessDenied, PublishedDocumentNotFound]))\n\nconst denied = Schema.is(AccessDenied)\n\nexport const previewApiLayer = HttpApiBuilder.group(StudioApi, 'previewDelivery', (handlers) =>\n Effect.gen(function* () {\n const documents = yield* DocumentPreviews\n const accessControl = yield* AccessControl\n const seo = yield* PreviewSeo\n const seoDelivery = yield* SeoDelivery\n\n return handlers\n .handle('read', ({ payload }) =>\n CurrentStudioRequest.pipe(\n Effect.flatMap((context) =>\n documents.read(context, payload).pipe(Effect.flatMap((document) => seoDelivery.previewDocument(document))),\n ),\n preservePublicErrors(publicError),\n ),\n )\n .handle('query', ({ payload }) =>\n CurrentStudioRequest.pipe(\n Effect.flatMap((context) =>\n documents\n .query(context, payload)\n .pipe(\n Effect.flatMap((page) =>\n Effect.forEach(page.items, (document) => seoDelivery.previewDocument(document)).pipe(\n Effect.map((items) => Object.assign({}, page, { items })),\n ),\n ),\n ),\n ),\n preservePublicErrors(denied),\n ),\n )\n .handle('navigation', ({ payload }) =>\n CurrentStudioRequest.pipe(\n Effect.flatMap((context) => documents.navigation(context, payload)),\n preservePublicErrors(denied),\n ),\n )\n .handle('surround', ({ payload }) =>\n CurrentStudioRequest.pipe(\n Effect.flatMap((context) =>\n documents.surround(context, payload.lookup, payload.query).pipe(\n Effect.flatMap((surround) =>\n Effect.all({\n previous: surround.previous ? seoDelivery.previewDocument(surround.previous) : Effect.succeed(null),\n next: surround.next ? seoDelivery.previewDocument(surround.next) : Effect.succeed(null),\n }),\n ),\n ),\n ),\n preservePublicErrors(publicError),\n ),\n )\n .handle('seo', () =>\n CurrentStudioRequest.pipe(\n Effect.flatMap((context) =>\n accessControl\n .require(context, { action: 'document.browse', resource: { kind: 'catalog' } })\n .pipe(Effect.andThen(seo.read)),\n ),\n preservePublicErrors(denied),\n ),\n )\n }),\n)\n","import { PublishedDocuments } from '@internal/server/Documents'\nimport { PublishedSeo, SeoDelivery } from '@internal/server/Seo'\nimport { AccessDenied } from '@internal/protocol/AccessControl'\nimport { PublishedDocumentNotFound } from '@internal/protocol/Documents'\nimport { CurrentStudioRequest, StudioApi } from '@internal/protocol/StudioHttp'\nimport { Effect, Layer, Schema } from 'effect'\nimport { HttpApiBuilder } from 'effect/unstable/httpapi'\nimport { mapUnexpectedError, preservePublicErrors } from './errors'\n\nconst isPublishedDocumentNotFound = Schema.is(PublishedDocumentNotFound)\n\nexport const deliveryApiLayer = Layer.merge(\n HttpApiBuilder.group(StudioApi, 'delivery', (handlers) =>\n Effect.gen(function* () {\n const documents = yield* PublishedDocuments\n const seo = yield* PublishedSeo\n const seoDelivery = yield* SeoDelivery\n\n return handlers\n .handle('read', ({ payload }) =>\n documents\n .read(payload)\n .pipe(Effect.flatMap(seoDelivery.publishedDocument), preservePublicErrors(isPublishedDocumentNotFound)),\n )\n .handle('query', ({ payload }) =>\n documents.query(payload).pipe(\n Effect.flatMap((page) =>\n Effect.forEach(page.items, seoDelivery.publishedDocument).pipe(\n Effect.map((items) => ({ items, total: page.total })),\n ),\n ),\n mapUnexpectedError,\n ),\n )\n .handle('navigation', ({ payload }) => documents.navigation(payload).pipe(mapUnexpectedError))\n .handle('surround', ({ payload }) =>\n documents.surround(payload.lookup, payload.query).pipe(\n Effect.flatMap((surround) =>\n Effect.all({\n previous: surround.previous ? seoDelivery.publishedDocument(surround.previous) : Effect.succeed(null),\n next: surround.next ? seoDelivery.publishedDocument(surround.next) : Effect.succeed(null),\n }),\n ),\n preservePublicErrors(isPublishedDocumentNotFound),\n ),\n )\n .handle('seo', () => seo.read.pipe(mapUnexpectedError))\n .handle('sitemap', () => seoDelivery.sitemap.pipe(mapUnexpectedError))\n }),\n ),\n HttpApiBuilder.group(StudioApi, 'diagnostics', (handlers) =>\n Effect.gen(function* () {\n const documents = yield* PublishedDocuments\n\n return handlers.handle('documents', () =>\n CurrentStudioRequest.pipe(\n Effect.flatMap((context) => documents.diagnostics(context)),\n preservePublicErrors(Schema.is(AccessDenied)),\n ),\n )\n }),\n ),\n)\n","import { Activity } from '@internal/server/Activity'\nimport { Documents } from '@internal/server/Documents'\nimport { AccessDenied } from '@internal/protocol/AccessControl'\nimport { ActivityCursorInvalid } from '@internal/protocol/Activity'\nimport {\n DocumentHistoryComparisonTooLarge,\n DocumentHistoryInvalidCursor,\n DocumentNotFound,\n} from '@internal/protocol/Documents'\nimport { InitializationAlreadyCompleted, InitializationProofInvalid } from '@internal/protocol/Initialization'\nimport { CurrentStudioRequest, StudioApi } from '@internal/protocol/StudioHttp'\nimport { Effect, Layer, Schema } from 'effect'\nimport { HttpApiBuilder } from 'effect/unstable/httpapi'\nimport { Initialization } from '@internal/server/Initialization'\nimport { Seo } from '@internal/server/Seo'\nimport { SeoConfirmationRequired, SeoMediaUnavailable, SeoVersionConflict } from '@internal/protocol/Seo'\nimport { mapUnexpectedError, preservePublicErrors, withStudioRequest } from './errors'\n\nconst isActivityPublicError = Schema.is(Schema.Union([ActivityCursorInvalid, AccessDenied]))\n\nconst isHistoryPublicError = Schema.is(\n Schema.Union([AccessDenied, DocumentHistoryComparisonTooLarge, DocumentHistoryInvalidCursor, DocumentNotFound]),\n)\n\nconst isInitializationPublicError = Schema.is(\n Schema.Union([InitializationAlreadyCompleted, InitializationProofInvalid]),\n)\n\nconst isSeoPublicError = Schema.is(\n Schema.Union([AccessDenied, SeoConfirmationRequired, SeoMediaUnavailable, SeoVersionConflict]),\n)\n\nexport const administrationApiLayer = Layer.mergeAll(\n HttpApiBuilder.group(StudioApi, 'initialization', (handlers) =>\n Effect.gen(function* () {\n const initialization = yield* Initialization\n\n return handlers\n .handle('status', () => initialization.status.pipe(mapUnexpectedError))\n .handle('claim', ({ payload }) =>\n initialization.claim(payload).pipe(preservePublicErrors(isInitializationPublicError)),\n )\n }),\n ),\n HttpApiBuilder.group(StudioApi, 'session', (handlers) =>\n handlers.handle('current', () => CurrentStudioRequest.pipe(Effect.map((context) => context.actor))),\n ),\n HttpApiBuilder.group(StudioApi, 'history', (handlers) =>\n Effect.gen(function* () {\n const documents = yield* Documents\n\n return handlers\n .handle('list', ({ query }) =>\n withStudioRequest((context) => documents.historyList(context, query)).pipe(\n preservePublicErrors(isHistoryPublicError),\n ),\n )\n .handle('read', ({ params }) =>\n withStudioRequest((context) => documents.historyRead(context, params.documentId, params.revisionId)).pipe(\n preservePublicErrors(isHistoryPublicError),\n ),\n )\n .handle('compare', ({ payload }) =>\n withStudioRequest((context) => documents.historyCompare(context, payload)).pipe(\n preservePublicErrors(isHistoryPublicError),\n ),\n )\n }),\n ),\n HttpApiBuilder.group(StudioApi, 'activity', (handlers) =>\n Effect.gen(function* () {\n const activity = yield* Activity\n\n return handlers.handle('list', ({ query }) =>\n withStudioRequest((context) => activity.list(context, query)).pipe(preservePublicErrors(isActivityPublicError)),\n )\n }),\n ),\n HttpApiBuilder.group(StudioApi, 'seo', (handlers) =>\n Effect.gen(function* () {\n const seo = yield* Seo\n\n return handlers\n .handle('read', () =>\n withStudioRequest((context) => seo.read(context)).pipe(preservePublicErrors(isSeoPublicError)),\n )\n .handle('save', ({ payload }) =>\n withStudioRequest((context) => seo.save(context, payload)).pipe(preservePublicErrors(isSeoPublicError)),\n )\n .handle('publish', ({ payload }) =>\n withStudioRequest((context) => seo.publish(context, payload)).pipe(preservePublicErrors(isSeoPublicError)),\n )\n }),\n ),\n)\n","import { StudioApi } from '@internal/protocol/StudioHttp'\nimport {\n UserAdministrationDenied,\n UserAlreadyExists,\n UserNotFound,\n UserSelfRemovalDenied,\n UserSelfRoleChangeDenied,\n} from '@internal/protocol/Users'\nimport { Effect, Schema } from 'effect'\nimport { HttpApiBuilder } from 'effect/unstable/httpapi'\nimport { UserAdministration } from '@internal/server/UserAdministration'\nimport { CurrentUserAdministrationRequest } from './authentication'\nimport { preservePublicErrors } from './errors'\n\nconst isListError = Schema.is(UserAdministrationDenied)\n\nconst isCreateError = Schema.is(Schema.Union([UserAdministrationDenied, UserAlreadyExists]))\n\nconst isChangeRoleError = Schema.is(Schema.Union([UserAdministrationDenied, UserNotFound, UserSelfRoleChangeDenied]))\n\nconst isRevokeError = Schema.is(Schema.Union([UserAdministrationDenied, UserNotFound]))\n\nconst isRemoveError = Schema.is(Schema.Union([UserAdministrationDenied, UserNotFound, UserSelfRemovalDenied]))\n\nexport const userAdministrationHttpLayer = HttpApiBuilder.group(StudioApi, 'users', (handlers) =>\n Effect.gen(function* () {\n const users = yield* UserAdministration\n\n const withRequest = <A, E, R>(\n operation: (\n request: import('@internal/server/UserAdministration').UserAdministrationRequest,\n ) => Effect.Effect<A, E, R>,\n ) => CurrentUserAdministrationRequest.pipe(Effect.flatMap(operation))\n\n return handlers\n .handle('list', ({ query }) =>\n withRequest((request) => users.list(request, query)).pipe(preservePublicErrors(isListError)),\n )\n .handle('create', ({ payload }) =>\n withRequest((request) => users.create(request, payload)).pipe(preservePublicErrors(isCreateError)),\n )\n .handle('changeRole', ({ params, payload }) =>\n withRequest((request) => users.changeRole(request, params.userId, payload.role)).pipe(\n preservePublicErrors(isChangeRoleError),\n ),\n )\n .handle('revokeSessions', ({ params }) =>\n withRequest((request) => users.revokeSessions(request, params.userId)).pipe(\n preservePublicErrors(isRevokeError),\n ),\n )\n .handle('remove', ({ params }) =>\n withRequest((request) => users.remove(request, params.userId)).pipe(preservePublicErrors(isRemoveError)),\n )\n }),\n)\n","import type { ComponentDefinition } from '@internal/protocol/Configuration'\nimport type { FormHandlers } from '@internal/server/Forms'\nimport { formsApiLayer } from './forms'\nimport type { StudioBootstrap } from '@internal/protocol/StudioHttp'\nimport { StudioApi } from '@internal/protocol/StudioHttp'\nimport { Effect, Layer } from 'effect'\nimport { HttpRouter } from 'effect/unstable/http'\nimport { HttpApiBuilder } from 'effect/unstable/httpapi'\nimport { collaborationApiLayer } from './collaboration'\nimport { CurrentUserAdministrationRequest } from './authentication'\nimport { contentApiLayer, documentsApiLayer } from './documents'\nimport { studioSchemaErrorLayer } from './errors'\nimport { mediaApiLayer } from './media'\nimport { previewApiLayer } from './preview'\nimport { deliveryApiLayer } from './delivery'\nimport { administrationApiLayer } from './administration'\nimport { userAdministrationHttpLayer } from './user-administration'\n\nexport function studioApiLayer(\n bootstrap: StudioBootstrap,\n authoringRevision: string,\n components: ReadonlyArray<ComponentDefinition> = [],\n formHandlers: FormHandlers = {},\n) {\n const configuration = HttpApiBuilder.group(StudioApi, 'configuration', (handlers) =>\n handlers.handle('bootstrap', () => Effect.succeed(bootstrap)),\n )\n\n return authenticatedRouterHandlers(\n Layer.mergeAll(\n configuration,\n formsApiLayer(components, formHandlers),\n documentsApiLayer,\n contentApiLayer,\n mediaApiLayer(bootstrap.media.enabled, bootstrap.media.maxUploadBytes),\n collaborationApiLayer(authoringRevision),\n deliveryApiLayer,\n previewApiLayer,\n administrationApiLayer,\n userAdministrationHttpLayer,\n ).pipe(Layer.provideMerge(studioSchemaErrorLayer)),\n )\n}\n\ntype PrivateAuthenticationRequirement = HttpRouter.Request<'Requires', CurrentUserAdministrationRequest>\n\nfunction authenticatedRouterHandlers<A, E, R>(\n handlers: Layer.Layer<A, E, R>,\n): Layer.Layer<A, E, Exclude<R, PrivateAuthenticationRequirement>> {\n // SAFETY: StudioApi applies StudioAuthentication to every User endpoint, and the only\n // implementation of that middleware supplies this private request-local service before\n // invoking a handler. HttpApiBuilder cannot express this additional server-private provision.\n // oxlint-disable-next-line effecttsgo/unsafe-effect-type-assertion -- The private middleware provision is explained above.\n return handlers as Layer.Layer<A, E, Exclude<R, PrivateAuthenticationRequirement>>\n}\n","import { Schema } from 'effect'\n\nexport class CmsInstallationError extends Schema.TaggedError<CmsInstallationError>()('Cms.InstallationError', {\n cause: Schema.Defect(),\n operation: Schema.NonEmptyString,\n}) {}\n","import type { FormHandlers } from '@internal/server/Forms'\nimport type { AuthoringCatalog } from '@internal/protocol/Configuration'\nimport type { WorkingDocumentsOptions } from '@internal/server/WorkingDocuments'\nimport type { ExecutableDocumentModel } from '@internal/document/DocumentEngine'\nimport type { StudioBootstrap } from '@internal/protocol/StudioHttp'\nimport type { PreviewOrigin } from '@internal/protocol/Preview'\nimport type { InstallationComposition } from './composition'\nimport { Effect, Layer, Redacted, Result, Schema } from 'effect'\nimport { HttpRouter, HttpServer } from 'effect/unstable/http'\nimport { HttpApiBuilder } from 'effect/unstable/httpapi'\nimport { StudioApi } from '@internal/protocol/StudioHttp'\nimport { MediaCleanupReport } from '@internal/protocol/Media'\nimport { MediaLibrary } from '@internal/server/MediaLibrary'\nimport { productModulesLayer, productModulesWithMediaLayer } from '@internal/server/ProductModules'\nimport { studioRealtimeGatewayLayer } from '../realtime/gateway'\nimport { studioRealtimeRoomHostLayer } from '../realtime/room-host'\nimport { studioRealtimeTicketsLayer } from '../realtime/tickets'\nimport { initializationLayer } from '@internal/server/Initialization'\nimport { studioAuthenticationLayer } from '../http/authentication'\nimport { userAdministrationLayer } from '@internal/server/UserAdministration'\nimport { studioApiLayer } from '../http/api'\nimport { Installation, installationHttpLayer } from './host'\nimport { CmsInstallationError } from './error'\n\nexport interface InstallationOptions {\n readonly baseUrl: PreviewOrigin\n readonly formHandlers?: FormHandlers\n readonly authoring: AuthoringCatalog\n readonly bootstrap: StudioBootstrap\n readonly studioSecret: Redacted.Redacted<string>\n readonly documentModel: ExecutableDocumentModel\n readonly composition: InstallationComposition\n readonly initializationToken: Redacted.Redacted<string>\n readonly workingDocuments?: WorkingDocumentsOptions\n}\n\ninterface ValidatedInstallationOptions {\n readonly media:\n | { readonly enabled: false }\n | { readonly enabled: true; readonly configuration: NonNullable<InstallationComposition['media']> }\n readonly options: InstallationOptions\n}\n\nexport function installationLayer(options: InstallationOptions): Layer.Layer<Installation, CmsInstallationError> {\n return Layer.unwrap(\n Effect.fromResult(validateInstallationOptions(options)).pipe(\n Effect.map((validated) => mapStartupError(makeInstallationLayer(validated), 'Installation.start')),\n ),\n )\n}\n\nfunction makeInstallationLayer(validated: ValidatedInstallationOptions) {\n const options = validated.options\n const core = options.composition.core\n\n const productOptions = {\n baseUrl: options.baseUrl,\n bootstrap: options.bootstrap,\n documentEngine: { documentModel: options.documentModel, components: options.authoring.components },\n workingDocuments: options.workingDocuments,\n }\n\n const enabledProductModules = (media: NonNullable<InstallationComposition['media']>) =>\n productModulesWithMediaLayer({ ...productOptions, mediaPublicBaseUrl: media.publicBaseUrl }).pipe(\n Layer.provide(Layer.merge(core, media.objects)),\n )\n\n // SAFETY: the disabled-media product omits only MediaLibrary, which this branch never requests.\n const productModules: ReturnType<typeof enabledProductModules> = validated.media.enabled\n ? enabledProductModules(validated.media.configuration)\n : (productModulesLayer(productOptions).pipe(Layer.provide(core)) as ReturnType<typeof enabledProductModules>)\n\n const authentication = studioAuthenticationLayer.pipe(Layer.provide(core))\n\n const initialization = initializationLayer({\n initializationToken: options.initializationToken,\n }).pipe(Layer.provide(core))\n\n const users = userAdministrationLayer.pipe(Layer.provide(core))\n const tickets = studioRealtimeTicketsLayer(options.studioSecret).pipe(Layer.provide(core))\n const roomHost = studioRealtimeRoomHostLayer().pipe(Layer.provide(productModules))\n const gateway = studioRealtimeGatewayLayer.pipe(Layer.provide(Layer.mergeAll(productModules, roomHost, tickets)))\n\n const httpDependencies = Layer.mergeAll(core, productModules, gateway, initialization, roomHost, users).pipe(\n Layer.provideMerge(authentication),\n Layer.provideMerge(tickets),\n )\n\n const handlers = studioApiLayer(\n options.bootstrap,\n options.authoring.revision,\n options.authoring.components,\n options.formHandlers,\n ).pipe(Layer.provide(httpDependencies))\n\n const httpApi = HttpApiBuilder.layer(StudioApi).pipe(\n Layer.provide(handlers),\n Layer.provide(HttpServer.layerServices),\n Layer.provideMerge(HttpRouter.layer),\n )\n\n const installation = validated.media.enabled\n ? installationHttpLayer(options.bootstrap, (context) =>\n Effect.flatMap(MediaLibrary, (library) => library.cleanup(context)),\n ).pipe(Layer.provide(Layer.merge(httpDependencies, httpApi)))\n : installationHttpLayer(options.bootstrap, () =>\n Effect.succeed(MediaCleanupReport.make({ removedObjectKeys: [] })),\n ).pipe(Layer.provide(Layer.merge(httpDependencies, httpApi)))\n\n return installation\n}\n\nfunction validateInstallationOptions(\n options: InstallationOptions,\n): Result.Result<ValidatedInstallationOptions, CmsInstallationError> {\n if (options.bootstrap.media.enabled) {\n const media = options.composition.media\n\n return media === undefined\n ? Result.fail(\n new CmsInstallationError({\n cause: new Error('Media configuration is required when media is enabled.'),\n operation: 'Installation.configure',\n }),\n )\n : Result.succeed({ media: { configuration: media, enabled: true }, options })\n }\n\n if (options.composition.media !== undefined) {\n return Result.fail(\n new CmsInstallationError({\n cause: new Error('Media configuration must be omitted when media is disabled.'),\n operation: 'Installation.configure',\n }),\n )\n }\n\n return Result.succeed({ media: { enabled: false }, options })\n}\n\nconst isCmsInstallationError = Schema.is(CmsInstallationError)\n\nfunction startupError(operation: string) {\n return (cause: unknown) => (isCmsInstallationError(cause) ? cause : new CmsInstallationError({ cause, operation }))\n}\n\nfunction mapStartupError<E, R>(layer: Layer.Layer<Installation, E, R>, operation: string) {\n return layer.pipe(Layer.catch((cause) => Layer.effect(Installation, Effect.fail(startupError(operation)(cause)))))\n}\n","import type { FormHandlers } from '@internal/server/Forms'\nimport type { AuthoringCatalog } from '@internal/protocol/Configuration'\nimport type { ExecutableDocumentModel } from '@internal/document/DocumentEngine'\nimport type { PreviewOrigin } from '@internal/protocol/Preview'\nimport type { StudioBootstrap } from '@internal/protocol/StudioHttp'\nimport type { InstallationComposition } from './internal/installation/composition'\nimport type { Redacted } from 'effect'\nimport { Effect } from 'effect'\nimport { startInstallation } from './internal/installation/runtime'\nimport { installationLayer } from './internal/installation/layer'\n\nexport interface CmsInstallationOptions {\n readonly baseUrl: PreviewOrigin\n readonly formHandlers?: FormHandlers\n readonly authoring: AuthoringCatalog\n readonly bootstrap: StudioBootstrap\n readonly composition: InstallationComposition\n readonly cleanup?: {\n readonly initialDelayMillis: number\n readonly intervalMillis: number\n }\n readonly documentModel: ExecutableDocumentModel\n readonly studioSecret: Redacted.Redacted<string>\n readonly initializationToken: Redacted.Redacted<string>\n}\n\nexport interface CmsWebSocket {\n readonly close: (code?: number, reason?: string) => void\n readonly readyState: number\n readonly send: (data: string | ArrayBufferLike | Blob | ArrayBufferView) => void\n}\n\nexport interface CmsWebSocketBridge {\n readonly close: (socket: CmsWebSocket, details?: { readonly code?: number; readonly reason?: string }) => void\n readonly error: (socket: CmsWebSocket) => void\n readonly message: (socket: CmsWebSocket, message: Uint8Array) => void\n readonly open: (connection: { readonly request: Request; readonly socket: CmsWebSocket }) => void\n}\n\nexport interface CmsInstallation {\n readonly close: () => Promise<void>\n readonly fetch: (request: Request) => Promise<Response>\n readonly webSocket: CmsWebSocketBridge\n}\n\nexport const installCms = Effect.fn('CmsInstallation.install')(function* (options: CmsInstallationOptions) {\n return yield* startInstallation({\n cleanup: options.bootstrap.media.enabled ? options.cleanup : undefined,\n layer: createCmsInstallationLayer(options),\n })\n})\n\nfunction createCmsInstallationLayer(options: CmsInstallationOptions) {\n return installationLayer({\n baseUrl: options.baseUrl,\n formHandlers: options.formHandlers,\n authoring: options.authoring,\n bootstrap: options.bootstrap,\n composition: options.composition,\n studioSecret: options.studioSecret,\n documentModel: options.documentModel,\n initializationToken: options.initializationToken,\n })\n}\n\nexport { CmsInstallationError } from './internal/installation/error'\n\nexport type { InstallationComposition }\n","import type { Schema } from 'effect'\nimport { ACTIVITY_ACTIONS } from '@internal/protocol/Activity'\nimport { sql } from 'drizzle-orm'\nimport { check, index, jsonb, pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core'\nimport { isOneOf, transactionTimestamp } from '../database/table-helpers'\n\nexport const ACTIVITY_TARGET_KINDS = ['document', 'media', 'media-library', 'seo', 'user'] as const\n\nexport const IDENTIFIED_ACTIVITY_TARGET_KINDS = ['document', 'media', 'user'] as const\n\nexport const activityEntries = pgTable(\n 'activity_entries',\n {\n id: uuid().defaultRandom().primaryKey(),\n action: text({ enum: ACTIVITY_ACTIONS }).notNull(),\n actorId: text('actor_id').notNull(),\n actorEmail: text('actor_email').notNull(),\n actorName: text('actor_name').notNull(),\n actorRoles: jsonb('actor_roles').$type<ReadonlyArray<string>>().notNull(),\n requestId: uuid('request_id').notNull(),\n reason: text(),\n targetKind: text('target_kind', { enum: ACTIVITY_TARGET_KINDS }).notNull(),\n targetId: text('target_id'),\n details: jsonb().$type<Schema.JsonObject>().default({}).notNull(),\n occurredAt: timestamp('occurred_at', { mode: 'string', withTimezone: true })\n .default(transactionTimestamp)\n .notNull(),\n },\n (table) => [\n check('activity_entries_action_check', isOneOf(table.action, ACTIVITY_ACTIONS)),\n check('activity_entries_target_kind_check', isOneOf(table.targetKind, ACTIVITY_TARGET_KINDS)),\n check(\n 'activity_entries_target_check',\n sql`(${table.targetKind} in ('media-library', 'seo') AND ${table.targetId} IS NULL)\n OR (${table.targetKind} not in ('media-library', 'seo') AND ${table.targetId} IS NOT NULL)`,\n ),\n check('activity_entries_actor_roles_check', sql`jsonb_typeof(${table.actorRoles}) = 'array'`),\n check('activity_entries_details_check', sql`jsonb_typeof(${table.details}) = 'object'`),\n index('activity_entries_history').on(table.occurredAt.desc(), table.id.desc()),\n index('activity_entries_actor').on(table.actorId, table.occurredAt.desc(), table.id.desc()),\n index('activity_entries_target').on(table.targetKind, table.targetId, table.occurredAt.desc(), table.id.desc()),\n index('activity_entries_request').on(table.requestId),\n ],\n)\n","import { ActivityAction, ActivityTargetKind } from '@internal/protocol/Activity'\nimport { ActivityId } from '@internal/protocol/Activity'\nimport { StudioActor } from '@internal/protocol/AccessControl'\nimport { RequestId } from '@internal/protocol/Identity'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-orm/effect-schema'\nimport { Schema } from 'effect'\nimport { activityEntries } from './tables'\n\nconst refinements = {\n action: () => ActivityAction,\n actorEmail: () => StudioActor.fields.email,\n actorId: () => StudioActor.fields.id,\n actorName: () => StudioActor.fields.name,\n actorRoles: () => StudioActor.fields.roles,\n details: () => Schema.JsonObject,\n id: () => ActivityId,\n occurredAt: () => Schema.DateTimeUtcFromString,\n requestId: () => RequestId,\n targetKind: () => ActivityTargetKind,\n}\n\nexport const ActivityEntrySelect = createSelectSchema(activityEntries, refinements)\n\nexport const ActivityEntryInsert = createInsertSchema(activityEntries, refinements)\n","import { isDeepStrictEqual } from 'node:util'\nimport { PgClient } from '@effect/sql-pg'\nimport type { ActivityEntry as ActivityEntryType } from '@internal/protocol/Activity'\nimport type { ActivityStoreApi, ActivityStorePage } from '@internal/server/adapter/ActivityStore'\nimport { ActivityEntry, ActivityTarget } from '@internal/protocol/Activity'\nimport { ActivityUnavailable } from '@internal/server/adapter/ActivityStore'\nimport { and, count, desc, eq, lt, or } from 'drizzle-orm'\nimport * as PgDrizzle from 'drizzle-orm/effect-postgres'\nimport { Result, DateTime, Effect, Layer, Schema } from 'effect'\nimport { ActivityStore } from '@internal/server/adapter/ActivityStore'\nimport { ActivityEntrySelect } from './row-schema'\nimport { activityEntries } from './tables'\n\nconst isActivityUnavailable = Schema.is(ActivityUnavailable)\n\nexport const postgresActivityStoreLayer: Layer.Layer<ActivityStore, never, PgClient.PgClient> = Layer.effect(\n ActivityStore,\n Effect.gen(function* () {\n const database = yield* PgDrizzle.makeWithDefaults()\n\n const append: ActivityStoreApi['append'] = Effect.fn('ActivityStore.Postgres.append')((entry) =>\n Effect.gen(function* () {\n const rows = yield* database.insert(activityEntries).values(activityEntryValues(entry)).returning()\n const row = rows[0]\n\n if (!row) return yield* unavailable('ActivityStore.Postgres.append', new Error('No row returned.'))\n\n return yield* decodeActivityEntry(row)\n }).pipe(mapUnavailable('ActivityStore.Postgres.append')),\n )\n\n const list: ActivityStoreApi['list'] = Effect.fn('ActivityStore.Postgres.list')((query) =>\n database\n .transaction(\n (transaction) =>\n Effect.gen(function* () {\n const filters = and(\n query.action === undefined ? undefined : eq(activityEntries.action, query.action),\n query.actorId === undefined ? undefined : eq(activityEntries.actorId, query.actorId),\n query.requestId === undefined ? undefined : eq(activityEntries.requestId, query.requestId),\n query.targetId === undefined ? undefined : eq(activityEntries.targetId, query.targetId),\n query.targetKind === undefined ? undefined : eq(activityEntries.targetKind, query.targetKind),\n )\n\n const cursor = query.cursor\n ? or(\n lt(activityEntries.occurredAt, DateTime.formatIso(query.cursor.occurredAt)),\n and(\n eq(activityEntries.occurredAt, DateTime.formatIso(query.cursor.occurredAt)),\n lt(activityEntries.id, query.cursor.id),\n ),\n )\n : undefined\n\n const rows = yield* transaction\n .select()\n .from(activityEntries)\n .where(and(filters, cursor))\n .orderBy(desc(activityEntries.occurredAt), desc(activityEntries.id))\n .limit(query.limit + 1)\n\n const totals = yield* transaction.select({ value: count() }).from(activityEntries).where(filters)\n const total = totals[0]?.value\n\n if (total === undefined) {\n return yield* unavailable('ActivityStore.Postgres.list', new Error('No total returned.'))\n }\n\n return activityPage(yield* Effect.forEach(rows, decodeActivityEntry), query.limit, total)\n }),\n { accessMode: 'read only', isolationLevel: 'repeatable read' },\n )\n .pipe(mapUnavailable('ActivityStore.Postgres.list')),\n )\n\n return ActivityStore.of({ append, list })\n }),\n)\n\nexport const decodeActivityEntry = Effect.fn('ActivityStore.Postgres.decode')(function* (\n input: typeof activityEntries.$inferSelect,\n) {\n const row = yield* Schema.decodeEffect(ActivityEntrySelect)(input).pipe(\n Effect.mapError((cause) => activityUnavailable('ActivityStore.Postgres.decode', cause)),\n )\n\n const target = yield* decodeActivityTarget(row.targetKind, row.targetId).pipe(\n Effect.mapError((cause) => activityUnavailable('ActivityStore.Postgres.decodeTarget', cause)),\n )\n\n const entry = {\n action: row.action,\n actor: { email: row.actorEmail, id: row.actorId, name: row.actorName, roles: row.actorRoles },\n details: row.details,\n id: row.id,\n occurredAt: row.occurredAt,\n requestId: row.requestId,\n target,\n }\n\n return row.reason === null ? ActivityEntry.make(entry) : ActivityEntry.make({ ...entry, reason: row.reason })\n})\n\nexport function activityEntryValues(entry: ActivityEntryType): typeof activityEntries.$inferInsert {\n return {\n action: entry.action,\n actorEmail: entry.actor.email,\n actorId: entry.actor.id,\n actorName: entry.actor.name,\n actorRoles: entry.actor.roles,\n details: entry.details,\n id: entry.id,\n occurredAt: DateTime.formatIso(entry.occurredAt),\n reason: entry.reason,\n requestId: entry.requestId,\n targetId: activityTargetId(entry),\n targetKind: entry.target.kind,\n }\n}\n\nexport function activityEntriesEqual(left: ActivityEntryType, right: ActivityEntryType): boolean {\n return isDeepStrictEqual(\n Result.getOrThrow(Schema.encodeResult(ActivityEntry)(left)),\n Result.getOrThrow(Schema.encodeResult(ActivityEntry)(right)),\n )\n}\n\nexport function decodeActivityTarget(kind: ActivityEntryType['target']['kind'], id: string | null) {\n if (kind === 'document') return Schema.decodeUnknownEffect(ActivityTarget)({ documentId: id, kind })\n\n if (kind === 'media') return Schema.decodeUnknownEffect(ActivityTarget)({ kind, mediaId: id })\n\n if (kind === 'user') return Schema.decodeUnknownEffect(ActivityTarget)({ kind, userId: id })\n\n return Schema.decodeEffect(ActivityTarget)({ kind })\n}\n\nfunction activityTargetId(entry: ActivityEntryType): string | undefined {\n switch (entry.target.kind) {\n case 'document':\n return entry.target.documentId\n case 'media':\n return entry.target.mediaId\n case 'user':\n return entry.target.userId\n case 'media-library':\n case 'seo':\n return undefined\n }\n}\n\nfunction activityPage(entries: ReadonlyArray<ActivityEntryType>, limit: number, total: number): ActivityStorePage {\n const page = entries.slice(0, limit)\n const last = page.at(-1)\n\n return {\n entries: page,\n next: entries.length > limit && last ? { id: last.id, occurredAt: last.occurredAt } : undefined,\n total,\n }\n}\n\nfunction mapUnavailable(operation: string) {\n return <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, ActivityUnavailable, R> =>\n effect.pipe(\n Effect.mapError((cause) => (isActivityUnavailable(cause) ? cause : activityUnavailable(operation, cause))),\n )\n}\n\nfunction unavailable(operation: string, cause: unknown): Effect.Effect<never, ActivityUnavailable> {\n return Effect.fail(activityUnavailable(operation, cause))\n}\n\nfunction activityUnavailable(operation: string, cause: unknown): ActivityUnavailable {\n return new ActivityUnavailable({ cause, operation })\n}\n","import type { Schema } from 'effect'\nimport { ACTIVITY_ACTIONS } from '@internal/protocol/Activity'\nimport { sql } from 'drizzle-orm'\nimport { check, index, jsonb, pgTable, text, timestamp, uniqueIndex, uuid } from 'drizzle-orm/pg-core'\nimport { ACTIVITY_TARGET_KINDS, activityEntries, IDENTIFIED_ACTIVITY_TARGET_KINDS } from '../activity/tables'\nimport { isOneOf, transactionTimestamp } from '../database/table-helpers'\n\nconst CHANGE_SCOPES = ['initialization', 'media', 'users'] as const\n\nexport const pendingChanges = pgTable(\n 'pending_changes',\n {\n id: uuid().primaryKey(),\n action: text({ enum: ACTIVITY_ACTIONS }).notNull(),\n subject: text().notNull(),\n scope: text({ enum: CHANGE_SCOPES }).notNull(),\n actorId: text('actor_id').notNull(),\n actorEmail: text('actor_email').notNull(),\n actorName: text('actor_name').notNull(),\n actorRoles: jsonb('actor_roles').$type<ReadonlyArray<string>>().notNull(),\n requestId: uuid('request_id').notNull(),\n reason: text(),\n targetKind: text('target_kind', { enum: ACTIVITY_TARGET_KINDS }),\n targetId: text('target_id'),\n intent: jsonb().$type<Schema.JsonObject>().notNull(),\n fingerprint: text().notNull(),\n createdAt: timestamp('created_at', { mode: 'string', withTimezone: true }).default(transactionTimestamp).notNull(),\n updatedAt: timestamp('updated_at', { mode: 'string', withTimezone: true }).default(transactionTimestamp).notNull(),\n },\n (table) => [\n check('pending_changes_action_check', isOneOf(table.action, ACTIVITY_ACTIONS)),\n check('pending_changes_scope_check', isOneOf(table.scope, CHANGE_SCOPES)),\n check(\n 'pending_changes_subject_check',\n sql`char_length(${table.subject}) between 1 and 1024 AND btrim(${table.subject}) = ${table.subject}`,\n ),\n check('pending_changes_actor_roles_check', sql`jsonb_typeof(${table.actorRoles}) = 'array'`),\n check('pending_changes_intent_check', sql`jsonb_typeof(${table.intent}) = 'object'`),\n check(\n 'pending_changes_target_check',\n sql`(${table.targetKind} IS NULL AND ${table.targetId} IS NULL)\n OR (${table.targetKind} = 'media-library' AND ${table.targetId} IS NULL)\n OR (${isOneOf(table.targetKind, IDENTIFIED_ACTIVITY_TARGET_KINDS)}\n AND ${table.targetId} IS NOT NULL)`,\n ),\n uniqueIndex('pending_changes_subject').on(table.subject),\n index('pending_changes_recovery').on(table.scope, table.updatedAt, table.id),\n ],\n)\n\nexport const changeReceipts = pgTable(\n 'change_receipts',\n {\n changeId: uuid('change_id').primaryKey(),\n fingerprint: text().notNull(),\n outcome: text({ enum: ['applied', 'cancelled'] }).notNull(),\n activityId: uuid('activity_id')\n .unique()\n .references(() => activityEntries.id, { onDelete: 'restrict' }),\n completedAt: timestamp('completed_at', { mode: 'string', withTimezone: true })\n .default(transactionTimestamp)\n .notNull(),\n },\n (table) => [\n check(\n 'change_receipts_outcome_check',\n sql`(${table.outcome} = 'applied' AND ${table.activityId} IS NOT NULL)\n OR (${table.outcome} = 'cancelled' AND ${table.activityId} IS NULL)`,\n ),\n index('change_receipts_activity').on(table.activityId),\n ],\n)\n","import { ActivityAction, ActivityTargetKind } from '@internal/protocol/Activity'\nimport { ActivityId } from '@internal/protocol/Activity'\nimport { StudioActor } from '@internal/protocol/AccessControl'\nimport { RequestId } from '@internal/protocol/Identity'\nimport { createSelectSchema } from 'drizzle-orm/effect-schema'\nimport { Schema } from 'effect'\nimport { ChangeScope, ChangeSubject } from '@internal/server/adapter/ChangeJournal'\nimport { pendingChanges } from './tables'\n\nconst pendingRefinements = {\n action: () => ActivityAction,\n actorEmail: () => StudioActor.fields.email,\n actorId: () => StudioActor.fields.id,\n actorName: () => StudioActor.fields.name,\n actorRoles: () => StudioActor.fields.roles,\n createdAt: () => Schema.DateTimeUtcFromString,\n fingerprint: () => Schema.NonEmptyString,\n id: () => ActivityId,\n intent: () => Schema.JsonObject,\n requestId: () => RequestId,\n scope: () => ChangeScope,\n subject: () => ChangeSubject,\n targetKind: () => Schema.NullOr(ActivityTargetKind),\n updatedAt: () => Schema.DateTimeUtcFromString,\n}\n\nexport const PendingChangeSelect = createSelectSchema(pendingChanges, pendingRefinements)\n","import { isDeepStrictEqual } from 'node:util'\nimport { PgClient } from '@effect/sql-pg'\nimport type { ActivityEntry } from '@internal/protocol/Activity'\nimport { ActivityEntryDraft } from '@internal/protocol/Activity'\nimport { and, asc, count, eq, lte } from 'drizzle-orm'\nimport type { EmptyRelations } from 'drizzle-orm'\nimport * as PgDrizzle from 'drizzle-orm/effect-postgres'\nimport { Result, DateTime, Effect, Layer, Schema } from 'effect'\nimport { activityEntryFromDraft } from '@internal/server/adapter/ActivityStore'\nimport {\n activityEntriesEqual,\n activityEntryValues,\n decodeActivityEntry,\n decodeActivityTarget,\n} from '../activity/activity-storage'\nimport { activityEntries } from '../activity/tables'\nimport { ChangeDraft, PendingChange, changeFingerprint } from '@internal/server/adapter/ChangeJournal'\nimport type { ChangeSubject, PendingChange as PendingChangeType } from '@internal/server/adapter/ChangeJournal'\nimport {\n ChangeBegin,\n ChangeConflict,\n ChangeJournal,\n ChangeJournalUnavailable,\n ChangeMismatch,\n type ChangeJournalApi,\n type ChangeResolution,\n} from '@internal/server/adapter/ChangeJournal'\nimport { PendingChangeSelect } from './row-schema'\nimport { changeReceipts, pendingChanges } from './tables'\n\nexport type ChangeTransaction = PgDrizzle.EffectPgTransaction<PgDrizzle.EffectPgQueryResultHKT, EmptyRelations>\n\nexport type ChangeReader = Pick<PgDrizzle.EffectPgDatabase, 'select'>\n\nconst isConflict = Schema.is(ChangeConflict)\n\nconst isMismatch = Schema.is(ChangeMismatch)\n\nconst isUnavailable = Schema.is(ChangeJournalUnavailable)\n\nexport const changeJournalLayer: Layer.Layer<ChangeJournal, never, PgClient.PgClient> = Layer.effect(\n ChangeJournal,\n Effect.gen(function* () {\n const database = yield* PgDrizzle.makeWithDefaults()\n\n const begin: ChangeJournalApi['begin'] = Effect.fn('ChangeJournal.Postgres.begin')((draft) =>\n database\n .transaction((transaction) => beginChange(transaction, draft))\n .pipe(mapFailure('ChangeJournal.Postgres.begin')),\n )\n\n const pending: ChangeJournalApi['pending'] = Effect.fn('ChangeJournal.Postgres.pending')((query) =>\n database\n .transaction(\n (transaction) =>\n Effect.gen(function* () {\n const predicate = and(\n query.scope === undefined ? undefined : eq(pendingChanges.scope, query.scope),\n query.subject === undefined ? undefined : eq(pendingChanges.subject, query.subject),\n query.before === undefined\n ? undefined\n : lte(pendingChanges.updatedAt, DateTime.formatIso(query.before)),\n )\n\n const rows = yield* transaction\n .select()\n .from(pendingChanges)\n .where(predicate)\n .orderBy(asc(pendingChanges.updatedAt), asc(pendingChanges.id))\n .limit(boundedLimit(query.limit))\n\n const totals = yield* transaction.select({ value: count() }).from(pendingChanges).where(predicate)\n const total = totals[0]?.value\n\n if (total === undefined) {\n return yield* unavailable('ChangeJournal.Postgres.pending', new Error('No total returned.'))\n }\n\n return { changes: yield* Effect.forEach(rows, decodePendingChange), total }\n }),\n { accessMode: 'read only', isolationLevel: 'repeatable read' },\n )\n .pipe(mapFailure('ChangeJournal.Postgres.pending')),\n )\n\n const resolve: ChangeJournalApi['resolve'] = Effect.fn('ChangeJournal.Postgres.resolve')((change, resolution) =>\n database\n .transaction((transaction) => resolveChange(transaction, change, resolution))\n .pipe(mapFailure('ChangeJournal.Postgres.resolve')),\n )\n\n return ChangeJournal.of({ begin, pending, resolve })\n }),\n)\n\nexport const beginChange = Effect.fn('ChangeJournal.Postgres.beginIn')(function* (\n transaction: ChangeTransaction,\n input: ChangeDraft,\n) {\n const draft = yield* Schema.decodeEffect(ChangeDraft)(input).pipe(\n Effect.mapError((cause) => changeJournalUnavailable('ChangeJournal.Postgres.beginIn', cause)),\n )\n\n const resolvedBefore = yield* recordedResolution(transaction, draft.id)\n\n if (resolvedBefore) return yield* resolvedBegin(draft, resolvedBefore)\n\n const rows = yield* transaction.insert(pendingChanges).values(changeValues(draft)).onConflictDoNothing().returning()\n const resolvedAfter = yield* recordedResolution(transaction, draft.id)\n\n if (resolvedAfter) {\n if (rows[0]) yield* transaction.delete(pendingChanges).where(eq(pendingChanges.id, draft.id))\n\n return yield* resolvedBegin(draft, resolvedAfter)\n }\n\n if (rows[0]) return ChangeBegin.Unresolved({ change: yield* decodePendingChange(rows[0]) })\n\n const byId = yield* pendingChangeById(transaction, draft.id)\n\n if (byId) {\n if (draftEqual(byId, draft)) return ChangeBegin.Unresolved({ change: byId })\n\n return yield* new ChangeMismatch({ changeId: draft.id })\n }\n\n const bySubject = yield* pendingChangeBySubject(transaction, draft.subject)\n\n if (bySubject) return yield* new ChangeConflict({ changeId: draft.id, pendingChangeId: bySubject.id })\n\n return yield* unavailable(\n 'ChangeJournal.Postgres.beginIn',\n new Error('The pending-change insert conflicted without durable evidence.'),\n )\n}, mapFailure('ChangeJournal.Postgres.beginIn'))\n\nexport const resolveChange = Effect.fn('ChangeJournal.Postgres.resolveIn')(function* (\n transaction: ChangeTransaction,\n change: PendingChangeType,\n resolution: ChangeResolution,\n) {\n const stored = yield* lockedPendingChangeById(transaction, change.id)\n\n if (stored && !changeEqual(stored, change)) return yield* new ChangeMismatch({ changeId: change.id })\n const receipt = stored ? undefined : yield* recordedResolution(transaction, change.id)\n const fingerprint = changeFingerprint(change)\n\n if (resolution.kind === 'cancelled') {\n if (receipt) {\n if (receipt.kind !== 'cancelled' || receipt.fingerprint !== fingerprint) {\n return yield* new ChangeMismatch({ changeId: change.id })\n }\n\n return\n }\n\n if (!stored) return yield* new ChangeMismatch({ changeId: change.id })\n\n const insertedReceipts = yield* transaction\n .insert(changeReceipts)\n .values({ activityId: null, changeId: change.id, fingerprint, outcome: 'cancelled' })\n .onConflictDoNothing()\n .returning({ changeId: changeReceipts.changeId })\n\n if (!insertedReceipts[0]) return yield* new ChangeMismatch({ changeId: change.id })\n\n const deleted = yield* transaction\n .delete(pendingChanges)\n .where(eq(pendingChanges.id, stored.id))\n .returning({ id: pendingChanges.id })\n\n if (!deleted[0]) return yield* new ChangeMismatch({ changeId: stored.id })\n\n return\n }\n\n if (!stored && !receipt) return yield* new ChangeMismatch({ changeId: change.id })\n const target = resolution.target ?? change.target\n\n if (!target) return yield* new ChangeMismatch({ changeId: change.id })\n\n const occurredAt =\n resolution.occurredAt ??\n (receipt?.kind === 'applied' ? receipt.entry.occurredAt : undefined) ??\n (yield* DateTime.now)\n\n const expected = activityEntryFromDraft(\n change.id,\n ActivityEntryDraft.make({\n action: change.action,\n context: change.context,\n details: resolution.details,\n target,\n }),\n occurredAt,\n )\n\n if (receipt) {\n if (\n receipt.kind !== 'applied' ||\n receipt.fingerprint !== fingerprint ||\n !activityEntriesEqual(receipt.entry, expected)\n ) {\n return yield* new ChangeMismatch({ changeId: change.id })\n }\n\n return receipt.entry\n }\n\n const insertedEntries = yield* transaction\n .insert(activityEntries)\n .values(activityEntryValues(expected))\n .onConflictDoNothing()\n .returning()\n\n if (!insertedEntries[0]) return yield* new ChangeMismatch({ changeId: change.id })\n\n const entry = yield* decodeActivityEntry(insertedEntries[0]).pipe(\n Effect.mapError((cause) => changeJournalUnavailable('ChangeJournal.Postgres.resolveIn', cause)),\n )\n\n const insertedReceipts = yield* transaction\n .insert(changeReceipts)\n .values({ activityId: entry.id, changeId: change.id, fingerprint, outcome: 'applied' })\n .onConflictDoNothing()\n .returning({ changeId: changeReceipts.changeId })\n\n if (!insertedReceipts[0]) return yield* new ChangeMismatch({ changeId: change.id })\n\n const deleted = yield* transaction\n .delete(pendingChanges)\n .where(eq(pendingChanges.id, change.id))\n .returning({ id: pendingChanges.id })\n\n if (!deleted[0]) return yield* new ChangeMismatch({ changeId: change.id })\n\n return entry\n}, mapFailure('ChangeJournal.Postgres.resolveIn'))\n\nconst pendingChangeBySubject = Effect.fn('ChangeJournal.Postgres.bySubject')(function* (\n database: ChangeReader,\n subject: ChangeSubject,\n) {\n const rows = yield* database.select().from(pendingChanges).where(eq(pendingChanges.subject, subject)).limit(1)\n\n return rows[0] ? yield* decodePendingChange(rows[0]) : undefined\n}, mapFailure('ChangeJournal.Postgres.bySubject'))\n\nexport const requirePendingChange = Effect.fn('ChangeJournal.Postgres.require')(function* (\n database: ChangeReader,\n subject: ChangeSubject,\n action: PendingChangeType['action'],\n) {\n const change = yield* pendingChangeBySubject(database, subject)\n\n if (!change || change.action !== action) return yield* new ChangeMismatch(change ? { changeId: change.id } : {})\n\n return change\n}, mapFailure('ChangeJournal.Postgres.require'))\n\nconst decodePendingChange = Effect.fn('ChangeJournal.Postgres.decode')(function* (\n input: typeof pendingChanges.$inferSelect,\n) {\n const row = yield* Schema.decodeEffect(PendingChangeSelect)(input).pipe(\n Effect.mapError((cause) => changeJournalUnavailable('ChangeJournal.Postgres.decode', cause)),\n )\n\n const target = yield* decodeOptionalTarget(row.targetKind, row.targetId)\n\n const value = {\n action: row.action,\n context: {\n actor: { email: row.actorEmail, id: row.actorId, name: row.actorName, roles: row.actorRoles },\n requestId: row.requestId,\n },\n createdAt: row.createdAt,\n id: row.id,\n intent: row.intent,\n scope: row.scope,\n subject: row.subject,\n updatedAt: row.updatedAt,\n }\n\n return PendingChange.make(\n Object.assign(\n value,\n row.reason === null ? undefined : { context: { ...value.context, reason: row.reason } },\n target === undefined ? undefined : { target },\n ),\n )\n})\n\nfunction changeValues(draft: ChangeDraft): typeof pendingChanges.$inferInsert {\n const target = targetColumns(draft.target)\n\n return {\n action: draft.action,\n actorEmail: draft.context.actor.email,\n actorId: draft.context.actor.id,\n actorName: draft.context.actor.name,\n actorRoles: draft.context.actor.roles,\n fingerprint: changeFingerprint(draft),\n id: draft.id,\n intent: draft.intent,\n reason: draft.context.reason,\n requestId: draft.context.requestId,\n scope: draft.scope,\n subject: draft.subject,\n ...target,\n }\n}\n\nconst pendingChangeById = Effect.fn('ChangeJournal.Postgres.byId')(function* (\n database: ChangeReader,\n id: PendingChangeType['id'],\n) {\n const rows = yield* database.select().from(pendingChanges).where(eq(pendingChanges.id, id)).limit(1)\n\n return rows[0] ? yield* decodePendingChange(rows[0]) : undefined\n})\n\nconst lockedPendingChangeById = Effect.fn('ChangeJournal.Postgres.lockById')(function* (\n transaction: ChangeTransaction,\n id: PendingChangeType['id'],\n) {\n const rows = yield* transaction.select().from(pendingChanges).where(eq(pendingChanges.id, id)).limit(1).for('update')\n\n return rows[0] ? yield* decodePendingChange(rows[0]) : undefined\n})\n\ntype RecordedResolution =\n | { readonly fingerprint: string; readonly kind: 'applied'; readonly entry: ActivityEntry }\n | { readonly fingerprint: string; readonly kind: 'cancelled' }\n\nconst recordedResolution = Effect.fn('ChangeJournal.Postgres.resolved')(function* (\n database: ChangeReader,\n id: PendingChangeType['id'],\n) {\n const receipts = yield* database.select().from(changeReceipts).where(eq(changeReceipts.changeId, id)).limit(1)\n const receipt = receipts[0]\n\n if (!receipt) return undefined\n\n if (receipt.outcome === 'cancelled') {\n if (receipt.activityId !== null) return yield* new ChangeMismatch({ changeId: id })\n\n return { fingerprint: receipt.fingerprint, kind: 'cancelled' } satisfies RecordedResolution\n }\n\n if (receipt.activityId === null) return yield* new ChangeMismatch({ changeId: id })\n\n const entries = yield* database\n .select()\n .from(activityEntries)\n .where(eq(activityEntries.id, receipt.activityId))\n .limit(1)\n\n if (!entries[0]) return yield* new ChangeMismatch({ changeId: id })\n\n return {\n entry: yield* decodeActivityEntry(entries[0]),\n fingerprint: receipt.fingerprint,\n kind: 'applied',\n } satisfies RecordedResolution\n})\n\nconst resolvedBegin = Effect.fn('ChangeJournal.Postgres.resolvedBegin')(function* (\n draft: ChangeDraft,\n resolution: RecordedResolution,\n) {\n if (resolution.fingerprint !== changeFingerprint(draft)) return yield* new ChangeMismatch({ changeId: draft.id })\n\n return resolution.kind === 'applied'\n ? ChangeBegin.Recorded({ entry: resolution.entry })\n : ChangeBegin.Cancelled({ changeId: draft.id })\n})\n\ninterface ChangeTargetColumns {\n readonly targetId?: string\n readonly targetKind?: ActivityEntry['target']['kind']\n}\n\nfunction targetColumns(target: ChangeDraft['target']): ChangeTargetColumns {\n if (!target) return {}\n\n switch (target.kind) {\n case 'document':\n return { targetId: target.documentId, targetKind: target.kind }\n case 'media':\n return { targetId: target.mediaId, targetKind: target.kind }\n case 'user':\n return { targetId: target.userId, targetKind: target.kind }\n case 'media-library':\n case 'seo':\n return { targetKind: target.kind }\n }\n}\n\nfunction decodeOptionalTarget(kind: ActivityEntry['target']['kind'] | null, id: string | null) {\n if (kind === null) {\n return id === null ? Effect.void : Effect.fail(new ChangeMismatch({}))\n }\n\n return decodeActivityTarget(kind, id).pipe(Effect.mapError(() => new ChangeMismatch({})))\n}\n\nfunction draftEqual(change: PendingChangeType, draft: ChangeDraft): boolean {\n return isDeepStrictEqual(\n Result.getOrThrow(Schema.encodeResult(ChangeDraft)(draftFromChange(change))),\n Result.getOrThrow(Schema.encodeResult(ChangeDraft)(draft)),\n )\n}\n\nfunction draftFromChange(change: PendingChangeType): ChangeDraft {\n const value = {\n action: change.action,\n context: change.context,\n id: change.id,\n intent: change.intent,\n scope: change.scope,\n subject: change.subject,\n }\n\n return ChangeDraft.make(change.target === undefined ? value : { ...value, target: change.target })\n}\n\nfunction changeEqual(left: PendingChangeType, right: PendingChangeType): boolean {\n return isDeepStrictEqual(\n Result.getOrThrow(Schema.encodeResult(PendingChange)(left)),\n Result.getOrThrow(Schema.encodeResult(PendingChange)(right)),\n )\n}\n\nfunction boundedLimit(limit: number): number {\n return Math.min(100, Math.max(0, Math.trunc(limit)))\n}\n\nfunction mapFailure(operation: string) {\n return <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n effect.pipe(\n Effect.mapError((cause) =>\n isConflict(cause) || isMismatch(cause) || isUnavailable(cause)\n ? cause\n : changeJournalUnavailable(operation, cause),\n ),\n )\n}\n\nfunction unavailable(operation: string, cause: unknown) {\n return Effect.fail(changeJournalUnavailable(operation, cause))\n}\n\nfunction changeJournalUnavailable(operation: string, cause: unknown): ChangeJournalUnavailable {\n return new ChangeJournalUnavailable({ cause, operation })\n}\n","import type { DocumentCommitPlan } from '@internal/server/adapter/DocumentStore'\nimport type { ActivityContext } from '@internal/protocol/Activity'\nimport type { DocumentId, SourcePath } from '@internal/protocol/Documents'\nimport type { EmptyRelations } from 'drizzle-orm'\nimport type * as PgDrizzle from 'drizzle-orm/effect-postgres'\nimport { DocumentPersistenceError } from '@internal/server/adapter/DocumentStore'\nimport { DocumentPathConflict } from '@internal/protocol/Documents'\nimport { eq } from 'drizzle-orm'\nimport { EffectDrizzleQueryError } from 'drizzle-orm/effect-core'\nimport { Effect, Predicate, Schema } from 'effect'\nimport * as Cause from 'effect/Cause'\nimport * as Option from 'effect/Option'\nimport * as SqlError from 'effect/unstable/sql/SqlError'\nimport { transactionTimestamp } from '../database/table-helpers'\nimport { documentsTable, documentHeads, documentRevisions } from './tables'\n\ntype DocumentTransaction = PgDrizzle.EffectPgTransaction<PgDrizzle.EffectPgQueryResultHKT, EmptyRelations>\n\nconst isEffectDrizzleQueryError = Schema.is(EffectDrizzleQueryError)\n\nexport const applyDocumentCommitPlan = Effect.fn('DocumentStore.Drizzle.applyCommitPlan')(function* (\n transaction: DocumentTransaction,\n plan: DocumentCommitPlan,\n activity: ActivityContext,\n) {\n switch (plan.action) {\n case 'document.create': {\n yield* transaction\n .insert(documentsTable)\n .values({\n id: plan.documentId,\n sourcePath: plan.sourcePath,\n })\n .pipe(mapActivePathConflict(plan.sourcePath))\n const revisionId = yield* appendRevision(transaction, plan, activity)\n yield* transaction.insert(documentHeads).values({\n authoredRevisionId: revisionId,\n documentId: plan.documentId,\n publishedRevisionId: plan.publish ? revisionId : null,\n })\n\n return\n }\n\n case 'document.update': {\n const revisionId = yield* appendRevision(transaction, plan, activity)\n yield* updateAuthoredHead(transaction, plan.documentId, revisionId)\n\n if (plan.publish)\n yield* transaction\n .update(documentHeads)\n .set({ publishedRevisionId: revisionId })\n .where(eq(documentHeads.documentId, plan.documentId))\n yield* touchDocument(transaction, plan.documentId)\n\n return\n }\n\n case 'document.move': {\n const revisionId = yield* appendRevision(transaction, plan, activity)\n yield* transaction\n .update(documentsTable)\n .set({\n sourcePath: plan.sourcePath,\n updatedAt: transactionTimestamp,\n })\n .where(eq(documentsTable.id, plan.documentId))\n .pipe(mapActivePathConflict(plan.sourcePath))\n yield* updateAuthoredHead(transaction, plan.documentId, revisionId)\n\n return\n }\n\n case 'document.remove': {\n const metadata: Record<string, Schema.Json> = {}\n\n if (plan.trashBatchId) metadata.trashBatchId = plan.trashBatchId\n\n if (plan.title) metadata.title = plan.title\n\n if (plan.path) metadata.path = plan.path\n const revisionId = yield* appendRevision(transaction, plan, activity, metadata)\n yield* transaction\n .update(documentsTable)\n .set({\n deletedAt: transactionTimestamp,\n updatedAt: transactionTimestamp,\n })\n .where(eq(documentsTable.id, plan.documentId))\n yield* transaction\n .update(documentHeads)\n .set({ authoredRevisionId: revisionId, publishedRevisionId: null })\n .where(eq(documentHeads.documentId, plan.documentId))\n\n return\n }\n\n case 'document.restore': {\n const revisionId = yield* appendRevision(transaction, plan, activity, { restoredFromRevisionId: plan.revisionId })\n yield* updateAuthoredHead(transaction, plan.documentId, revisionId)\n yield* touchDocument(transaction, plan.documentId)\n\n return\n }\n\n case 'document.undelete': {\n const revisionId = yield* appendRevision(transaction, plan, activity)\n yield* transaction\n .update(documentsTable)\n .set({ deletedAt: null, updatedAt: transactionTimestamp })\n .where(eq(documentsTable.id, plan.documentId))\n .pipe(mapActivePathConflict(plan.sourcePath))\n yield* transaction\n .update(documentHeads)\n .set({ authoredRevisionId: revisionId, publishedRevisionId: null })\n .where(eq(documentHeads.documentId, plan.documentId))\n\n return\n }\n\n case 'document.unpublish': {\n yield* transaction\n .update(documentHeads)\n .set({ publishedRevisionId: null })\n .where(eq(documentHeads.documentId, plan.documentId))\n\n return\n }\n\n case 'document.publish': {\n yield* transaction\n .update(documentHeads)\n .set({ publishedRevisionId: plan.revisionId })\n .where(eq(documentHeads.documentId, plan.documentId))\n\n return\n }\n }\n})\n\ninterface RevisionInput {\n readonly action: Exclude<DocumentCommitPlan['action'], 'document.publish' | 'document.unpublish'>\n readonly documentId: DocumentId\n readonly markdown: string\n readonly sourcePath: SourcePath\n}\n\nconst appendRevision = Effect.fn('DocumentStore.Drizzle.appendRevision')(function* (\n transaction: DocumentTransaction,\n input: RevisionInput,\n activity: ActivityContext,\n metadata: Schema.JsonObject = {},\n) {\n const rows = yield* transaction\n .insert(documentRevisions)\n .values({\n action: input.action,\n documentId: input.documentId,\n markdown: input.markdown,\n sourcePath: input.sourcePath,\n actorEmail: activity.actor.email,\n actorId: activity.actor.id,\n actorName: activity.actor.name,\n actorRoles: activity.actor.roles,\n activityDetails: metadata,\n reason: activity.reason,\n requestId: activity.requestId,\n })\n .returning({ revisionId: documentRevisions.id })\n\n const row = rows[0]\n\n if (!row) {\n return yield* new DocumentPersistenceError({\n cause: new Error(`Appending \"${input.action}\" did not return a revision.`),\n operation: 'DocumentStore.Drizzle.appendRevision',\n })\n }\n\n return row.revisionId\n})\n\nfunction mapActivePathConflict(sourcePath: SourcePath) {\n return <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E | DocumentPathConflict, R> =>\n effect.pipe(\n Effect.mapError((error) => {\n if (!isEffectDrizzleQueryError(error) || !Cause.isCause(error.cause)) return error\n const causeError = Cause.findErrorOption(error.cause)\n\n if (Option.isNone(causeError) || !SqlError.isSqlError(causeError.value)) return error\n const reason = causeError.value.reason\n\n return Predicate.isTagged('UniqueViolation')(reason) && reason.constraint === 'documents_active_path'\n ? new DocumentPathConflict({ sourcePath })\n : error\n }),\n )\n}\n\nfunction updateAuthoredHead(transaction: DocumentTransaction, documentId: DocumentId, revisionId: string) {\n return transaction\n .update(documentHeads)\n .set({ authoredRevisionId: revisionId })\n .where(eq(documentHeads.documentId, documentId))\n}\n\nfunction touchDocument(transaction: DocumentTransaction, documentId: DocumentId) {\n return transaction\n .update(documentsTable)\n .set({ updatedAt: transactionTimestamp })\n .where(eq(documentsTable.id, documentId))\n}\n","import type { ActivityAction } from '@internal/protocol/Activity'\nimport type { DocumentCommitPlan } from '@internal/server/adapter/DocumentStore'\n\nexport function activityActionForDocumentPlan(action: DocumentCommitPlan['action']): ActivityAction {\n switch (action) {\n case 'document.create':\n return 'document.created'\n case 'document.update':\n return 'document.updated'\n case 'document.move':\n return 'document.moved'\n case 'document.remove':\n return 'document.trashed'\n case 'document.restore':\n return 'document.revision.restored'\n case 'document.undelete':\n return 'document.untrashed'\n case 'document.unpublish':\n return 'document.unpublished'\n case 'document.publish':\n return 'document.published'\n }\n}\n","import { DocumentRevisionAction } from '@internal/protocol/Documents'\nimport { DocumentId, RevisionId, SourcePath } from '@internal/protocol/Documents'\nimport { StudioActor } from '@internal/protocol/AccessControl'\nimport { RequestId } from '@internal/protocol/Identity'\nimport { MediaReference } from '@internal/protocol/Media'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-orm/effect-schema'\nimport { Schema } from 'effect'\nimport { cmsState, documentsTable, documentHeads, documentMediaReferences, documentRevisions } from './tables'\n\nconst documentRefinements = {\n id: () => DocumentId,\n sourcePath: () => SourcePath,\n}\n\nconst revisionRefinements = {\n action: () => DocumentRevisionAction,\n actorEmail: () => StudioActor.fields.email,\n actorId: () => StudioActor.fields.id,\n actorName: () => StudioActor.fields.name,\n actorRoles: () => StudioActor.fields.roles,\n activityDetails: () => Schema.JsonObject,\n documentId: () => DocumentId,\n id: () => RevisionId,\n requestId: () => RequestId,\n sourcePath: () => SourcePath,\n}\n\nconst headRefinements = {\n authoredRevisionId: () => RevisionId,\n documentId: () => DocumentId,\n publishedRevisionId: () => RevisionId,\n}\n\nconst timestampRefinements = {\n createdAt: () => Schema.DateTimeUtcFromString,\n deletedAt: () => Schema.DateTimeUtcFromString,\n updatedAt: () => Schema.DateTimeUtcFromString,\n}\n\nconst stateRefinements = {\n generation: () => Schema.BigInt.check(Schema.isGreaterThanOrEqualToBigInt(0n)),\n singleton: () => Schema.Literal(true),\n}\n\nexport const CmsStateSelect = createSelectSchema(cmsState, stateRefinements)\n\nexport const DocumentSelect = createSelectSchema(documentsTable, {\n ...documentRefinements,\n ...timestampRefinements,\n})\n\nexport const DocumentInsert = createInsertSchema(documentsTable, documentRefinements)\n\nexport const DocumentRevisionSelect = createSelectSchema(documentRevisions, {\n ...revisionRefinements,\n createdAt: timestampRefinements.createdAt,\n})\n\nexport const DocumentHeadSelect = createSelectSchema(documentHeads, headRefinements)\n\nconst mediaReferenceRefinements = {\n documentId: () => MediaReference.fields.documentId,\n id: () => Schema.String.check(Schema.isUUID()),\n nodePath: () => MediaReference.fields.nodePath,\n objectKey: () => MediaReference.fields.objectKey,\n path: () => MediaReference.fields.path,\n sourcePath: () => MediaReference.fields.sourcePath,\n}\n\nexport const DocumentMediaReferenceSelect = createSelectSchema(documentMediaReferences, mediaReferenceRefinements)\n\nexport const DocumentMediaReferenceInsert = createInsertSchema(documentMediaReferences, mediaReferenceRefinements)\n","import type { DeletedDocumentSource, DocumentStoreSnapshot } from '@internal/server/adapter/DocumentStore'\nimport type { DocumentSource as DocumentSourceType } from '@internal/protocol/Documents'\nimport { DocumentPersistenceError } from '@internal/server/adapter/DocumentStore'\nimport { ActivityEntry } from '@internal/protocol/Activity'\nimport { DocumentRevision, DocumentSource, DeletedDocument } from '@internal/protocol/Documents'\nimport { ActivityId } from '@internal/protocol/Activity'\nimport { DocumentGeneration, DocumentVersion } from '@internal/protocol/Documents'\nimport { Effect, Schema } from 'effect'\nimport { activityActionForDocumentPlan } from './document-activity'\nimport { DocumentHeadSelect, DocumentRevisionSelect, DocumentSelect } from './row-schema'\n\nconst DocumentSnapshotRow = Schema.Struct({\n authored: Schema.NullOr(DocumentRevisionSelect),\n created: Schema.optionalKey(Schema.NullOr(DocumentRevisionSelect)),\n document: DocumentSelect,\n head: Schema.NullOr(DocumentHeadSelect),\n published: Schema.NullOr(DocumentRevisionSelect),\n})\n\nconst DocumentSnapshotRows = Schema.Array(DocumentSnapshotRow)\n\ninterface DocumentSnapshotRow extends Schema.Schema.Type<typeof DocumentSnapshotRow> {}\n\nexport const decodeDocumentSnapshot = Effect.fn('DocumentStore.Drizzle.decodeSnapshot')(function* (\n input: typeof DocumentSnapshotRows.Encoded,\n generation: bigint,\n) {\n const rows = yield* Schema.decodeEffect(DocumentSnapshotRows)(input).pipe(\n Effect.mapError((cause) => documentPersistenceError('DocumentStore.Drizzle.decodeSnapshot', cause)),\n )\n\n const active: Array<DocumentSourceType> = []\n const deleted: Array<DeletedDocumentSource> = []\n const published: Array<DocumentSourceType> = []\n const documentIds = new Set<string>()\n\n for (const row of rows) {\n if (row.head === null || row.authored === null) {\n return yield* documentPersistenceError(\n 'DocumentStore.Drizzle.decodeSnapshot',\n new Error(`Documents persistence head is missing for document \"${row.document.id}\".`),\n )\n }\n\n if (documentIds.has(row.document.id)) {\n return yield* documentPersistenceError(\n 'DocumentStore.Drizzle.decodeSnapshot',\n new Error(`Documents persistence returned duplicate document \"${row.document.id}\".`),\n )\n }\n\n documentIds.add(row.document.id)\n yield* validateSnapshotRow(row.document, row.head, row.authored, row.published)\n\n const authored = Object.assign(\n {},\n sourceRecord(row.authored, row.head.publishedRevisionId ?? undefined),\n row.created ? { createdBy: revisionActor(row.created) } : undefined,\n )\n\n if (row.document.deletedAt === null) {\n active.push(authored)\n\n if (row.published) published.push(sourceRecord(row.published, row.published.id))\n } else {\n const details = yield* Schema.decodeEffect(\n Schema.Struct({\n title: DeletedDocument.fields.title,\n path: DeletedDocument.fields.path,\n trashBatchId: DeletedDocument.fields.trashBatchId,\n }),\n )(row.authored.activityDetails).pipe(\n Effect.mapError((cause) => documentPersistenceError('DocumentStore.decodeTrash', cause)),\n )\n\n deleted.push(Object.assign({}, authored, details, { deletedAt: row.document.deletedAt }))\n }\n }\n\n active.sort(compareSources)\n deleted.sort(compareSources)\n published.sort(compareSources)\n\n return {\n active,\n deleted,\n generation: DocumentGeneration.make(String(generation)),\n published,\n } satisfies DocumentStoreSnapshot\n})\n\nexport const decodeDocumentRevision: (\n input: typeof DocumentRevisionSelect.Encoded,\n) => Effect.Effect<DocumentRevision, DocumentPersistenceError> = Effect.fn('DocumentStore.Drizzle.decodeRevision')(\n function* (input) {\n const revision = yield* Schema.decodeEffect(DocumentRevisionSelect)(input).pipe(\n Effect.mapError((cause) => documentPersistenceError('DocumentStore.Drizzle.decodeRevision', cause)),\n )\n\n const activityEntry = {\n action: activityActionForDocumentPlan(revision.action),\n actor: {\n email: revision.actorEmail,\n id: revision.actorId,\n name: revision.actorName,\n roles: revision.actorRoles,\n },\n id: ActivityId.make(revision.id),\n details: Object.assign(\n {\n revisionId: revision.id,\n sourcePath: revision.sourcePath,\n version: revision.id,\n },\n revision.activityDetails,\n ),\n occurredAt: revision.createdAt,\n requestId: revision.requestId,\n target: { documentId: revision.documentId, kind: 'document' as const },\n }\n\n const activity =\n revision.reason === null\n ? ActivityEntry.make(activityEntry)\n : ActivityEntry.make({ ...activityEntry, reason: revision.reason })\n\n return DocumentRevision.make({\n action: revision.action,\n activity,\n createdAt: revision.createdAt,\n documentId: revision.documentId,\n markdown: revision.markdown,\n revisionId: revision.id,\n sourcePath: revision.sourcePath,\n version: DocumentVersion.make(revision.id),\n })\n },\n)\n\nfunction validateSnapshotRow(\n document: DocumentSnapshotRow['document'],\n head: NonNullable<DocumentSnapshotRow['head']>,\n authored: NonNullable<DocumentSnapshotRow['authored']>,\n published: DocumentSnapshotRow['published'],\n): Effect.Effect<void, DocumentPersistenceError> {\n const publishedRevisionId = head.publishedRevisionId\n\n const invalid =\n document.id !== head.documentId ||\n document.id !== authored.documentId ||\n document.sourcePath !== authored.sourcePath ||\n head.authoredRevisionId !== authored.id ||\n (publishedRevisionId === null) !== (published === null) ||\n (published !== null && (published.documentId !== document.id || published.id !== publishedRevisionId)) ||\n (document.deletedAt !== null && published !== null) ||\n (document.deletedAt === null && authored.action === 'document.remove') ||\n (document.deletedAt !== null && authored.action !== 'document.remove')\n\n return invalid\n ? Effect.fail(\n documentPersistenceError(\n 'DocumentStore.Drizzle.decodeSnapshot',\n new Error(`Documents persistence joins are inconsistent for document \"${document.id}\".`),\n ),\n )\n : Effect.void\n}\n\nfunction sourceRecord(\n revision: NonNullable<DocumentSnapshotRow['authored']>,\n publishedRevisionId?: NonNullable<DocumentSnapshotRow['head']>['publishedRevisionId'],\n): DocumentSourceType {\n const record = {\n editedAt: revision.createdAt,\n editedBy: revisionActor(revision),\n documentId: revision.documentId,\n markdown: revision.markdown,\n revisionId: revision.id,\n sourcePath: revision.sourcePath,\n version: DocumentVersion.make(revision.id),\n }\n\n return DocumentSource.make(\n Object.assign(\n record,\n publishedRevisionId === undefined || publishedRevisionId === null\n ? undefined\n : { publishedVersion: DocumentVersion.make(publishedRevisionId) },\n ),\n )\n}\n\nfunction compareSources(left: DocumentSourceType, right: DocumentSourceType): number {\n const byPath = left.sourcePath.localeCompare(right.sourcePath)\n\n return byPath === 0 ? left.documentId.localeCompare(right.documentId) : byPath\n}\n\nexport function documentPersistenceError(operation: string, cause: unknown): DocumentPersistenceError {\n return new DocumentPersistenceError({ cause, operation })\n}\n\nfunction revisionActor(revision: NonNullable<DocumentSnapshotRow['authored']>) {\n return { id: revision.actorId, name: revision.actorName, email: revision.actorEmail, roles: revision.actorRoles }\n}\n","import type { MediaObjectKey } from '@internal/protocol/Media'\nimport type { EmptyRelations } from 'drizzle-orm'\nimport { sql } from 'drizzle-orm'\nimport * as PgDrizzle from 'drizzle-orm/effect-postgres'\nimport { Effect } from 'effect'\n\nconst MEDIA_REFERENCE_LOCK_NAMESPACE = 'cms:media-reference:v1:'\n\nexport type MediaReferenceTransaction = PgDrizzle.EffectPgTransaction<PgDrizzle.EffectPgQueryResultHKT, EmptyRelations>\n\n/** Returns one locale-independent advisory-lock order for every replica. */\nexport function orderMediaReferenceKeys(objectKeys: ReadonlyArray<MediaObjectKey>): ReadonlyArray<MediaObjectKey> {\n return [...new Set(objectKeys)].sort((left, right) => (left < right ? -1 : left > right ? 1 : 0))\n}\n\n/** Acquires the shared per-object-key transaction fence in deterministic order. */\nexport const lockMediaReferenceKeys = Effect.fn('Database.lockMediaReferenceKeys')(function* (\n transaction: MediaReferenceTransaction,\n objectKeys: ReadonlyArray<MediaObjectKey>,\n) {\n const ordered = orderMediaReferenceKeys(objectKeys)\n yield* Effect.forEach(\n ordered,\n (objectKey) =>\n transaction.execute(\n sql`SELECT pg_advisory_xact_lock(hashtextextended(${MEDIA_REFERENCE_LOCK_NAMESPACE} || ${objectKey}, 0))`,\n ),\n { discard: true },\n )\n})\n","import type { SQLWrapper } from 'drizzle-orm'\nimport { sql } from 'drizzle-orm'\nimport { bigint, boolean, check, index, pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core'\nimport { isOneOf, transactionTimestamp } from '../database/table-helpers'\n\nconst MEDIA_ASSET_STATUSES = ['uploading', 'ready', 'deleting'] as const\n\nexport const MEDIA_MIME_TYPES = ['image/avif', 'image/gif', 'image/jpeg', 'image/png', 'image/webp'] as const\n\nexport const mediaAssets = pgTable(\n 'media_assets',\n {\n id: uuid().primaryKey(),\n objectKey: text('object_key').notNull().unique(),\n name: text().notNull(),\n folder: text().default('').notNull(),\n mimeType: text('mime_type', { enum: MEDIA_MIME_TYPES }).notNull(),\n byteSize: bigint('byte_size', { mode: 'number' }).notNull(),\n status: text({ enum: MEDIA_ASSET_STATUSES }).default('uploading').notNull(),\n createdAt: timestamp('created_at', { mode: 'string', withTimezone: true }).default(transactionTimestamp).notNull(),\n updatedAt: timestamp('updated_at', { mode: 'string', withTimezone: true }).default(transactionTimestamp).notNull(),\n },\n (table) => [\n check('media_assets_byte_size_check', validMediaByteSize(table.byteSize)),\n check('media_assets_mime_type_check', isOneOf(table.mimeType, MEDIA_MIME_TYPES)),\n check('media_assets_status_check', isOneOf(table.status, MEDIA_ASSET_STATUSES)),\n check('media_assets_name_check', validMediaName(table.name)),\n check('media_assets_folder_check', validMediaFolder(table.folder)),\n check('media_assets_object_key_check', validMediaObjectKey(table.objectKey)),\n index('media_assets_catalog')\n .on(table.createdAt.desc(), table.id.desc())\n .where(sql`${table.status} = 'ready'`),\n index('media_assets_folder')\n .on(table.folder, table.createdAt.desc(), table.id.desc())\n .where(sql`${table.status} = 'ready'`),\n index('media_assets_recovery')\n .on(table.updatedAt, table.id)\n .where(sql`${table.status} <> 'ready'`),\n ],\n)\n\nexport const mediaReplacements = pgTable(\n 'media_replacements',\n {\n mediaId: uuid('media_id')\n .primaryKey()\n .references(() => mediaAssets.id, { onDelete: 'restrict' }),\n objectKey: text('object_key').notNull(),\n stagingObjectKey: text('staging_object_key').notNull().unique(),\n name: text().notNull(),\n folder: text().notNull(),\n mimeType: text('mime_type', { enum: MEDIA_MIME_TYPES }).notNull(),\n byteSize: bigint('byte_size', { mode: 'number' }).notNull(),\n staged: boolean().default(false).notNull(),\n createdAt: timestamp('created_at', { mode: 'string', withTimezone: true }).default(transactionTimestamp).notNull(),\n updatedAt: timestamp('updated_at', { mode: 'string', withTimezone: true }).default(transactionTimestamp).notNull(),\n },\n (table) => [\n check('media_replacements_byte_size_check', validMediaByteSize(table.byteSize)),\n check('media_replacements_mime_type_check', isOneOf(table.mimeType, MEDIA_MIME_TYPES)),\n check('media_replacements_name_check', validMediaName(table.name)),\n check('media_replacements_folder_check', validMediaFolder(table.folder)),\n check('media_replacements_object_key_check', validMediaObjectKey(table.objectKey)),\n check(\n 'media_replacements_staging_object_key_check',\n sql`${table.stagingObjectKey} ~ '^media/replacements/[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\\\\.(avif|gif|jpg|png|webp)$'`,\n ),\n check('media_replacements_distinct_object_keys_check', sql`${table.stagingObjectKey} <> ${table.objectKey}`),\n index('media_replacements_recovery').on(table.updatedAt, table.mediaId),\n ],\n)\n\nfunction validMediaByteSize(column: SQLWrapper) {\n return sql`${column} > 0 AND ${column} <= 9007199254740991`\n}\n\nfunction validMediaName(column: SQLWrapper) {\n return sql`char_length(${column}) between 1 and 255\n AND btrim(${column}) = ${column}\n AND ${column} not in ('.', '..')\n AND ${column} !~ '[[:cntrl:]/]'\n AND position(chr(92) in ${column}) = 0`\n}\n\nfunction validMediaFolder(column: SQLWrapper) {\n return sql`char_length(${column}) <= 512\n AND btrim(${column}) = ${column}\n AND ${column} !~ '(^/|/$|//|(^|/)\\\\.{1,2}(/|$)|[[:cntrl:]])'\n AND position(chr(92) in ${column}) = 0`\n}\n\nfunction validMediaObjectKey(column: SQLWrapper) {\n return sql`${column} ~ '^media/[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\\\\.(avif|gif|jpg|png|webp)$'`\n}\n","import { PgClient } from '@effect/sql-pg'\nimport type {\n DocumentStoreApi,\n DocumentCommitPlan,\n DocumentStoreError,\n DocumentStoreHistoryPage,\n DocumentStoreSnapshot,\n} from '@internal/server/adapter/DocumentStore'\nimport type { ActivityContext } from '@internal/protocol/Activity'\nimport type { DocumentRevision } from '@internal/protocol/Documents'\nimport type { DocumentId } from '@internal/protocol/Documents'\nimport type { MediaReference } from '@internal/protocol/Media'\nimport {\n DocumentGenerationConflict,\n DocumentPersistenceError,\n DocumentStore,\n} from '@internal/server/adapter/DocumentStore'\nimport { ActivityContext as ActivityContextSchema } from '@internal/protocol/Activity'\nimport {\n DocumentMediaUnavailable,\n DocumentMutationResult,\n DocumentNotFound,\n DocumentPathConflict,\n DocumentVersionConflict,\n} from '@internal/protocol/Documents'\nimport { DocumentGeneration } from '@internal/protocol/Documents'\nimport { RequestId } from '@internal/protocol/Identity'\nimport { MediaObjectKey as MediaObjectKeySchema } from '@internal/protocol/Media'\nimport { and, count, desc, eq, inArray, lt, or, sql } from 'drizzle-orm'\nimport * as PgDrizzle from 'drizzle-orm/effect-postgres'\nimport { alias } from 'drizzle-orm/pg-core'\nimport { DateTime, Effect, Layer, Schema } from 'effect'\nimport { applyDocumentCommitPlan } from './commands'\nimport { activityActionForDocumentPlan } from './document-activity'\nimport { decodeDocumentRevision, decodeDocumentSnapshot, documentPersistenceError } from './records'\nimport { CmsStateSelect } from './row-schema'\nimport { lockMediaReferenceKeys, type MediaReferenceTransaction } from '../database/media-reference-lock'\nimport { activityEntries } from '../activity/tables'\nimport { mediaAssets } from '../media/tables'\nimport { cmsState, documentsTable, documentHeads, documentMediaReferences, documentRevisions } from './tables'\n\nconst authoredRevision = alias(documentRevisions, 'authored_revision')\n\nconst createdRevision = alias(documentRevisions, 'created_revision')\n\nconst publishedRevision = alias(documentRevisions, 'published_revision')\n\nconst RepositoryDomainError = Schema.Union([\n DocumentGenerationConflict,\n DocumentMediaUnavailable,\n DocumentNotFound,\n DocumentPathConflict,\n DocumentPersistenceError,\n DocumentVersionConflict,\n])\n\nconst isRepositoryDomainError = Schema.is(RepositoryDomainError)\n\nconst isDocumentNotFound = Schema.is(DocumentNotFound)\n\nconst isDocumentMediaUnavailable = Schema.is(DocumentMediaUnavailable)\n\nconst isDocumentPersistenceError = Schema.is(DocumentPersistenceError)\n\nconst systemActivity = ActivityContextSchema.make({\n actor: { email: 'system@cms.invalid', id: 'system', name: 'CMS System', roles: ['system'] },\n requestId: RequestId.make('00000000-0000-4000-8000-000000000000'),\n})\n\ntype SnapshotReader = Pick<PgDrizzle.EffectPgDatabase, 'select'>\n\ntype DocumentActivityWriter = Pick<PgDrizzle.EffectPgDatabase, 'insert'>\n\nexport const documentStoreLayer: Layer.Layer<DocumentStore, never, PgClient.PgClient> = Layer.effect(\n DocumentStore,\n Effect.gen(function* () {\n const database = yield* PgDrizzle.makeWithDefaults()\n\n const commit: DocumentStoreApi['commit'] = Effect.fn('DocumentStore.Drizzle.commit')((input) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n const stateRows = yield* transaction\n .update(cmsState)\n .set({ generation: sql`${cmsState.generation} + 1` })\n .where(and(eq(cmsState.singleton, true), eq(cmsState.generation, BigInt(input.expectedGeneration))))\n .returning()\n\n const stateRow = stateRows[0]\n\n if (!stateRow) {\n const actualGeneration = yield* readGeneration(transaction)\n\n return yield* new DocumentGenerationConflict({\n actualGeneration: DocumentGeneration.make(String(actualGeneration)),\n expectedGeneration: input.expectedGeneration,\n })\n }\n\n const state = yield* Schema.decodeUnknownEffect(CmsStateSelect)(stateRow)\n const plans = [input.plan, ...(input.additionalPlans ?? [])]\n\n const references = plans.flatMap((plan) =>\n input.mediaReferences.filter((reference) => reference.documentId === plan.documentId),\n )\n\n if (references.length !== input.mediaReferences.length)\n return yield* persistenceFailure('DocumentStore.commit', new Error('Unexpected media reference owner.'))\n yield* lockMediaReferenceKeys(\n transaction,\n references.map((reference) => reference.objectKey),\n )\n yield* rejectUnavailableMedia(transaction, references)\n const activity = input.activity ?? systemActivity\n\n for (const plan of plans) {\n yield* applyDocumentCommitPlan(transaction, plan, activity)\n yield* replaceDocumentMediaReferences(\n transaction,\n plan.documentId,\n references.filter((reference) => reference.documentId === plan.documentId),\n )\n }\n\n const snapshot = yield* readSnapshot(transaction, state.generation)\n\n for (const plan of plans) {\n const affected = yield* sourceForMutation(snapshot, plan.documentId, plan.action === 'document.remove')\n yield* recordDocumentActivity(transaction, affected, plan, activity)\n }\n\n const source = yield* sourceForMutation(\n snapshot,\n input.plan.documentId,\n input.plan.action === 'document.remove',\n )\n\n return {\n mutation: DocumentMutationResult.make({\n action: input.plan.action,\n affectedDocumentIds: plans.map((plan) => plan.documentId),\n documentId: source.documentId,\n generation: snapshot.generation,\n revisionId: source.revisionId,\n sourcePath: source.sourcePath,\n version: source.version,\n }),\n snapshot,\n }\n }),\n )\n .pipe(mapCommitFailure('DocumentStore.Drizzle.commit')),\n )\n\n const load: DocumentStoreApi['load'] = Effect.fn('DocumentStore.Drizzle.load')((after) =>\n database\n .transaction(\n (transaction) =>\n Effect.gen(function* () {\n const generation = yield* readGeneration(transaction)\n\n if (after === generation.toString()) return undefined\n\n return yield* readSnapshot(transaction, generation)\n }),\n { accessMode: 'read only', isolationLevel: 'repeatable read' },\n )\n .pipe(mapPersistenceFailure('DocumentStore.Drizzle.load')),\n )\n\n const synchronizeMediaReferences: DocumentStoreApi['synchronizeMediaReferences'] = Effect.fn(\n 'DocumentStore.Drizzle.synchronizeMediaReferences',\n )((input) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n const stateRows = yield* transaction\n .select()\n .from(cmsState)\n .where(eq(cmsState.singleton, true))\n .limit(2)\n .for('update')\n\n const stateRow = stateRows[0]\n\n if (stateRows.length !== 1 || !stateRow) {\n return yield* persistenceFailure(\n 'DocumentStore.Drizzle.synchronizeMediaReferences',\n new Error(`Expected exactly one document generation row; received ${stateRows.length}.`),\n )\n }\n\n const state = yield* Schema.decodeUnknownEffect(CmsStateSelect)(stateRow)\n\n if (state.generation.toString() !== input.expectedGeneration) {\n return yield* new DocumentGenerationConflict({\n actualGeneration: DocumentGeneration.make(String(state.generation)),\n expectedGeneration: input.expectedGeneration,\n })\n }\n\n const references = uniqueMediaReferences(input.references)\n yield* lockMediaReferenceKeys(\n transaction,\n references.map((reference) => reference.objectKey),\n )\n yield* rejectUnavailableMedia(transaction, references)\n yield* transaction.delete(documentMediaReferences)\n\n if (references.length > 0) {\n yield* transaction.insert(documentMediaReferences).values(references.map(referenceValues))\n }\n }),\n )\n .pipe(mapSynchronizationFailure('DocumentStore.Drizzle.synchronizeMediaReferences')),\n )\n\n const revision: DocumentStoreApi['revision'] = Effect.fn('DocumentStore.Drizzle.revision')(\n (documentId, revisionId) =>\n Effect.gen(function* () {\n const rows = yield* database\n .select()\n .from(documentRevisions)\n .where(and(eq(documentRevisions.documentId, documentId), eq(documentRevisions.id, revisionId)))\n .limit(1)\n\n const row = rows[0]\n\n if (!row) return yield* new DocumentNotFound({ documentId, revisionId })\n\n return yield* decodeDocumentRevision(row)\n }).pipe(mapRevisionFailure('DocumentStore.Drizzle.revision')),\n )\n\n const revisions: DocumentStoreApi['revisions'] = Effect.fn('DocumentStore.Drizzle.revisions')((query) =>\n database\n .transaction(\n (transaction) =>\n Effect.gen(function* () {\n const cursor = query.cursor\n ? or(\n lt(documentRevisions.createdAt, DateTime.formatIso(query.cursor.createdAt)),\n and(\n eq(documentRevisions.createdAt, DateTime.formatIso(query.cursor.createdAt)),\n lt(documentRevisions.id, query.cursor.revisionId),\n ),\n )\n : undefined\n\n const rows = yield* transaction\n .select()\n .from(documentRevisions)\n .where(and(eq(documentRevisions.documentId, query.documentId), cursor))\n .orderBy(desc(documentRevisions.createdAt), desc(documentRevisions.id))\n .limit(query.limit + 1)\n\n const totals = yield* transaction\n .select({ value: count() })\n .from(documentRevisions)\n .where(eq(documentRevisions.documentId, query.documentId))\n\n const total = totals[0]?.value\n\n if (total === undefined) {\n return yield* persistenceFailure(\n 'DocumentStore.Drizzle.revisions',\n new Error('Documents persistence did not return a history total.'),\n )\n }\n\n const decoded = yield* Effect.forEach(rows, decodeDocumentRevision)\n\n return revisionPage(decoded, query.limit, total)\n }),\n { accessMode: 'read only', isolationLevel: 'repeatable read' },\n )\n .pipe(mapPersistenceFailure('DocumentStore.Drizzle.revisions')),\n )\n\n return DocumentStore.of({ commit, load, revision, revisions, synchronizeMediaReferences })\n }),\n)\n\nfunction revisionPage(\n revisions: ReadonlyArray<DocumentRevision>,\n limit: number,\n total: number,\n): DocumentStoreHistoryPage {\n const page = revisions.slice(0, limit)\n const last = page.at(-1)\n\n return {\n next: revisions.length > limit && last ? { createdAt: last.createdAt, revisionId: last.revisionId } : undefined,\n revisions: page,\n total,\n }\n}\n\nconst recordDocumentActivity = Effect.fn('DocumentStore.Drizzle.recordActivity')(function* (\n database: DocumentActivityWriter,\n source: DocumentStoreSnapshot['active'][number],\n plan: DocumentCommitPlan,\n activity: ActivityContext,\n) {\n const details: Schema.JsonObject = Object.assign(\n {\n revisionId: source.revisionId,\n sourcePath: source.sourcePath,\n version: source.version,\n },\n plan.action === 'document.restore' ? { restoredFromRevisionId: plan.revisionId } : undefined,\n )\n\n const values: typeof activityEntries.$inferInsert = {\n action: activityActionForDocumentPlan(plan.action),\n actorEmail: activity.actor.email,\n actorId: activity.actor.id,\n actorName: activity.actor.name,\n actorRoles: activity.actor.roles,\n details,\n reason: activity.reason,\n requestId: activity.requestId,\n targetId: source.documentId,\n targetKind: 'document',\n }\n\n if (plan.action !== 'document.publish' && plan.action !== 'document.unpublish') values.id = source.revisionId\n yield* database.insert(activityEntries).values(values)\n\n if ((plan.action === 'document.create' || plan.action === 'document.update') && plan.publish)\n yield* database.insert(activityEntries).values({ ...values, action: 'document.published', id: undefined })\n})\n\nconst readSnapshot = Effect.fn('DocumentStore.Drizzle.readSnapshot')(function* (\n database: SnapshotReader,\n generation: bigint,\n) {\n const rows = yield* database\n .select({\n authored: authoredRevision,\n created: createdRevision,\n document: documentsTable,\n head: documentHeads,\n published: publishedRevision,\n })\n .from(documentsTable)\n .leftJoin(\n createdRevision,\n and(eq(createdRevision.documentId, documentsTable.id), eq(createdRevision.action, 'document.create')),\n )\n .leftJoin(documentHeads, eq(documentHeads.documentId, documentsTable.id))\n .leftJoin(\n authoredRevision,\n and(\n eq(authoredRevision.documentId, documentHeads.documentId),\n eq(authoredRevision.id, documentHeads.authoredRevisionId),\n ),\n )\n .leftJoin(\n publishedRevision,\n and(\n eq(publishedRevision.documentId, documentHeads.documentId),\n eq(publishedRevision.id, documentHeads.publishedRevisionId),\n ),\n )\n\n return yield* decodeDocumentSnapshot(rows, generation)\n})\n\nconst readGeneration = Effect.fn('DocumentStore.Drizzle.readGeneration')(function* (database: SnapshotReader) {\n const rows = yield* database.select().from(cmsState)\n const row = rows[0]\n\n if (rows.length !== 1 || !row) {\n return yield* persistenceFailure(\n 'DocumentStore.Drizzle.readGeneration',\n new Error(`Expected exactly one document generation row; received ${rows.length}.`),\n )\n }\n\n return (yield* Schema.decodeUnknownEffect(CmsStateSelect)(row)).generation\n})\n\nconst sourceForMutation = Effect.fn('DocumentStore.Drizzle.sourceForMutation')(function* (\n snapshot: DocumentStoreSnapshot,\n documentId: DocumentStoreSnapshot['active'][number]['documentId'],\n deleted: boolean,\n) {\n const sources = deleted ? snapshot.deleted : snapshot.active\n const source = sources.find((candidate) => candidate.documentId === documentId)\n\n if (!source) {\n return yield* persistenceFailure(\n 'DocumentStore.Drizzle.sourceForMutation',\n new Error(`Committed document \"${documentId}\" is missing from its resulting snapshot.`),\n )\n }\n\n return source\n})\n\nfunction mapCommitFailure(operation: string) {\n return <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, DocumentStoreError, R> =>\n effect.pipe(\n Effect.mapError((cause) => (isRepositoryDomainError(cause) ? cause : documentPersistenceError(operation, cause))),\n )\n}\n\nfunction mapSynchronizationFailure(operation: string) {\n return <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n ): Effect.Effect<A, DocumentGenerationConflict | DocumentMediaUnavailable | DocumentPersistenceError, R> =>\n effect.pipe(\n Effect.mapError((cause) => {\n if (\n isDocumentMediaUnavailable(cause) ||\n isDocumentPersistenceError(cause) ||\n Schema.is(DocumentGenerationConflict)(cause)\n ) {\n return cause\n }\n\n return documentPersistenceError(operation, cause)\n }),\n )\n}\n\nconst rejectUnavailableMedia = Effect.fn('DocumentStore.Drizzle.rejectUnavailableMedia')(function* (\n transaction: MediaReferenceTransaction,\n references: ReadonlyArray<MediaReference>,\n) {\n const keys = [...new Set(references.map((reference) => reference.objectKey))]\n const mediaIds = [...new Set(references.flatMap((reference) => (reference.mediaId ? [reference.mediaId] : [])))]\n\n if (keys.length === 0) return\n\n if (mediaIds.length > 0) {\n const identityRows = yield* transaction\n .select({ objectKey: mediaAssets.objectKey })\n .from(mediaAssets)\n .where(inArray(mediaAssets.id, mediaIds))\n\n yield* lockMediaReferenceKeys(\n transaction,\n yield* Schema.decodeEffect(Schema.Array(MediaObjectKeySchema))(identityRows.map((row) => row.objectKey)),\n )\n }\n\n const rows = yield* transaction\n .select({ id: mediaAssets.id, objectKey: mediaAssets.objectKey, status: mediaAssets.status })\n .from(mediaAssets)\n .where(\n mediaIds.length > 0\n ? or(inArray(mediaAssets.objectKey, keys), inArray(mediaAssets.id, mediaIds))\n : inArray(mediaAssets.objectKey, keys),\n )\n\n const deletingKeys = new Set(\n yield* Schema.decodeEffect(Schema.Array(MediaObjectKeySchema))(\n rows.filter((row) => row.status === 'deleting').map((row) => row.objectKey),\n ),\n )\n\n const unavailable = references.filter((reference) => {\n if (!reference.mediaId) return deletingKeys.has(reference.objectKey)\n const asset = rows.find((row) => row.id === reference.mediaId)\n\n return !asset || asset.status !== 'ready' || asset.objectKey !== reference.objectKey\n })\n\n if (unavailable.length === 0) return\n\n const affected = unavailable.sort((left, right) =>\n left.documentId === right.documentId\n ? left.objectKey.localeCompare(right.objectKey)\n : left.documentId.localeCompare(right.documentId),\n )\n\n const first = affected[0]\n\n if (!first) return\n\n return yield* new DocumentMediaUnavailable({\n documentId: first.documentId,\n mediaKeys: [\n ...new Set(\n affected\n .filter((reference) => reference.documentId === first.documentId)\n .map((reference) => reference.objectKey),\n ),\n ].sort((left, right) => left.localeCompare(right)),\n })\n})\n\nconst replaceDocumentMediaReferences = Effect.fn('DocumentStore.Drizzle.replaceMediaReferences')(function* (\n transaction: MediaReferenceTransaction,\n documentId: DocumentId,\n references: ReadonlyArray<MediaReference>,\n) {\n yield* transaction.delete(documentMediaReferences).where(eq(documentMediaReferences.documentId, documentId))\n\n if (references.length > 0) {\n yield* transaction.insert(documentMediaReferences).values(references.map(referenceValues))\n }\n})\n\nfunction uniqueMediaReferences(references: ReadonlyArray<MediaReference>): ReadonlyArray<MediaReference> {\n return [\n ...new Map(\n references.map((reference) => [\n `${reference.documentId}:${reference.sourcePath}:${reference.nodePath.join('.')}:${reference.objectKey}`,\n reference,\n ]),\n ).values(),\n ]\n}\n\nfunction referenceValues(reference: MediaReference): typeof documentMediaReferences.$inferInsert {\n return {\n documentId: reference.documentId,\n nodePath: [...reference.nodePath],\n objectKey: reference.objectKey,\n path: reference.path,\n sourcePath: reference.sourcePath,\n }\n}\n\nfunction mapPersistenceFailure(operation: string) {\n return <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, DocumentPersistenceError, R> =>\n effect.pipe(\n Effect.mapError((cause) =>\n isDocumentPersistenceError(cause) ? cause : documentPersistenceError(operation, cause),\n ),\n )\n}\n\nfunction mapRevisionFailure(operation: string) {\n return <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, DocumentNotFound | DocumentPersistenceError, R> =>\n effect.pipe(\n Effect.mapError((cause) => {\n if (isDocumentNotFound(cause) || isDocumentPersistenceError(cause)) return cause\n\n return documentPersistenceError(operation, cause)\n }),\n )\n}\n\nfunction persistenceFailure(operation: string, cause: unknown): Effect.Effect<never, DocumentPersistenceError> {\n return Effect.fail(documentPersistenceError(operation, cause))\n}\n","import type { PgPoolConfig } from '@effect/sql-pg/PgClient'\nimport { PgClient } from '@effect/sql-pg'\nimport { Context, Effect, Layer, Schema } from 'effect'\nimport type { SqlError } from 'effect/unstable/sql/SqlError'\n\nconst AdvisoryLockAttempt = Schema.Array(Schema.Tuple([Schema.Boolean]))\n\nconst ADVISORY_LOCK_POLL_INTERVAL = '10 millis'\n\ninterface PostgresAdvisoryLockLease {\n readonly include: <A, E, R>(\n key: string,\n effect: Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | PostgresAdvisoryLockUnavailable, R>\n}\n\nexport interface PostgresAdvisoryLockApi {\n readonly run: <A, E, R>(\n key: string,\n use: (lease: PostgresAdvisoryLockLease) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | PostgresAdvisoryLockUnavailable, R>\n}\n\nexport class PostgresAdvisoryLock extends Context.Service<PostgresAdvisoryLock, PostgresAdvisoryLockApi>()(\n '@internal/sql-pg/PostgresAdvisoryLock',\n) {}\n\nclass PostgresAdvisoryLockUnavailable extends Schema.TaggedError<PostgresAdvisoryLockUnavailable>()(\n 'PostgresAdvisoryLock.Unavailable',\n {\n cause: Schema.Defect(),\n operation: Schema.NonEmptyString,\n },\n) {}\n\nconst serviceLayer: Layer.Layer<PostgresAdvisoryLock, never, PgClient.PgClient> = Layer.effect(\n PostgresAdvisoryLock,\n Effect.gen(function* () {\n const postgres = yield* PgClient.PgClient\n\n const run: PostgresAdvisoryLockApi['run'] = (key, use) =>\n Effect.scoped(\n Effect.gen(function* () {\n const connection = yield* postgres.reserve.pipe(lockUnavailable('PostgresAdvisoryLock.reserve'))\n\n return yield* Effect.uninterruptibleMask((restore) => {\n const held = new Set<string>()\n\n const include: PostgresAdvisoryLockLease['include'] = (includedKey, effect) =>\n Effect.suspend(() => {\n if (held.has(includedKey)) return effect\n\n return Effect.acquireUseRelease(\n Effect.gen(function* () {\n while (true) {\n const raw = yield* connection\n .executeValues('select pg_try_advisory_lock(hashtextextended($1, 0))', [includedKey])\n .pipe(lockUnavailable('PostgresAdvisoryLock.tryAcquire'))\n\n const rows = yield* Schema.decodeUnknownEffect(AdvisoryLockAttempt)(raw).pipe(\n lockUnavailable('PostgresAdvisoryLock.decodeAttempt'),\n )\n\n if (rows[0]?.[0] === true) return\n yield* restore(Effect.sleep(ADVISORY_LOCK_POLL_INTERVAL))\n }\n }).pipe(\n Effect.tap(() =>\n Effect.sync(() => {\n held.add(includedKey)\n }),\n ),\n ),\n () => effect,\n () =>\n Effect.sync(() => {\n held.delete(includedKey)\n }).pipe(\n Effect.andThen(\n connection\n .executeRaw('select pg_advisory_unlock(hashtextextended($1, 0))', [includedKey])\n .pipe(Effect.orDie),\n ),\n ),\n )\n })\n\n const lease: PostgresAdvisoryLockLease = { include }\n\n return include(\n key,\n Effect.suspend(() => use(lease)),\n )\n })\n }),\n )\n\n return PostgresAdvisoryLock.of({ run })\n }),\n)\n\nexport function postgresAdvisoryLockLayer(options: PgPoolConfig): Layer.Layer<PostgresAdvisoryLock, SqlError> {\n const dedicatedPool = PgClient.layer({\n ...options,\n applicationName: '@internal/sql-pg-locks',\n maxConnections: 2,\n minConnections: 0,\n })\n\n return serviceLayer.pipe(Layer.provide(dedicatedPool))\n}\n\nfunction lockUnavailable(operation: string) {\n return <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n effect.pipe(Effect.mapError((cause) => new PostgresAdvisoryLockUnavailable({ cause, operation })))\n}\n","import { PgClient } from '@effect/sql-pg'\nimport { and, eq } from 'drizzle-orm'\nimport * as PgDrizzle from 'drizzle-orm/effect-postgres'\nimport { Result, Effect, Layer, Schema } from 'effect'\nimport type { ActivityId } from '@internal/protocol/Activity'\nimport { PostgresAdvisoryLock } from '../postgres/advisory-lock'\nimport {\n InitializationClaim,\n InitializationStore,\n InitializationUnavailable,\n StoredInitializationState,\n type InitializationStoreApi,\n} from '@internal/server/adapter/InitializationStore'\nimport { initializationState } from './tables'\n\nconst isUnavailable = Schema.is(InitializationUnavailable)\n\nexport const initializationStoreLayer: Layer.Layer<\n InitializationStore,\n never,\n PgClient.PgClient | PostgresAdvisoryLock\n> = Layer.effect(\n InitializationStore,\n Effect.gen(function* () {\n const database = yield* PgDrizzle.makeWithDefaults()\n const locks = yield* PostgresAdvisoryLock\n\n const claim: InitializationStoreApi['claim'] = Effect.fn('InitializationStore.Postgres.claim')((value) =>\n database\n .update(initializationState)\n .set({\n changeId: value.changeId,\n claim: Result.getOrThrow(Schema.encodeResult(InitializationClaim)(value)),\n state: 'claiming',\n })\n .where(and(eq(initializationState.singleton, true), eq(initializationState.state, 'uninitialized')))\n .returning({ singleton: initializationState.singleton })\n .pipe(\n Effect.map((rows) => rows.length === 1),\n mapUnavailable('InitializationStore.Postgres.claim'),\n ),\n )\n\n const complete: InitializationStoreApi['complete'] = Effect.fn('InitializationStore.Postgres.complete')(\n (changeId) => transition(database, changeId, 'ready'),\n )\n\n const read: InitializationStoreApi['read'] = Effect.gen(function* () {\n const rows = yield* database\n .select()\n .from(initializationState)\n .where(eq(initializationState.singleton, true))\n .limit(1)\n\n return yield* decodeState(rows[0])\n }).pipe(Effect.withSpan('InitializationStore.Postgres.read'), mapUnavailable('InitializationStore.Postgres.read'))\n\n const reset: InitializationStoreApi['reset'] = Effect.fn('InitializationStore.Postgres.reset')((changeId) =>\n transition(database, changeId, 'uninitialized'),\n )\n\n const runExclusive: InitializationStoreApi['runExclusive'] = (effect) =>\n locks\n .run('cms:initialization:v1', () => effect)\n .pipe(\n Effect.catchTag('PostgresAdvisoryLock.Unavailable', (cause) =>\n Effect.fail(new InitializationUnavailable({ cause, operation: 'Initialization.lock' })),\n ),\n )\n\n return InitializationStore.of({ claim, complete, read, reset, runExclusive })\n }),\n)\n\nfunction transition(database: PgDrizzle.EffectPgDatabase, changeId: ActivityId, state: 'ready' | 'uninitialized') {\n return database\n .update(initializationState)\n .set({ changeId: null, claim: null, state })\n .where(\n and(\n eq(initializationState.singleton, true),\n eq(initializationState.state, 'claiming'),\n eq(initializationState.changeId, changeId),\n ),\n )\n .returning({ singleton: initializationState.singleton })\n .pipe(\n Effect.flatMap((rows) =>\n rows.length === 1\n ? Effect.void\n : Effect.fail(\n new InitializationUnavailable({\n cause: new Error('Initialization claim changed.'),\n operation: `InitializationStore.Postgres.${state}`,\n }),\n ),\n ),\n mapUnavailable(`InitializationStore.Postgres.${state}`),\n )\n}\n\nfunction decodeState(row: typeof initializationState.$inferSelect | undefined) {\n if (!row) {\n return Effect.fail(\n new InitializationUnavailable({\n cause: new Error('Initialization singleton row is missing.'),\n operation: 'InitializationStore.Postgres.decode',\n }),\n )\n }\n\n if (row.state === 'uninitialized') return Effect.succeed(StoredInitializationState.cases.uninitialized.make({}))\n\n if (row.state === 'ready') return Effect.succeed(StoredInitializationState.cases.ready.make({}))\n\n return Schema.decodeUnknownEffect(InitializationClaim)(row.claim).pipe(\n Effect.mapError(\n (cause) => new InitializationUnavailable({ cause, operation: 'InitializationStore.Postgres.decode' }),\n ),\n Effect.flatMap((claim) =>\n claim.changeId === row.changeId\n ? Effect.succeed(StoredInitializationState.cases.claiming.make({ claim }))\n : Effect.fail(\n new InitializationUnavailable({\n cause: new Error('Initialization claim identity is inconsistent.'),\n operation: 'InitializationStore.Postgres.decode',\n }),\n ),\n ),\n )\n}\n\nfunction mapUnavailable(operation: string) {\n return <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n effect.pipe(\n Effect.mapError((cause) => (isUnavailable(cause) ? cause : new InitializationUnavailable({ cause, operation }))),\n )\n}\n","import type { GlobalSeoSettings } from '@internal/protocol/Seo'\nimport { sql } from 'drizzle-orm'\nimport { boolean, check, foreignKey, index, jsonb, pgTable, text, timestamp, unique, uuid } from 'drizzle-orm/pg-core'\nimport { mediaAssets } from '../media/tables'\nimport { transactionTimestamp } from '../database/table-helpers'\n\nexport const seoRevisions = pgTable(\n 'seo_revisions',\n {\n id: uuid().defaultRandom().primaryKey(),\n settings: jsonb().$type<GlobalSeoSettings>().notNull(),\n actorId: text('actor_id').notNull(),\n actorEmail: text('actor_email').notNull(),\n actorName: text('actor_name').notNull(),\n actorRoles: jsonb('actor_roles').$type<ReadonlyArray<string>>().notNull(),\n requestId: uuid('request_id').notNull(),\n reason: text(),\n createdAt: timestamp('created_at', { mode: 'string', withTimezone: true }).default(transactionTimestamp).notNull(),\n },\n (table) => [\n check('seo_revisions_actor_roles_check', sql`jsonb_typeof(${table.actorRoles}) = 'array'`),\n check('seo_revisions_settings_check', sql`jsonb_typeof(${table.settings}) = 'object'`),\n index('seo_revisions_history').on(table.createdAt.desc(), table.id.desc()),\n ],\n)\n\nexport const seoState = pgTable(\n 'seo_state',\n {\n singleton: boolean().default(true).primaryKey(),\n workingRevisionId: uuid('working_revision_id').notNull(),\n publishedRevisionId: uuid('published_revision_id').notNull(),\n },\n (table) => [\n check('seo_state_singleton_check', sql`${table.singleton}`),\n foreignKey({\n columns: [table.workingRevisionId],\n foreignColumns: [seoRevisions.id],\n name: 'seo_state_working_revision_fkey',\n }).onDelete('restrict'),\n foreignKey({\n columns: [table.publishedRevisionId],\n foreignColumns: [seoRevisions.id],\n name: 'seo_state_published_revision_fkey',\n }).onDelete('restrict'),\n ],\n)\n\nexport const seoMediaReferences = pgTable(\n 'seo_media_references',\n {\n id: uuid().defaultRandom().primaryKey(),\n scope: text({ enum: ['working', 'published'] }).notNull(),\n mediaId: uuid('media_id')\n .notNull()\n .references(() => mediaAssets.id, { onDelete: 'restrict' }),\n },\n (table) => [\n check('seo_media_references_scope_check', sql`${table.scope} in ('working', 'published')`),\n unique('seo_media_references_scope_media_unique').on(table.scope, table.mediaId),\n index('seo_media_references_media').on(table.mediaId),\n ],\n)\n","import {\n ImageMimeType,\n MediaByteSize,\n MediaFolder,\n MediaId,\n MediaName,\n MediaObjectKey,\n MediaStatus,\n} from '@internal/protocol/Media'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-orm/effect-schema'\nimport { Schema } from 'effect'\nimport { mediaAssets, mediaReplacements } from './tables'\n\nconst mediaRefinements = {\n byteSize: () => MediaByteSize.check(Schema.isLessThanOrEqualTo(Number.MAX_SAFE_INTEGER)),\n folder: () => MediaFolder,\n id: () => MediaId,\n mimeType: () => ImageMimeType,\n name: () => MediaName,\n objectKey: () => MediaObjectKey,\n status: () => MediaStatus,\n}\n\nconst timestampRefinements = {\n createdAt: () => Schema.DateTimeUtcFromString,\n updatedAt: () => Schema.DateTimeUtcFromString,\n}\n\nexport const MediaAssetSelect = createSelectSchema(mediaAssets, {\n ...mediaRefinements,\n ...timestampRefinements,\n})\n\nexport const MediaAssetInsert = createInsertSchema(mediaAssets, mediaRefinements)\n\nconst mediaReplacementRefinements = {\n byteSize: mediaRefinements.byteSize,\n folder: mediaRefinements.folder,\n mediaId: mediaRefinements.id,\n mimeType: mediaRefinements.mimeType,\n name: mediaRefinements.name,\n objectKey: mediaRefinements.objectKey,\n stagingObjectKey: mediaRefinements.objectKey,\n}\n\nexport const MediaReplacementSelect = createSelectSchema(mediaReplacements, {\n ...mediaReplacementRefinements,\n ...timestampRefinements,\n})\n","import type { MediaReference } from '@internal/protocol/Media'\nimport { MediaReference as MediaReferenceSchema } from '@internal/protocol/Media'\nimport type { MediaRecord, MediaReplacement } from '@internal/server/adapter/MediaStore'\nimport { MediaPersistenceError } from '@internal/server/adapter/MediaStore'\nimport { Effect, Schema } from 'effect'\nimport { DocumentMediaReferenceSelect } from '../documents/row-schema'\nimport { MediaAssetSelect, MediaReplacementSelect } from './row-schema'\n\nexport const decodeMediaReferences: (\n input: ReadonlyArray<typeof DocumentMediaReferenceSelect.Encoded>,\n) => Effect.Effect<ReadonlyArray<MediaReference>, MediaPersistenceError> = Effect.fn(\n 'MediaStore.Drizzle.decodeReferences',\n)(function* (input) {\n const rows = yield* Schema.decodeEffect(Schema.Array(DocumentMediaReferenceSelect))(input).pipe(\n Effect.mapError((cause) => mediaPersistenceError('MediaStore.Drizzle.decodeReferences', cause)),\n )\n\n return rows.map((row) =>\n MediaReferenceSchema.make({\n documentId: row.documentId,\n nodePath: row.nodePath,\n objectKey: row.objectKey,\n path: row.path,\n sourcePath: row.sourcePath,\n }),\n ) satisfies ReadonlyArray<MediaReference>\n})\n\nexport const decodeMediaRecord: (\n input: typeof MediaAssetSelect.Encoded,\n) => Effect.Effect<MediaRecord, MediaPersistenceError> = Effect.fn('MediaStore.Drizzle.decodeRecord')(\n function* (input) {\n return yield* Schema.decodeEffect(MediaAssetSelect)(input).pipe(\n Effect.mapError((cause) => mediaPersistenceError('MediaStore.Drizzle.decodeRecord', cause)),\n )\n },\n)\n\nexport const decodeMediaReplacement: (\n input: typeof MediaReplacementSelect.Encoded,\n) => Effect.Effect<MediaReplacement, MediaPersistenceError> = Effect.fn('MediaStore.Drizzle.decodeReplacement')(\n function* (input) {\n return yield* Schema.decodeEffect(MediaReplacementSelect)(input).pipe(\n Effect.mapError((cause) => mediaPersistenceError('MediaStore.Drizzle.decodeReplacement', cause)),\n )\n },\n)\n\nexport function mediaPersistenceError(operation: string, cause: unknown): MediaPersistenceError {\n return new MediaPersistenceError({ cause, operation })\n}\n","import { PgClient } from '@effect/sql-pg'\nimport type { MediaRecord, MediaReplacement, MediaStoreApi, MediaStorePage } from '@internal/server/adapter/MediaStore'\nimport { MediaPersistenceError, MediaStore } from '@internal/server/adapter/MediaStore'\nimport type { MediaId } from '@internal/protocol/Media'\nimport { MediaConflict, MediaFolder, MediaNotFound, MediaObjectKey, MediaReferenced } from '@internal/protocol/Media'\nimport { and, asc, count, desc, eq, gt, lt, lte, ne, or, sql } from 'drizzle-orm'\nimport type { EmptyRelations } from 'drizzle-orm'\nimport * as PgDrizzle from 'drizzle-orm/effect-postgres'\nimport { DateTime, Effect, Layer, Option, Schema } from 'effect'\nimport { requireUnresolvedChange } from '@internal/server/adapter/ChangeJournal'\nimport {\n decodeMediaChangeIntent,\n mediaChangeDetails,\n mediaRemovalChange,\n mediaReplacementChange,\n mediaSubject,\n mediaUploadChange,\n} from '@internal/server/adapter/MediaStore'\nimport { beginChange, requirePendingChange, resolveChange } from '../change-journal/change-journal'\nimport { lockMediaReferenceKeys } from '../database/media-reference-lock'\nimport { transactionTimestamp } from '../database/table-helpers'\nimport { documentMediaReferences } from '../documents/tables'\nimport { seoMediaReferences } from '../seo/tables'\nimport { decodeMediaRecord, decodeMediaReferences, decodeMediaReplacement, mediaPersistenceError } from './records'\nimport { mediaAssets, mediaReplacements } from './tables'\n\nconst isMediaPersistenceError = Schema.is(MediaPersistenceError)\n\nconst isMediaConflict = Schema.is(MediaConflict)\n\nconst isMediaNotFound = Schema.is(MediaNotFound)\n\nconst isMediaReferenced = Schema.is(MediaReferenced)\n\nexport const mediaStoreLayer: Layer.Layer<MediaStore, never, PgClient.PgClient> = Layer.effect(\n MediaStore,\n Effect.gen(function* () {\n const database = yield* PgDrizzle.makeWithDefaults()\n\n const reserve: MediaStoreApi['reserve'] = Effect.fn('MediaStore.Drizzle.reserve')((record, operation) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n if (record.status !== 'uploading') {\n return yield* persistenceFailure(\n 'MediaStore.Drizzle.reserve',\n new Error(`A media reservation must start as uploading, received \"${record.status}\".`),\n )\n }\n\n yield* beginChange(transaction, mediaUploadChange(record, operation)).pipe(\n Effect.flatMap(requireUnresolvedChange),\n )\n\n const rows = yield* transaction\n .insert(mediaAssets)\n .values(recordValues(record))\n .onConflictDoNothing()\n .returning()\n\n if (rows[0]) return yield* decodeMediaRecord(rows[0])\n\n const existing = yield* rowById(transaction, record.id)\n\n if (existing && existing.status !== 'deleting' && isSameReservation(existing, record)) return existing\n\n return yield* persistenceFailure(\n 'MediaStore.Drizzle.reserve',\n new Error(`Media reservation \"${record.id}\" conflicts with durable media state.`),\n )\n }),\n )\n .pipe(mapPersistenceFailure('MediaStore.Drizzle.reserve')),\n )\n\n const activate: MediaStoreApi['activate'] = Effect.fn('MediaStore.Drizzle.activate')((id) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n const existing = yield* lockedRowById(transaction, id)\n\n if (existing?.status === 'ready') return existing\n\n if (existing?.status !== 'uploading') {\n return yield* transitionFailure('MediaStore.Drizzle.activate', id, existing?.status)\n }\n\n const change = yield* requirePendingChange(transaction, mediaSubject(id), 'media.uploaded')\n\n const rows = yield* transaction\n .update(mediaAssets)\n .set({ status: 'ready', updatedAt: transactionTimestamp })\n .where(and(eq(mediaAssets.id, id), eq(mediaAssets.status, 'uploading')))\n .returning()\n\n if (!rows[0]) return yield* transitionFailure('MediaStore.Drizzle.activate', id, existing.status)\n const activated = yield* decodeMediaRecord(rows[0])\n const intent = yield* decodeMediaChangeIntent(change)\n yield* resolveChange(transaction, change, { details: mediaChangeDetails(intent), kind: 'applied' })\n\n return activated\n }),\n )\n .pipe(mapPersistenceFailure('MediaStore.Drizzle.activate')),\n )\n\n const find: MediaStoreApi['find'] = Effect.fn('MediaStore.Drizzle.find')((id) =>\n Effect.gen(function* () {\n const rows = yield* database\n .select()\n .from(mediaAssets)\n .where(and(eq(mediaAssets.id, id), eq(mediaAssets.status, 'ready')))\n .limit(1)\n\n return rows[0] ? Option.some(yield* decodeMediaRecord(rows[0])) : Option.none()\n }).pipe(mapPersistenceFailure('MediaStore.Drizzle.find')),\n )\n\n const beginDelete: MediaStoreApi['beginDelete'] = Effect.fn('MediaStore.Drizzle.beginDelete')((id, operation) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n const existing = yield* lockedRowById(transaction, id)\n\n if (!existing) return yield* new MediaNotFound({ mediaId: id })\n\n if (existing.status === 'deleting') {\n yield* requirePendingChange(transaction, mediaSubject(id), 'media.removed')\n\n return existing\n }\n\n if (existing.status !== 'ready') {\n return yield* transitionFailure('MediaStore.Drizzle.beginDelete', id, existing.status)\n }\n\n const replacement = yield* replacementByMediaId(transaction, id)\n\n if (replacement) return yield* new MediaConflict({ mediaId: id })\n yield* lockMediaReferenceKeys(transaction, [existing.objectKey])\n\n const referenceRows = yield* transaction\n .select()\n .from(documentMediaReferences)\n .where(eq(documentMediaReferences.objectKey, existing.objectKey))\n .orderBy(\n asc(documentMediaReferences.documentId),\n asc(documentMediaReferences.sourcePath),\n asc(documentMediaReferences.nodePath),\n )\n\n const references = yield* decodeMediaReferences(referenceRows)\n\n const seoReferenceRows = yield* transaction\n .select({ scope: seoMediaReferences.scope })\n .from(seoMediaReferences)\n .where(eq(seoMediaReferences.mediaId, id))\n .orderBy(asc(seoMediaReferences.scope))\n\n const seoScopes = yield* Schema.decodeEffect(Schema.Array(Schema.Literals(['working', 'published'])))(\n seoReferenceRows.map((row) => row.scope),\n ).pipe(Effect.mapError((cause) => mediaPersistenceError('MediaStore.Drizzle.beginDelete', cause)))\n\n if (references.length > 0 || seoScopes.length > 0) {\n return yield* new MediaReferenced(\n seoScopes.length > 0 ? { mediaId: id, references, seoScopes } : { mediaId: id, references },\n )\n }\n\n yield* beginChange(transaction, mediaRemovalChange(existing, operation)).pipe(\n Effect.flatMap(requireUnresolvedChange),\n Effect.catchTag('Change.Conflict', () => new MediaConflict({ mediaId: id })),\n )\n\n const rows = yield* transaction\n .update(mediaAssets)\n .set({ status: 'deleting', updatedAt: transactionTimestamp })\n .where(and(eq(mediaAssets.id, id), eq(mediaAssets.status, 'ready')))\n .returning()\n\n if (rows[0]) return yield* decodeMediaRecord(rows[0])\n\n return yield* transitionFailure('MediaStore.Drizzle.beginDelete', id, existing.status)\n }),\n )\n .pipe(mapBeginDeleteFailure('MediaStore.Drizzle.beginDelete')),\n )\n\n const beginReplace: MediaStoreApi['beginReplace'] = Effect.fn('MediaStore.Drizzle.beginReplace')(\n (replacement, operation) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n const asset = yield* lockedRowById(transaction, replacement.mediaId)\n\n if (\n !asset ||\n asset.status !== 'ready' ||\n asset.objectKey !== replacement.objectKey ||\n asset.mimeType !== replacement.mimeType\n ) {\n return yield* new MediaConflict({ mediaId: replacement.mediaId })\n }\n\n yield* beginChange(transaction, mediaReplacementChange(asset, replacement, operation)).pipe(\n Effect.flatMap(requireUnresolvedChange),\n Effect.catchTag('Change.Conflict', () => new MediaConflict({ mediaId: replacement.mediaId })),\n )\n\n const rows = yield* transaction\n .insert(mediaReplacements)\n .values(replacementValues(replacement))\n .onConflictDoNothing()\n .returning()\n\n if (rows[0]) return yield* decodeMediaReplacement(rows[0])\n const existing = yield* replacementByMediaId(transaction, replacement.mediaId)\n\n if (existing && isSameReplacement(existing, replacement)) return existing\n\n return yield* new MediaConflict({ mediaId: replacement.mediaId })\n }),\n )\n .pipe(mapStoreFailure('MediaStore.Drizzle.beginReplace')),\n )\n\n const markReplaceStaged: MediaStoreApi['markReplaceStaged'] = Effect.fn('MediaStore.Drizzle.markReplaceStaged')(\n (replacement) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n yield* lockedRowById(transaction, replacement.mediaId)\n const existing = yield* replacementByMediaId(transaction, replacement.mediaId)\n\n if (!existing || !isSameReplacement(existing, replacement)) {\n return yield* new MediaConflict({ mediaId: replacement.mediaId })\n }\n\n if (existing.staged) return existing\n\n const rows = yield* transaction\n .update(mediaReplacements)\n .set({ staged: true })\n .where(\n and(\n eq(mediaReplacements.mediaId, replacement.mediaId),\n eq(mediaReplacements.stagingObjectKey, replacement.stagingObjectKey),\n ),\n )\n .returning()\n\n if (rows[0]) return yield* decodeMediaReplacement(rows[0])\n\n return yield* persistenceFailure(\n 'MediaStore.Drizzle.markReplaceStaged',\n new Error(`Media replacement \"${replacement.mediaId}\" lost its durable intent.`),\n )\n }),\n )\n .pipe(mapStoreFailure('MediaStore.Drizzle.markReplaceStaged')),\n )\n\n const finishReplace: MediaStoreApi['finishReplace'] = Effect.fn('MediaStore.Drizzle.finishReplace')((replacement) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n const asset = yield* lockedRowById(transaction, replacement.mediaId)\n const pendingReplacement = yield* replacementByMediaId(transaction, replacement.mediaId)\n\n if (!pendingReplacement) {\n if (asset && isCompletedReplacement(asset, replacement)) return asset\n\n return yield* persistenceFailure(\n 'MediaStore.Drizzle.finishReplace',\n new Error(`Media replacement \"${replacement.mediaId}\" cannot be replayed from durable state.`),\n )\n }\n\n if (!isSameReplacement(pendingReplacement, replacement)) {\n return yield* new MediaConflict({ mediaId: replacement.mediaId })\n }\n\n if (\n !asset ||\n asset.status !== 'ready' ||\n asset.objectKey !== replacement.objectKey ||\n asset.mimeType !== replacement.mimeType\n ) {\n return yield* new MediaConflict({ mediaId: replacement.mediaId })\n }\n\n const change = yield* requirePendingChange(transaction, mediaSubject(replacement.mediaId), 'media.replaced')\n\n const rows = yield* transaction\n .update(mediaAssets)\n .set({\n byteSize: replacement.byteSize,\n folder: replacement.folder,\n mimeType: replacement.mimeType,\n name: replacement.name,\n updatedAt: transactionTimestamp,\n })\n .where(and(eq(mediaAssets.id, replacement.mediaId), eq(mediaAssets.status, 'ready')))\n .returning()\n\n const replaced = rows[0]\n\n if (!replaced) {\n return yield* transitionFailure('MediaStore.Drizzle.finishReplace', replacement.mediaId, asset.status)\n }\n\n const deleted = yield* transaction\n .delete(mediaReplacements)\n .where(\n and(\n eq(mediaReplacements.mediaId, replacement.mediaId),\n eq(mediaReplacements.stagingObjectKey, replacement.stagingObjectKey),\n ),\n )\n .returning({ mediaId: mediaReplacements.mediaId })\n\n if (!deleted[0]) {\n return yield* persistenceFailure(\n 'MediaStore.Drizzle.finishReplace',\n new Error(`Media replacement \"${replacement.mediaId}\" lost its durable intent.`),\n )\n }\n\n const decoded = yield* decodeMediaRecord(replaced)\n const intent = yield* decodeMediaChangeIntent(change)\n yield* resolveChange(transaction, change, { details: mediaChangeDetails(intent), kind: 'applied' })\n\n return decoded\n }),\n )\n .pipe(mapStoreFailure('MediaStore.Drizzle.finishReplace')),\n )\n\n const cancelReplace: MediaStoreApi['cancelReplace'] = Effect.fn('MediaStore.Drizzle.cancelReplace')((replacement) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n yield* lockedRowById(transaction, replacement.mediaId)\n const existing = yield* replacementByMediaId(transaction, replacement.mediaId)\n\n if (!existing) return\n\n if (!isSameReplacement(existing, replacement) || existing.staged !== replacement.staged) {\n return yield* new MediaConflict({ mediaId: replacement.mediaId })\n }\n\n const change = yield* requirePendingChange(transaction, mediaSubject(replacement.mediaId), 'media.replaced')\n\n const deleted = yield* transaction\n .delete(mediaReplacements)\n .where(\n and(\n eq(mediaReplacements.mediaId, replacement.mediaId),\n eq(mediaReplacements.staged, replacement.staged),\n eq(mediaReplacements.stagingObjectKey, replacement.stagingObjectKey),\n ),\n )\n .returning({ mediaId: mediaReplacements.mediaId })\n\n if (!deleted[0]) return yield* new MediaConflict({ mediaId: replacement.mediaId })\n yield* resolveChange(transaction, change, { kind: 'cancelled' })\n }),\n )\n .pipe(mapStoreFailure('MediaStore.Drizzle.cancelReplace')),\n )\n\n const finishDelete: MediaStoreApi['finishDelete'] = Effect.fn('MediaStore.Drizzle.finishDelete')((id) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n const existing = yield* lockedRowById(transaction, id)\n\n if (!existing) return\n\n if (existing.status !== 'deleting') {\n return yield* transitionFailure('MediaStore.Drizzle.finishDelete', id, existing.status)\n }\n\n const change = yield* requirePendingChange(transaction, mediaSubject(id), 'media.removed')\n\n const rows = yield* transaction\n .delete(mediaAssets)\n .where(and(eq(mediaAssets.id, id), eq(mediaAssets.status, 'deleting')))\n .returning({ id: mediaAssets.id })\n\n if (!rows[0]) return yield* transitionFailure('MediaStore.Drizzle.finishDelete', id, existing.status)\n const intent = yield* decodeMediaChangeIntent(change)\n yield* resolveChange(transaction, change, { details: mediaChangeDetails(intent), kind: 'applied' })\n }),\n )\n .pipe(mapPersistenceFailure('MediaStore.Drizzle.finishDelete')),\n )\n\n const abandonUpload: MediaStoreApi['abandonUpload'] = Effect.fn('MediaStore.Drizzle.abandonUpload')((id) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n const existing = yield* lockedRowById(transaction, id)\n\n if (!existing) return\n\n if (existing.status !== 'uploading') {\n return yield* transitionFailure('MediaStore.Drizzle.abandonUpload', id, existing.status)\n }\n\n const change = yield* requirePendingChange(transaction, mediaSubject(id), 'media.uploaded')\n\n const rows = yield* transaction\n .delete(mediaAssets)\n .where(and(eq(mediaAssets.id, id), eq(mediaAssets.status, 'uploading')))\n .returning({ id: mediaAssets.id })\n\n if (!rows[0]) {\n return yield* transitionFailure('MediaStore.Drizzle.abandonUpload', id, existing.status)\n }\n\n yield* resolveChange(transaction, change, { kind: 'cancelled' })\n }),\n )\n .pipe(mapPersistenceFailure('MediaStore.Drizzle.abandonUpload')),\n )\n\n const pending: MediaStoreApi['pending'] = Effect.fn('MediaStore.Drizzle.pending')((query) =>\n Effect.gen(function* () {\n const rows = yield* database\n .select()\n .from(mediaAssets)\n .where(\n and(\n ne(mediaAssets.status, 'ready'),\n lte(mediaAssets.updatedAt, DateTime.formatIso(query.before)),\n query.after === undefined ? undefined : gt(mediaAssets.id, query.after),\n ),\n )\n .orderBy(asc(mediaAssets.id))\n .limit(query.limit)\n\n return yield* Effect.forEach(rows, decodeMediaRecord)\n }).pipe(mapPersistenceFailure('MediaStore.Drizzle.pending')),\n )\n\n const pendingReplacements: MediaStoreApi['pendingReplacements'] = Effect.fn(\n 'MediaStore.Drizzle.pendingReplacements',\n )((query) =>\n Effect.gen(function* () {\n const rows = yield* database\n .select()\n .from(mediaReplacements)\n .where(\n and(\n lte(mediaReplacements.updatedAt, DateTime.formatIso(query.before)),\n query.after === undefined ? undefined : gt(mediaReplacements.mediaId, query.after),\n ),\n )\n .orderBy(asc(mediaReplacements.mediaId))\n .limit(query.limit)\n\n return yield* Effect.forEach(rows, decodeMediaReplacement)\n }).pipe(mapPersistenceFailure('MediaStore.Drizzle.pendingReplacements')),\n )\n\n const inspectReplacement: MediaStoreApi['inspectReplacement'] = Effect.fn('MediaStore.Drizzle.inspectReplacement')(\n (replacement) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n const asset = yield* lockedRowById(transaction, replacement.mediaId)\n const pending = yield* replacementByMediaId(transaction, replacement.mediaId)\n\n if (pending) {\n if (isSameReplacement(pending, replacement)) return 'pending' as const\n\n return yield* new MediaConflict({ mediaId: replacement.mediaId })\n }\n\n return asset && isCompletedReplacement(asset, replacement) ? ('completed' as const) : ('absent' as const)\n }),\n )\n .pipe(mapStoreFailure('MediaStore.Drizzle.inspectReplacement')),\n )\n\n const inventory: MediaStoreApi['inventory'] = Effect.gen(function* () {\n const rows = yield* database\n .select()\n .from(mediaAssets)\n .where(eq(mediaAssets.status, 'ready'))\n .orderBy(asc(mediaAssets.objectKey))\n\n return yield* Effect.forEach(rows, decodeMediaRecord)\n }).pipe(mapPersistenceFailure('MediaStore.Drizzle.inventory'), Effect.withSpan('MediaStore.Drizzle.inventory'))\n\n const knownObjectKeys: MediaStoreApi['knownObjectKeys'] = Effect.gen(function* () {\n const assetRows = yield* database\n .select({ objectKey: mediaAssets.objectKey })\n .from(mediaAssets)\n .orderBy(asc(mediaAssets.objectKey))\n\n const replacementRows = yield* database\n .select({ objectKey: mediaReplacements.stagingObjectKey })\n .from(mediaReplacements)\n .orderBy(asc(mediaReplacements.stagingObjectKey))\n\n const objectKeys = yield* Schema.decodeEffect(Schema.Array(MediaObjectKey))(\n [...assetRows, ...replacementRows].map((row) => row.objectKey),\n )\n\n return new Set(objectKeys)\n }).pipe(\n mapPersistenceFailure('MediaStore.Drizzle.knownObjectKeys'),\n Effect.withSpan('MediaStore.Drizzle.knownObjectKeys'),\n )\n\n const search: MediaStoreApi['search'] = Effect.fn('MediaStore.Drizzle.search')((query) =>\n database\n .transaction(\n (transaction) =>\n Effect.gen(function* () {\n const normalizedSearch = query.search?.trim()\n const pattern = normalizedSearch ? `%${escapeLike(normalizedSearch)}%` : undefined\n\n const filters = and(\n eq(mediaAssets.status, 'ready'),\n query.folder === undefined ? undefined : eq(mediaAssets.folder, query.folder),\n pattern === undefined\n ? undefined\n : or(\n sql`${mediaAssets.name} ILIKE ${pattern} ESCAPE ${'\\\\'}`,\n sql`${mediaAssets.folder} ILIKE ${pattern} ESCAPE ${'\\\\'}`,\n ),\n )\n\n const cursorFilter = query.cursor\n ? or(\n lt(mediaAssets.createdAt, DateTime.formatIso(query.cursor.createdAt)),\n and(\n eq(mediaAssets.createdAt, DateTime.formatIso(query.cursor.createdAt)),\n lt(mediaAssets.id, query.cursor.id),\n ),\n )\n : undefined\n\n const rows = yield* transaction\n .select()\n .from(mediaAssets)\n .where(and(filters, cursorFilter))\n .orderBy(desc(mediaAssets.createdAt), desc(mediaAssets.id))\n .limit(query.limit + 1)\n\n const folderRows = yield* transaction\n .selectDistinct({ folder: mediaAssets.folder })\n .from(mediaAssets)\n .where(and(eq(mediaAssets.status, 'ready'), ne(mediaAssets.folder, '')))\n .orderBy(asc(mediaAssets.folder))\n\n const totals = yield* transaction.select({ value: count() }).from(mediaAssets).where(filters)\n const total = totals[0]?.value\n\n if (total === undefined) {\n return yield* persistenceFailure(\n 'MediaStore.Drizzle.search',\n new Error('Media persistence did not return a search total.'),\n )\n }\n\n const decoded = yield* Effect.forEach(rows, decodeMediaRecord)\n\n const folders = yield* Schema.decodeEffect(Schema.Array(MediaFolder))(\n folderRows.map((row) => row.folder),\n ).pipe(Effect.mapError((cause) => mediaPersistenceError('MediaStore.Drizzle.search', cause)))\n\n return mediaPage(decoded, query.limit, folders, total)\n }),\n { accessMode: 'read only', isolationLevel: 'repeatable read' },\n )\n .pipe(mapPersistenceFailure('MediaStore.Drizzle.search')),\n )\n\n return MediaStore.of({\n abandonUpload,\n activate,\n beginDelete,\n beginReplace,\n cancelReplace,\n find,\n finishReplace,\n finishDelete,\n inventory,\n inspectReplacement,\n knownObjectKeys,\n markReplaceStaged,\n pending,\n pendingReplacements,\n reserve,\n search,\n })\n }),\n)\n\nfunction recordValues(record: MediaRecord): typeof mediaAssets.$inferInsert {\n return {\n byteSize: record.byteSize,\n createdAt: DateTime.formatIso(record.createdAt),\n folder: record.folder,\n id: record.id,\n mimeType: record.mimeType,\n name: record.name,\n objectKey: record.objectKey,\n status: record.status,\n updatedAt: DateTime.formatIso(record.updatedAt),\n }\n}\n\nfunction replacementValues(replacement: MediaReplacement): typeof mediaReplacements.$inferInsert {\n return {\n byteSize: replacement.byteSize,\n createdAt: DateTime.formatIso(replacement.createdAt),\n folder: replacement.folder,\n mediaId: replacement.mediaId,\n mimeType: replacement.mimeType,\n name: replacement.name,\n objectKey: replacement.objectKey,\n staged: replacement.staged,\n stagingObjectKey: replacement.stagingObjectKey,\n updatedAt: DateTime.formatIso(replacement.updatedAt),\n }\n}\n\nfunction isSameReservation(left: MediaRecord, right: MediaRecord): boolean {\n return (\n left.byteSize === right.byteSize &&\n DateTime.toEpochMillis(left.createdAt) === DateTime.toEpochMillis(right.createdAt) &&\n left.folder === right.folder &&\n left.id === right.id &&\n left.mimeType === right.mimeType &&\n left.name === right.name &&\n left.objectKey === right.objectKey\n )\n}\n\nfunction isSameReplacement(left: MediaReplacement, right: MediaReplacement): boolean {\n return (\n left.byteSize === right.byteSize &&\n DateTime.toEpochMillis(left.createdAt) === DateTime.toEpochMillis(right.createdAt) &&\n left.folder === right.folder &&\n left.mediaId === right.mediaId &&\n left.mimeType === right.mimeType &&\n left.name === right.name &&\n left.objectKey === right.objectKey &&\n left.stagingObjectKey === right.stagingObjectKey &&\n DateTime.toEpochMillis(left.updatedAt) === DateTime.toEpochMillis(right.updatedAt)\n )\n}\n\nfunction isCompletedReplacement(asset: MediaRecord, replacement: MediaReplacement): boolean {\n return (\n asset.status === 'ready' &&\n asset.id === replacement.mediaId &&\n asset.objectKey === replacement.objectKey &&\n asset.byteSize === replacement.byteSize &&\n asset.folder === replacement.folder &&\n asset.mimeType === replacement.mimeType &&\n asset.name === replacement.name\n )\n}\n\nfunction mediaPage(\n records: ReadonlyArray<MediaRecord>,\n limit: number,\n folders: ReadonlyArray<MediaRecord['folder']>,\n total: number,\n): MediaStorePage {\n const page = records.slice(0, limit)\n const last = page.at(-1)\n\n return {\n folders,\n next: records.length > limit && last ? { createdAt: last.createdAt, id: last.id } : undefined,\n records: page,\n total,\n }\n}\n\nfunction escapeLike(value: string): string {\n return value.replace(/[\\\\%_]/gu, (character) => `\\\\${character}`)\n}\n\ntype MediaReader = Pick<PgDrizzle.EffectPgDatabase, 'select'>\n\ntype MediaTransaction = PgDrizzle.EffectPgTransaction<PgDrizzle.EffectPgQueryResultHKT, EmptyRelations>\n\nconst rowById = Effect.fn('MediaStore.Drizzle.rowById')(function* (database: MediaReader, id: MediaId) {\n const rows = yield* database.select().from(mediaAssets).where(eq(mediaAssets.id, id)).limit(1)\n\n return rows[0] ? yield* decodeMediaRecord(rows[0]) : undefined\n})\n\nconst lockedRowById = Effect.fn('MediaStore.Drizzle.lockRowById')(function* (\n transaction: MediaTransaction,\n id: MediaId,\n) {\n const rows = yield* transaction.select().from(mediaAssets).where(eq(mediaAssets.id, id)).limit(1).for('update')\n\n return rows[0] ? yield* decodeMediaRecord(rows[0]) : undefined\n})\n\nconst replacementByMediaId = Effect.fn('MediaStore.Drizzle.replacementByMediaId')(function* (\n database: MediaReader,\n mediaId: MediaId,\n) {\n const rows = yield* database.select().from(mediaReplacements).where(eq(mediaReplacements.mediaId, mediaId)).limit(1)\n\n return rows[0] ? yield* decodeMediaReplacement(rows[0]) : undefined\n})\n\nfunction transitionFailure(\n operation: string,\n id: MediaId,\n actualStatus: MediaRecord['status'] | undefined,\n): Effect.Effect<never, MediaPersistenceError> {\n return persistenceFailure(\n operation,\n new Error(\n actualStatus === undefined\n ? `Media record \"${id}\" does not exist.`\n : `Media record \"${id}\" cannot transition from \"${actualStatus}\".`,\n ),\n )\n}\n\nfunction mapPersistenceFailure(operation: string) {\n return <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, MediaPersistenceError, R> =>\n effect.pipe(\n Effect.mapError((cause) => (isMediaPersistenceError(cause) ? cause : mediaPersistenceError(operation, cause))),\n )\n}\n\nfunction mapStoreFailure(operation: string) {\n return <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, MediaConflict | MediaPersistenceError, R> =>\n effect.pipe(\n Effect.mapError((cause) =>\n isMediaConflict(cause) || isMediaPersistenceError(cause) ? cause : mediaPersistenceError(operation, cause),\n ),\n )\n}\n\nfunction mapBeginDeleteFailure(operation: string) {\n return <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n ): Effect.Effect<A, MediaConflict | MediaNotFound | MediaPersistenceError | MediaReferenced, R> =>\n effect.pipe(\n Effect.mapError((cause) =>\n isMediaConflict(cause) || isMediaNotFound(cause) || isMediaPersistenceError(cause) || isMediaReferenced(cause)\n ? cause\n : mediaPersistenceError(operation, cause),\n ),\n )\n}\n\nfunction persistenceFailure(operation: string, cause: unknown): Effect.Effect<never, MediaPersistenceError> {\n return Effect.fail(mediaPersistenceError(operation, cause))\n}\n","import { PgClient } from '@effect/sql-pg'\nimport type { ActivityContext } from '@internal/protocol/Activity'\nimport type { GlobalSeoSettings, SeoRevision as SeoRevisionType } from '@internal/protocol/Seo'\nimport { ActivityId } from '@internal/protocol/Activity'\nimport { RequestId } from '@internal/protocol/Identity'\nimport { MediaObjectKey as MediaObjectKeySchema } from '@internal/protocol/Media'\nimport { SeoMediaUnavailable, SeoRevision, SeoVersionConflict } from '@internal/protocol/Seo'\nimport {\n SeoPersistenceError,\n SeoStore,\n type SeoStoreApi,\n type SeoStoreSnapshot,\n} from '@internal/server/adapter/SeoStore'\nimport { and, eq, inArray, sql } from 'drizzle-orm'\nimport * as PgDrizzle from 'drizzle-orm/effect-postgres'\nimport { Effect, Layer, Schema } from 'effect'\nimport { activityEntries } from '../activity/tables'\nimport { lockMediaReferenceKeys, type MediaReferenceTransaction } from '../database/media-reference-lock'\nimport { mediaAssets } from '../media/tables'\nimport { seoMediaReferences, seoRevisions, seoState } from './tables'\n\nconst SeoStoreDomainError = Schema.Union([SeoMediaUnavailable, SeoPersistenceError, SeoVersionConflict])\n\nconst isSeoStoreDomainError = Schema.is(SeoStoreDomainError)\n\nconst isSeoPersistenceError = Schema.is(SeoPersistenceError)\n\nconst systemActivity: ActivityContext = {\n actor: { email: 'system@cms.invalid', id: 'system', name: 'CMS System', roles: ['system'] },\n requestId: RequestId.make('00000000-0000-4000-8000-000000000000'),\n}\n\nexport const seoStoreLayer: Layer.Layer<SeoStore, never, PgClient.PgClient> = Layer.effect(\n SeoStore,\n Effect.gen(function* () {\n const database = yield* PgDrizzle.makeWithDefaults()\n\n const initialize: SeoStoreApi['initialize'] = Effect.fn('SeoStore.Drizzle.initialize')((defaults) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n yield* transaction.execute(sql`SELECT pg_advisory_xact_lock(hashtext('cms:seo:singleton:v1'))`)\n const current = yield* readSnapshot(transaction)\n\n if (current) return current\n\n yield* ensureMediaAvailable(transaction, defaults).pipe(\n Effect.mapError(\n (cause) => new SeoPersistenceError({ cause, operation: 'SeoStore.Drizzle.initializeDefaults' }),\n ),\n )\n const revision = yield* insertRevision(transaction, defaults, systemActivity)\n yield* transaction.insert(seoState).values({\n publishedRevisionId: revision.revisionId,\n workingRevisionId: revision.revisionId,\n })\n yield* replaceMediaReferences(transaction, 'working', defaults)\n yield* replaceMediaReferences(transaction, 'published', defaults)\n\n return { published: revision, working: revision }\n }),\n )\n .pipe(mapStoreFailure('SeoStore.Drizzle.initialize')),\n )\n\n const load: SeoStoreApi['load'] = database\n .transaction((transaction) => readSnapshot(transaction), {\n accessMode: 'read only',\n isolationLevel: 'repeatable read',\n })\n .pipe(mapPersistenceFailure('SeoStore.Drizzle.load'))\n\n const save: SeoStoreApi['save'] = Effect.fn('SeoStore.Drizzle.save')((input) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n const current = yield* lockedSnapshot(transaction)\n yield* requireVersion(current, input.expectedVersion)\n yield* ensureMediaAvailable(transaction, input.settings)\n const revision = yield* insertRevision(transaction, input.settings, input.activity)\n yield* transaction\n .update(seoState)\n .set({ workingRevisionId: revision.revisionId })\n .where(eq(seoState.singleton, true))\n yield* replaceMediaReferences(transaction, 'working', input.settings)\n yield* recordActivity(\n transaction,\n 'seo.saved',\n input.activity,\n {\n previousVersion: current.working.version,\n version: revision.version,\n },\n ActivityId.make(revision.revisionId),\n )\n\n return { ...current, working: revision }\n }),\n )\n .pipe(mapStoreFailure('SeoStore.Drizzle.save')),\n )\n\n const publish: SeoStoreApi['publish'] = Effect.fn('SeoStore.Drizzle.publish')((input) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n const current = yield* lockedSnapshot(transaction)\n yield* requireVersion(current, input.expectedVersion)\n yield* ensureMediaAvailable(transaction, current.working.settings)\n yield* transaction\n .update(seoState)\n .set({ publishedRevisionId: current.working.revisionId })\n .where(eq(seoState.singleton, true))\n yield* replaceMediaReferences(transaction, 'published', current.working.settings)\n yield* recordActivity(transaction, 'seo.published', input.activity, {\n version: current.working.version,\n })\n\n return { ...current, published: current.working }\n }),\n )\n .pipe(mapStoreFailure('SeoStore.Drizzle.publish')),\n )\n\n return SeoStore.of({ initialize, load, publish, save })\n }),\n)\n\nconst readSnapshot = Effect.fn('SeoStore.Drizzle.readSnapshot')(function* (\n database: Pick<PgDrizzle.EffectPgDatabase, 'select'>,\n) {\n const stateRows = yield* database.select().from(seoState).limit(1)\n const state = stateRows[0]\n\n if (!state) return undefined\n\n const revisionRows = yield* database\n .select()\n .from(seoRevisions)\n .where(inArray(seoRevisions.id, [state.workingRevisionId, state.publishedRevisionId]))\n\n const revisions = yield* Effect.forEach(revisionRows, decodeRevision)\n const working = revisions.find((revision) => revision.revisionId === state.workingRevisionId)\n const published = revisions.find((revision) => revision.revisionId === state.publishedRevisionId)\n\n if (!working || !published) {\n return yield* persistenceFailure(\n 'SeoStore.Drizzle.readSnapshot',\n new Error('SEO state points to a missing revision.'),\n )\n }\n\n return { published, working } satisfies SeoStoreSnapshot\n})\n\nconst lockedSnapshot = Effect.fn('SeoStore.Drizzle.lockSnapshot')(function* (transaction: MediaReferenceTransaction) {\n const rows = yield* transaction.select().from(seoState).where(eq(seoState.singleton, true)).for('update').limit(1)\n\n if (!rows[0]) {\n return yield* persistenceFailure('SeoStore.Drizzle.lockSnapshot', new Error('SEO state is not initialized.'))\n }\n\n const snapshot = yield* readSnapshot(transaction)\n\n return snapshot ?? (yield* persistenceFailure('SeoStore.Drizzle.lockSnapshot', new Error('SEO state disappeared.')))\n})\n\nconst insertRevision = Effect.fn('SeoStore.Drizzle.insertRevision')(function* (\n transaction: MediaReferenceTransaction,\n settings: GlobalSeoSettings,\n activity: ActivityContext,\n) {\n const rows = yield* transaction\n .insert(seoRevisions)\n .values({\n actorEmail: activity.actor.email,\n actorId: activity.actor.id,\n actorName: activity.actor.name,\n actorRoles: activity.actor.roles,\n reason: activity.reason,\n requestId: activity.requestId,\n settings,\n })\n .returning()\n\n const row = rows[0]\n\n return row\n ? yield* decodeRevision(row)\n : yield* persistenceFailure('SeoStore.Drizzle.insertRevision', new Error('No revision row returned.'))\n})\n\nconst decodeRevision = Effect.fn('SeoStore.Drizzle.decodeRevision')(function* (row: typeof seoRevisions.$inferSelect) {\n return yield* Schema.decodeEffect(SeoRevision)({\n editedAt: row.createdAt,\n editedBy: {\n email: row.actorEmail,\n id: row.actorId,\n name: row.actorName,\n roles: row.actorRoles,\n },\n revisionId: row.id,\n settings: row.settings,\n version: row.id,\n }).pipe(Effect.mapError((cause) => new SeoPersistenceError({ cause, operation: 'SeoStore.Drizzle.decodeRevision' })))\n})\n\nfunction requireVersion(snapshot: SeoStoreSnapshot, expectedVersion: SeoRevisionType['version']) {\n return snapshot.working.version === expectedVersion\n ? Effect.void\n : Effect.fail(new SeoVersionConflict({ actualVersion: snapshot.working.version, expectedVersion }))\n}\n\nconst ensureMediaAvailable = Effect.fn('SeoStore.Drizzle.ensureMediaAvailable')(function* (\n transaction: MediaReferenceTransaction,\n settings: GlobalSeoSettings,\n) {\n const mediaIds = settingsMediaIds(settings)\n\n if (mediaIds.length === 0) return\n\n const initialRows = yield* transaction\n .select({ id: mediaAssets.id, objectKey: mediaAssets.objectKey })\n .from(mediaAssets)\n .where(inArray(mediaAssets.id, mediaIds))\n\n const objectKeys = yield* Schema.decodeEffect(Schema.Array(MediaObjectKeySchema))(\n initialRows.map((row) => row.objectKey),\n )\n\n yield* lockMediaReferenceKeys(transaction, objectKeys)\n\n const readyRows = yield* transaction\n .select({ id: mediaAssets.id, objectKey: mediaAssets.objectKey })\n .from(mediaAssets)\n .where(and(inArray(mediaAssets.id, mediaIds), eq(mediaAssets.status, 'ready')))\n\n const unavailable = settingsMediaImages(settings).find((image) => {\n const asset = readyRows.find((row) => row.id === image.mediaId)\n\n return !asset || mediaObjectKey(image.url) !== asset.objectKey\n })\n\n if (unavailable) return yield* new SeoMediaUnavailable({ mediaId: unavailable.mediaId })\n})\n\nconst replaceMediaReferences = Effect.fn('SeoStore.Drizzle.replaceMediaReferences')(function* (\n transaction: MediaReferenceTransaction,\n scope: 'working' | 'published',\n settings: GlobalSeoSettings,\n) {\n yield* transaction.delete(seoMediaReferences).where(eq(seoMediaReferences.scope, scope))\n const mediaIds = settingsMediaIds(settings)\n\n if (mediaIds.length > 0) {\n yield* transaction.insert(seoMediaReferences).values(mediaIds.map((mediaId) => ({ mediaId, scope })))\n }\n})\n\nfunction settingsMediaIds(settings: GlobalSeoSettings) {\n return [...new Set(settingsMediaImages(settings).map((image) => image.mediaId))]\n}\n\nfunction settingsMediaImages(settings: GlobalSeoSettings) {\n const images = [settings.socialImage]\n const identity = settings.identity\n\n if (identity?.type === 'Person') images.push(identity.image)\n\n if (identity?.type === 'Organization') images.push(identity.logo)\n\n if (identity?.type === 'LocalBusiness') images.push(identity.logo, identity.image)\n\n return images.filter((image) => image !== undefined)\n}\n\nfunction mediaObjectKey(url: string): string | undefined {\n try {\n const path = new URL(url).pathname\n const encodedKey = path.match(/(?:^|\\/)(media\\/[^/]+)$/u)?.[1]\n\n return encodedKey ? encodedKey.split('/').map(decodeURIComponent).join('/') : undefined\n } catch {\n return undefined\n }\n}\n\nconst recordActivity = Effect.fn('SeoStore.Drizzle.recordActivity')(function* (\n transaction: MediaReferenceTransaction,\n action: 'seo.saved' | 'seo.published',\n context: ActivityContext,\n details: Record<string, string>,\n id?: ActivityId,\n) {\n yield* transaction.insert(activityEntries).values({\n action,\n actorEmail: context.actor.email,\n actorId: context.actor.id,\n actorName: context.actor.name,\n actorRoles: context.actor.roles,\n details,\n id,\n reason: context.reason,\n requestId: context.requestId,\n targetKind: 'seo',\n })\n})\n\nfunction mapStoreFailure(operation: string) {\n return <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n effect.pipe(\n Effect.mapError((cause) =>\n isSeoStoreDomainError(cause) ? cause : new SeoPersistenceError({ cause, operation }),\n ),\n )\n}\n\nfunction mapPersistenceFailure(operation: string) {\n return <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n effect.pipe(\n Effect.mapError((cause) =>\n isSeoPersistenceError(cause) ? cause : new SeoPersistenceError({ cause, operation }),\n ),\n )\n}\n\nfunction persistenceFailure(operation: string, cause: unknown) {\n return Effect.fail(new SeoPersistenceError({ cause, operation }))\n}\n","import { UserAdministrationUnavailable } from '@internal/server/adapter/UserCommandFence'\nimport { Effect, Layer } from 'effect'\nimport { PostgresAdvisoryLock } from '../postgres/advisory-lock'\nimport {\n UserCommandFence,\n type UserCommandFenceApi,\n type UserCommandFenceLease,\n} from '@internal/server/adapter/UserCommandFence'\n\nconst LOCK_NAMESPACE = 'cms:user-command:v1:'\n\nexport const postgresUserCommandFenceLayer: Layer.Layer<UserCommandFence, never, PostgresAdvisoryLock> = Layer.effect(\n UserCommandFence,\n PostgresAdvisoryLock.pipe(\n Effect.map((locks) =>\n UserCommandFence.of({\n run: <A, E, R>(\n key: Parameters<UserCommandFenceApi['run']>[0],\n use: (lease: UserCommandFenceLease) => Effect.Effect<A, E, R>,\n ) =>\n locks\n .run(`${LOCK_NAMESPACE}${key}`, (lockLease) =>\n use({\n include: (includedKey, effect) =>\n lockLease.include(`${LOCK_NAMESPACE}${includedKey}`, effect).pipe(\n Effect.catchTag('PostgresAdvisoryLock.Unavailable', (cause) =>\n Effect.fail(\n new UserAdministrationUnavailable({\n cause,\n operation: 'UserCommandFence.Postgres.include',\n }),\n ),\n ),\n ),\n }),\n )\n .pipe(\n Effect.catchTag('PostgresAdvisoryLock.Unavailable', (cause) =>\n Effect.fail(\n new UserAdministrationUnavailable({\n cause,\n operation: 'UserCommandFence.Postgres.run',\n }),\n ),\n ),\n ),\n }),\n ),\n ),\n)\n","import type { WorkingDocumentChange } from '@internal/server/adapter/WorkingDocumentChanges'\nimport { Result, Schema } from 'effect'\nimport { WorkingDocumentChange as WorkingDocumentChangeSchema } from '@internal/server/adapter/WorkingDocumentChanges'\n\nexport const WORKING_DOCUMENT_CHANGES_CHANNEL = 'cms_working_documents'\n\nconst WorkingDocumentChangePayload = Schema.fromJsonString(WorkingDocumentChangeSchema)\n\nexport function workingDocumentChangePayload(change: WorkingDocumentChange): string {\n return Result.getOrThrow(Schema.encodeResult(WorkingDocumentChangePayload)(change))\n}\n\nexport const decodeWorkingDocumentChangePayload = Schema.decodeUnknownEffect(WorkingDocumentChangePayload)\n","import type { PgPoolConfig } from '@effect/sql-pg/PgClient'\nimport type { WorkingDocumentChange } from '@internal/server/adapter/WorkingDocumentChanges'\nimport { PgClient } from '@effect/sql-pg'\nimport { WorkingDocumentChanges, WorkingDocumentChangesError } from '@internal/server/adapter/WorkingDocumentChanges'\nimport { Cause, Context, Deferred, Effect, Fiber, Layer, PubSub, Ref, Schedule, Stream } from 'effect'\nimport { decodeWorkingDocumentChangePayload, WORKING_DOCUMENT_CHANGES_CHANNEL } from './working-document-change-message'\n\nconst HEARTBEAT_INTERVAL = '5 seconds'\n\nconst HEARTBEAT_TIMEOUT = '10 seconds'\n\nconst HEARTBEAT_RETRY = '50 millis'\n\nconst RECONNECT_DELAY = '250 millis'\n\nconst STARTUP_TIMEOUT = '15 seconds'\n\nconst CHANGE_BUFFER_CAPACITY = 1_024\n\n/**\n * Owns a dedicated PostgreSQL listener pool. Each failed heartbeat rebuilds\n * that pool, because PgClient.listen cannot recover a dead node-pg client.\n */\nexport function postgresWorkingDocumentChangesLayer(\n database: PgPoolConfig,\n): Layer.Layer<WorkingDocumentChanges, WorkingDocumentChangesError> {\n return Layer.effect(WorkingDocumentChanges, makePostgresChanges(database))\n}\n\nconst makePostgresChanges = Effect.fn('WorkingDocumentChanges.makePostgres')(function* (database: PgPoolConfig) {\n const healthy = yield* Ref.make(false)\n const firstReady = yield* Deferred.make<void>()\n const changes = yield* PubSub.sliding<WorkingDocumentChange>(CHANGE_BUFFER_CAPACITY)\n let session = 0\n\n const supervise = Effect.scoped(\n Effect.gen(function* () {\n yield* Ref.set(healthy, false)\n session += 1\n\n const listenerLayer = PgClient.layer({\n ...database,\n applicationName: `${database.applicationName ?? '@internal/server'}:working-documents-listener`,\n })\n\n const context = yield* Layer.build(listenerLayer)\n const postgres = Context.get(context, PgClient.PgClient)\n const heartbeats = new Map<string, Deferred.Deferred<void>>()\n let heartbeat = 0\n\n const notifications = yield* postgres\n .listen(WORKING_DOCUMENT_CHANGES_CHANNEL)\n .pipe(Effect.mapError((cause) => changesError('listen', cause)))\n\n const listen = Stream.fromQueue(notifications).pipe(\n Stream.runForEach((payload) => {\n const waiting = heartbeats.get(payload.payload)\n\n if (waiting !== undefined) return Deferred.succeed(waiting, undefined).pipe(Effect.asVoid)\n\n if (payload.payload.startsWith('__cms_probe__:')) return Effect.void\n\n return decodeWorkingDocumentChangePayload(payload.payload).pipe(\n Effect.flatMap((change) => PubSub.publish(changes, change)),\n Effect.asVoid,\n Effect.catchCause((cause) =>\n Effect.logWarning('Ignored an invalid Working Document change.', Cause.pretty(cause)),\n ),\n )\n }),\n Effect.catchCause((cause) => Effect.fail(changesError('listen', cause))),\n )\n\n const listener = yield* listen.pipe(Effect.forkScoped({ startImmediately: true }))\n\n const pulse = Effect.gen(function* () {\n heartbeat += 1\n const payload = `__cms_probe__:${session}:${heartbeat}`\n const received = yield* Deferred.make<void>()\n heartbeats.set(payload, received)\n\n const announce = postgres\n .notify(WORKING_DOCUMENT_CHANGES_CHANNEL, payload)\n .pipe(Effect.mapError((cause) => changesError('heartbeat', cause)))\n\n yield* Effect.raceFirst(\n Effect.raceFirst(\n Deferred.await(received),\n announce.pipe(Effect.repeat(Schedule.spaced(HEARTBEAT_RETRY))),\n ).pipe(Effect.timeout(HEARTBEAT_TIMEOUT)),\n Fiber.join(listener),\n ).pipe(\n Effect.ensuring(Effect.sync(() => heartbeats.delete(payload))),\n Effect.mapError((cause) => changesError('heartbeat', cause)),\n )\n yield* Ref.set(healthy, true)\n yield* Deferred.succeed(firstReady, undefined)\n })\n\n yield* Effect.raceFirst(pulse.pipe(Effect.repeat(Schedule.spaced(HEARTBEAT_INTERVAL))), Fiber.join(listener))\n }),\n ).pipe(\n Effect.catchCauseIf(\n (cause) => !Cause.hasInterrupts(cause),\n (cause) =>\n Ref.set(healthy, false).pipe(\n Effect.andThen(Effect.logWarning('Restarting the Working Document change listener.', Cause.pretty(cause))),\n ),\n ),\n Effect.repeat(Schedule.spaced(RECONNECT_DELAY)),\n )\n\n yield* supervise.pipe(Effect.forkScoped({ startImmediately: true }))\n yield* Deferred.await(firstReady).pipe(\n Effect.timeout(STARTUP_TIMEOUT),\n Effect.mapError((cause) => changesError('start', cause)),\n )\n\n return WorkingDocumentChanges.of({\n changes: Stream.fromPubSub(changes),\n check: Ref.get(healthy).pipe(\n Effect.flatMap((ready) =>\n ready\n ? Effect.void\n : Effect.fail(changesError('check', new Error('The Working Document change listener is recovering.'))),\n ),\n ),\n })\n})\n\nfunction changesError(operation: string, cause: unknown): WorkingDocumentChangesError {\n return new WorkingDocumentChangesError({ cause, operation })\n}\n","import { sql } from 'drizzle-orm'\nimport type { Schema } from 'effect'\nimport {\n bigint,\n bytea,\n check,\n foreignKey,\n index,\n integer,\n jsonb,\n pgTable,\n primaryKey,\n text,\n timestamp,\n unique,\n uniqueIndex,\n uuid,\n} from 'drizzle-orm/pg-core'\nimport { documentsTable, documentRevisions } from '../documents/tables'\nimport { isOneOf, transactionTimestamp } from '../database/table-helpers'\n\nconst WORKING_DOCUMENT_PUBLISH_PHASES = ['pending', 'checkpointed', 'published', 'failed'] as const\n\nexport const workingDocuments = pgTable(\n 'working_documents',\n {\n documentId: uuid('document_id')\n .primaryKey()\n .references(() => documentsTable.id, { onDelete: 'cascade' }),\n formatVersion: integer('format_version').notNull(),\n generationId: uuid('generation_id').notNull(),\n state: bytea().notNull(),\n savedStateVector: bytea('saved_state_vector').notNull(),\n savedVersion: uuid('saved_version').notNull(),\n nextUpdateSequence: bigint('next_update_sequence', { mode: 'number' }).default(1).notNull(),\n updatedAt: timestamp('updated_at', { mode: 'string', withTimezone: true }).default(transactionTimestamp).notNull(),\n },\n (table) => [\n unique('working_documents_generation_unique').on(table.documentId, table.generationId),\n foreignKey({\n columns: [table.documentId, table.savedVersion],\n foreignColumns: [documentRevisions.documentId, documentRevisions.id],\n name: 'working_documents_saved_version_fkey',\n }).onDelete('restrict'),\n check('working_documents_format_version_check', sql`${table.formatVersion} = 1`),\n check('working_documents_state_check', sql`octet_length(${table.state}) > 0`),\n check('working_documents_saved_state_vector_check', sql`octet_length(${table.savedStateVector}) > 0`),\n check(\n 'working_documents_next_update_sequence_check',\n sql`${table.nextUpdateSequence} between 1 and 9007199254740991`,\n ),\n ],\n)\n\nexport const workingDocumentUpdates = pgTable(\n 'working_document_updates',\n {\n documentId: uuid('document_id').notNull(),\n generationId: uuid('generation_id').notNull(),\n sequence: bigint({ mode: 'number' }).notNull(),\n update: bytea().notNull(),\n createdAt: timestamp('created_at', { mode: 'string', withTimezone: true }).default(transactionTimestamp).notNull(),\n },\n (table) => [\n primaryKey({ columns: [table.documentId, table.sequence] }),\n foreignKey({\n columns: [table.documentId, table.generationId],\n foreignColumns: [workingDocuments.documentId, workingDocuments.generationId],\n name: 'working_document_updates_document_generation_fkey',\n }).onDelete('cascade'),\n check('working_document_updates_sequence_check', sql`${table.sequence} between 1 and 9007199254740991`),\n check('working_document_updates_update_check', sql`octet_length(${table.update}) > 0`),\n ],\n)\n\nexport const workingDocumentPublishAttempts = pgTable(\n 'working_document_publish_attempts',\n {\n id: uuid().primaryKey(),\n activity: jsonb().$type<Schema.JsonObject>().notNull(),\n documentId: uuid('document_id').notNull(),\n expectedGeneration: uuid('expected_generation').notNull(),\n expectedVersion: uuid('expected_version').notNull(),\n highWatermark: bigint('high_watermark', { mode: 'number' }).notNull(),\n markdownHash: text('markdown_hash').notNull(),\n state: bytea().notNull(),\n stateVector: bytea('state_vector').notNull(),\n checkpointVersion: uuid('checkpoint_version'),\n phase: text({ enum: WORKING_DOCUMENT_PUBLISH_PHASES }).default('pending').notNull(),\n failure: text(),\n createdAt: timestamp('created_at', { mode: 'string', withTimezone: true }).default(transactionTimestamp).notNull(),\n updatedAt: timestamp('updated_at', { mode: 'string', withTimezone: true }).default(transactionTimestamp).notNull(),\n },\n (table) => [\n foreignKey({\n columns: [table.documentId, table.expectedGeneration],\n foreignColumns: [workingDocuments.documentId, workingDocuments.generationId],\n name: 'working_document_publish_attempts_document_generation_fkey',\n }).onDelete('cascade'),\n foreignKey({\n columns: [table.documentId, table.expectedVersion],\n foreignColumns: [documentRevisions.documentId, documentRevisions.id],\n name: 'working_document_publish_attempts_expected_version_fkey',\n }).onDelete('restrict'),\n foreignKey({\n columns: [table.documentId, table.checkpointVersion],\n foreignColumns: [documentRevisions.documentId, documentRevisions.id],\n name: 'working_document_publish_attempts_checkpoint_version_fkey',\n }).onDelete('restrict'),\n check('working_document_publish_attempts_phase_check', isOneOf(table.phase, WORKING_DOCUMENT_PUBLISH_PHASES)),\n check(\n 'working_document_publish_attempts_high_watermark_check',\n sql`${table.highWatermark} between 0 and 9007199254740991`,\n ),\n check(\n 'working_document_publish_attempts_markdown_hash_check',\n sql`char_length(${table.markdownHash}) between 1 and 128`,\n ),\n check('working_document_publish_attempts_state_check', sql`octet_length(${table.state}) > 0`),\n check('working_document_publish_attempts_state_vector_check', sql`octet_length(${table.stateVector}) > 0`),\n check(\n 'working_document_publish_attempts_payload_check',\n sql`(\n ${table.phase} = 'pending'\n AND ${table.checkpointVersion} IS NULL\n AND ${table.failure} IS NULL\n ) OR (\n ${table.phase} in ('checkpointed', 'published')\n AND ${table.checkpointVersion} IS NOT NULL\n AND ${table.failure} IS NULL\n ) OR (\n ${table.phase} = 'failed'\n AND ${table.checkpointVersion} IS NULL\n AND char_length(${table.failure}) between 1 and 128\n )`,\n ),\n uniqueIndex('working_document_publish_attempts_active')\n .on(table.documentId)\n .where(sql`${table.phase} in ('pending', 'checkpointed')`),\n index('working_document_publish_attempts_recovery').on(table.documentId, table.createdAt.desc(), table.id.desc()),\n ],\n)\n","import {\n WorkingDocumentFormatVersion,\n WorkingDocumentGenerationId,\n WorkingDocumentHighWatermark,\n WorkingDocumentPublishAttemptId,\n WorkingDocumentPublishPhase,\n WorkingDocumentUpdateSequence,\n} from '@internal/server/adapter/WorkingDocumentStore'\nimport { DocumentVersion, DocumentId } from '@internal/protocol/Documents'\nimport { ActivityContext } from '@internal/protocol/Activity'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-orm/effect-schema'\nimport { Schema } from 'effect'\nimport { workingDocuments, workingDocumentPublishAttempts, workingDocumentUpdates } from './tables'\n\nconst binaryRefinements = {\n state: () => Schema.Uint8Array,\n stateVector: () => Schema.Uint8Array,\n update: () => Schema.Uint8Array,\n}\n\nconst documentRefinements = {\n documentId: () => DocumentId,\n formatVersion: () => WorkingDocumentFormatVersion,\n generationId: () => WorkingDocumentGenerationId,\n nextUpdateSequence: () => WorkingDocumentUpdateSequence,\n savedStateVector: () => Schema.Uint8Array,\n savedVersion: () => DocumentVersion,\n state: binaryRefinements.state,\n}\n\nconst updateRefinements = {\n documentId: () => DocumentId,\n generationId: () => WorkingDocumentGenerationId,\n sequence: () => WorkingDocumentUpdateSequence,\n update: binaryRefinements.update,\n}\n\nconst attemptRefinements = {\n activity: () => ActivityContext,\n checkpointVersion: () => DocumentVersion,\n documentId: () => DocumentId,\n expectedGeneration: () => WorkingDocumentGenerationId,\n expectedVersion: () => DocumentVersion,\n highWatermark: () => WorkingDocumentHighWatermark,\n id: () => WorkingDocumentPublishAttemptId,\n phase: () => WorkingDocumentPublishPhase,\n state: binaryRefinements.state,\n stateVector: binaryRefinements.stateVector,\n}\n\nconst timestampRefinements = {\n createdAt: () => Schema.DateTimeUtcFromString,\n updatedAt: () => Schema.DateTimeUtcFromString,\n}\n\nexport const WorkingDocumentSelect = createSelectSchema(workingDocuments, {\n ...documentRefinements,\n updatedAt: timestampRefinements.updatedAt,\n})\n\nexport const WorkingDocumentInsert = createInsertSchema(workingDocuments, documentRefinements)\n\nexport const WorkingDocumentUpdateSelect = createSelectSchema(workingDocumentUpdates, {\n ...updateRefinements,\n createdAt: timestampRefinements.createdAt,\n})\n\nexport const WorkingDocumentPublishAttemptSelect = createSelectSchema(workingDocumentPublishAttempts, {\n ...attemptRefinements,\n ...timestampRefinements,\n})\n","import type {\n WorkingDocumentPublishAttempt,\n WorkingDocumentSnapshot,\n WorkingDocumentUpdate,\n} from '@internal/server/adapter/WorkingDocumentStore'\nimport {\n WorkingDocumentHighWatermark,\n WorkingDocumentPersistenceError,\n} from '@internal/server/adapter/WorkingDocumentStore'\nimport { Effect, Schema } from 'effect'\nimport { WorkingDocumentSelect, WorkingDocumentPublishAttemptSelect, WorkingDocumentUpdateSelect } from './row-schema'\nimport { workingDocuments, workingDocumentPublishAttempts, workingDocumentUpdates } from './tables'\n\nexport type WorkingDocumentRecord = typeof WorkingDocumentSelect.Type\n\ntype WorkingDocumentRow = typeof workingDocuments.$inferSelect\n\ntype WorkingDocumentPublishAttemptRow = typeof workingDocumentPublishAttempts.$inferSelect\n\ntype WorkingDocumentUpdateRow = typeof workingDocumentUpdates.$inferSelect\n\nexport const decodeWorkingDocument: (\n input: WorkingDocumentRow,\n) => Effect.Effect<WorkingDocumentRecord, WorkingDocumentPersistenceError> = Effect.fn(\n 'WorkingDocumentStore.Drizzle.decodeDocument',\n)(function* (input) {\n const decoded = yield* Schema.decodeUnknownEffect(WorkingDocumentSelect)(input).pipe(\n Effect.mapError((cause) => workingDocumentPersistenceError('WorkingDocumentStore.Drizzle.decodeDocument', cause)),\n )\n\n return {\n ...decoded,\n savedStateVector: Uint8Array.from(decoded.savedStateVector),\n state: Uint8Array.from(decoded.state),\n }\n})\n\nexport const decodeWorkingDocumentUpdate: (\n input: WorkingDocumentUpdateRow,\n) => Effect.Effect<WorkingDocumentUpdate, WorkingDocumentPersistenceError> = Effect.fn(\n 'WorkingDocumentStore.Drizzle.decodeUpdate',\n)(function* (input) {\n const decoded = yield* Schema.decodeEffect(WorkingDocumentUpdateSelect)(input).pipe(\n Effect.mapError((cause) => workingDocumentPersistenceError('WorkingDocumentStore.Drizzle.decodeUpdate', cause)),\n )\n\n return { sequence: decoded.sequence, update: Uint8Array.from(decoded.update) }\n})\n\nexport const decodeWorkingDocumentPublishAttempt: (\n input: WorkingDocumentPublishAttemptRow,\n) => Effect.Effect<WorkingDocumentPublishAttempt, WorkingDocumentPersistenceError> = Effect.fn(\n 'WorkingDocumentStore.Drizzle.decodePublishAttempt',\n)(function* (input) {\n const decoded = yield* Schema.decodeUnknownEffect(WorkingDocumentPublishAttemptSelect)(input).pipe(\n Effect.mapError((cause) =>\n workingDocumentPersistenceError('WorkingDocumentStore.Drizzle.decodePublishAttempt', cause),\n ),\n )\n\n const base = {\n activity: decoded.activity,\n documentId: decoded.documentId,\n expectedGeneration: decoded.expectedGeneration,\n expectedVersion: decoded.expectedVersion,\n highWatermark: decoded.highWatermark,\n id: decoded.id,\n markdownHash: decoded.markdownHash,\n state: Uint8Array.from(decoded.state),\n stateVector: Uint8Array.from(decoded.stateVector),\n }\n\n switch (decoded.phase) {\n case 'pending':\n if (decoded.checkpointVersion !== null || decoded.failure !== null) {\n return yield* invalidAttempt(decoded.documentId, decoded.phase)\n }\n\n return { ...base, phase: decoded.phase }\n case 'checkpointed':\n case 'published':\n if (decoded.checkpointVersion === null || decoded.failure !== null) {\n return yield* invalidAttempt(decoded.documentId, decoded.phase)\n }\n\n return { ...base, checkpointVersion: decoded.checkpointVersion, phase: decoded.phase }\n case 'failed':\n if (decoded.checkpointVersion !== null || decoded.failure === null) {\n return yield* invalidAttempt(decoded.documentId, decoded.phase)\n }\n\n return { ...base, failure: decoded.failure, phase: decoded.phase }\n }\n})\n\nexport function workingDocumentSnapshot(\n document: WorkingDocumentRecord,\n updates: ReadonlyArray<WorkingDocumentUpdate>,\n): WorkingDocumentSnapshot {\n return {\n documentId: document.documentId,\n formatVersion: document.formatVersion,\n generationId: document.generationId,\n highWatermark: WorkingDocumentHighWatermark.make(document.nextUpdateSequence - 1),\n savedStateVector: Uint8Array.from(document.savedStateVector),\n savedVersion: document.savedVersion,\n state: Uint8Array.from(document.state),\n updates,\n }\n}\n\nexport function workingDocumentPersistenceError(operation: string, cause: unknown): WorkingDocumentPersistenceError {\n return new WorkingDocumentPersistenceError({ cause, operation })\n}\n\nfunction invalidAttempt(\n documentId: WorkingDocumentPublishAttempt['documentId'],\n phase: WorkingDocumentPublishAttempt['phase'],\n): Effect.Effect<never, WorkingDocumentPersistenceError> {\n return Effect.fail(\n workingDocumentPersistenceError(\n 'WorkingDocumentStore.Drizzle.decodePublishAttempt',\n new Error(`Publish attempt for document \"${documentId}\" has an invalid \"${phase}\" payload.`),\n ),\n )\n}\n","import { Buffer } from 'node:buffer'\nimport type {\n WorkingDocumentPublishAttempt,\n WorkingDocumentSnapshot,\n WorkingDocumentSnapshotSeed,\n} from '@internal/server/adapter/WorkingDocumentStore'\nimport {\n WorkingDocumentConflict,\n WorkingDocumentGenerationId,\n WorkingDocumentHighWatermark,\n WorkingDocumentSuperseded,\n} from '@internal/server/adapter/WorkingDocumentStore'\nimport { DocumentId } from '@internal/protocol/Documents'\nimport { and, asc, eq, inArray } from 'drizzle-orm'\nimport type { EmptyRelations } from 'drizzle-orm'\nimport * as PgDrizzle from 'drizzle-orm/effect-postgres'\nimport { Effect, Option, Schema } from 'effect'\nimport {\n workingDocumentPersistenceError,\n workingDocumentSnapshot,\n decodeWorkingDocumentPublishAttempt,\n decodeWorkingDocument,\n decodeWorkingDocumentUpdate,\n type WorkingDocumentRecord,\n} from './records'\nimport { workingDocuments, workingDocumentPublishAttempts, workingDocumentUpdates } from './tables'\n\nconst WorkingDocumentIds = Schema.Array(DocumentId)\n\nexport type WorkingDocumentTransaction = PgDrizzle.EffectPgTransaction<PgDrizzle.EffectPgQueryResultHKT, EmptyRelations>\n\nexport function workingDocumentValues(snapshot: WorkingDocumentSnapshotSeed): typeof workingDocuments.$inferInsert {\n return {\n documentId: snapshot.documentId,\n formatVersion: snapshot.formatVersion,\n generationId: snapshot.generationId,\n savedStateVector: Buffer.from(snapshot.savedStateVector),\n savedVersion: snapshot.savedVersion,\n state: Buffer.from(snapshot.state),\n }\n}\n\nexport const loadWorkingDocumentIds = Effect.fn('WorkingDocumentStore.Drizzle.loadDocumentIds')(function* (\n database: Pick<PgDrizzle.EffectPgDatabase, 'select'>,\n) {\n const rows = yield* database\n .select({ documentId: workingDocuments.documentId })\n .from(workingDocuments)\n .orderBy(asc(workingDocuments.documentId))\n\n return yield* Schema.decodeEffect(WorkingDocumentIds)(rows.map((row) => row.documentId))\n})\n\nexport const loadActiveWorkingDocumentPublish = Effect.fn('WorkingDocumentStore.Drizzle.loadActivePublishAttempt')(\n function* (database: Pick<PgDrizzle.EffectPgDatabase, 'select'>, documentId: DocumentId) {\n const rows = yield* database\n .select()\n .from(workingDocumentPublishAttempts)\n .where(\n and(\n eq(workingDocumentPublishAttempts.documentId, documentId),\n inArray(workingDocumentPublishAttempts.phase, ['pending', 'checkpointed']),\n ),\n )\n .orderBy(asc(workingDocumentPublishAttempts.createdAt), asc(workingDocumentPublishAttempts.id))\n .limit(1)\n\n const row = rows[0]\n\n return row\n ? Option.some(yield* decodeWorkingDocumentPublishAttempt(row))\n : Option.none<WorkingDocumentPublishAttempt>()\n },\n)\n\nexport const loadWorkingDocumentSnapshot = Effect.fn('WorkingDocumentStore.Drizzle.loadSnapshot')(function* (\n database: WorkingDocumentTransaction,\n documentId: DocumentId,\n) {\n const documentRows = yield* database\n .select()\n .from(workingDocuments)\n .where(eq(workingDocuments.documentId, documentId))\n .limit(1)\n\n const documentRow = documentRows[0]\n\n if (!documentRow) return Option.none<WorkingDocumentSnapshot>()\n\n const updateRows = yield* database\n .select()\n .from(workingDocumentUpdates)\n .where(eq(workingDocumentUpdates.documentId, documentId))\n .orderBy(asc(workingDocumentUpdates.sequence))\n\n const document = yield* decodeWorkingDocument(documentRow)\n const updates = yield* Effect.forEach(updateRows, decodeWorkingDocumentUpdate)\n\n return Option.some(workingDocumentSnapshot(document, updates))\n})\n\nexport const probeWorkingDocument = Effect.fn('WorkingDocumentStore.Drizzle.probe')(function* (\n database: Pick<PgDrizzle.EffectPgDatabase, 'select'>,\n documentId: DocumentId,\n expectedGeneration: WorkingDocumentSnapshot['generationId'],\n) {\n const rows = yield* database\n .select({\n generationId: workingDocuments.generationId,\n nextUpdateSequence: workingDocuments.nextUpdateSequence,\n })\n .from(workingDocuments)\n .where(eq(workingDocuments.documentId, documentId))\n .limit(1)\n\n const row = rows[0]\n\n if (!row) return yield* new WorkingDocumentSuperseded({ documentId, expectedGeneration })\n const actualGeneration = yield* Schema.decodeEffect(WorkingDocumentGenerationId)(row.generationId)\n\n if (actualGeneration !== expectedGeneration) {\n return yield* new WorkingDocumentSuperseded({ actualGeneration, documentId, expectedGeneration })\n }\n\n return WorkingDocumentHighWatermark.make(row.nextUpdateSequence - 1)\n})\n\nexport const lockWorkingDocument = Effect.fn('WorkingDocumentStore.Drizzle.lockDocument')(function* (\n transaction: WorkingDocumentTransaction,\n documentId: DocumentId,\n expectedGeneration: WorkingDocumentSnapshot['generationId'],\n) {\n const rows = yield* transaction\n .select()\n .from(workingDocuments)\n .where(eq(workingDocuments.documentId, documentId))\n .limit(1)\n .for('update')\n\n const row = rows[0]\n\n if (!row) return yield* new WorkingDocumentSuperseded({ documentId, expectedGeneration })\n const current = yield* decodeWorkingDocument(row)\n\n if (current.generationId !== expectedGeneration) {\n return yield* new WorkingDocumentSuperseded({\n actualGeneration: current.generationId,\n documentId,\n expectedGeneration,\n })\n }\n\n return current\n})\n\nexport const requireWorkingDocumentPublish = Effect.fn('WorkingDocumentStore.Drizzle.requirePublishAttempt')(function* (\n transaction: WorkingDocumentTransaction,\n documentId: DocumentId,\n attemptId: WorkingDocumentPublishAttempt['id'],\n operation: string,\n) {\n const rows = yield* transaction\n .select()\n .from(workingDocumentPublishAttempts)\n .where(\n and(eq(workingDocumentPublishAttempts.documentId, documentId), eq(workingDocumentPublishAttempts.id, attemptId)),\n )\n .limit(1)\n\n const row = rows[0]\n\n return row\n ? yield* decodeWorkingDocumentPublishAttempt(row)\n : yield* workingDocumentConflict(documentId, operation, 'The publish attempt does not exist for this document.')\n})\n\nexport const validateWorkingDocumentCapture = Effect.fn('WorkingDocumentStore.Drizzle.validateCapture')(function* (\n transaction: WorkingDocumentTransaction,\n current: WorkingDocumentRecord,\n highWatermark: number,\n operation: string,\n) {\n const firstRows = yield* transaction\n .select({ sequence: workingDocumentUpdates.sequence })\n .from(workingDocumentUpdates)\n .where(eq(workingDocumentUpdates.documentId, current.documentId))\n .orderBy(asc(workingDocumentUpdates.sequence))\n .limit(1)\n\n const durableHighWatermark = current.nextUpdateSequence - 1\n const compactedThrough = firstRows[0] ? firstRows[0].sequence - 1 : durableHighWatermark\n\n if (highWatermark < compactedThrough || highWatermark > durableHighWatermark) {\n return yield* workingDocumentConflict(\n current.documentId,\n operation,\n 'The captured high-watermark is outside the retained update range.',\n )\n }\n})\n\nexport function workingDocumentSuperseded(\n transaction: WorkingDocumentTransaction,\n documentId: DocumentId,\n expectedGeneration: WorkingDocumentSnapshot['generationId'],\n) {\n return Effect.gen(function* () {\n const rows = yield* transaction\n .select({ generationId: workingDocuments.generationId })\n .from(workingDocuments)\n .where(eq(workingDocuments.documentId, documentId))\n .limit(1)\n\n const row = rows[0]\n\n const actualGeneration = row\n ? yield* Schema.decodeEffect(WorkingDocumentGenerationId)(row.generationId).pipe(\n Effect.mapError((cause) => workingDocumentPersistenceError('WorkingDocumentStore.Drizzle.superseded', cause)),\n )\n : undefined\n\n return yield* new WorkingDocumentSuperseded({\n actualGeneration,\n documentId,\n expectedGeneration,\n })\n })\n}\n\nfunction workingDocumentConflict(documentId: DocumentId, operation: string, message: string) {\n return Effect.fail(new WorkingDocumentConflict({ documentId, message, operation }))\n}\n","import { Buffer } from 'node:buffer'\nimport { PgClient } from '@effect/sql-pg'\nimport type {\n WorkingDocumentActivePublish,\n WorkingDocumentPublishAttempt,\n} from '@internal/server/adapter/WorkingDocumentStore'\nimport type { WorkingDocumentStoreApi } from '@internal/server/adapter/WorkingDocumentStore'\nimport { WorkingDocumentStore } from '@internal/server/adapter/WorkingDocumentStore'\nimport {\n WorkingDocumentConflict,\n WorkingDocumentGenerationId,\n WorkingDocumentPersistenceError,\n WorkingDocumentRef,\n WorkingDocumentSuperseded,\n WorkingDocumentUpdateSequence,\n} from '@internal/server/adapter/WorkingDocumentStore'\nimport type { DocumentId } from '@internal/protocol/Documents'\nimport { and, eq, lte, sql } from 'drizzle-orm'\nimport * as PgDrizzle from 'drizzle-orm/effect-postgres'\nimport { Effect, Layer, Option, Schema } from 'effect'\nimport { transactionTimestamp } from '../database/table-helpers'\nimport {\n workingDocumentPersistenceError,\n workingDocumentSnapshot,\n decodeWorkingDocumentPublishAttempt,\n decodeWorkingDocument,\n decodeWorkingDocumentUpdate,\n} from './records'\nimport {\n workingDocumentValues,\n workingDocumentSuperseded,\n loadActiveWorkingDocumentPublish,\n loadWorkingDocumentIds,\n loadWorkingDocumentSnapshot,\n lockWorkingDocument,\n probeWorkingDocument,\n requireWorkingDocumentPublish,\n validateWorkingDocumentCapture,\n} from './storage'\nimport { workingDocuments, workingDocumentPublishAttempts, workingDocumentUpdates } from './tables'\nimport { WORKING_DOCUMENT_CHANGES_CHANNEL, workingDocumentChangePayload } from './working-document-change-message'\n\nconst StoreDomainError = Schema.Union([\n WorkingDocumentConflict,\n WorkingDocumentPersistenceError,\n WorkingDocumentSuperseded,\n])\n\nconst isStoreDomainError = Schema.is(StoreDomainError)\n\nconst isWorkingDocumentPersistenceError = Schema.is(WorkingDocumentPersistenceError)\n\ntype WorkingDocumentNotifier = Pick<PgDrizzle.EffectPgDatabase, 'execute'>\n\nexport const workingDocumentStoreLayer: Layer.Layer<WorkingDocumentStore, never, PgClient.PgClient> = Layer.effect(\n WorkingDocumentStore,\n Effect.gen(function* () {\n const database = yield* PgDrizzle.makeWithDefaults()\n\n const initialize: WorkingDocumentStoreApi['initialize'] = Effect.fn('WorkingDocumentStore.Drizzle.initialize')(\n (snapshot) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n yield* transaction\n .insert(workingDocuments)\n .values(workingDocumentValues(snapshot))\n .onConflictDoNothing({ target: workingDocuments.documentId })\n const initialized = yield* loadWorkingDocumentSnapshot(transaction, snapshot.documentId)\n\n if (Option.isSome(initialized)) return initialized.value\n\n return yield* persistenceFailure(\n 'WorkingDocumentStore.Drizzle.initialize',\n new Error(`Initialized Working Document \"${snapshot.documentId}\" could not be loaded.`),\n )\n }),\n )\n .pipe(mapPersistenceFailure('WorkingDocumentStore.Drizzle.initialize')),\n )\n\n const load: WorkingDocumentStoreApi['load'] = Effect.fn('WorkingDocumentStore.Drizzle.load')((documentId) =>\n database\n .transaction((transaction) => loadWorkingDocumentSnapshot(transaction, documentId), {\n accessMode: 'read only',\n isolationLevel: 'repeatable read',\n })\n .pipe(mapPersistenceFailure('WorkingDocumentStore.Drizzle.load')),\n )\n\n const documentIds: WorkingDocumentStoreApi['documentIds'] = loadWorkingDocumentIds(database).pipe(\n mapPersistenceFailure('WorkingDocumentStore.Drizzle.documentIds'),\n )\n\n const appendUpdate: WorkingDocumentStoreApi['appendUpdate'] = Effect.fn(\n 'WorkingDocumentStore.Drizzle.appendUpdate',\n )((input) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n const advanced = yield* transaction\n .update(workingDocuments)\n .set({\n nextUpdateSequence: sql`${workingDocuments.nextUpdateSequence} + 1`,\n updatedAt: transactionTimestamp,\n })\n .where(\n and(\n eq(workingDocuments.documentId, input.documentId),\n eq(workingDocuments.generationId, input.expectedGeneration),\n ),\n )\n .returning({ nextUpdateSequence: workingDocuments.nextUpdateSequence })\n\n const next = advanced[0]\n\n if (!next) {\n return yield* workingDocumentSuperseded(transaction, input.documentId, input.expectedGeneration)\n }\n\n const sequence = WorkingDocumentUpdateSequence.make(next.nextUpdateSequence - 1)\n\n const rows = yield* transaction\n .insert(workingDocumentUpdates)\n .values({\n documentId: input.documentId,\n generationId: input.expectedGeneration,\n sequence,\n update: Buffer.from(input.update),\n })\n .returning()\n\n const row = rows[0]\n\n if (!row) {\n return yield* persistenceFailure(\n 'WorkingDocumentStore.Drizzle.appendUpdate',\n new Error(`Appending Working Document update ${sequence} returned no row.`),\n )\n }\n\n const update = yield* decodeWorkingDocumentUpdate(row)\n yield* notifyWorkingDocumentChange(transaction, 'updated', input.documentId, input.expectedGeneration)\n\n return update\n }),\n )\n .pipe(mapStoreFailure('WorkingDocumentStore.Drizzle.appendUpdate')),\n )\n\n const compact: WorkingDocumentStoreApi['compact'] = Effect.fn('WorkingDocumentStore.Drizzle.compact')((input) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n const current = yield* lockWorkingDocument(transaction, input.documentId, input.expectedGeneration)\n yield* validateWorkingDocumentCapture(transaction, current, input.throughSequence, 'compact')\n yield* transaction\n .update(workingDocuments)\n .set({ state: Buffer.from(input.state), updatedAt: transactionTimestamp })\n .where(eq(workingDocuments.documentId, input.documentId))\n yield* transaction\n .delete(workingDocumentUpdates)\n .where(\n and(\n eq(workingDocumentUpdates.documentId, input.documentId),\n lte(workingDocumentUpdates.sequence, input.throughSequence),\n ),\n )\n }),\n )\n .pipe(mapStoreFailure('WorkingDocumentStore.Drizzle.compact')),\n )\n\n const replace: WorkingDocumentStoreApi['replace'] = Effect.fn('WorkingDocumentStore.Drizzle.replace')((input) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n yield* lockWorkingDocument(transaction, input.snapshot.documentId, input.expectedGeneration)\n yield* transaction\n .delete(workingDocumentPublishAttempts)\n .where(eq(workingDocumentPublishAttempts.documentId, input.snapshot.documentId))\n yield* transaction\n .delete(workingDocumentUpdates)\n .where(eq(workingDocumentUpdates.documentId, input.snapshot.documentId))\n\n const rows = yield* transaction\n .update(workingDocuments)\n .set({\n ...workingDocumentValues(input.snapshot),\n nextUpdateSequence: 1,\n updatedAt: transactionTimestamp,\n })\n .where(\n and(\n eq(workingDocuments.documentId, input.snapshot.documentId),\n eq(workingDocuments.generationId, input.expectedGeneration),\n ),\n )\n .returning()\n\n const row = rows[0]\n\n if (!row) {\n return yield* workingDocumentSuperseded(transaction, input.snapshot.documentId, input.expectedGeneration)\n }\n\n const decoded = yield* decodeWorkingDocument(row)\n\n if (input.expectedGeneration !== input.snapshot.generationId) {\n yield* notifyWorkingDocumentChange(\n transaction,\n 'invalidated',\n input.snapshot.documentId,\n input.expectedGeneration,\n )\n }\n\n return workingDocumentSnapshot(decoded, [])\n }),\n )\n .pipe(mapStoreFailure('WorkingDocumentStore.Drizzle.replace')),\n )\n\n const remove: WorkingDocumentStoreApi['remove'] = Effect.fn('WorkingDocumentStore.Drizzle.remove')((input) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n yield* lockWorkingDocument(transaction, input.documentId, input.expectedGeneration)\n\n const rows = yield* transaction\n .delete(workingDocuments)\n .where(\n and(\n eq(workingDocuments.documentId, input.documentId),\n eq(workingDocuments.generationId, input.expectedGeneration),\n ),\n )\n .returning({ documentId: workingDocuments.documentId })\n\n if (!rows[0]) {\n return yield* workingDocumentSuperseded(transaction, input.documentId, input.expectedGeneration)\n }\n\n yield* notifyWorkingDocumentChange(transaction, 'invalidated', input.documentId, input.expectedGeneration)\n }),\n )\n .pipe(mapStoreFailure('WorkingDocumentStore.Drizzle.remove')),\n )\n\n const beginPublish: WorkingDocumentStoreApi['beginPublish'] = Effect.fn(\n 'WorkingDocumentStore.Drizzle.beginPublish',\n )((input) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n const current = yield* lockWorkingDocument(transaction, input.documentId, input.expectedGeneration)\n yield* validateWorkingDocumentCapture(transaction, current, input.highWatermark, 'beginPublish')\n\n if (input.expectedVersion !== current.savedVersion) {\n return yield* conflict(input.documentId, 'beginPublish', 'The saved document version has changed.')\n }\n\n if (!input.markdownHash.trim() || input.markdownHash.length > 128) {\n return yield* conflict(\n input.documentId,\n 'beginPublish',\n 'A Markdown hash between 1 and 128 characters is required.',\n )\n }\n\n const rows = yield* transaction\n .insert(workingDocumentPublishAttempts)\n .values({\n activity: input.activity,\n documentId: input.documentId,\n expectedGeneration: input.expectedGeneration,\n expectedVersion: input.expectedVersion,\n highWatermark: input.highWatermark,\n id: input.id,\n markdownHash: input.markdownHash,\n state: Buffer.from(input.state),\n stateVector: Buffer.from(input.stateVector),\n })\n .onConflictDoNothing()\n .returning()\n\n const row = rows[0]\n\n if (!row) {\n return yield* conflict(\n input.documentId,\n 'beginPublish',\n 'A publish attempt is already active or its identifier already exists.',\n )\n }\n\n const attempt = yield* decodeWorkingDocumentPublishAttempt(row)\n\n return yield* activeAttempt(attempt, 'beginPublish')\n }),\n )\n .pipe(mapStoreFailure('WorkingDocumentStore.Drizzle.beginPublish')),\n )\n\n const markCheckpointed: WorkingDocumentStoreApi['markCheckpointed'] = Effect.fn(\n 'WorkingDocumentStore.Drizzle.markCheckpointed',\n )((input) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n const attempt = yield* requireWorkingDocumentPublish(\n transaction,\n input.documentId,\n input.attemptId,\n 'markCheckpointed',\n )\n\n if (attempt.phase !== 'pending') {\n return yield* invalidTransition(input.documentId, 'markCheckpointed', 'pending')\n }\n\n const current = yield* lockWorkingDocument(transaction, input.documentId, attempt.expectedGeneration)\n yield* validateWorkingDocumentCapture(transaction, current, attempt.highWatermark, 'markCheckpointed')\n\n if (current.savedVersion !== attempt.expectedVersion) {\n return yield* conflict(input.documentId, 'markCheckpointed', 'The saved document version has changed.')\n }\n\n const rows = yield* transaction\n .update(workingDocumentPublishAttempts)\n .set({\n checkpointVersion: input.checkpointVersion,\n phase: 'checkpointed',\n updatedAt: transactionTimestamp,\n })\n .where(\n and(\n eq(workingDocumentPublishAttempts.documentId, input.documentId),\n eq(workingDocumentPublishAttempts.id, input.attemptId),\n eq(workingDocumentPublishAttempts.phase, 'pending'),\n ),\n )\n .returning()\n\n const row = rows[0]\n\n if (!row) return yield* invalidTransition(input.documentId, 'markCheckpointed', 'pending')\n yield* transaction\n .update(workingDocuments)\n .set({\n savedStateVector: Buffer.from(attempt.stateVector),\n savedVersion: input.checkpointVersion,\n state: Buffer.from(attempt.state),\n updatedAt: transactionTimestamp,\n })\n .where(eq(workingDocuments.documentId, input.documentId))\n yield* transaction\n .delete(workingDocumentUpdates)\n .where(\n and(\n eq(workingDocumentUpdates.documentId, input.documentId),\n lte(workingDocumentUpdates.sequence, attempt.highWatermark),\n ),\n )\n const checkpointed = yield* decodeWorkingDocumentPublishAttempt(row)\n\n if (checkpointed.phase === 'checkpointed') return checkpointed\n\n return yield* invalidTransition(input.documentId, 'markCheckpointed', 'pending')\n }),\n )\n .pipe(mapStoreFailure('WorkingDocumentStore.Drizzle.markCheckpointed')),\n )\n\n const completePublish: WorkingDocumentStoreApi['completePublish'] = Effect.fn(\n 'WorkingDocumentStore.Drizzle.completePublish',\n )((input) =>\n database\n .transaction((transaction) =>\n Effect.gen(function* () {\n const attempt = yield* requireWorkingDocumentPublish(\n transaction,\n input.documentId,\n input.attemptId,\n 'completePublish',\n )\n\n yield* lockWorkingDocument(transaction, input.documentId, attempt.expectedGeneration)\n\n if (attempt.phase !== 'checkpointed') {\n return yield* invalidTransition(input.documentId, 'completePublish', 'checkpointed')\n }\n\n const rows = yield* transaction\n .update(workingDocumentPublishAttempts)\n .set({ phase: 'published', updatedAt: transactionTimestamp })\n .where(\n and(\n eq(workingDocumentPublishAttempts.documentId, input.documentId),\n eq(workingDocumentPublishAttempts.id, input.attemptId),\n eq(workingDocumentPublishAttempts.phase, 'checkpointed'),\n ),\n )\n .returning()\n\n const row = rows[0]\n\n if (!row) return yield* invalidTransition(input.documentId, 'completePublish', 'checkpointed')\n const published = yield* decodeWorkingDocumentPublishAttempt(row)\n\n if (published.phase === 'published') return published\n\n return yield* invalidTransition(input.documentId, 'completePublish', 'checkpointed')\n }),\n )\n .pipe(mapStoreFailure('WorkingDocumentStore.Drizzle.completePublish')),\n )\n\n const failPublish: WorkingDocumentStoreApi['failPublish'] = Effect.fn('WorkingDocumentStore.Drizzle.failPublish')(\n (input) =>\n Effect.gen(function* () {\n if (!input.reason.trim() || input.reason.length > 128) {\n return yield* conflict(\n input.documentId,\n 'failPublish',\n 'A failure code between 1 and 128 characters is required.',\n )\n }\n\n return yield* database.transaction((transaction) =>\n Effect.gen(function* () {\n const attempt = yield* requireWorkingDocumentPublish(\n transaction,\n input.documentId,\n input.attemptId,\n 'failPublish',\n )\n\n yield* lockWorkingDocument(transaction, input.documentId, attempt.expectedGeneration)\n\n if (attempt.phase !== 'pending') {\n return yield* invalidTransition(input.documentId, 'failPublish', 'pending')\n }\n\n const rows = yield* transaction\n .update(workingDocumentPublishAttempts)\n .set({\n failure: input.reason,\n phase: 'failed',\n updatedAt: transactionTimestamp,\n })\n .where(\n and(\n eq(workingDocumentPublishAttempts.documentId, input.documentId),\n eq(workingDocumentPublishAttempts.id, input.attemptId),\n eq(workingDocumentPublishAttempts.phase, 'pending'),\n ),\n )\n .returning()\n\n const row = rows[0]\n\n if (!row) return yield* invalidTransition(input.documentId, 'failPublish', 'pending')\n const failed = yield* decodeWorkingDocumentPublishAttempt(row)\n\n if (failed.phase === 'failed') return failed\n\n return yield* invalidTransition(input.documentId, 'failPublish', 'pending')\n }),\n )\n }).pipe(mapStoreFailure('WorkingDocumentStore.Drizzle.failPublish')),\n )\n\n const pendingPublish: WorkingDocumentStoreApi['pendingPublish'] = Effect.fn(\n 'WorkingDocumentStore.Drizzle.pendingPublish',\n )((documentId) =>\n Effect.gen(function* () {\n const attempt = yield* loadActiveWorkingDocumentPublish(database, documentId)\n\n return Option.isSome(attempt)\n ? Option.some(yield* activeAttempt(attempt.value, 'pendingPublish'))\n : Option.none()\n }).pipe(mapPersistenceFailure('WorkingDocumentStore.Drizzle.pendingPublish')),\n )\n\n const probe: WorkingDocumentStoreApi['probe'] = (documentId, expectedGeneration) =>\n probeWorkingDocument(database, documentId, expectedGeneration).pipe(\n mapStoreFailure('WorkingDocumentStore.Drizzle.probe'),\n )\n\n return WorkingDocumentStore.of({\n appendUpdate,\n beginPublish,\n compact,\n completePublish,\n documentIds,\n failPublish,\n initialize,\n load,\n markCheckpointed,\n pendingPublish,\n probe,\n remove,\n replace,\n })\n }),\n)\n\nfunction activeAttempt(\n attempt: WorkingDocumentPublishAttempt,\n operation: string,\n): Effect.Effect<WorkingDocumentActivePublish, WorkingDocumentPersistenceError> {\n return attempt.phase === 'pending' || attempt.phase === 'checkpointed'\n ? Effect.succeed(attempt)\n : persistenceFailure(\n `WorkingDocumentStore.Drizzle.${operation}`,\n new Error(`Expected an active publish attempt, received \"${attempt.phase}\".`),\n )\n}\n\nfunction invalidTransition(documentId: DocumentId, operation: string, expectedPhase: string) {\n return conflict(documentId, operation, `The publish attempt is not ${expectedPhase}.`)\n}\n\nfunction conflict(documentId: DocumentId, operation: string, message: string) {\n return Effect.fail(new WorkingDocumentConflict({ documentId, message, operation }))\n}\n\nfunction mapStoreFailure(operation: string) {\n return <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n effect.pipe(\n Effect.mapError((cause) =>\n isStoreDomainError(cause) ? cause : workingDocumentPersistenceError(operation, cause),\n ),\n )\n}\n\nfunction mapPersistenceFailure(operation: string) {\n return <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n effect.pipe(\n Effect.mapError((cause) =>\n isWorkingDocumentPersistenceError(cause) ? cause : workingDocumentPersistenceError(operation, cause),\n ),\n )\n}\n\nfunction persistenceFailure(operation: string, cause: unknown) {\n return Effect.fail(workingDocumentPersistenceError(operation, cause))\n}\n\nfunction notifyWorkingDocumentChange(\n database: WorkingDocumentNotifier,\n kind: 'invalidated' | 'updated',\n documentId: DocumentId,\n generationId: WorkingDocumentGenerationId,\n) {\n return database\n .execute(\n sql`SELECT pg_notify(${WORKING_DOCUMENT_CHANGES_CHANNEL}, ${workingDocumentChangePayload({\n kind,\n ref: WorkingDocumentRef.make({ documentId, generationId }),\n })})`,\n )\n .pipe(Effect.asVoid)\n}\n","import type { PgPoolConfig } from '@effect/sql-pg/PgClient'\nimport { Layer } from 'effect'\nimport { postgresActivityStoreLayer } from './internal/activity/activity-storage'\nimport { changeJournalLayer } from './internal/change-journal/change-journal'\nimport { cmsDatabaseMigrationLayer } from './internal/database/migrations'\nimport { documentStoreLayer } from './internal/documents/document-store'\nimport { initializationStoreLayer } from './internal/initialization/initialization-store'\nimport { mediaStoreLayer } from './internal/media/media-store'\nimport { seoStoreLayer } from './internal/seo/seo-store'\nimport { postgresAdvisoryLockLayer } from './internal/postgres/advisory-lock'\nimport { postgresUserCommandFenceLayer } from './internal/user-administration/user-command-fence'\nimport { postgresWorkingDocumentChangesLayer } from './internal/working-documents/working-document-changes'\nimport { workingDocumentStoreLayer } from './internal/working-documents/working-document-store'\nimport { schemaClientLayer } from './internal/postgres/scoped-client'\n\nexport interface PostgresOptions extends PgPoolConfig {\n readonly schema: string\n}\n\n/**\n * Supplies every relational server seam from one pool and migration lifecycle.\n * Mutations that span seams remain transactions inside this adapter.\n */\nexport function postgresLayer(options: PostgresOptions) {\n const { schema, ...poolOptions } = options\n\n const clientOptions = {\n ...poolOptions,\n applicationName: options.applicationName ?? '@internal/sql-pg',\n }\n\n const database = schemaClientLayer(clientOptions, schema)\n\n const migrations = cmsDatabaseMigrationLayer(schema).pipe(Layer.provide(database))\n const locks = postgresAdvisoryLockLayer(poolOptions)\n\n const stores = Layer.mergeAll(\n postgresActivityStoreLayer,\n changeJournalLayer,\n documentStoreLayer,\n mediaStoreLayer,\n seoStoreLayer,\n initializationStoreLayer.pipe(Layer.provide(locks)),\n postgresUserCommandFenceLayer.pipe(Layer.provide(locks)),\n postgresWorkingDocumentChangesLayer(poolOptions),\n workingDocumentStoreLayer,\n ).pipe(Layer.provide(migrations), Layer.provide(database))\n\n return stores\n}\n","import type { FormHandlers } from '@internal/server/Forms'\nimport type { AuthoringCatalog } from '@internal/protocol/Configuration'\nimport type { ExecutableDocumentModel } from '@internal/document/DocumentEngine'\nimport type { PreviewOrigin } from '@internal/protocol/Preview'\nimport type { StudioBootstrap } from '@internal/protocol/StudioHttp'\nimport * as NodeCrypto from '@effect/platform-node-shared/NodeCrypto'\nimport { betterAuthLayer } from '@internal/auth/BetterAuth'\nimport { installCms as installNodeCms } from '@internal/platform-node/Installation'\nimport { s3MediaObjectStoreLayer, type S3MediaObjectStoreOptions } from '@internal/s3/S3MediaObjects'\nimport { postgresLayer } from '@internal/sql-pg/Postgres'\nimport { Effect, Layer, Redacted, Schema } from 'effect'\nimport { Pool } from 'pg'\n\ninterface NuxtMediaInstallationOptions extends Omit<S3MediaObjectStoreOptions, 'credentials'> {\n readonly credentials?: {\n readonly accessKeyId: string\n readonly secretAccessKey: string\n readonly sessionToken?: string\n }\n readonly publicBaseUrl: string\n}\n\nexport interface NuxtCmsInstallationOptions {\n readonly baseUrl: PreviewOrigin\n readonly formHandlers?: FormHandlers\n readonly authoring: AuthoringCatalog\n readonly bootstrap: StudioBootstrap\n readonly cleanup: {\n readonly enabled: boolean\n readonly initialDelayMillis: number\n readonly intervalMillis: number\n }\n readonly database: { readonly schema: string; readonly url: string }\n readonly documentModel: ExecutableDocumentModel\n readonly initializationToken: string\n readonly media?: NuxtMediaInstallationOptions\n readonly secret: string\n}\n\nclass DatabaseSchemaProvisionFailed extends Schema.TaggedError<DatabaseSchemaProvisionFailed>()(\n 'NuxtCmsInstallation.DatabaseSchemaProvisionFailed',\n { cause: Schema.Defect(), schema: Schema.String },\n) {}\n\nexport const installCms = Effect.fn('NuxtCmsInstallation.install')(function* (options: NuxtCmsInstallationOptions) {\n yield* provisionDatabaseSchema(options.database)\n const crypto = NodeCrypto.layer\n const databaseUrl = scopedDatabaseUrl(options.database)\n const postgres = postgresLayer({ schema: options.database.schema, url: Redacted.make(options.database.url) })\n\n const identity = Layer.unwrap(\n Effect.acquireRelease(\n Effect.sync(() => new Pool({ connectionString: databaseUrl })),\n (pool) => Effect.promise(() => pool.end()).pipe(Effect.asVoid),\n ).pipe(\n Effect.map((pool) =>\n betterAuthLayer({\n baseURL: options.baseUrl,\n database: pool,\n secret: `cms-authentication:${options.secret}`,\n }).pipe(Layer.provide(postgres), Layer.provide(crypto)),\n ),\n ),\n )\n\n const core = Layer.mergeAll(crypto, postgres, identity)\n\n return yield* installNodeCms({\n baseUrl: options.baseUrl,\n formHandlers: options.formHandlers,\n authoring: options.authoring,\n bootstrap: options.bootstrap,\n cleanup: options.cleanup.enabled\n ? {\n initialDelayMillis: options.cleanup.initialDelayMillis,\n intervalMillis: options.cleanup.intervalMillis,\n }\n : undefined,\n composition: {\n core,\n media: options.media\n ? {\n objects: s3MediaObjectStoreLayer(toS3MediaObjectStoreOptions(options.media)),\n publicBaseUrl: options.media.publicBaseUrl,\n }\n : undefined,\n },\n documentModel: options.documentModel,\n initializationToken: Redacted.make(options.initializationToken),\n studioSecret: Redacted.make(`cms-collaboration:${options.secret}`),\n })\n})\n\nconst provisionDatabaseSchema = Effect.fn('NuxtCmsInstallation.provisionDatabaseSchema')(function* (\n database: NuxtCmsInstallationOptions['database'],\n) {\n const pool = new Pool({ connectionString: database.url })\n\n yield* Effect.tryPromise({\n try: () => pool.query(`create schema if not exists \"${database.schema}\"`),\n catch: (cause) => new DatabaseSchemaProvisionFailed({ cause, schema: database.schema }),\n }).pipe(Effect.ensuring(Effect.promise(() => pool.end())))\n})\n\nexport function toS3MediaObjectStoreOptions(options: NuxtMediaInstallationOptions): S3MediaObjectStoreOptions {\n const { credentials: authoredCredentials, publicBaseUrl: _publicBaseUrl, ...storeOptions } = options\n\n if (!authoredCredentials) return storeOptions\n\n const credentials: NonNullable<S3MediaObjectStoreOptions['credentials']> = authoredCredentials.sessionToken\n ? {\n accessKeyId: authoredCredentials.accessKeyId,\n secretAccessKey: Redacted.make(authoredCredentials.secretAccessKey),\n sessionToken: Redacted.make(authoredCredentials.sessionToken),\n }\n : {\n accessKeyId: authoredCredentials.accessKeyId,\n secretAccessKey: Redacted.make(authoredCredentials.secretAccessKey),\n }\n\n return {\n ...storeOptions,\n credentials,\n }\n}\n\nexport function scopedDatabaseUrl(database: NuxtCmsInstallationOptions['database']): string {\n if (!/^[a-z_][a-z0-9_]{0,62}$/u.test(database.schema)) throw new Error('Invalid CMS PostgreSQL schema.')\n const url = new URL(database.url)\n url.searchParams.set('options', `-csearch_path=${database.schema}`)\n\n return url.href\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,MAAa,qBAA2C;CACtD;EACE,KAAK;GACH;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACA,KAAK;EACL,cAAc;EACd,MAAM;EACN,MAAM;CACR;CACA;EACE,KAAK;GACH;GACA;GACA;GACA;EACF;EACA,KAAK;EACL,cAAc;EACd,MAAM;EACN,MAAM;CACR;CACA;EACE,KAAK,CACH,yDACA,yGACF;EACA,KAAK;EACL,cAAc;EACd,MAAM;EACN,MAAM;CACR;CACA;EACE,KAAK,CACH,imBACA,8lBACF;EACA,KAAK;EACL,cAAc;EACd,MAAM;EACN,MAAM;CACR;CACA;EACE,KAAK;GACH;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACA,KAAK;EACL,cAAc;EACd,MAAM;EACN,MAAM;CACR;AACF;;;;ACpHA,MAAa,uBAAuB,GAAG;AAEvC,SAAgB,QAAQ,QAAoB,QAAwC;CAClF,OAAO,GAAG,GAAG,OAAO,OAAO,IAAI,KAC7B,OAAO,KAAK,UAAU,GAAG,GAAG,OAAO,GACnC,GAAG,IACL,EAAE;AACJ;;;;ACUA,MAAa,WAAW,QACtB,aACA;CACE,WAAW,QAAQ,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,WAAW;CAC9C,YAAY,OAAO,EAAE,MAAM,SAAS,CAAC,CAAC,CACnC,QAAQ,GAAG,GAAG,CAAC,CACf,QAAQ;AACb,IACC,UAAU,CACT,MAAM,6BAA6B,GAAG,GAAG,MAAM,WAAW,GAC1D,MAAM,8BAA8B,GAAG,GAAG,MAAM,WAAW,MAAM,CACnE,CACF;AAEA,MAAa,iBAAiB,QA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"}
|