@phtngyn/cms 0.1.0-beta.0 → 0.1.0-beta.1

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.
Files changed (123) hide show
  1. package/README.md +72 -1
  2. package/package.json +5 -5
  3. package/src/Authoring.d.ts +13 -1
  4. package/src/{AuthoringSchema-BQ5kbhVB.js → Configuration-DyKo0sLS.js} +595 -367
  5. package/src/Configuration-DyKo0sLS.js.map +1 -0
  6. package/src/{DocumentEngine-Da0kWotL.js → DocumentEngine-DYObwMDY.js} +44 -66
  7. package/src/DocumentEngine-DYObwMDY.js.map +1 -0
  8. package/src/DocumentModel.d.ts +4 -0
  9. package/src/DocumentModel.js.map +1 -1
  10. package/src/{HttpPaths-86qLGB90.js → HttpPaths-BbS21Jy8.js} +4 -2
  11. package/src/{HttpPaths-86qLGB90.js.map → HttpPaths-BbS21Jy8.js.map} +1 -1
  12. package/src/Module.js +27 -76
  13. package/src/Module.js.map +1 -1
  14. package/src/{StudioHttp-BTLLooh0.js → StudioHttp-jR2-bc01.js} +44 -242
  15. package/src/StudioHttp-jR2-bc01.js.map +1 -0
  16. package/src/{connection-ZGtL54qY.js → connection-CBTY-TzB.js} +3 -3
  17. package/src/{connection-ZGtL54qY.js.map → connection-CBTY-TzB.js.map} +1 -1
  18. package/src/{installation-BNKaVjni.js → installation-DeuBiFRE.js} +488 -236
  19. package/src/installation-DeuBiFRE.js.map +1 -0
  20. package/src/internal/authoring-catalog.js +147 -0
  21. package/src/internal/authoring-catalog.js.map +1 -0
  22. package/src/internal/authoring-compiler.js +2 -1
  23. package/src/internal/authoring-compiler.js.map +1 -1
  24. package/src/internal/authoring-metadata.js +67 -48
  25. package/src/internal/authoring-metadata.js.map +1 -1
  26. package/src/internal/configuration.js +5 -6
  27. package/src/internal/configuration.js.map +1 -1
  28. package/src/internal/document-model.js +3 -2
  29. package/src/internal/document-model.js.map +1 -1
  30. package/src/internal/studio-app.js +66 -0
  31. package/src/internal/studio-app.js.map +1 -0
  32. package/src/location-DtYv2aes.js +36 -0
  33. package/src/location-DtYv2aes.js.map +1 -0
  34. package/src/{metadata-Czvi3E4K.js → metadata-DE1Mc2td.js} +2 -2
  35. package/src/{metadata-Czvi3E4K.js.map → metadata-DE1Mc2td.js.map} +1 -1
  36. package/src/{models-Citx8jBi.js → models-BkMgeaOL.js} +252 -3
  37. package/src/models-BkMgeaOL.js.map +1 -0
  38. package/src/{models-DS5ClMsH.js → models-C3witQBK.js} +8 -31
  39. package/src/models-C3witQBK.js.map +1 -0
  40. package/src/runtime/blocks.js +17 -0
  41. package/src/runtime/blocks.js.map +1 -0
  42. package/src/runtime/collaboration.js +9 -4
  43. package/src/runtime/collaboration.js.map +1 -1
  44. package/src/runtime/delivery/DocumentRenderer.js +6 -3
  45. package/src/runtime/delivery/DocumentRenderer.js.map +1 -1
  46. package/src/runtime/delivery/blocks.js +6 -0
  47. package/src/runtime/delivery/blocks.js.map +1 -0
  48. package/src/runtime/delivery/context.js +12 -0
  49. package/src/runtime/delivery/context.js.map +1 -0
  50. package/src/runtime/delivery/document-page.js +5 -3
  51. package/src/runtime/delivery/document-page.js.map +1 -1
  52. package/src/runtime/delivery/document.js +18 -2
  53. package/src/runtime/delivery/document.js.map +1 -1
  54. package/src/runtime/delivery/error.js +11 -0
  55. package/src/runtime/delivery/error.js.map +1 -0
  56. package/src/runtime/delivery/plugin.js +21 -0
  57. package/src/runtime/delivery/plugin.js.map +1 -0
  58. package/src/runtime/delivery/useDocument.js +6 -3
  59. package/src/runtime/delivery/useDocument.js.map +1 -1
  60. package/src/runtime/delivery/useDocumentQuery.js +6 -3
  61. package/src/runtime/delivery/useDocumentQuery.js.map +1 -1
  62. package/src/runtime/installation.js +1 -1
  63. package/src/runtime/plugin.js +3 -3
  64. package/src/runtime/plugin.js.map +1 -1
  65. package/src/runtime/preview/connection.js +1 -1
  66. package/src/runtime/preview/controller.js +29 -10
  67. package/src/runtime/preview/controller.js.map +1 -1
  68. package/src/runtime/preview/overlay.js +65 -0
  69. package/src/runtime/preview/overlay.js.map +1 -0
  70. package/src/runtime/preview/plugin.client.js +21 -34
  71. package/src/runtime/preview/plugin.client.js.map +1 -1
  72. package/src/runtime/preview/preview.css +72 -4
  73. package/src/runtime/preview/store.js +1 -1
  74. package/src/runtime/studio-app.js +5 -1
  75. package/src/runtime/studio-app.js.map +1 -1
  76. package/src/runtime/studio-entry.js +36 -0
  77. package/src/runtime/studio-entry.js.map +1 -0
  78. package/src/runtime/studio-navigation.js +11 -0
  79. package/src/runtime/studio-navigation.js.map +1 -0
  80. package/src/{store-Nl4uxEXx.js → store-CfFFx9Ua.js} +3 -3
  81. package/src/{store-Nl4uxEXx.js.map → store-CfFFx9Ua.js.map} +1 -1
  82. package/studio/CreateDocumentDialog--L9lTfx6.js +256 -0
  83. package/studio/collaboration-DUuu678R.js +4565 -0
  84. package/studio/documentPlanning-BXX04Woe.js +28989 -0
  85. package/studio/dom-to-image-more.min-D6jGGdrW.js +877 -0
  86. package/studio/editor-PexnXkJY.js +30817 -0
  87. package/studio/host.css +3 -0
  88. package/studio/host.js +44179 -0
  89. package/studio/rolldown-runtime-B0aSnxlc.js +20 -0
  90. package/dist/studio/assets/ActivityEntryRow-D--fRvWI.js +0 -1
  91. package/dist/studio/assets/ActivityView-D-XBBUHb.js +0 -1
  92. package/dist/studio/assets/CreateDocumentDialog-CH8UH1QM.js +0 -1
  93. package/dist/studio/assets/DocumentsView-CxRpmAxt.js +0 -34
  94. package/dist/studio/assets/DropdownMenu-BSb1l7fr.js +0 -1
  95. package/dist/studio/assets/Input-DVao38h7.js +0 -3
  96. package/dist/studio/assets/MediaView-BHrPIjxB.js +0 -1
  97. package/dist/studio/assets/Modal-VNrXGa5C.js +0 -1
  98. package/dist/studio/assets/OverviewView-DfP6-mLZ.js +0 -1
  99. package/dist/studio/assets/Select-BJZIs9sY.js +0 -1
  100. package/dist/studio/assets/SettingsView-CerHe-ua.js +0 -1
  101. package/dist/studio/assets/Skeleton-CWJNi3nS.js +0 -1
  102. package/dist/studio/assets/StudioPageHeader-DP9HDAF2.js +0 -1
  103. package/dist/studio/assets/UsersView-cP3REkH2.js +0 -1
  104. package/dist/studio/assets/collaboration-BLnCzfvV.js +0 -4
  105. package/dist/studio/assets/context-dY4fNbn3.js +0 -1
  106. package/dist/studio/assets/editor-CE07wW83.js +0 -137
  107. package/dist/studio/assets/gateway-BAyQgCse.js +0 -10
  108. package/dist/studio/assets/index-CjoaPLhZ.js +0 -28
  109. package/dist/studio/assets/index-s2rPqCmP.css +0 -2
  110. package/dist/studio/assets/render-BkxbK2St.js +0 -83
  111. package/dist/studio/assets/rolldown-runtime-DK3Fl9T5.js +0 -1
  112. package/dist/studio/assets/useMediaLibrary-D7qR7aBf.js +0 -1
  113. package/dist/studio/index.html +0 -76
  114. package/src/AuthoringSchema-BQ5kbhVB.js.map +0 -1
  115. package/src/Configuration-BGYFD2N1.js +0 -150
  116. package/src/Configuration-BGYFD2N1.js.map +0 -1
  117. package/src/DocumentEngine-Da0kWotL.js.map +0 -1
  118. package/src/StudioHttp-BTLLooh0.js.map +0 -1
  119. package/src/installation-BNKaVjni.js.map +0 -1
  120. package/src/internal/component-metadata.js +0 -37
  121. package/src/internal/component-metadata.js.map +0 -1
  122. package/src/models-Citx8jBi.js.map +0 -1
  123. package/src/models-DS5ClMsH.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"installation-BNKaVjni.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","invalid","CmsMarkdownDocumentSchema","SourcePathSchema","nestedValue","isJsonObject","DocumentValidationResultSchema","DocumentSummarySchema","DeletedDocumentSchema","DocumentMutationResultSchema","MediaReferenceSchema","DocumentImportReportSchema","CursorPayload","CursorJson","cursors","DocumentHistoryCursorSchema","DocumentHistoryInvalidCursorError","EffectRuntime","DocumentRevisionPageSchema","DocumentRevisionComparisonSchema","DocumentHistoryComparisonTooLargeError","EffectRuntime","PublishedDocumentNotFoundError","DocumentSurroundSchema","PublishedDocumentPageSchema","DocumentNavigationItemSchema","isDocumentGenerationConflict","isDocumentMediaUnavailable","DocumentMediaUnavailableError","DocumentStateModule.makeDocumentState","DocumentMutationResultSchema","DocumentIdSchema","DocumentNotFoundError","makePublishedDocuments","ActivityContextSchema","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","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","DurationRuntime","installCms","unavailable","mapUnavailable","isUnavailable","Cause","Option","documentRefinements","timestampRefinements","ActivityContextSchema","mapPersistenceFailure","persistenceFailure","MediaObjectKeySchema","timestampRefinements","MediaReferenceSchema","persistenceFailure","mapPersistenceFailure","mapStoreFailure","WorkingDocumentChangeSchema","installNodeCms"],"sources":["../../../../server/src/internal/activity/activity-storage.ts","../../../../server/src/internal/activity/activity-entry.ts","../../../../server/src/internal/access-control.ts","../../../../server/src/internal/cursor.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/user.ts","../../../../auth/src/internal/activity-hooks.ts","../../../../server/src/internal/initialization/initialization-store.ts","../../../../server/src/internal/initialization/initialization-failures.ts","../../../../auth/src/internal/errors.ts","../../../../auth/src/internal/identity.ts","../../../../auth/src/internal/initialization.ts","../../../../auth/src/internal/recovery.ts","../../../../auth/src/internal/better-auth.ts","../../../../server/src/adapter/Readiness.ts","../../../../server/src/internal/working-documents/working-document-model.ts","../../../../server/src/internal/working-documents/working-document.ts","../../../../document/src/internal/editor/render.ts","../../../../document/src/DocumentPlanning.ts","../../../../server/src/internal/documents/document-state.ts","../../../../server/src/internal/documents/document-lifecycle.ts","../../../../server/src/internal/documents/document-media-references.ts","../../../../server/src/internal/documents/document-import.ts","../../../../server/src/internal/documents/document-store.ts","../../../../server/src/internal/documents/document-failures.ts","../../../../server/src/internal/documents/document-history.ts","../../../../server/src/internal/documents/published-documents.ts","../../../../server/src/internal/documents/documents.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-reconciliation.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-object-store.ts","../../../../server/src/internal/media/media-failures.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/internal/preview/preview-sessions.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","../../../../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/server-modules.ts","../../../../platform-node/src/internal/installation/error.ts","../../../../platform-node/src/internal/installation/layer.ts","../../../../platform-node/src/Installation.ts","../../../../s3/src/internal/client.ts","../../../../s3/src/internal/media-object-store.ts","../../../../sql-pg/src/internal/database/table-helpers.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/database/embedded-migrations.generated.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/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/media/row-schema.ts","../../../../sql-pg/src/internal/media/records.ts","../../../../sql-pg/src/internal/media/media-store.ts","../../../../sql-pg/src/internal/readiness.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 { 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 return draft.context.reason === undefined\n ? ActivityEntrySchema.make(entry)\n : ActivityEntrySchema.make({ ...entry, reason: draft.context.reason })\n}\n","import type { StudioAction, StudioAccessDecision, StudioRequestContext } from '@internal/protocol/AccessControl'\nimport { DOCUMENT_ACTIONS, MEDIA_ACTIONS } from '@internal/protocol/AccessControl'\nimport { AccessDenied } from '@internal/protocol/AccessControl'\nimport { Context, Effect, Layer } from 'effect'\n\nconst VIEWER_ACTIONS = new Set<StudioAction>([\n 'document.browse',\n 'document.read',\n 'document.trash',\n 'document.history',\n 'media.read',\n 'media.search',\n 'media.integrity',\n])\n\nconst EDITOR_ACTIONS = new Set<StudioAction>([\n ...DOCUMENT_ACTIONS,\n ...MEDIA_ACTIONS.filter((action) => action !== 'media.cleanup'),\n])\n\nexport interface AccessControlApi {\n readonly require: (context: StudioRequestContext, decision: StudioAccessDecision) => Effect.Effect<void, AccessDenied>\n}\n\nexport class AccessControl extends Context.Service<AccessControl, AccessControlApi>()(\n '@internal/server/AccessControl',\n) {}\n\nexport const defaultAccessControlLayer = Layer.succeed(\n AccessControl,\n AccessControl.of({\n require: Effect.fn('AccessControl.require')(function* (\n context: StudioRequestContext,\n decision: StudioAccessDecision,\n ) {\n if (isAllowed(context, decision.action)) return\n return yield* new AccessDenied({\n action: decision.action,\n actorId: context.actor.id,\n resource: decision.resource,\n })\n }),\n }),\n)\n\nfunction isAllowed(context: StudioRequestContext, action: StudioAction): boolean {\n return context.actor.roles.some((role) => {\n if (role === 'administrator') return true\n return (role === 'editor' && EDITOR_ACTIONS.has(action)) || (role === 'viewer' && VIEWER_ACTIONS.has(action))\n })\n}\n","import { Encoding, Result, Schema } from 'effect'\n\ninterface CursorCodec<Payload, Cursor, Error> {\n readonly decode: (cursor: Cursor) => Result.Result<Payload, Error>\n readonly encode: (payload: Payload) => Cursor\n}\n\n/** Owns the opaque base64url JSON representation shared by keyset cursors. */\nexport function cursorCodec<Payload, Cursor extends string, Error>(\n schema: Schema.Codec<Payload, string>,\n makeCursor: (value: string) => Cursor,\n invalid: () => Error,\n): CursorCodec<Payload, Cursor, Error> {\n const decodeJson = Schema.decodeUnknownResult(schema)\n const encodeJson = Schema.encodeSync(schema)\n\n return {\n decode: (cursor) => {\n const decoded = Encoding.decodeBase64UrlString(cursor)\n if (Result.isFailure(decoded)) return Result.fail(invalid())\n return decodeJson(decoded.success).pipe(Result.mapError(invalid))\n },\n encode: (payload) => makeCursor(Encoding.encodeBase64Url(encodeJson(payload))),\n }\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})\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 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 const output = { entries: page.entries, total: page.total }\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\n/** Portable synchronous SHA-256 for deterministic journal fingerprints and secret redaction. */\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 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 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 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 const second = (large0 + majority) >>> 0\n ;[a, b, c, d, e, f, g, h] = [(first + second) >>> 0, a, b, c, (d + first) >>> 0, e, f, g]\n }\n ;[a, b, c, d, e, f, g, h].forEach((value, index) => {\n hash[index] = ((hash[index] ?? 0) + value) >>> 0\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 { Schema } from 'effect'\nimport { sha256Hex } from '../sha256'\n\nexport const ChangeScope = Schema.Literals(['initialization', 'media', 'users'])\nexport type ChangeScope = typeof ChangeScope.Type\n\nexport const ChangeOutcome = Schema.Literals(['applied', 'cancelled'])\nexport type ChangeOutcome = typeof ChangeOutcome.Type\n\nexport const ChangeSubject = Schema.NonEmptyString.check(Schema.isMaxLength(1_024)).pipe(Schema.brand('ChangeSubject'))\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})\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)\nexport interface PendingChange extends Schema.Schema.Type<typeof PendingChange> {}\n\nexport function changeFingerprint(change: ChangeDraft): string {\n const encoded = Schema.encodeSync(ChangeDraft)(change)\n return sha256Hex(JSON.stringify(canonicalJson(encoded)))\n}\n\nconst isJsonObject = Schema.is(Schema.JsonObject)\nconst decodeJson = Schema.decodeUnknownSync(Schema.Json)\n\nfunction canonicalJson(value: Schema.Json): Schema.Json {\n if (Array.isArray(value)) return value.map(canonicalJson)\n if (!isJsonObject(value)) return value\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 switch (result._tag) {\n case 'Unresolved':\n return EffectRuntime.succeed(result.change)\n case 'Recorded':\n return EffectRuntime.fail(new ChangeAlreadyResolved({ changeId: result.entry.id, outcome: 'applied' }))\n case 'Cancelled':\n return EffectRuntime.fail(new ChangeAlreadyResolved({ changeId: result.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 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 if (!change || change.action !== action) return yield* new ChangeMismatch(change ? { changeId: change.id } : {})\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'))\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 { 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})\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: Schema.encodeSync(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 if (!observation.user) {\n yield* journal.resolve(change, { kind: 'cancelled' })\n return { kind: 'cancelled' } as const\n }\n if (!observation.credentialReady || !matchesIntent(intent, observation.user)) {\n return { kind: 'ambiguous' } as const\n }\n yield* resolveInitialAdministrator(journal, change, observation.user)\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 if (!matchesIntent(intent, user)) return yield* new ChangeMismatch({ changeId: change.id })\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 { 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'))\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: Schema.encodeSync(UserChangeIntent)(intent),\n scope: 'users' as const,\n subject: userEmailSubject(intent.kind === 'create' ? intent.normalizedEmail : intent.email),\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 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 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 if (!user) {\n yield* journal.resolve(change, { kind: 'cancelled' })\n return { kind: 'cancelled' } as const\n }\n if (observation.creationChangeId !== change.id) {\n yield* journal.resolve(change, { kind: 'cancelled' })\n return { kind: 'cancelled' } as const\n }\n if (!observation.credentialReady || !sameCreatedUser(intent, user)) return { kind: 'ambiguous' } as const\n yield* journal.resolve(change, appliedResolution(change, intent, user.id))\n return { kind: 'applied', user } as const\n }\n case 'remove': {\n if (observation.kind !== 'remove') return yield* new ChangeMismatch({ changeId: change.id })\n const user = observation.user\n if (!user) {\n yield* journal.resolve(change, appliedResolution(change, intent))\n return { kind: 'applied' } as const\n }\n const unchanged = sameExistingUser(intent, user)\n const remaining = retainedCount(intent.sessionFingerprints, observation.sessionFingerprints)\n if (unchanged && remaining === intent.sessionFingerprints.length) {\n yield* journal.resolve(change, { kind: 'cancelled' })\n return { kind: 'cancelled' } as const\n }\n return { kind: 'ambiguous' } as const\n }\n case 'change-role': {\n if (observation.kind !== 'change-role') return yield* new ChangeMismatch({ changeId: change.id })\n const user = observation.user\n if (!user) return { kind: 'ambiguous' } as const\n if (user.role === intent.previousRole) {\n yield* journal.resolve(change, { kind: 'cancelled' })\n return { kind: 'cancelled' } as const\n }\n if (user.role !== intent.role) return { kind: 'ambiguous' } as const\n yield* journal.resolve(change, appliedResolution(change, intent))\n return { kind: 'applied', user } as const\n }\n case 'revoke-sessions': {\n if (observation.kind !== 'revoke-sessions') return yield* new ChangeMismatch({ changeId: change.id })\n if (!observation.user) return { kind: 'ambiguous' } as const\n const remaining = retainedCount(intent.sessionFingerprints, observation.sessionFingerprints)\n if (observation.sessionsRevokedChangeId === change.id && remaining === 0) {\n yield* journal.resolve(change, appliedResolution(change, intent))\n return { kind: 'applied', user: observation.user } as const\n }\n if (observation.sessionsRevokedChangeId !== change.id && remaining === intent.sessionFingerprints.length) {\n yield* journal.resolve(change, { kind: 'cancelled' })\n return { kind: 'cancelled' } as const\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 if (!resultMatches(intent, user)) return yield* new ChangeMismatch({ changeId: change.id })\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 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 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 { ActivityId } from '@internal/protocol/Activity'\nimport { User } from '@internal/protocol/Users'\nimport { Effect, Schema } from 'effect'\n\nexport const cmsUserCreationChangeField = 'cmsCreationChangeId'\nexport const cmsUserSessionsRevokedChangeField = 'cmsSessionsRevokedChangeId'\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 interface BetterAuthUserValue {\n readonly banned?: boolean | null\n readonly createdAt: Date\n readonly email: string\n readonly emailVerified: boolean\n readonly id: string\n readonly name: string\n readonly role?: string | null\n readonly updatedAt: Date\n}\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(user: BetterAuthUserValue) {\n return 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\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 { 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 } from '@internal/server/adapter/ActivityStore'\nimport { activityEntryFromDraft } from '@internal/server/adapter/ActivityStore'\nimport { createAuthMiddleware, getSessionFromCtx, isAPIError } from 'better-auth/api'\nimport { Crypto, DateTime, Effect } from 'effect'\nimport { decodeBetterAuthActorOption, type BetterAuthActorValue } from './user'\n\ntype WriteActivity = (draft: ActivityDraft) => Effect.Effect<ActivityEntry, unknown>\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 return yield* storage.append(activityEntryFromDraft(id, draft, yield* DateTime.now))\n })\n}\n\nexport function betterAuthActivityOptions(writeActivity: WriteActivity, crypto: Crypto.Crypto) {\n const capturedActors = new WeakMap<object, StudioActor>()\n const write = (action: Parameters<typeof activityDraft>[0], actor: StudioActor) =>\n Effect.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.catchCause(() =>\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 return Effect.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 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 if (context.path === '/sign-in/email') {\n const actor = context.context.newSession?.user ? decodeActor(context.context.newSession.user) : undefined\n return actor ? write('authentication.signed-in', actor) : Promise.resolve()\n }\n const actor = capturedActors.get(context.context)\n capturedActors.delete(context.context)\n if (!actor) return Promise.resolve()\n if (context.path === '/sign-out') return write('authentication.signed-out', actor)\n if (context.path === '/change-password') return write('authentication.password.changed', actor)\n return Promise.resolve()\n })\n\n return {\n emailAndPassword: {\n onPasswordReset: ({ user }: { readonly user: BetterAuthActorValue }) => {\n const actor = decodeActor(user)\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 return option._tag === 'Some' ? option.value : undefined\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})\nexport interface InitializationClaim extends Schema.Schema.Type<typeof InitializationClaim> {}\n\nconst Uninitialized = Schema.Struct({ state: Schema.tag('uninitialized') })\nconst Claiming = Schema.Struct({ claim: InitializationClaim, state: Schema.tag('claiming') })\nconst Ready = Schema.Struct({ state: Schema.tag('ready') })\n\nexport const StoredInitializationState = Schema.Union([Uninitialized, Claiming, Ready]).pipe(\n Schema.toTaggedUnion('state'),\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 { APIError } from 'better-auth/api'\nimport { 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 if (userId !== undefined && matches(code, codes.USER_NOT_FOUND)) return new UserNotFound({ userId })\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 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 if (rejection) return IdentityApplyFailure.Rejected({ error: rejection })\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 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 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 case 'remove': {\n if (matches(code, codes.YOU_CANNOT_REMOVE_YOURSELF)) {\n return new UserSelfRemovalDenied({ userId: command.userId })\n }\n if (matches(code, codes.USER_NOT_FOUND)) return new UserNotFound({ userId: command.userId })\n return matches(code, codes.YOU_ARE_NOT_ALLOWED_TO_DELETE_USERS) ? new UserAdministrationDenied() : undefined\n }\n case 'change-role': {\n if (matches(code, codes.USER_NOT_FOUND)) return new UserNotFound({ userId: command.userId })\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 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 APIError)) return undefined\n const body = Schema.decodeUnknownOption(Schema.Struct({ code: Schema.String }))(cause.body)\n return body._tag === 'Some' ? body.value.code : undefined\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 {\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 const session = yield* Effect.tryPromise({\n catch: () => studioInternalError(),\n try: () => auth.api.getSession({ headers: providerHeaders, query: { disableCookieCache: true } }),\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 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 const search = query.search\n ? { searchField: 'email' as const, searchOperator: 'contains' as const, searchValue: query.search }\n : undefined\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 const users = yield* Effect.forEach(result.users, (user) => decodeUser(user, 'BetterAuth.listUsers'))\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 switch (command.kind) {\n case 'create': {\n const intent = userCreationIntent(command.input)\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 return IdentityPreparation.Prepared({ apply, intent })\n }\n case 'remove': {\n const user = yield* getUser(auth, headers, command.userId)\n const sessions = yield* listSessions(auth, headers, command.userId)\n const intent = userRemovalIntent(\n user,\n sessions.map((session) => session.id),\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 return IdentityPreparation.Prepared({ apply, intent, user })\n }\n case 'change-role': {\n const user = yield* getUser(auth, headers, command.userId)\n if (user.role === command.role) return IdentityPreparation.Noop({ user })\n const intent = userRoleChangeIntent(user, command.role)\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 return IdentityPreparation.Prepared({ apply, intent, user })\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 if (active.length === 0) return IdentityPreparation.Noop({ user })\n const intent = userSessionsRevokedIntent(\n user,\n active.map((session) => session.id),\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 Effect.tryPromise({\n catch: (cause) =>\n IdentityApplyFailure.Unknown({\n error: unavailable('BetterAuth.adminUpdateUser.sessionRevocationReceipt', cause),\n }),\n try: () =>\n auth.api.adminUpdateUser({\n body: {\n data: { [cmsUserSessionsRevokedChangeField]: changeId },\n userId: command.userId,\n },\n headers,\n }),\n }),\n ),\n Effect.as(user),\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 Effect.tryPromise({\n catch: (cause) => prepareError(auth.$ERROR_CODES, operation, cause),\n try: request,\n })\n}\n\nfunction prepareUserOperation<A>(auth: CmsBetterAuth, operation: string, userId: string, request: () => Promise<A>) {\n return Effect.tryPromise({\n catch: (cause) => prepareError(auth.$ERROR_CODES, operation, cause, userId),\n try: request,\n })\n}\n\nfunction applyOperation<A>(\n auth: CmsBetterAuth,\n operation: string,\n command: IdentityCommand,\n request: () => Promise<A>,\n) {\n return Effect.tryPromise({\n catch: (cause) => applyError(auth.$ERROR_CODES, operation, command, cause),\n try: request,\n })\n}\n\nfunction requireAuthority(\n authorityHeaders: WeakMap<IdentityAuthority, globalThis.Headers>,\n authority: IdentityAuthority,\n) {\n const headers = authorityHeaders.get(authority)\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 { 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 const apply = Effect.tryPromise({\n catch: (cause) =>\n initialIdentityError(auth.$ERROR_CODES, 'BetterAuth.initialization.createUser', createInput, cause),\n try: () =>\n auth.api.createUser({\n body: {\n data: { emailVerified: true },\n ...createInput,\n },\n }),\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 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 {\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 = Effect.tryPromise({\n catch: (cause) => unavailable('BetterAuth.recovery.context', cause),\n try: () => auth.$context,\n }).pipe(Effect.map((context) => context.internalAdapter))\n const initialAdapter = Effect.tryPromise({\n catch: (cause) => initializationUnavailable('BetterAuth.initialization.recovery.context', cause),\n try: () => auth.$context,\n }).pipe(Effect.map((context) => context.internalAdapter))\n\n const users: IdentityRecoveryApi = IdentityRecovery.of({\n observe: Effect.fn('BetterAuth.Recovery.observeUserChange')(function* (intent) {\n const adapter = yield* userAdapter\n switch (intent.kind) {\n case 'create': {\n const result = yield* Effect.tryPromise({\n catch: (cause) => unavailable('BetterAuth.recovery.findUserByEmail', cause),\n try: () => adapter.findUserByEmail(intent.normalizedEmail, { includeAccounts: true }),\n })\n if (!result) return { creationChangeId: null, credentialReady: false, kind: 'create', user: null }\n const user = yield* decodeUser(result.user, 'BetterAuth.recovery.findUserByEmail')\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 case 'remove': {\n const user = yield* findUser(adapter, intent.userId)\n const sessionFingerprints = yield* findSessionFingerprints(adapter, intent.userId)\n return { kind: 'remove', sessionFingerprints, user }\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 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 const result = yield* Effect.tryPromise({\n catch: (cause) => initializationUnavailable('BetterAuth.recovery.findInitialAdministrator', cause),\n try: () => adapter.findUserByEmail(intent.normalizedEmail, { includeAccounts: true }),\n })\n if (!result) return { credentialReady: false, user: null }\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: Awaited<CmsBetterAuth['$context']>['internalAdapter'], 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: Awaited<CmsBetterAuth['$context']>['internalAdapter'], userId: string) {\n return Effect.tryPromise({\n catch: (cause) => unavailable('BetterAuth.recovery.findUserById', cause),\n try: () => adapter.findUserById(userId),\n })\n}\n\nfunction findSessionFingerprints(adapter: Awaited<CmsBetterAuth['$context']>['internalAdapter'], userId: string) {\n return Effect.tryPromise({\n catch: (cause) => unavailable('BetterAuth.recovery.listSessions', cause),\n try: () => adapter.listSessions(userId),\n }).pipe(Effect.map((sessions) => sessions.map((session) => sessionFingerprint(session.id))))\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 { 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 './activity-hooks'\nimport { betterAuthIdentity } from './identity'\nimport { betterAuthInitialIdentity } from './initialization'\nimport { betterAuthRecovery } from './recovery'\nimport { cmsUserCreationChangeField, cmsUserSessionsRevokedChangeField } from './user'\n\nconst cmsBetterAuthAccess = createAccessControl(defaultStatements)\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 interface CmsBetterAuthOptions {\n readonly basePath?: string\n readonly baseURL?: string\n readonly database: NonNullable<BetterAuthOptions['database']>\n readonly secret?: string\n}\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\nexport function betterAuthLayer(options: CmsBetterAuthOptions) {\n return Layer.effectContext(\n Effect.gen(function* () {\n const crypto = yield* Crypto.Crypto\n const storage = yield* ActivityStore\n const auth = createCmsBetterAuth(\n options,\n betterAuthActivityOptions(betterAuthActivityWriter(storage, crypto), crypto),\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 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\nexport function rejectExternalAdminRoutes(\n handler: (request: Request) => Promise<Response>,\n basePath: string,\n): (request: Request) => Promise<Response> {\n const mountedAt = canonicalBasePath(basePath)\n return (request) => {\n const path = new URL(request.url).pathname\n const relative =\n mountedAt === '/'\n ? path\n : path === mountedAt\n ? '/'\n : path.startsWith(`${mountedAt}/`)\n ? path.slice(mountedAt.length)\n : path\n if (relative === '/admin' || relative.startsWith('/admin/')) {\n return Promise.resolve(new Response(null, { status: 404 }))\n }\n return handler(request)\n }\n}\n\nfunction canonicalBasePath(basePath: string): string {\n const withLeadingSlash = basePath.startsWith('/') ? basePath : `/${basePath}`\n return withLeadingSlash.replace(/\\/+$/u, '') || '/'\n}\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 { Context, type Effect, Schema } from 'effect'\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","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)\nexport type WorkingDocumentGenerationId = typeof WorkingDocumentGenerationId.Type\n\nexport const WorkingDocumentUpdateSequence = Schema.Int.check(Schema.isGreaterThan(0)).pipe(\n Schema.brand('WorkingDocumentUpdateSequence'),\n)\nexport type WorkingDocumentUpdateSequence = typeof WorkingDocumentUpdateSequence.Type\n\nexport const WorkingDocumentHighWatermark = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)).pipe(\n Schema.brand('WorkingDocumentHighWatermark'),\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\n/** Durable identity for one exact recoverable Working Document generation. */\nexport const WorkingDocumentRef = Schema.Struct({\n documentId: DocumentIdSchema,\n generationId: WorkingDocumentGenerationId,\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\n/** Signals that one exact Working Document generation changed or became invalid. */\nexport const WorkingDocumentChange = Schema.Struct({\n kind: Schema.Literals(['updated', 'invalidated']),\n ref: WorkingDocumentRef,\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 { CmsMarkdownDocument } from '@internal/protocol/Documents'\nimport { renderMarkdown } from 'comark/render'\nimport { Effect } from 'effect'\nimport { toComarkDocument } from '../comark/document-adapter'\nimport { EditorRenderFailed } from './errors'\nimport { withoutEditorMetadata } from './metadata'\n\nexport const renderEditorMarkdown = Effect.fn('EditorDocument.renderMarkdown')((document: CmsMarkdownDocument) => {\n return Effect.tryPromise({\n try: () => renderMarkdown(toComarkDocument(withoutEditorMetadata(document))),\n catch: (cause) => new EditorRenderFailed({ cause }),\n })\n})\n","import type { DocumentConfiguration, CollectionDefinition } from '@internal/protocol/Configuration'\nimport type {\n DocumentAddressError,\n CmsMarkdownDocument,\n CompiledDocument,\n DocumentLocation,\n CreateDocumentInput,\n DocumentSummary,\n} from '@internal/protocol/Documents'\nimport type { Locale } from '@internal/protocol/Configuration'\nimport type { PublicPath, SourcePath } from '@internal/protocol/Documents'\nimport {\n CmsMarkdownDocument as CmsMarkdownDocumentSchema,\n DocumentValidationFailed,\n localizeDocumentPath,\n normalizeDocumentRelativePath,\n normalizePublicPath,\n parseDocumentAddress,\n resolveDocumentAddress,\n} from '@internal/protocol/Documents'\nimport { SourcePath as SourcePathSchema } from '@internal/protocol/Documents'\nimport { Effect, Result, Schema } from 'effect'\nimport { renderEditorMarkdown } from './internal/editor/render'\nimport type { EditorRenderFailed } from './internal/editor/errors'\n\nexport interface DocumentCreationPlan {\n readonly collection: CollectionDefinition\n readonly data: Readonly<Record<string, string>>\n readonly key: PublicPath\n readonly locale?: Locale\n readonly path: PublicPath\n readonly sourcePath: SourcePath\n readonly title: string\n}\n\nexport interface InitialDocumentSource {\n readonly body: CmsMarkdownDocument\n readonly markdown: string\n}\n\n/** Derives one canonical Source path and public path without performing persistence. */\nexport function planDocumentCreation(\n configuration: DocumentConfiguration,\n input: CreateDocumentInput,\n): Result.Result<DocumentCreationPlan, DocumentValidationFailed> {\n return Result.gen(function* () {\n const collection = configuration.types.find((candidate) => candidate.collection === input.collection)\n if (!collection) return yield* invalid(`Document collection \"${input.collection}\" does not exist.`, 'collection')\n if (!collection.canCreate)\n return yield* invalid(`Document collection \"${input.collection}\" does not allow creation.`, 'collection')\n const title = input.title.trim()\n if (!title) return yield* invalid('A document title is required.', 'title')\n\n const locale = yield* resolveLocale(configuration, input.locale)\n const address = yield* parseDocumentAddress(collection.addressPattern).pipe(Result.mapError(addressInvalid))\n const relativePath = yield* resolveRelativePath(collection, input.location)\n const data = Object.fromEntries(\n address.tokens.flatMap((token) => {\n if (token.name === 'slug' && relativePath) return [[token.name, relativePath.split('/').at(-1) ?? relativePath]]\n return []\n }),\n )\n const relativeKey = yield* normalizePublicPath(relativePath).pipe(Result.mapError(addressInvalid))\n const key = yield* resolveDocumentAddress(address, relativeKey, data).pipe(Result.mapError(addressInvalid))\n const sourcePath = documentSourcePath(collection, relativePath, locale)\n const path = localizeDocumentPath(key, locale, configuration.locales)\n\n return Object.assign(\n {\n collection,\n data,\n key,\n path,\n sourcePath,\n title,\n },\n locale === undefined ? undefined : { locale },\n ) satisfies DocumentCreationPlan\n })\n}\n\n/** Creates the canonical initial editor source, including configured field defaults. */\nexport const createInitialDocumentSource: (\n plan: DocumentCreationPlan,\n) => Effect.Effect<InitialDocumentSource, EditorRenderFailed> = Effect.fn('DocumentPlanning.createInitialSource')(\n function* (plan: DocumentCreationPlan) {\n const body = CmsMarkdownDocumentSchema.make({\n frontmatter: initialFrontmatter(plan),\n meta: {},\n nodes: [['h1', {}, plan.title]],\n })\n return {\n body,\n markdown: yield* renderEditorMarkdown(body),\n } satisfies InitialDocumentSource\n },\n)\n\n/** Derives the canonical destination Source path while preserving the Document's collection and locale. */\nexport function planDocumentMove(\n configuration: DocumentConfiguration,\n document: CompiledDocument,\n location: DocumentLocation,\n): Result.Result<SourcePath, DocumentValidationFailed> {\n return Result.gen(function* () {\n const collection = configuration.types.find((candidate) => candidate.collection === document.collection)\n if (!collection) {\n return yield* invalid(`Document collection \"${document.collection}\" does not exist.`, 'documentId')\n }\n const relativePath = yield* resolveRelativePath(collection, location)\n return documentSourcePath(collection, relativePath, document.locale)\n })\n}\n\n/** Derives a collection-relative hierarchy path from a canonical document summary. */\nexport function documentRelativePath(\n collection: CollectionDefinition,\n entry: Pick<DocumentSummary, 'document' | 'sourcePath'>,\n): string | undefined {\n let sourcePath: string = entry.sourcePath\n if (entry.document.locale && sourcePath.startsWith(`${entry.document.locale}/`)) {\n sourcePath = sourcePath.slice(entry.document.locale.length + 1)\n }\n if (collection.directory !== '.' && sourcePath.startsWith(`${collection.directory}/`)) {\n sourcePath = sourcePath.slice(collection.directory.length + 1)\n }\n sourcePath = sourcePath.replace(/\\.(?:md|mdc)$/iu, '')\n return sourcePath.toLocaleLowerCase() === 'index' ? undefined : sourcePath\n}\n\nfunction documentSourcePath(\n collection: CollectionDefinition,\n relativePath: string,\n locale: Locale | undefined,\n): SourcePath {\n const sourceName = relativePath ? `${relativePath}.md` : 'index.md'\n return SourcePathSchema.make(\n [locale, collection.directory === '.' ? undefined : collection.directory, sourceName]\n .filter((value) => value !== undefined)\n .join('/'),\n )\n}\n\nfunction initialFrontmatter(plan: DocumentCreationPlan): Schema.JsonObject {\n let frontmatter: Schema.JsonObject = { ...plan.data, title: plan.title }\n for (const field of plan.collection.authoringFields) {\n if (field.defaultValue !== undefined && nestedValue(frontmatter, field.path) === undefined) {\n frontmatter = setNestedValue(frontmatter, field.path.split('.'), field.defaultValue)\n }\n }\n return frontmatter\n}\n\nfunction nestedValue(value: Schema.JsonObject, path: string): Schema.Json | undefined {\n return path\n .split('.')\n .reduce<Schema.Json | undefined>(\n (current, segment) => (isJsonObject(current) ? current[segment] : undefined),\n value,\n )\n}\n\nfunction setNestedValue(target: Schema.JsonObject, path: ReadonlyArray<string>, value: Schema.Json): Schema.JsonObject {\n const [segment, ...rest] = path\n if (!segment) return target\n if (rest.length === 0) return Object.assign({}, target, { [segment]: value })\n const current = target[segment]\n return Object.assign({}, target, {\n [segment]: setNestedValue(isJsonObject(current) ? current : {}, rest, value),\n })\n}\n\nconst isJsonObject = Schema.is(Schema.JsonObject)\n\nfunction resolveLocale(\n configuration: DocumentConfiguration,\n requested: Locale | undefined,\n): Result.Result<Locale | undefined, DocumentValidationFailed> {\n const locales = configuration.locales\n if (!locales) {\n return requested === undefined\n ? Result.succeed(undefined)\n : invalid(`Document locale \"${requested}\" is not configured.`, 'locale')\n }\n const locale = requested ?? locales.defaultLocale\n return locales.locales.includes(locale)\n ? Result.succeed(locale)\n : invalid(`Document locale \"${locale}\" does not exist.`, 'locale')\n}\n\nfunction resolveRelativePath(\n collection: CollectionDefinition,\n location: DocumentLocation,\n): Result.Result<string, DocumentValidationFailed> {\n if (location.kind === 'home') {\n return collection.addressPattern === '/:path*'\n ? Result.succeed('')\n : invalid('Only a root catch-all collection can use the home location.', 'location')\n }\n if (location.parent !== undefined && !collection.hierarchy)\n return invalid(`Document collection \"${collection.collection}\" does not allow hierarchy.`, 'location.parent')\n return normalizeDocumentRelativePath(\n [location.parent, location.slug].filter((value) => value !== undefined).join('/'),\n ).pipe(Result.mapError((error) => addressInvalid({ ...error, field: 'location' })))\n}\n\nfunction addressInvalid(error: DocumentAddressError): DocumentValidationFailed {\n return new DocumentValidationFailed({\n issues: [validationIssue(error.message, error.field)],\n })\n}\n\nfunction invalid(message: string, field?: string): Result.Result<never, DocumentValidationFailed> {\n return Result.fail(\n new DocumentValidationFailed({\n issues: [validationIssue(message, field)],\n }),\n )\n}\n\nfunction validationIssue(message: string, field: string | undefined) {\n return field === undefined\n ? { code: 'document.invalid' as const, message, severity: 'error' as const }\n : { code: 'document.invalid' as const, field, message, severity: 'error' as const }\n}\n","import type {\n DocumentCatalog,\n DocumentCompilationSource,\n DocumentEngine,\n DocumentParseFailed,\n} from '@internal/document/DocumentEngine'\nimport type {\n DocumentSummary,\n DocumentBrowseQuery,\n DeletedDocument,\n CompiledDocument,\n DocumentIssue,\n} from '@internal/protocol/Documents'\nimport type { DocumentId, SourcePath } from '@internal/protocol/Documents'\nimport type { DocumentStoreSnapshot } from './document-store'\nimport { DocumentCompilationFailed } from '@internal/document/DocumentEngine'\nimport {\n DocumentSummary as DocumentSummarySchema,\n DeletedDocument as DeletedDocumentSchema,\n DocumentValidationFailed,\n DocumentValidationResult as DocumentValidationResultSchema,\n} from '@internal/protocol/Documents'\nimport { Effect, Result, Schema } from 'effect'\n\nconst isDocumentCompilationFailed = Schema.is(DocumentCompilationFailed)\n\nexport interface DocumentState {\n readonly activeById: ReadonlyMap<DocumentId, DocumentStoreSnapshot['active'][number]>\n readonly authored: DocumentCatalog\n readonly authoredById: ReadonlyMap<DocumentId, CompiledDocument>\n readonly published: DocumentCatalog\n readonly snapshot: DocumentStoreSnapshot\n}\n\nexport function makeDocumentState(\n authored: DocumentCatalog,\n published: DocumentCatalog,\n snapshot: DocumentStoreSnapshot,\n): DocumentState {\n const activeById = new Map<DocumentId, DocumentStoreSnapshot['active'][number]>()\n for (const source of snapshot.active) {\n if (activeById.has(source.documentId)) {\n throw new Error(`Document \"${source.documentId}\" appears more than once in the repository snapshot.`)\n }\n activeById.set(source.documentId, source)\n }\n\n const authoredById = new Map<DocumentId, CompiledDocument>()\n for (const document of authored.documents) {\n if (authoredById.has(document.id)) {\n throw new Error(`Compiled document \"${document.id}\" appears more than once in the authored catalog.`)\n }\n if (!activeById.has(document.id)) {\n throw new Error(`Compiled document \"${document.id}\" is missing from the repository snapshot.`)\n }\n authoredById.set(document.id, document)\n }\n\n for (const documentId of activeById.keys()) {\n if (!authoredById.has(documentId)) {\n throw new Error(`Compiled document \"${documentId}\" is missing from the repository snapshot.`)\n }\n }\n\n return { activeById, authored, authoredById, published, snapshot }\n}\n\nexport const compileDocumentState = Effect.fn('DocumentState.compile')(function* (\n engine: DocumentEngine,\n snapshot: DocumentStoreSnapshot,\n previous?: DocumentState,\n) {\n const authored = yield* engine.compileAll({ previous: previous?.authored, sources: authoredSources(snapshot) })\n const published = yield* engine.compileAll({ previous: previous?.published, sources: publishedSources(snapshot) })\n return makeDocumentState(authored, published, snapshot)\n})\n\nexport function authoredSources(snapshot: DocumentStoreSnapshot): ReadonlyArray<DocumentCompilationSource> {\n return snapshot.active.map((source) => ({\n documentId: source.documentId,\n draft: source.publishedVersion !== source.version,\n markdown: source.markdown,\n sourcePath: source.sourcePath,\n }))\n}\n\nexport function publishedSources(snapshot: DocumentStoreSnapshot): ReadonlyArray<DocumentCompilationSource> {\n return snapshot.published.map((source) => ({\n documentId: source.documentId,\n draft: false,\n markdown: source.markdown,\n sourcePath: source.sourcePath,\n }))\n}\n\nexport const compileValidCatalog = Effect.fn('DocumentState.compileValid')(function* (\n engine: DocumentEngine,\n sources: ReadonlyArray<DocumentCompilationSource>,\n previous: DocumentCatalog,\n) {\n const result = yield* Effect.result(engine.compileAll({ previous, sources }))\n if (Result.isFailure(result)) {\n return yield* new DocumentValidationFailed({\n issues: compilationIssues(result.failure),\n })\n }\n\n const errors = result.success.issues.filter((issue) => issue.severity === 'error')\n if (errors.length > 0) return yield* new DocumentValidationFailed({ issues: errors })\n return result.success\n})\n\nexport const validateDocumentSources = Effect.fn('DocumentState.validate')(function* (\n engine: DocumentEngine,\n sources: ReadonlyArray<DocumentCompilationSource>,\n sourcePath: SourcePath,\n previous: DocumentCatalog,\n) {\n const result = yield* Effect.result(engine.compileAll({ previous, sources }))\n if (Result.isFailure(result)) {\n return DocumentValidationResultSchema.make({\n issues: compilationIssues(result.failure),\n valid: false,\n })\n }\n\n const catalog = result.success\n const document = catalog.documents.find((candidate) => candidate.source.path === sourcePath)\n const issues = catalog.issues\n const validation = {\n issues,\n valid: document !== undefined && !issues.some((issue) => issue.severity === 'error'),\n }\n return DocumentValidationResultSchema.make(\n Object.assign(validation, document === undefined ? undefined : { document }),\n )\n})\n\nexport function authoringEntries(state: DocumentState, query: DocumentBrowseQuery): ReadonlyArray<DocumentSummary> {\n return state.snapshot.active.flatMap((source) => {\n const document = state.authoredById.get(source.documentId)\n if (!document) throw new Error(`Compiled document \"${source.documentId}\" is missing from the repository snapshot.`)\n if (query.collection !== undefined && document.collection !== query.collection) return []\n if (query.locale !== undefined && document.locale !== query.locale) return []\n return [\n DocumentSummarySchema.make({\n document,\n sourcePath: source.sourcePath,\n version: source.version,\n }),\n ]\n })\n}\n\nexport function deletedEntries(state: DocumentState): ReadonlyArray<DeletedDocument> {\n return state.snapshot.deleted.map((source) =>\n DeletedDocumentSchema.make({\n documentId: source.documentId,\n deletedAt: source.deletedAt,\n sourcePath: source.sourcePath,\n version: source.version,\n }),\n )\n}\n\nexport function entryById(state: DocumentState, documentId: DocumentId): DocumentSummary | undefined {\n const source = state.activeById.get(documentId)\n const document = state.authoredById.get(documentId)\n return source && document\n ? DocumentSummarySchema.make({ document, sourcePath: source.sourcePath, version: source.version })\n : undefined\n}\n\nfunction compilationIssues(error: DocumentCompilationFailed | DocumentParseFailed): ReadonlyArray<DocumentIssue> {\n if (isDocumentCompilationFailed(error)) return error.issues\n return [\n {\n code: 'markdown.parse',\n message: errorMessage(error.cause),\n severity: 'error',\n sourcePath: error.sourcePath,\n },\n ]\n}\n\nfunction errorMessage(cause: unknown): string {\n return cause instanceof Error && cause.message ? cause.message : 'Markdown could not be parsed.'\n}\n","import type { DocumentCatalog, DocumentCompilationSource, DocumentEngine } from '@internal/document/DocumentEngine'\nimport { planDocumentMove } from '@internal/document/DocumentPlanning'\nimport type { DocumentConfiguration } from '@internal/protocol/Configuration'\nimport type {\n DocumentMutationResult,\n MoveDocumentInput,\n PublishDocumentInput,\n RemoveDocumentInput,\n RestoreDocumentInput,\n UndeleteDocumentInput,\n UpdateDocumentInput,\n} from '@internal/protocol/Documents'\nimport type { DocumentId, SourcePath } from '@internal/protocol/Documents'\nimport type { DocumentCommitPlan, DocumentStoreApi } from './document-store'\nimport type { DocumentState } from './document-state'\nimport {\n DocumentMutationResult as DocumentMutationResultSchema,\n DocumentNotFound,\n DocumentPathConflict,\n DocumentVersionConflict,\n} from '@internal/protocol/Documents'\nimport { Data, Effect } from 'effect'\nimport {\n authoredSources,\n compileValidCatalog,\n entryById,\n publishedSources,\n validateDocumentSources,\n} from './document-state'\n\nexport type DocumentLifecycleCommand =\n | {\n readonly action: 'document.create'\n readonly documentId: DocumentId\n readonly markdown: string\n readonly sourcePath: SourcePath\n }\n | { readonly action: 'document.update'; readonly input: UpdateDocumentInput }\n | { readonly action: 'document.move'; readonly input: MoveDocumentInput }\n | { readonly action: 'document.remove'; readonly input: RemoveDocumentInput }\n | { readonly action: 'document.restore'; readonly input: RestoreDocumentInput }\n | { readonly action: 'document.undelete'; readonly input: UndeleteDocumentInput }\n | { readonly action: 'document.publish'; readonly input: PublishDocumentInput }\n\nexport interface DocumentLifecycleDependencies {\n readonly engine: DocumentEngine\n readonly configuration: DocumentConfiguration\n readonly repository: DocumentStoreApi\n}\n\ntype PreparedDocumentMutation = Data.TaggedEnum<{\n Commit: {\n readonly authored: DocumentCatalog\n readonly published: DocumentCatalog\n readonly commitPlan: DocumentCommitPlan\n }\n Unchanged: {\n readonly result: DocumentMutationResult\n }\n}>\n\nconst PreparedDocumentMutation = Data.taggedEnum<PreparedDocumentMutation>()\n\nexport const prepareDocumentMutation = Effect.fn('DocumentLifecycle.prepare')(function* (\n dependencies: DocumentLifecycleDependencies,\n state: DocumentState,\n command: DocumentLifecycleCommand,\n) {\n const { engine, configuration, repository } = dependencies\n const authored = authoredSources(state.snapshot)\n const published = publishedSources(state.snapshot)\n\n switch (command.action) {\n case 'document.create': {\n yield* ensurePathAvailable(state, command.sourcePath)\n const nextAuthored = [\n ...authored,\n {\n documentId: command.documentId,\n draft: true,\n markdown: command.markdown,\n sourcePath: command.sourcePath,\n },\n ]\n return PreparedDocumentMutation.Commit({\n authored: yield* compileValidCatalog(engine, nextAuthored, state.authored),\n published: state.published,\n commitPlan: {\n action: command.action,\n documentId: command.documentId,\n markdown: command.markdown,\n sourcePath: command.sourcePath,\n },\n })\n }\n case 'document.update': {\n const current = yield* requireActive(state, command.input.documentId)\n yield* requireVersion(current, command.input.expectedVersion)\n const nextAuthored = replaceSource(authored, {\n documentId: current.documentId,\n draft: true,\n markdown: command.input.markdown,\n sourcePath: current.sourcePath,\n })\n return PreparedDocumentMutation.Commit({\n authored: yield* compileValidCatalog(engine, nextAuthored, state.authored),\n published: state.published,\n commitPlan: {\n action: command.action,\n documentId: current.documentId,\n expectedVersion: command.input.expectedVersion,\n markdown: command.input.markdown,\n publishedVersion: current.publishedVersion,\n sourcePath: current.sourcePath,\n },\n })\n }\n case 'document.move': {\n const current = yield* requireActive(state, command.input.documentId)\n yield* requireVersion(current, command.input.expectedVersion)\n const entry = entryById(state, current.documentId)\n if (!entry) return yield* Effect.die(new Error('Active document is missing from the authored catalog.'))\n const sourcePath = yield* Effect.fromResult(\n planDocumentMove(configuration, entry.document, command.input.location),\n )\n yield* ensurePathAvailable(state, sourcePath, current.documentId)\n const nextAuthored = replaceSource(authored, {\n documentId: current.documentId,\n draft: true,\n markdown: current.markdown,\n sourcePath,\n })\n return PreparedDocumentMutation.Commit({\n authored: yield* compileValidCatalog(engine, nextAuthored, state.authored),\n published: state.published,\n commitPlan: {\n action: command.action,\n documentId: current.documentId,\n expectedVersion: command.input.expectedVersion,\n markdown: current.markdown,\n publishedVersion: current.publishedVersion,\n sourcePath,\n },\n })\n }\n case 'document.remove': {\n const current = yield* requireActive(state, command.input.documentId)\n yield* requireVersion(current, command.input.expectedVersion)\n return PreparedDocumentMutation.Commit({\n authored: yield* compileValidCatalog(engine, withoutDocument(authored, current.documentId), state.authored),\n published: yield* compileValidCatalog(engine, withoutDocument(published, current.documentId), state.published),\n commitPlan: {\n action: command.action,\n documentId: current.documentId,\n expectedVersion: command.input.expectedVersion,\n markdown: current.markdown,\n sourcePath: current.sourcePath,\n },\n })\n }\n case 'document.restore': {\n const current = yield* requireActive(state, command.input.documentId)\n yield* requireVersion(current, command.input.expectedVersion)\n const historical = yield* repository.revision(current.documentId, command.input.revisionId)\n const nextAuthored = replaceSource(authored, {\n documentId: current.documentId,\n draft: true,\n markdown: historical.markdown,\n sourcePath: current.sourcePath,\n })\n return PreparedDocumentMutation.Commit({\n authored: yield* compileValidCatalog(engine, nextAuthored, state.authored),\n published: state.published,\n commitPlan: {\n action: command.action,\n documentId: current.documentId,\n expectedVersion: command.input.expectedVersion,\n markdown: historical.markdown,\n publishedVersion: current.publishedVersion,\n revisionId: command.input.revisionId,\n sourcePath: current.sourcePath,\n },\n })\n }\n case 'document.undelete': {\n const deleted = yield* requireDeleted(state, command.input.documentId)\n yield* requireVersion(deleted, command.input.expectedVersion)\n yield* ensurePathAvailable(state, deleted.sourcePath)\n const nextAuthored = [\n ...authored,\n {\n documentId: deleted.documentId,\n draft: true,\n markdown: deleted.markdown,\n sourcePath: deleted.sourcePath,\n },\n ]\n return PreparedDocumentMutation.Commit({\n authored: yield* compileValidCatalog(engine, nextAuthored, state.authored),\n published: state.published,\n commitPlan: {\n action: command.action,\n documentId: deleted.documentId,\n expectedVersion: command.input.expectedVersion,\n markdown: deleted.markdown,\n sourcePath: deleted.sourcePath,\n },\n })\n }\n case 'document.publish': {\n const current = yield* requireActive(state, command.input.documentId)\n yield* requireVersion(current, command.input.expectedVersion)\n if (current.publishedVersion === current.version) {\n const entry = entryById(state, current.documentId)\n const result = {\n action: 'document.publish' as const,\n documentId: current.documentId,\n generation: state.snapshot.generation,\n revisionId: current.revisionId,\n sourcePath: current.sourcePath,\n version: current.version,\n }\n return PreparedDocumentMutation.Unchanged({\n result: DocumentMutationResultSchema.make(Object.assign(result, entry === undefined ? undefined : { entry })),\n })\n }\n const source = {\n documentId: current.documentId,\n draft: false,\n markdown: current.markdown,\n sourcePath: current.sourcePath,\n } satisfies DocumentCompilationSource\n return PreparedDocumentMutation.Commit({\n authored: yield* compileValidCatalog(engine, replaceSource(authored, source), state.authored),\n published: yield* compileValidCatalog(engine, replaceSource(published, source), state.published),\n commitPlan: {\n action: command.action,\n documentId: current.documentId,\n expectedVersion: command.input.expectedVersion,\n markdown: current.markdown,\n revisionId: current.revisionId,\n sourcePath: current.sourcePath,\n },\n })\n }\n }\n})\n\nexport const validateDocumentUpdate = Effect.fn('DocumentLifecycle.validateUpdate')(function* (\n engine: DocumentEngine,\n state: DocumentState,\n input: UpdateDocumentInput,\n) {\n const current = yield* requireActive(state, input.documentId)\n yield* requireVersion(current, input.expectedVersion)\n const source = {\n documentId: current.documentId,\n draft: true,\n markdown: input.markdown,\n sourcePath: current.sourcePath,\n } satisfies DocumentCompilationSource\n return yield* validateDocumentSources(\n engine,\n replaceSource(authoredSources(state.snapshot), source),\n current.sourcePath,\n state.authored,\n )\n})\n\nfunction requireActive(state: DocumentState, documentId: DocumentId) {\n const source = state.activeById.get(documentId)\n return source ? Effect.succeed(source) : Effect.fail(new DocumentNotFound({ documentId }))\n}\n\nfunction requireDeleted(state: DocumentState, documentId: DocumentId) {\n const source = state.snapshot.deleted.find((candidate) => candidate.documentId === documentId)\n return source ? Effect.succeed(source) : Effect.fail(new DocumentNotFound({ documentId }))\n}\n\nfunction requireVersion(\n source: DocumentState['snapshot']['active'][number],\n expectedVersion: DocumentState['snapshot']['active'][number]['version'],\n): Effect.Effect<void, DocumentVersionConflict> {\n return source.version === expectedVersion\n ? Effect.void\n : Effect.fail(\n new DocumentVersionConflict({\n actualVersion: source.version,\n documentId: source.documentId,\n expectedVersion,\n }),\n )\n}\n\nfunction ensurePathAvailable(\n state: DocumentState,\n sourcePath: SourcePath,\n exceptDocumentId?: DocumentId,\n): Effect.Effect<void, DocumentPathConflict> {\n return state.snapshot.active.some(\n (source) => source.sourcePath === sourcePath && source.documentId !== exceptDocumentId,\n )\n ? Effect.fail(new DocumentPathConflict({ sourcePath }))\n : Effect.void\n}\n\nfunction replaceSource(\n sources: ReadonlyArray<DocumentCompilationSource>,\n source: DocumentCompilationSource,\n): ReadonlyArray<DocumentCompilationSource> {\n return [...sources.filter((candidate) => candidate.documentId !== source.documentId), source]\n}\n\nfunction withoutDocument(\n sources: ReadonlyArray<DocumentCompilationSource>,\n documentId: DocumentId,\n): ReadonlyArray<DocumentCompilationSource> {\n return sources.filter((source) => source.documentId !== documentId)\n}\n","import type { DocumentCatalog, DocumentReference } from '@internal/document/DocumentEngine'\nimport type { DocumentId } from '@internal/protocol/Documents'\nimport type { MediaReference } from '@internal/protocol/Media'\nimport { MediaObjectKey, MediaReference as MediaReferenceSchema } from '@internal/protocol/Media'\n\n/** Projects the durable authored/published media-reference union without reparsing documents. */\nexport function projectMediaReferences(\n authored: DocumentCatalog,\n published: DocumentCatalog,\n documentId?: DocumentId,\n): ReadonlyArray<MediaReference> {\n const references = [...referencesFromCatalog(authored, documentId), ...referencesFromCatalog(published, documentId)]\n return [...new Map(references.map((reference) => [referenceIdentity(reference), reference])).values()]\n}\n\nfunction referencesFromCatalog(catalog: DocumentCatalog, documentId?: DocumentId): ReadonlyArray<MediaReference> {\n return catalog.references.all\n .filter(\n (reference) =>\n reference.target.kind === 'media' && (documentId === undefined || reference.source.documentId === documentId),\n )\n .map(toMediaReference)\n}\n\nfunction toMediaReference(reference: DocumentReference): MediaReference {\n if (reference.target.kind !== 'media') throw new Error('Expected a media reference.')\n return MediaReferenceSchema.make({\n documentId: reference.source.documentId,\n nodePath: reference.nodePath,\n objectKey: MediaObjectKey.make(reference.target.key),\n path: reference.source.path,\n sourcePath: reference.source.sourcePath,\n })\n}\n\nfunction referenceIdentity(reference: MediaReference): string {\n return `${reference.documentId}:${reference.sourcePath}:${reference.nodePath.join('.')}:${reference.objectKey}`\n}\n","import type { ActivityContext } from '@internal/protocol/Activity'\nimport type {\n DocumentImportInput,\n DocumentImportMode,\n DocumentImportSource,\n DocumentMutationResult,\n DocumentSource,\n} from '@internal/protocol/Documents'\nimport type { DocumentId, SourcePath } from '@internal/protocol/Documents'\nimport type { DocumentMutationError, DocumentProjectionError } from './document-authoring'\nimport type { DocumentLifecycleCommand } from './document-lifecycle'\nimport { DocumentImportReport as DocumentImportReportSchema } from '@internal/protocol/Documents'\nimport { Effect } from 'effect'\n\ntype DocumentImportPlan =\n | { readonly kind: 'create'; readonly publish: boolean }\n | { readonly kind: 'preserve' }\n | { readonly current: DocumentSource; readonly kind: 'publish' }\n | { readonly kind: 'unchanged' }\n | { readonly current: DocumentSource; readonly kind: 'update'; readonly publish: boolean }\n\nexport interface DocumentImportDependencies {\n readonly current: (sourcePath: SourcePath) => Effect.Effect<DocumentSource | undefined, DocumentProjectionError>\n readonly nextDocumentId: Effect.Effect<DocumentId>\n readonly runMutation: (\n command: DocumentLifecycleCommand,\n activity: ActivityContext,\n reason: string | undefined,\n ) => Effect.Effect<DocumentMutationResult, DocumentMutationError>\n}\n\n/** Imports configured or migrated Sources through the normal Document lifecycle. */\nexport const importDocumentSources = Effect.fn('Documents.importSources')(function* (\n dependencies: DocumentImportDependencies,\n input: DocumentImportInput,\n activity: ActivityContext,\n) {\n const report = { created: 0, preserved: 0, published: 0, unchanged: 0, updated: 0 }\n for (const source of input.sources) {\n const plan = planDocumentImport(yield* dependencies.current(source.sourcePath), source, input.mode)\n switch (plan.kind) {\n case 'create': {\n const created = yield* dependencies.runMutation(\n {\n action: 'document.create',\n documentId: yield* dependencies.nextDocumentId,\n markdown: source.markdown,\n sourcePath: source.sourcePath,\n },\n activity,\n input.reason,\n )\n report.created += 1\n if (plan.publish) {\n yield* publish(dependencies, created, input, activity)\n report.published += 1\n }\n break\n }\n case 'preserve':\n case 'unchanged':\n report[plan.kind === 'preserve' ? 'preserved' : 'unchanged'] += 1\n break\n case 'publish':\n yield* publish(dependencies, plan.current, input, activity)\n report.published += 1\n break\n case 'update': {\n const updated = yield* dependencies.runMutation(\n {\n action: 'document.update',\n input: {\n documentId: plan.current.documentId,\n expectedVersion: plan.current.version,\n markdown: source.markdown,\n reason: input.reason,\n },\n },\n activity,\n input.reason,\n )\n report.updated += 1\n if (plan.publish) {\n yield* publish(dependencies, updated, input, activity)\n report.published += 1\n }\n break\n }\n }\n }\n return DocumentImportReportSchema.make(report)\n})\n\n/** Plans one deterministic import without performing persistence or generating identities. */\nexport function planDocumentImport(\n current: DocumentSource | undefined,\n source: DocumentImportSource,\n mode: DocumentImportMode,\n): DocumentImportPlan {\n if (!current) return { kind: 'create', publish: source.published }\n if (current.markdown !== source.markdown) {\n return mode === 'overwrite' ? { current, kind: 'update', publish: source.published } : { kind: 'preserve' }\n }\n if (source.published && current.publishedVersion !== current.version) return { current, kind: 'publish' }\n return { kind: 'unchanged' }\n}\n\nfunction publish(\n dependencies: DocumentImportDependencies,\n source: Pick<DocumentSource, 'documentId' | 'version'>,\n input: DocumentImportInput,\n activity: ActivityContext,\n) {\n return dependencies.runMutation(\n {\n action: 'document.publish',\n input: { documentId: source.documentId, expectedVersion: source.version, reason: input.reason },\n },\n activity,\n input.reason,\n )\n}\n","import type { ActivityContext } from '@internal/protocol/Activity'\nimport type {\n DocumentMutationResult,\n DocumentMediaUnavailable,\n DocumentNotFound,\n DocumentPathConflict,\n DocumentRevision,\n DocumentSource,\n DocumentVersionConflict,\n} from '@internal/protocol/Documents'\nimport type { DocumentId, RevisionId, SourcePath } from '@internal/protocol/Documents'\nimport type { MediaReference } from '@internal/protocol/Media'\nimport type { Effect } from 'effect'\nimport { DocumentGeneration } from '@internal/protocol/Documents'\nimport { Context, DateTime } from 'effect'\nimport { DocumentGenerationConflict, DocumentPersistenceError } from './document-failures'\n\nexport interface DocumentStoreSnapshot {\n readonly active: ReadonlyArray<DocumentSource>\n readonly deleted: ReadonlyArray<DeletedDocumentSource>\n readonly generation: DocumentGeneration\n readonly published: ReadonlyArray<DocumentSource>\n}\n\nexport interface DeletedDocumentSource extends DocumentSource {\n readonly deletedAt: DateTime.Utc\n}\n\nexport interface DocumentStoreHistoryCursor {\n readonly createdAt: DateTime.Utc\n readonly revisionId: RevisionId\n}\n\nexport interface DocumentStoreHistoryQuery {\n readonly documentId: DocumentId\n readonly cursor?: DocumentStoreHistoryCursor\n readonly limit: number\n}\n\nexport interface DocumentStoreHistoryPage {\n readonly revisions: ReadonlyArray<DocumentRevision>\n readonly next?: DocumentStoreHistoryCursor\n readonly total: number\n}\n\n/**\n * A product-approved persistence plan. The adapter applies these exact source\n * values after the generation fence succeeds; it does not repeat lifecycle\n * validation or reconstruct document content from its own snapshot.\n */\nexport type DocumentCommitPlan =\n | {\n readonly action: 'document.create'\n readonly documentId: DocumentId\n readonly markdown: string\n readonly sourcePath: SourcePath\n }\n | {\n readonly action: 'document.update'\n readonly documentId: DocumentId\n readonly expectedVersion: DocumentSource['version']\n readonly markdown: string\n readonly publishedVersion?: DocumentSource['publishedVersion']\n readonly sourcePath: SourcePath\n }\n | {\n readonly action: 'document.move'\n readonly documentId: DocumentId\n readonly expectedVersion: DocumentSource['version']\n readonly markdown: string\n readonly publishedVersion?: DocumentSource['publishedVersion']\n readonly sourcePath: SourcePath\n }\n | {\n readonly action: 'document.remove'\n readonly documentId: DocumentId\n readonly expectedVersion: DocumentSource['version']\n readonly markdown: string\n readonly sourcePath: SourcePath\n }\n | {\n readonly action: 'document.restore'\n readonly documentId: DocumentId\n readonly expectedVersion: DocumentSource['version']\n readonly markdown: string\n readonly publishedVersion?: DocumentSource['publishedVersion']\n readonly revisionId: RevisionId\n readonly sourcePath: SourcePath\n }\n | {\n readonly action: 'document.undelete'\n readonly documentId: DocumentId\n readonly expectedVersion: DocumentSource['version']\n readonly markdown: string\n readonly sourcePath: SourcePath\n }\n | {\n readonly action: 'document.publish'\n readonly documentId: DocumentId\n readonly expectedVersion: DocumentSource['version']\n readonly markdown: string\n readonly revisionId: RevisionId\n readonly sourcePath: SourcePath\n }\n\nexport interface DocumentStoreCommitInput {\n readonly activity?: ActivityContext\n readonly plan: DocumentCommitPlan\n readonly expectedGeneration: DocumentGeneration\n /** Complete next authored/published media-reference union for `plan.documentId`. */\n readonly mediaReferences: ReadonlyArray<MediaReference>\n}\n\nexport interface DocumentStoreSynchronizeMediaReferencesInput {\n readonly expectedGeneration: DocumentGeneration\n /** Complete media-reference projection for the current document generation. */\n readonly references: ReadonlyArray<MediaReference>\n}\n\n/**\n * The snapshot must describe exactly the semantic state produced by `mutation`.\n * Core reuses the candidate catalogs it validated before commit, so adapters\n * must not rewrite source paths or Markdown while applying a command.\n */\nexport interface DocumentStoreCommitResult {\n readonly mutation: DocumentMutationResult\n readonly snapshot: DocumentStoreSnapshot\n}\n\nexport type DocumentStoreError =\n | DocumentGenerationConflict\n | DocumentMediaUnavailable\n | DocumentNotFound\n | DocumentPathConflict\n | DocumentPersistenceError\n | DocumentVersionConflict\n\n/**\n * Durable document state. A commit atomically advances the catalog generation,\n * revision/head state, and publication state, then returns that exact snapshot.\n * Calling `load` without a generation must always return a snapshot; passing a\n * generation may return `undefined` only when durable state has not advanced.\n */\nexport interface DocumentStoreApi {\n readonly commit: (input: DocumentStoreCommitInput) => Effect.Effect<DocumentStoreCommitResult, DocumentStoreError>\n readonly load: (\n after?: DocumentGeneration,\n ) => Effect.Effect<DocumentStoreSnapshot | undefined, DocumentPersistenceError>\n readonly revisions: (\n query: DocumentStoreHistoryQuery,\n ) => Effect.Effect<DocumentStoreHistoryPage, DocumentPersistenceError>\n readonly revision: (\n documentId: DocumentId,\n revisionId: RevisionId,\n ) => Effect.Effect<DocumentRevision, DocumentNotFound | DocumentPersistenceError>\n readonly synchronizeMediaReferences: (\n input: DocumentStoreSynchronizeMediaReferencesInput,\n ) => Effect.Effect<void, DocumentGenerationConflict | DocumentMediaUnavailable | DocumentPersistenceError>\n}\n\nexport class DocumentStore extends Context.Service<DocumentStore, DocumentStoreApi>()(\n '@internal/server/DocumentStore',\n) {}\n","import { DocumentGeneration } from '@internal/protocol/Documents'\nimport { Schema } from 'effect'\n\nexport class DocumentPersistenceError extends Schema.TaggedError<DocumentPersistenceError>()(\n 'Documents.PersistenceError',\n {\n operation: Schema.NonEmptyString,\n cause: Schema.Defect(),\n },\n) {}\n\nexport class DocumentGenerationConflict extends Schema.TaggedError<DocumentGenerationConflict>()(\n 'Documents.GenerationConflict',\n {\n expectedGeneration: DocumentGeneration,\n actualGeneration: DocumentGeneration,\n },\n) {}\n","import type { AccessDenied, StudioRequestContext } from '@internal/protocol/AccessControl'\nimport type {\n CompareDocumentRevisionsInput,\n DocumentHistoryComparisonTooLarge,\n DocumentHistoryInvalidCursor,\n DocumentHistoryQuery,\n DocumentNotFound,\n DocumentRevision,\n DocumentRevisionChange,\n DocumentRevisionComparison,\n DocumentRevisionPage,\n} from '@internal/protocol/Documents'\nimport type { DocumentId } from '@internal/protocol/Documents'\nimport type { Effect } from 'effect'\nimport type { DocumentPersistenceError } from './document-failures'\nimport {\n DocumentHistoryComparisonTooLarge as DocumentHistoryComparisonTooLargeError,\n DocumentHistoryInvalidCursor as DocumentHistoryInvalidCursorError,\n DocumentRevisionComparison as DocumentRevisionComparisonSchema,\n DocumentRevisionPage as DocumentRevisionPageSchema,\n} from '@internal/protocol/Documents'\nimport { DocumentHistoryCursor as DocumentHistoryCursorSchema, RevisionId } from '@internal/protocol/Documents'\nimport { Effect as EffectRuntime, Schema } from 'effect'\nimport { diffArrays } from 'diff'\nimport type { AccessControlApi } from '../../AccessControl'\nimport type { DocumentStoreApi } from './document-store'\nimport { cursorCodec } from '../cursor'\n\nexport interface DocumentHistoryApi {\n readonly compare: (\n context: StudioRequestContext,\n input: CompareDocumentRevisionsInput,\n ) => Effect.Effect<\n DocumentRevisionComparison,\n AccessDenied | DocumentHistoryComparisonTooLarge | DocumentNotFound | DocumentPersistenceError\n >\n readonly list: (\n context: StudioRequestContext,\n query: DocumentHistoryQuery,\n ) => Effect.Effect<DocumentRevisionPage, AccessDenied | DocumentHistoryInvalidCursor | DocumentPersistenceError>\n readonly read: (\n context: StudioRequestContext,\n documentId: DocumentId,\n revisionId: DocumentRevision['revisionId'],\n ) => Effect.Effect<DocumentRevision, AccessDenied | DocumentNotFound | DocumentPersistenceError>\n}\n\nconst CursorPayload = Schema.Struct({\n createdAt: Schema.DateTimeUtcFromString,\n revisionId: RevisionId,\n})\nconst CursorJson = Schema.fromJsonString(CursorPayload)\nconst cursors = cursorCodec(\n CursorJson,\n (value) => DocumentHistoryCursorSchema.make(value),\n () => new DocumentHistoryInvalidCursorError(),\n)\n\nexport function documentHistoryCapability(\n accessControl: AccessControlApi,\n repository: DocumentStoreApi,\n): DocumentHistoryApi {\n const requireHistory = (context: StudioRequestContext, documentId: DocumentId) =>\n accessControl.require(context, {\n action: 'document.history',\n resource: { documentId, kind: 'document' },\n })\n\n const read = EffectRuntime.fn('Documents.history.read')(function* (\n context: StudioRequestContext,\n documentId: DocumentId,\n revisionId: DocumentRevision['revisionId'],\n ) {\n yield* requireHistory(context, documentId)\n return yield* repository.revision(documentId, revisionId)\n })\n\n const list = EffectRuntime.fn('Documents.history.list')(function* (\n context: StudioRequestContext,\n query: DocumentHistoryQuery,\n ) {\n yield* requireHistory(context, query.documentId)\n const cursor = query.cursor ? yield* EffectRuntime.fromResult(cursors.decode(query.cursor)) : undefined\n const page = yield* repository.revisions({\n cursor,\n documentId: query.documentId,\n limit: query.limit ?? 25,\n })\n const output = {\n revisions: page.revisions.map(({ markdown: _markdown, ...revision }) => revision),\n total: page.total,\n }\n return page.next\n ? DocumentRevisionPageSchema.make({ ...output, nextCursor: cursors.encode(page.next) })\n : DocumentRevisionPageSchema.make(output)\n })\n\n const compare = EffectRuntime.fn('Documents.history.compare')(function* (\n context: StudioRequestContext,\n input: CompareDocumentRevisionsInput,\n ) {\n yield* requireHistory(context, input.documentId)\n const from = yield* repository.revision(input.documentId, input.fromRevisionId)\n const to = yield* repository.revision(input.documentId, input.toRevisionId)\n const changes = yield* compareLines(from.markdown, to.markdown)\n return DocumentRevisionComparisonSchema.make({ changes, from, to })\n })\n\n return { compare, list, read }\n}\n\nconst MAXIMUM_COMPARISON_LINES = 10_000\nconst MAXIMUM_EDIT_LENGTH = 2_000\n\nconst comparisonTooLarge = () =>\n new DocumentHistoryComparisonTooLargeError({\n maximumEditLength: MAXIMUM_EDIT_LENGTH,\n maximumLines: MAXIMUM_COMPARISON_LINES,\n })\n\nconst compareLines = EffectRuntime.fn('Documents.history.compareLines')(function* (\n beforeMarkdown: string,\n afterMarkdown: string,\n) {\n const before = beforeMarkdown.split('\\n')\n const after = afterMarkdown.split('\\n')\n if (before.length > MAXIMUM_COMPARISON_LINES || after.length > MAXIMUM_COMPARISON_LINES) {\n return yield* comparisonTooLarge()\n }\n\n const diff = diffArrays(before, after, {\n maxEditLength: MAXIMUM_EDIT_LENGTH,\n oneChangePerToken: true,\n timeout: 100,\n })\n if (!diff) return yield* comparisonTooLarge()\n\n const changes: DocumentRevisionChange[] = []\n let beforeLine = 1\n let afterLine = 1\n for (const change of diff) {\n for (const line of change.value) {\n if (change.removed) {\n changes.push({ beforeLine, kind: 'removed', line })\n beforeLine += 1\n } else if (change.added) {\n changes.push({ afterLine, kind: 'added', line })\n afterLine += 1\n } else {\n changes.push({ afterLine, beforeLine, kind: 'equal', line })\n beforeLine += 1\n afterLine += 1\n }\n }\n }\n return changes\n})\n","import type { DocumentCatalog } from '@internal/document/DocumentEngine'\nimport type { DocumentConfiguration } from '@internal/protocol/Configuration'\nimport type {\n CompiledDocument,\n DocumentIssue,\n DocumentNavigationItem,\n DocumentNavigationQuery,\n DocumentQuerySort,\n DocumentQueryValue,\n DocumentSurround,\n PublishedDocumentLookup,\n PublishedDocumentNotFound,\n PublishedDocumentPage,\n PublishedDocumentQuery,\n PublishedDocumentSelection,\n PublishedDocumentSurroundQuery,\n} from '@internal/protocol/Documents'\nimport type { Effect } from 'effect'\nimport type { DocumentProjectionError } from './document-authoring'\nimport {\n DocumentNavigationItem as DocumentNavigationItemSchema,\n DocumentQueryScalar,\n DocumentSurround as DocumentSurroundSchema,\n PublishedDocumentNotFound as PublishedDocumentNotFoundError,\n PublishedDocumentPage as PublishedDocumentPageSchema,\n} from '@internal/protocol/Documents'\nimport { PublicPath } from '@internal/protocol/Documents'\nimport { Effect as EffectRuntime, Option, Schema } from 'effect'\n\ntype PublishedDocumentsError = DocumentProjectionError | PublishedDocumentNotFound\n\nexport interface PublishedDocumentsApi {\n readonly diagnostics: Effect.Effect<ReadonlyArray<DocumentIssue>, DocumentProjectionError>\n readonly navigation: (\n query: DocumentNavigationQuery,\n ) => Effect.Effect<ReadonlyArray<DocumentNavigationItem>, DocumentProjectionError>\n readonly query: (query: PublishedDocumentQuery) => Effect.Effect<PublishedDocumentPage, DocumentProjectionError>\n readonly read: (lookup: PublishedDocumentLookup) => Effect.Effect<CompiledDocument, PublishedDocumentsError>\n readonly surround: (\n lookup: PublishedDocumentLookup,\n query: PublishedDocumentSurroundQuery,\n ) => Effect.Effect<DocumentSurround, PublishedDocumentsError>\n}\n\nexport function publishedDocuments(\n configuration: DocumentConfiguration,\n catalog: Effect.Effect<DocumentCatalog, DocumentProjectionError>,\n): PublishedDocumentsApi {\n const read = EffectRuntime.fn('Documents.published.read')(function* (lookup: PublishedDocumentLookup) {\n const current = yield* catalog\n const document = findPublishedDocument(current, lookup)\n return Option.isSome(document) ? document.value : yield* new PublishedDocumentNotFoundError({ lookup })\n })\n\n const query = EffectRuntime.fn('Documents.published.query')(function* (input: PublishedDocumentQuery) {\n return queryDocuments((yield* catalog).documents, input, { limit: input.limit, offset: input.offset ?? 0 })\n })\n\n const navigation = EffectRuntime.fn('Documents.published.navigation')(function* (input: DocumentNavigationQuery) {\n return createNavigation((yield* catalog).documents, input, configuration)\n })\n\n const surround = EffectRuntime.fn('Documents.published.surround')(function* (\n lookup: PublishedDocumentLookup,\n input: PublishedDocumentSurroundQuery,\n ) {\n const current = yield* catalog\n const document = findPublishedDocument(current, lookup)\n if (Option.isNone(document)) return yield* new PublishedDocumentNotFoundError({ lookup })\n const surroundQuery: PublishedDocumentSurroundQuery = Object.assign(\n {},\n { collection: input.collection ?? document.value.collection },\n input.locale === undefined && document.value.locale === undefined\n ? undefined\n : { locale: input.locale ?? document.value.locale },\n input.where === undefined ? undefined : { where: input.where },\n input.sort === undefined ? undefined : { sort: input.sort },\n )\n const page = queryDocuments(current.documents, surroundQuery)\n const index = page.items.findIndex((candidate) => candidate.id === document.value.id)\n return DocumentSurroundSchema.make({\n previous: index > 0 ? (page.items[index - 1] ?? null) : null,\n next: index >= 0 ? (page.items[index + 1] ?? null) : null,\n })\n })\n\n return {\n diagnostics: catalog.pipe(EffectRuntime.map((current) => current.issues)),\n navigation,\n query,\n read,\n surround,\n }\n}\n\nexport function findPublishedDocument(\n catalog: DocumentCatalog,\n lookup: PublishedDocumentLookup,\n): Option.Option<CompiledDocument> {\n switch (lookup.kind) {\n case 'id':\n return Option.fromNullishOr(catalog.documents.find((document) => document.id === lookup.documentId))\n case 'path':\n return catalog.findByPath(lookup.path)\n case 'key':\n return catalog\n .findByKey(lookup.key, lookup.locale)\n .pipe(Option.filter((document) => lookup.collection === undefined || document.collection === lookup.collection))\n }\n}\n\nfunction queryDocuments(\n documents: ReadonlyArray<CompiledDocument>,\n query: PublishedDocumentSelection,\n page?: { readonly limit: number; readonly offset: number },\n): PublishedDocumentPage {\n const filtered = documents.filter((document) => {\n if (query.collection !== undefined && document.collection !== query.collection) return false\n if (query.locale !== undefined && document.locale !== query.locale) return false\n return Object.entries(query.where ?? {}).every(([field, expected]) =>\n matchesValue(documentField(document, field), expected),\n )\n })\n const sorted = query.sort && query.sort.length > 0 ? sortDocuments(filtered, query.sort) : filtered\n const items = page ? sorted.slice(page.offset, page.offset + page.limit) : sorted\n return PublishedDocumentPageSchema.make({ items, total: filtered.length })\n}\n\nfunction createNavigation(\n documents: ReadonlyArray<CompiledDocument>,\n query: DocumentNavigationQuery,\n configuration: DocumentConfiguration,\n): ReadonlyArray<DocumentNavigationItem> {\n const locale = query.locale ?? configuration.locales?.defaultLocale\n const candidates = documents.filter(\n (document) =>\n (query.collection === undefined || document.collection === query.collection) &&\n (locale === undefined || document.locale === locale) &&\n document.data.navigation !== false,\n )\n const roots: MutableNavigationItem[] = []\n const itemsByKey = new Map<string, MutableNavigationItem>()\n const orderByItem = new Map<MutableNavigationItem, number>()\n\n for (const document of candidates) {\n if (document.key === '/') {\n const item = navigationItem(document)\n roots.push(item)\n orderByItem.set(item, Number.NEGATIVE_INFINITY)\n continue\n }\n\n const segments = document.key.slice(1).split('/')\n let parent: MutableNavigationItem | undefined\n for (let index = 0; index < segments.length; index += 1) {\n const key = PublicPath.make(`/${segments.slice(0, index + 1).join('/')}`)\n let item = itemsByKey.get(key)\n if (!item) {\n item = { children: [], key, title: titleFromSegment(segments[index] ?? '') }\n itemsByKey.set(key, item)\n if (parent) parent.children.push(item)\n else roots.push(item)\n }\n if (index === segments.length - 1) {\n const resolved = navigationItem(document)\n item.title = resolved.title\n item.path = resolved.path\n item.locale = resolved.locale\n item.documentId = resolved.documentId\n orderByItem.set(item, navigationOrder(document))\n }\n parent = item\n }\n }\n\n sortNavigation(roots, orderByItem)\n return roots.map((item) => DocumentNavigationItemSchema.make(item))\n}\n\ninterface MutableNavigationItem {\n key: DocumentNavigationItem['key']\n title: string\n path?: DocumentNavigationItem['path']\n locale?: DocumentNavigationItem['locale']\n documentId?: DocumentNavigationItem['documentId']\n children: MutableNavigationItem[]\n}\n\nfunction navigationItem(document: CompiledDocument): MutableNavigationItem {\n const navigation = document.data.navigation\n const configuredTitle = Schema.is(Schema.JsonObject)(navigation) ? navigation.title : undefined\n return {\n children: [],\n documentId: document.id,\n key: document.key,\n locale: document.locale,\n path: document.path,\n title:\n Schema.is(Schema.String)(configuredTitle) && configuredTitle.trim() ? configuredTitle.trim() : document.title,\n }\n}\n\nfunction navigationOrder(document: CompiledDocument): number {\n const navigation = document.data.navigation\n const configuredOrder = Schema.is(Schema.JsonObject)(navigation) ? navigation.order : undefined\n const order = configuredOrder ?? document.data.order\n return Schema.is(Schema.Finite)(order) ? order : Number.POSITIVE_INFINITY\n}\n\nfunction sortNavigation(items: MutableNavigationItem[], orderByItem: Map<MutableNavigationItem, number>): void {\n items.sort((left, right) => {\n const byOrder =\n (orderByItem.get(left) ?? Number.POSITIVE_INFINITY) - (orderByItem.get(right) ?? Number.POSITIVE_INFINITY)\n return byOrder || left.title.localeCompare(right.title)\n })\n items.forEach((item) => sortNavigation(item.children, orderByItem))\n}\n\nfunction documentField(document: CompiledDocument, field: string): Schema.Json | undefined {\n switch (field) {\n case 'collection':\n return document.collection\n case 'description':\n return document.description\n case 'id':\n return document.id\n case 'key':\n return document.key\n case 'locale':\n return document.locale\n case 'path':\n return document.path\n case 'source.path':\n return document.source.path\n case 'title':\n return document.title\n default:\n return nestedValue(document.data, field.startsWith('data.') ? field.slice('data.'.length) : field)\n }\n}\n\nfunction nestedValue(value: Schema.JsonObject, path: string): Schema.Json | undefined {\n return path.split('.').reduce<Schema.Json | undefined>((current, segment) => {\n if (!Schema.is(Schema.JsonObject)(current)) return undefined\n return current[segment]\n }, value)\n}\n\nfunction matchesValue(actual: Schema.Json | undefined, expected: DocumentQueryValue): boolean {\n const expectedValues = Array.isArray(expected) ? expected : [expected]\n const actualValues = Array.isArray(actual) ? actual : [actual]\n return actualValues.some((value) => Schema.is(DocumentQueryScalar)(value) && expectedValues.includes(value))\n}\n\nfunction sortDocuments(\n documents: ReadonlyArray<CompiledDocument>,\n sorts: ReadonlyArray<DocumentQuerySort>,\n): ReadonlyArray<CompiledDocument> {\n return documents.toSorted((left, right) => {\n for (const sort of sorts) {\n const comparison = compareValues(documentField(left, sort.field), documentField(right, sort.field))\n if (comparison !== 0) return sort.direction === 'desc' ? -comparison : comparison\n }\n return 0\n })\n}\n\nfunction compareValues(left: Schema.Json | undefined, right: Schema.Json | undefined): number {\n if (left === right) return 0\n if (left === undefined || left === null) return 1\n if (right === undefined || right === null) return -1\n if (Schema.is(Schema.Finite)(left) && Schema.is(Schema.Finite)(right)) return left - right\n const leftText = Schema.is(Schema.String)(left) ? left : (JSON.stringify(left) ?? '')\n const rightText = Schema.is(Schema.String)(right) ? right : (JSON.stringify(right) ?? '')\n return leftText.localeCompare(rightText)\n}\n\nfunction titleFromSegment(segment: string): string {\n return segment.replace(/[-_]+/gu, ' ').replace(/^./u, (character) => character.toUpperCase())\n}\n","import type {\n DocumentEngineConfigurationInvalid,\n DocumentEngine,\n DocumentEngineOptions,\n} from '@internal/document/DocumentEngine'\nimport type { AccessDenied, DocumentAccessDecision, StudioRequestContext } from '@internal/protocol/AccessControl'\nimport type { ActivityContext } from '@internal/protocol/Activity'\nimport type { DocumentConfiguration } from '@internal/protocol/Configuration'\nimport type {\n DocumentBrowseQuery,\n DocumentSummary,\n DeletedDocument,\n DocumentIssue,\n DocumentImportInput,\n DocumentImportReport,\n PublishedDocumentLookup,\n CompiledDocument,\n DocumentMutationResult,\n CreateDocumentInput,\n MoveDocumentInput,\n PublishDocumentInput,\n RemoveDocumentInput,\n RestoreDocumentInput,\n UndeleteDocumentInput,\n UpdateDocumentInput,\n DocumentNotFound,\n DocumentSource,\n DocumentValidationResult,\n DocumentVersionConflict,\n} from '@internal/protocol/Documents'\nimport type { DocumentGeneration, DocumentId } from '@internal/protocol/Documents'\nimport type { MediaReference } from '@internal/protocol/Media'\nimport type {\n DocumentChangeSubscription,\n DocumentCreateError,\n DocumentMutationError,\n DocumentProjectionError,\n} from './document-authoring'\nexport type {\n DocumentChangeSubscription,\n DocumentCreateError,\n DocumentMutationError,\n DocumentProjectionError,\n} from './document-authoring'\nimport type { DocumentLifecycleCommand, DocumentLifecycleDependencies } from './document-lifecycle'\nimport type { DocumentStoreApi, DocumentStoreSnapshot } from './document-store'\nimport type { DocumentState } from './document-state'\nimport type { DocumentHistoryApi } from './document-history'\nimport type { PublishedDocumentsApi as PublishedDeliveryApi } from './published-documents'\nimport { createDocumentEngine } from '@internal/document/DocumentEngine'\nimport { createInitialDocumentSource, planDocumentCreation } from '@internal/document/DocumentPlanning'\nimport { ActivityContext as ActivityContextSchema } from '@internal/protocol/Activity'\nimport {\n DocumentMutationResult as DocumentMutationResultSchema,\n DocumentMediaUnavailable as DocumentMediaUnavailableError,\n DocumentNotFound as DocumentNotFoundError,\n} from '@internal/protocol/Documents'\nimport { DocumentId as DocumentIdSchema } from '@internal/protocol/Documents'\nimport { Context, Crypto, Effect, Layer, PubSub, Ref, Schedule, Schema, Semaphore, Stream } from 'effect'\nimport type { Option, Scope } from 'effect'\nimport { prepareDocumentMutation, validateDocumentUpdate } from './document-lifecycle'\nimport { projectMediaReferences } from './document-media-references'\nimport { importDocumentSources } from './document-import'\nimport { DocumentStore } from './document-store'\nimport { DocumentGenerationConflict, DocumentPersistenceError } from './document-failures'\nimport { authoringEntries, compileDocumentState, deletedEntries, entryById } from './document-state'\nimport * as DocumentStateModule from './document-state'\nimport { AccessControl } from '../../AccessControl'\nimport { documentHistoryCapability } from './document-history'\nimport { findPublishedDocument, publishedDocuments as makePublishedDocuments } from './published-documents'\n\nconst isDocumentGenerationConflict = Schema.is(DocumentGenerationConflict)\nconst isDocumentMediaUnavailable = Schema.is(DocumentMediaUnavailableError)\nconst CONTENT_MUTATION_BUFFER_CAPACITY = 16\n\ntype AuthorizedEffect<A, E> = Effect.Effect<A, AccessDenied | E>\n\nexport interface DocumentsApi {\n readonly browse: (\n context: StudioRequestContext,\n query: DocumentBrowseQuery,\n ) => AuthorizedEffect<ReadonlyArray<DocumentSummary>, DocumentProjectionError>\n readonly create: (\n context: StudioRequestContext,\n input: CreateDocumentInput,\n ) => AuthorizedEffect<DocumentMutationResult, DocumentCreateError>\n readonly move: (\n context: StudioRequestContext,\n input: MoveDocumentInput,\n ) => AuthorizedEffect<DocumentMutationResult, DocumentMutationError>\n readonly publish: (\n context: StudioRequestContext,\n input: PublishDocumentInput,\n ) => AuthorizedEffect<DocumentMutationResult, DocumentMutationError>\n readonly read: (\n context: StudioRequestContext,\n documentId: DocumentId,\n ) => AuthorizedEffect<DocumentSource, DocumentNotFound | DocumentProjectionError>\n readonly remove: (\n context: StudioRequestContext,\n input: RemoveDocumentInput,\n ) => AuthorizedEffect<DocumentMutationResult, DocumentMutationError>\n readonly restore: (\n context: StudioRequestContext,\n input: RestoreDocumentInput,\n ) => AuthorizedEffect<DocumentMutationResult, DocumentMutationError>\n readonly trash: (\n context: StudioRequestContext,\n ) => AuthorizedEffect<ReadonlyArray<DeletedDocument>, DocumentProjectionError>\n readonly undelete: (\n context: StudioRequestContext,\n input: UndeleteDocumentInput,\n ) => AuthorizedEffect<DocumentMutationResult, DocumentMutationError>\n readonly update: (\n context: StudioRequestContext,\n input: UpdateDocumentInput,\n ) => AuthorizedEffect<DocumentMutationResult, DocumentMutationError>\n readonly validate: (\n context: StudioRequestContext,\n input: UpdateDocumentInput,\n ) => AuthorizedEffect<DocumentValidationResult, DocumentNotFound | DocumentProjectionError | DocumentVersionConflict>\n readonly historyCompare: DocumentHistoryApi['compare']\n readonly historyList: DocumentHistoryApi['list']\n readonly historyRead: DocumentHistoryApi['read']\n}\n\nexport class Documents extends Context.Service<Documents, DocumentsApi>()('@internal/server/Documents') {}\n\nexport interface DocumentPreviewsApi {\n readonly generation: Effect.Effect<DocumentGeneration, DocumentProjectionError>\n readonly read: (\n lookup: PublishedDocumentLookup,\n ) => Effect.Effect<Option.Option<CompiledDocument>, DocumentProjectionError>\n}\n\nexport class DocumentPreviews extends Context.Service<DocumentPreviews, DocumentPreviewsApi>()(\n '@internal/server/DocumentPreviews',\n) {}\n\nexport interface PublishedDocumentsApi extends Omit<PublishedDeliveryApi, 'diagnostics'> {\n readonly diagnostics: (\n context: StudioRequestContext,\n ) => Effect.Effect<ReadonlyArray<DocumentIssue>, AccessDenied | DocumentProjectionError>\n}\n\nexport class PublishedDocuments extends Context.Service<PublishedDocuments, PublishedDocumentsApi>()(\n '@internal/server/PublishedDocuments',\n) {}\n\nexport interface DocumentMaintenanceApi {\n readonly importSources: (\n input: DocumentImportInput,\n activity: ActivityContext,\n ) => Effect.Effect<DocumentImportReport, DocumentMutationError>\n readonly mediaReferences: (\n documentId?: DocumentId,\n ) => Effect.Effect<ReadonlyArray<MediaReference>, DocumentProjectionError>\n readonly publish: (\n input: PublishDocumentInput,\n activity: ActivityContext,\n ) => Effect.Effect<DocumentMutationResult, DocumentMutationError>\n readonly read: (documentId: DocumentId) => Effect.Effect<DocumentSource, DocumentNotFound | DocumentProjectionError>\n readonly refresh: Effect.Effect<DocumentGeneration, DocumentProjectionError>\n readonly subscribeMutations: Effect.Effect<DocumentChangeSubscription, never, Scope.Scope>\n readonly validate: (\n input: UpdateDocumentInput,\n ) => Effect.Effect<DocumentValidationResult, DocumentNotFound | DocumentProjectionError | DocumentVersionConflict>\n}\n\nexport class DocumentMaintenance extends Context.Service<DocumentMaintenance, DocumentMaintenanceApi>()(\n '@internal/server/internal/DocumentMaintenance',\n) {}\n\nexport interface DocumentsOptions extends DocumentEngineOptions {}\n\nconst makeDocuments = Effect.fn('Documents.make')(function* (\n configuration: DocumentConfiguration,\n options: DocumentsOptions,\n) {\n const repository = yield* DocumentStore\n const accessControl = yield* AccessControl\n const crypto = yield* Crypto.Crypto\n const engine = yield* createDocumentEngine(configuration, options)\n const state = yield* Ref.make(yield* loadSynchronizedState(repository, engine))\n const semaphore = yield* Semaphore.make(1)\n const mutationEvents = yield* Effect.acquireRelease(\n PubSub.sliding<DocumentMutationResult>(CONTENT_MUTATION_BUFFER_CAPACITY),\n PubSub.shutdown,\n )\n const dependencies: DocumentLifecycleDependencies = {\n engine,\n configuration,\n repository,\n }\n\n const refreshUnlocked = Effect.fn('Documents.refreshUnlocked')(function* (force = false) {\n const current = yield* Ref.get(state)\n const snapshot = force ? yield* loadRequired(repository) : yield* repository.load(current.snapshot.generation)\n if (!snapshot || !generationIsAfter(snapshot.generation, current.snapshot.generation))\n return current.snapshot.generation\n // A snapshot can span multiple generations but carries neither their actions nor their order.\n // Updating the projection without inventing mutation events preserves exactly-once semantics.\n const refreshed = yield* compileDocumentState(engine, snapshot, current)\n yield* Ref.set(state, refreshed)\n return refreshed.snapshot.generation\n })\n\n const executeUnlocked = Effect.fn('Documents.execute')(function* (\n command: DocumentLifecycleCommand,\n activity: ActivityContext,\n ) {\n const attempt = Effect.gen(function* () {\n yield* refreshUnlocked()\n const current = yield* Ref.get(state)\n const prepared = yield* prepareDocumentMutation(dependencies, current, command)\n if (prepared._tag === 'Unchanged') return prepared.result\n\n const committed = yield* repository.commit({\n activity,\n plan: prepared.commitPlan,\n expectedGeneration: current.snapshot.generation,\n mediaReferences: projectMediaReferences(prepared.authored, prepared.published, commandDocumentId(command)),\n })\n const next = DocumentStateModule.makeDocumentState(prepared.authored, prepared.published, committed.snapshot)\n yield* Ref.set(state, next)\n const entry = entryById(next, committed.mutation.documentId)\n const result = DocumentMutationResultSchema.make(\n Object.assign({}, committed.mutation, entry === undefined ? undefined : { entry }),\n )\n yield* PubSub.publish(mutationEvents, result)\n return result\n })\n\n return yield* attempt.pipe(\n Effect.tapError((error) => (isDocumentGenerationConflict(error) ? refreshUnlocked(true) : Effect.void)),\n Effect.retry({\n schedule: Schedule.recurs(3),\n while: isDocumentGenerationConflict,\n }),\n )\n })\n\n const runMutation = Effect.fn('Documents.runMutation')(function* (\n command: DocumentLifecycleCommand,\n activity: ActivityContext,\n reason: string | undefined,\n ) {\n const resolvedActivity = enrichActivity(activity, reason)\n return yield* semaphore.withPermits(1)(executeUnlocked(command, resolvedActivity))\n })\n\n const authored = semaphore\n .withPermits(1)(\n Effect.gen(function* () {\n yield* refreshUnlocked()\n return (yield* Ref.get(state)).authored\n }),\n )\n .pipe(Effect.withSpan('Documents.authored'))\n\n const browse = Effect.fn('Documents.browse')((query: DocumentBrowseQuery) =>\n semaphore.withPermits(1)(\n Effect.gen(function* () {\n yield* refreshUnlocked()\n return authoringEntries(yield* Ref.get(state), query)\n }),\n ),\n )\n\n const create = Effect.fn('Documents.create')(function* (input: CreateDocumentInput, activity: ActivityContext) {\n const plan = yield* Effect.fromResult(planDocumentCreation(configuration, input))\n const source = yield* createInitialDocumentSource(plan)\n const documentId = DocumentIdSchema.make(yield* crypto.randomUUIDv4.pipe(Effect.orDie))\n return yield* runMutation(\n {\n action: 'document.create',\n documentId,\n markdown: source.markdown,\n sourcePath: plan.sourcePath,\n },\n activity,\n input.reason,\n )\n })\n\n const generation = semaphore.withPermits(1)(\n Effect.gen(function* () {\n yield* refreshUnlocked()\n return (yield* Ref.get(state)).snapshot.generation\n }),\n )\n\n const importSources = (input: DocumentImportInput, activity: ActivityContext) =>\n importDocumentSources(\n {\n current: (sourcePath) =>\n semaphore.withPermits(1)(\n Effect.gen(function* () {\n yield* refreshUnlocked()\n return (yield* Ref.get(state)).snapshot.active.find((candidate) => candidate.sourcePath === sourcePath)\n }),\n ),\n nextDocumentId: crypto.randomUUIDv4.pipe(\n Effect.orDie,\n Effect.map((value) => DocumentIdSchema.make(value)),\n ),\n runMutation,\n },\n input,\n activity,\n )\n\n const move = Effect.fn('Documents.move')((input: MoveDocumentInput, activity: ActivityContext) =>\n runMutation({ action: 'document.move', input }, activity, input.reason),\n )\n\n const subscribeMutations = Effect.gen(function* () {\n const subscription = yield* PubSub.subscribe(mutationEvents)\n const baseline = yield* semaphore.withPermits(1)(\n Ref.get(state).pipe(Effect.map((current) => current.snapshot.generation)),\n )\n return {\n baseline,\n mutations: Stream.fromSubscription(subscription).pipe(\n Stream.filter((mutation) => generationIsAfter(mutation.generation, baseline)),\n ),\n } satisfies DocumentChangeSubscription\n }).pipe(Effect.withSpan('Documents.subscribeMutations'))\n\n const publish = Effect.fn('Documents.publish')((input: PublishDocumentInput, activity: ActivityContext) =>\n runMutation({ action: 'document.publish', input }, activity, input.reason),\n )\n\n const published = semaphore\n .withPermits(1)(\n Effect.gen(function* () {\n yield* refreshUnlocked()\n return (yield* Ref.get(state)).published\n }),\n )\n .pipe(Effect.withSpan('Documents.published'))\n\n const read = Effect.fn('Documents.read')((documentId: DocumentId) =>\n semaphore.withPermits(1)(\n Effect.gen(function* () {\n yield* refreshUnlocked()\n const source = (yield* Ref.get(state)).activeById.get(documentId)\n return source || (yield* new DocumentNotFoundError({ documentId }))\n }),\n ),\n )\n\n const refresh = semaphore.withPermits(1)(refreshUnlocked()).pipe(Effect.withSpan('Documents.refresh'))\n\n const remove = Effect.fn('Documents.remove')((input: RemoveDocumentInput, activity: ActivityContext) =>\n runMutation({ action: 'document.remove', input }, activity, input.reason),\n )\n\n const restore = Effect.fn('Documents.restore')((input: RestoreDocumentInput, activity: ActivityContext) =>\n runMutation({ action: 'document.restore', input }, activity, input.reason),\n )\n\n const trash = semaphore\n .withPermits(1)(\n Effect.gen(function* () {\n yield* refreshUnlocked()\n return deletedEntries(yield* Ref.get(state))\n }),\n )\n .pipe(Effect.withSpan('Documents.trash'))\n\n const undelete = Effect.fn('Documents.undelete')((input: UndeleteDocumentInput, activity: ActivityContext) =>\n runMutation({ action: 'document.undelete', input }, activity, input.reason),\n )\n\n const update = Effect.fn('Documents.update')((input: UpdateDocumentInput, activity: ActivityContext) =>\n runMutation({ action: 'document.update', input }, activity, input.reason),\n )\n\n const validate = Effect.fn('Documents.validate')((input: UpdateDocumentInput) =>\n semaphore.withPermits(1)(\n Effect.gen(function* () {\n yield* refreshUnlocked()\n return yield* validateDocumentUpdate(engine, yield* Ref.get(state), input)\n }),\n ),\n )\n\n const history = documentHistoryCapability(accessControl, repository)\n const delivery = makePublishedDocuments(configuration, published)\n const document = (documentId: DocumentId) => ({ documentId, kind: 'document' as const })\n const requireThen = <A, E>(\n context: StudioRequestContext,\n action: DocumentAccessDecision['action'],\n resource: DocumentAccessDecision['resource'],\n effect: () => Effect.Effect<A, E>,\n ) => accessControl.require(context, { action, resource }).pipe(Effect.andThen(effect))\n const documents = Documents.of({\n browse: (context, query) =>\n requireThen(\n context,\n 'document.browse',\n query.collection\n ? { collection: query.collection, kind: 'collection', locale: query.locale }\n : { kind: 'catalog' },\n () => browse(query),\n ),\n create: (context, input) =>\n requireThen(\n context,\n 'document.create',\n { collection: input.collection, kind: 'collection', locale: input.locale },\n () => create(input, requestActivity(context, input.reason)),\n ),\n historyCompare: history.compare,\n historyList: history.list,\n historyRead: history.read,\n move: (context, input) =>\n requireThen(context, 'document.move', document(input.documentId), () =>\n move(input, requestActivity(context, input.reason)),\n ),\n publish: (context, input) =>\n requireThen(context, 'document.publish', document(input.documentId), () =>\n publish(input, requestActivity(context, input.reason)),\n ),\n read: (context, documentId) => requireThen(context, 'document.read', document(documentId), () => read(documentId)),\n remove: (context, input) =>\n requireThen(context, 'document.remove', document(input.documentId), () =>\n remove(input, requestActivity(context, input.reason)),\n ),\n restore: (context, input) =>\n requireThen(context, 'document.restore', document(input.documentId), () =>\n restore(input, requestActivity(context, input.reason)),\n ),\n trash: (context) => requireThen(context, 'document.trash', { kind: 'catalog' }, () => trash),\n undelete: (context, input) =>\n requireThen(context, 'document.undelete', document(input.documentId), () =>\n undelete(input, requestActivity(context, input.reason)),\n ),\n update: (context, input) =>\n requireThen(context, 'document.update', document(input.documentId), () =>\n update(input, requestActivity(context, input.reason)),\n ),\n validate: (context, input) =>\n requireThen(context, 'document.validate', document(input.documentId), () => validate(input)),\n })\n const previews = DocumentPreviews.of({\n generation,\n read: (lookup) => authored.pipe(Effect.map((catalog) => findPublishedDocument(catalog, lookup))),\n })\n const publishedService = PublishedDocuments.of({\n navigation: delivery.navigation,\n query: delivery.query,\n read: delivery.read,\n surround: delivery.surround,\n diagnostics: (context) =>\n accessControl\n .require(context, { action: 'document.browse', resource: { kind: 'catalog' } })\n .pipe(Effect.andThen(delivery.diagnostics)),\n })\n const maintenance = DocumentMaintenance.of({\n importSources,\n mediaReferences: (documentId) =>\n semaphore.withPermits(1)(\n Effect.gen(function* () {\n yield* refreshUnlocked()\n const current = yield* Ref.get(state)\n return projectMediaReferences(current.authored, current.published, documentId)\n }),\n ),\n publish,\n read,\n refresh,\n subscribeMutations,\n validate,\n })\n return { documents, maintenance, previews, publishedDocuments: publishedService }\n})\n\nexport function documentsLayer(\n configuration: DocumentConfiguration,\n options: DocumentsOptions,\n): Layer.Layer<\n Documents | DocumentMaintenance | DocumentPreviews | PublishedDocuments,\n DocumentEngineConfigurationInvalid | DocumentProjectionError,\n AccessControl | DocumentStore | Crypto.Crypto\n> {\n return Layer.effectContext(\n makeDocuments(configuration, options).pipe(\n Effect.map(({ documents, maintenance, previews, publishedDocuments }) =>\n Context.empty().pipe(\n Context.add(Documents, documents),\n Context.add(DocumentMaintenance, maintenance),\n Context.add(DocumentPreviews, previews),\n Context.add(PublishedDocuments, publishedDocuments),\n ),\n ),\n ),\n )\n}\n\nfunction loadRequired(repository: DocumentStoreApi): Effect.Effect<DocumentStoreSnapshot, DocumentPersistenceError> {\n return repository.load().pipe(\n Effect.filterOrFail(\n (snapshot) => snapshot !== undefined,\n () =>\n new DocumentPersistenceError({\n cause: new Error('DocumentStore returned no initial snapshot.'),\n operation: 'DocumentStore.load',\n }),\n ),\n )\n}\n\nfunction loadSynchronizedState(\n repository: DocumentStoreApi,\n engine: DocumentEngine,\n): Effect.Effect<DocumentState, DocumentProjectionError> {\n const attempt = Effect.gen(function* () {\n const snapshot = yield* loadRequired(repository)\n const state = yield* compileDocumentState(engine, snapshot)\n yield* repository.synchronizeMediaReferences({\n expectedGeneration: snapshot.generation,\n references: projectMediaReferences(state.authored, state.published),\n })\n return state\n })\n return attempt.pipe(\n Effect.retry({ schedule: Schedule.recurs(3), while: isDocumentGenerationConflict }),\n Effect.mapError((error) =>\n isDocumentGenerationConflict(error) || isDocumentMediaUnavailable(error)\n ? new DocumentPersistenceError({ cause: error, operation: 'Documents.synchronizeMediaReferences' })\n : error,\n ),\n )\n}\n\nfunction commandDocumentId(command: DocumentLifecycleCommand): DocumentId {\n return command.action === 'document.create' ? command.documentId : command.input.documentId\n}\n\nfunction generationIsAfter(candidate: DocumentGeneration, current: DocumentGeneration): boolean {\n return BigInt(candidate) > BigInt(current)\n}\n\nfunction enrichActivity(activity: ActivityContext, reason: string | undefined): ActivityContext {\n return ActivityContextSchema.make(Object.assign({}, activity, reason === undefined ? undefined : { reason }))\n}\n\nfunction requestActivity(context: StudioRequestContext, reason: string | undefined): ActivityContext {\n return ActivityContextSchema.make(\n Object.assign(\n { actor: context.actor, requestId: context.requestId },\n reason === undefined ? undefined : { reason },\n ),\n )\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\n/** Ensures Yjs only observes authorable nodes with final, unique identities. */\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 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 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 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 if (id === undefined) {\n throw new Error(`Authorable ${node.type.name} at position ${position} has no valid node identity.`)\n }\n if (seen.has(id)) {\n throw new Error(`Authorable ${node.type.name} at position ${position} duplicates node identity \"${id}\".`)\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 if (id === undefined) return\n const candidate = { id, position }\n result.set(candidate.id, [...(result.get(candidate.id) ?? []), candidate])\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 if (id === undefined) return\n const mapped = transaction.mapping.mapResult(position, 1)\n if (!mapped.deleted && transaction.doc.nodeAt(mapped.pos)?.attrs.cmsNodeId === id) {\n result.add(positionKey({ id, position: mapped.pos }))\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 while (used.has(id)) id = createId()\n used.add(id)\n const node = transaction.doc.nodeAt(position)\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 if (node.attrs.cmsSynthetic === true || node.attrs.cmsTransient === true) return false\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 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 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 return Object.keys(properties).length ? properties : null\n}\n\nfunction renderImageProperties(value: EffectSchema.Json | undefined): Record<string, string> {\n if (!isJsonObject(value)) return {}\n return Object.fromEntries(\n ['class', 'height', 'width'].flatMap((name) => {\n const property = value[name]\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 { 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 return encodeBlocks(content.content)\n}\n\nfunction encodeBlocks(content: JSONContent[] | undefined): MarkdownNodeType[] {\n const result: MarkdownNodeType[] = []\n for (const editorNode of content ?? []) {\n if (isTransientNode(editorNode) || isEmptyParagraph(editorNode)) continue\n if (editorNode.type === 'cmsSlot') {\n result.push(...encodeSlot(editorNode))\n continue\n }\n const node = encodeBlock(editorNode)\n if (node !== undefined) result.push(node)\n }\n return result\n}\n\nfunction encodeSlot(editorNode: JSONContent): MarkdownNodeType[] {\n const attrs = editorNode.attrs\n const name = nonEmptyStringAttribute(attrs?.name) ?? 'default'\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 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 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 return ['blockquote', cmsProps, ...unwrapSingleParagraph(children)]\n }\n case 'bulletList':\n return ['ul', cmsProps, ...encodeBlocks(editorNode.content)]\n case 'orderedList': {\n const start = finiteNumberAttribute(attrs?.start, 1)\n return [\n 'ol',\n compactJsonAttributes(Object.assign({}, cmsProps, { start: start === 1 ? undefined : start })),\n ...encodeBlocks(editorNode.content),\n ]\n }\n case 'listItem': {\n const children = encodeBlocks(editorNode.content)\n return ['li', cmsProps, ...unwrapFirstParagraph(children)]\n }\n case 'codeBlock': {\n const language = nonEmptyStringAttribute(attrs?.language)\n return [\n 'pre',\n compactJsonAttributes(Object.assign({}, cmsProps, { language })),\n ['code', language ? { class: `language-${language}` } : {}, plainText(editorNode.content)],\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 const implicitSlotId = editorNode.content?.find(\n (node) => node.type === 'cmsSlot' && node.attrs?.implicit === true && node.attrs?.name === 'default',\n )?.attrs?.cmsNodeId\n return [\n tag,\n identifiedAttributes(props, attrs?.cmsNodeId, implicitSlotId),\n ...unwrapSingleParagraph(encodeBlocks(editorNode.content)),\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 for (const editorNode of content ?? []) {\n let node: MarkdownNodeType | undefined\n const attrs = editorNode.attrs\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 if (node !== undefined && node !== '') {\n leaves.push({\n node,\n marks: normalizeMarks(editorNode.marks),\n })\n }\n }\n return wrapMarkedLeaves(leaves, 0)\n}\n\nfunction wrapMarkedLeaves(leaves: ReadonlyArray<InlineLeaf>, depth: number): MarkdownNodeType[] {\n const result: MarkdownNodeType[] = []\n for (let index = 0; index < leaves.length;) {\n const leaf = leaves[index]\n if (leaf === undefined) break\n const mark = leaf.marks[depth]\n if (mark === undefined) {\n result.push(leaf.node)\n index++\n continue\n }\n\n let end = index + 1\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 return result\n}\n\nfunction markNode(mark: EditorMark, children: MarkdownNodeType[]): MarkdownNodeType {\n const attrs = jsonObject(mark.attrs?.cmsProps)\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 const tag = comarkTagForEditorMark(mark.type) ?? 'span'\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 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 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 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 if (decoded._tag === 'None' || Predicate.isString(decoded.value)) return undefined\n const node = structuredClone(decoded.value)\n if (nodeId === undefined) return node\n if (node[0] === null) return [null, identifiedAttributes(node[1], nodeId), node[2]]\n const [tag, attributes, ...children] = node\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 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 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 return { content, nodes: editorToComark(content), frontmatter: frontmatterFromContent(content) }\n },\n catch: invalidDocument,\n })\n const body = yield* Schema.decodeEffect(MarkdownDocumentSchema)({\n frontmatter,\n meta: document.meta,\n nodes,\n }).pipe(Effect.mapError(invalidDocument))\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 return document.toJSON()\n}\n\nfunction frontmatterFromContent(content: JSONContent): Schema.JsonObject {\n const value = content.content?.[0]?.attrs?.frontmatter\n if (!isJsonObject(value)) throw new Error('Editor content must start with JSON object frontmatter.')\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'\nexport type { EditorDocumentFocusTarget } from './internal/editor/focus'\nexport {\n documentSelectionForNode,\n editorDocumentFocusRequest,\n editorFocusTarget,\n focusEditorNode,\n shouldRevealDocumentFocus,\n} from './internal/editor/focus'\nexport type { EditorImageLayout } from './internal/editor/image'\nexport { createEditorNodeId } from './internal/editor/identity'\nexport { createEditorComponentContent, createEditorSlotContent } from './internal/editor/content'\nexport { renderEditorMarkdown } from './internal/editor/render'\nexport { createEditorExtensions, createEditorSchema } from './internal/editor/schema'\nexport {\n canMoveBlock,\n createStructurePolicyExtension,\n insertParagraph,\n isSafeStructureChange,\n moveBlock,\n removeTransientParagraphs,\n replaceGapWithParagraph,\n} from './internal/editor/structure-policy'\nexport type { BlockDirection, ParagraphSide } from './internal/editor/structure-policy'\nexport type { CreateEditorExtensionsOptions, EditorNodeViews } from './internal/editor/schema'\n","import type { JSONContent } from '@tiptap/core'\nimport { EditorNodeId } from '@internal/protocol/Documents'\nimport { Schema } from 'effect'\nimport * as Y from 'yjs'\nimport { createEditorSchema } from '../editor/schema'\n\nconst FRONTMATTER_NAME = 'frontmatter'\nconst PROPERTIES_NAME = 'properties'\nconst PROPS_PREFIX = 'props:'\nconst CMS_PROPS_PREFIX = 'cmsProps:'\n\nconst editorSchema = createEditorSchema()\nconst decodeEditorNodeId = Schema.decodeUnknownSync(EditorNodeId)\nconst decodeJson = Schema.decodeUnknownSync(Schema.Json)\nconst decodeJsonObject = Schema.decodeUnknownSync(Schema.JsonObject)\nconst decodePath = Schema.decodeUnknownSync(Schema.Array(Schema.String))\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 for (const [nodeId, values] of state.properties) {\n const fields = new Y.Map<unknown>()\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 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 if (!hasProperties) {\n const properties = document.getMap<Y.Map<unknown>>(PROPERTIES_NAME)\n for (const [nodeId, values] of state.properties) {\n const fields = new Y.Map<unknown>()\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 const frontmatter = document.share.has(FRONTMATTER_NAME)\n ? unflatten(mapValues(document.getMap<unknown>(FRONTMATTER_NAME)))\n : undefined\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 return\n }\n if (properties === undefined) return\n const nodeId = optionalEditorNodeId(node.attrs?.cmsNodeId)\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 if (Object.hasOwn(nodeAttributes, 'props')) nodeAttributes.props = prefixedValues(attributes, PROPS_PREFIX)\n if (Object.hasOwn(nodeAttributes, 'cmsProps'))\n nodeAttributes.cmsProps = prefixedValues(attributes, CMS_PROPS_PREFIX)\n node.attrs = nodeAttributes\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 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 for (const nodeId of nodeIds) {\n const oldValues = previous.properties.get(nodeId) ?? {}\n const nextValues = next.properties.get(nodeId)\n if (nextValues === undefined) {\n properties.delete(nodeId)\n continue\n }\n const fields = properties.get(nodeId) ?? new Y.Map<unknown>()\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 const nodeId = optionalEditorNodeId(node.attrs?.cmsNodeId)\n if (nodeId === undefined) return\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 if (Object.keys(values).length > 0) properties.set(nodeId, values)\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 return document.toJSON()\n}\n\nfunction visit(content: JSONContent, visitor: (node: JSONContent) => void): void {\n visitor(content)\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 const walk = (current: Schema.JsonObject, path: ReadonlyArray<string>): void => {\n for (const [key, child] of Object.entries(current)) {\n const nextPath = [...path, key]\n if (isJsonObject(child) && Object.keys(child).length > 0) walk(child, nextPath)\n else flattened[JSON.stringify(nextPath)] = structuredClone(child)\n }\n }\n walk(value, [])\n return decodeJsonObject(flattened)\n}\n\nfunction unflatten(value: Schema.JsonObject): Schema.JsonObject {\n const result: Record<string, Schema.Json> = {}\n for (const [encodedPath, child] of Object.entries(value)) {\n const path = decodePath(JSON.parse(encodedPath))\n if (path.length === 0) continue\n let current = result\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 const finalSegment = path.at(-1)\n if (finalSegment !== undefined) define(current, finalSegment, structuredClone(child))\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 for (const key of keys) {\n if (!Object.hasOwn(after, key)) map.delete(key)\n else {\n const child = after[key]\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 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(Object.entries(value).map(([key, child]) => [`${prefix}${key}`, structuredClone(child)])),\n )\n}\n\nfunction prefixedValues(value: Schema.JsonObject, prefix: string): Schema.JsonObject {\n return decodeJsonObject(\n Object.fromEntries(\n Object.entries(value)\n .filter(([key]) => key.startsWith(prefix))\n .map(([key, child]) => [key.slice(prefix.length), structuredClone(child)]),\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 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","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 { Schema } from 'effect'\nimport { createEditorSchema } from '../editor/schema'\nimport { applyCollaborationFields, seedCollaborationFields } from './fields'\n\nconst BODY_NAME = 'body'\nconst METADATA_NAME = 'cms'\nconst META_KEY = 'meta'\nconst SOURCE_PATH_KEY = 'sourcePath'\n\nconst editorSchema = createEditorSchema()\nconst decodeJson = Schema.decodeUnknownSync(Schema.Json)\nconst decodeJsonObject = Schema.decodeUnknownSync(Schema.JsonObject)\nconst decodeSourcePath = Schema.decodeUnknownSync(SourcePathSchema)\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 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 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 if (!metadata.has(META_KEY) || !metadata.has(SOURCE_PATH_KEY)) {\n throw new Error('Collaboration metadata must include meta and sourcePath.')\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 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 const document = restoreCollaborationUpdate(snapshot.state)\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 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 try {\n applyUpdate(document, Uint8Array.from(state))\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\n/** Creates the initial collaborative state from the canonical editor projection. */\nexport const createCollaborationDocument = Effect.fn('CollaborationDocument.create')(function* (\n input: CreateCollaborationDocumentInput,\n) {\n const seed = yield* openEditorDocument(input.body)\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\n/** Renders collaborative state through the canonical editor-to-Markdown encoder. */\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 return {\n ...change,\n sourcePath: inspected.sourcePath,\n } satisfies CollaborationDocumentChange\n})\n\n/** Creates the one editor-facing seam for Tiptap content and granular fields. */\nexport function createCollaborationEditorBinding(document: CollaborationDocument): CollaborationEditorBinding {\n try {\n const inspected = inspectCollaborationDocumentValue(document)\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 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\n/** Restores a validated, caller-owned document from a full collaboration snapshot. */\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 return yield* validateRestoredDocument(document)\n})\n\n/** Restores a validated document when only its authoritative full-state update is persisted. */\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 return yield* validateRestoredDocument(document)\n})\n\n/** Applies one encoded collaboration update while translating corrupt data to a typed failure. */\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\n/** Captures the current state vector and an optional differential update. */\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\n/** Releases a collaboration document owned by a scoped workflow. */\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 }\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)\nexport type WorkingDocumentPublishAttemptId = typeof WorkingDocumentPublishAttemptId.Type\n\nexport const WorkingDocumentFormatVersion = Schema.Literal(1)\nexport type WorkingDocumentFormatVersion = typeof WorkingDocumentFormatVersion.Type\n\nexport const WorkingDocumentPublishPhase = Schema.Literals(['pending', 'checkpointed', 'published', 'failed'])\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 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 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 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 { DocumentMaintenanceApi } from '../documents/documents'\nimport type { CompiledDocument, 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, DocumentValidationResult, UpdateDocumentInput } from '@internal/protocol/Documents'\nimport { Effect, Option, PubSub, Queue, Ref, Schedule, Schema, Stream } from 'effect'\nimport { createWorkingSnapshot, useWorkingSnapshot, workingSnapshotIsDirty } from './working-document-format'\nimport { WorkingDocumentInvalid, WorkingDocumentRef, WorkingDocumentUnavailable } from './working-document'\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 validatedDocument = Effect.fn('WorkingDocuments.reconcile.validateSource')(function* (source: DocumentSource) {\n const validation = yield* options.documents.validate(\n UpdateDocumentInput.make({\n documentId: source.documentId,\n expectedVersion: source.version,\n markdown: source.markdown,\n }),\n )\n if (!validation.valid || !validation.document) {\n return yield* invalidSource(source.documentId, validation)\n }\n return validation.document\n })\n\n const newSnapshot = Effect.fn('WorkingDocuments.reconcile.newSnapshot')(function* (\n source: DocumentSource,\n document: CompiledDocument,\n ) {\n return yield* createWorkingSnapshot(source, document, yield* options.generationId(source.documentId))\n })\n\n const rotateDirty = Effect.fn('WorkingDocuments.reconcile.rotateDirty')(function* (\n snapshot: WorkingDocumentSnapshot,\n ) {\n const generationId = yield* options.generationId(snapshot.documentId)\n const seed = yield* useWorkingSnapshot(snapshot, (document) =>\n captureCollaborationDocument(document).pipe(\n Effect.map((captured) => rotatedSeed(snapshot, generationId, captured)),\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 if (Option.isNone(loaded)) return\n let source = yield* currentSource(documentId)\n if (Option.isNone(source)) {\n const activePublish = yield* options.store.pendingPublish(documentId)\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 if (Option.isNone(loaded)) return\n }\n if (Option.isSome(source) && source.value.version === loaded.value.savedVersion) return\n if (yield* workingSnapshotIsDirty(loaded.value)) {\n yield* rotateDirty(loaded.value)\n return\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 return\n }\n const document = yield* validatedDocument(source.value)\n yield* options.store.replace({\n expectedGeneration: loaded.value.generationId,\n snapshot: yield* newSnapshot(source.value, document),\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 return generation\n })\n const reconcile = (result: DocumentMutationResult) =>\n result.action === 'document.publish' ? Effect.void : reconcileDocument(result.documentId)\n\n const initialGeneration = yield* refresh()\n const state = yield* Ref.make<ReconciliationState>({\n cursor: initialGeneration,\n failure: undefined,\n mutation: undefined,\n sweepRequired: false,\n target: initialGeneration,\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 return [\n true,\n {\n ...current,\n mutation: result,\n target: result.generation,\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 if (generationAtOrBefore(current.target, current.cursor)) return true\n\n let reconciledGeneration: DocumentGeneration\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 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 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 invalidSource(documentId: DocumentId, validation: DocumentValidationResult) {\n return Effect.fail(\n new WorkingDocumentInvalid({\n cause: validation.issues,\n documentId,\n message: 'Authored document cannot initialize a Working Document.',\n }),\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 { CompiledDocument, 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, Semaphore, 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 createWorkingSnapshot,\n restoreWorkingSnapshot,\n useAuthoritativeWorkingDocument,\n useWorkingSnapshot,\n validateWorkingUpdate,\n workingSnapshotIsDirty,\n} from './working-document-format'\nimport { startWorkingDocumentReconciliation } from './working-document-reconciliation'\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 locks = new Map<DocumentId, Semaphore.Semaphore>()\n const compactAfterUpdates = validCompactionLimit(options.compactAfterUpdates)\n\n const synchronized = <A, E, R>(documentId: DocumentId, effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>\n Effect.suspend(() => {\n let semaphore = locks.get(documentId)\n if (!semaphore) {\n semaphore = Semaphore.makeUnsafe(1)\n locks.set(documentId, semaphore)\n }\n return semaphore.withPermit(effect)\n })\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 validatedDocument = Effect.fn('WorkingDocuments.validateSource')(function* (source: DocumentSource) {\n const validation = yield* maintenance.validate(\n UpdateDocumentInput.make({\n documentId: source.documentId,\n expectedVersion: source.version,\n markdown: source.markdown,\n }),\n )\n if (!validation.valid || !validation.document) {\n return yield* invalid(\n source.documentId,\n 'Authored document cannot initialize a Working Document.',\n validation.issues,\n )\n }\n return validation.document\n })\n\n const newSnapshot = Effect.fn('WorkingDocuments.newSnapshot')(function* (\n source: DocumentSource,\n document: CompiledDocument,\n ) {\n return yield* createWorkingSnapshot(source, document, yield* generationId(source.documentId))\n })\n\n const compactSnapshot = Effect.fn('WorkingDocuments.compactSnapshot')(function* (snapshot: WorkingDocumentSnapshot) {\n const lastUpdate = snapshot.updates.at(-1)\n if (!lastUpdate) return false\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 if (Option.isNone(snapshot)) {\n return yield* new WorkingDocumentSuperseded({\n documentId: ref.documentId,\n expectedGeneration: ref.generationId,\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 return snapshot.value\n })\n\n const recoverPublish = Effect.fn('WorkingDocuments.recoverPublish')(function* (source: DocumentSource) {\n const active = yield* store.pendingPublish(source.documentId)\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 if (currentHash === attempt.markdownHash) {\n const capturedSourcePath = yield* capturedWorkingSourcePath({\n state: attempt.state,\n stateVector: attempt.stateVector,\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 return yield* conflict(\n source.documentId,\n 'recoverPublish',\n 'The document source path changed during interrupted publish recovery.',\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 return source\n } else {\n yield* store.failPublish({\n attemptId: attempt.id,\n documentId: source.documentId,\n reason: 'authored-document-changed',\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 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 yield* store.completePublish({ attemptId: attempt.id, documentId: source.documentId })\n return currentSource\n })\n\n const ensureOpenSnapshot = Effect.fn('WorkingDocuments.ensureOpenSnapshot')(function* (source: DocumentSource) {\n const loaded = yield* store.load(source.documentId)\n if (Option.isNone(loaded)) {\n const document = yield* validatedDocument(source)\n const initialized = yield* store.initialize(yield* newSnapshot(source, document))\n if (initialized.savedVersion === source.version) return initialized\n if (yield* workingSnapshotIsDirty(initialized)) return initialized\n return yield* store.replace({\n expectedGeneration: initialized.generationId,\n snapshot: yield* newSnapshot(source, document),\n })\n }\n if (loaded.value.savedVersion === source.version) return loaded.value\n if (yield* workingSnapshotIsDirty(loaded.value)) return loaded.value\n const document = yield* validatedDocument(source)\n return yield* store.replace({\n expectedGeneration: loaded.value.generationId,\n snapshot: yield* newSnapshot(source, document),\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 const workingStateVector = yield* useWorkingSnapshot(snapshot, (document) =>\n captureCollaborationDocument(document).pipe(Effect.map((captured) => captured.stateVector)),\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 const appended = yield* store.appendUpdate({\n documentId: ref.documentId,\n expectedGeneration: ref.generationId,\n update: Uint8Array.from(update),\n })\n const snapshot = yield* snapshotFor(ref)\n const compacted = snapshot.updates.length >= compactAfterUpdates ? yield* compactSnapshot(snapshot) : false\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 return yield* useAuthoritativeWorkingDocument(snapshot, document, (captured, immutable) =>\n Effect.gen(function* () {\n const rendered = yield* renderCollaborationDocument(immutable)\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 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 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 const rendered = yield* renderCollaborationDocument(immutable)\n if (rendered.sourcePath !== source.sourcePath) {\n return yield* conflict(ref.documentId, 'publish', 'The working document source path is stale.')\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 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 checkpointResult = checkpoint\n checkpointVersion = checkpoint.version\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 const markCheckpointed = store.markCheckpointed({\n attemptId: id,\n checkpointVersion,\n documentId: ref.documentId,\n })\n yield* checkpointResult ? markCheckpointed.pipe(Effect.mapError(checkpointFailure)) : markCheckpointed\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 yield* store.completePublish({ attemptId: id, documentId: ref.documentId })\n return result\n }).pipe(Effect.mapError(checkpointFailure))\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 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)\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 return {\n drain,\n track: (promise) => {\n active.add(promise)\n void promise.finally(() => active.delete(promise)).catch(() => undefined)\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 const pendingMessages = documents.flatMap((document) =>\n document.getConnections().map((connection) => connection.waitForPendingMessages()),\n )\n hocuspocus.closeConnections()\n yield* Effect.promise(() => Promise.allSettled(pendingMessages))\n yield* Effect.promise(operations.drain)\n const stores = documents.flatMap((document) => {\n const store = hocuspocus.debouncer.executeNow(`onStoreDocument-${document.name}`)\n return store === undefined ? [] : [store]\n })\n yield* Effect.promise(() => Promise.allSettled(stores))\n yield* Effect.promise(operations.drain)\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 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 const cleanupFailure = cleanupResults.find((result) => result.status === 'rejected')\n if (cleanupFailure?.status === 'rejected') {\n return yield* gatewayError('close', cleanupFailure.reason)\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\n/** Serializes each room independently and retains poisoned writes for shutdown reporting. */\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 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 return active.length === 0 ? Promise.resolve() : Promise.allSettled(active).then(() => undefined)\n },\n enqueue: (name, poison, operation) => {\n const failed = failures.get(name)\n if (failed !== undefined) return Promise.reject(failed)\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 const tail = result.then(\n () => undefined,\n () => undefined,\n )\n pending.set(name, tail)\n void tail.finally(() => {\n if (pending.get(name) === tail) pending.delete(name)\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 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'))\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 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))\nexport const decodeRoomName = Schema.decodeUnknownEffect(StudioRealtimeRoomName)\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 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 for (const character of value) {\n hash ^= character.codePointAt(0) ?? 0\n hash = Math.imul(hash, 16_777_619)\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\nconst DEFAULT_CONCURRENCY = 32\n\n/** Bounded wake scheduling: duplicate rooms coalesce and unrelated rooms run concurrently. */\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 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 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 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 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, 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\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 const queue = createKeyedOperations({\n expectedFailure: isRoomReplaced,\n poison: (cause) => roomHostError('persist', cause),\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 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 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 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 if (loading !== undefined)\n yield* Effect.promise(() =>\n loading.then(\n () => undefined,\n () => undefined,\n ),\n )\n const room = rooms.get(name)\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 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 if (rooms.get(name) !== room) return\n yield* Effect.tryPromise({\n try: () => instance.unloadDocument(room.document),\n catch: (cause) => roomHostError('unload', cause),\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 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 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 return drainRoomWakes(room)\n }),\n ),\n )\n\n const handleWake = (name: StudioRealtimeRoomName) =>\n Effect.suspend(() => {\n const room = rooms.get(name)\n if (room === undefined || invalidated.has(name)) return Effect.void\n if (room.loading || room.wakeActive) {\n room.pendingWake = true\n return Effect.void\n }\n room.wakeActive = true\n room.pendingWake = false\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 const room = rooms.get(name)\n if (room === undefined || room.loading) {\n yield* documents.probe(workingDocumentRef(name))\n return\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 return Promise.resolve()\n },\n onLoadDocument: (payload) => {\n hocuspocus = payload.instance\n return runTracked(\n Effect.gen(function* () {\n const name = yield* decodeRoomName(payload.documentName).pipe(\n Effect.mapError((cause) => roomHostError('load', cause)),\n )\n if (!accepting || invalidated.has(name)) {\n return yield* roomHostError('load', new Error('The Studio realtime room was invalidated while loading.'))\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 queue.reset(name)\n rooms.set(name, room)\n const synchronized = yield* documents.synchronize(workingDocumentRef(name))\n if (!current(room)) {\n return yield* roomHostError('load', new Error('The Studio realtime room was invalidated while loading.'))\n }\n room.cursor = synchronized.highWatermark\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 const room = rooms.get(name)\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 room.loading = false\n const pendingWake = room.pendingWake\n room.pendingWake = false\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 return runTracked(\n Effect.gen(function* () {\n const name = yield* decodeRoomName(payload.documentName).pipe(\n Effect.mapError((cause) => roomHostError('persist', cause)),\n )\n const room = rooms.get(name)\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 const appended = yield* documents.appendUpdate(\n workingDocumentRef(name),\n Uint8Array.from(payload.update),\n )\n if (!current(room)) return\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 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 return runTracked(\n Effect.gen(function* () {\n const name = yield* decodeRoomName(payload.documentName).pipe(\n Effect.mapError((cause) => roomHostError('compact', cause)),\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 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 if (decoded._tag === 'None' || decoded.value.type !== 'checkpoint') return\n const name = yield* decodeRoomName(payload.documentName).pipe(\n Effect.mapError((cause) => roomHostError('checkpoint', cause)),\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 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 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 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 const probeInterval = options.probeInterval ?? DEFAULT_PROBE_INTERVAL\n const probeRooms = Effect.suspend(() =>\n Effect.forEach([...rooms.values()], (room) => handleWake(room.name), { concurrency: 'unbounded' }),\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 const fence = Effect.sync(() => {\n accepting = false\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 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 return documents.check.pipe(Effect.mapError((cause) => roomHostError('check', cause)))\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 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 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 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 if (!payload || !encodedSignature || extra !== undefined) return yield* Effect.fail(errors.invalid())\n const signature = yield* decodeBytes(encodedSignature, errors.invalid)\n if (!(yield* verifySignature(key, payload, signature))) return yield* Effect.fail(errors.invalid())\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 for (const byte of value) binary += String.fromCharCode(byte)\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 return Uint8Array.from(binary, (character) => character.codePointAt(0) ?? 0)\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\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 const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(TicketClaims))(claims).pipe(\n Effect.mapError(() => new StudioRealtimeTicketInvalid({ reason: 'invalid' })),\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 const claims = yield* Schema.decodeEffect(Schema.fromJsonString(TicketClaims))(payload).pipe(\n Effect.mapError(() => new StudioRealtimeTicketInvalid({ reason: 'invalid' })),\n )\n if (studioRealtimeRoomName(claims.ref) !== expectedDocumentName)\n return yield* new StudioRealtimeTicketInvalid({ reason: 'wrong-room' })\n if (claims.expiresAt <= (yield* Clock.currentTimeMillis))\n return yield* new StudioRealtimeTicketInvalid({ reason: 'expired' })\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, 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\nconst STORE_MAX_DEBOUNCE_MILLIS = 5_000\nconst CROSS_ORIGIN_CLOSE_CODE = 1_008\nconst CROSS_ORIGIN_CLOSE_REASON = 'Cross-origin collaboration is not allowed.'\nconst AUTHORIZATION_CLOSE_CODE = 1_008\nconst AUTHORIZATION_CLOSE_REASON = 'Collaboration access control is no longer valid.'\nconst TICKET_REFRESH_WINDOW_MILLIS = 15_000\n\nconst isTicketExpiry = Schema.is(Schema.Int.check(Schema.isGreaterThan(0)))\nconst isAccessDenied = Schema.is(AccessDenied)\nconst isDocumentNotFound = Schema.is(DocumentNotFound)\nconst isDocumentPathConflict = Schema.is(DocumentPathConflict)\nconst isDocumentValidationFailed = Schema.is(DocumentValidationFailed)\nconst isDocumentVersionConflict = Schema.is(DocumentVersionConflict)\nconst isDocumentGenerationConflict = Schema.is(DocumentGenerationConflict)\nconst isWorkingDocumentConflict = Schema.is(WorkingDocumentConflict)\nconst isWorkingDocumentSuperseded = Schema.is(WorkingDocumentSuperseded)\nconst isWorkingDocumentCheckpointed = Schema.is(WorkingDocumentCheckpointed)\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']>\ntype StudioRealtimeGatewayConnection = Pick<NativeHocuspocusConnection, 'handleClose' | 'handleMessage'>\ntype PreviewRequest = Extract<CollaborationClientMessage, { readonly type: 'preview' }>\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 const tokenRefreshes = new WeakMap<\n HocuspocusDocumentConnection<StudioRealtimeConnectionContext>,\n Promise<AuthenticatedRealtimeContext>\n >()\n const activeConnections = new Set<{\n readonly connection: NativeHocuspocusConnection\n readonly socket: WebSocketLike\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 return context\n }),\n ),\n beforeHandleMessage: (payload) =>\n runTracked(\n Effect.gen(function* () {\n const tokenRefresh = tokenRefreshes.get(payload.connection)\n if (tokenRefresh !== undefined) yield* Effect.promise(() => tokenRefresh)\n const context = authenticatedContext(payload.connection.context, payload.documentName)\n const now = yield* Clock.currentTimeMillis\n if (context.expiresAt <= now) {\n payload.connection.readOnly = true\n refreshPending.delete(payload.connection)\n return yield* Effect.fail(authorizationCloseError())\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 if (refreshed.actor.id !== current.actor.id) return yield* Effect.fail(authorizationCloseError())\n payload.connection.readOnly = !refreshed.canWrite\n payload.connection.context = refreshed\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 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 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 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 if (decoded._tag === 'None') return\n const request = decoded.value\n const context = authenticatedContext(payload.connection.context, payload.documentName)\n if (request.type === 'checkpoint') return\n if (!context.canWrite) {\n yield* sendMessage(payload.connection, forbiddenMessage(request))\n return\n }\n const requestContext = StudioRequestContextSchema.make({\n actor: context.actor,\n requestId: request.requestId,\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 return\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 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 return undefined\n }\n if (!hasSameOrigin(request)) {\n socket.close(CROSS_ORIGIN_CLOSE_CODE, CROSS_ORIGIN_CLOSE_REASON)\n return undefined\n }\n const connection = hocuspocus.handleConnection(socket, request)\n const active = { connection, socket }\n activeConnections.add(active)\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 const checkpoint = isWorkingDocumentCheckpointed(cause)\n ? Object.assign(\n { authoredStateVector: encodeRealtimeStateVector(cause.stateVector) },\n cause.result === undefined ? undefined : { result: cause.result },\n )\n : undefined\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 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 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 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 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 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 if (isDocumentNotFound(cause)) return { error: 'The document was not found.', statusCode: 404 }\n if (isDocumentValidationFailed(cause)) return { error: 'The collaborative document is invalid.', statusCode: 422 }\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 if (isWorkingDocumentInvalid(cause)) return { error: 'The collaborative document is invalid.', statusCode: 400 }\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 if (origin === null) return true\n try {\n const originUrl = new URL(origin)\n const requestUrl = new URL(request.url)\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 if (protocol === 'wss:') return 'https:'\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.catchCause((cause) => Effect.logError('Studio realtime gateway shutdown failed.', cause)),\n ),\n ),\n)\n","import type { CmsWebSocket, CmsWebSocketBridge } from '../../Installation'\nimport type { StudioRealtimeGatewayApi } from './gateway'\n\n/** Hides Hocuspocus connection bookkeeping from framework WebSocket adapters. */\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 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 if (handled !== undefined) connections.set(connection.socket, handled)\n },\n }\n}\n","import 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 { CMS_AUTHENTICATION_PATH, CMS_LIVENESS_PATH, CMS_READINESS_PATH } 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 { HttpRouter } from 'effect/unstable/http'\nimport { AuthenticationHandler } from '@internal/server/adapter/Authentication'\nimport { Readiness } from '@internal/server/adapter/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<E extends object, R>(\n bootstrap: StudioBootstrap,\n application: Layer.Layer<never, E, HttpRouter.HttpRouter>,\n cleanup: (context: StudioRequestContextValue) => Effect.Effect<MediaCleanupReport, MediaCleanupError, R>,\n): Layer.Layer<\n Installation,\n E,\n AuthenticationHandler | Readiness | StudioRealtimeGateway | StudioRealtimeRoomHost | Crypto.Crypto | R\n> {\n return Layer.effect(\n Installation,\n Effect.gen(function* () {\n const outerContext = yield* Effect.context<Scope.Scope>()\n const cleanupContext = yield* Effect.context<R>()\n const memoMap = Context.getUnsafe(outerContext, Layer.CurrentMemoMap)\n const webHandler = yield* Effect.acquireRelease(\n Effect.sync(() => HttpRouter.toWebHandler(application, { memoMap })),\n ({ dispose }) => Effect.promise(dispose),\n )\n return yield* makeInstallation(bootstrap, webHandler.handler, (context) =>\n cleanup(context).pipe(Effect.provide(cleanupContext)),\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) {\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\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 const runPromise = Effect.runPromiseWith(yield* Effect.context<never>())\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 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 if (pathname === CMS_AUTHENTICATION_PATH || pathname.startsWith(`${CMS_AUTHENTICATION_PATH}/`)) {\n return authentication.handle(request)\n }\n if (pathname === CMS_LIVENESS_PATH) return Promise.resolve(healthResponse({ live: true, ready: true }, false))\n if (pathname === CMS_READINESS_PATH) return runPromise(health).then((status) => healthResponse(status, true))\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 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 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 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 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 const runPromise = Effect.runPromiseWith(yield* Effect.context<never>())\n return {\n close: () => runPromise(close),\n fetch: installation.fetch,\n webSocket: installation.webSocket,\n } satisfies CmsInstallation\n})\n","import type { ImageMimeType, MediaByteSize, MediaInvalid, MediaObjectKey } from '@internal/protocol/Media'\nimport type { MediaStorageError } from './media-failures'\nimport { Context, Effect, Option, Stream } from 'effect'\n\nexport interface StoredMediaObject {\n readonly byteSize: MediaByteSize\n readonly mimeType?: ImageMimeType\n readonly objectKey: MediaObjectKey\n}\n\nexport interface MediaObjectWrite {\n readonly body: Stream.Stream<Uint8Array, MediaInvalid>\n readonly byteSize: MediaByteSize\n readonly mimeType: ImageMimeType\n readonly objectKey: MediaObjectKey\n}\n\nexport interface MediaObjectPromotion {\n readonly byteSize: MediaByteSize\n readonly destinationObjectKey: MediaObjectKey\n readonly mimeType: ImageMimeType\n readonly sourceObjectKey: MediaObjectKey\n}\n\nexport interface MediaObjectStoreApi {\n readonly list: Stream.Stream<StoredMediaObject, MediaStorageError>\n readonly promote: (input: MediaObjectPromotion) => Effect.Effect<StoredMediaObject, MediaStorageError>\n readonly put: (input: MediaObjectWrite) => Effect.Effect<StoredMediaObject, MediaInvalid | MediaStorageError>\n readonly remove: (objectKey: MediaObjectKey) => Effect.Effect<void, MediaStorageError>\n readonly stat: (objectKey: MediaObjectKey) => Effect.Effect<Option.Option<StoredMediaObject>, MediaStorageError>\n}\n\nexport class MediaObjectStore extends Context.Service<MediaObjectStore, MediaObjectStoreApi>()(\n '@internal/server/MediaObjectStore',\n) {}\n","import { Schema } from 'effect'\n\nexport class MediaPersistenceError extends Schema.TaggedError<MediaPersistenceError>()('Media.PersistenceError', {\n operation: Schema.NonEmptyString,\n cause: Schema.Defect(),\n}) {}\n\nexport class MediaStorageError extends Schema.TaggedError<MediaStorageError>()('Media.StorageError', {\n operation: Schema.NonEmptyString,\n cause: Schema.Defect(),\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, 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})\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})\nconst MediaRemovalIntent = SchemaRuntime.Struct({\n kind: SchemaRuntime.tag('remove'),\n mediaId: MediaId,\n name: MediaName,\n objectKey: MediaObjectKey,\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'))\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 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 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: SchemaRuntime.encodeSync(MediaChangeIntent)(input.intent),\n scope: 'media',\n subject: input.subject,\n target: input.target,\n })\n}\n","import type { MediaConflict, 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 function recoverPendingMedia(\n store: MediaStoreApi,\n objectStore: MediaObjectStoreApi,\n operations: ChangeJournalApi,\n recoveryAge: Duration.Input,\n options: { readonly maxBatches?: number } = {},\n): Effect.Effect<void, MediaPersistenceError | MediaStorageError> {\n return Effect.gen(function* () {\n const before = DateTime.subtractDuration(yield* DateTime.now, recoveryAge)\n const maxBatches = options.maxBatches ?? Number.POSITIVE_INFINITY\n const recoverBatch = Effect.gen(function* () {\n const pending = yield* store.pending({ before, limit: 100 })\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 const stored = yield* objectStore.stat(record.objectKey)\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 if (Option.isSome(remaining)) continue\n }\n yield* store.abandonUpload(record.id)\n }\n }\n return pending.length < 100\n })\n let mediaBatch = 0\n let mediaComplete = false\n while (!mediaComplete && mediaBatch < maxBatches) {\n mediaComplete = yield* recoverBatch\n mediaBatch += 1\n }\n\n const recoverReplacementBatch = Effect.gen(function* () {\n const replacements = yield* store.pendingReplacements({ before, limit: 100 })\n yield* Effect.forEach(\n replacements,\n (replacement) =>\n recoverReplacement(store, objectStore, replacement).pipe(\n Effect.catchTag('Media.Conflict', () => Effect.void),\n ),\n { discard: true },\n )\n return replacements.length < 100\n })\n let replacementBatch = 0\n let replacementsComplete = false\n while (!replacementsComplete && replacementBatch < maxBatches) {\n replacementsComplete = yield* recoverReplacementBatch\n replacementBatch += 1\n }\n\n yield* recoverPendingMediaCleanup(operations, objectStore, before)\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 if (!pending) return\n if (before !== undefined && DateTime.toEpochMillis(pending.updatedAt) > DateTime.toEpochMillis(before)) {\n return\n }\n const { change, intent } = yield* requireMediaChange(operations, mediaCleanupSubject(), 'media.cleaned').pipe(\n mapChangeFailure('MediaReconciliation.cleanup.require'),\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 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 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 if (Option.isNone(staged)) {\n yield* recoverReplacementWithoutStaging(store, objectStore, replacement)\n return\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 if (Option.isNone(remaining)) {\n yield* recoverReplacementWithoutStaging(store, objectStore, replacement)\n }\n return\n }\n const stagedReplacement = replacement.staged ? replacement : yield* store.markReplaceStaged(replacement)\n const promoted = yield* promoteOrReconcileMissingStaging(store, objectStore, stagedReplacement)\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 if (state !== 'pending') return\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 return\n }\n const current = yield* store.find(replacement.mediaId)\n if (Option.isNone(current)) return\n const destination = yield* objectStore.stat(replacement.objectKey)\n if (Option.isNone(destination)) {\n yield* store.cancelReplace(replacement)\n return\n }\n const destinationMatchesReplacement =\n destination.value.byteSize === replacement.byteSize &&\n (destination.value.mimeType === undefined || destination.value.mimeType === replacement.mimeType)\n const destinationMatchesCurrent =\n destination.value.byteSize === current.value.byteSize &&\n (destination.value.mimeType === undefined || destination.value.mimeType === current.value.mimeType)\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 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 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 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 while (initialByteSize < 32 && !complete) {\n const chunks = yield* pull.pipe(Pull.catchDone(() => Effect.void))\n if (!chunks) {\n complete = true\n continue\n }\n for (const chunk of chunks) {\n initialChunks.push(chunk)\n initialByteSize += chunk.byteLength\n }\n }\n if (initialByteSize === 0) {\n return yield* new MediaInvalidError({ message: 'The upload is not a supported image.' })\n }\n const mimeType = yield* Effect.fromResult(validateImage(imageHeader(initialChunks), metadata.declaredMimeType))\n const byteSize = yield* Ref.make(0)\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 if (next > metadata.declaredByteSize) {\n return yield* new MediaInvalidError({ message: 'Media body contains more bytes than declared.' })\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 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 let offset = 0\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 if (offset === header.byteLength) break\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 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 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 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, 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, 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'\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\nexport type MediaUploadError =\n | AccessDenied\n | ActivityUnavailable\n | MediaInvalid\n | MediaPersistenceError\n | MediaStorageError\n | MediaTooLarge\nexport type MediaRemoveError =\n | AccessDenied\n | ActivityUnavailable\n | MediaConflict\n | MediaNotFound\n | MediaPersistenceError\n | MediaReferenced\n | MediaStorageError\nexport type MediaIntegrityError = AccessDenied | DocumentProjectionError | MediaPersistenceError | MediaStorageError\nexport type MediaCleanupError = ActivityUnavailable | AccessDenied | MediaPersistenceError | MediaStorageError\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})\nconst CursorJson = Schema.fromJsonString(CursorPayload)\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 yield* recoverPendingMedia(store, objectStore, operations, pendingRecoveryAge)\n const mutations = yield* Semaphore.make(1)\n const recoveryInterval = options.pendingRecoveryInterval ?? MEDIA_OPERATION_RECOVERY_INTERVAL\n if (recoveryInterval !== false) {\n const recover = mutations\n .withPermits(1)(recoverPendingMedia(store, objectStore, operations, pendingRecoveryAge, { maxBatches: 1 }))\n .pipe(\n Effect.catch((error) =>\n Effect.logWarning('Pending media change recovery sweep failed.', { errorTag: error._tag }),\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 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 const page = yield* store.search({\n cursor,\n folder: query.folder,\n limit: query.limit ?? 30,\n search: query.search?.trim() || undefined,\n })\n const mediaPage = {\n assets: page.records.map(toAsset),\n folders: page.folders,\n total: page.total,\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 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 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(`media/${id}.${imageExtension(prepared.mimeType)}`)\n const now = yield* DateTime.now\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 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 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 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 if (Option.isNone(current)) return yield* new MediaNotFoundError({ mediaId: id })\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 const operationId = ActivityId.make(yield* crypto.randomUUIDv4.pipe(Effect.orDie))\n const timestamp = yield* DateTime.now\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 `media/replacements/${operationId}.${imageExtension(prepared.mimeType)}`,\n ),\n updatedAt: timestamp,\n }\n const pendingReplacement = yield* store.beginReplace(replacement, {\n context,\n id: operationId,\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 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 return yield* mutations.withPermits(1)(\n Effect.gen(function* () {\n yield* recoverPendingMediaCleanup(operations, objectStore)\n const objectKeys = yield* findOrphanedMediaObjects(store, objectStore)\n if (objectKeys.length > 0) {\n const id = ActivityId.make(yield* crypto.randomUUIDv4.pipe(Effect.orDie))\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 yield* Effect.forEach(objectKeys, (objectKey) => objectStore.remove(objectKey), { discard: true })\n const remaining = yield* Effect.forEach(objectKeys, (objectKey) => objectStore.stat(objectKey))\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 yield* resolveMediaChange(operations, change).pipe(\n Effect.mapError(activityFailure('MediaLibrary.cleanup.resolve')),\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 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 if (\n object === undefined ||\n (object.byteSize === record.byteSize &&\n (object.mimeType === undefined || object.mimeType === record.mimeType))\n ) {\n return []\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 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 {\n PreviewOrigin as PreviewOriginType,\n PreviewSession as PreviewSessionType,\n} from '@internal/protocol/Preview'\nimport { StudioActor } from '@internal/protocol/AccessControl'\nimport { PreviewOrigin, PreviewSession, PreviewSessionId, PreviewSessionInvalid } from '@internal/protocol/Preview'\nimport { Clock, Context, Crypto, DateTime, Effect, Layer, Redacted, Schema } from 'effect'\nimport { makeSignedTokenCodec } from '@internal/protocol/SignedToken'\n\nconst DEFAULT_LIFETIME_MILLIS = 5 * 60_000\nconst MAXIMUM_TOKEN_LENGTH = 4_096\n\nconst PreviewSessionClaims = Schema.Struct({\n actorId: StudioActor.fields.id,\n editorOrigin: PreviewOrigin,\n expiresAt: Schema.Int.check(Schema.isGreaterThan(0)),\n previewOrigin: PreviewOrigin,\n sessionId: PreviewSessionId,\n})\n\nexport interface PreviewSessionClaims extends Schema.Schema.Type<typeof PreviewSessionClaims> {}\n\nexport class PreviewSessionConfigurationInvalid extends Schema.TaggedError<PreviewSessionConfigurationInvalid>()(\n 'Preview.SessionConfigurationInvalid',\n { message: Schema.NonEmptyString },\n) {}\n\nexport interface PreviewSessionsApi {\n readonly issue: (\n actorId: string,\n editorOrigin: PreviewOriginType,\n previewOrigin: PreviewOriginType,\n ) => Effect.Effect<PreviewSessionType, PreviewSessionInvalid>\n readonly verify: (\n token: string,\n previewOrigin: PreviewOriginType,\n ) => Effect.Effect<PreviewSessionClaims, PreviewSessionInvalid>\n}\n\nexport class PreviewSessions extends Context.Service<PreviewSessions, PreviewSessionsApi>()(\n '@internal/server/PreviewSessions',\n) {}\n\nexport interface PreviewSessionsOptions {\n readonly allowedPreviewOrigins: ReadonlySet<PreviewOriginType>\n readonly lifetimeMillis?: number\n}\n\nexport function previewSessionsLayer(secret: Redacted.Redacted<string>, options: PreviewSessionsOptions) {\n return Layer.effect(PreviewSessions, makePreviewSessions(secret, options))\n}\n\nconst makePreviewSessions = Effect.fn('PreviewSessions.make')(function* (\n secret: Redacted.Redacted<string>,\n options: PreviewSessionsOptions,\n) {\n const lifetimeMillis = options.lifetimeMillis ?? DEFAULT_LIFETIME_MILLIS\n if (!Number.isSafeInteger(lifetimeMillis) || lifetimeMillis <= 0) {\n return yield* new PreviewSessionConfigurationInvalid({ message: 'The preview session lifetime must be positive.' })\n }\n const crypto = yield* Crypto.Crypto\n const tokens = yield* makeSignedTokenCodec(secret, {\n configuration: () =>\n new PreviewSessionConfigurationInvalid({\n message: 'The preview session secret must be at least 32 bytes and usable for signing.',\n }),\n invalid: () => new PreviewSessionInvalid({ reason: 'invalid' }),\n })\n\n const issue = Effect.fn('PreviewSessions.issue')(function* (\n actorId: string,\n editorOrigin: PreviewOriginType,\n previewOrigin: PreviewOriginType,\n ) {\n if (!options.allowedPreviewOrigins.has(previewOrigin)) return yield* invalidSession('origin')\n const expiresAt = (yield* Clock.currentTimeMillis) + lifetimeMillis\n const claims = PreviewSessionClaims.make({\n actorId,\n editorOrigin,\n expiresAt,\n previewOrigin,\n sessionId: PreviewSessionId.make(yield* crypto.randomUUIDv4.pipe(Effect.orDie)),\n })\n const token = yield* Schema.encodeEffect(Schema.fromJsonString(PreviewSessionClaims))(claims).pipe(\n Effect.mapError(() => new PreviewSessionInvalid({ reason: 'invalid' })),\n Effect.flatMap(tokens.sign),\n Effect.mapError(() => new PreviewSessionInvalid({ reason: 'invalid' })),\n )\n return PreviewSession.make({\n editorOrigin,\n expiresAt: DateTime.makeUnsafe(expiresAt),\n previewOrigin,\n sessionId: claims.sessionId,\n token,\n })\n })\n\n const verify = Effect.fn('PreviewSessions.verify')(function* (token: string, previewOrigin: PreviewOriginType) {\n const payload = yield* tokens\n .verify(token, MAXIMUM_TOKEN_LENGTH)\n .pipe(Effect.mapError(() => new PreviewSessionInvalid({ reason: 'invalid' })))\n const claims = yield* Schema.decodeEffect(Schema.fromJsonString(PreviewSessionClaims))(payload).pipe(\n Effect.mapError(() => new PreviewSessionInvalid({ reason: 'invalid' })),\n )\n if (claims.previewOrigin !== previewOrigin) return yield* invalidSession('origin')\n if (claims.expiresAt <= (yield* Clock.currentTimeMillis)) return yield* invalidSession('expired')\n return claims\n })\n\n return PreviewSessions.of({ issue, verify })\n})\n\nfunction invalidSession(reason: PreviewSessionInvalid['reason']) {\n return Effect.fail(new PreviewSessionInvalid({ reason }))\n}\n","import type { DocumentMutationError } from '../../Documents'\nimport type { DocumentImportSource } from '@internal/protocol/Documents'\nimport 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 { DocumentImportInput } from '@internal/protocol/Documents'\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, Redacted, Result, Schema } from 'effect'\nimport { DocumentMaintenance } from '../documents/documents'\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'\nexport { InitializationUnavailable } from './initialization-failures'\n\nconst InitializationUnavailableError = InitializationUnavailable\n\nexport interface InitializationOptions {\n readonly initialSources?: ReadonlyArray<DocumentImportSource>\n readonly initializationToken: Redacted.Redacted<string>\n}\n\nexport type InitializationError =\n | DocumentMutationError\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 | DocumentMaintenance | Crypto.Crypto | InitialIdentity | InitialIdentityRecovery | InitializationStore\n> {\n return Layer.effect(\n Initialization,\n Effect.gen(function* () {\n const journal = yield* ChangeJournal\n const documentOperations = yield* DocumentMaintenance\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 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 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 if (current.state === 'ready') return yield* new InitializationAlreadyCompletedError()\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 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 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 const durableClaim = InitializationClaim.make({ changeId, context, intent: prepared.intent })\n if (!(yield* store.claim(durableClaim))) return yield* new InitializationAlreadyCompletedError()\n\n const imported = yield* documentOperations\n .importSources(\n DocumentImportInput.make({\n mode: 'preserve',\n reason: 'CMS initialization',\n sources: options.initialSources ?? [],\n }),\n context,\n )\n .pipe(Effect.result)\n if (Result.isFailure(imported)) {\n yield* store.reset(changeId)\n return yield* imported.failure\n }\n\n const begin = yield* journal\n .begin(initialAdministratorDraft({ context, id: changeId }, prepared.intent))\n .pipe(Effect.mapError((cause) => unavailable('Initialization.begin', cause)))\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 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 return yield* unavailable('Initialization.createAdministrator', applied.failure.error)\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 if (resolution.kind === 'applied') {\n yield* completeBestEffort(store, changeId)\n return resolution.user\n }\n if (resolution.kind === 'cancelled') yield* store.reset(changeId)\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 if (Result.isFailure(finalized)) {\n yield* Effect.logWarning('Initial administrator Activity finalization is pending recovery.', {\n changeId,\n })\n return applied.success\n }\n yield* completeBestEffort(store, changeId)\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 if (state.state !== 'claiming') return state\n const draft = initialAdministratorDraft(\n { context: state.claim.context, id: state.claim.changeId },\n state.claim.intent,\n )\n const begin = yield* journal\n .begin(draft)\n .pipe(Effect.mapError((cause) => unavailable('Initialization.recover', cause)))\n switch (begin._tag) {\n case 'Recorded':\n yield* store.complete(state.claim.changeId)\n return yield* store.read\n case 'Cancelled':\n yield* store.reset(state.claim.changeId)\n return yield* store.read\n case 'Unresolved': {\n const resolution = yield* reconcileInitialAdministrator(journal, begin.change, recovery.observe).pipe(\n Effect.mapError((cause) => unavailable('Initialization.recover', cause)),\n )\n if (resolution.kind === 'applied') yield* store.complete(state.claim.changeId)\n if (resolution.kind === 'cancelled') yield* store.reset(state.claim.changeId)\n return yield* store.read\n }\n }\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 for (let index = 0; index < length; index += 1) {\n difference |= (left[index] ?? 0) ^ (right[index] ?? 0)\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 return (httpEffect) =>\n Effect.gen(function* () {\n const request = yield* HttpServerRequest.HttpServerRequest\n const authenticated = yield* authentication.authenticate(\n new globalThis.Headers(Object.entries(request.headers)),\n )\n if (!authenticated) return yield* new AuthenticationRequired()\n if (!authenticated.actor.roles.some(Schema.is(Role))) return yield* new StudioEntryDenied()\n const activity: StudioRequestContext = {\n actor: authenticated.actor,\n requestId: RequestId.make(yield* crypto.randomUUIDv4.pipe(Effect.mapError(() => studioInternalError()))),\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'\nconst USER_CHANGE_RECOVERY_INTERVAL = '10 seconds'\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 const pending = yield* journal\n .pending({ before, limit: USER_CHANGE_RECOVERY_LIMIT, scope: 'users' })\n .pipe(Effect.mapError(unavailable('UserAdministration.recover')))\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 if (IdentityPreparation.$is('Noop')(preparation)) return preparation.user\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 return yield* lease.include(\n userChangeSubjectFenceKey(subject),\n Effect.gen(function* () {\n yield* ensureSubjectAvailable(journal, recovery, subject)\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 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 return yield* result.failure.error\n }\n\n const resolution = yield* reconcileAfterUnknown(journal, recovery, change)\n if (resolution.kind === 'applied') {\n const user = resolution.user ?? preparation.user\n if (user) return user\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 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 if (!existing) return\n const staleBefore = DateTime.subtractDuration(yield* DateTime.now, USER_CHANGE_GRACE)\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 yield* reconcilePending(journal, recovery, existing)\n if (!(yield* findPendingChange(journal, subject).pipe(Effect.mapError(unavailable('UserAdministration.subject'))))) {\n return\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 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 { 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])\nconst isPublicTicketError = Schema.is(PublicTicketError)\n\nexport const collaborationApiLayer = 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 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 const token = yield* tickets.issue({\n actor: context.actor,\n canWrite,\n ref: opened.ref,\n })\n return CollaborationTicket.make({\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 {\n DocumentMediaUnavailable as DocumentMediaUnavailableError,\n DocumentNotFound as DocumentNotFoundError,\n DocumentPathConflict,\n DocumentValidationFailed as DocumentValidationFailedError,\n DocumentVersionConflict as DocumentVersionConflictError,\n MoveDocumentInput,\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)\nconst isDocumentNotFound = Schema.is(DocumentNotFoundError)\nconst isDocumentVersionConflict = Schema.is(DocumentVersionConflictError)\nconst isDocumentGenerationConflict = Schema.is(DocumentGenerationConflict)\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 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('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\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 if (isDocumentGenerationConflict(error)) return new StudioRequestConflict({ retryable: true })\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, 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)\nconst isMediaInvalid = Schema.is(MediaInvalidError)\nconst isPublicMediaReadError = Schema.is(Schema.Union([AccessDeniedError, MediaNotFoundError]))\nconst isPublicMediaSearchError = Schema.is(Schema.Union([AccessDeniedError, MediaInvalidError]))\nconst isPublicMediaUploadError = Schema.is(\n Schema.Union([AccessDeniedError, MediaInvalidError, MediaTooLargeError, StudioInternalError]),\n)\nconst isPublicMediaRemoveError = Schema.is(\n Schema.Union([AccessDeniedError, MediaConflictError, MediaNotFoundError, MediaReferencedError]),\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 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 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 const pull = yield* Stream.toPull(payload)\n const firstParts = yield* pull.pipe(\n Pull.catchDone(() => Effect.fail(invalidMultipart())),\n Effect.mapError(mapMultipartError),\n )\n const part = firstParts[0]\n if (!Multipart.isFile(part) || part.key !== 'file') return yield* invalidMultipart()\n const remainingParts = Stream.concat(\n Stream.fromIterable(firstParts.slice(1)),\n Stream.fromPull(Effect.succeed(pull)),\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 const metadata = yield* Schema.decodeEffect(MediaUpload)(metadataInput).pipe(\n Effect.mapError(() => invalidMultipart()),\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 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 return error.reason._tag === 'InternalError' ? 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 type { Duration } from 'effect'\nimport type { DocumentPreviewsApi } from '@internal/server/Documents'\nimport { DocumentPreviews } from '@internal/server/Documents'\nimport {\n PreviewDraftNotFound,\n PreviewInvalidation,\n PreviewOrigin,\n PreviewSessionInvalid,\n} from '@internal/protocol/Preview'\nimport { CurrentStudioRequest, StudioApi } from '@internal/protocol/StudioHttp'\nimport { Clock, Duration as DurationRuntime, Effect, Layer, Option, Schedule, Schema, Stream } from 'effect'\nimport { HttpServerRequest } from 'effect/unstable/http'\nimport { HttpApiBuilder } from 'effect/unstable/httpapi'\nimport { PreviewSessions } from '@internal/server/PreviewSessions'\nimport { preservePublicErrors } from './errors'\n\ninterface PreviewApiOptions {\n readonly invalidationInterval?: Duration.Input\n}\n\nconst isPreviewSessionInvalid = Schema.is(PreviewSessionInvalid)\nconst isPreviewResolvePublicError = Schema.is(Schema.Union([PreviewSessionInvalid, PreviewDraftNotFound]))\n\nexport function previewApiLayers(options: PreviewApiOptions = {}) {\n const sessions = HttpApiBuilder.group(StudioApi, 'previewSessions', (handlers) =>\n Effect.gen(function* () {\n const previewSessions = yield* PreviewSessions\n return handlers.handle('issue', ({ payload }) =>\n Effect.gen(function* () {\n const context = yield* CurrentStudioRequest\n const origin = yield* requestOrigin\n return yield* previewSessions.issue(context.actor.id, origin, payload.previewOrigin)\n }).pipe(preservePublicErrors(isPreviewSessionInvalid)),\n )\n }),\n )\n\n const delivery = HttpApiBuilder.group(StudioApi, 'previewDelivery', (handlers) =>\n Effect.gen(function* () {\n const documents = yield* DocumentPreviews\n const previewSessions = yield* PreviewSessions\n const verify = (token: string) =>\n requestOrigin.pipe(Effect.flatMap((origin) => previewSessions.verify(token, origin)))\n\n return handlers\n .handle('resolve', ({ payload }) =>\n Effect.gen(function* () {\n yield* verify(payload.token)\n const document = yield* documents.read(payload.lookup)\n return Option.isSome(document)\n ? document.value\n : yield* new PreviewDraftNotFound({ lookup: payload.lookup })\n }).pipe(preservePublicErrors(isPreviewResolvePublicError)),\n )\n .handle('invalidations', ({ payload }) =>\n Effect.gen(function* () {\n const claims = yield* verify(payload.token)\n const now = yield* Clock.currentTimeMillis\n const expiresIn = Math.max(0, claims.expiresAt - now)\n return generationInvalidations(documents, options.invalidationInterval ?? '1 second').pipe(\n Stream.interruptWhen(Effect.sleep(DurationRuntime.millis(expiresIn))),\n )\n }).pipe(preservePublicErrors(isPreviewSessionInvalid)),\n )\n }),\n )\n\n return Layer.merge(sessions, delivery)\n}\n\nfunction generationInvalidations(documents: DocumentPreviewsApi, interval: Duration.Input) {\n return Stream.make(0).pipe(\n Stream.concat(Stream.fromSchedule(Schedule.spaced(interval))),\n Stream.mapEffect(() => documents.generation),\n Stream.changes,\n Stream.drop(1),\n Stream.map((generation) => PreviewInvalidation.make({ generation, type: 'document-invalidated' })),\n Stream.catch(() => Stream.empty),\n )\n}\n\nconst requestOrigin = HttpServerRequest.HttpServerRequest.pipe(\n Effect.flatMap((request) => {\n const origin = request.headers.origin\n return origin === undefined\n ? Effect.fail(new PreviewSessionInvalid({ reason: 'origin' }))\n : Schema.decodeEffect(PreviewOrigin)(origin).pipe(\n Effect.mapError(() => new PreviewSessionInvalid({ reason: 'origin' })),\n )\n }),\n)\n","import { PublishedDocuments } from '@internal/server/Documents'\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 return handlers\n .handle('read', ({ payload }) =>\n documents.read(payload).pipe(preservePublicErrors(isPublishedDocumentNotFound)),\n )\n .handle('query', ({ payload }) => documents.query(payload).pipe(mapUnexpectedError))\n .handle('navigation', ({ payload }) => documents.navigation(payload).pipe(mapUnexpectedError))\n .handle('surround', ({ payload }) =>\n documents.surround(payload.lookup, payload.query).pipe(preservePublicErrors(isPublishedDocumentNotFound)),\n )\n }),\n ),\n HttpApiBuilder.group(StudioApi, 'diagnostics', (handlers) =>\n Effect.gen(function* () {\n const documents = yield* PublishedDocuments\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 { mapUnexpectedError, preservePublicErrors, withStudioRequest } from './errors'\n\nconst isActivityPublicError = Schema.is(Schema.Union([ActivityCursorInvalid, AccessDenied]))\nconst isHistoryPublicError = Schema.is(\n Schema.Union([AccessDenied, DocumentHistoryComparisonTooLarge, DocumentHistoryInvalidCursor, DocumentNotFound]),\n)\nconst isInitializationPublicError = Schema.is(\n Schema.Union([InitializationAlreadyCompleted, InitializationProofInvalid]),\n)\n\nexport const administrationApiLayer = Layer.mergeAll(\n HttpApiBuilder.group(StudioApi, 'initialization', (handlers) =>\n Effect.gen(function* () {\n const initialization = yield* Initialization\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 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 return handlers.handle('list', ({ query }) =>\n withStudioRequest((context) => activity.list(context, query)).pipe(preservePublicErrors(isActivityPublicError)),\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)\nconst isCreateError = Schema.is(Schema.Union([UserAdministrationDenied, UserAlreadyExists]))\nconst isChangeRoleError = Schema.is(Schema.Union([UserAdministrationDenied, UserNotFound, UserSelfRoleChangeDenied]))\nconst isRevokeError = Schema.is(Schema.Union([UserAdministrationDenied, UserNotFound]))\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 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 { 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 { documentsApiLayer } from './documents'\nimport { studioSchemaErrorLayer } from './errors'\nimport { mediaApiLayer } from './media'\nimport { previewApiLayers } from './preview'\nimport { deliveryApiLayer } from './delivery'\nimport { administrationApiLayer } from './administration'\nimport { userAdministrationHttpLayer } from './user-administration'\n\nexport function studioApiLayer(bootstrap: StudioBootstrap) {\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 documentsApiLayer,\n mediaApiLayer(bootstrap.media.enabled, bootstrap.media.maxUploadBytes),\n collaborationApiLayer,\n deliveryApiLayer,\n previewApiLayers(),\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 type { DocumentEngineOptions } from '@internal/document/DocumentEngine'\nimport type { WorkingDocumentsOptions } from '@internal/server/WorkingDocuments'\nimport type { StudioBootstrap } from '@internal/protocol/StudioHttp'\nimport { workingDocumentsLayer } from '@internal/server/WorkingDocuments'\nimport { activityLayer } from '@internal/server/Activity'\nimport { defaultAccessControlLayer } from '@internal/server/AccessControl'\nimport { mediaLibraryLayer } from '@internal/server/MediaLibrary'\nimport { documentsLayer } from '@internal/server/Documents'\nimport { Layer } from 'effect'\n\nexport interface ProductModulesOptions {\n readonly bootstrap: StudioBootstrap\n readonly documentEngine: DocumentEngineOptions\n readonly workingDocuments?: WorkingDocumentsOptions\n}\n\nexport function productModulesLayer(options: ProductModulesOptions) {\n const accessControl = defaultAccessControlLayer\n const authoredDocuments = documentsLayer(options.bootstrap.documents, {\n ...options.documentEngine,\n components: options.documentEngine.components ?? options.bootstrap.components,\n mediaBaseUrl: options.documentEngine.mediaBaseUrl ?? 'https://media.invalid',\n }).pipe(Layer.provide(accessControl))\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\n return Layer.mergeAll(activity, documentAccess, workingDocuments)\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 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 { 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 { WorkingDocumentsOptions } from '@internal/server/WorkingDocuments'\nimport type { ExecutableDocumentModel } from '@internal/document/DocumentEngine'\nimport type { DocumentImportSource } from '@internal/protocol/Documents'\nimport type { PreviewOrigin } from '@internal/protocol/Preview'\nimport type { StudioBootstrap } from '@internal/protocol/StudioHttp'\nimport type { InstallationComposition } from './composition'\nimport { Effect, Layer, Redacted, Result, Schema } from 'effect'\nimport { 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 { studioRealtimeGatewayLayer } from '../realtime/gateway'\nimport { studioRealtimeRoomHostLayer } from '../realtime/room-host'\nimport { studioRealtimeTicketsLayer } from '../realtime/tickets'\nimport { previewSessionsLayer } from '@internal/server/PreviewSessions'\nimport { initializationLayer } from '@internal/server/Initialization'\nimport { studioAuthenticationLayer } from '../http/authentication'\nimport { userAdministrationLayer } from '@internal/server/UserAdministration'\nimport { studioApiLayer } from '../http/api'\nimport { productModulesLayer, productModulesWithMediaLayer } from './server-modules'\nimport { Installation, installationHttpLayer } from './host'\nimport { CmsInstallationError } from './error'\n\nexport interface InstallationOptions {\n readonly bootstrap: StudioBootstrap\n readonly studioSecret: Redacted.Redacted<string>\n readonly documentModel: ExecutableDocumentModel\n readonly composition: InstallationComposition\n readonly initialSources?: ReadonlyArray<DocumentImportSource>\n readonly initializationToken: Redacted.Redacted<string>\n readonly allowedPreviewOrigins: ReadonlySet<PreviewOrigin>\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 const productOptions = {\n bootstrap: options.bootstrap,\n documentEngine: { documentModel: options.documentModel },\n workingDocuments: options.workingDocuments,\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 // 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 const authentication = studioAuthenticationLayer.pipe(Layer.provide(core))\n const previewSessions = previewSessionsLayer(options.studioSecret, {\n allowedPreviewOrigins: options.allowedPreviewOrigins,\n }).pipe(Layer.provide(core))\n const initialization = initializationLayer({\n initialSources: options.initialSources,\n initializationToken: options.initializationToken,\n }).pipe(Layer.provide(Layer.merge(productModules, core)))\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 const httpDependencies = Layer.mergeAll(\n core,\n productModules,\n gateway,\n initialization,\n previewSessions,\n roomHost,\n users,\n ).pipe(Layer.provideMerge(authentication), Layer.provideMerge(tickets))\n const handlers = studioApiLayer(options.bootstrap).pipe(Layer.provide(httpDependencies))\n const httpApi = HttpApiBuilder.layer(StudioApi).pipe(Layer.provide(handlers), Layer.provide(HttpServer.layerServices))\n const installation = validated.media.enabled\n ? installationHttpLayer(options.bootstrap, httpApi, (context) =>\n Effect.flatMap(MediaLibrary, (library) => library.cleanup(context)),\n ).pipe(Layer.provide(httpDependencies))\n : installationHttpLayer(options.bootstrap, httpApi, () =>\n Effect.succeed(MediaCleanupReport.make({ removedObjectKeys: [] })),\n ).pipe(Layer.provide(httpDependencies))\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 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 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 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 { ExecutableDocumentModel } from '@internal/document/DocumentEngine'\nimport type { DocumentImportSource } from '@internal/protocol/Documents'\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 bootstrap: StudioBootstrap\n readonly composition: InstallationComposition\n readonly cleanup?: {\n readonly initialDelayMillis: number\n readonly intervalMillis: number\n }\n readonly documentModel: ExecutableDocumentModel\n readonly initialSources?: ReadonlyArray<DocumentImportSource>\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\n/** The complete framework-neutral CMS process owned by one host. */\nexport interface CmsInstallation {\n readonly close: () => Promise<void>\n readonly fetch: (request: Request) => Promise<Response>\n readonly webSocket: CmsWebSocketBridge\n}\n\n/** Starts auth, persistence, Studio realtime, delivery, health, and maintenance as one deep module. */\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 allowedPreviewOrigins: new Set([options.baseUrl]),\n bootstrap: options.bootstrap,\n composition: options.composition,\n studioSecret: options.studioSecret,\n documentModel: options.documentModel,\n initialSources: options.initialSources,\n initializationToken: options.initializationToken,\n })\n}\n\nexport { CmsInstallationError } from './internal/installation/error'\nexport type { InstallationComposition }\n","import {\n CreateBucketCommand,\n CopyObjectCommand,\n DeleteObjectCommand,\n HeadBucketCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n PutObjectCommand,\n S3Client,\n} from '@aws-sdk/client-s3'\nimport type { BucketLocationConstraint } from '@aws-sdk/client-s3'\nimport { Readable } from 'node:stream'\nimport { Effect, Redacted, Schema } from 'effect'\nimport type { S3MediaObjectStoreOptions } from '../S3MediaObjects'\n\nexport interface S3PutObjectInput {\n readonly body: AsyncIterable<Uint8Array>\n readonly bucket: string\n readonly cacheControl: string\n readonly contentLength: number\n readonly contentType: string\n readonly key: string\n}\n\nexport interface S3CopyObjectInput {\n readonly bucket: string\n readonly cacheControl: string\n readonly contentType: string\n readonly copySource: string\n readonly key: string\n}\n\nexport interface S3HeadObjectInput {\n readonly bucket: string\n readonly key: string\n}\n\nexport interface S3HeadObjectOutput {\n readonly contentLength?: number\n readonly contentType?: string\n}\n\nexport interface S3ListObjectsInput {\n readonly bucket: string\n readonly continuationToken?: string\n readonly prefix: string\n}\n\nexport interface S3ListedObject {\n readonly key?: string\n readonly size?: number\n}\n\nexport interface S3ListObjectsOutput {\n readonly isTruncated: boolean\n readonly nextContinuationToken?: string\n readonly objects: ReadonlyArray<S3ListedObject>\n}\n\nexport interface S3DeleteObjectInput {\n readonly bucket: string\n readonly key: string\n}\n\nexport interface S3HeadBucketInput {\n readonly bucket: string\n}\n\nexport interface S3CreateBucketInput {\n readonly bucket: string\n readonly locationConstraint?: string\n}\n\nexport class S3RequestError extends Schema.TaggedError<S3RequestError>()('S3.RequestError', {\n cause: Schema.Defect(),\n operation: Schema.NonEmptyString,\n}) {}\n\n/** The narrow private S3 protocol retained as the adapter's external-dependency test seam. */\nexport interface S3MediaObjectClient {\n readonly copyObject: (input: S3CopyObjectInput) => Effect.Effect<void, S3RequestError>\n readonly createBucket: (input: S3CreateBucketInput) => Effect.Effect<void, S3RequestError>\n readonly deleteObject: (input: S3DeleteObjectInput) => Effect.Effect<void, S3RequestError>\n readonly headBucket: (input: S3HeadBucketInput) => Effect.Effect<void, S3RequestError>\n readonly headObject: (input: S3HeadObjectInput) => Effect.Effect<S3HeadObjectOutput, S3RequestError>\n readonly listObjects: (input: S3ListObjectsInput) => Effect.Effect<S3ListObjectsOutput, S3RequestError>\n readonly putObject: (input: S3PutObjectInput) => Effect.Effect<void, S3RequestError>\n}\n\nexport interface CloseableS3MediaObjectClient extends S3MediaObjectClient {\n readonly close: Effect.Effect<void>\n}\n\nexport function openAwsS3MediaObjectClient(options: S3MediaObjectStoreOptions): CloseableS3MediaObjectClient {\n const credentials = options.credentials\n ? {\n accessKeyId: options.credentials.accessKeyId,\n secretAccessKey: Redacted.value(options.credentials.secretAccessKey),\n sessionToken: options.credentials.sessionToken ? Redacted.value(options.credentials.sessionToken) : undefined,\n }\n : undefined\n const client = new S3Client({\n credentials,\n endpoint: options.endpoint,\n forcePathStyle: options.forcePathStyle,\n region: options.region,\n })\n\n return makeAwsS3MediaObjectClient(client)\n}\n\n/** Wraps the official client; exported only through the package-private path for transport-level tests. */\nexport function makeAwsS3MediaObjectClient(client: S3Client): CloseableS3MediaObjectClient {\n const request = <A>(operation: string, send: (signal: AbortSignal) => Promise<A>) =>\n Effect.tryPromise({\n catch: (cause) => new S3RequestError({ cause, operation }),\n try: send,\n })\n\n return {\n close: Effect.sync(() => client.destroy()),\n copyObject: (input) =>\n request('MediaObjectStore.S3.copyObject', (signal) =>\n client.send(\n new CopyObjectCommand({\n Bucket: input.bucket,\n CacheControl: input.cacheControl,\n ContentType: input.contentType,\n CopySource: input.copySource,\n Key: input.key,\n MetadataDirective: 'REPLACE',\n }),\n { abortSignal: signal },\n ),\n ).pipe(Effect.asVoid),\n createBucket: (input) =>\n request('MediaObjectStore.S3.createBucket', (signal) =>\n client.send(\n new CreateBucketCommand({\n Bucket: input.bucket,\n // SAFETY: S3 accepts its configured region identifier; the SDK's generated union can lag new regions.\n CreateBucketConfiguration: input.locationConstraint\n ? { LocationConstraint: input.locationConstraint as BucketLocationConstraint }\n : undefined,\n }),\n { abortSignal: signal },\n ),\n ).pipe(Effect.asVoid),\n deleteObject: (input) =>\n request('MediaObjectStore.S3.deleteObject', (signal) =>\n client.send(new DeleteObjectCommand({ Bucket: input.bucket, Key: input.key }), { abortSignal: signal }),\n ).pipe(Effect.asVoid),\n headBucket: (input) =>\n request('MediaObjectStore.S3.headBucket', (signal) =>\n client.send(new HeadBucketCommand({ Bucket: input.bucket }), { abortSignal: signal }),\n ).pipe(Effect.asVoid),\n headObject: (input) =>\n request('MediaObjectStore.S3.headObject', (signal) =>\n client.send(new HeadObjectCommand({ Bucket: input.bucket, Key: input.key }), { abortSignal: signal }),\n ).pipe(Effect.map((output) => ({ contentLength: output.ContentLength, contentType: output.ContentType }))),\n listObjects: (input) =>\n request('MediaObjectStore.S3.listObjects', (signal) =>\n client.send(\n new ListObjectsV2Command({\n Bucket: input.bucket,\n ContinuationToken: input.continuationToken,\n Prefix: input.prefix,\n }),\n { abortSignal: signal },\n ),\n ).pipe(\n Effect.map((output) => ({\n isTruncated: output.IsTruncated === true,\n nextContinuationToken: output.NextContinuationToken,\n objects: (output.Contents ?? []).map((object) => ({ key: object.Key, size: object.Size })),\n })),\n ),\n putObject: (input) =>\n request('MediaObjectStore.S3.putObject', (signal) =>\n client.send(\n new PutObjectCommand({\n Body: Readable.from(input.body),\n Bucket: input.bucket,\n CacheControl: input.cacheControl,\n ContentLength: input.contentLength,\n ContentType: input.contentType,\n Key: input.key,\n }),\n { abortSignal: signal },\n ),\n ).pipe(Effect.asVoid),\n }\n}\n","import { ImageMimeType, MediaByteSize, MediaInvalid, MediaObjectKey } from '@internal/protocol/Media'\nimport {\n MediaObjectStore,\n MediaStorageError,\n type MediaObjectStoreApi,\n type MediaObjectWrite,\n type StoredMediaObject,\n} from '@internal/server/adapter/MediaObjectStore'\nimport { Effect, Layer, Option, Redacted, Ref, Schema, Stream } from 'effect'\nimport type { S3MediaObjectStoreOptions } from '../S3MediaObjects'\nimport {\n openAwsS3MediaObjectClient,\n type S3ListObjectsOutput,\n type S3ListedObject,\n type S3MediaObjectClient,\n type S3RequestError,\n} from './client'\n\nconst mediaPrefix = 'media/'\nconst replaceableCacheControl = 'public, max-age=0, must-revalidate'\n\ninterface ResolvedS3MediaObjectStoreOptions extends S3MediaObjectStoreOptions {\n readonly forcePathStyle: boolean\n readonly provisionBucket: boolean\n}\n\ninterface ListState {\n readonly continuationToken?: string\n readonly seenTokens: ReadonlySet<string>\n}\n\nconst isWriteBodyError = Schema.is(Schema.Union([MediaInvalid, MediaStorageError]))\n\n/** Owns and closes the official AWS client for the lifetime of the layer. */\nexport function s3MediaObjectStoreLayer(options: S3MediaObjectStoreOptions) {\n return Layer.effect(\n MediaObjectStore,\n resolveOptions(options).pipe(\n Effect.flatMap((resolved) =>\n Effect.acquireRelease(\n Effect.sync(() => openAwsS3MediaObjectClient(resolved)),\n (client) => client.close,\n ).pipe(\n Effect.tap((client) => provisionBucket(resolved, client)),\n Effect.map((client) => makeStore(resolved, client)),\n ),\n ),\n ),\n )\n}\n\n/** Uses a caller-owned client, keeping adapter tests network-free. */\nexport function s3MediaObjectStoreLayerWithClient(options: S3MediaObjectStoreOptions, client: S3MediaObjectClient) {\n return Layer.effect(\n MediaObjectStore,\n resolveOptions(options).pipe(\n Effect.tap((resolved) => provisionBucket(resolved, client)),\n Effect.map((resolved) => makeStore(resolved, client)),\n ),\n )\n}\n\nfunction makeStore(options: ResolvedS3MediaObjectStoreOptions, client: S3MediaObjectClient): MediaObjectStoreApi {\n return {\n list: listObjects(options.bucket, client),\n promote: (input) => promoteObject(options.bucket, input, client),\n put: (input) => putObject(options.bucket, input, client),\n remove: (objectKey) =>\n providerRequest('MediaObjectStore.S3.remove', client.deleteObject({ bucket: options.bucket, key: objectKey })),\n stat: (objectKey) => statObject(options.bucket, objectKey, client),\n }\n}\n\nfunction promoteObject(\n bucket: string,\n input: Parameters<MediaObjectStoreApi['promote']>[0],\n client: S3MediaObjectClient,\n): Effect.Effect<StoredMediaObject, MediaStorageError> {\n return statObject(bucket, input.sourceObjectKey, client).pipe(\n Effect.flatMap((source) =>\n Option.isSome(source) && source.value.byteSize === input.byteSize && source.value.mimeType === input.mimeType\n ? Effect.void\n : Effect.fail(\n storageError('MediaObjectStore.S3.promote.source', 'The staged object metadata does not match its intent.'),\n ),\n ),\n Effect.flatMap(() =>\n providerRequest(\n 'MediaObjectStore.S3.promote.copy',\n client.copyObject({\n bucket,\n cacheControl: replaceableCacheControl,\n contentType: input.mimeType,\n copySource: copySource(bucket, input.sourceObjectKey),\n key: input.destinationObjectKey,\n }),\n ),\n ),\n Effect.flatMap(() => statObject(bucket, input.destinationObjectKey, client)),\n Effect.flatMap((destination) =>\n Option.isSome(destination) &&\n destination.value.byteSize === input.byteSize &&\n destination.value.mimeType === input.mimeType\n ? Effect.succeed(destination.value)\n : Effect.fail(\n storageError(\n 'MediaObjectStore.S3.promote.verify',\n 'The promoted object metadata does not match its intent.',\n ),\n ),\n ),\n )\n}\n\nfunction copySource(bucket: string, objectKey: MediaObjectKey): string {\n return `/${encodeURIComponent(bucket)}/${objectKey.split('/').map(encodeURIComponent).join('/')}`\n}\n\nfunction putObject(\n bucket: string,\n input: MediaObjectWrite,\n client: S3MediaObjectClient,\n): Effect.Effect<StoredMediaObject, MediaInvalid | MediaStorageError> {\n return Effect.gen(function* () {\n const body = yield* validatedWriteBody(input)\n const iterable = yield* Stream.toAsyncIterableEffect(body)\n yield* client\n .putObject({\n body: iterable,\n bucket,\n cacheControl: replaceableCacheControl,\n contentLength: input.byteSize,\n contentType: input.mimeType,\n key: input.objectKey,\n })\n .pipe(\n Effect.catch((failure) =>\n isWriteBodyError(failure.cause)\n ? Effect.fail(failure.cause)\n : Effect.fail(providerError('MediaObjectStore.S3.put', failure)),\n ),\n )\n return { byteSize: input.byteSize, mimeType: input.mimeType, objectKey: input.objectKey }\n })\n}\n\nconst validatedWriteBody = Effect.fn('MediaObjectStore.S3.validateWriteBody')(function* (input: MediaObjectWrite) {\n const byteLength = yield* Ref.make(0)\n return input.body.pipe(\n Stream.mapEffect((chunk) =>\n Effect.gen(function* () {\n const next = yield* Ref.updateAndGet(byteLength, (current) => current + chunk.byteLength)\n if (next > input.byteSize) {\n return yield* storageError('MediaObjectStore.S3.put.body', 'The object body exceeds its declared byte size.')\n }\n return chunk\n }),\n ),\n Stream.concat(\n Stream.fromEffect(\n Ref.get(byteLength).pipe(\n Effect.flatMap((actual) =>\n actual === input.byteSize\n ? Effect.void\n : Effect.fail(\n storageError(\n 'MediaObjectStore.S3.put.body',\n 'The object body does not match its declared byte size.',\n ),\n ),\n ),\n ),\n ).pipe(Stream.drain),\n ),\n )\n})\n\nfunction statObject(\n bucket: string,\n objectKey: MediaObjectKey,\n client: S3MediaObjectClient,\n): Effect.Effect<Option.Option<StoredMediaObject>, MediaStorageError> {\n return client.headObject({ bucket, key: objectKey }).pipe(\n Effect.matchEffect({\n onFailure: (failure) =>\n isMissingObject(failure.cause)\n ? Effect.succeed(Option.none<StoredMediaObject>())\n : Effect.fail(providerError('MediaObjectStore.S3.stat', failure)),\n onSuccess: (output) =>\n decodeStoredObject('MediaObjectStore.S3.stat', objectKey, output.contentLength, output.contentType).pipe(\n Effect.asSome,\n ),\n }),\n )\n}\n\nfunction listObjects(bucket: string, client: S3MediaObjectClient): Stream.Stream<StoredMediaObject, MediaStorageError> {\n return Stream.paginate<ListState, StoredMediaObject, MediaStorageError>({ seenTokens: new Set<string>() }, (state) =>\n providerRequest(\n 'MediaObjectStore.S3.list',\n client.listObjects({ bucket, continuationToken: state.continuationToken, prefix: mediaPrefix }),\n ).pipe(\n Effect.flatMap((page) =>\n Effect.gen(function* () {\n const items = yield* Effect.forEach(page.objects, decodeListedObject)\n const next = yield* nextListState(state, page)\n return [items, next] as const\n }),\n ),\n ),\n )\n}\n\nfunction decodeListedObject(object: S3ListedObject): Effect.Effect<StoredMediaObject, MediaStorageError> {\n if (object.key === undefined) {\n return Effect.fail(storageError('MediaObjectStore.S3.list', 'The provider returned object metadata without a key.'))\n }\n return decodeStoredObject('MediaObjectStore.S3.list', object.key, object.size)\n}\n\nfunction nextListState(\n state: ListState,\n page: S3ListObjectsOutput,\n): Effect.Effect<Option.Option<ListState>, MediaStorageError> {\n if (!page.isTruncated) return Effect.succeedNone\n const token = page.nextContinuationToken\n if (!token || token === state.continuationToken || state.seenTokens.has(token)) {\n return Effect.fail(storageError('MediaObjectStore.S3.list', 'The provider returned an invalid continuation token.'))\n }\n return Effect.succeedSome({ continuationToken: token, seenTokens: new Set([...state.seenTokens, token]) })\n}\n\nfunction decodeStoredObject(\n operation: string,\n objectKey: string,\n byteSize: number | undefined,\n contentType?: string,\n): Effect.Effect<StoredMediaObject, MediaStorageError> {\n const decodedObjectKey = Schema.decodeOption(MediaObjectKey)(objectKey)\n const decodedByteSize = Schema.decodeUnknownOption(MediaByteSize)(byteSize)\n if (Option.isNone(decodedObjectKey) || Option.isNone(decodedByteSize)) {\n return Effect.fail(storageError(operation, 'The provider returned invalid object metadata.'))\n }\n const decodedMimeType = Schema.decodeUnknownOption(ImageMimeType)(contentType)\n const storedObject: StoredMediaObject = {\n byteSize: decodedByteSize.value,\n objectKey: decodedObjectKey.value,\n }\n return Effect.succeed(\n Option.isSome(decodedMimeType) ? { ...storedObject, mimeType: decodedMimeType.value } : storedObject,\n )\n}\n\nfunction providerRequest<A>(\n operation: string,\n request: Effect.Effect<A, S3RequestError>,\n): Effect.Effect<A, MediaStorageError> {\n return request.pipe(Effect.mapError((failure) => providerError(operation, failure)))\n}\n\nfunction provisionBucket(\n options: ResolvedS3MediaObjectStoreOptions,\n client: S3MediaObjectClient,\n): Effect.Effect<void, MediaStorageError> {\n if (!options.provisionBucket) return Effect.void\n return client\n .headBucket({ bucket: options.bucket })\n .pipe(\n Effect.catch((failure) =>\n isMissingBucket(failure.cause)\n ? createMissingBucket(options, client)\n : Effect.fail(providerError('MediaObjectStore.S3.bucket.head', failure)),\n ),\n )\n}\n\nfunction createMissingBucket(\n options: ResolvedS3MediaObjectStoreOptions,\n client: S3MediaObjectClient,\n): Effect.Effect<void, MediaStorageError> {\n return client\n .createBucket({\n bucket: options.bucket,\n locationConstraint: options.endpoint || options.region === 'us-east-1' ? undefined : options.region,\n })\n .pipe(\n Effect.catch((failure) =>\n isBucketAlreadyOwned(failure.cause)\n ? providerRequest('MediaObjectStore.S3.bucket.verify', client.headBucket({ bucket: options.bucket }))\n : Effect.fail(providerError('MediaObjectStore.S3.bucket.create', failure)),\n ),\n )\n}\n\nconst ProviderFailureDetails = Schema.Struct({\n $metadata: Schema.optionalKey(\n Schema.Struct({\n attempts: Schema.optionalKey(Schema.Finite),\n httpStatusCode: Schema.optionalKey(Schema.Finite),\n }),\n ),\n name: Schema.optionalKey(Schema.String),\n})\nconst decodeProviderFailure = Schema.decodeUnknownOption(ProviderFailureDetails)\n\nfunction providerError(operation: string, failure: S3RequestError): MediaStorageError {\n const details = decodeProviderFailure(failure.cause)\n const diagnostics: Array<string> = []\n if (Option.isSome(details)) {\n if (details.value.name) diagnostics.push(`name=${details.value.name}`)\n if (details.value.$metadata?.httpStatusCode !== undefined) {\n diagnostics.push(`status=${details.value.$metadata.httpStatusCode}`)\n }\n if (details.value.$metadata?.attempts !== undefined) {\n diagnostics.push(`attempts=${details.value.$metadata.attempts}`)\n }\n }\n const suffix = diagnostics.length > 0 ? ` (${diagnostics.join(', ')}).` : '.'\n return storageError(operation, `The S3 provider request failed${suffix}`)\n}\n\nfunction isMissingObject(cause: unknown): boolean {\n const details = decodeProviderFailure(cause)\n if (Option.isNone(details)) return false\n return details.value.name === 'NoSuchKey' || details.value.name === 'NotFound'\n}\n\nfunction isMissingBucket(cause: unknown): boolean {\n const details = decodeProviderFailure(cause)\n if (Option.isNone(details)) return false\n return details.value.name === 'NoSuchBucket' || details.value.$metadata?.httpStatusCode === 404\n}\n\nfunction isBucketAlreadyOwned(cause: unknown): boolean {\n const details = decodeProviderFailure(cause)\n return Option.isSome(details) && details.value.name === 'BucketAlreadyOwnedByYou'\n}\n\nfunction resolveOptions(\n options: S3MediaObjectStoreOptions,\n): Effect.Effect<ResolvedS3MediaObjectStoreOptions, MediaStorageError> {\n const bucket = options.bucket.trim()\n const region = options.region.trim()\n const endpoint = options.endpoint?.trim()\n if (!bucket || !region || (options.endpoint !== undefined && !endpoint)) {\n return Effect.fail(\n storageError('MediaObjectStore.S3.configure', 'The bucket, region, and configured endpoint must be non-empty.'),\n )\n }\n if (options.credentials) {\n const secretAccessKey = Redacted.value(options.credentials.secretAccessKey)\n const sessionToken = options.credentials.sessionToken && Redacted.value(options.credentials.sessionToken)\n if (!options.credentials.accessKeyId.trim() || !secretAccessKey || sessionToken === '') {\n return Effect.fail(storageError('MediaObjectStore.S3.configure', 'The configured credentials must be non-empty.'))\n }\n }\n return Effect.succeed({\n ...options,\n bucket,\n credentials: options.credentials\n ? { ...options.credentials, accessKeyId: options.credentials.accessKeyId.trim() }\n : undefined,\n endpoint,\n forcePathStyle: options.forcePathStyle ?? false,\n provisionBucket: options.provisionBucket ?? false,\n region,\n })\n}\n\nfunction storageError(operation: string, message: string): MediaStorageError {\n return new MediaStorageError({ cause: new Error(message), operation })\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 { 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', 'user'] as const\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} = 'media-library' AND ${table.targetId} IS NULL)\n OR (${table.targetKind} <> 'media-library' 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)\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 { 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 if (!row) return yield* unavailable('ActivityStore.Postgres.append', new Error('No row returned.'))\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 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 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 const totals = yield* transaction.select({ value: count() }).from(activityEntries).where(filters)\n const total = totals[0]?.value\n if (total === undefined) {\n return yield* unavailable('ActivityStore.Postgres.list', new Error('No total returned.'))\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 const target = yield* decodeActivityTarget(row.targetKind, row.targetId).pipe(\n Effect.mapError((cause) => activityUnavailable('ActivityStore.Postgres.decodeTarget', cause)),\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 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(Schema.encodeSync(ActivityEntry)(left), Schema.encodeSync(ActivityEntry)(right))\n}\n\nexport function decodeActivityTarget(kind: ActivityEntryType['target']['kind'], id: string | null) {\n const value =\n kind === 'document'\n ? { documentId: id, kind }\n : kind === 'media'\n ? { kind, mediaId: id }\n : kind === 'user'\n ? { kind, userId: id }\n : { kind }\n return Schema.decodeUnknownEffect(ActivityTarget)(value)\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 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 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 { 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>\nexport type ChangeReader = Pick<PgDrizzle.EffectPgDatabase, 'select'>\n\nconst isConflict = Schema.is(ChangeConflict)\nconst isMismatch = Schema.is(ChangeMismatch)\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 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 const totals = yield* transaction.select({ value: count() }).from(pendingChanges).where(predicate)\n const total = totals[0]?.value\n if (total === undefined) {\n return yield* unavailable('ChangeJournal.Postgres.pending', new Error('No total returned.'))\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 const resolvedBefore = yield* recordedResolution(transaction, draft.id)\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 if (resolvedAfter) {\n if (rows[0]) yield* transaction.delete(pendingChanges).where(eq(pendingChanges.id, draft.id))\n return yield* resolvedBegin(draft, resolvedAfter)\n }\n if (rows[0]) return ChangeBegin.Unresolved({ change: yield* decodePendingChange(rows[0]) })\n\n const byId = yield* pendingChangeById(transaction, draft.id)\n if (byId) {\n if (draftEqual(byId, draft)) return ChangeBegin.Unresolved({ change: byId })\n return yield* new ChangeMismatch({ changeId: draft.id })\n }\n const bySubject = yield* pendingChangeBySubject(transaction, draft.subject)\n if (bySubject) return yield* new ChangeConflict({ changeId: draft.id, pendingChangeId: bySubject.id })\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 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 return\n }\n if (!stored) return yield* new ChangeMismatch({ changeId: change.id })\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 if (!insertedReceipts[0]) return yield* new ChangeMismatch({ changeId: change.id })\n const deleted = yield* transaction\n .delete(pendingChanges)\n .where(eq(pendingChanges.id, stored.id))\n .returning({ id: pendingChanges.id })\n if (!deleted[0]) return yield* new ChangeMismatch({ changeId: stored.id })\n return\n }\n\n if (!stored && !receipt) return yield* new ChangeMismatch({ changeId: change.id })\n const target = resolution.target ?? change.target\n if (!target) return yield* new ChangeMismatch({ changeId: change.id })\n const occurredAt =\n resolution.occurredAt ??\n (receipt?.kind === 'applied' ? receipt.entry.occurredAt : undefined) ??\n (yield* DateTime.now)\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 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 return receipt.entry\n }\n\n const insertedEntries = yield* transaction\n .insert(activityEntries)\n .values(activityEntryValues(expected))\n .onConflictDoNothing()\n .returning()\n if (!insertedEntries[0]) return yield* new ChangeMismatch({ changeId: change.id })\n const entry = yield* decodeActivityEntry(insertedEntries[0]).pipe(\n Effect.mapError((cause) => changeJournalUnavailable('ChangeJournal.Postgres.resolveIn', cause)),\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 if (!insertedReceipts[0]) return yield* new ChangeMismatch({ changeId: change.id })\n const deleted = yield* transaction\n .delete(pendingChanges)\n .where(eq(pendingChanges.id, change.id))\n .returning({ id: pendingChanges.id })\n if (!deleted[0]) return yield* new ChangeMismatch({ changeId: change.id })\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 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 if (!change || change.action !== action) return yield* new ChangeMismatch(change ? { changeId: change.id } : {})\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 const target = yield* decodeOptionalTarget(row.targetKind, row.targetId)\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 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 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 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 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 if (!receipt) return undefined\n if (receipt.outcome === 'cancelled') {\n if (receipt.activityId !== null) return yield* new ChangeMismatch({ changeId: id })\n return { fingerprint: receipt.fingerprint, kind: 'cancelled' } satisfies RecordedResolution\n }\n if (receipt.activityId === null) return yield* new ChangeMismatch({ changeId: id })\n const entries = yield* database\n .select()\n .from(activityEntries)\n .where(eq(activityEntries.id, receipt.activityId))\n .limit(1)\n if (!entries[0]) return yield* new ChangeMismatch({ changeId: id })\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 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 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 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 return decodeActivityTarget(kind, id).pipe(Effect.mapError(() => new ChangeMismatch({})))\n}\n\nfunction draftEqual(change: PendingChangeType, draft: ChangeDraft): boolean {\n return isDeepStrictEqual(\n Schema.encodeSync(ChangeDraft)(draftFromChange(change)),\n Schema.encodeSync(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 return ChangeDraft.make(change.target === undefined ? value : { ...value, target: change.target })\n}\n\nfunction changeEqual(left: PendingChangeType, right: PendingChangeType): boolean {\n return isDeepStrictEqual(Schema.encodeSync(PendingChange)(left), Schema.encodeSync(PendingChange)(right))\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 { 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","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 { 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\n/** Applies generated CMS migrations and initializes required application state. */\nexport const migrateCmsDatabase = Effect.fn('CmsDatabase.migrate')(function* () {\n const database = yield* PgDrizzle.makeWithDefaults()\n yield* migrate(embeddedMigrations, database._.session, '__drizzle_migrations')\n yield* database.insert(cmsState).values({}).onConflictDoNothing({ target: cmsState.singleton })\n yield* database.insert(initializationState).values({}).onConflictDoNothing({ target: initializationState.singleton })\n})\n\nexport const cmsDatabaseMigrationLayer = Layer.effectDiscard(migrateCmsDatabase())\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, 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>\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 })\n return\n }\n case 'document.update': {\n const revisionId = yield* appendRevision(transaction, plan, activity)\n yield* updateAuthoredHead(transaction, plan.documentId, revisionId)\n yield* touchDocument(transaction, plan.documentId)\n return\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 return\n }\n case 'document.remove': {\n const revisionId = yield* appendRevision(transaction, plan, activity)\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 return\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 return\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 return\n }\n case 'document.publish': {\n yield* transaction\n .update(documentHeads)\n .set({ publishedRevisionId: plan.revisionId })\n .where(eq(documentHeads.documentId, plan.documentId))\n return\n }\n }\n})\n\ninterface RevisionInput {\n readonly action: Exclude<DocumentCommitPlan['action'], 'document.publish'>\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 const row = rows[0]\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 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 if (Option.isNone(causeError) || !SqlError.isSqlError(causeError.value)) return error\n const reason = causeError.value.reason\n return reason._tag === 'UniqueViolation' && 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.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})\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)\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 } 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 document: DocumentSelect,\n head: Schema.NullOr(DocumentHeadSelect),\n published: Schema.NullOr(DocumentRevisionSelect),\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 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 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 documentIds.add(row.document.id)\n yield* validateSnapshotRow(row.document, row.head, row.authored, row.published)\n const authored = sourceRecord(row.authored, row.head.publishedRevisionId ?? undefined)\n\n if (row.document.deletedAt === null) {\n active.push(authored)\n if (row.published) published.push(sourceRecord(row.published, row.published.id))\n } else {\n deleted.push(Object.assign({}, authored, { deletedAt: row.document.deletedAt }))\n }\n }\n\n active.sort(compareSources)\n deleted.sort(compareSources)\n published.sort(compareSources)\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 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 const activity =\n revision.reason === null\n ? ActivityEntry.make(activityEntry)\n : ActivityEntry.make({ ...activityEntry, reason: revision.reason })\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 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 documentId: revision.documentId,\n markdown: revision.markdown,\n revisionId: revision.id,\n sourcePath: revision.sourcePath,\n version: DocumentVersion.make(revision.id),\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 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","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\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 { MediaObjectKey, 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')\nconst publishedRevision = alias(documentRevisions, 'published_revision')\nconst RepositoryDomainError = Schema.Union([\n DocumentGenerationConflict,\n DocumentMediaUnavailable,\n DocumentNotFound,\n DocumentPathConflict,\n DocumentPersistenceError,\n DocumentVersionConflict,\n])\nconst isRepositoryDomainError = Schema.is(RepositoryDomainError)\nconst isDocumentNotFound = Schema.is(DocumentNotFound)\nconst isDocumentMediaUnavailable = Schema.is(DocumentMediaUnavailable)\nconst isDocumentPersistenceError = Schema.is(DocumentPersistenceError)\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'>\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 const stateRow = stateRows[0]\n\n if (!stateRow) {\n const actualGeneration = yield* readGeneration(transaction)\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 references = yield* referencesForDocument(input.plan.documentId, input.mediaReferences)\n const objectKeys = references.map((reference) => reference.objectKey)\n yield* lockMediaReferenceKeys(transaction, objectKeys)\n yield* rejectDeletingMedia(transaction, references)\n const activity = input.activity ?? systemActivity\n yield* applyDocumentCommitPlan(transaction, input.plan, activity)\n yield* replaceDocumentMediaReferences(transaction, input.plan.documentId, references)\n const snapshot = yield* readSnapshot(transaction, state.generation)\n const source = yield* sourceForMutation(\n snapshot,\n input.plan.documentId,\n input.plan.action === 'document.remove',\n )\n yield* recordDocumentActivity(transaction, source, input.plan, activity)\n return {\n mutation: DocumentMutationResult.make({\n action: input.plan.action,\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 if (after === generation.toString()) return undefined\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 const stateRow = stateRows[0]\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 const state = yield* Schema.decodeUnknownEffect(CmsStateSelect)(stateRow)\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 const references = uniqueMediaReferences(input.references)\n yield* lockMediaReferenceKeys(\n transaction,\n references.map((reference) => reference.objectKey),\n )\n yield* rejectDeletingMedia(transaction, references)\n yield* transaction.delete(documentMediaReferences)\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 const row = rows[0]\n if (!row) return yield* new DocumentNotFound({ documentId, revisionId })\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 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 const totals = yield* transaction\n .select({ value: count() })\n .from(documentRevisions)\n .where(eq(documentRevisions.documentId, query.documentId))\n const total = totals[0]?.value\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 const decoded = yield* Effect.forEach(rows, decodeDocumentRevision)\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 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 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 if (plan.action !== 'document.publish') values.id = source.revisionId\n yield* database.insert(activityEntries).values(values)\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 document: documentsTable,\n head: documentHeads,\n published: publishedRevision,\n })\n .from(documentsTable)\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 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 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 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 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 return documentPersistenceError(operation, cause)\n }),\n )\n}\n\nconst referencesForDocument = Effect.fn('DocumentStore.Drizzle.referencesForDocument')(function* (\n documentId: DocumentId,\n references: ReadonlyArray<MediaReference>,\n) {\n if (references.some((reference) => reference.documentId !== documentId)) {\n return yield* persistenceFailure(\n 'DocumentStore.Drizzle.referencesForDocument',\n new Error(`The media-reference projection does not belong exclusively to document \"${documentId}\".`),\n )\n }\n return uniqueMediaReferences(references)\n})\n\nconst rejectDeletingMedia = Effect.fn('DocumentStore.Drizzle.rejectDeletingMedia')(function* (\n transaction: MediaReferenceTransaction,\n references: ReadonlyArray<MediaReference>,\n) {\n const keys = [...new Set(references.map((reference) => reference.objectKey))]\n if (keys.length === 0) return\n const rows = yield* transaction\n .select({ objectKey: mediaAssets.objectKey })\n .from(mediaAssets)\n .where(and(inArray(mediaAssets.objectKey, keys), eq(mediaAssets.status, 'deleting')))\n const unavailable = yield* Schema.decodeEffect(Schema.Array(MediaObjectKeySchema))(rows.map((row) => row.objectKey))\n if (unavailable.length === 0) return\n const unavailableSet = new Set<MediaObjectKey>(unavailable)\n const affected = references\n .filter((reference) => unavailableSet.has(reference.objectKey))\n .sort((left, right) =>\n left.documentId === right.documentId\n ? left.objectKey.localeCompare(right.objectKey)\n : left.documentId.localeCompare(right.documentId),\n )\n const first = affected[0]\n if (!first) return\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 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 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]))\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 const run: PostgresAdvisoryLockApi['run'] = (key, use) =>\n Effect.scoped(\n Effect.gen(function* () {\n const connection = yield* postgres.reserve.pipe(lockUnavailable('PostgresAdvisoryLock.reserve'))\n return yield* Effect.uninterruptibleMask((restore) => {\n const held = new Set<string>()\n const include: PostgresAdvisoryLockLease['include'] = (includedKey, effect) =>\n Effect.suspend(() => {\n if (held.has(includedKey)) return effect\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 const rows = yield* Schema.decodeUnknownEffect(AdvisoryLockAttempt)(raw).pipe(\n lockUnavailable('PostgresAdvisoryLock.decodeAttempt'),\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 const lease: PostgresAdvisoryLockLease = { include }\n return include(\n key,\n Effect.suspend(() => use(lease)),\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 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 { 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: Schema.encodeSync(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 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 if (row.state === 'uninitialized') return Effect.succeed(StoredInitializationState.cases.uninitialized.make({}))\n if (row.state === 'ready') return Effect.succeed(StoredInitializationState.cases.ready.make({}))\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 {\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})\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 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, 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 { decodeMediaRecord, decodeMediaReferences, decodeMediaReplacement, mediaPersistenceError } from './records'\nimport { mediaAssets, mediaReplacements } from './tables'\n\nconst isMediaPersistenceError = Schema.is(MediaPersistenceError)\nconst isMediaConflict = Schema.is(MediaConflict)\nconst isMediaNotFound = Schema.is(MediaNotFound)\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 yield* beginChange(transaction, mediaUploadChange(record, operation)).pipe(\n Effect.flatMap(requireUnresolvedChange),\n )\n const rows = yield* transaction\n .insert(mediaAssets)\n .values(recordValues(record))\n .onConflictDoNothing()\n .returning()\n if (rows[0]) return yield* decodeMediaRecord(rows[0])\n\n const existing = yield* rowById(transaction, record.id)\n if (existing && existing.status !== 'deleting' && isSameReservation(existing, record)) return existing\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 if (existing?.status === 'ready') return existing\n if (existing?.status !== 'uploading') {\n return yield* transitionFailure('MediaStore.Drizzle.activate', id, existing?.status)\n }\n const change = yield* requirePendingChange(transaction, mediaSubject(id), 'media.uploaded')\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 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 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 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 if (!existing) return yield* new MediaNotFound({ mediaId: id })\n if (existing.status === 'deleting') {\n yield* requirePendingChange(transaction, mediaSubject(id), 'media.removed')\n return existing\n }\n if (existing.status !== 'ready') {\n return yield* transitionFailure('MediaStore.Drizzle.beginDelete', id, existing.status)\n }\n const replacement = yield* replacementByMediaId(transaction, id)\n if (replacement) return yield* new MediaConflict({ mediaId: id })\n yield* lockMediaReferenceKeys(transaction, [existing.objectKey])\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 const references = yield* decodeMediaReferences(referenceRows)\n if (references.length > 0) return yield* new MediaReferenced({ mediaId: id, references })\n yield* beginChange(transaction, mediaRemovalChange(existing, operation)).pipe(\n Effect.flatMap(requireUnresolvedChange),\n Effect.catchTag('Change.Conflict', () => new MediaConflict({ mediaId: id })),\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 if (rows[0]) return yield* decodeMediaRecord(rows[0])\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 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 yield* beginChange(transaction, mediaReplacementChange(asset, replacement, operation)).pipe(\n Effect.flatMap(requireUnresolvedChange),\n Effect.catchTag('Change.Conflict', () => new MediaConflict({ mediaId: replacement.mediaId })),\n )\n const rows = yield* transaction\n .insert(mediaReplacements)\n .values(replacementValues(replacement))\n .onConflictDoNothing()\n .returning()\n if (rows[0]) return yield* decodeMediaReplacement(rows[0])\n const existing = yield* replacementByMediaId(transaction, replacement.mediaId)\n if (existing && isSameReplacement(existing, replacement)) return existing\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 if (!existing || !isSameReplacement(existing, replacement)) {\n return yield* new MediaConflict({ mediaId: replacement.mediaId })\n }\n if (existing.staged) return existing\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 if (rows[0]) return yield* decodeMediaReplacement(rows[0])\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 if (!pendingReplacement) {\n if (asset && isCompletedReplacement(asset, replacement)) return asset\n return yield* persistenceFailure(\n 'MediaStore.Drizzle.finishReplace',\n new Error(`Media replacement \"${replacement.mediaId}\" cannot be replayed from durable state.`),\n )\n }\n if (!isSameReplacement(pendingReplacement, replacement)) {\n return yield* new MediaConflict({ mediaId: 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 const change = yield* requirePendingChange(transaction, mediaSubject(replacement.mediaId), 'media.replaced')\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 const replaced = rows[0]\n if (!replaced) {\n return yield* transitionFailure('MediaStore.Drizzle.finishReplace', replacement.mediaId, asset.status)\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 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 const decoded = yield* decodeMediaRecord(replaced)\n const intent = yield* decodeMediaChangeIntent(change)\n yield* resolveChange(transaction, change, { details: mediaChangeDetails(intent), kind: 'applied' })\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 if (!existing) return\n if (!isSameReplacement(existing, replacement) || existing.staged !== replacement.staged) {\n return yield* new MediaConflict({ mediaId: replacement.mediaId })\n }\n const change = yield* requirePendingChange(transaction, mediaSubject(replacement.mediaId), 'media.replaced')\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 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 if (!existing) return\n if (existing.status !== 'deleting') {\n return yield* transitionFailure('MediaStore.Drizzle.finishDelete', id, existing.status)\n }\n const change = yield* requirePendingChange(transaction, mediaSubject(id), 'media.removed')\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 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 if (!existing) return\n if (existing.status !== 'uploading') {\n return yield* transitionFailure('MediaStore.Drizzle.abandonUpload', id, existing.status)\n }\n const change = yield* requirePendingChange(transaction, mediaSubject(id), 'media.uploaded')\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 if (!rows[0]) {\n return yield* transitionFailure('MediaStore.Drizzle.abandonUpload', id, existing.status)\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(and(ne(mediaAssets.status, 'ready'), lte(mediaAssets.updatedAt, DateTime.formatIso(query.before))))\n .orderBy(asc(mediaAssets.updatedAt), asc(mediaAssets.id))\n .limit(query.limit)\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(lte(mediaReplacements.updatedAt, DateTime.formatIso(query.before)))\n .orderBy(asc(mediaReplacements.updatedAt), asc(mediaReplacements.mediaId))\n .limit(query.limit)\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 if (pending) {\n if (isSameReplacement(pending, replacement)) return 'pending' as const\n return yield* new MediaConflict({ mediaId: replacement.mediaId })\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 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 const replacementRows = yield* database\n .select({ objectKey: mediaReplacements.stagingObjectKey })\n .from(mediaReplacements)\n .orderBy(asc(mediaReplacements.stagingObjectKey))\n const objectKeys = yield* Schema.decodeEffect(Schema.Array(MediaObjectKey))(\n [...assetRows, ...replacementRows].map((row) => row.objectKey),\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 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 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 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 const totals = yield* transaction.select({ value: count() }).from(mediaAssets).where(filters)\n const total = totals[0]?.value\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 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 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 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'>\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 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 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 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 { ChangeJournal } from '@internal/server/adapter/ChangeJournal'\nimport { Readiness, ReadinessFailed } from '@internal/server/adapter/Readiness'\nimport { DateTime, Effect, Layer, Schema } from 'effect'\n\nexport const postgresReadinessLayer = Layer.effect(\n Readiness,\n Effect.gen(function* () {\n const postgres = yield* PgClient.PgClient\n const journal = yield* ChangeJournal\n const check = Effect.gen(function* () {\n yield* postgres.unsafe('select 1')\n const now = yield* DateTime.now\n const pending = yield* journal.pending({ before: DateTime.subtractDuration(now, '30 seconds'), limit: 1 })\n const oldest = pending.changes[0]\n if (pending.total === 0 || oldest === undefined) return\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 return yield* new ReadinessFailed({ cause: new Error('A stale change remains pending.') })\n }).pipe(\n Effect.mapError((cause) => (Schema.is(ReadinessFailed)(cause) ? cause : new ReadinessFailed({ cause }))),\n Effect.withSpan('Installation.readiness'),\n )\n return Readiness.of({ check })\n }),\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 { Schema } from 'effect'\nimport { WorkingDocumentChange as WorkingDocumentChangeSchema } from '@internal/server/adapter/WorkingDocumentChanges'\n\n// The physical channel name is renamed with the disposable PostgreSQL baseline in Phase 6.\nexport const WORKING_DOCUMENT_CHANGES_CHANNEL = 'cms_working_documents'\nconst WorkingDocumentChangePayload = Schema.fromJsonString(WorkingDocumentChangeSchema)\n\nexport function workingDocumentChangePayload(change: WorkingDocumentChange): string {\n return Schema.encodeSync(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'\nconst HEARTBEAT_TIMEOUT = '10 seconds'\nconst HEARTBEAT_RETRY = '50 millis'\nconst RECONNECT_DELAY = '250 millis'\nconst STARTUP_TIMEOUT = '15 seconds'\nconst CHANGE_BUFFER_CAPACITY = 1_024\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 const listenerLayer = PgClient.layer({\n ...database,\n applicationName: `${database.applicationName ?? '@internal/server'}:working-documents-listener`,\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 listen = postgres.listen(WORKING_DOCUMENT_CHANGES_CHANNEL).pipe(\n Stream.runForEach((payload) => {\n const waiting = heartbeats.get(payload)\n if (waiting !== undefined) return Deferred.succeed(waiting, undefined).pipe(Effect.asVoid)\n if (payload.startsWith('__cms_probe__:')) return Effect.void\n return decodeWorkingDocumentChangePayload(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.mapError((cause) => changesError('listen', cause)),\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 const announce = postgres\n .notify(WORKING_DOCUMENT_CHANGES_CHANNEL, payload)\n .pipe(Effect.mapError((cause) => changesError('heartbeat', cause)))\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})\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\ntype WorkingDocumentRow = typeof workingDocuments.$inferSelect\ntype WorkingDocumentPublishAttemptRow = typeof workingDocumentPublishAttempts.$inferSelect\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 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 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 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 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 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 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 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 const row = rows[0]\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 const documentRow = documentRows[0]\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 const document = yield* decodeWorkingDocument(documentRow)\n const updates = yield* Effect.forEach(updateRows, decodeWorkingDocumentUpdate)\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 const row = rows[0]\n if (!row) return yield* new WorkingDocumentSuperseded({ documentId, expectedGeneration })\n const actualGeneration = yield* Schema.decodeEffect(WorkingDocumentGenerationId)(row.generationId)\n if (actualGeneration !== expectedGeneration) {\n return yield* new WorkingDocumentSuperseded({ actualGeneration, documentId, expectedGeneration })\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 const row = rows[0]\n if (!row) return yield* new WorkingDocumentSuperseded({ documentId, expectedGeneration })\n const current = yield* decodeWorkingDocument(row)\n if (current.generationId !== expectedGeneration) {\n return yield* new WorkingDocumentSuperseded({\n actualGeneration: current.generationId,\n documentId,\n expectedGeneration,\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 const row = rows[0]\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 const durableHighWatermark = current.nextUpdateSequence - 1\n const compactedThrough = firstRows[0] ? firstRows[0].sequence - 1 : durableHighWatermark\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 const row = rows[0]\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 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])\nconst isStoreDomainError = Schema.is(StoreDomainError)\nconst isWorkingDocumentPersistenceError = Schema.is(WorkingDocumentPersistenceError)\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 if (Option.isSome(initialized)) return initialized.value\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 const next = advanced[0]\n if (!next) {\n return yield* workingDocumentSuperseded(transaction, input.documentId, input.expectedGeneration)\n }\n const sequence = WorkingDocumentUpdateSequence.make(next.nextUpdateSequence - 1)\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 const row = rows[0]\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 const update = yield* decodeWorkingDocumentUpdate(row)\n yield* notifyWorkingDocumentChange(transaction, 'updated', input.documentId, input.expectedGeneration)\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 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 const row = rows[0]\n if (!row) {\n return yield* workingDocumentSuperseded(transaction, input.snapshot.documentId, input.expectedGeneration)\n }\n const decoded = yield* decodeWorkingDocument(row)\n if (input.expectedGeneration !== input.snapshot.generationId) {\n yield* notifyWorkingDocumentChange(\n transaction,\n 'invalidated',\n input.snapshot.documentId,\n input.expectedGeneration,\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 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 if (!rows[0]) {\n return yield* workingDocumentSuperseded(transaction, input.documentId, input.expectedGeneration)\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 if (input.expectedVersion !== current.savedVersion) {\n return yield* conflict(input.documentId, 'beginPublish', 'The saved document version has changed.')\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 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 const row = rows[0]\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 const attempt = yield* decodeWorkingDocumentPublishAttempt(row)\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 if (attempt.phase !== 'pending') {\n return yield* invalidTransition(input.documentId, 'markCheckpointed', 'pending')\n }\n const current = yield* lockWorkingDocument(transaction, input.documentId, attempt.expectedGeneration)\n yield* validateWorkingDocumentCapture(transaction, current, attempt.highWatermark, 'markCheckpointed')\n if (current.savedVersion !== attempt.expectedVersion) {\n return yield* conflict(input.documentId, 'markCheckpointed', 'The saved document version has changed.')\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 const row = rows[0]\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 if (checkpointed.phase === 'checkpointed') return checkpointed\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 yield* lockWorkingDocument(transaction, input.documentId, attempt.expectedGeneration)\n if (attempt.phase !== 'checkpointed') {\n return yield* invalidTransition(input.documentId, 'completePublish', 'checkpointed')\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 const row = rows[0]\n if (!row) return yield* invalidTransition(input.documentId, 'completePublish', 'checkpointed')\n const published = yield* decodeWorkingDocumentPublishAttempt(row)\n if (published.phase === 'published') return published\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 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 yield* lockWorkingDocument(transaction, input.documentId, attempt.expectedGeneration)\n if (attempt.phase !== 'pending') {\n return yield* invalidTransition(input.documentId, 'failPublish', 'pending')\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 const row = rows[0]\n if (!row) return yield* invalidTransition(input.documentId, 'failPublish', 'pending')\n const failed = yield* decodeWorkingDocumentPublishAttempt(row)\n if (failed.phase === 'failed') return failed\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 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 { PgClient } from '@effect/sql-pg'\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 { postgresAdvisoryLockLayer } from './internal/postgres/advisory-lock'\nimport { postgresReadinessLayer } from './internal/readiness'\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'\n\nexport interface PostgresOptions extends PgPoolConfig {}\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 database = PgClient.layer({\n ...options,\n applicationName: options.applicationName ?? '@internal/sql-pg',\n })\n const migrations = cmsDatabaseMigrationLayer.pipe(Layer.provide(database))\n const locks = postgresAdvisoryLockLayer(options)\n const stores = Layer.mergeAll(\n postgresActivityStoreLayer,\n changeJournalLayer,\n documentStoreLayer,\n mediaStoreLayer,\n initializationStoreLayer.pipe(Layer.provide(locks)),\n postgresUserCommandFenceLayer.pipe(Layer.provide(locks)),\n postgresWorkingDocumentChangesLayer(options),\n workingDocumentStoreLayer,\n ).pipe(Layer.provide(migrations), Layer.provide(database))\n const readiness = postgresReadinessLayer.pipe(Layer.provide(stores), Layer.provide(database))\n\n return Layer.merge(stores, readiness)\n}\n","import type { ExecutableDocumentModel } from '@internal/document/DocumentEngine'\nimport type { DocumentImportSource } from '@internal/protocol/Documents'\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 } 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 bootstrap: StudioBootstrap\n readonly cleanup: {\n readonly enabled: boolean\n readonly initialDelayMillis: number\n readonly intervalMillis: number\n }\n readonly databaseUrl: string\n readonly documentModel: ExecutableDocumentModel\n readonly initialSources?: ReadonlyArray<DocumentImportSource>\n readonly initializationToken: string\n readonly media?: NuxtMediaInstallationOptions\n readonly secret: string\n}\n\n/** Composes the private providers selected by the Nuxt product adapter. */\nexport const installCms = Effect.fn('NuxtCmsInstallation.install')(function* (options: NuxtCmsInstallationOptions) {\n const crypto = NodeCrypto.layer\n const postgres = postgresLayer({ url: Redacted.make(options.databaseUrl) })\n const identity = Layer.unwrap(\n Effect.acquireRelease(\n Effect.sync(() => new Pool({ connectionString: options.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 const core = Layer.mergeAll(crypto, postgres, identity)\n\n return yield* installNodeCms({\n baseUrl: options.baseUrl,\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 initialSources: options.initialSources,\n initializationToken: Redacted.make(options.initializationToken),\n studioSecret: Redacted.make(`cms-collaboration:${options.secret}`),\n })\n})\n\nexport function toS3MediaObjectStoreOptions(options: NuxtMediaInstallationOptions): S3MediaObjectStoreOptions {\n const { credentials: authoredCredentials, publicBaseUrl: _publicBaseUrl, ...storeOptions } = options\n if (!authoredCredentials) return storeOptions\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 return {\n ...storeOptions,\n credentials,\n }\n}\n"],"mappings":"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"}