{"version":3,"file":"discourse-shared-edits.js","names":["define","_exports","_component","_object","_service","_dButton","_concatClass","_component2","_templateFactory","Object","defineProperty","value","default","SharedEditButton","hidden","shouldRender","args","post","can_edit","dt7948","g","this","prototype","service","appEvents","i","site","showLabel","desktopView","sharedEdit","trigger","n","action","setComponentTemplate","createTemplateFactory","id","block","moduleName","scope","isStrictMode","SharedEditButtons","composer","endSharedEdit","close","_pluginApi","SHARED_EDIT_ACTION","name","initialize","container","lookup","shared_edits_enabled","withPluginApi","api","modifyClass","Superclass","sharedEditManager","open","opts","subscription","subscribe","preOpen","undefined","reply","super","arguments","finalizeSubscription","collapse","model","wasSharedEdit","suppressComposerChange","result","commit","save","_saveDraft","_template","_ajax","_ajaxError","_constants","_iconLibrary","_composer3","_sharedEditButton","_sharedEditsProsemirrorExtension","formatSharedEditActionTitle","replyOptions","userAvatar","userLink","postLink","htmlSafe","iconHTML","title","href","anchor","initWithApi","siteSettings","SAVE_LABELS","SAVE_ICONS","registerCustomizationCallback","actionTitle","registerValueTransformer","context","shared_edits_editor_mode","USER_OPTION_COMPOSITION_MODES","rich","markdown","registerRichEditorExtension","dag","buttonLabels","buttonKeys","canEdit","replace","EDIT","after","SHOW_MORE","REPLY","reposition","before","hide","addTrackedPostProperties","customizePostMenu","currentUser","getCurrentUser","addPostAdminMenuButton","attrs","staff","trust_level","icon","className","label","async","url","ajax","type","set","e","popupAjaxError","addPostClassesCallback","creatingSharedEdit","get","editingPost","init","on","_handleSharedEditOnPost","willDestroy","off","draftKey","draftSequence","raw","onChange","event","syncFromComposerValue","target","_findMessages","element","position","isBrowser","Error","div","document","createElement","body","appendChild","style","computed","window","getComputedStyle","properties","forEach","prop","whiteSpace","overflowWrap","visibility","rect","getBoundingClientRect","width","boxSizing","overflow","borderLeft","parseFloat","borderLeftWidth","borderRight","borderRightWidth","scrollbarWidth","offsetWidth","clientWidth","paddingRight","pos","parseInt","isNaN","textContent","substring","span","coordinates","top","offsetTop","borderTopWidth","left","offsetLeft","height","lineHeight","fontSize","removeChild","_caretCoordinates","constructor","textarea","updateContainerPosition","parent","parentElement","cursors","Map","activeTypists","boundOnScroll","onScroll","bind","addEventListener","passive","resizeObserver","ResizeObserver","refresh","observe","offsetHeight","cursor","renderCursor","Y","createAbsolutePositionFromRelativePosition","relativePosition","doc","absolutePosition","calculateCursorPosition","index","updateCursor","clientId","origin","user","username","remove","delete","typist","timeout","clearTimeout","isNew","createCursorElement","user_id","markTypist","now","Date","lastTyped","setTimeout","display","viewCoords","getViewCoords","absoluteTop","absoluteLeft","classList","add","scrollTop","scrollLeft","transform","el","color","getColor","borderColor","backgroundColor","removeCursor","clearPosition","destroy","removeEventListener","disconnect","clear","_sharedEditManager","_debug","clearSharedEditYjsState","sharedEditYjsState","clearPM","clearRichModeSerializers","getSharedEditYjsState","resetProsemirrorExtensionState","setSharedEditYjsState","state","stateIdCounter","_stateId","configured","sharedEditsProsemirrorExtension","plugins","params","capturePM","convertToMarkdown","utils","setConvertToMarkdown","Plugin","pmState","xmlFragment","awareness","seedXmlFromView","onError","capturedStateId","currentState","capturePlugin","view","setCapturedMarkdown","loaderPlugin","destroyed","configurationStarted","isStillValid","activeState","isDestroyed","dom","parentNode","isConnected","reportError","error","ensureYjsProsemirrorLoaded","then","SharedEditsYjs","ySyncPlugin","debugError","syncPlugin","cursorPlugin","undoPlugin","length","prosemirrorToYXmlFragment","cursorBuilder","editorContainer","requestAnimationFrame","cursorRect","containerRect","yCursorPlugin","yUndoPlugin","remainingPlugins","filter","plugin","setProsemirrorViewGetter","updateState","reconfigure","catch","YJS_PROSEMIRROR_URL","YJS_DIST_URL","_environment","isDevelopment","console","PREFIX","debugLog","log","debugWarn","warn","base64ToUint8Array","str","Uint8Array","from","atob","c","charCodeAt","uint8ArrayToBase64","uint8","binary","b","String","fromCharCode","btoa","uint8ArrayToBase64url","base64urlToUint8Array","base64","USER_COLORS","applyDiff","yText","start","endBefore","endAfter","removeCount","Math","max","insertText","slice","insert","decodeRelativePositionFromBase64url","base64url","decodeRelativePosition","encodeRelativePositionToBase64url","encodeRelativePosition","getUserColorForId","userId","transformSelection","selection","delta","end","op","retain","count","colorLight","_owner","_cursorOverlay","_encodingUtils","TEXTAREA_SELECTOR","MarkdownSync","cursorOverlay","onSelectionEnd","isSelecting","detached","selectionListenersAttached","skippedUpdatesDuringSelection","pendingRelativeSelection","spellcheckTimeoutId","spellcheckRestoreValue","spellcheckTextarea","syncOrigin","undoManager","onTextareaMouseDown","onTextareaKeydown","isCtrl","ctrlKey","metaKey","isShift","shiftKey","key","toLowerCase","preventDefault","undo","redo","onTextareaMouseUp","textareaSelection","getTextareaSelection","setOwner","getOwner","attach","text","attachSelectionListeners","querySelector","detach","resetSpellcheckSuppression","detachSelectionListeners","selectionStart","selectionEnd","captureRelativeSelection","createRelativePositionFromTypeIndex","absoluteSelectionFromRelative","rel","startAbs","endAbs","handleTextChange","transaction","suppressComposerChangeFn","client_id","adjustedSelection","textValue","toString","currentValue","appliedSurgically","expectedOldLength","insertLen","deleteLen","setRangeText","applyDiffToTextarea","oldText","newText","prefixLen","minLen","min","suffixLen","replacement","syncTextareaAfterSelection","oldSelection","transformSelectionThroughDiff","maxPos","oldChangeEnd","newChangeEnd","transformPos","buildCursorPayload","keys","deserializeCursorPayload","cursorPayload","temporarilyDisableSpellcheck","spellcheck","applySpellcheckRestore","setPendingRelativeSelection","_runloop","_protocol","_yjsDocument","messageBusChannel","postId","NetworkManager","messageBus","pendingUpdates","pendingAwarenessUpdate","ajaxInProgress","inFlightRequest","messageBusLastId","skipNextStateVector","targetStateHash","hashSyncTimeoutId","getDoc","lastVerifiedHash","sendUpdatesThrottleId","messageBusPostId","messageBusLastSubscribedId","onRemoteMessage","onResync","getRecoveryText","retryCount","handleRemoteMessage","message","SHARED_EDITS_MESSAGE_ACTIONS","RESYNC","parsedMessage","update","updateBinary","awarenessBinary","fetchState","data","message_bus_last_id","commitEdits","method","queueUpdate","push","sendUpdatesThrottled","queueAwarenessUpdate","throttle","triggerSendUpdates","onSendUpdates","sendUpdates","isRichMode","getClientId","allowBlankState","updatesToSend","awarenessToSend","hasDocUpdates","hasAwarenessUpdate","resynced","allow_blank_state","sentUpdates","payload","deferredUpdates","prepareUpdatePayload","queuedDuringMerge","concat","encodeStateVector","state_vector","response","state_hash","processServerStateHash","jqXHR","status","responseJSON","SHARED_EDITS_ERRORS","NEEDS_RECOVERY_TEXT","recoveryText","retryResult","recovery_text","version","recovered","retryError","STATE_RECOVERED","STATE_RECOVERED_FROM_CLIENT","includes","STATE_DIVERGED","missing_update","applyUpdate","missingUpdate","combined","appliedMissingUpdate","flushPendingUpdates","options","lastId","unsubscribe","teardown","cancel","clearHashSyncTimeout","serverHash","verifyStateHash","localHash","computeStateHash","startHashSyncTimeout","handleHashSyncTimeout","notifyRemoteUpdateApplied","updates","merger","mergeUpdates","triggerYjsLoad","freeze","BLANK_STATE_REJECTED","COMMIT_FAILED","DISABLE_FAILED","INVALID_UPDATE","NOT_INITIALIZED","POST_LENGTH_EXCEEDED","RECOVERY_FAILED","RECOVERY_NOT_NEEDED","RESET_FAILED","_discourseI18n","RichModeSync","dialog","syncDebounceId","xmlFragmentObserver","awarenessUpdateHandler","onSyncAnomaly","onXmlFragmentChange","handleRichModeFailure","_richModeFailed","_handlingRichModeFailure","alert","i18n","setupYjsState","setupXmlFragmentObserver","debounce","triggerXmlFragmentSync","observeDeep","flushXmlSync","setupAwarenessHandler","onAwarenessUpdate","syncYTextFromXmlFragment","consumeMarkdown","getMarkdownFromView","consumeCapture","extractTextFromXmlFragment","reason","currentText","newTextTrimmed","trim","currentTrimmed","currentLength","currentEndsWithNewline","endsWith","newEndsWithNewline","transact","fragment","processNode","node","nodeName","child","encodeAwarenessUpdate","clientIds","applyAwarenessUpdate","richModeFailed","unobserveDeep","_loadScript","_bundlePaths","yjsPromise","yjsProsemirrorPromise","PM_NAMESPACE","pmView","pmModel","pmTransform","pmCommands","pmHistory","pmInputrules","pmKeymap","yDoc","crypto","subtle","digest","encodeStateAsUpdate","hashBuffer","Array","map","padStart","join","ensureYjsLoaded","pm","getPM","convertToMarkdownFn","prosemirrorViewGetter","capturedMarkdown","captured","resetYjsModuleState","fn","getter","YjsDocument","textObserver","onDocUpdate","onRichDocUpdate","setup","callbacks","setupRichDoc","onRichModeFailed","setupMarkdownDoc","onTextObserve","undoOrigin","Doc","getText","initialUpdate","UndoManager","trackedOrigins","Set","captureTimeout","Awareness","getXmlFragment","userColors","setLocalStateField","hasXmlContent","applyRemoteUpdate","applyRemoteUpdateWithOrigin","unobserve","_markdownSync","_networkManager","_richModeSync","enumerable","SESSION_STATE","IDLE","SUBSCRIBING","ACTIVE","RESYNCING","COMMITTING","SharedEditManager","currentPostId","pendingComposerReply","yjsDocument","networkManager","markdownSync","richModeSync","composerReady","composerObserverAttached","sessionState","commitPromise","lastInvalidUpdateAlertAt","handleDocUpdate","handleAwarenessUpdate","changes","isCommitting","added","updated","removed","handleSyncAnomaly","handleResync","setSessionState","isDestroying","serverUpdate","queueMissingUpdatesFromServerState","updateError","setupDoc","pendingText","localText","handleRichModeError","cleanup","initializeHelpers","waitForTextarea","syncComposerFromDoc","attachComposerObserver","doCommit","Promise","resolve","flushResult","shouldAllowBlankState","detachComposerObserver","nextValue","next","current","serverState","serverDoc","serverVector","resetForTests","showInvalidUpdateAlert","addObserver","onComposerChange","removeObserver","nextState","maxWait","startTime"],"sources":["discourse/plugins/discourse-shared-edits/discourse/components/shared-edit-button.js","discourse/plugins/discourse-shared-edits/discourse/connectors/composer-fields-below/shared-edit-buttons.js","discourse/plugins/discourse-shared-edits/discourse/initializers/extend-composer-service.js","discourse/plugins/discourse-shared-edits/discourse/initializers/shared-edits-init.js","discourse/plugins/discourse-shared-edits/discourse/lib/caret-coordinates.js","discourse/plugins/discourse-shared-edits/discourse/lib/cursor-overlay.js","discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits-prosemirror-extension.js","discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/bundle-paths.js","discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/debug.js","discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/encoding-utils.js","discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/markdown-sync.js","discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/network-manager.js","discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/protocol.js","discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/rich-mode-sync.js","discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/yjs-document.js","discourse/plugins/discourse-shared-edits/discourse/services/shared-edit-manager.js"],"sourcesContent":["define(\"discourse/plugins/discourse-shared-edits/discourse/components/shared-edit-button\", [\"exports\", \"@glimmer/component\", \"@ember/object\", \"@ember/service\", \"discourse/components/d-button\", \"discourse/helpers/concat-class\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _object, _service, _dButton, _concatClass, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class SharedEditButton extends _component.default {\n    static hidden() {\n      return false;\n    }\n    static shouldRender(args) {\n      return args.post.can_edit;\n    }\n    static {\n      dt7948.g(this.prototype, \"appEvents\", [_service.service]);\n    }\n    #appEvents = (dt7948.i(this, \"appEvents\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"site\", [_service.service]);\n    }\n    #site = (dt7948.i(this, \"site\"), void 0);\n    get showLabel() {\n      return this.args.showLabel ?? this.site.desktopView;\n    }\n    sharedEdit() {\n      this.appEvents.trigger(\"shared-edit-on-post\", this.args.post);\n    }\n    static {\n      dt7948.n(this.prototype, \"sharedEdit\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DButton\n        class={{concatClass\n          \"post-action-menu__shared-edit\"\n          \"shared-edit\"\n          \"create fade-out\"\n        }}\n        ...attributes\n        @action={{this.sharedEdit}}\n        @icon=\"far-pen-to-square\"\n        @label={{if this.showLabel \"post.controls.edit_action\"}}\n        @title=\"shared_edits.button_title\"\n      />\n      */\n      {\n        \"id\": \"ua6wmrmm\",\n        \"block\": \"[[[8,[32,0],[[16,0,[28,[32,1],[\\\"post-action-menu__shared-edit\\\",\\\"shared-edit\\\",\\\"create fade-out\\\"],null]],[17,1]],[[\\\"@action\\\",\\\"@icon\\\",\\\"@label\\\",\\\"@title\\\"],[[30,0,[\\\"sharedEdit\\\"]],\\\"far-pen-to-square\\\",[52,[30,0,[\\\"showLabel\\\"]],\\\"post.controls.edit_action\\\"],\\\"shared_edits.button_title\\\"]],null]],[\\\"&attrs\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-shared-edits/discourse/components/shared-edit-button.js\",\n        \"scope\": () => [_dButton.default, _concatClass.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = SharedEditButton;\n});","define(\"discourse/plugins/discourse-shared-edits/discourse/connectors/composer-fields-below/shared-edit-buttons\", [\"exports\", \"@glimmer/component\", \"@ember/object\", \"@ember/service\", \"discourse/components/d-button\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _object, _service, _dButton, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class SharedEditButtons extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"composer\", [_service.service]);\n    }\n    #composer = (dt7948.i(this, \"composer\"), void 0);\n    endSharedEdit() {\n      this.composer.close();\n    }\n    static {\n      dt7948.n(this.prototype, \"endSharedEdit\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if @outletArgs.model.creatingSharedEdit}}\n        <div class=\"leave-shared-edit\">\n          <DButton\n            @action={{this.endSharedEdit}}\n            @label=\"shared_edits.done\"\n            class=\"btn-primary\"\n          />\n        </div>\n      {{/if}}\n      */\n      {\n        \"id\": \"quNFImB/\",\n        \"block\": \"[[[41,[30,1,[\\\"model\\\",\\\"creatingSharedEdit\\\"]],[[[1,\\\"  \\\"],[10,0],[14,0,\\\"leave-shared-edit\\\"],[12],[1,\\\"\\\\n    \\\"],[8,[32,0],[[24,0,\\\"btn-primary\\\"]],[[\\\"@action\\\",\\\"@label\\\"],[[30,0,[\\\"endSharedEdit\\\"]],\\\"shared_edits.done\\\"]],null],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@outletArgs\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-shared-edits/discourse/connectors/composer-fields-below/shared-edit-buttons.js\",\n        \"scope\": () => [_dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = SharedEditButtons;\n});","define(\"discourse/plugins/discourse-shared-edits/discourse/initializers/extend-composer-service\", [\"exports\", \"@ember/service\", \"discourse/lib/plugin-api\"], function (_exports, _service, _pluginApi) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const SHARED_EDIT_ACTION = \"sharedEdit\";\n  var _default = _exports.default = {\n    name: \"discourse-shared-edits-composer-service\",\n    initialize: container => {\n      const siteSettings = container.lookup(\"service:site-settings\");\n      if (!siteSettings.shared_edits_enabled) {\n        return;\n      }\n      (0, _pluginApi.withPluginApi)(api => {\n        api.modifyClass(\"service:composer\", Superclass => class extends Superclass {\n          static {\n            dt7948.g(this.prototype, \"sharedEditManager\", [_service.service]);\n          }\n          #sharedEditManager = (dt7948.i(this, \"sharedEditManager\"), void 0);\n          async open(opts) {\n            if (opts.action === SHARED_EDIT_ACTION && opts.post?.id) {\n              const subscription = await this.sharedEditManager.subscribe(opts.post.id, {\n                preOpen: true\n              });\n              if (subscription?.reply !== undefined) {\n                opts.reply = subscription.reply;\n              }\n            }\n            await super.open(...arguments);\n            if (opts.action === SHARED_EDIT_ACTION && opts.post?.id) {\n              await this.sharedEditManager.finalizeSubscription();\n            }\n          }\n          collapse() {\n            if (this.model?.action === SHARED_EDIT_ACTION) {\n              return this.close();\n            }\n            return super.collapse(...arguments);\n          }\n          async close() {\n            const wasSharedEdit = this.model?.action === SHARED_EDIT_ACTION;\n\n            // Suppress composer observer during close to prevent Y.Text from being\n            // wiped when model.reply is cleared\n            if (wasSharedEdit) {\n              this.sharedEditManager.suppressComposerChange = true;\n            }\n            try {\n              const result = await super.close(...arguments);\n              if (wasSharedEdit) {\n                await this.sharedEditManager.commit();\n              }\n              return result;\n            } finally {\n              if (wasSharedEdit) {\n                this.sharedEditManager.suppressComposerChange = false;\n              }\n            }\n          }\n          save() {\n            if (this.model?.action === SHARED_EDIT_ACTION) {\n              return this.close();\n            }\n            return super.save(...arguments);\n          }\n          _saveDraft() {\n            if (this.model?.action === SHARED_EDIT_ACTION) {\n              return;\n            }\n            return super._saveDraft(...arguments);\n          }\n        });\n      });\n    }\n  };\n});","define(\"discourse/plugins/discourse-shared-edits/discourse/initializers/shared-edits-init\", [\"exports\", \"@ember/object\", \"@ember/service\", \"@ember/template\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse/lib/constants\", \"discourse/lib/icon-library\", \"discourse/lib/plugin-api\", \"discourse/models/composer\", \"discourse/plugins/discourse-shared-edits/discourse/components/shared-edit-button\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits-prosemirror-extension\"], function (_exports, _object, _service, _template, _ajax, _ajaxError, _constants, _iconLibrary, _pluginApi, _composer3, _sharedEditButton, _sharedEditsProsemirrorExtension) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const SHARED_EDIT_ACTION = \"sharedEdit\";\n  function formatSharedEditActionTitle(model) {\n    if (model.action !== SHARED_EDIT_ACTION) {\n      return;\n    }\n    const opts = model.replyOptions;\n    if (!opts?.userAvatar || !opts?.userLink || !opts?.postLink) {\n      return;\n    }\n    return (0, _template.htmlSafe)(`\n    ${(0, _iconLibrary.iconHTML)(\"far-pen-to-square\", {\n      title: \"shared_edits.composer_title\"\n    })}\n    <a class=\"post-link\" href=\"${opts.postLink.href}\">${opts.postLink.anchor}</a>\n    ${opts.userAvatar}\n    <span class=\"username\">${opts.userLink.anchor}</span>\n  `);\n  }\n  function initWithApi(api, siteSettings) {\n    _composer3.SAVE_LABELS[SHARED_EDIT_ACTION] = \"composer.save_edit\";\n    _composer3.SAVE_ICONS[SHARED_EDIT_ACTION] = \"pencil\";\n    (0, _composer3.registerCustomizationCallback)({\n      actionTitle: formatSharedEditActionTitle\n    });\n    api.registerValueTransformer(\"composer-force-editor-mode\", ({\n      value,\n      context\n    }) => {\n      if (context.model?.action === SHARED_EDIT_ACTION) {\n        if (siteSettings?.shared_edits_editor_mode === \"rich\") {\n          return _constants.USER_OPTION_COMPOSITION_MODES.rich;\n        }\n        return _constants.USER_OPTION_COMPOSITION_MODES.markdown;\n      }\n      return value;\n    });\n    api.registerRichEditorExtension(_sharedEditsProsemirrorExtension.default);\n    customizePostMenu(api);\n    const currentUser = api.getCurrentUser();\n    api.addPostAdminMenuButton(attrs => {\n      if (!currentUser?.staff && currentUser?.trust_level < 4) {\n        return;\n      }\n      return {\n        icon: \"far-pen-to-square\",\n        className: \"admin-toggle-shared-edits\",\n        label: attrs.shared_edits_enabled ? \"shared_edits.disable_shared_edits\" : \"shared_edits.enable_shared_edits\",\n        action: async post => {\n          const url = `/shared_edits/p/${post.id}/${post.shared_edits_enabled ? \"disable\" : \"enable\"}.json`;\n          try {\n            await (0, _ajax.ajax)(url, {\n              type: \"PUT\"\n            });\n            post.set(\"shared_edits_enabled\", !post.shared_edits_enabled);\n          } catch (e) {\n            (0, _ajaxError.popupAjaxError)(e);\n          }\n        }\n      };\n    });\n    api.addTrackedPostProperties(\"shared_edits_enabled\");\n    api.addPostClassesCallback(attrs => {\n      if (attrs.shared_edits_enabled && attrs.canEdit) {\n        return [\"shared-edits-post\"];\n      }\n    });\n    api.modifyClass(\"model:composer\", Superclass => class extends Superclass {\n      get creatingSharedEdit() {\n        return this.get(\"action\") === SHARED_EDIT_ACTION;\n      }\n      get editingPost() {\n        return super.editingPost || this.creatingSharedEdit;\n      }\n    });\n    api.modifyClass(\"controller:topic\", Superclass => class extends Superclass {\n      init() {\n        super.init(...arguments);\n        this.appEvents.on(\"shared-edit-on-post\", this, this._handleSharedEditOnPost);\n      }\n      willDestroy() {\n        super.willDestroy(...arguments);\n        this.appEvents.off(\"shared-edit-on-post\", this, this._handleSharedEditOnPost);\n      }\n      async _handleSharedEditOnPost(post) {\n        const draftKey = post.get(\"topic.draft_key\");\n        const draftSequence = post.get(\"topic.draft_sequence\");\n        let raw;\n        try {\n          const result = await (0, _ajax.ajax)(`/posts/${post.id}.json`);\n          raw = result.raw;\n        } catch (e) {\n          (0, _ajaxError.popupAjaxError)(e);\n          return;\n        }\n        this.get(\"composer\").open({\n          post,\n          action: SHARED_EDIT_ACTION,\n          draftKey,\n          draftSequence,\n          reply: raw\n        });\n      }\n    });\n    api.modifyClass(\"component:d-editor\", Superclass => class extends Superclass {\n      static {\n        dt7948.g(this.prototype, \"composer\", [_service.service]);\n      }\n      #composer = (dt7948.i(this, \"composer\"), void 0);\n      static {\n        dt7948.g(this.prototype, \"sharedEditManager\", [_service.service]);\n      }\n      #sharedEditManager = (dt7948.i(this, \"sharedEditManager\"), void 0);\n      onChange(event) {\n        super.onChange(event);\n        if (this.composer?.model?.action !== SHARED_EDIT_ACTION) {\n          return;\n        }\n        this.sharedEditManager?.syncFromComposerValue?.(event?.target?.value ?? \"\");\n      }\n      static {\n        dt7948.n(this.prototype, \"onChange\", [_object.action]);\n      }\n    });\n    api.modifyClass(\"component:composer-messages\", Superclass => class extends Superclass {\n      async _findMessages() {\n        if (this.composer?.action === SHARED_EDIT_ACTION) {\n          this.set(\"checkedMessages\", true);\n          return;\n        }\n        return super._findMessages(...arguments);\n      }\n    });\n  }\n  function customizePostMenu(api) {\n    api.registerValueTransformer(\"post-menu-buttons\", ({\n      value: dag,\n      context: {\n        post,\n        buttonLabels,\n        buttonKeys\n      }\n    }) => {\n      if (!post.shared_edits_enabled || !post.canEdit) {\n        return;\n      }\n      dag.replace(buttonKeys.EDIT, _sharedEditButton.default, {\n        after: [buttonKeys.SHOW_MORE, buttonKeys.REPLY]\n      });\n      dag.reposition(buttonKeys.REPLY, {\n        after: buttonKeys.SHOW_MORE,\n        before: buttonKeys.EDIT\n      });\n      buttonLabels.hide(buttonKeys.REPLY);\n    });\n    api.addTrackedPostProperties(\"shared_edits_enabled\");\n  }\n  var _default = _exports.default = {\n    name: \"discourse-shared-edits\",\n    initialize: container => {\n      const siteSettings = container.lookup(\"service:site-settings\");\n      if (!siteSettings.shared_edits_enabled) {\n        return;\n      }\n      (0, _pluginApi.withPluginApi)(api => initWithApi(api, siteSettings));\n    }\n  };\n});","define(\"discourse/plugins/discourse-shared-edits/discourse/lib/caret-coordinates\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = getCaretCoordinates;\n  const properties = [\"direction\", \"boxSizing\", \"width\", \"height\", \"overflowX\", \"overflowY\", \"borderTopWidth\", \"borderRightWidth\", \"borderBottomWidth\", \"borderLeftWidth\", \"borderStyle\", \"paddingTop\", \"paddingRight\", \"paddingBottom\", \"paddingLeft\", \"fontStyle\", \"fontVariant\", \"fontWeight\", \"fontStretch\", \"fontSize\", \"fontSizeAdjust\", \"lineHeight\", \"fontFamily\", \"textAlign\", \"textTransform\", \"textIndent\", \"textDecoration\", \"letterSpacing\", \"wordSpacing\", \"tabSize\", \"MozTabSize\", \"whiteSpace\", \"wordBreak\", \"overflowWrap\", \"wordWrap\"];\n  const isBrowser = typeof window !== \"undefined\";\n  function getCaretCoordinates(element, position) {\n    if (!isBrowser) {\n      throw new Error(\"getCaretCoordinates should only be called in a browser context\");\n    }\n    const div = document.createElement(\"div\");\n    div.id = \"input-textarea-caret-position-mirror-div\";\n    document.body.appendChild(div);\n    const style = div.style;\n    const computed = window.getComputedStyle(element);\n    properties.forEach(prop => {\n      style[prop] = computed[prop];\n    });\n    style.whiteSpace = \"pre-wrap\";\n    style.overflowWrap = \"break-word\";\n    style.position = \"absolute\";\n    style.visibility = \"hidden\";\n\n    // Use getBoundingClientRect to get the precise fractional width of the element.\n    // This is critical because clientWidth rounds to an integer, which can cause\n    // incorrect line wrapping in the mirror div if the actual width is fractional\n    // (common on high-DPI displays or with percentage widths).\n    const rect = element.getBoundingClientRect();\n    style.width = `${rect.width}px`;\n    style.boxSizing = \"border-box\";\n    style.overflow = \"hidden\";\n\n    // Adjust padding-right to account for the scrollbar if it exists.\n    // The mirror div has overflow:hidden, so it won't have a scrollbar.\n    // We must reserve that space manually to match the text wrapping area.\n    // offsetWidth and clientWidth are integers, so the scrollbar width calculation is safe.\n    const borderLeft = parseFloat(computed.borderLeftWidth);\n    const borderRight = parseFloat(computed.borderRightWidth);\n    const scrollbarWidth = element.offsetWidth - element.clientWidth - borderLeft - borderRight;\n    if (scrollbarWidth > 0) {\n      style.paddingRight = `${parseFloat(computed.paddingRight) + scrollbarWidth}px`;\n    }\n    let pos = parseInt(position, 10);\n    if (isNaN(pos)) {\n      pos = 0;\n    }\n    div.textContent = element.value.substring(0, pos);\n    const span = document.createElement(\"span\");\n    // Use Zero Width Space to prevent the probe character from causing a wrap\n    // if the line is exactly full.\n    span.textContent = element.value.substring(pos) || \"\\u200b\";\n    div.appendChild(span);\n    const coordinates = {\n      top: span.offsetTop + parseInt(computed.borderTopWidth, 10),\n      left: span.offsetLeft + parseInt(computed.borderLeftWidth, 10),\n      height: parseInt(computed.lineHeight, 10)\n    };\n    if (isNaN(coordinates.height)) {\n      coordinates.height = parseInt(computed.fontSize, 10) * 1.2; // Fallback\n    }\n    document.body.removeChild(div);\n    return coordinates;\n  }\n});","define(\"discourse/plugins/discourse-shared-edits/discourse/lib/cursor-overlay\", [\"exports\", \"discourse/plugins/discourse-shared-edits/discourse/lib/caret-coordinates\"], function (_exports, _caretCoordinates) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class CursorOverlay {\n    constructor(textarea) {\n      this.textarea = textarea;\n      this.container = document.createElement(\"div\");\n      this.container.className = \"shared-edits-cursor-overlay\";\n      this.updateContainerPosition();\n      const parent = textarea.parentElement;\n      if (getComputedStyle(parent).position === \"static\") {\n        parent.style.position = \"relative\";\n      }\n      parent.appendChild(this.container);\n      this.cursors = new Map();\n      this.activeTypists = new Map();\n      this.boundOnScroll = this.onScroll.bind(this);\n      this.textarea.addEventListener(\"scroll\", this.boundOnScroll, {\n        passive: true\n      });\n      this.resizeObserver = new ResizeObserver(() => {\n        this.updateContainerPosition();\n        this.refresh();\n      });\n      this.resizeObserver.observe(textarea);\n    }\n    updateContainerPosition() {\n      this.container.style.top = `${this.textarea.offsetTop}px`;\n      this.container.style.left = `${this.textarea.offsetLeft}px`;\n      this.container.style.width = `${this.textarea.offsetWidth}px`;\n      this.container.style.height = `${this.textarea.offsetHeight}px`;\n    }\n    onScroll() {\n      this.cursors.forEach(cursor => this.renderCursor(cursor));\n    }\n    refresh() {\n      const Y = window.Y;\n      if (!Y || !Y.createAbsolutePositionFromRelativePosition) {\n        return;\n      }\n      this.cursors.forEach(cursor => {\n        if (cursor.relativePosition && cursor.doc) {\n          const absolutePosition = Y.createAbsolutePositionFromRelativePosition(cursor.relativePosition, cursor.doc);\n          if (absolutePosition) {\n            this.calculateCursorPosition(cursor, absolutePosition.index);\n          }\n        }\n      });\n    }\n    updateCursor(clientId, origin, relativePosition, doc) {\n      const Y = window.Y;\n      if (!Y || !Y.createAbsolutePositionFromRelativePosition) {\n        return;\n      }\n      let cursor = this.cursors.get(clientId);\n      if (cursor && cursor.user.username !== origin.username) {\n        cursor.element.remove();\n        this.cursors.delete(clientId);\n        const typist = this.activeTypists.get(clientId);\n        if (typist?.timeout) {\n          clearTimeout(typist.timeout);\n        }\n        this.activeTypists.delete(clientId);\n        cursor = null;\n      }\n      const isNew = !cursor;\n      if (isNew) {\n        cursor = this.createCursorElement({\n          user_id: origin.user_id,\n          username: origin.username\n        });\n        this.cursors.set(clientId, cursor);\n      }\n      cursor.clientId = clientId;\n      cursor.relativePosition = relativePosition;\n      cursor.origin = origin;\n      cursor.doc = doc;\n      const absolutePosition = Y.createAbsolutePositionFromRelativePosition(relativePosition, doc);\n      if (absolutePosition) {\n        this.markTypist(clientId);\n        this.calculateCursorPosition(cursor, absolutePosition.index);\n      }\n      if (isNew) {\n        this.container.appendChild(cursor.element);\n      }\n    }\n    markTypist(clientId) {\n      const now = Date.now();\n      const typist = this.activeTypists.get(clientId) || {};\n      if (typist.timeout) {\n        clearTimeout(typist.timeout);\n      }\n      typist.lastTyped = now;\n      typist.timeout = setTimeout(() => {\n        const cursor = this.cursors.get(clientId);\n        if (cursor) {\n          cursor.element.style.display = \"none\";\n        }\n      }, 5000);\n      this.activeTypists.set(clientId, typist);\n    }\n    calculateCursorPosition(cursor, index) {\n      const typist = this.activeTypists.get(cursor.clientId);\n      const isActive = typist && Date.now() - typist.lastTyped < 5000;\n      if (!isActive) {\n        cursor.element.style.display = \"none\";\n        return;\n      }\n      const viewCoords = this.getViewCoords(index);\n      if (viewCoords) {\n        cursor.absoluteTop = viewCoords.top;\n        cursor.absoluteLeft = viewCoords.left;\n        cursor.height = viewCoords.height;\n        const isFirstLine = viewCoords.top < (viewCoords.height || 20) * 1.2;\n        if (isFirstLine) {\n          cursor.label.classList.add(\"shared-edits-cursor__label--bottom\");\n        } else {\n          cursor.label.classList.remove(\"shared-edits-cursor__label--bottom\");\n        }\n        cursor.element.style.display = \"block\";\n        this.renderCursor(cursor);\n      } else {\n        cursor.element.style.display = \"none\";\n      }\n    }\n    renderCursor(cursor) {\n      const top = cursor.absoluteTop - this.textarea.scrollTop;\n      const left = cursor.absoluteLeft - this.textarea.scrollLeft;\n      cursor.element.style.transform = `translate(${left}px, ${top}px)`;\n      if (cursor.height) {\n        cursor.element.style.height = `${cursor.height}px`;\n      }\n    }\n    getViewCoords(index) {\n      return (0, _caretCoordinates.default)(this.textarea, index);\n    }\n    createCursorElement(user) {\n      const el = document.createElement(\"div\");\n      el.className = \"shared-edits-cursor\";\n      const color = this.getColor(user.user_id);\n      el.style.borderColor = color;\n      const label = document.createElement(\"div\");\n      label.className = \"shared-edits-cursor__label\";\n      label.textContent = user.username;\n      label.style.backgroundColor = color;\n      el.appendChild(label);\n      return {\n        element: el,\n        label,\n        user\n      };\n    }\n    removeCursor(clientId) {\n      const cursor = this.cursors.get(clientId);\n      if (cursor) {\n        cursor.element.remove();\n        this.cursors.delete(clientId);\n      }\n      const typist = this.activeTypists.get(clientId);\n      if (typist) {\n        if (typist.timeout) {\n          clearTimeout(typist.timeout);\n        }\n        this.activeTypists.delete(clientId);\n      }\n    }\n    clearPosition(clientId) {\n      const cursor = this.cursors.get(clientId);\n      if (cursor) {\n        cursor.relativePosition = null;\n        cursor.element.style.display = \"none\";\n      }\n    }\n    getColor(id) {\n      const index = (id || 0) % 7;\n      return `var(--shared-edit-color-${index + 1})`;\n    }\n    destroy() {\n      this.textarea.removeEventListener(\"scroll\", this.boundOnScroll);\n      if (this.resizeObserver) {\n        this.resizeObserver.disconnect();\n      }\n      this.container.remove();\n      this.cursors.clear();\n      this.activeTypists.forEach(typist => {\n        if (typist.timeout) {\n          clearTimeout(typist.timeout);\n        }\n      });\n      this.activeTypists.clear();\n    }\n  }\n  _exports.default = CursorOverlay;\n});","define(\"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits-prosemirror-extension\", [\"exports\", \"discourse/plugins/discourse-shared-edits/discourse/services/shared-edit-manager\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/debug\"], function (_exports, _sharedEditManager, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.clearSharedEditYjsState = clearSharedEditYjsState;\n  _exports.default = void 0;\n  _exports.getSharedEditYjsState = getSharedEditYjsState;\n  _exports.resetProsemirrorExtensionState = resetProsemirrorExtensionState;\n  _exports.setSharedEditYjsState = setSharedEditYjsState;\n  let sharedEditYjsState = null;\n  let stateIdCounter = 0;\n  function createCursorBuilder(editorContainer) {\n    return user => {\n      const cursor = document.createElement(\"span\");\n      cursor.classList.add(\"ProseMirror-yjs-cursor\");\n      cursor.style.borderColor = user.color;\n      const label = document.createElement(\"div\");\n      label.textContent = user.name;\n      label.style.backgroundColor = user.color;\n      cursor.appendChild(label);\n      requestAnimationFrame(() => {\n        if (!cursor.isConnected) {\n          return;\n        }\n        const cursorRect = cursor.getBoundingClientRect();\n        const containerRect = editorContainer?.getBoundingClientRect();\n        if (containerRect && cursorRect.top - containerRect.top < 20) {\n          label.classList.add(\"ProseMirror-yjs-cursor__label--below\");\n        }\n      });\n      return cursor;\n    };\n  }\n  function setSharedEditYjsState(state) {\n    stateIdCounter += 1;\n    state._stateId = stateIdCounter;\n    state.configured = false;\n    sharedEditYjsState = state;\n  }\n  function clearSharedEditYjsState() {\n    sharedEditYjsState = null;\n    (0, _sharedEditManager.clearPM)();\n    (0, _sharedEditManager.clearRichModeSerializers)();\n  }\n\n  // Test support: reset module state between tests\n  // Note: We intentionally do NOT reset stateIdCounter. It must be ever-increasing\n  // to ensure isStillValid() checks work correctly when async operations from a\n  // previous test are still in flight when the next test starts.\n  function resetProsemirrorExtensionState() {\n    sharedEditYjsState = null;\n  }\n  function getSharedEditYjsState() {\n    return sharedEditYjsState;\n  }\n  const sharedEditsProsemirrorExtension = {\n    // IMPORTANT: Plugin order matters - ySyncPlugin MUST be first\n    plugins(params) {\n      (0, _sharedEditManager.capturePM)(params);\n      const convertToMarkdown = params.utils?.convertToMarkdown;\n      if (convertToMarkdown) {\n        (0, _sharedEditManager.setConvertToMarkdown)(convertToMarkdown);\n      }\n      if (!sharedEditYjsState) {\n        return [];\n      }\n      const {\n        Plugin\n      } = params.pmState;\n      const {\n        xmlFragment,\n        awareness,\n        seedXmlFromView,\n        _stateId,\n        onError\n      } = sharedEditYjsState;\n      const capturedStateId = _stateId;\n      const currentState = sharedEditYjsState;\n\n      // Captures markdown on view destroy before commit() can serialize it\n      const capturePlugin = new Plugin({\n        view(view) {\n          return {\n            destroy() {\n              if (convertToMarkdown && view.state?.doc) {\n                try {\n                  const markdown = convertToMarkdown(view.state.doc);\n                  (0, _sharedEditManager.setCapturedMarkdown)(markdown);\n                } catch {}\n              }\n            }\n          };\n        }\n      });\n      const loaderPlugin = new Plugin({\n        view(view) {\n          let destroyed = false;\n          let configurationStarted = false;\n          const isStillValid = () => {\n            if (destroyed) {\n              return false;\n            }\n            const activeState = getSharedEditYjsState();\n            if (!activeState || activeState._stateId !== capturedStateId) {\n              return false;\n            }\n            if (currentState.configured) {\n              return false;\n            }\n\n            // Check both parentNode and isConnected for robust detection of\n            // detached views (e.g., rapid close after open)\n            if (view.isDestroyed || !view.dom?.parentNode || !view.dom.isConnected) {\n              return false;\n            }\n            return true;\n          };\n          const reportError = error => {\n            if (!isStillValid()) {\n              return;\n            }\n            onError?.(error);\n          };\n          if (!configurationStarted) {\n            configurationStarted = true;\n            (0, _sharedEditManager.ensureYjsProsemirrorLoaded)().then(() => {\n              if (!isStillValid()) {\n                return;\n              }\n              const SharedEditsYjs = window.SharedEditsYjs;\n              if (!SharedEditsYjs?.ySyncPlugin) {\n                reportError(new Error(\"y-prosemirror plugins not available after load\"));\n                (0, _debug.debugError)(\"y-prosemirror plugins not available after load\");\n                return;\n              }\n              if (!isStillValid()) {\n                return;\n              }\n              if (seedXmlFromView && xmlFragment.length === 0 && SharedEditsYjs.prosemirrorToYXmlFragment) {\n                SharedEditsYjs.prosemirrorToYXmlFragment(view.state.doc, xmlFragment);\n              }\n              let syncPlugin, cursorPlugin, undoPlugin;\n              try {\n                syncPlugin = SharedEditsYjs.ySyncPlugin(xmlFragment);\n                const cursorBuilder = createCursorBuilder(view.dom);\n                cursorPlugin = SharedEditsYjs.yCursorPlugin(awareness, {\n                  cursorBuilder\n                });\n                undoPlugin = SharedEditsYjs.yUndoPlugin();\n              } catch (e) {\n                (0, _debug.debugError)(\"Error creating y-prosemirror plugins:\", e);\n                reportError(e);\n                return;\n              }\n              const remainingPlugins = view.state.plugins.filter(plugin => plugin !== loaderPlugin);\n              currentState.configured = true;\n              (0, _sharedEditManager.setProsemirrorViewGetter)(() => view);\n              try {\n                view.updateState(view.state.reconfigure({\n                  plugins: [syncPlugin, cursorPlugin, undoPlugin, ...remainingPlugins]\n                }));\n              } catch (e) {\n                (0, _debug.debugError)(\"Error updating view state:\", e);\n                reportError(e);\n              }\n            }).catch(error => {\n              reportError(error);\n              (0, _debug.debugError)(\"Failed to load y-prosemirror plugins:\", error);\n            });\n          }\n          return {\n            destroy() {\n              destroyed = true;\n            }\n          };\n        }\n      });\n      return [capturePlugin, loaderPlugin];\n    }\n  };\n  var _default = _exports.default = sharedEditsProsemirrorExtension;\n});","define(\"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/bundle-paths\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.YJS_PROSEMIRROR_URL = _exports.YJS_DIST_URL = void 0;\n  const YJS_DIST_URL = _exports.YJS_DIST_URL = \"/plugins/discourse-shared-edits/javascripts/yjs-dist-c9980322a7eb.js\";\n  const YJS_PROSEMIRROR_URL = _exports.YJS_PROSEMIRROR_URL = \"/plugins/discourse-shared-edits/javascripts/yjs-prosemirror-353105f085ce.js\";\n});","define(\"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/debug\", [\"exports\", \"discourse/lib/environment\"], function (_exports, _environment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.debugError = debugError;\n  _exports.debugLog = debugLog;\n  _exports.debugWarn = debugWarn;\n  /**\n   * Debug logging utilities for SharedEdits.\n   * Logs are only output in development mode.\n   */\n\n  const PREFIX = \"[SharedEdits]\";\n  function debugLog(...args) {\n    if ((0, _environment.isDevelopment)()) {\n      // eslint-disable-next-line no-console\n      console.log(PREFIX, ...args);\n    }\n  }\n  function debugWarn(...args) {\n    if ((0, _environment.isDevelopment)()) {\n      // eslint-disable-next-line no-console\n      console.warn(PREFIX, ...args);\n    }\n  }\n  function debugError(...args) {\n    if ((0, _environment.isDevelopment)()) {\n      // eslint-disable-next-line no-console\n      console.error(PREFIX, ...args);\n    }\n  }\n});","define(\"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/encoding-utils\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.USER_COLORS = void 0;\n  _exports.applyDiff = applyDiff;\n  _exports.base64ToUint8Array = base64ToUint8Array;\n  _exports.base64urlToUint8Array = base64urlToUint8Array;\n  _exports.decodeRelativePositionFromBase64url = decodeRelativePositionFromBase64url;\n  _exports.encodeRelativePositionToBase64url = encodeRelativePositionToBase64url;\n  _exports.getUserColorForId = getUserColorForId;\n  _exports.transformSelection = transformSelection;\n  _exports.uint8ArrayToBase64 = uint8ArrayToBase64;\n  _exports.uint8ArrayToBase64url = uint8ArrayToBase64url;\n  /**\n   * Pure utility functions for shared edits encoding, diffing, and selection transforms.\n   * These have no service dependencies and can be used anywhere.\n   */\n\n  // Base64 encoding/decoding utilities\n\n  function base64ToUint8Array(str) {\n    if (!str) {\n      return new Uint8Array();\n    }\n    return Uint8Array.from(atob(str), c => c.charCodeAt(0));\n  }\n  function uint8ArrayToBase64(uint8) {\n    let binary = \"\";\n    uint8.forEach(b => binary += String.fromCharCode(b));\n    return btoa(binary);\n  }\n  function uint8ArrayToBase64url(uint8) {\n    return uint8ArrayToBase64(uint8).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n  }\n  function base64urlToUint8Array(str) {\n    if (!str) {\n      return new Uint8Array();\n    }\n    let base64 = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n    while (base64.length % 4) {\n      base64 += \"=\";\n    }\n    return base64ToUint8Array(base64);\n  }\n\n  // Relative position encoding for cursor sync\n\n  function encodeRelativePositionToBase64url(relativePosition) {\n    if (!relativePosition || !window.Y || !window.Y.encodeRelativePosition) {\n      return null;\n    }\n    const encoded = window.Y.encodeRelativePosition(relativePosition);\n    return uint8ArrayToBase64url(encoded);\n  }\n  function decodeRelativePositionFromBase64url(base64url) {\n    if (!base64url || !window.Y || !window.Y.decodeRelativePosition) {\n      return null;\n    }\n    try {\n      const uint8 = base64urlToUint8Array(base64url);\n      return window.Y.decodeRelativePosition(uint8);\n    } catch {\n      return null;\n    }\n  }\n\n  // Text diff algorithm - applies minimal changes to Y.Text\n\n  function applyDiff(yText, before, after) {\n    if (before === after) {\n      return;\n    }\n    let start = 0;\n    while (start < before.length && start < after.length && before[start] === after[start]) {\n      start++;\n    }\n    let endBefore = before.length - 1;\n    let endAfter = after.length - 1;\n    while (endBefore >= start && endAfter >= start && before[endBefore] === after[endAfter]) {\n      endBefore--;\n      endAfter--;\n    }\n    const removeCount = Math.max(0, endBefore - start + 1);\n    const insertText = endAfter >= start ? after.slice(start, endAfter + 1) : \"\";\n    if (removeCount > 0) {\n      yText.delete(start, removeCount);\n    }\n    if (insertText.length > 0) {\n      yText.insert(start, insertText);\n    }\n  }\n\n  // Selection transform through Yjs delta\n\n  function transformSelection(selection, delta) {\n    if (!selection) {\n      return null;\n    }\n    let {\n      start,\n      end\n    } = selection;\n    let index = 0;\n    delta.forEach(op => {\n      if (op.retain) {\n        index += op.retain;\n        return;\n      }\n      if (op.delete) {\n        const count = op.delete;\n        if (start > index) {\n          start = Math.max(index, start - count);\n        }\n        if (end > index) {\n          end = Math.max(index, end - count);\n        }\n        return;\n      }\n      if (op.insert) {\n        const count = typeof op.insert === \"string\" ? op.insert.length : 0;\n        if (start >= index) {\n          start += count;\n        }\n        if (end >= index) {\n          end += count;\n        }\n        index += count;\n      }\n    });\n    return {\n      start,\n      end\n    };\n  }\n\n  // User colors for cursor display\n\n  const USER_COLORS = _exports.USER_COLORS = [{\n    color: \"#3b82f6\",\n    colorLight: \"#dbeafe\"\n  },\n  // blue\n  {\n    color: \"#22c55e\",\n    colorLight: \"#dcfce7\"\n  },\n  // green\n  {\n    color: \"#f59e0b\",\n    colorLight: \"#fef3c7\"\n  },\n  // amber\n  {\n    color: \"#ef4444\",\n    colorLight: \"#fee2e2\"\n  },\n  // red\n  {\n    color: \"#8b5cf6\",\n    colorLight: \"#ede9fe\"\n  },\n  // violet\n  {\n    color: \"#ec4899\",\n    colorLight: \"#fce7f3\"\n  },\n  // pink\n  {\n    color: \"#06b6d4\",\n    colorLight: \"#cffafe\"\n  } // cyan\n  ];\n  function getUserColorForId(userId) {\n    return USER_COLORS[(userId || 0) % USER_COLORS.length];\n  }\n});","define(\"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/markdown-sync\", [\"exports\", \"@ember/owner\", \"@ember/service\", \"discourse/plugins/discourse-shared-edits/discourse/lib/cursor-overlay\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/encoding-utils\"], function (_exports, _owner, _service, _cursorOverlay, _encodingUtils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n   * Handles textarea synchronization for markdown mode:\n   * - Selection preservation across remote edits\n   * - Cursor overlay for remote users\n   * - Spellcheck suppression during updates\n   * - Undo/redo keyboard handling\n   */\n\n  const TEXTAREA_SELECTOR = \"#reply-control textarea.d-editor-input\";\n  const SPELLCHECK_SUSPEND_DURATION_MS = 1000;\n  class MarkdownSync {\n    static {\n      dt7948.g(this.prototype, \"composer\", [_service.service]);\n    }\n    #composer = (dt7948.i(this, \"composer\"), void 0);\n    cursorOverlay = null;\n\n    // Callback for when selection ends with skipped updates\n    onSelectionEnd = null;\n    #isSelecting = false;\n    #detached = false;\n    #selectionListenersAttached = false;\n    #skippedUpdatesDuringSelection = false;\n    #pendingRelativeSelection = null;\n    #spellcheckTimeoutId = null;\n    #spellcheckRestoreValue = null;\n    #spellcheckTextarea = null;\n\n    // Callbacks\n    #syncOrigin = null;\n    #undoManager = null;\n    #onTextareaMouseDown = () => {\n      this.#isSelecting = true;\n      this.#skippedUpdatesDuringSelection = false;\n    };\n    #onTextareaKeydown = event => {\n      if (!this.#undoManager) {\n        return;\n      }\n      const isCtrl = event.ctrlKey || event.metaKey;\n      const isShift = event.shiftKey;\n      if (isCtrl && !isShift && event.key.toLowerCase() === \"z\") {\n        event.preventDefault();\n        this.#undoManager.undo();\n      }\n      if (isCtrl && isShift && event.key.toLowerCase() === \"z\" || isCtrl && !isShift && event.key.toLowerCase() === \"y\") {\n        event.preventDefault();\n        this.#undoManager.redo();\n      }\n    };\n    #onTextareaMouseUp = () => {\n      const hadSkippedUpdates = this.#skippedUpdatesDuringSelection;\n      if (hadSkippedUpdates && this.#syncOrigin) {\n        requestAnimationFrame(() => {\n          if (this.#detached) {\n            return;\n          }\n          const textareaSelection = this.getTextareaSelection();\n          this.#isSelecting = false;\n          this.#skippedUpdatesDuringSelection = false;\n          this.onSelectionEnd?.(textareaSelection);\n        });\n      } else {\n        this.#isSelecting = false;\n        this.#skippedUpdatesDuringSelection = false;\n      }\n    };\n    constructor(context) {\n      (0, _owner.setOwner)(this, (0, _owner.getOwner)(context));\n      // The context (service) is used as the origin for doc.transact()\n      // so we can skip our own edits in handleTextChange\n      this.#syncOrigin = context;\n    }\n\n    // Lifecycle\n\n    attach(doc, text, undoManager) {\n      this.#detached = false;\n      this.#undoManager = undoManager;\n      this.#attachSelectionListeners();\n      const textarea = document.querySelector(TEXTAREA_SELECTOR);\n      if (textarea && !this.cursorOverlay) {\n        this.cursorOverlay = new _cursorOverlay.default(textarea);\n      }\n    }\n    detach() {\n      this.#detached = true;\n      this.onSelectionEnd = null;\n      this.#resetSpellcheckSuppression();\n      this.#detachSelectionListeners();\n      if (this.cursorOverlay) {\n        this.cursorOverlay.destroy();\n        this.cursorOverlay = null;\n      }\n      this.#undoManager = null;\n    }\n\n    // Selection management\n\n    getTextareaSelection() {\n      const textarea = document.querySelector(TEXTAREA_SELECTOR);\n      if (!textarea) {\n        return null;\n      }\n      return {\n        start: textarea.selectionStart,\n        end: textarea.selectionEnd\n      };\n    }\n    captureRelativeSelection(text) {\n      const textarea = document.querySelector(TEXTAREA_SELECTOR);\n      if (!textarea || typeof textarea.selectionStart !== \"number\" || typeof textarea.selectionEnd !== \"number\") {\n        return null;\n      }\n      const Y = window.Y;\n      return {\n        start: Y.createRelativePositionFromTypeIndex(text, textarea.selectionStart, 0),\n        end: Y.createRelativePositionFromTypeIndex(text, textarea.selectionEnd, 0),\n        scrollTop: textarea.scrollTop\n      };\n    }\n    absoluteSelectionFromRelative(rel, doc, text) {\n      if (!rel) {\n        return null;\n      }\n      const Y = window.Y;\n      const startAbs = Y.createAbsolutePositionFromRelativePosition(rel.start, doc);\n      const endAbs = Y.createAbsolutePositionFromRelativePosition(rel.end, doc);\n      if (!startAbs || !endAbs || startAbs.type !== text || endAbs.type !== text) {\n        return null;\n      }\n      return {\n        start: startAbs.index,\n        end: endAbs.index,\n        scrollTop: rel.scrollTop\n      };\n    }\n\n    // Remote text change handling\n\n    handleTextChange(event, transaction, text, doc, suppressComposerChangeFn) {\n      // Handle remote cursor updates\n      if (transaction.origin && transaction.origin.type === \"remote\" && this.cursorOverlay) {\n        const origin = transaction.origin;\n        let relativePosition = origin.cursor?.end || origin.cursor?.start;\n        if (!relativePosition) {\n          let index = 0;\n          (event.delta || []).forEach(op => {\n            if (op.retain) {\n              index += op.retain;\n            }\n            if (op.insert) {\n              const length = typeof op.insert === \"string\" ? op.insert.length : 1;\n              index += length;\n            }\n          });\n          relativePosition = window.Y.createRelativePositionFromTypeIndex(text, index, -1);\n        }\n        if (relativePosition) {\n          this.cursorOverlay.updateCursor(origin.client_id, origin, relativePosition, doc);\n        }\n      }\n      this.cursorOverlay?.refresh();\n\n      // Skip if this is our own edit\n      if (transaction?.origin === this.#syncOrigin) {\n        return;\n      }\n\n      // Skip if user is selecting - will sync after selection ends\n      if (this.#isSelecting) {\n        this.#skippedUpdatesDuringSelection = true;\n        return;\n      }\n      const textarea = document.querySelector(TEXTAREA_SELECTOR);\n      const selection = textarea && typeof textarea.selectionStart === \"number\" ? {\n        start: textarea.selectionStart,\n        end: textarea.selectionEnd\n      } : null;\n      let adjustedSelection = null;\n      let scrollTop = textarea?.scrollTop;\n      if (this.#pendingRelativeSelection) {\n        adjustedSelection = this.absoluteSelectionFromRelative(this.#pendingRelativeSelection, doc, text);\n        if (scrollTop === undefined || scrollTop === null) {\n          scrollTop = this.#pendingRelativeSelection?.scrollTop;\n        }\n        this.#pendingRelativeSelection = null;\n      }\n      if (!adjustedSelection) {\n        adjustedSelection = (0, _encodingUtils.transformSelection)(selection, event.delta || []);\n      }\n      const textValue = text.toString();\n      suppressComposerChangeFn?.(() => {\n        this.composer.model?.set(\"reply\", textValue);\n      });\n      if (textarea) {\n        const currentValue = textarea.value;\n        if (currentValue === textValue) {\n          return;\n        }\n        let appliedSurgically = false;\n        if (event.delta) {\n          let expectedOldLength = textValue.length;\n          let insertLen = 0;\n          let deleteLen = 0;\n          for (const op of event.delta) {\n            if (op.insert) {\n              insertLen += typeof op.insert === \"string\" ? op.insert.length : 0;\n            } else if (op.delete) {\n              deleteLen += op.delete;\n            }\n          }\n          expectedOldLength = expectedOldLength - insertLen + deleteLen;\n          if (currentValue.length === expectedOldLength) {\n            let index = 0;\n            event.delta.forEach(op => {\n              if (op.retain) {\n                index += op.retain;\n              } else if (op.insert) {\n                textarea.setRangeText(op.insert, index, index);\n                index += op.insert.length;\n              } else if (op.delete) {\n                textarea.setRangeText(\"\", index, index + op.delete);\n              }\n            });\n            appliedSurgically = true;\n          }\n        }\n        if (!appliedSurgically) {\n          this.#applyDiffToTextarea(textarea, currentValue, textValue);\n        }\n        this.cursorOverlay?.refresh();\n        if (adjustedSelection) {\n          textarea.selectionStart = adjustedSelection.start;\n          textarea.selectionEnd = adjustedSelection.end;\n        }\n        if (scrollTop !== undefined && textarea.scrollTop !== scrollTop) {\n          window.requestAnimationFrame(() => {\n            textarea.scrollTop = scrollTop;\n          });\n        }\n      }\n    }\n    #applyDiffToTextarea(textarea, oldText, newText) {\n      let prefixLen = 0;\n      const minLen = Math.min(oldText.length, newText.length);\n      while (prefixLen < minLen && oldText[prefixLen] === newText[prefixLen]) {\n        prefixLen++;\n      }\n      let suffixLen = 0;\n      while (suffixLen < oldText.length - prefixLen && suffixLen < newText.length - prefixLen && oldText[oldText.length - 1 - suffixLen] === newText[newText.length - 1 - suffixLen]) {\n        suffixLen++;\n      }\n      const replacement = newText.slice(prefixLen, newText.length - suffixLen);\n      textarea.setRangeText(replacement, prefixLen, oldText.length - suffixLen, \"preserve\");\n    }\n    syncTextareaAfterSelection(text, suppressComposerChangeFn) {\n      const oldSelection = this.getTextareaSelection();\n      const textarea = document.querySelector(TEXTAREA_SELECTOR);\n      if (!textarea || !text) {\n        return;\n      }\n      const oldText = textarea.value;\n      const newText = text.toString();\n      const scrollTop = textarea.scrollTop;\n      let adjustedSelection = null;\n      if (oldSelection && oldText !== newText) {\n        adjustedSelection = this.#transformSelectionThroughDiff(oldText, newText, oldSelection);\n      } else if (oldSelection) {\n        adjustedSelection = oldSelection;\n      }\n      suppressComposerChangeFn?.(() => {\n        this.composer.model?.set(\"reply\", newText);\n      });\n      if (oldText !== newText) {\n        this.#applyDiffToTextarea(textarea, oldText, newText);\n      }\n      if (adjustedSelection) {\n        const maxPos = newText.length;\n        textarea.selectionStart = Math.min(Math.max(0, adjustedSelection.start), maxPos);\n        textarea.selectionEnd = Math.min(Math.max(0, adjustedSelection.end), maxPos);\n      }\n      if (scrollTop !== undefined) {\n        window.requestAnimationFrame(() => {\n          textarea.scrollTop = scrollTop;\n        });\n      }\n    }\n    #transformSelectionThroughDiff(oldText, newText, selection) {\n      let prefixLen = 0;\n      const minLen = Math.min(oldText.length, newText.length);\n      while (prefixLen < minLen && oldText[prefixLen] === newText[prefixLen]) {\n        prefixLen++;\n      }\n      let suffixLen = 0;\n      while (suffixLen < oldText.length - prefixLen && suffixLen < newText.length - prefixLen && oldText[oldText.length - 1 - suffixLen] === newText[newText.length - 1 - suffixLen]) {\n        suffixLen++;\n      }\n      const oldChangeEnd = oldText.length - suffixLen;\n      const newChangeEnd = newText.length - suffixLen;\n      const transformPos = pos => {\n        if (pos <= prefixLen) {\n          return pos;\n        } else if (pos >= oldChangeEnd) {\n          return pos + (newChangeEnd - oldChangeEnd);\n        } else {\n          return newChangeEnd;\n        }\n      };\n      return {\n        start: transformPos(selection.start),\n        end: transformPos(selection.end)\n      };\n    }\n\n    // Cursor payload for network\n\n    buildCursorPayload(text) {\n      if (!text) {\n        return null;\n      }\n      const selection = this.captureRelativeSelection(text);\n      if (!selection) {\n        return null;\n      }\n      const cursor = {};\n      const start = (0, _encodingUtils.encodeRelativePositionToBase64url)(selection.start);\n      if (start) {\n        cursor.start = start;\n      }\n      const end = (0, _encodingUtils.encodeRelativePositionToBase64url)(selection.end);\n      if (end) {\n        cursor.end = end;\n      }\n      return Object.keys(cursor).length ? cursor : null;\n    }\n    deserializeCursorPayload(cursorPayload) {\n      if (!cursorPayload) {\n        return null;\n      }\n      const cursor = {};\n      if (cursorPayload.start) {\n        const start = (0, _encodingUtils.decodeRelativePositionFromBase64url)(cursorPayload.start);\n        if (start) {\n          cursor.start = start;\n        }\n      }\n      if (cursorPayload.end) {\n        const end = (0, _encodingUtils.decodeRelativePositionFromBase64url)(cursorPayload.end);\n        if (end) {\n          cursor.end = end;\n        }\n      }\n      return Object.keys(cursor).length ? cursor : null;\n    }\n\n    // Spellcheck suppression during remote updates\n\n    temporarilyDisableSpellcheck() {\n      const textarea = document.querySelector(TEXTAREA_SELECTOR);\n      if (!textarea) {\n        return;\n      }\n      if (this.#spellcheckRestoreValue === null) {\n        this.#spellcheckRestoreValue = textarea.spellcheck;\n      }\n      this.#spellcheckTextarea = textarea;\n      textarea.spellcheck = false;\n      if (this.#spellcheckTimeoutId) {\n        clearTimeout(this.#spellcheckTimeoutId);\n      }\n      this.#spellcheckTimeoutId = setTimeout(() => {\n        this.#spellcheckTimeoutId = null;\n        this.#applySpellcheckRestore();\n      }, SPELLCHECK_SUSPEND_DURATION_MS);\n    }\n    #applySpellcheckRestore() {\n      if (this.#spellcheckTextarea?.isConnected && this.#spellcheckRestoreValue !== null) {\n        this.#spellcheckTextarea.spellcheck = this.#spellcheckRestoreValue;\n      }\n      this.#spellcheckTextarea = null;\n      this.#spellcheckRestoreValue = null;\n    }\n    #resetSpellcheckSuppression() {\n      if (this.#spellcheckTimeoutId) {\n        clearTimeout(this.#spellcheckTimeoutId);\n        this.#spellcheckTimeoutId = null;\n      }\n      this.#applySpellcheckRestore();\n    }\n\n    // Selection event listeners\n\n    #attachSelectionListeners() {\n      if (this.#selectionListenersAttached) {\n        return;\n      }\n      const textarea = document.querySelector(TEXTAREA_SELECTOR);\n      if (!textarea) {\n        return;\n      }\n      textarea.addEventListener(\"mousedown\", this.#onTextareaMouseDown);\n      textarea.addEventListener(\"keydown\", this.#onTextareaKeydown);\n      document.addEventListener(\"mouseup\", this.#onTextareaMouseUp);\n      this.#selectionListenersAttached = true;\n    }\n    #detachSelectionListeners() {\n      if (!this.#selectionListenersAttached) {\n        return;\n      }\n      const textarea = document.querySelector(TEXTAREA_SELECTOR);\n      if (textarea) {\n        textarea.removeEventListener(\"mousedown\", this.#onTextareaMouseDown);\n        textarea.removeEventListener(\"keydown\", this.#onTextareaKeydown);\n      }\n      document.removeEventListener(\"mouseup\", this.#onTextareaMouseUp);\n      this.#selectionListenersAttached = false;\n      this.#isSelecting = false;\n    }\n\n    // Getters\n\n    get isSelecting() {\n      return this.#isSelecting;\n    }\n    setPendingRelativeSelection(selection) {\n      this.#pendingRelativeSelection = selection;\n    }\n  }\n  _exports.default = MarkdownSync;\n});","define(\"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/network-manager\", [\"exports\", \"@ember/owner\", \"@ember/runloop\", \"@ember/service\", \"discourse/lib/ajax\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/debug\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/encoding-utils\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/protocol\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/yjs-document\"], function (_exports, _owner, _runloop, _service, _ajax, _debug, _encodingUtils, _protocol, _yjsDocument) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n   * Manages network operations for shared edits: API calls, MessageBus subscriptions,\n   * and update batching/throttling.\n   */\n\n  const THROTTLE_SAVE = 500;\n  const MESSAGE_BUS_CHANNEL_PREFIX = \"/shared_edits\";\n  const MAX_PENDING_UPDATES = 100;\n  const MAX_RETRY_ATTEMPTS = 3;\n  const STATE_HASH_SYNC_TIMEOUT = 5000; // 5 seconds to reach target hash\n\n  function messageBusChannel(postId) {\n    return `${MESSAGE_BUS_CHANNEL_PREFIX}/${postId}`;\n  }\n  class NetworkManager {\n    static {\n      dt7948.g(this.prototype, \"messageBus\", [_service.service]);\n    }\n    #messageBus = (dt7948.i(this, \"messageBus\"), void 0);\n    pendingUpdates = [];\n    pendingAwarenessUpdate = null;\n    ajaxInProgress = false;\n    inFlightRequest = null;\n    messageBusLastId = null;\n    skipNextStateVector = false; // Skip state vector validation after resync\n\n    // State hash sync tracking\n    #targetStateHash = null;\n    #hashSyncTimeoutId = null;\n    #getDoc = null;\n    #lastVerifiedHash = null; // Cache to avoid redundant hash computation\n\n    #sendUpdatesThrottleId = null;\n    #messageBusPostId = null;\n    #messageBusLastSubscribedId = null;\n    #onRemoteMessage = null;\n    #onResync = null;\n    #getRecoveryText = null;\n    #retryCount = 0;\n    #handleRemoteMessage = message => {\n      if (message.action === _protocol.SHARED_EDITS_MESSAGE_ACTIONS.RESYNC) {\n        this.#lastVerifiedHash = null; // Invalidate cache on resync\n        this.#onResync?.();\n        return;\n      }\n      if (message.client_id === this.messageBus.clientId) {\n        return;\n      }\n\n      // Parse update from base64 if present\n      const parsedMessage = {\n        ...message\n      };\n      if (message.update) {\n        parsedMessage.updateBinary = (0, _encodingUtils.base64ToUint8Array)(message.update);\n        this.#lastVerifiedHash = null; // Invalidate cache when doc changes\n      }\n      if (message.awareness) {\n        parsedMessage.awarenessBinary = (0, _encodingUtils.base64ToUint8Array)(message.awareness);\n      }\n      this.#onRemoteMessage?.(parsedMessage);\n    };\n    constructor(context, {\n      onRemoteMessage,\n      onResync,\n      getRecoveryText\n    } = {}) {\n      (0, _owner.setOwner)(this, (0, _owner.getOwner)(context));\n      this.#onRemoteMessage = onRemoteMessage;\n      this.#onResync = onResync;\n      this.#getRecoveryText = getRecoveryText;\n    }\n\n    // API calls\n\n    async fetchState(postId) {\n      const data = await (0, _ajax.ajax)(`/shared_edits/p/${postId}.json`);\n      this.messageBusLastId = data.message_bus_last_id ?? -1;\n      return data;\n    }\n    async commitEdits(postId) {\n      await (0, _ajax.ajax)(`/shared_edits/p/${postId}/commit.json`, {\n        method: \"PUT\"\n      });\n    }\n\n    // Update management\n\n    queueUpdate(update) {\n      this.pendingUpdates.push(update);\n      this.#lastVerifiedHash = null; // Invalidate cache when doc changes\n      this.#sendUpdatesThrottled();\n    }\n    queueAwarenessUpdate(update) {\n      this.pendingAwarenessUpdate = update;\n      this.#sendUpdatesThrottled();\n    }\n    #sendUpdatesThrottled() {\n      this.#sendUpdatesThrottleId = (0, _runloop.throttle)(this, this.#triggerSendUpdates, THROTTLE_SAVE, false);\n    }\n    #triggerSendUpdates() {\n      this.onSendUpdates?.();\n    }\n\n    // Called by the orchestrator service to actually send updates\n    // Returns { resynced: true } if a recovery-related 409 triggered a resync\n    async sendUpdates(postId, {\n      cursorPayload,\n      isRichMode,\n      getClientId,\n      allowBlankState,\n      getDoc\n    } = {}) {\n      const updatesToSend = [...this.pendingUpdates];\n      const awarenessToSend = this.pendingAwarenessUpdate;\n      const hasDocUpdates = updatesToSend.length > 0;\n      const hasAwarenessUpdate = isRichMode && awarenessToSend;\n      if (!hasDocUpdates && !hasAwarenessUpdate || !postId) {\n        return {\n          resynced: false\n        };\n      }\n      if (this.ajaxInProgress) {\n        if (this.inFlightRequest) {\n          await this.inFlightRequest;\n        }\n      }\n      const data = {\n        client_id: getClientId?.() || this.messageBus.clientId\n      };\n      if (allowBlankState) {\n        data.allow_blank_state = true;\n      }\n      this.pendingUpdates = [];\n      this.pendingAwarenessUpdate = null;\n      let sentUpdates = [];\n      if (hasDocUpdates) {\n        const {\n          payload,\n          deferredUpdates\n        } = await this.#prepareUpdatePayload(updatesToSend);\n        const queuedDuringMerge = this.pendingUpdates;\n        this.pendingUpdates = deferredUpdates.concat(queuedDuringMerge);\n        sentUpdates = updatesToSend.slice(0, updatesToSend.length - deferredUpdates.length);\n        if (payload) {\n          data.update = (0, _encodingUtils.uint8ArrayToBase64)(payload);\n\n          // Include state vector for server-side validation (unless skipped after resync)\n          if (!this.skipNextStateVector) {\n            const doc = getDoc?.();\n            if (doc) {\n              const Y = window.SharedEditsYjs?.Y || window.Y;\n              if (Y?.encodeStateVector) {\n                data.state_vector = (0, _encodingUtils.uint8ArrayToBase64)(Y.encodeStateVector(doc));\n              }\n            }\n          }\n        }\n      }\n      if (hasAwarenessUpdate) {\n        data.awareness = (0, _encodingUtils.uint8ArrayToBase64)(awarenessToSend);\n      }\n      if (!isRichMode && cursorPayload) {\n        data.cursor = cursorPayload;\n      }\n      this.ajaxInProgress = true;\n      try {\n        this.inFlightRequest = (0, _ajax.ajax)(`/shared_edits/p/${postId}.json`, {\n          method: \"PUT\",\n          data\n        });\n        const response = await this.inFlightRequest;\n        this.#retryCount = 0;\n        this.skipNextStateVector = false; // Reset after successful update\n\n        // Store getDoc for hash verification\n        this.#getDoc = getDoc;\n\n        // Process state_hash from server response for sync verification\n        if (response?.state_hash) {\n          this.#processServerStateHash(response.state_hash, getDoc);\n        }\n        return {\n          resynced: false\n        };\n      } catch (e) {\n        // Handle corruption that needs client text for recovery\n        if (e.jqXHR?.status === 409 && e.jqXHR?.responseJSON?.error === _protocol.SHARED_EDITS_ERRORS.NEEDS_RECOVERY_TEXT) {\n          const recoveryText = this.#getRecoveryText?.();\n          if (recoveryText != null) {\n            (0, _debug.debugLog)(\"Corruption detected, sending recovery text\");\n            try {\n              const retryResult = await (0, _ajax.ajax)(`/shared_edits/p/${postId}.json`, {\n                method: \"PUT\",\n                data: {\n                  client_id: data.client_id,\n                  recovery_text: recoveryText\n                }\n              });\n              (0, _debug.debugLog)(\"Recovery successful, version:\", retryResult.version);\n              this.#retryCount = 0;\n              // Trigger resync to reinitialize local Y.Doc with the server's fresh state\n              // This ensures the local doc matches exactly what the server accepted\n              this.#onResync?.();\n              return {\n                resynced: true,\n                recovered: true\n              };\n            } catch (retryError) {\n              (0, _debug.debugError)(\"Recovery with client text failed:\", retryError);\n            }\n          }\n        }\n        if (e.jqXHR?.status === 409 && [_protocol.SHARED_EDITS_ERRORS.STATE_RECOVERED, _protocol.SHARED_EDITS_ERRORS.STATE_RECOVERED_FROM_CLIENT].includes(e.jqXHR?.responseJSON?.error)) {\n          this.#retryCount = 0;\n          this.#onResync?.();\n          return {\n            resynced: true\n          };\n        }\n\n        // Handle state divergence - client is behind server\n        if (e.jqXHR?.status === 409 && e.jqXHR?.responseJSON?.error === _protocol.SHARED_EDITS_ERRORS.STATE_DIVERGED && e.jqXHR?.responseJSON?.missing_update) {\n          const doc = getDoc?.();\n          if (doc) {\n            const Y = window.SharedEditsYjs?.Y || window.Y;\n            if (Y?.applyUpdate) {\n              (0, _debug.debugLog)(\"State diverged, applying missing update\");\n              const missingUpdate = (0, _encodingUtils.base64ToUint8Array)(e.jqXHR.responseJSON.missing_update);\n              Y.applyUpdate(doc, missingUpdate, \"remote\");\n\n              // Re-queue the failed updates to try again with the now-synced state\n              if (sentUpdates.length && this.#retryCount <= MAX_RETRY_ATTEMPTS) {\n                const combined = sentUpdates.concat(this.pendingUpdates);\n                this.pendingUpdates = combined.slice(0, MAX_PENDING_UPDATES);\n                this.#retryCount++;\n                // Trigger immediate retry\n                this.#sendUpdatesThrottled();\n                return {\n                  resynced: false,\n                  appliedMissingUpdate: true\n                };\n              }\n            }\n          }\n          // If we couldn't apply the missing update, trigger full resync\n          this.#retryCount = 0;\n          this.#onResync?.();\n          return {\n            resynced: true\n          };\n        }\n        this.#retryCount++;\n\n        // Re-queue failed updates with bounded retry\n        if (sentUpdates.length && this.#retryCount <= MAX_RETRY_ATTEMPTS) {\n          const combined = sentUpdates.concat(this.pendingUpdates);\n          this.pendingUpdates = combined.slice(0, MAX_PENDING_UPDATES);\n        } else if (this.#retryCount > MAX_RETRY_ATTEMPTS) {\n          (0, _debug.debugError)(\"Max retries exceeded, triggering resync\");\n          this.#retryCount = 0;\n          this.#onResync?.();\n          return {\n            resynced: true\n          };\n        }\n        if (awarenessToSend && !this.pendingAwarenessUpdate) {\n          this.pendingAwarenessUpdate = awarenessToSend;\n        }\n        throw e;\n      } finally {\n        this.inFlightRequest = null;\n        this.ajaxInProgress = false;\n      }\n    }\n    async flushPendingUpdates(postId, options = {}) {\n      if (this.inFlightRequest) {\n        await this.inFlightRequest;\n      }\n      const hasUpdates = this.pendingUpdates.length > 0 || options.isRichMode && this.pendingAwarenessUpdate;\n      let result = {\n        resynced: false\n      };\n      if (hasUpdates) {\n        result = (await this.sendUpdates(postId, options)) || {\n          resynced: false\n        };\n      }\n      if (this.inFlightRequest) {\n        await this.inFlightRequest;\n      }\n      return result;\n    }\n\n    // MessageBus subscription\n\n    subscribe(postId, lastId) {\n      if (!postId) {\n        return;\n      }\n      const needsResubscribe = this.#messageBusPostId !== postId || this.#messageBusLastSubscribedId !== lastId;\n      if (!needsResubscribe) {\n        return;\n      }\n      if (this.#messageBusPostId) {\n        this.messageBus.unsubscribe(messageBusChannel(this.#messageBusPostId));\n      }\n      this.messageBus.subscribe(messageBusChannel(postId), this.#handleRemoteMessage, lastId);\n      this.#messageBusPostId = postId;\n      this.#messageBusLastSubscribedId = lastId;\n    }\n    unsubscribe(postId) {\n      if (postId) {\n        this.messageBus.unsubscribe(messageBusChannel(postId));\n      }\n      if (this.#messageBusPostId) {\n        this.messageBus.unsubscribe(messageBusChannel(this.#messageBusPostId));\n      }\n      this.#messageBusPostId = null;\n      this.#messageBusLastSubscribedId = null;\n    }\n    teardown() {\n      if (this.#sendUpdatesThrottleId) {\n        (0, _runloop.cancel)(this.#sendUpdatesThrottleId);\n        this.#sendUpdatesThrottleId = null;\n      }\n      this.#clearHashSyncTimeout();\n      this.unsubscribe();\n      this.pendingUpdates = [];\n      this.pendingAwarenessUpdate = null;\n      this.ajaxInProgress = false;\n      this.inFlightRequest = null;\n      this.messageBusLastId = null;\n      this.skipNextStateVector = false;\n      this.#targetStateHash = null;\n      this.#lastVerifiedHash = null;\n      this.#getDoc = null;\n    }\n\n    // State hash sync methods\n\n    #processServerStateHash(serverHash, getDoc) {\n      if (!serverHash) {\n        return;\n      }\n      this.#targetStateHash = serverHash;\n\n      // Compute local hash asynchronously and verify\n      this.#verifyStateHash(getDoc);\n    }\n    async #verifyStateHash(getDoc) {\n      const doc = getDoc?.();\n      if (!doc || !this.#targetStateHash) {\n        return;\n      }\n\n      // Skip recomputation if we already verified this target hash\n      if (this.#lastVerifiedHash === this.#targetStateHash) {\n        this.#clearHashSyncTimeout();\n        this.#targetStateHash = null;\n        return;\n      }\n      const localHash = await (0, _yjsDocument.computeStateHash)(doc);\n      if (!localHash) {\n        return;\n      }\n      if (localHash === this.#targetStateHash) {\n        // Hashes match - we're synced\n        this.#lastVerifiedHash = localHash;\n        this.#clearHashSyncTimeout();\n        this.#targetStateHash = null;\n        return;\n      }\n\n      // Hashes don't match - start forwarding timeout if not already running\n      if (!this.#hashSyncTimeoutId) {\n        (0, _debug.debugLog)(\"State hash mismatch, waiting for MessageBus updates.\", `Local: ${localHash.slice(0, 8)}..., Target: ${this.#targetStateHash.slice(0, 8)}...`);\n        this.#startHashSyncTimeout();\n      }\n    }\n    #startHashSyncTimeout() {\n      this.#clearHashSyncTimeout();\n      this.#hashSyncTimeoutId = setTimeout(() => {\n        this.#hashSyncTimeoutId = null;\n        this.#handleHashSyncTimeout();\n      }, STATE_HASH_SYNC_TIMEOUT);\n    }\n    #clearHashSyncTimeout() {\n      if (this.#hashSyncTimeoutId) {\n        clearTimeout(this.#hashSyncTimeoutId);\n        this.#hashSyncTimeoutId = null;\n      }\n    }\n    async #handleHashSyncTimeout() {\n      if (!this.#targetStateHash || !this.#getDoc) {\n        return;\n      }\n\n      // Check one more time if we've synced\n      const doc = this.#getDoc();\n      if (doc) {\n        const localHash = await (0, _yjsDocument.computeStateHash)(doc);\n        if (localHash === this.#targetStateHash) {\n          // We synced in time\n          this.#targetStateHash = null;\n          return;\n        }\n        (0, _debug.debugWarn)(\"State hash sync timeout - local state diverged from server.\", `Local: ${localHash?.slice(0, 8) || \"null\"}..., Target: ${this.#targetStateHash.slice(0, 8)}... Triggering resync.`);\n      }\n\n      // Still mismatched after timeout - trigger full resync\n      this.#targetStateHash = null;\n      this.#onResync?.();\n    }\n\n    // Called when a remote message is applied to re-verify hash\n    async notifyRemoteUpdateApplied() {\n      if (this.#targetStateHash && this.#getDoc) {\n        await this.#verifyStateHash(this.#getDoc);\n      }\n    }\n    async #prepareUpdatePayload(updates) {\n      if (updates.length <= 1) {\n        return {\n          payload: updates[0] || null,\n          deferredUpdates: []\n        };\n      }\n      let merger = window.SharedEditsYjs?.Y || window.Y;\n      if (!merger?.mergeUpdates) {\n        try {\n          await (0, _yjsDocument.triggerYjsLoad)();\n          merger = window.SharedEditsYjs?.Y || window.Y;\n        } catch (e) {\n          (0, _debug.debugWarn)(\"Failed to load Yjs while merging updates:\", e);\n        }\n      }\n      if (merger?.mergeUpdates) {\n        return {\n          payload: merger.mergeUpdates(updates),\n          deferredUpdates: []\n        };\n      }\n      (0, _debug.debugWarn)(\"Unable to merge shared edit updates; sending sequentially.\");\n      return {\n        payload: updates[0],\n        deferredUpdates: updates.slice(1)\n      };\n    }\n  }\n  _exports.default = NetworkManager;\n});","define(\"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/protocol\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.SHARED_EDITS_MESSAGE_ACTIONS = _exports.SHARED_EDITS_ERRORS = void 0;\n  const SHARED_EDITS_MESSAGE_ACTIONS = _exports.SHARED_EDITS_MESSAGE_ACTIONS = Object.freeze({\n    RESYNC: \"resync\"\n  });\n  const SHARED_EDITS_ERRORS = _exports.SHARED_EDITS_ERRORS = Object.freeze({\n    BLANK_STATE_REJECTED: \"blank_state_rejected\",\n    COMMIT_FAILED: \"commit_failed\",\n    DISABLE_FAILED: \"disable_failed\",\n    INVALID_UPDATE: \"invalid_update\",\n    NEEDS_RECOVERY_TEXT: \"needs_recovery_text\",\n    NOT_INITIALIZED: \"not_initialized\",\n    POST_LENGTH_EXCEEDED: \"post_length_exceeded\",\n    RECOVERY_FAILED: \"recovery_failed\",\n    RECOVERY_NOT_NEEDED: \"recovery_not_needed\",\n    RESET_FAILED: \"reset_failed\",\n    STATE_DIVERGED: \"state_diverged\",\n    STATE_RECOVERED: \"state_recovered\",\n    STATE_RECOVERED_FROM_CLIENT: \"state_recovered_from_client\"\n  });\n});","define(\"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/rich-mode-sync\", [\"exports\", \"@ember/owner\", \"@ember/runloop\", \"@ember/service\", \"discourse-i18n\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits-prosemirror-extension\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/debug\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/encoding-utils\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/yjs-document\"], function (_exports, _owner, _runloop, _service, _discourseI18n, _sharedEditsProsemirrorExtension, _debug, _encodingUtils, _yjsDocument) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n   * Handles ProseMirror integration for rich mode:\n   * - Yjs state setup for ProseMirror\n   * - Awareness updates\n   * - XML fragment to text synchronization\n   * - Error handling and fallback\n   */\n\n  class RichModeSync {\n    static {\n      dt7948.g(this.prototype, \"dialog\", [_service.service]);\n    }\n    #dialog = (dt7948.i(this, \"dialog\"), void 0);\n    #syncDebounceId = null;\n    #xmlFragmentObserver = null;\n    #awarenessUpdateHandler = null;\n    #onSyncAnomaly = null;\n\n    // Callbacks\n    #onError = null;\n    #onXmlFragmentChange = null;\n    // Error handling\n    #handleRichModeFailure = error => {\n      if (this._richModeFailed || this._handlingRichModeFailure) {\n        return;\n      }\n      this._richModeFailed = true;\n      this._handlingRichModeFailure = true;\n      (0, _debug.debugError)(\"Rich mode collaboration failed:\", error);\n      this.dialog.alert((0, _discourseI18n.i18n)(\"shared_edits.errors.rich_mode_failed\"));\n      this.#onError?.(error);\n      this._handlingRichModeFailure = false;\n    };\n    _richModeFailed = false;\n    _handlingRichModeFailure = false;\n    constructor(context, {\n      onError,\n      onSyncAnomaly\n    } = {}) {\n      (0, _owner.setOwner)(this, (0, _owner.getOwner)(context));\n      this.#onError = onError;\n      this.#onSyncAnomaly = onSyncAnomaly;\n    }\n\n    // Setup\n\n    setupYjsState(xmlFragment, awareness, seedXmlFromView) {\n      (0, _sharedEditsProsemirrorExtension.setSharedEditYjsState)({\n        xmlFragment,\n        awareness,\n        seedXmlFromView,\n        onError: this.#handleRichModeFailure\n      });\n    }\n    setupXmlFragmentObserver(xmlFragment, onXmlFragmentChange) {\n      this.#onXmlFragmentChange = onXmlFragmentChange;\n      this.#xmlFragmentObserver = () => {\n        this.#syncDebounceId = (0, _runloop.debounce)(this, this.#triggerXmlFragmentSync, 500);\n      };\n      xmlFragment.observeDeep(this.#xmlFragmentObserver);\n    }\n    #triggerXmlFragmentSync() {\n      this.#onXmlFragmentChange?.();\n    }\n    flushXmlSync() {\n      if (this.#syncDebounceId) {\n        (0, _runloop.cancel)(this.#syncDebounceId);\n        this.#syncDebounceId = null;\n        this.#triggerXmlFragmentSync();\n      }\n    }\n    setupAwarenessHandler(awareness, onAwarenessUpdate) {\n      this.#awarenessUpdateHandler = onAwarenessUpdate;\n      awareness.on(\"update\", this.#awarenessUpdateHandler);\n    }\n\n    // Sync Y.Text from xmlFragment\n\n    syncYTextFromXmlFragment(xmlFragment, text, doc, {\n      consumeMarkdown = false\n    } = {}) {\n      if (!xmlFragment || xmlFragment.length === 0 || !text || !doc) {\n        return false;\n      }\n      let newText = (0, _yjsDocument.getMarkdownFromView)({\n        consumeCapture: consumeMarkdown\n      });\n      if (newText === null) {\n        // ProseMirror serialization unavailable - this is a degraded state\n        // Log a warning and attempt the lossy fallback only as last resort\n        (0, _debug.debugWarn)(\"ProseMirror markdown serialization unavailable,\", \"falling back to lossy XML text extraction\");\n        newText = this.#extractTextFromXmlFragment(xmlFragment);\n      }\n      if (typeof newText !== \"string\") {\n        (0, _debug.debugError)(\"Rich mode sync failed: newText is not a string\", typeof newText);\n        this.#onSyncAnomaly?.({\n          reason: \"invalid_newtext_type\",\n          type: typeof newText\n        });\n        return false;\n      }\n      const currentText = text.toString();\n      const newTextTrimmed = newText?.trim() || \"\";\n      const currentTrimmed = currentText?.trim() || \"\";\n      const fragmentHasContent = xmlFragment?.length > 0 && this.#extractTextFromXmlFragment(xmlFragment).trim().length > 0;\n      if (fragmentHasContent && currentTrimmed.length > 0 && newTextTrimmed.length === 0) {\n        (0, _debug.debugError)(\"Rich mode sync produced blank markdown despite populated document. Skipping update.\");\n        this.#onSyncAnomaly?.({\n          reason: \"empty_serialization\",\n          currentLength: currentText.length\n        });\n        return false;\n      }\n\n      // Preserve trailing newline from Y.Text if present\n      // ProseMirror/markdown serializers often strip trailing newlines,\n      // but we want to preserve them for consistency with the source document\n      const currentEndsWithNewline = currentText.endsWith(\"\\n\");\n      const newEndsWithNewline = newText.endsWith(\"\\n\");\n      if (currentEndsWithNewline && !newEndsWithNewline) {\n        newText = newText + \"\\n\";\n      }\n      if (newText === currentText) {\n        return false;\n      }\n      doc.transact(() => {\n        (0, _encodingUtils.applyDiff)(text, currentText, newText);\n      }, \"xmlSync\");\n      return true;\n    }\n    #extractTextFromXmlFragment(fragment) {\n      let text = \"\";\n      const processNode = node => {\n        if (typeof node === \"string\") {\n          text += node;\n        } else if (node.toString && !node.nodeName) {\n          const str = node.toString();\n          if (str) {\n            text += str;\n          }\n        } else if (node.forEach) {\n          node.forEach(processNode);\n        }\n      };\n      fragment.forEach(child => {\n        processNode(child);\n        text += \"\\n\";\n      });\n\n      // Keep one trailing newline to match markdown format, strip extras\n      return text.replace(/\\n{2,}$/, \"\\n\");\n    }\n\n    // Awareness update encoding\n\n    encodeAwarenessUpdate(awareness, clientIds) {\n      const SharedEditsYjs = window.SharedEditsYjs;\n      if (!SharedEditsYjs?.encodeAwarenessUpdate) {\n        return null;\n      }\n      if (clientIds.length > 0) {\n        return SharedEditsYjs.encodeAwarenessUpdate(awareness, clientIds);\n      }\n      return null;\n    }\n    applyAwarenessUpdate(awareness, awarenessBinary) {\n      const SharedEditsYjs = window.SharedEditsYjs;\n      if (!SharedEditsYjs?.applyAwarenessUpdate) {\n        return;\n      }\n      SharedEditsYjs.applyAwarenessUpdate(awareness, awarenessBinary, \"sync\");\n    }\n    get richModeFailed() {\n      return this._richModeFailed;\n    }\n\n    // Cleanup\n\n    teardown(xmlFragment, awareness) {\n      (0, _sharedEditsProsemirrorExtension.clearSharedEditYjsState)();\n      if (this.#syncDebounceId) {\n        (0, _runloop.cancel)(this.#syncDebounceId);\n        this.#syncDebounceId = null;\n      }\n      if (xmlFragment && this.#xmlFragmentObserver) {\n        xmlFragment.unobserveDeep(this.#xmlFragmentObserver);\n        this.#xmlFragmentObserver = null;\n      }\n      if (awareness && this.#awarenessUpdateHandler) {\n        awareness.off(\"update\", this.#awarenessUpdateHandler);\n        this.#awarenessUpdateHandler = null;\n      }\n      this.#onXmlFragmentChange = null;\n      this._handlingRichModeFailure = false;\n      this._richModeFailed = false;\n    }\n  }\n  _exports.default = RichModeSync;\n});","define(\"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/yjs-document\", [\"exports\", \"@ember/owner\", \"@ember/service\", \"discourse/lib/load-script\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/bundle-paths\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/debug\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/encoding-utils\"], function (_exports, _owner, _service, _loadScript, _bundlePaths, _debug, _encodingUtils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.capturePM = capturePM;\n  _exports.clearPM = clearPM;\n  _exports.clearRichModeSerializers = clearRichModeSerializers;\n  _exports.computeStateHash = computeStateHash;\n  _exports.default = void 0;\n  _exports.ensureYjsLoaded = ensureYjsLoaded;\n  _exports.ensureYjsProsemirrorLoaded = ensureYjsProsemirrorLoaded;\n  _exports.getMarkdownFromView = getMarkdownFromView;\n  _exports.getPM = getPM;\n  _exports.resetYjsModuleState = resetYjsModuleState;\n  _exports.setCapturedMarkdown = setCapturedMarkdown;\n  _exports.setConvertToMarkdown = setConvertToMarkdown;\n  _exports.setProsemirrorViewGetter = setProsemirrorViewGetter;\n  _exports.triggerYjsLoad = triggerYjsLoad;\n  /**\n   * Manages Y.Doc lifecycle: creation, initialization, and teardown.\n   * Also handles Yjs library loading and ProseMirror capture utilities.\n   */\n\n  // Yjs loading promises (module-level for singleton behavior)\n  let yjsPromise;\n  let yjsProsemirrorPromise;\n\n  // ProseMirror capture namespace\n  const PM_NAMESPACE = \"__sharedEditsProseMirror\";\n\n  // ProseMirror capture utilities for rich mode\n\n  function capturePM(params) {\n    if (typeof window === \"undefined\") {\n      return;\n    }\n    window[PM_NAMESPACE] = {\n      pmState: params.pmState,\n      pmView: params.pmView,\n      pmModel: params.pmModel,\n      pmTransform: params.pmTransform,\n      pmCommands: params.pmCommands,\n      pmHistory: params.pmHistory,\n      pmInputrules: params.pmInputrules,\n      pmKeymap: params.pmKeymap\n    };\n  }\n  function clearPM() {\n    if (typeof window === \"undefined\") {\n      return;\n    }\n    delete window[PM_NAMESPACE];\n  }\n  function getPM() {\n    if (typeof window === \"undefined\") {\n      return null;\n    }\n    return window[PM_NAMESPACE] || null;\n  }\n\n  // Markdown conversion utilities for rich mode\n\n  let convertToMarkdownFn = null;\n  let prosemirrorViewGetter = null;\n  let capturedMarkdown = null;\n  function setConvertToMarkdown(fn) {\n    convertToMarkdownFn = fn;\n  }\n  function setProsemirrorViewGetter(getter) {\n    prosemirrorViewGetter = getter;\n  }\n  function setCapturedMarkdown(markdown) {\n    capturedMarkdown = markdown;\n  }\n  function clearRichModeSerializers() {\n    convertToMarkdownFn = null;\n    prosemirrorViewGetter = null;\n    capturedMarkdown = null;\n  }\n  function getMarkdownFromView({\n    consumeCapture = false\n  } = {}) {\n    // Try to get markdown from live ProseMirror view first.\n    // This ensures we always use the current editor state when the view is available,\n    // rather than potentially stale captured markdown from a previous session.\n    if (convertToMarkdownFn && prosemirrorViewGetter) {\n      const view = prosemirrorViewGetter();\n      if (view && !view.isDestroyed) {\n        try {\n          const result = convertToMarkdownFn(view.state.doc);\n          // Successfully got markdown from live view - but DON'T clear captured markdown\n          // if we're in recovery mode. The captured markdown may be more up-to-date\n          // than the live view during resync when ProseMirror binding is broken.\n          // Only clear if the live result is non-empty and captures are not being consumed.\n          if (capturedMarkdown !== null && !consumeCapture && result) {\n            // If captured markdown has more content, prefer it\n            if (capturedMarkdown.length > result.length) {\n              return capturedMarkdown;\n            }\n            capturedMarkdown = null;\n          }\n          return result;\n        } catch {\n          // Fall through to captured markdown fallback\n        }\n      }\n    }\n\n    // Fall back to captured markdown only when the live view is not available.\n    // This happens during commit when the ProseMirror view has been destroyed\n    // but we still need to serialize the final document state.\n    if (capturedMarkdown !== null) {\n      if (consumeCapture) {\n        const captured = capturedMarkdown;\n        capturedMarkdown = null;\n        return captured;\n      }\n      return capturedMarkdown;\n    }\n    return null;\n  }\n\n  // Test support: reset module state between tests\n  // Note: We don't reset yjsPromise/yjsProsemirrorPromise because the Yjs\n  // library is a singleton that persists for the browser session. Resetting\n  // these would cause issues if code still holds references to Y objects.\n  function resetYjsModuleState() {\n    clearRichModeSerializers();\n    clearPM();\n  }\n\n  // State hash computation\n\n  async function computeStateHash(yDoc) {\n    const Y = window.SharedEditsYjs?.Y || window.Y;\n    if (!Y || !yDoc) {\n      return null;\n    }\n\n    // crypto.subtle is only available in secure contexts (HTTPS)\n    // On HTTP, skip hash computation - sync verification will be disabled\n    if (!crypto?.subtle?.digest) {\n      return null;\n    }\n    try {\n      const state = Y.encodeStateAsUpdate(yDoc);\n      const hashBuffer = await crypto.subtle.digest(\"SHA-256\", state);\n      return Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n    } catch (e) {\n      (0, _debug.debugError)(\"Failed to compute state hash:\", e);\n      return null;\n    }\n  }\n\n  // Yjs loading functions\n\n  function triggerYjsLoad() {\n    if (!yjsPromise) {\n      yjsPromise = (async () => {\n        await (0, _loadScript.default)(_bundlePaths.YJS_DIST_URL);\n        return window.Y;\n      })().catch(e => {\n        yjsPromise = null;\n        throw e;\n      });\n    }\n    return yjsPromise;\n  }\n  async function ensureYjsLoaded() {\n    if (!yjsPromise) {\n      return triggerYjsLoad();\n    }\n    return yjsPromise;\n  }\n  function ensureYjsProsemirrorLoaded() {\n    if (!yjsProsemirrorPromise) {\n      yjsProsemirrorPromise = (async () => {\n        await ensureYjsLoaded();\n        const pm = getPM();\n        if (!pm?.pmState || !pm?.pmView || !pm?.pmModel) {\n          throw new Error(\"ProseMirror modules missing - ensure capturePM() was called\");\n        }\n        await (0, _loadScript.default)(_bundlePaths.YJS_PROSEMIRROR_URL);\n        return window.SharedEditsYjs;\n      })().catch(e => {\n        yjsProsemirrorPromise = null;\n        throw e;\n      });\n    }\n    return yjsProsemirrorPromise;\n  }\n\n  /**\n   * YjsDocument manages the lifecycle of a Y.Doc instance.\n   */\n  class YjsDocument {\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"currentUser\", [_service.service]);\n    }\n    #currentUser = (dt7948.i(this, \"currentUser\"), void 0);\n    doc = null;\n    text = null;\n    xmlFragment = null;\n    awareness = null;\n    undoManager = null;\n    textObserver = null;\n    #onDocUpdate = null;\n    #onRichDocUpdate = null;\n    constructor(context) {\n      (0, _owner.setOwner)(this, (0, _owner.getOwner)(context));\n    }\n    get isRichMode() {\n      return this.siteSettings.shared_edits_editor_mode === \"rich\";\n    }\n    async setup(state, raw, callbacks = {}) {\n      this.teardown();\n      if (this.isRichMode) {\n        try {\n          await this.#setupRichDoc(state, callbacks);\n        } catch (error) {\n          (0, _debug.debugError)(\"Rich mode setup failed, falling back to markdown:\", error);\n          this.teardown();\n          callbacks.onRichModeFailed?.();\n          await this.#setupMarkdownDoc(state, raw, callbacks);\n        }\n      } else {\n        await this.#setupMarkdownDoc(state, raw, callbacks);\n      }\n    }\n    async #setupMarkdownDoc(state, raw, {\n      onDocUpdate,\n      onTextObserve,\n      undoOrigin\n    } = {}) {\n      const Y = await ensureYjsLoaded();\n      this.doc = new Y.Doc();\n      this.text = this.doc.getText(\"post\");\n      const initialUpdate = (0, _encodingUtils.base64ToUint8Array)(state);\n      if (initialUpdate.length > 0) {\n        Y.applyUpdate(this.doc, initialUpdate, \"remote\");\n      } else if (raw) {\n        this.text.insert(0, raw);\n      }\n      if (onTextObserve) {\n        this.textObserver = (event, transaction) => onTextObserve(event, transaction);\n        this.text.observe(this.textObserver);\n      }\n      if (onDocUpdate) {\n        this.#onDocUpdate = onDocUpdate;\n        this.doc.on(\"update\", this.#onDocUpdate);\n      }\n      this.undoManager = new Y.UndoManager(this.text, {\n        trackedOrigins: new Set([undoOrigin || this]),\n        captureTimeout: 500\n      });\n    }\n    async #setupRichDoc(state, {\n      onDocUpdate\n    } = {}) {\n      await ensureYjsLoaded();\n      const SharedEditsYjs = window.SharedEditsYjs;\n      if (!SharedEditsYjs) {\n        throw new Error(\"SharedEditsYjs not loaded - Yjs bundle may be missing\");\n      }\n      const {\n        Y,\n        Awareness\n      } = SharedEditsYjs;\n      if (!Y || !Awareness) {\n        throw new Error(\"Yjs or Awareness not available in SharedEditsYjs\");\n      }\n      this.doc = new Y.Doc();\n      this.xmlFragment = this.doc.getXmlFragment(\"prosemirror\");\n      this.text = this.doc.getText(\"post\");\n      this.awareness = new Awareness(this.doc);\n      const userColors = (0, _encodingUtils.getUserColorForId)(this.currentUser?.id || 0);\n      this.awareness.setLocalStateField(\"user\", {\n        name: this.currentUser?.username || \"Anonymous\",\n        color: userColors.color,\n        colorLight: userColors.colorLight\n      });\n      const initialUpdate = (0, _encodingUtils.base64ToUint8Array)(state);\n      if (initialUpdate.length > 0) {\n        Y.applyUpdate(this.doc, initialUpdate, \"remote\");\n      }\n      if (onDocUpdate) {\n        this.#onRichDocUpdate = onDocUpdate;\n        this.doc.on(\"update\", this.#onRichDocUpdate);\n      }\n\n      // Note: Awareness handler is registered separately via RichModeSync.setupAwarenessHandler\n      // to ensure proper cleanup. Don't register it here to avoid double registration.\n\n      return {\n        xmlFragment: this.xmlFragment,\n        awareness: this.awareness,\n        hasXmlContent: this.xmlFragment.length > 0\n      };\n    }\n    applyRemoteUpdate(updateBinary) {\n      if (this.doc && updateBinary) {\n        window.Y.applyUpdate(this.doc, updateBinary, \"remote\");\n      }\n    }\n    applyRemoteUpdateWithOrigin(updateBinary, origin) {\n      if (this.doc && updateBinary) {\n        window.Y.applyUpdate(this.doc, updateBinary, origin);\n      }\n    }\n    getText() {\n      return this.text?.toString() ?? \"\";\n    }\n    teardown() {\n      if (this.text && this.textObserver) {\n        this.text.unobserve(this.textObserver);\n      }\n      if (this.doc) {\n        if (this.#onDocUpdate) {\n          this.doc.off(\"update\", this.#onDocUpdate);\n        }\n        if (this.#onRichDocUpdate) {\n          this.doc.off(\"update\", this.#onRichDocUpdate);\n        }\n      }\n      if (this.undoManager) {\n        this.undoManager.destroy();\n        this.undoManager = null;\n      }\n      if (this.awareness) {\n        this.awareness.destroy();\n        this.awareness = null;\n      }\n      if (this.doc) {\n        this.doc.destroy();\n      }\n      this.doc = null;\n      this.text = null;\n      this.xmlFragment = null;\n      this.textObserver = null;\n      this.#onDocUpdate = null;\n      this.#onRichDocUpdate = null;\n    }\n  }\n  _exports.default = YjsDocument;\n});","define(\"discourse/plugins/discourse-shared-edits/discourse/services/shared-edit-manager\", [\"exports\", \"@ember/service\", \"discourse/lib/ajax-error\", \"discourse-i18n\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/debug\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/encoding-utils\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/markdown-sync\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/network-manager\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/protocol\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/rich-mode-sync\", \"discourse/plugins/discourse-shared-edits/discourse/lib/shared-edits/yjs-document\"], function (_exports, _service, _ajaxError, _discourseI18n, _debug, _encodingUtils, _markdownSync, _networkManager, _protocol, _richModeSync, _yjsDocument) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"capturePM\", {\n    enumerable: true,\n    get: function () {\n      return _yjsDocument.capturePM;\n    }\n  });\n  Object.defineProperty(_exports, \"clearPM\", {\n    enumerable: true,\n    get: function () {\n      return _yjsDocument.clearPM;\n    }\n  });\n  Object.defineProperty(_exports, \"clearRichModeSerializers\", {\n    enumerable: true,\n    get: function () {\n      return _yjsDocument.clearRichModeSerializers;\n    }\n  });\n  _exports.default = void 0;\n  Object.defineProperty(_exports, \"ensureYjsProsemirrorLoaded\", {\n    enumerable: true,\n    get: function () {\n      return _yjsDocument.ensureYjsProsemirrorLoaded;\n    }\n  });\n  Object.defineProperty(_exports, \"getMarkdownFromView\", {\n    enumerable: true,\n    get: function () {\n      return _yjsDocument.getMarkdownFromView;\n    }\n  });\n  Object.defineProperty(_exports, \"getPM\", {\n    enumerable: true,\n    get: function () {\n      return _yjsDocument.getPM;\n    }\n  });\n  Object.defineProperty(_exports, \"setCapturedMarkdown\", {\n    enumerable: true,\n    get: function () {\n      return _yjsDocument.setCapturedMarkdown;\n    }\n  });\n  Object.defineProperty(_exports, \"setConvertToMarkdown\", {\n    enumerable: true,\n    get: function () {\n      return _yjsDocument.setConvertToMarkdown;\n    }\n  });\n  Object.defineProperty(_exports, \"setProsemirrorViewGetter\", {\n    enumerable: true,\n    get: function () {\n      return _yjsDocument.setProsemirrorViewGetter;\n    }\n  });\n  Object.defineProperty(_exports, \"triggerYjsLoad\", {\n    enumerable: true,\n    get: function () {\n      return _yjsDocument.triggerYjsLoad;\n    }\n  });\n  /**\n   * SharedEditManager - Orchestrator service for collaborative editing.\n   *\n   * This service coordinates the helper modules for shared editing:\n   * - YjsDocument: Y.Doc lifecycle management\n   * - NetworkManager: API calls and MessageBus\n   * - MarkdownSync: Textarea synchronization\n   * - RichModeSync: ProseMirror integration\n   *\n   * Public API:\n   * - subscribe(postId, opts): Start editing a post\n   * - finalizeSubscription(): Complete setup after composer opens\n   * - commit(): Flush updates and close editing session\n   * - syncFromComposerValue(value): Sync composer changes to Yjs\n   */\n\n  // Re-export for external consumers (initializers, prosemirror extension)\n\n  const TEXTAREA_SELECTOR = \"#reply-control textarea.d-editor-input\";\n  // Exposed through `sessionState` for lifecycle observability in tests/debugging.\n  const SESSION_STATE = Object.freeze({\n    IDLE: \"idle\",\n    SUBSCRIBING: \"subscribing\",\n    ACTIVE: \"active\",\n    RESYNCING: \"resyncing\",\n    COMMITTING: \"committing\"\n  });\n  const INVALID_UPDATE_ALERT_COOLDOWN_MS = 3000;\n  class SharedEditManager extends _service.default {\n    static {\n      dt7948.g(this.prototype, \"composer\", [_service.service]);\n    }\n    #composer = (dt7948.i(this, \"composer\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"dialog\", [_service.service]);\n    }\n    #dialog = (dt7948.i(this, \"dialog\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"messageBus\", [_service.service]);\n    }\n    #messageBus = (dt7948.i(this, \"messageBus\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    // State\n    currentPostId = null;\n    suppressComposerChange = false;\n    pendingComposerReply = null;\n\n    // Helper instances\n    #yjsDocument = null;\n    #networkManager = null;\n    #markdownSync = null;\n    #richModeSync = null;\n\n    // Internal state\n    #composerReady = false;\n    #composerObserverAttached = false;\n    #richModeFailed = false;\n    #sessionState = SESSION_STATE.IDLE;\n    #commitPromise = null;\n    #lastInvalidUpdateAlertAt = 0;\n\n    // Event handlers\n    #handleDocUpdate = (update, origin) => {\n      // Skip remote updates (already applied, don't need to send back)\n      if (origin === \"remote\" || origin === _protocol.SHARED_EDITS_MESSAGE_ACTIONS.RESYNC) {\n        return;\n      }\n\n      // In markdown mode, only queue updates from the service or undo manager\n      // In rich mode, queue all local updates (from ProseMirror y-sync plugin\n      // and xmlSync for Y.Text sync from xmlFragment)\n      if (!this.isRichMode) {\n        if (origin !== this && origin !== this.#yjsDocument?.undoManager) {\n          return;\n        }\n      }\n      this.#networkManager?.queueUpdate(update);\n    };\n    #handleTextChange = (event, transaction) => {\n      if (this.isRichMode) {\n        return;\n      }\n      if (!this.#markdownSync) {\n        return;\n      }\n\n      // Disable spellcheck during remote updates\n      if (transaction?.origin?.type === \"remote\") {\n        this.#markdownSync.temporarilyDisableSpellcheck();\n      }\n\n      // For local changes, capture relative selection before applying changes\n      // For remote changes, we use transformSelection with the delta instead\n      const isRemote = transaction?.origin?.type === \"remote\";\n      if (!isRemote && !this.#markdownSync.isSelecting) {\n        this.#markdownSync.setPendingRelativeSelection(this.#markdownSync.captureRelativeSelection(this.#yjsDocument?.text));\n      }\n      this.#markdownSync.handleTextChange(event, transaction, this.#yjsDocument?.text, this.#yjsDocument?.doc, fn => {\n        this.suppressComposerChange = true;\n        try {\n          fn();\n        } finally {\n          this.suppressComposerChange = false;\n        }\n      });\n    };\n    #handleAwarenessUpdate = (changes, origin) => {\n      // Wrap in try-catch to prevent errors during teardown from propagating\n      // as global errors. During cleanup, the awareness may emit events with\n      // malformed data which we should silently ignore.\n      try {\n        if (this.#isCommitting() || origin === \"sync\" || !this.#richModeSync || !this.#yjsDocument?.awareness) {\n          return;\n        }\n\n        // Guard against null/undefined changes object\n        if (!changes || typeof changes !== \"object\") {\n          return;\n        }\n        const {\n          added,\n          updated,\n          removed\n        } = changes;\n        const clientIds = [...(added || []), ...(updated || []), ...(removed || [])];\n        if (clientIds.length > 0) {\n          const update = this.#richModeSync.encodeAwarenessUpdate(this.#yjsDocument.awareness, clientIds);\n          if (update) {\n            this.#networkManager?.queueAwarenessUpdate(update);\n          }\n        }\n      } catch {\n        // Silently ignore errors during teardown/cleanup\n      }\n    };\n    #handleRemoteMessage = message => {\n      if (this.#isCommitting() || !this.#yjsDocument?.doc) {\n        return;\n      }\n\n      // Handle awareness updates in rich mode\n      if (this.isRichMode && message.awarenessBinary && this.#richModeSync) {\n        this.#richModeSync.applyAwarenessUpdate(this.#yjsDocument.awareness, message.awarenessBinary);\n      }\n\n      // Apply document update\n      if (message.updateBinary) {\n        if (this.isRichMode) {\n          this.#yjsDocument.applyRemoteUpdate(message.updateBinary);\n        } else {\n          // Parse cursor for markdown mode\n          const cursor = this.#markdownSync?.deserializeCursorPayload(message.cursor);\n          this.#yjsDocument.applyRemoteUpdateWithOrigin(message.updateBinary, {\n            type: \"remote\",\n            client_id: message.client_id,\n            user_id: message.user_id,\n            username: message.username,\n            cursor\n          });\n        }\n\n        // Notify network manager that a remote update was applied\n        // This allows it to re-verify state hash sync\n        this.#networkManager?.notifyRemoteUpdateApplied();\n      }\n    };\n    #handleSyncAnomaly = () => {\n      if (this.#isCommitting()) {\n        return;\n      }\n      this.#handleResync();\n    };\n    #handleResync = async () => {\n      if (this.#isCommitting()) {\n        return;\n      }\n\n      // Guard against concurrent/duplicate resyncs\n      if (this.#sessionState === SESSION_STATE.RESYNCING) {\n        return;\n      }\n      this.#setSessionState(SESSION_STATE.RESYNCING);\n      const postId = this.currentPostId || this.#postId;\n      if (!postId) {\n        this.#setSessionState(SESSION_STATE.IDLE);\n        return;\n      }\n\n      // Clear pending state before fetching new state\n      if (this.#networkManager) {\n        this.#networkManager.pendingUpdates = [];\n        this.#networkManager.pendingAwarenessUpdate = null;\n      }\n      try {\n        const data = await this.#networkManager?.fetchState(postId);\n        if (!this.composer.model || this.isDestroying || this.isDestroyed) {\n          return;\n        }\n\n        // In rich mode with an existing Y.Doc, apply the server state as an update\n        // rather than creating a new Y.Doc. This preserves the ProseMirror binding.\n        if (this.isRichMode && this.#yjsDocument?.doc) {\n          try {\n            const Y = window.SharedEditsYjs?.Y || window.Y;\n            if (Y && data.state) {\n              const serverUpdate = (0, _encodingUtils.base64ToUint8Array)(data.state);\n              // Apply server state as update - CRDT will merge\n              Y.applyUpdate(this.#yjsDocument.doc, serverUpdate, _protocol.SHARED_EDITS_MESSAGE_ACTIONS.RESYNC);\n              (0, _debug.debugLog)(\"Resync: applied server update to existing doc\");\n            }\n\n            // Skip state vector validation for the next update after resync\n            // because the client's doc now has merged state that the server doesn't know about\n            if (this.#networkManager) {\n              this.#networkManager.skipNextStateVector = true;\n            }\n            if (this.#richModeSync && this.#yjsDocument?.xmlFragment) {\n              this.#richModeSync.syncYTextFromXmlFragment(this.#yjsDocument.xmlFragment, this.#yjsDocument.text, this.#yjsDocument.doc, {\n                consumeMarkdown: true\n              });\n            }\n            this.pendingComposerReply = this.#yjsDocument?.getText() ?? data.raw ?? \"\";\n            this.#composerReady = true; // Keep ready state so editing can continue\n\n            this.#queueMissingUpdatesFromServerState(data.state);\n\n            // Re-subscribe to MessageBus with new last_id\n            this.#networkManager?.subscribe(postId, this.#networkManager.messageBusLastId ?? -1);\n          } catch (updateError) {\n            // If applying update fails, fall back to full setup\n            (0, _debug.debugError)(\"Resync: failed to apply update, falling back:\", updateError);\n            await this.#setupDoc(data.state, data.raw);\n            this.pendingComposerReply = this.#yjsDocument?.getText() ?? data.raw ?? \"\";\n            this.#composerReady = false;\n            await this.finalizeSubscription();\n          }\n        } else {\n          // Markdown mode or no existing doc - full setup\n          await this.#setupDoc(data.state, data.raw);\n          let pendingText = this.#yjsDocument?.getText() ?? data.raw ?? \"\";\n          const localText = this.composer?.model?.reply;\n          if (typeof localText === \"string\" && localText !== pendingText) {\n            this.#yjsDocument?.doc?.transact(() => (0, _encodingUtils.applyDiff)(this.#yjsDocument.text, pendingText, localText), this);\n            pendingText = localText;\n          }\n          this.pendingComposerReply = pendingText;\n          this.#composerReady = false;\n          this.#queueMissingUpdatesFromServerState(data.state);\n          await this.finalizeSubscription();\n        }\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n      } finally {\n        if (this.#sessionState === SESSION_STATE.RESYNCING) {\n          this.#setSessionState(this.currentPostId ? SESSION_STATE.ACTIVE : SESSION_STATE.IDLE);\n        }\n      }\n    };\n    #handleRichModeError = () => {\n      // Attempt final sync before giving up\n      if (this.#richModeSync && this.#yjsDocument) {\n        try {\n          this.#richModeSync.flushXmlSync();\n          this.#richModeSync.syncYTextFromXmlFragment(this.#yjsDocument.xmlFragment, this.#yjsDocument.text, this.#yjsDocument.doc, {\n            consumeMarkdown: true\n          });\n        } catch (e) {\n          (0, _debug.debugError)(\"Final sync failed during rich mode error:\", e);\n        }\n      }\n      this.#richModeFailed = true;\n      if (this.composer?.model?.action === \"sharedEdit\") {\n        this.composer.close();\n      } else {\n        this.commit();\n      }\n    };\n    willDestroy() {\n      this.#cleanup();\n      super.willDestroy(...arguments);\n    }\n\n    // Expose doc/text for external access (tests, prosemirror extension)\n    get doc() {\n      return this.#yjsDocument?.doc ?? null;\n    }\n    get text() {\n      return this.#yjsDocument?.text ?? null;\n    }\n    get awareness() {\n      return this.#yjsDocument?.awareness ?? null;\n    }\n    get xmlFragment() {\n      return this.#yjsDocument?.xmlFragment ?? null;\n    }\n    get undoManager() {\n      return this.#yjsDocument?.undoManager ?? null;\n    }\n    get cursorOverlay() {\n      return this.#markdownSync?.cursorOverlay ?? null;\n    }\n    get ajaxInProgress() {\n      return this.#networkManager?.ajaxInProgress ?? false;\n    }\n    get inFlightRequest() {\n      return this.#networkManager?.inFlightRequest;\n    }\n    get messageBusLastId() {\n      return this.#networkManager?.messageBusLastId;\n    }\n    get pendingUpdates() {\n      return this.#networkManager?.pendingUpdates ?? [];\n    }\n    get isRichMode() {\n      if (this.#richModeFailed) {\n        return false;\n      }\n      return this.siteSettings.shared_edits_editor_mode === \"rich\";\n    }\n    get sessionState() {\n      return this.#sessionState;\n    }\n\n    // Public API\n\n    async subscribe(postId, {\n      preOpen = false\n    } = {}) {\n      let data;\n      try {\n        postId = postId || this.#postId;\n        if (!postId) {\n          return;\n        }\n        if (this.#networkManager?.ajaxInProgress && this.currentPostId !== postId) {\n          return;\n        }\n\n        // Already subscribed to this post\n        if (this.currentPostId === postId && this.#yjsDocument?.doc) {\n          if (!preOpen) {\n            await this.finalizeSubscription();\n          }\n          return {\n            reply: this.pendingComposerReply ?? this.#yjsDocument?.getText()\n          };\n        }\n        this.#initializeHelpers();\n        this.#setSessionState(SESSION_STATE.SUBSCRIBING);\n        data = await this.#networkManager.fetchState(postId);\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n        return;\n      }\n      try {\n        if (this.isDestroying || this.isDestroyed || this.#postId && this.#postId !== postId) {\n          return;\n        }\n        this.currentPostId = postId;\n        await this.#setupDoc(data.state, data.raw);\n        this.pendingComposerReply = this.#yjsDocument?.getText() ?? data.raw ?? \"\";\n        this.#composerReady = false;\n        if (!preOpen) {\n          await this.finalizeSubscription();\n        }\n        return {\n          reply: this.pendingComposerReply\n        };\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n        return;\n      }\n    }\n    async finalizeSubscription() {\n      const postId = this.currentPostId || this.#postId;\n      if (!postId || !this.#yjsDocument?.doc || this.isDestroying || this.isDestroyed) {\n        return;\n      }\n      if (!this.isRichMode) {\n        await this.#waitForTextarea();\n      }\n      if (this.#syncComposerFromDoc()) {\n        this.pendingComposerReply = null;\n        this.#composerReady = true;\n      }\n      if (!this.isRichMode && this.#markdownSync) {\n        this.#markdownSync.attach(this.#yjsDocument.doc, this.#yjsDocument.text, this.#yjsDocument.undoManager);\n        this.#markdownSync.onSelectionEnd = () => {\n          this.#markdownSync.syncTextareaAfterSelection(this.#yjsDocument.text, fn => {\n            this.suppressComposerChange = true;\n            try {\n              fn();\n            } finally {\n              this.suppressComposerChange = false;\n            }\n          });\n        };\n      }\n      this.#attachComposerObserver();\n      this.#networkManager?.subscribe(postId, this.#networkManager.messageBusLastId ?? -1);\n      this.#setSessionState(SESSION_STATE.ACTIVE);\n    }\n    async commit() {\n      // Re-entrancy guard: if already committing, return the same promise\n      if (this.#commitPromise) {\n        return this.#commitPromise;\n      }\n      const postId = this.currentPostId || this.#postId;\n      if (!postId) {\n        return;\n      }\n      this.#setSessionState(SESSION_STATE.COMMITTING);\n      this.#commitPromise = this.#doCommit(postId);\n      try {\n        return await this.#commitPromise;\n      } finally {\n        this.#commitPromise = null;\n      }\n    }\n    async #doCommit(postId) {\n      try {\n        // Flush any debounced XML sync before flushing updates\n        if (this.isRichMode && this.#richModeSync) {\n          this.#richModeSync.flushXmlSync();\n        }\n\n        // Sync any pending rich mode changes\n        if (this.isRichMode && this.#richModeSync && this.#yjsDocument) {\n          const didSync = this.#richModeSync.syncYTextFromXmlFragment(this.#yjsDocument.xmlFragment, this.#yjsDocument.text, this.#yjsDocument.doc, {\n            consumeMarkdown: true\n          });\n          if (didSync && this.#networkManager?.pendingUpdates.length === 0) {\n            await new Promise(resolve => setTimeout(resolve, 10));\n          }\n        }\n        const flushResult = await this.#networkManager?.flushPendingUpdates(postId, {\n          isRichMode: this.isRichMode,\n          cursorPayload: this.#markdownSync?.buildCursorPayload(this.#yjsDocument?.text),\n          getClientId: () => this.messageBus.clientId,\n          allowBlankState: this.#shouldAllowBlankState(),\n          getDoc: () => this.#yjsDocument?.doc\n        });\n\n        // If a resync happened during flush, abort commit - the state is stale\n        if (flushResult?.resynced) {\n          this.#setSessionState(SESSION_STATE.ACTIVE);\n          return;\n        }\n        this.#detachComposerObserver();\n        this.#networkManager?.unsubscribe(postId);\n        await this.#networkManager?.commitEdits(postId);\n        this.#cleanup();\n      } catch (e) {\n        this.#setSessionState(SESSION_STATE.ACTIVE);\n        (0, _ajaxError.popupAjaxError)(e);\n      }\n    }\n    syncFromComposerValue(nextValue) {\n      if (this.isRichMode || !this.#composerReady || !this.#yjsDocument?.text || !this.#yjsDocument?.doc || this.suppressComposerChange) {\n        return;\n      }\n      const next = nextValue ?? \"\";\n      const current = this.#yjsDocument.text.toString();\n      if (current === next) {\n        return;\n      }\n      this.#yjsDocument.doc.transact(() => (0, _encodingUtils.applyDiff)(this.#yjsDocument.text, current, next), this);\n    }\n\n    // Private orchestration\n\n    #initializeHelpers() {\n      // Clean up any existing helpers\n      this.#cleanup();\n      this.#yjsDocument = new _yjsDocument.default(this);\n      this.#networkManager = new _networkManager.default(this, {\n        onRemoteMessage: this.#handleRemoteMessage,\n        onResync: this.#handleResync,\n        getRecoveryText: () => {\n          if (this.isRichMode) {\n            // Prefer live ProseMirror serialization for recovery text.\n            const markdown = (0, _yjsDocument.getMarkdownFromView)({\n              consumeCapture: true\n            });\n            if (markdown !== null) {\n              return markdown;\n            }\n            if (this.#richModeSync && this.#yjsDocument?.xmlFragment && this.#yjsDocument?.text && this.#yjsDocument?.doc) {\n              this.#richModeSync.syncYTextFromXmlFragment(this.#yjsDocument.xmlFragment, this.#yjsDocument.text, this.#yjsDocument.doc, {\n                consumeMarkdown: true\n              });\n            }\n\n            // Fall back to Y.Text after forcing a sync from the view/XML fragment.\n            return this.#yjsDocument?.text?.toString() ?? null;\n          }\n          return this.composer.model?.reply ?? null;\n        }\n      });\n      this.#networkManager.onSendUpdates = () => this.#sendUpdates();\n      if (this.isRichMode) {\n        this.#richModeSync = new _richModeSync.default(this, {\n          onError: this.#handleRichModeError,\n          onSyncAnomaly: this.#handleSyncAnomaly\n        });\n      } else {\n        this.#markdownSync = new _markdownSync.default(this);\n      }\n    }\n    async #setupDoc(state, raw) {\n      const callbacks = {\n        onDocUpdate: this.#handleDocUpdate,\n        onTextObserve: this.#handleTextChange,\n        onRichModeFailed: () => {\n          this.#richModeFailed = true;\n          // Clean up rich mode sync and create markdown sync instead\n          if (this.#richModeSync) {\n            this.#richModeSync.teardown(null, null);\n            this.#richModeSync = null;\n          }\n          if (!this.#markdownSync) {\n            this.#markdownSync = new _markdownSync.default(this);\n          }\n        },\n        undoOrigin: this\n      };\n\n      // Note: Awareness handler is registered via setupAwarenessHandler below\n      // to ensure proper cleanup (single registration point).\n\n      await this.#yjsDocument.setup(state, raw, callbacks);\n\n      // Rich mode additional setup\n      if (this.isRichMode && this.#richModeSync && this.#yjsDocument.xmlFragment) {\n        const hasXmlContent = this.#yjsDocument.xmlFragment.length > 0;\n        this.#richModeSync.setupYjsState(this.#yjsDocument.xmlFragment, this.#yjsDocument.awareness, !hasXmlContent);\n        this.#richModeSync.setupXmlFragmentObserver(this.#yjsDocument.xmlFragment, () => this.#syncYTextFromXmlFragment());\n        this.#richModeSync.setupAwarenessHandler(this.#yjsDocument.awareness, this.#handleAwarenessUpdate);\n      }\n    }\n    #syncYTextFromXmlFragment() {\n      if (!this.#richModeSync || !this.#yjsDocument || this.isDestroying || this.isDestroyed) {\n        return false;\n      }\n      return this.#richModeSync.syncYTextFromXmlFragment(this.#yjsDocument.xmlFragment, this.#yjsDocument.text, this.#yjsDocument.doc);\n    }\n    #queueMissingUpdatesFromServerState(serverState) {\n      if (!serverState || !this.#yjsDocument?.doc || !this.#networkManager) {\n        return;\n      }\n      const Y = window.SharedEditsYjs?.Y || window.Y;\n      if (!Y?.Doc || !Y?.applyUpdate || !Y?.encodeStateVector || !Y?.encodeStateAsUpdate) {\n        return;\n      }\n      let serverDoc;\n      try {\n        serverDoc = new Y.Doc();\n        const serverUpdate = (0, _encodingUtils.base64ToUint8Array)(serverState);\n        if (serverUpdate?.length) {\n          Y.applyUpdate(serverDoc, serverUpdate, \"remote\");\n        }\n        const serverVector = Y.encodeStateVector(serverDoc);\n        const missingUpdate = Y.encodeStateAsUpdate(this.#yjsDocument.doc, serverVector);\n        if (missingUpdate?.length) {\n          this.#networkManager.queueUpdate(missingUpdate);\n        }\n      } catch (e) {\n        (0, _debug.debugError)(\"Failed to queue missing updates:\", e);\n      } finally {\n        serverDoc?.destroy?.();\n      }\n    }\n    #cleanup() {\n      this.#markdownSync?.detach();\n      this.#richModeSync?.teardown(this.#yjsDocument?.xmlFragment, this.#yjsDocument?.awareness);\n      this.#yjsDocument?.teardown();\n      this.#networkManager?.teardown();\n      this.#detachComposerObserver();\n      this.#yjsDocument = null;\n      this.#networkManager = null;\n      this.#markdownSync = null;\n      this.#richModeSync = null;\n      this.currentPostId = null;\n      this.pendingComposerReply = null;\n      this.#composerReady = false;\n      this.#richModeFailed = false;\n      this.#sessionState = SESSION_STATE.IDLE;\n      this.#commitPromise = null;\n      this.#lastInvalidUpdateAlertAt = 0;\n      this.suppressComposerChange = false;\n    }\n\n    // Test support: force cleanup of all state without committing\n    // Use this in test teardown to prevent state leakage between tests\n    resetForTests() {\n      if (this.currentPostId) {\n        this.#networkManager?.unsubscribe(this.currentPostId);\n      }\n      this.#cleanup();\n    }\n    async #sendUpdates() {\n      if (this.#isCommitting() || this.isDestroying || this.isDestroyed) {\n        return;\n      }\n      const postId = this.currentPostId || this.#postId;\n      if (!postId || !this.#yjsDocument?.doc) {\n        return;\n      }\n\n      // In rich mode, sync Y.Text from xmlFragment BEFORE sending updates\n      // This ensures the server gets the correct text state\n      if (this.isRichMode && this.#richModeSync && this.#yjsDocument?.xmlFragment) {\n        this.#richModeSync.syncYTextFromXmlFragment(this.#yjsDocument.xmlFragment, this.#yjsDocument.text, this.#yjsDocument.doc);\n      }\n      try {\n        await this.#networkManager?.sendUpdates(postId, {\n          isRichMode: this.isRichMode,\n          cursorPayload: this.#markdownSync?.buildCursorPayload(this.#yjsDocument?.text),\n          getClientId: () => this.messageBus.clientId,\n          allowBlankState: this.#shouldAllowBlankState(),\n          getDoc: () => this.#yjsDocument?.doc\n        });\n      } catch (e) {\n        if (e?.jqXHR?.responseJSON?.error === _protocol.SHARED_EDITS_ERRORS.INVALID_UPDATE) {\n          this.#showInvalidUpdateAlert();\n        }\n\n        // Errors are handled in NetworkManager, but log for debugging\n        (0, _debug.debugError)(\"Failed to send updates:\", e);\n      }\n    }\n\n    // Composer integration\n\n    #syncComposerFromDoc() {\n      if (!this.composer.model || !this.#yjsDocument?.text) {\n        return false;\n      }\n      const next = this.pendingComposerReply ?? this.#yjsDocument.text.toString();\n      if (this.composer.model.reply === next) {\n        return true;\n      }\n      this.suppressComposerChange = true;\n      try {\n        this.composer.model.set(\"reply\", next);\n      } finally {\n        this.suppressComposerChange = false;\n      }\n      return true;\n    }\n    #attachComposerObserver() {\n      if (this.#composerObserverAttached) {\n        return;\n      }\n      this.addObserver(\"composer.model.reply\", this, this.#onComposerChange);\n      this.#composerObserverAttached = true;\n    }\n    #detachComposerObserver() {\n      if (!this.#composerObserverAttached) {\n        return;\n      }\n      this.removeObserver(\"composer.model.reply\", this, this.#onComposerChange);\n      this.#composerObserverAttached = false;\n    }\n    #onComposerChange() {\n      if (!this.composer.model) {\n        return;\n      }\n      this.syncFromComposerValue(this.composer.model.reply || \"\");\n    }\n    #setSessionState(nextState) {\n      this.#sessionState = nextState;\n    }\n    #isCommitting() {\n      return this.#sessionState === SESSION_STATE.COMMITTING;\n    }\n    #showInvalidUpdateAlert() {\n      const now = Date.now();\n      if (now - this.#lastInvalidUpdateAlertAt < INVALID_UPDATE_ALERT_COOLDOWN_MS) {\n        return;\n      }\n      this.#lastInvalidUpdateAlertAt = now;\n      this.dialog.alert((0, _discourseI18n.i18n)(\"shared_edits.errors.invalid_update\"));\n    }\n    #shouldAllowBlankState() {\n      const text = this.#yjsDocument?.text;\n      if (!text || typeof text.toString !== \"function\") {\n        return false;\n      }\n      return text.toString().length === 0;\n    }\n    async #waitForTextarea(maxWait = 2000) {\n      const startTime = Date.now();\n      while (Date.now() - startTime < maxWait) {\n        if (this.isDestroying || this.isDestroyed) {\n          return;\n        }\n        const textarea = document.querySelector(TEXTAREA_SELECTOR);\n        if (textarea) {\n          return;\n        }\n        await new Promise(resolve => setTimeout(resolve, 10));\n      }\n    }\n    get #postId() {\n      return this.composer.model?.post?.id;\n    }\n  }\n  _exports.default = SharedEditManager;\n});"],"mappings":"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","ignoreList":[]}