@powerhousedao/powerhouse-vetra-packages 6.0.0-dev.200 → 6.0.0-dev.201
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/{connect-D2wTJ-7r-9qKvpDtT.js → connect-C_dcbzBz-_mmjRXjN.js} +31 -13
- package/dist/browser/connect-C_dcbzBz-_mmjRXjN.js.map +1 -0
- package/dist/browser/{document-drive-DX2SuKPv.js → document-drive--1eiReEv.js} +10 -4
- package/dist/browser/{document-drive-DX2SuKPv.js.map → document-drive--1eiReEv.js.map} +1 -1
- package/dist/browser/document-models/index.d.ts.map +1 -1
- package/dist/browser/document-models/index.js +1 -1
- package/dist/browser/{editor-BXiVwTeL.js → editor-C6CqSfNd.js} +4 -4
- package/dist/browser/{editor-BXiVwTeL.js.map → editor-C6CqSfNd.js.map} +1 -1
- package/dist/browser/{editor-BF5LL5_x.js → editor-WMMn3zMX.js} +3 -3
- package/dist/browser/{editor-BF5LL5_x.js.map → editor-WMMn3zMX.js.map} +1 -1
- package/dist/browser/editors/document-model-editor/module.js +1 -1
- package/dist/browser/editors/generic-drive-explorer/index.js +3 -3
- package/dist/browser/editors/generic-drive-explorer/module.js +1 -1
- package/dist/browser/{folder-view-tBo9p46O.js → folder-view-D3QhCT-8.js} +2 -2
- package/dist/browser/{folder-view-tBo9p46O.js.map → folder-view-D3QhCT-8.js.map} +1 -1
- package/dist/browser/index.js +1 -1
- package/dist/node/{connect-D2wTJ-7r-BDoumAyA.mjs → connect-C_dcbzBz-DUb3vyN_.mjs} +31 -13
- package/dist/node/connect-C_dcbzBz-DUb3vyN_.mjs.map +1 -0
- package/dist/node/{document-drive-C0aYprpL.mjs → document-drive-CuVMw83g.mjs} +10 -4
- package/dist/node/{document-drive-C0aYprpL.mjs.map → document-drive-CuVMw83g.mjs.map} +1 -1
- package/dist/node/document-models/index.d.mts.map +1 -1
- package/dist/node/document-models/index.mjs +1 -1
- package/dist/node/{editor-Bx_dNCfj.mjs → editor-CYjUuoto.mjs} +4 -4
- package/dist/node/{editor-Bx_dNCfj.mjs.map → editor-CYjUuoto.mjs.map} +1 -1
- package/dist/node/{editor-Ix0XVqXo.mjs → editor-DuK8Xe_9.mjs} +3 -3
- package/dist/node/{editor-Ix0XVqXo.mjs.map → editor-DuK8Xe_9.mjs.map} +1 -1
- package/dist/node/editors/document-model-editor/module.mjs +1 -1
- package/dist/node/editors/generic-drive-explorer/index.mjs +3 -3
- package/dist/node/editors/generic-drive-explorer/module.mjs +1 -1
- package/dist/node/{folder-view-CoiPs8OT.mjs → folder-view-CfEXe79b.mjs} +2 -2
- package/dist/node/{folder-view-CoiPs8OT.mjs.map → folder-view-CfEXe79b.mjs.map} +1 -1
- package/dist/node/index.mjs +1 -1
- package/package.json +5 -5
- package/dist/browser/connect-D2wTJ-7r-9qKvpDtT.js.map +0 -1
- package/dist/node/connect-D2wTJ-7r-BDoumAyA.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect-C_dcbzBz-_mmjRXjN.js","names":["lzString","driveCollectionId$1","useIsomorphicLayoutEffect","useIsomorphicLayoutEffect","memo","memo","React"],"sources":["../../../reactor-browser/dist/make-ph-event-functions-Cr4GqOTT.js","../../../reactor/dist/index.js","../../../reactor-browser/dist/document-by-id-CDLUqru5.js","../../../reactor-browser/dist/renown-CV_45Xc1.js","../../../../node_modules/.pnpm/slug@11.0.1/node_modules/slug/slug.js","../../../../node_modules/.pnpm/lz-string@1.5.0/node_modules/lz-string/libs/lz-string.js","../../../reactor-browser/dist/index.js","../../../../node_modules/.pnpm/react-hook-form@7.71.2_react@19.2.4/node_modules/react-hook-form/dist/index.esm.mjs","../../../../node_modules/.pnpm/lodash.debounce@4.0.8/node_modules/lodash.debounce/index.js","../../../../node_modules/.pnpm/usehooks-ts@3.1.1_react@19.2.4/node_modules/usehooks-ts/dist/index.js","../../../../node_modules/.pnpm/@tanstack+virtual-core@3.13.19/node_modules/@tanstack/virtual-core/dist/esm/utils.js","../../../../node_modules/.pnpm/@tanstack+virtual-core@3.13.19/node_modules/@tanstack/virtual-core/dist/esm/index.js","../../../../node_modules/.pnpm/@tanstack+react-virtual@3.13.19_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@tanstack/react-virtual/dist/esm/index.js","../../../design-system/dist/connect-C_dcbzBz.js"],"sourcesContent":["import { useSyncExternalStore } from \"react\";\nimport { capitalCase } from \"change-case\";\n//#region src/hooks/make-ph-event-functions.ts\nconst isServer = typeof window === \"undefined\";\nfunction makePHEventFunctions(key) {\n\tconst setEventName = `ph:set${capitalCase(key)}`;\n\tconst updateEventName = `ph:${key}Updated`;\n\tfunction setValue(value) {\n\t\tif (isServer) return;\n\t\tconst event = new CustomEvent(setEventName, { detail: { [key]: value } });\n\t\twindow.dispatchEvent(event);\n\t}\n\tfunction dispatchUpdatedEvent() {\n\t\tif (isServer) return;\n\t\tconst event = new CustomEvent(updateEventName);\n\t\twindow.dispatchEvent(event);\n\t}\n\tfunction handleSetValueEvent(event) {\n\t\tif (isServer) return;\n\t\tconst value = event.detail[key];\n\t\tif (!window.ph) window.ph = {};\n\t\twindow.ph[key] = value;\n\t\tdispatchUpdatedEvent();\n\t}\n\tfunction addEventHandler() {\n\t\tif (isServer) return;\n\t\twindow.addEventListener(setEventName, handleSetValueEvent);\n\t}\n\tfunction subscribeToValue(onStoreChange) {\n\t\tif (isServer) return () => {};\n\t\twindow.addEventListener(updateEventName, onStoreChange);\n\t\treturn () => {\n\t\t\twindow.removeEventListener(updateEventName, onStoreChange);\n\t\t};\n\t}\n\tfunction getSnapshot() {\n\t\tif (isServer) return;\n\t\tif (!window.ph) {\n\t\t\tconsole.warn(`ph global store is not initialized. Did you call set${capitalCase(key)}?`);\n\t\t\treturn;\n\t\t}\n\t\treturn window.ph[key];\n\t}\n\tfunction getServerSnapshot() {}\n\tfunction useValue() {\n\t\treturn useSyncExternalStore(subscribeToValue, getSnapshot, getServerSnapshot);\n\t}\n\treturn {\n\t\tuseValue,\n\t\tsetValue,\n\t\taddEventHandler\n\t};\n}\n//#endregion\nexport { makePHEventFunctions as t };\n\n//# sourceMappingURL=make-ph-event-functions-Cr4GqOTT.js.map","import { actions, actions as documentActions, createPresignedHeader, defaultBaseState, deriveOperationId, generateId, hashDocumentStateForScope, isUndoRedo } from \"@powerhousedao/shared/document-model\";\nimport { addFile, deleteNode } from \"@powerhousedao/shared/document-drive\";\nimport { v4 } from \"uuid\";\nimport { ConsoleLogger } from \"document-model\";\nimport { Migrator, sql } from \"kysely\";\nimport { RelationalDbProcessor, createRelationalDb } from \"@powerhousedao/shared/processors\";\n//#region \\0rolldown/runtime.js\nvar __defProp = Object.defineProperty;\nvar __exportAll = (all, no_symbols) => {\n\tlet target = {};\n\tfor (var name in all) __defProp(target, name, {\n\t\tget: all[name],\n\t\tenumerable: true\n\t});\n\tif (!no_symbols) __defProp(target, Symbol.toStringTag, { value: \"Module\" });\n\treturn target;\n};\n//#endregion\n//#region src/actions/index.ts\n/**\n* Creates a CREATE_DOCUMENT action for document creation.\n*/\nfunction createDocumentAction(input) {\n\treturn {\n\t\tid: generateId(),\n\t\ttype: \"CREATE_DOCUMENT\",\n\t\tscope: \"document\",\n\t\ttimestampUtcMs: (/* @__PURE__ */ new Date()).toISOString(),\n\t\tinput\n\t};\n}\n/**\n* Creates an UPGRADE_DOCUMENT action to set initial document state.\n*/\nfunction upgradeDocumentAction(input) {\n\treturn {\n\t\tid: generateId(),\n\t\ttype: \"UPGRADE_DOCUMENT\",\n\t\tscope: \"document\",\n\t\ttimestampUtcMs: (/* @__PURE__ */ new Date()).toISOString(),\n\t\tinput\n\t};\n}\n/**\n* Creates a DELETE_DOCUMENT action for document deletion.\n*/\nfunction deleteDocumentAction(documentId) {\n\tconst input = { documentId };\n\treturn {\n\t\tid: generateId(),\n\t\ttype: \"DELETE_DOCUMENT\",\n\t\tscope: \"document\",\n\t\ttimestampUtcMs: (/* @__PURE__ */ new Date()).toISOString(),\n\t\tinput\n\t};\n}\n/**\n* Creates an ADD_RELATIONSHIP action to establish a parent-child relationship.\n*/\nfunction addRelationshipAction(sourceId, targetId, relationshipType = \"child\") {\n\tconst input = {\n\t\tsourceId,\n\t\ttargetId,\n\t\trelationshipType\n\t};\n\treturn {\n\t\tid: generateId(),\n\t\ttype: \"ADD_RELATIONSHIP\",\n\t\tscope: \"document\",\n\t\ttimestampUtcMs: (/* @__PURE__ */ new Date()).toISOString(),\n\t\tinput\n\t};\n}\n/**\n* Creates a REMOVE_RELATIONSHIP action to remove a parent-child relationship.\n*/\nfunction removeRelationshipAction(sourceId, targetId, relationshipType = \"child\") {\n\tconst input = {\n\t\tsourceId,\n\t\ttargetId,\n\t\trelationshipType\n\t};\n\treturn {\n\t\tid: generateId(),\n\t\ttype: \"REMOVE_RELATIONSHIP\",\n\t\tscope: \"document\",\n\t\ttimestampUtcMs: (/* @__PURE__ */ new Date()).toISOString(),\n\t\tinput\n\t};\n}\n//#endregion\n//#region src/core/utils.ts\n/**\n* Validates structural properties shared by all batch requests:\n* duplicate keys, missing dependencies, and dependency cycles.\n*/\nfunction validateBatchStructure(jobs) {\n\tconst keys = /* @__PURE__ */ new Set();\n\tfor (const job of jobs) {\n\t\tif (keys.has(job.key)) throw new Error(`Duplicate plan key: ${job.key}`);\n\t\tkeys.add(job.key);\n\t}\n\tfor (const job of jobs) for (const depKey of job.dependsOn) if (!keys.has(depKey)) throw new Error(`Job '${job.key}' depends on non-existent key: ${depKey}`);\n\tconst visited = /* @__PURE__ */ new Set();\n\tconst recStack = /* @__PURE__ */ new Set();\n\tconst detectCycle = (key) => {\n\t\tvisited.add(key);\n\t\trecStack.add(key);\n\t\tconst job = jobs.find((j) => j.key === key);\n\t\tif (job) {\n\t\t\tfor (const depKey of job.dependsOn) if (!visited.has(depKey)) {\n\t\t\t\tif (detectCycle(depKey)) return true;\n\t\t\t} else if (recStack.has(depKey)) return true;\n\t\t}\n\t\trecStack.delete(key);\n\t\treturn false;\n\t};\n\tfor (const job of jobs) if (!visited.has(job.key)) {\n\t\tif (detectCycle(job.key)) throw new Error(`Dependency cycle detected involving key: ${job.key}`);\n\t}\n}\n/**\n* Validates a batch mutation request for common errors\n*/\nfunction validateBatchRequest(jobs) {\n\tvalidateBatchStructure(jobs);\n\tfor (const job of jobs) if (job.actions.length === 0) throw new Error(`Job '${job.key}' has empty actions array`);\n}\n/**\n* Validates a batch load request for common errors\n*/\nfunction validateBatchLoadRequest(jobs) {\n\tvalidateBatchStructure(jobs);\n\tfor (const job of jobs) if (job.operations.length === 0) throw new Error(`Job '${job.key}' has empty operations array`);\n}\n/**\n* Validates that all actions in a job match the declared scope\n*/\nfunction validateActionScopes(job) {\n\tfor (const action of job.actions) {\n\t\tconst actionScope = action.scope || \"global\";\n\t\tif (actionScope !== job.scope) throw new Error(`Job '${job.key}' declares scope '${job.scope}' but action has scope '${actionScope}'`);\n\t}\n}\n/**\n* Validates that all operations in a job match the declared scope\n*/\nfunction validateOperationScopes(job) {\n\tfor (const operation of job.operations) {\n\t\tconst operationScope = operation.action.scope || \"global\";\n\t\tif (operationScope !== job.scope) throw new Error(`Job '${job.key}' declares scope '${job.scope}' but operation has scope '${operationScope}'`);\n\t}\n}\n/**\n* Performs topological sort on jobs based on dependencies\n*/\nfunction topologicalSort(jobs) {\n\tconst result = [];\n\tconst visited = /* @__PURE__ */ new Set();\n\tconst visit = (key) => {\n\t\tif (visited.has(key)) return;\n\t\tvisited.add(key);\n\t\tconst job = jobs.find((j) => j.key === key);\n\t\tif (job) for (const depKey of job.dependsOn) visit(depKey);\n\t\tresult.push(key);\n\t};\n\tfor (const job of jobs) visit(job.key);\n\treturn result;\n}\n/**\n* Converts an Error or string to ErrorInfo\n*/\nfunction toErrorInfo(error) {\n\tif (error instanceof Error) return {\n\t\tmessage: error.message,\n\t\tstack: error.stack || (/* @__PURE__ */ new Error()).stack || \"\"\n\t};\n\treturn {\n\t\tmessage: error,\n\t\tstack: (/* @__PURE__ */ new Error()).stack || \"\"\n\t};\n}\n/**\n* Filters paged results by document type\n*/\nfunction filterByType(results, type) {\n\treturn {\n\t\tresults: results.results.filter((document) => document.header.documentType === type),\n\t\toptions: results.options,\n\t\tnextCursor: results.nextCursor,\n\t\tnext: results.next ? async () => {\n\t\t\treturn filterByType(await results.next(), type);\n\t\t} : void 0\n\t};\n}\n/**\n* Validates that all operations share the same scope.\n* Throws an error if any operation has a different scope.\n*/\nfunction getSharedOperationScope(operations) {\n\tif (operations.length === 0) throw new Error(\"No operations provided\");\n\tconst baseScope = operations[0].action.scope;\n\tfor (const [index, operation] of operations.entries()) {\n\t\tconst scope = operation.action.scope;\n\t\tif (scope !== baseScope) throw new Error(`All operations in load must share the same scope. Expected '${baseScope}', received '${scope}' at position ${index}`);\n\t}\n\treturn baseScope;\n}\n/**\n* Validates that all actions share the same scope.\n* Throws an error if any action has a different scope.\n*/\nfunction getSharedActionScope(actions) {\n\tif (actions.length === 0) throw new Error(\"No actions provided\");\n\tconst baseScope = actions[0].scope;\n\tfor (const action of actions) if (action.scope !== baseScope) throw new Error(`All actions must share the same scope. Expected '${baseScope}', received '${action.scope}'`);\n\treturn baseScope;\n}\n/**\n* Signs an action with the provided signer.\n* If the action already has valid signatures, it is returned unchanged.\n*/\nconst signAction = async (action, signer, signal) => {\n\tconst existingSignatures = action.context?.signer?.signatures;\n\tif (existingSignatures && existingSignatures.length > 0) return action;\n\tconst signature = await signer.signAction(action, signal);\n\treturn {\n\t\t...action,\n\t\tcontext: {\n\t\t\t...action.context,\n\t\t\tsigner: {\n\t\t\t\tuser: {\n\t\t\t\t\taddress: signer.user?.address || \"\",\n\t\t\t\t\tnetworkId: signer.user?.networkId || \"\",\n\t\t\t\t\tchainId: signer.user?.chainId || 0\n\t\t\t\t},\n\t\t\t\tapp: {\n\t\t\t\t\tname: signer.app?.name || \"\",\n\t\t\t\t\tkey: signer.app?.key || \"\"\n\t\t\t\t},\n\t\t\t\tsignatures: [signature]\n\t\t\t}\n\t\t}\n\t};\n};\n/**\n* Signs multiple actions with the provided signer\n*/\nconst signActions = async (actions, signer, signal) => {\n\treturn Promise.all(actions.map((action) => signAction(action, signer, signal)));\n};\nfunction buildSingleJobMeta(jobId, callerMeta) {\n\treturn {\n\t\t...callerMeta,\n\t\tbatchId: v4(),\n\t\tbatchJobIds: [jobId]\n\t};\n}\n//#endregion\n//#region src/events/types.ts\n/**\n* Custom error class that aggregates multiple errors from event subscribers.\n*/\nvar EventBusAggregateError = class extends Error {\n\terrors;\n\tconstructor(errors) {\n\t\tconst message = `EventBus emit failed with ${errors.length} error(s): ${errors.map((e) => {\n\t\t\tif (e && typeof e === \"object\" && \"message\" in e) return e.message;\n\t\t\treturn String(e);\n\t\t}).join(\"; \")}`;\n\t\tsuper(message);\n\t\tthis.name = \"EventBusAggregateError\";\n\t\tthis.errors = errors;\n\t}\n};\n/**\n* Event types for reactor lifecycle events.\n*/\nconst ReactorEventTypes = {\n\tJOB_PENDING: 10001,\n\tJOB_RUNNING: 10002,\n\tJOB_WRITE_READY: 10003,\n\tJOB_READ_READY: 10004,\n\tJOB_FAILED: 10005\n};\n//#endregion\n//#region src/shared/types.ts\n/**\n* Enum that determines deletion propagation.\n*/\nlet PropagationMode = /* @__PURE__ */ function(PropagationMode) {\n\tPropagationMode[\"None\"] = \"none\";\n\tPropagationMode[\"Cascade\"] = \"cascade\";\n\treturn PropagationMode;\n}({});\n/**\n* Enum that describes the type of relationship change.\n*/\nlet RelationshipChangeType = /* @__PURE__ */ function(RelationshipChangeType) {\n\tRelationshipChangeType[\"Added\"] = \"added\";\n\tRelationshipChangeType[\"Removed\"] = \"removed\";\n\treturn RelationshipChangeType;\n}({});\n/**\n* Job execution statuses\n*/\nlet JobStatus = /* @__PURE__ */ function(JobStatus) {\n\t/** Job is queued but not yet started */\n\tJobStatus[\"PENDING\"] = \"PENDING\";\n\t/** Job is currently being executed */\n\tJobStatus[\"RUNNING\"] = \"RUNNING\";\n\t/** Operations have been written to the operation store (JOB_WRITE_READY event) */\n\tJobStatus[\"WRITE_READY\"] = \"WRITE_READY\";\n\t/** Read models have finished indexing operations (JOB_READ_READY event) */\n\tJobStatus[\"READ_READY\"] = \"READ_READY\";\n\t/** Job failed (may be retried) */\n\tJobStatus[\"FAILED\"] = \"FAILED\";\n\treturn JobStatus;\n}({});\n//#endregion\n//#region src/shared/awaiter.ts\n/**\n* Checks if a job status is terminal (job has finished).\n* WRITE_READY is not terminal - it's an intermediate state.\n* Only READ_READY and FAILED are truly terminal.\n*/\nfunction isTerminalStatus(status) {\n\treturn status === JobStatus.READ_READY || status === JobStatus.FAILED;\n}\n/**\n* Event-driven implementation of IJobAwaiter.\n* Subscribes to operation events to detect job completion without polling.\n*/\nvar JobAwaiter = class {\n\tpendingJobs = /* @__PURE__ */ new Map();\n\tunsubscribers = [];\n\tconstructor(eventBus, getJobStatus) {\n\t\tthis.eventBus = eventBus;\n\t\tthis.getJobStatus = getJobStatus;\n\t\tthis.subscribeToEvents();\n\t}\n\tsubscribeToEvents() {\n\t\tthis.unsubscribers.push(this.eventBus.subscribe(ReactorEventTypes.JOB_WRITE_READY, async (_type, event) => {\n\t\t\tawait this.handleWriteReady(event);\n\t\t}));\n\t\tthis.unsubscribers.push(this.eventBus.subscribe(ReactorEventTypes.JOB_READ_READY, async (_type, event) => {\n\t\t\tawait this.handleReadReady(event);\n\t\t}));\n\t\tthis.unsubscribers.push(this.eventBus.subscribe(ReactorEventTypes.JOB_FAILED, async (_type, event) => {\n\t\t\tawait this.handleJobFailed(event);\n\t\t}));\n\t}\n\tshutdown() {\n\t\tfor (const unsubscribe of this.unsubscribers) unsubscribe();\n\t\tthis.unsubscribers = [];\n\t\tfor (const [, waiters] of this.pendingJobs) for (const waiter of waiters) waiter.reject(/* @__PURE__ */ new Error(\"JobAwaiter destroyed\"));\n\t\tthis.pendingJobs.clear();\n\t}\n\tasync waitForJob(jobId, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst currentStatus = await this.getJobStatus(jobId, signal);\n\t\tif (isTerminalStatus(currentStatus.status)) return currentStatus;\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst waiter = {\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t\tsignal\n\t\t\t};\n\t\t\tconst existingWaiters = this.pendingJobs.get(jobId) || [];\n\t\t\texistingWaiters.push(waiter);\n\t\t\tthis.pendingJobs.set(jobId, existingWaiters);\n\t\t\tif (signal) {\n\t\t\t\tconst abortHandler = () => {\n\t\t\t\t\tconst waiters = this.pendingJobs.get(jobId);\n\t\t\t\t\tif (waiters) {\n\t\t\t\t\t\tconst index = waiters.indexOf(waiter);\n\t\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\t\twaiters.splice(index, 1);\n\t\t\t\t\t\t\tif (waiters.length === 0) this.pendingJobs.delete(jobId);\n\t\t\t\t\t\t\twaiter.reject(/* @__PURE__ */ new Error(\"Operation aborted\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tsignal.addEventListener(\"abort\", abortHandler, { once: true });\n\t\t\t}\n\t\t});\n\t}\n\tasync handleWriteReady(event) {\n\t\tconst jobId = event.jobId;\n\t\tawait this.checkAndResolveWaiters(jobId);\n\t}\n\tasync handleReadReady(event) {\n\t\tconst jobId = event.jobId;\n\t\tawait this.checkAndResolveWaiters(jobId);\n\t}\n\tasync handleJobFailed(event) {\n\t\tawait this.checkAndResolveWaiters(event.jobId);\n\t}\n\tasync checkAndResolveWaiters(jobId) {\n\t\tconst waiters = this.pendingJobs.get(jobId);\n\t\tif (!waiters || waiters.length === 0) return;\n\t\ttry {\n\t\t\tconst activeWaiters = waiters.filter((w) => !w.signal?.aborted);\n\t\t\tif (activeWaiters.length === 0) {\n\t\t\t\tthis.pendingJobs.delete(jobId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst jobInfo = await this.getJobStatus(jobId, activeWaiters[0].signal);\n\t\t\tif (isTerminalStatus(jobInfo.status)) {\n\t\t\t\tthis.pendingJobs.delete(jobId);\n\t\t\t\tfor (const waiter of activeWaiters) waiter.resolve(jobInfo);\n\t\t\t\tfor (const waiter of waiters) if (waiter.signal?.aborted) waiter.reject(/* @__PURE__ */ new Error(\"Operation aborted\"));\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.pendingJobs.delete(jobId);\n\t\t\tfor (const waiter of waiters) waiter.reject(error instanceof Error ? error : new Error(String(error)));\n\t\t}\n\t}\n};\n//#endregion\n//#region src/client/cursor.ts\nconst COMPOSITE_PREFIX = \"c:\";\n/**\n* Returns true if the cursor is a composite multi-scope cursor.\n*/\nfunction isCompositeCursor(cursor) {\n\treturn cursor.startsWith(COMPOSITE_PREFIX);\n}\n/**\n* Encodes per-scope cursors into a single composite cursor string.\n* Only scopes that still have more results should be included.\n*/\nfunction encodeCompositeCursor(scopeCursors) {\n\treturn COMPOSITE_PREFIX + JSON.stringify(scopeCursors);\n}\n/**\n* Decodes a composite cursor string into a map of scope to cursor.\n* Throws if the cursor is not a valid composite cursor.\n*/\nfunction decodeCompositeCursor(cursor) {\n\tif (!cursor.startsWith(COMPOSITE_PREFIX)) throw new Error(\"Invalid composite cursor format\");\n\tconst json = cursor.slice(2);\n\ttry {\n\t\tconst parsed = JSON.parse(json);\n\t\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) throw new Error(\"Invalid composite cursor format\");\n\t\treturn parsed;\n\t} catch (error) {\n\t\tif (error instanceof SyntaxError) throw new Error(\"Invalid composite cursor format\");\n\t\tthrow error;\n\t}\n}\n//#endregion\n//#region src/client/types.ts\n/**\n* Describes the types of document changes that can occur.\n*/\nlet DocumentChangeType = /* @__PURE__ */ function(DocumentChangeType) {\n\tDocumentChangeType[\"Created\"] = \"created\";\n\tDocumentChangeType[\"Deleted\"] = \"deleted\";\n\tDocumentChangeType[\"Updated\"] = \"updated\";\n\tDocumentChangeType[\"ParentAdded\"] = \"parent_added\";\n\tDocumentChangeType[\"ParentRemoved\"] = \"parent_removed\";\n\tDocumentChangeType[\"ChildAdded\"] = \"child_added\";\n\tDocumentChangeType[\"ChildRemoved\"] = \"child_removed\";\n\treturn DocumentChangeType;\n}({});\n//#endregion\n//#region src/client/reactor-client.ts\n/**\n* ReactorClient implementation that wraps lower-level APIs to provide\n* a simpler interface for document operations.\n*\n* Features:\n* - Wraps Jobs with Promises for easier async handling\n* - Manages signing of submitted Action objects\n* - Provides quality-of-life functions for common tasks\n* - Wraps subscription interface with ViewFilters\n*/\nvar ReactorClient = class {\n\tlogger;\n\treactor;\n\tsigner;\n\tsubscriptionManager;\n\tjobAwaiter;\n\tdocumentIndexer;\n\tdocumentView;\n\tconstructor(logger, reactor, signer, subscriptionManager, jobAwaiter, documentIndexer, documentView) {\n\t\tthis.logger = logger;\n\t\tthis.reactor = reactor;\n\t\tthis.signer = signer;\n\t\tthis.subscriptionManager = subscriptionManager;\n\t\tthis.jobAwaiter = jobAwaiter;\n\t\tthis.documentIndexer = documentIndexer;\n\t\tthis.documentView = documentView;\n\t\tthis.logger.verbose(\"ReactorClient initialized\");\n\t}\n\t/**\n\t* Retrieves a list of document model modules.\n\t*/\n\tasync getDocumentModelModules(namespace, paging, signal) {\n\t\tthis.logger.verbose(\"getDocumentModels(@namespace, @paging)\", namespace, paging);\n\t\treturn this.reactor.getDocumentModels(namespace, paging, signal);\n\t}\n\t/**\n\t* Retrieves a specific document model module by document type.\n\t*\n\t* @param documentType - The document type identifier\n\t* @returns The document model module\n\t*/\n\tasync getDocumentModelModule(documentType) {\n\t\tconst module = (await this.reactor.getDocumentModels()).results.find((m) => m.documentModel.global.id === documentType);\n\t\tif (!module) throw new Error(`Document model module not found for type: ${documentType}`);\n\t\treturn module;\n\t}\n\t/**\n\t* Retrieves a specific PHDocument\n\t*/\n\tasync get(identifier, view, signal) {\n\t\tthis.logger.verbose(\"get(@identifier, @view)\", identifier, view);\n\t\treturn await this.reactor.getByIdOrSlug(identifier, view, void 0, signal);\n\t}\n\t/**\n\t* Retrieves operations for a document\n\t*/\n\tasync getOperations(documentIdentifier, view, filter, paging, signal) {\n\t\tthis.logger.verbose(\"getOperations(@documentIdentifier, @view, @filter, @paging)\", documentIdentifier, view, filter, paging);\n\t\tconst documentId = await this.documentView.resolveIdOrSlug(documentIdentifier, view, void 0, signal);\n\t\tif (paging?.cursor && isCompositeCursor(paging.cursor)) return this.getOperationsWithCompositeCursor(documentId, view, filter, paging, signal);\n\t\tconst operationsByScope = await this.reactor.getOperations(documentId, view, filter, paging, void 0, signal);\n\t\tconst scopeEntries = Object.entries(operationsByScope);\n\t\tconst effectivePaging = paging || {\n\t\t\tcursor: \"0\",\n\t\t\tlimit: 100\n\t\t};\n\t\tif (scopeEntries.length <= 1) {\n\t\t\tconst allOperations = scopeEntries.length === 1 ? [...scopeEntries[0][1].results] : [];\n\t\t\tallOperations.sort((a, b) => a.index - b.index);\n\t\t\treturn {\n\t\t\t\tresults: allOperations,\n\t\t\t\toptions: effectivePaging,\n\t\t\t\tnextCursor: scopeEntries.length === 1 ? scopeEntries[0][1].nextCursor : void 0\n\t\t\t};\n\t\t}\n\t\tconst allOperations = [];\n\t\tconst activeCursors = {};\n\t\tfor (const [scopeName, scopeResults] of scopeEntries) {\n\t\t\tallOperations.push(...scopeResults.results);\n\t\t\tif (scopeResults.nextCursor) activeCursors[scopeName] = scopeResults.nextCursor;\n\t\t}\n\t\tallOperations.sort((a, b) => a.index - b.index);\n\t\treturn {\n\t\t\tresults: allOperations,\n\t\t\toptions: effectivePaging,\n\t\t\tnextCursor: Object.keys(activeCursors).length > 0 ? encodeCompositeCursor(activeCursors) : void 0\n\t\t};\n\t}\n\tasync getOperationsWithCompositeCursor(documentId, view, filter, paging, signal) {\n\t\tconst scopeCursors = decodeCompositeCursor(paging.cursor);\n\t\tconst allOperations = [];\n\t\tconst activeCursors = {};\n\t\tfor (const [scopeName, cursor] of Object.entries(scopeCursors)) {\n\t\t\tconst scopeView = {\n\t\t\t\t...view,\n\t\t\t\tscopes: [scopeName]\n\t\t\t};\n\t\t\tconst scopePaging = {\n\t\t\t\tcursor,\n\t\t\t\tlimit: paging.limit\n\t\t\t};\n\t\t\tconst scopeResult = (await this.reactor.getOperations(documentId, scopeView, filter, scopePaging, void 0, signal))[scopeName];\n\t\t\tallOperations.push(...scopeResult.results);\n\t\t\tif (scopeResult.nextCursor) activeCursors[scopeName] = scopeResult.nextCursor;\n\t\t}\n\t\tallOperations.sort((a, b) => a.index - b.index);\n\t\treturn {\n\t\t\tresults: allOperations,\n\t\t\toptions: paging,\n\t\t\tnextCursor: Object.keys(activeCursors).length > 0 ? encodeCompositeCursor(activeCursors) : void 0\n\t\t};\n\t}\n\t/**\n\t* Retrieves children of a document\n\t*/\n\tasync getChildren(parentIdentifier, view, paging, signal) {\n\t\tthis.logger.verbose(\"getChildren(@parentIdentifier, @view, @paging)\", parentIdentifier, view, paging);\n\t\tconst parentId = await this.documentView.resolveIdOrSlug(parentIdentifier, view, void 0, signal);\n\t\tconst childIds = (await this.documentIndexer.getOutgoing(parentId, void 0, void 0, void 0, signal)).results.map((rel) => rel.targetId);\n\t\tif (childIds.length === 0) return {\n\t\t\tresults: [],\n\t\t\toptions: paging || {\n\t\t\t\tcursor: \"0\",\n\t\t\t\tlimit: 0\n\t\t\t}\n\t\t};\n\t\treturn this.reactor.find({ ids: childIds }, view, paging, void 0, signal);\n\t}\n\t/**\n\t* Retrieves parents of a document\n\t*/\n\tasync getParents(childIdentifier, view, paging, signal) {\n\t\tthis.logger.verbose(\"getParents(@childIdentifier, @view, @paging)\", childIdentifier, view, paging);\n\t\tconst childId = await this.documentView.resolveIdOrSlug(childIdentifier, view, void 0, signal);\n\t\tconst parentIds = (await this.documentIndexer.getIncoming(childId, void 0, void 0, void 0, signal)).results.map((rel) => rel.sourceId);\n\t\tif (parentIds.length === 0) return {\n\t\t\tresults: [],\n\t\t\toptions: paging || {\n\t\t\t\tcursor: \"0\",\n\t\t\t\tlimit: 0\n\t\t\t}\n\t\t};\n\t\treturn this.reactor.find({ ids: parentIds }, view, paging, void 0, signal);\n\t}\n\t/**\n\t* Filters documents by criteria and returns a list of them\n\t*/\n\tasync find(search, view, paging, signal) {\n\t\tthis.logger.verbose(\"find(@search, @view, @paging)\", search, view, paging);\n\t\treturn this.reactor.find(search, view, paging, void 0, signal);\n\t}\n\t/**\n\t* Creates a document and waits for completion\n\t*/\n\tasync create(document, parentIdentifier, signal) {\n\t\tthis.logger.verbose(\"create(@id, @parentIdentifier)\", document.header.id, parentIdentifier);\n\t\tconst documentId = document.header.id;\n\t\tconst createActions = await signActions([createDocumentAction({\n\t\t\tmodel: document.header.documentType,\n\t\t\tversion: 0,\n\t\t\tdocumentId,\n\t\t\tsigning: {\n\t\t\t\tsignature: documentId,\n\t\t\t\tpublicKey: document.header.sig.publicKey,\n\t\t\t\tnonce: document.header.sig.nonce,\n\t\t\t\tcreatedAtUtcIso: document.header.createdAtUtcIso,\n\t\t\t\tdocumentType: document.header.documentType\n\t\t\t},\n\t\t\tslug: document.header.slug,\n\t\t\tname: document.header.name,\n\t\t\tbranch: document.header.branch,\n\t\t\tmeta: document.header.meta,\n\t\t\tprotocolVersions: document.header.protocolVersions ?? { \"base-reducer\": 2 }\n\t\t}), upgradeDocumentAction({\n\t\t\tdocumentId,\n\t\t\tmodel: document.header.documentType,\n\t\t\tfromVersion: 0,\n\t\t\ttoVersion: document.state.document.version,\n\t\t\tinitialState: document.state\n\t\t})], this.signer, signal);\n\t\tconst jobs = [{\n\t\t\tkey: \"create\",\n\t\t\tdocumentId,\n\t\t\tscope: getSharedActionScope(createActions),\n\t\t\tbranch: \"main\",\n\t\t\tactions: createActions,\n\t\t\tdependsOn: []\n\t\t}];\n\t\tif (parentIdentifier) {\n\t\t\tconst parentActions = await signActions([addRelationshipAction(parentIdentifier, documentId, \"child\")], this.signer, signal);\n\t\t\tjobs.push({\n\t\t\t\tkey: \"parent\",\n\t\t\t\tdocumentId: parentIdentifier,\n\t\t\t\tscope: getSharedActionScope(parentActions),\n\t\t\t\tbranch: \"main\",\n\t\t\t\tactions: parentActions,\n\t\t\t\tdependsOn: [\"create\"]\n\t\t\t});\n\t\t}\n\t\tconst batchResult = await this.reactor.executeBatch({ jobs }, signal);\n\t\tconst completedJobs = await Promise.all(Object.values(batchResult.jobs).map((job) => this.waitForJob(job, signal)));\n\t\tfor (const job of completedJobs) if (job.status === JobStatus.FAILED) throw new Error(job.error?.message);\n\t\treturn await this.reactor.get(documentId);\n\t}\n\t/**\n\t* Creates an empty document and waits for completion\n\t*/\n\tasync createEmpty(documentModelType, options, signal) {\n\t\tthis.logger.verbose(\"createEmpty(@documentModelType, @options)\", documentModelType, options);\n\t\tconst matchingModules = (await this.reactor.getDocumentModels(void 0, void 0, signal)).results.filter((m) => m.documentModel.global.id === documentModelType);\n\t\tlet module;\n\t\tif (options?.documentModelVersion !== void 0) {\n\t\t\tmodule = matchingModules.find((m) => m.version === options.documentModelVersion);\n\t\t\tif (!module) throw new Error(`Document model not found for type: ${documentModelType} with version: ${options.documentModelVersion}`);\n\t\t} else {\n\t\t\tmodule = matchingModules.reduce((latest, current) => {\n\t\t\t\tif (latest === void 0) return current;\n\t\t\t\treturn (current.version ?? 0) > (latest.version ?? 0) ? current : latest;\n\t\t\t}, void 0);\n\t\t\tif (!module) throw new Error(`Document model not found for type: ${documentModelType}`);\n\t\t}\n\t\tconst document = module.utils.createDocument();\n\t\tdocument.state.document.version = module.version ?? 1;\n\t\treturn this.create(document, options?.parentIdentifier, signal);\n\t}\n\t/**\n\t* Creates an empty document in a drive as a single batched operation.\n\t*/\n\tasync createDocumentInDrive(driveId, document, parentFolder, signal) {\n\t\tthis.logger.verbose(\"createDocumentInDrive(@driveId, @document, @parentFolder)\", driveId, document, parentFolder);\n\t\tconst documentId = document.header.id;\n\t\tconst documentActions = await signActions([\n\t\t\tcreateDocumentAction({\n\t\t\t\tmodel: document.header.documentType,\n\t\t\t\tversion: 0,\n\t\t\t\tdocumentId: document.header.id,\n\t\t\t\tsigning: {\n\t\t\t\t\tsignature: document.header.id,\n\t\t\t\t\tpublicKey: document.header.sig.publicKey,\n\t\t\t\t\tnonce: document.header.sig.nonce,\n\t\t\t\t\tcreatedAtUtcIso: document.header.createdAtUtcIso,\n\t\t\t\t\tdocumentType: document.header.documentType\n\t\t\t\t},\n\t\t\t\tslug: document.header.slug,\n\t\t\t\tname: document.header.name,\n\t\t\t\tbranch: document.header.branch,\n\t\t\t\tmeta: document.header.meta,\n\t\t\t\tprotocolVersions: document.header.protocolVersions ?? { \"base-reducer\": 2 }\n\t\t\t}),\n\t\t\tupgradeDocumentAction({\n\t\t\t\tdocumentId: document.header.id,\n\t\t\t\tmodel: document.header.documentType,\n\t\t\t\tfromVersion: 0,\n\t\t\t\ttoVersion: 1,\n\t\t\t\tinitialState: document.state\n\t\t\t}),\n\t\t\taddRelationshipAction(driveId, documentId, \"child\")\n\t\t], this.signer, signal);\n\t\tconst driveActions = await signActions([addFile({\n\t\t\tid: documentId,\n\t\t\tname: document.header.name || documentId,\n\t\t\tdocumentType: document.header.documentType,\n\t\t\tparentFolder\n\t\t})], this.signer, signal);\n\t\tconst batchResult = await this.reactor.executeBatch({ jobs: [{\n\t\t\tkey: \"document\",\n\t\t\tdocumentId,\n\t\t\tscope: getSharedActionScope(documentActions),\n\t\t\tbranch: \"main\",\n\t\t\tactions: documentActions,\n\t\t\tdependsOn: []\n\t\t}, {\n\t\t\tkey: \"drive\",\n\t\t\tdocumentId: driveId,\n\t\t\tscope: getSharedActionScope(driveActions),\n\t\t\tbranch: \"main\",\n\t\t\tactions: driveActions,\n\t\t\tdependsOn: [\"document\"]\n\t\t}] }, signal);\n\t\tconst completedJobs = await Promise.all(Object.values(batchResult.jobs).map((job) => this.waitForJob(job, signal)));\n\t\tfor (const job of completedJobs) if (job.status === JobStatus.FAILED) throw new Error(job.error?.message);\n\t\treturn this.reactor.get(documentId);\n\t}\n\t/**\n\t* Applies a list of actions to a document and waits for completion\n\t*/\n\tasync execute(documentIdentifier, branch, actions, signal) {\n\t\tthis.logger.verbose(\"execute(@documentIdentifier, @branch, @count actions)\", documentIdentifier, branch, actions.length);\n\t\tconst signedActions = await signActions(actions, this.signer, signal);\n\t\tconst jobInfo = await this.reactor.execute(documentIdentifier, branch, signedActions, signal);\n\t\tconst completedJob = await this.waitForJob(jobInfo, signal);\n\t\tif (completedJob.status === JobStatus.FAILED) throw new Error(completedJob.error?.message);\n\t\tconst view = { branch };\n\t\treturn await this.reactor.getByIdOrSlug(documentIdentifier, view, completedJob.consistencyToken, signal);\n\t}\n\t/**\n\t* Submits a list of actions to a document\n\t*/\n\tasync executeAsync(documentIdentifier, branch, actions, signal) {\n\t\tthis.logger.verbose(\"executeAsync(@documentIdentifier, @branch, @count actions)\", documentIdentifier, branch, actions.length);\n\t\tconst signedActions = await signActions(actions, this.signer, signal);\n\t\treturn this.reactor.execute(documentIdentifier, branch, signedActions, signal);\n\t}\n\t/**\n\t* Renames a document and waits for completion\n\t*/\n\tasync rename(documentIdentifier, name, branch = \"main\", signal) {\n\t\tthis.logger.verbose(\"rename(@documentIdentifier, @name, @branch)\", documentIdentifier, name, branch);\n\t\treturn this.execute(documentIdentifier, branch, [actions.setName(name)], signal);\n\t}\n\t/**\n\t* Adds multiple documents as children to another and waits for completion\n\t*/\n\tasync addChildren(parentIdentifier, documentIdentifiers, branch = \"main\", signal) {\n\t\tthis.logger.verbose(\"addChildren(@parentIdentifier, @count children, @branch)\", parentIdentifier, documentIdentifiers.length, branch);\n\t\tconst jobInfo = await this.reactor.addChildren(parentIdentifier, documentIdentifiers, branch, this.signer, signal);\n\t\tconst completedJob = await this.waitForJob(jobInfo, signal);\n\t\tif (completedJob.status === JobStatus.FAILED) throw new Error(completedJob.error?.message);\n\t\treturn await this.reactor.getByIdOrSlug(parentIdentifier, { branch }, completedJob.consistencyToken, signal);\n\t}\n\t/**\n\t* Removes multiple documents as children from another and waits for completion\n\t*/\n\tasync removeChildren(parentIdentifier, documentIdentifiers, branch = \"main\", signal) {\n\t\tthis.logger.verbose(\"removeChildren(@parentIdentifier, @count children, @branch)\", parentIdentifier, documentIdentifiers.length, branch);\n\t\tconst jobInfo = await this.reactor.removeChildren(parentIdentifier, documentIdentifiers, branch, this.signer, signal);\n\t\tconst completedJob = await this.waitForJob(jobInfo, signal);\n\t\tif (completedJob.status === JobStatus.FAILED) throw new Error(completedJob.error?.message);\n\t\treturn await this.reactor.getByIdOrSlug(parentIdentifier, { branch }, completedJob.consistencyToken, signal);\n\t}\n\t/**\n\t* Moves multiple documents from one parent to another and waits for completion\n\t*/\n\tasync moveChildren(sourceParentIdentifier, targetParentIdentifier, documentIdentifiers, branch = \"main\", signal) {\n\t\tthis.logger.verbose(\"moveChildren(@sourceParentIdentifier, @targetParentIdentifier, @count children, @branch)\", sourceParentIdentifier, targetParentIdentifier, documentIdentifiers.length, branch);\n\t\tconst removeJobInfo = await this.reactor.removeChildren(sourceParentIdentifier, documentIdentifiers, branch, this.signer, signal);\n\t\tconst removeCompletedJob = await this.waitForJob(removeJobInfo, signal);\n\t\tif (removeCompletedJob.status === JobStatus.FAILED) throw new Error(removeCompletedJob.error?.message);\n\t\tconst addJobInfo = await this.reactor.addChildren(targetParentIdentifier, documentIdentifiers, branch, this.signer, signal);\n\t\tconst addCompletedJob = await this.waitForJob(addJobInfo, signal);\n\t\tif (addCompletedJob.status === JobStatus.FAILED) throw new Error(addCompletedJob.error?.message);\n\t\treturn {\n\t\t\tsource: await this.reactor.getByIdOrSlug(sourceParentIdentifier, { branch }, removeCompletedJob.consistencyToken, signal),\n\t\t\ttarget: await this.reactor.getByIdOrSlug(targetParentIdentifier, { branch }, addCompletedJob.consistencyToken, signal)\n\t\t};\n\t}\n\tasync loadBatch(request, signal) {\n\t\tthis.logger.verbose(\"loadBatch(@count jobs)\", request.jobs.length);\n\t\tconst result = await this.reactor.loadBatch(request, signal);\n\t\tconst completedJobs = await Promise.all(Object.entries(result.jobs).map(async ([key, jobInfo]) => {\n\t\t\treturn [key, await this.waitForJob(jobInfo, signal)];\n\t\t}));\n\t\tfor (const [, completedJob] of completedJobs) if (completedJob.status === JobStatus.FAILED) throw new Error(completedJob.error?.message);\n\t\treturn { jobs: Object.fromEntries(completedJobs) };\n\t}\n\t/**\n\t* Deletes a document and waits for completion\n\t*/\n\tasync deleteDocument(identifier, propagate, signal) {\n\t\tthis.logger.verbose(\"deleteDocument(@identifier, @propagate)\", identifier, propagate);\n\t\tconst jobs = [];\n\t\tif (propagate === PropagationMode.Cascade) {\n\t\t\tconst toDelete = new Set([identifier]);\n\t\t\tlet changed = true;\n\t\t\twhile (changed) {\n\t\t\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\t\t\tchanged = false;\n\t\t\t\tconst orphans = await this.documentIndexer.getOrphanedChildren([...toDelete], [\"child\"], signal);\n\t\t\t\tfor (const id of orphans) if (!toDelete.has(id)) {\n\t\t\t\t\ttoDelete.add(id);\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const descendantId of toDelete) {\n\t\t\t\tif (descendantId === identifier) continue;\n\t\t\t\tconst removalJobs = await this.removeFromAllParents(descendantId, signal);\n\t\t\t\tjobs.push(...removalJobs);\n\t\t\t\tconst jobInfo = await this.reactor.deleteDocument(descendantId, this.signer, signal);\n\t\t\t\tjobs.push(jobInfo);\n\t\t\t}\n\t\t}\n\t\tconst removalJobs = await this.removeFromAllParents(identifier, signal);\n\t\tjobs.push(...removalJobs);\n\t\tconst jobInfo = await this.reactor.deleteDocument(identifier, this.signer, signal);\n\t\tjobs.push(jobInfo);\n\t\tconst completedJobs = await Promise.all(jobs.map((job) => this.waitForJob(job, signal)));\n\t\tfor (const completedJob of completedJobs) if (completedJob.status === JobStatus.FAILED) throw new Error(completedJob.error?.message);\n\t}\n\t/**\n\t* Deletes documents and waits for completion\n\t*/\n\tasync deleteDocuments(identifiers, propagate, signal) {\n\t\tthis.logger.verbose(\"deleteDocuments(@count identifiers, @propagate)\", identifiers.length, propagate);\n\t\tconst deletePromises = identifiers.map((identifier) => this.deleteDocument(identifier, propagate, signal));\n\t\tawait Promise.all(deletePromises);\n\t}\n\t/**\n\t* Retrieves the status of a job\n\t*/\n\tasync getJobStatus(jobId, signal) {\n\t\tthis.logger.verbose(\"getJobStatus(@jobId)\", jobId);\n\t\treturn this.reactor.getJobStatus(jobId, signal);\n\t}\n\t/**\n\t* Waits for a job to complete\n\t*/\n\tasync waitForJob(jobId, signal) {\n\t\tconst id = typeof jobId === \"string\" ? jobId : jobId.id;\n\t\tthis.logger.verbose(\"waitForJob(@id)\", id);\n\t\treturn this.jobAwaiter.waitForJob(id, signal);\n\t}\n\t/**\n\t* Subscribes to changes for documents matching specified filters\n\t*/\n\tsubscribe(search, callback, view) {\n\t\tthis.logger.verbose(\"subscribe(@search, @view)\", search, view);\n\t\tconst unsubscribeCreated = this.subscriptionManager.onDocumentCreated((result) => {\n\t\t\t(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst documents = await Promise.all(result.results.map((id) => this.reactor.get(id, view, void 0, void 0)));\n\t\t\t\t\tcallback({\n\t\t\t\t\t\ttype: DocumentChangeType.Created,\n\t\t\t\t\t\tdocuments\n\t\t\t\t\t});\n\t\t\t\t} catch {}\n\t\t\t})();\n\t\t}, search);\n\t\tconst unsubscribeDeleted = this.subscriptionManager.onDocumentDeleted((documentIds) => {\n\t\t\tcallback({\n\t\t\t\ttype: DocumentChangeType.Deleted,\n\t\t\t\tdocuments: [],\n\t\t\t\tcontext: { childId: documentIds[0] }\n\t\t\t});\n\t\t}, search);\n\t\tconst unsubscribeUpdated = this.subscriptionManager.onDocumentStateUpdated((result) => {\n\t\t\tcallback({\n\t\t\t\ttype: DocumentChangeType.Updated,\n\t\t\t\tdocuments: result.results\n\t\t\t});\n\t\t}, search, view);\n\t\tconst unsubscribeRelationship = this.subscriptionManager.onRelationshipChanged((parentId, childId, changeType) => {\n\t\t\tcallback({\n\t\t\t\ttype: changeType === RelationshipChangeType.Added ? DocumentChangeType.ChildAdded : DocumentChangeType.ChildRemoved,\n\t\t\t\tdocuments: [],\n\t\t\t\tcontext: {\n\t\t\t\t\tparentId,\n\t\t\t\t\tchildId\n\t\t\t\t}\n\t\t\t});\n\t\t}, search);\n\t\treturn () => {\n\t\t\tunsubscribeCreated();\n\t\t\tunsubscribeDeleted();\n\t\t\tunsubscribeUpdated();\n\t\t\tunsubscribeRelationship();\n\t\t};\n\t}\n\tasync removeFromAllParents(documentId, signal) {\n\t\tconst incoming = await this.documentIndexer.getIncoming(documentId, void 0, void 0, void 0, signal);\n\t\tconst jobs = [];\n\t\tfor (const rel of incoming.results) {\n\t\t\tconst relJobs = await this.removeFromParent(documentId, rel, signal);\n\t\t\tjobs.push(...relJobs);\n\t\t}\n\t\treturn jobs;\n\t}\n\tasync removeFromParent(documentId, rel, signal) {\n\t\tconst parentId = rel.sourceId;\n\t\tlet parentDoc;\n\t\ttry {\n\t\t\tparentDoc = await this.reactor.get(parentId, void 0, void 0, signal);\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t\tconst isDrive = parentDoc.header.documentType === \"powerhouse/document-drive\";\n\t\tconst relationshipActions = await signActions([removeRelationshipAction(parentId, documentId, rel.relationshipType)], this.signer, signal);\n\t\tif (isDrive) {\n\t\t\tconst driveActions = await signActions([deleteNode({ id: documentId })], this.signer, signal);\n\t\t\tconst batchResult = await this.reactor.executeBatch({ jobs: [{\n\t\t\t\tkey: \"relationship\",\n\t\t\t\tdocumentId: parentId,\n\t\t\t\tscope: getSharedActionScope(relationshipActions),\n\t\t\t\tbranch: \"main\",\n\t\t\t\tactions: relationshipActions,\n\t\t\t\tdependsOn: []\n\t\t\t}, {\n\t\t\t\tkey: \"drive\",\n\t\t\t\tdocumentId: parentId,\n\t\t\t\tscope: getSharedActionScope(driveActions),\n\t\t\t\tbranch: \"main\",\n\t\t\t\tactions: driveActions,\n\t\t\t\tdependsOn: [\"relationship\"]\n\t\t\t}] }, signal);\n\t\t\treturn [...Object.values(batchResult.jobs)];\n\t\t}\n\t\treturn [await this.reactor.removeChildren(parentId, [documentId], \"main\", this.signer, signal)];\n\t}\n};\n//#endregion\n//#region src/cache/collection-membership-cache.ts\nvar CollectionMembershipCache = class CollectionMembershipCache {\n\tcache = /* @__PURE__ */ new Map();\n\tconstructor(operationIndex) {\n\t\tthis.operationIndex = operationIndex;\n\t}\n\twithScopedIndex(operationIndex) {\n\t\tconst scoped = new CollectionMembershipCache(operationIndex);\n\t\tscoped.cache = this.cache;\n\t\treturn scoped;\n\t}\n\tasync getCollectionsForDocuments(documentIds) {\n\t\tconst result = {};\n\t\tconst missing = [];\n\t\tfor (const docId of documentIds) {\n\t\t\tconst cached = this.cache.get(docId);\n\t\t\tif (cached !== void 0) result[docId] = cached;\n\t\t\telse missing.push(docId);\n\t\t}\n\t\tif (missing.length > 0) {\n\t\t\tconst fromDb = await this.operationIndex.getCollectionsForDocuments(missing);\n\t\t\tfor (const docId of missing) {\n\t\t\t\tconst collections = fromDb[docId] ?? [];\n\t\t\t\tresult[docId] = collections;\n\t\t\t\tthis.cache.set(docId, collections);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\tinvalidate(documentId) {\n\t\tthis.cache.delete(documentId);\n\t}\n};\n//#endregion\n//#region src/shared/errors.ts\n/**\n* Error thrown when attempting to access a deleted document.\n*/\nvar DocumentDeletedError = class DocumentDeletedError extends Error {\n\tdocumentId;\n\tdeletedAtUtcIso;\n\tconstructor(documentId, deletedAtUtcIso = null) {\n\t\tconst message = deletedAtUtcIso ? `Document ${documentId} was deleted at ${deletedAtUtcIso}` : `Document ${documentId} has been deleted`;\n\t\tsuper(message);\n\t\tthis.name = \"DocumentDeletedError\";\n\t\tthis.documentId = documentId;\n\t\tthis.deletedAtUtcIso = deletedAtUtcIso;\n\t\tError.captureStackTrace(this, DocumentDeletedError);\n\t}\n\tstatic isError(error) {\n\t\treturn Error.isError(error) && error.name === \"DocumentDeletedError\";\n\t}\n};\n/**\n* Error thrown when an operation has an invalid signature.\n*/\nvar InvalidSignatureError = class InvalidSignatureError extends Error {\n\tdocumentId;\n\treason;\n\tconstructor(documentId, reason) {\n\t\tsuper(`Invalid signature in document ${documentId}: ${reason}`);\n\t\tthis.name = \"InvalidSignatureError\";\n\t\tthis.documentId = documentId;\n\t\tthis.reason = reason;\n\t\tError.captureStackTrace(this, InvalidSignatureError);\n\t}\n};\n/**\n* Error thrown when attempting to downgrade a document version.\n*/\nvar DowngradeNotSupportedError$1 = class DowngradeNotSupportedError$1 extends Error {\n\tdocumentType;\n\tfromVersion;\n\ttoVersion;\n\tconstructor(documentType, fromVersion, toVersion) {\n\t\tsuper(`Downgrade not supported for ${documentType}: cannot upgrade from version ${fromVersion} to ${toVersion}`);\n\t\tthis.name = \"DowngradeNotSupportedError\";\n\t\tthis.documentType = documentType;\n\t\tthis.fromVersion = fromVersion;\n\t\tthis.toVersion = toVersion;\n\t\tError.captureStackTrace(this, DowngradeNotSupportedError$1);\n\t}\n};\n/**\n* Error thrown when a document is not found (no operations exist for the document ID).\n*/\nvar DocumentNotFoundError = class DocumentNotFoundError extends Error {\n\tdocumentId;\n\tconstructor(documentId) {\n\t\tsuper(`Document ${documentId} not found`);\n\t\tthis.name = \"DocumentNotFoundError\";\n\t\tthis.documentId = documentId;\n\t\tError.captureStackTrace(this, DocumentNotFoundError);\n\t}\n\tstatic isError(error) {\n\t\treturn Error.isError(error) && error.name === \"DocumentNotFoundError\";\n\t}\n};\n//#endregion\n//#region src/executor/util.ts\n/**\n* Creates a PHDocument from a CREATE_DOCUMENT action input.\n* Reconstructs the document header and initializes the base state.\n*\n* @param action - The CREATE_DOCUMENT action containing the document parameters\n* @returns A newly constructed PHDocument with initialized header and base state\n*/\nfunction createDocumentFromAction(action) {\n\tconst input = action.input;\n\tconst header = createPresignedHeader();\n\theader.id = input.documentId;\n\theader.documentType = input.model;\n\tif (input.signing) {\n\t\theader.createdAtUtcIso = input.signing.createdAtUtcIso;\n\t\theader.lastModifiedAtUtcIso = input.signing.createdAtUtcIso;\n\t\theader.sig = {\n\t\t\tpublicKey: input.signing.publicKey,\n\t\t\tnonce: input.signing.nonce\n\t\t};\n\t}\n\tif (input.slug !== void 0) header.slug = input.slug;\n\tif (!header.slug) header.slug = input.documentId;\n\tif (input.name !== void 0) header.name = input.name;\n\tif (input.branch !== void 0) header.branch = input.branch;\n\tif (input.meta !== void 0) header.meta = input.meta;\n\tif (input.protocolVersions !== void 0) header.protocolVersions = input.protocolVersions;\n\tconst baseState = defaultBaseState();\n\treturn {\n\t\theader,\n\t\toperations: {},\n\t\tstate: baseState,\n\t\tinitialState: baseState,\n\t\tclipboard: []\n\t};\n}\n/**\n* Applies an UPGRADE_DOCUMENT action to a document.\n* Handles all upgrade scenarios including initial upgrades, no-ops, and multi-step upgrades.\n*\n* Behavior based on fromVersion/toVersion:\n* - fromVersion === toVersion (and fromVersion > 0): No-op - return unchanged document\n* - fromVersion > toVersion: Throw DowngradeNotSupportedError\n* - All other cases: Apply upgradePath transitions (if provided), then apply initialState, set version\n*\n* The initialState from the action is always applied (if provided) to maintain backward\n* compatibility with the original implementation.\n*\n* @param document - The document to upgrade\n* @param action - The UPGRADE_DOCUMENT action\n* @param upgradePath - Optional pre-computed upgrade path for multi-step upgrades\n* @returns The upgraded document (unchanged if no-op)\n* @throws DowngradeNotSupportedError if attempting to downgrade\n*/\nfunction applyUpgradeDocumentAction(document, action, upgradePath) {\n\tconst fromVersion = action.input.fromVersion;\n\tconst toVersion = action.input.toVersion;\n\tif (fromVersion === toVersion && fromVersion > 0) return document;\n\tif (fromVersion > toVersion) throw new DowngradeNotSupportedError$1(document.header.documentType, fromVersion, toVersion);\n\tif (upgradePath) for (const transition of upgradePath) document = transition.upgradeReducer(document, action);\n\tapplyInitialState(document, action);\n\tdocument.state.document = {\n\t\t...document.state.document,\n\t\tversion: toVersion\n\t};\n\treturn document;\n}\nfunction applyInitialState(document, action) {\n\tconst input = action.input;\n\tconst newState = input.initialState || input.state;\n\tif (newState) {\n\t\tdocument.state = {\n\t\t\t...document.state,\n\t\t\t...newState\n\t\t};\n\t\tdocument.initialState = document.state;\n\t}\n}\n/**\n* Applies a DELETE_DOCUMENT action to a document.\n* Marks the document as deleted in the document scope state.\n*\n* @param document - The document to mark as deleted\n* @param action - The DELETE_DOCUMENT action\n* @returns The updated document (mutates in place and returns for convenience)\n*/\nfunction applyDeleteDocumentAction(document, action) {\n\tconst deletedAt = action.timestampUtcMs || (/* @__PURE__ */ new Date()).toISOString();\n\tdocument.state = {\n\t\t...document.state,\n\t\tdocument: {\n\t\t\t...document.state.document,\n\t\t\tisDeleted: true,\n\t\t\tdeletedAtUtcIso: deletedAt\n\t\t}\n\t};\n\treturn document;\n}\n/**\n* Calculate the next operation index for a specific scope.\n* Each scope maintains its own independent index sequence.\n*\n* Per-scope indexing means:\n* - Each scope (document, global, local, etc.) has independent indexes\n* - Indexes start at 0 for each scope\n* - Different scopes can have operations with the same index value\n*\n* This function uses header.revision which is populated by the cache/storage layer\n* and contains the next available index for each scope. This design avoids requiring\n* the full operation history to be loaded, which is crucial for snapshot-based caching.\n*\n* @param document - The document whose header.revision to inspect\n* @param scope - The scope to calculate the next index for\n* @returns The next available index in the specified scope\n*/\nconst getNextIndexForScope = (document, scope) => {\n\treturn document.header.revision[scope] || 0;\n};\n/**\n* Creates an empty consistency token with no coordinates.\n* Used when a job is registered or fails without writing operations.\n*\n* @returns A consistency token with an empty coordinates array\n*/\nfunction createEmptyConsistencyToken() {\n\treturn {\n\t\tversion: 1,\n\t\tcreatedAtUtcIso: (/* @__PURE__ */ new Date()).toISOString(),\n\t\tcoordinates: []\n\t};\n}\n/**\n* Creates a consistency token from operations written during job execution.\n* Maps each operation to a consistency coordinate tracking (documentId, scope, branch, operationIndex).\n* If no operations are provided, returns an empty token.\n*\n* @param operationsWithContext - Array of operations with their execution context\n* @returns A consistency token representing all operations written\n*/\nfunction createConsistencyToken(operationsWithContext) {\n\tif (operationsWithContext.length === 0) return createEmptyConsistencyToken();\n\tconst coordinates = [];\n\tfor (let i = 0; i < operationsWithContext.length; i++) {\n\t\tconst opWithContext = operationsWithContext[i];\n\t\tcoordinates.push({\n\t\t\tdocumentId: opWithContext.context.documentId,\n\t\t\tscope: opWithContext.context.scope,\n\t\t\tbranch: opWithContext.context.branch,\n\t\t\toperationIndex: opWithContext.operation.index\n\t\t});\n\t}\n\treturn {\n\t\tversion: 1,\n\t\tcreatedAtUtcIso: (/* @__PURE__ */ new Date()).toISOString(),\n\t\tcoordinates\n\t};\n}\nfunction createOperation(action, index, skip, context) {\n\treturn {\n\t\tid: deriveOperationId(context.documentId, context.scope, context.branch, action.id),\n\t\tindex,\n\t\ttimestampUtcMs: action.timestampUtcMs || (/* @__PURE__ */ new Date()).toISOString(),\n\t\thash: \"\",\n\t\tskip,\n\t\taction\n\t};\n}\nfunction updateDocumentRevision(document, scope, operationIndex) {\n\tdocument.header.revision = {\n\t\t...document.header.revision,\n\t\t[scope]: operationIndex + 1\n\t};\n}\nfunction buildSuccessResult(job, operation, documentId, documentType, resultingState, startTime) {\n\treturn {\n\t\tjob,\n\t\tsuccess: true,\n\t\toperations: [operation],\n\t\toperationsWithContext: [{\n\t\t\toperation,\n\t\t\tcontext: {\n\t\t\t\tdocumentId,\n\t\t\t\tscope: job.scope,\n\t\t\t\tbranch: job.branch,\n\t\t\t\tdocumentType,\n\t\t\t\tresultingState,\n\t\t\t\tordinal: 0\n\t\t\t}\n\t\t}],\n\t\tduration: Date.now() - startTime\n\t};\n}\nfunction buildErrorResult(job, error, startTime) {\n\treturn {\n\t\tjob,\n\t\tsuccess: false,\n\t\terror,\n\t\tduration: Date.now() - startTime\n\t};\n}\n//#endregion\n//#region src/cache/lru/lru-tracker.ts\nvar LRUNode = class {\n\tkey;\n\tprev;\n\tnext;\n\tconstructor(key) {\n\t\tthis.key = key;\n\t\tthis.prev = void 0;\n\t\tthis.next = void 0;\n\t}\n};\nvar LRUTracker = class {\n\tmap;\n\thead;\n\ttail;\n\tconstructor() {\n\t\tthis.map = /* @__PURE__ */ new Map();\n\t\tthis.head = void 0;\n\t\tthis.tail = void 0;\n\t}\n\tget size() {\n\t\treturn this.map.size;\n\t}\n\ttouch(key) {\n\t\tconst node = this.map.get(key);\n\t\tif (node) this.moveToFront(node);\n\t\telse this.addToFront(key);\n\t}\n\tevict() {\n\t\tif (!this.tail) return;\n\t\tconst key = this.tail.key;\n\t\tthis.remove(key);\n\t\treturn key;\n\t}\n\tremove(key) {\n\t\tconst node = this.map.get(key);\n\t\tif (!node) return;\n\t\tthis.removeNode(node);\n\t\tthis.map.delete(key);\n\t}\n\tclear() {\n\t\tthis.map.clear();\n\t\tthis.head = void 0;\n\t\tthis.tail = void 0;\n\t}\n\taddToFront(key) {\n\t\tconst node = new LRUNode(key);\n\t\tthis.map.set(key, node);\n\t\tif (!this.head) {\n\t\t\tthis.head = node;\n\t\t\tthis.tail = node;\n\t\t} else {\n\t\t\tnode.next = this.head;\n\t\t\tthis.head.prev = node;\n\t\t\tthis.head = node;\n\t\t}\n\t}\n\tmoveToFront(node) {\n\t\tif (node === this.head) return;\n\t\tthis.removeNode(node);\n\t\tnode.prev = void 0;\n\t\tnode.next = this.head;\n\t\tif (this.head) this.head.prev = node;\n\t\tthis.head = node;\n\t\tif (!this.tail) this.tail = node;\n\t}\n\tremoveNode(node) {\n\t\tif (node.prev) node.prev.next = node.next;\n\t\telse this.head = node.next;\n\t\tif (node.next) node.next.prev = node.prev;\n\t\telse this.tail = node.prev;\n\t}\n};\n//#endregion\n//#region src/cache/document-meta-cache.ts\n/**\n* In-memory document metadata cache with LRU eviction.\n*\n* Caches PHDocumentState per (documentId, branch) key. On cache miss,\n* rebuilds from document scope operations. Provides an explicit cross-scope\n* contract for accessing document scope metadata.\n*\n* **Thread Safety:**\n* Not thread-safe. Designed for single-threaded job executor environment.\n*/\nvar DocumentMetaCache = class DocumentMetaCache {\n\tcache;\n\tlruTracker;\n\toperationStore;\n\tconfig;\n\tconstructor(operationStore, config) {\n\t\tthis.operationStore = operationStore;\n\t\tthis.config = { maxDocuments: config.maxDocuments };\n\t\tthis.cache = /* @__PURE__ */ new Map();\n\t\tthis.lruTracker = new LRUTracker();\n\t}\n\twithScopedStore(operationStore) {\n\t\tconst scoped = new DocumentMetaCache(operationStore, this.config);\n\t\tscoped.cache = this.cache;\n\t\tscoped.lruTracker = this.lruTracker;\n\t\treturn scoped;\n\t}\n\tasync startup() {\n\t\treturn Promise.resolve();\n\t}\n\tasync shutdown() {\n\t\treturn Promise.resolve();\n\t}\n\tasync getDocumentMeta(documentId, branch, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst key = this.makeKey(documentId, branch);\n\t\tconst cached = this.cache.get(key);\n\t\tif (cached) {\n\t\t\tthis.lruTracker.touch(key);\n\t\t\treturn cached;\n\t\t}\n\t\tconst meta = await this.rebuildLatest(documentId, branch, signal);\n\t\tthis.putDocumentMeta(documentId, branch, meta);\n\t\treturn meta;\n\t}\n\tasync rebuildAtRevision(documentId, branch, targetRevision, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\treturn this.rebuildFromOperations(documentId, branch, targetRevision, signal);\n\t}\n\tputDocumentMeta(documentId, branch, meta) {\n\t\tconst key = this.makeKey(documentId, branch);\n\t\tif (!this.cache.has(key) && this.cache.size >= this.config.maxDocuments) {\n\t\t\tconst evictKey = this.lruTracker.evict();\n\t\t\tif (evictKey) this.cache.delete(evictKey);\n\t\t}\n\t\tthis.cache.set(key, structuredClone(meta));\n\t\tthis.lruTracker.touch(key);\n\t}\n\tinvalidate(documentId, branch) {\n\t\tlet evicted = 0;\n\t\tif (branch === void 0) {\n\t\t\tfor (const key of this.cache.keys()) if (key.startsWith(`${documentId}:`)) {\n\t\t\t\tthis.cache.delete(key);\n\t\t\t\tthis.lruTracker.remove(key);\n\t\t\t\tevicted++;\n\t\t\t}\n\t\t} else {\n\t\t\tconst key = this.makeKey(documentId, branch);\n\t\t\tif (this.cache.has(key)) {\n\t\t\t\tthis.cache.delete(key);\n\t\t\t\tthis.lruTracker.remove(key);\n\t\t\t\tevicted = 1;\n\t\t\t}\n\t\t}\n\t\treturn evicted;\n\t}\n\tclear() {\n\t\tthis.cache.clear();\n\t\tthis.lruTracker.clear();\n\t}\n\tmakeKey(documentId, branch) {\n\t\treturn `${documentId}:${branch}`;\n\t}\n\tasync rebuildLatest(documentId, branch, signal) {\n\t\treturn this.rebuildFromOperations(documentId, branch, void 0, signal);\n\t}\n\tasync rebuildFromOperations(documentId, branch, targetRevision, signal) {\n\t\tconst docScopeOps = await this.operationStore.getSince(documentId, \"document\", branch, -1, void 0, void 0, signal);\n\t\tif (docScopeOps.results.length === 0) throw new DocumentNotFoundError(documentId);\n\t\tconst createOp = docScopeOps.results[0];\n\t\tif (createOp.action.type !== \"CREATE_DOCUMENT\") throw new Error(`Invalid document: first operation must be CREATE_DOCUMENT, found ${createOp.action.type}`);\n\t\tconst createAction = createOp.action;\n\t\tconst documentType = createAction.input.model;\n\t\tlet document = createDocumentFromAction(createAction);\n\t\tlet documentScopeRevision = 0;\n\t\tfor (const op of docScopeOps.results) {\n\t\t\tif (targetRevision !== void 0 && op.index > targetRevision) break;\n\t\t\tdocumentScopeRevision = op.index;\n\t\t\tif (op.action.type === \"UPGRADE_DOCUMENT\") {\n\t\t\t\tconst upgradeAction = op.action;\n\t\t\t\tdocument = applyUpgradeDocumentAction(document, upgradeAction);\n\t\t\t} else if (op.action.type === \"DELETE_DOCUMENT\") document = applyDeleteDocumentAction(document, op.action);\n\t\t}\n\t\treturn {\n\t\t\tstate: document.state.document,\n\t\t\tdocumentType,\n\t\t\tdocumentScopeRevision: documentScopeRevision + 1\n\t\t};\n\t}\n};\n//#endregion\n//#region src/cache/kysely-operation-index.ts\nvar KyselyOperationIndexTxn = class {\n\tcollections = [];\n\tcollectionMemberships = [];\n\tcollectionRemovals = [];\n\toperations = [];\n\tcreateCollection(collectionId) {\n\t\tthis.collections.push(collectionId);\n\t}\n\taddToCollection(collectionId, documentId) {\n\t\tconst lastOpIndex = this.operations.length - 1;\n\t\tif (lastOpIndex < 0) throw new Error(\"addToCollection must be called after write() - no operations in transaction\");\n\t\tthis.collectionMemberships.push({\n\t\t\tcollectionId,\n\t\t\tdocumentId,\n\t\t\toperationIndex: lastOpIndex\n\t\t});\n\t}\n\tremoveFromCollection(collectionId, documentId) {\n\t\tconst lastOpIndex = this.operations.length - 1;\n\t\tif (lastOpIndex < 0) throw new Error(\"removeFromCollection must be called after write() - no operations in transaction\");\n\t\tthis.collectionRemovals.push({\n\t\t\tcollectionId,\n\t\t\tdocumentId,\n\t\t\toperationIndex: lastOpIndex\n\t\t});\n\t}\n\twrite(operations) {\n\t\tthis.operations.push(...operations);\n\t}\n\tgetCollections() {\n\t\treturn this.collections;\n\t}\n\tgetCollectionMembershipRecords() {\n\t\treturn this.collectionMemberships;\n\t}\n\tgetCollectionRemovals() {\n\t\treturn this.collectionRemovals;\n\t}\n\tgetOperations() {\n\t\treturn this.operations;\n\t}\n};\nvar KyselyOperationIndex = class KyselyOperationIndex {\n\ttrx;\n\tconstructor(db) {\n\t\tthis.db = db;\n\t}\n\tget queryExecutor() {\n\t\treturn this.trx ?? this.db;\n\t}\n\twithTransaction(trx) {\n\t\tconst instance = new KyselyOperationIndex(this.db);\n\t\tinstance.trx = trx;\n\t\treturn instance;\n\t}\n\tstart() {\n\t\treturn new KyselyOperationIndexTxn();\n\t}\n\tasync commit(txn, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst kyselyTxn = txn;\n\t\tif (this.trx) return this.executeCommit(this.trx, kyselyTxn);\n\t\tlet resultOrdinals = [];\n\t\tawait this.db.transaction().execute(async (trx) => {\n\t\t\tresultOrdinals = await this.executeCommit(trx, kyselyTxn);\n\t\t});\n\t\treturn resultOrdinals;\n\t}\n\tasync executeCommit(trx, kyselyTxn) {\n\t\tconst collections = kyselyTxn.getCollections();\n\t\tconst memberships = kyselyTxn.getCollectionMembershipRecords();\n\t\tconst removals = kyselyTxn.getCollectionRemovals();\n\t\tconst operations = kyselyTxn.getOperations();\n\t\tif (collections.length > 0) {\n\t\t\tconst collectionRows = collections.map((collectionId) => ({\n\t\t\t\tdocumentId: collectionId,\n\t\t\t\tcollectionId,\n\t\t\t\tjoinedOrdinal: BigInt(0),\n\t\t\t\tleftOrdinal: null\n\t\t\t}));\n\t\t\tawait trx.insertInto(\"document_collections\").values(collectionRows).onConflict((oc) => oc.doNothing()).execute();\n\t\t}\n\t\tlet operationOrdinals = [];\n\t\tif (operations.length > 0) {\n\t\t\tconst operationRows = operations.map((op) => ({\n\t\t\t\topId: op.id || \"\",\n\t\t\t\tdocumentId: op.documentId,\n\t\t\t\tdocumentType: op.documentType,\n\t\t\t\tscope: op.scope,\n\t\t\t\tbranch: op.branch,\n\t\t\t\ttimestampUtcMs: op.timestampUtcMs,\n\t\t\t\tindex: op.index,\n\t\t\t\tskip: op.skip,\n\t\t\t\thash: op.hash,\n\t\t\t\taction: op.action,\n\t\t\t\tsourceRemote: op.sourceRemote\n\t\t\t}));\n\t\t\toperationOrdinals = (await trx.insertInto(\"operation_index_operations\").values(operationRows).returning(\"ordinal\").execute()).map((row) => row.ordinal);\n\t\t}\n\t\tif (memberships.length > 0) for (const m of memberships) {\n\t\t\tconst ordinal = operationOrdinals[m.operationIndex];\n\t\t\tawait trx.insertInto(\"document_collections\").values({\n\t\t\t\tdocumentId: m.documentId,\n\t\t\t\tcollectionId: m.collectionId,\n\t\t\t\tjoinedOrdinal: BigInt(ordinal),\n\t\t\t\tleftOrdinal: null\n\t\t\t}).onConflict((oc) => oc.columns([\"documentId\", \"collectionId\"]).doUpdateSet({\n\t\t\t\tjoinedOrdinal: BigInt(ordinal),\n\t\t\t\tleftOrdinal: null\n\t\t\t})).execute();\n\t\t}\n\t\tif (removals.length > 0) for (const r of removals) {\n\t\t\tconst ordinal = operationOrdinals[r.operationIndex];\n\t\t\tawait trx.updateTable(\"document_collections\").set({ leftOrdinal: BigInt(ordinal) }).where(\"collectionId\", \"=\", r.collectionId).where(\"documentId\", \"=\", r.documentId).where(\"leftOrdinal\", \"is\", null).execute();\n\t\t}\n\t\treturn operationOrdinals;\n\t}\n\tasync find(collectionId, cursor, view, paging, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tlet query = this.queryExecutor.selectFrom(\"operation_index_operations as oi\").innerJoin(\"document_collections as dc\", \"oi.documentId\", \"dc.documentId\").selectAll(\"oi\").select([\"dc.documentId\", \"dc.collectionId\"]).where(\"dc.collectionId\", \"=\", collectionId).where(sql`(dc.\"leftOrdinal\" IS NULL OR oi.ordinal < dc.\"leftOrdinal\")`).orderBy(\"oi.ordinal\", \"asc\");\n\t\tif (cursor !== void 0) query = query.where(\"oi.ordinal\", \">\", cursor);\n\t\tif (view?.branch) query = query.where(\"oi.branch\", \"=\", view.branch);\n\t\tif (view?.scopes && view.scopes.length > 0) query = query.where(\"oi.scope\", \"in\", view.scopes);\n\t\tif (view?.excludeSourceRemote) query = query.where(\"oi.sourceRemote\", \"!=\", view.excludeSourceRemote);\n\t\tif (paging?.cursor) {\n\t\t\tconst cursorOrdinal = Number.parseInt(paging.cursor, 10);\n\t\t\tquery = query.where(\"oi.ordinal\", \">\", cursorOrdinal);\n\t\t}\n\t\tif (paging?.limit) query = query.limit(paging.limit + 1);\n\t\tconst rows = await query.execute();\n\t\tlet hasMore = false;\n\t\tlet items = rows;\n\t\tif (paging?.limit && rows.length > paging.limit) {\n\t\t\thasMore = true;\n\t\t\titems = rows.slice(0, paging.limit);\n\t\t}\n\t\tconst nextCursor = hasMore && items.length > 0 ? items[items.length - 1].ordinal.toString() : void 0;\n\t\tconst cursorValue = paging?.cursor || \"0\";\n\t\tconst limit = paging?.limit || 100;\n\t\treturn {\n\t\t\tresults: items.map((row) => this.rowToOperationIndexEntry(row)),\n\t\t\toptions: {\n\t\t\t\tcursor: cursorValue,\n\t\t\t\tlimit\n\t\t\t},\n\t\t\tnextCursor,\n\t\t\tnext: hasMore ? () => this.find(collectionId, cursor, view, {\n\t\t\t\tcursor: nextCursor,\n\t\t\t\tlimit\n\t\t\t}, signal) : void 0\n\t\t};\n\t}\n\tasync get(documentId, view, paging, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tlet query = this.queryExecutor.selectFrom(\"operation_index_operations\").selectAll().where(\"documentId\", \"=\", documentId).orderBy(\"ordinal\", \"asc\");\n\t\tif (view?.branch) query = query.where(\"branch\", \"=\", view.branch);\n\t\tif (view?.scopes && view.scopes.length > 0) query = query.where(\"scope\", \"in\", view.scopes);\n\t\tif (paging?.cursor) {\n\t\t\tconst cursorOrdinal = Number.parseInt(paging.cursor, 10);\n\t\t\tquery = query.where(\"ordinal\", \">\", cursorOrdinal);\n\t\t}\n\t\tif (paging?.limit) query = query.limit(paging.limit + 1);\n\t\tconst rows = await query.execute();\n\t\tlet hasMore = false;\n\t\tlet items = rows;\n\t\tif (paging?.limit && rows.length > paging.limit) {\n\t\t\thasMore = true;\n\t\t\titems = rows.slice(0, paging.limit);\n\t\t}\n\t\tconst nextCursor = hasMore && items.length > 0 ? items[items.length - 1].ordinal.toString() : void 0;\n\t\tconst cursorValue = paging?.cursor || \"0\";\n\t\tconst limit = paging?.limit || 100;\n\t\treturn {\n\t\t\tresults: items.map((row) => this.rowToOperationIndexEntry(row)),\n\t\t\toptions: {\n\t\t\t\tcursor: cursorValue,\n\t\t\t\tlimit\n\t\t\t},\n\t\t\tnextCursor,\n\t\t\tnext: hasMore ? () => this.get(documentId, view, {\n\t\t\t\tcursor: nextCursor,\n\t\t\t\tlimit\n\t\t\t}, signal) : void 0\n\t\t};\n\t}\n\tasync getSinceOrdinal(ordinal, paging, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tlet query = this.queryExecutor.selectFrom(\"operation_index_operations\").selectAll().where(\"ordinal\", \">\", ordinal).orderBy(\"ordinal\", \"asc\");\n\t\tif (paging?.cursor) {\n\t\t\tconst cursorOrdinal = Number.parseInt(paging.cursor, 10);\n\t\t\tquery = query.where(\"ordinal\", \">\", cursorOrdinal);\n\t\t}\n\t\tif (paging?.limit) query = query.limit(paging.limit + 1);\n\t\tconst rows = await query.execute();\n\t\tlet hasMore = false;\n\t\tlet items = rows;\n\t\tif (paging?.limit && rows.length > paging.limit) {\n\t\t\thasMore = true;\n\t\t\titems = rows.slice(0, paging.limit);\n\t\t}\n\t\tconst nextCursor = hasMore && items.length > 0 ? items[items.length - 1].ordinal.toString() : void 0;\n\t\tconst cursorValue = paging?.cursor || \"0\";\n\t\tconst limit = paging?.limit || 100;\n\t\treturn {\n\t\t\tresults: items.map((row) => this.rowToOperationWithContext(row)),\n\t\t\toptions: {\n\t\t\t\tcursor: cursorValue,\n\t\t\t\tlimit\n\t\t\t},\n\t\t\tnextCursor,\n\t\t\tnext: hasMore ? () => this.getSinceOrdinal(ordinal, {\n\t\t\t\tcursor: nextCursor,\n\t\t\t\tlimit\n\t\t\t}, signal) : void 0\n\t\t};\n\t}\n\trowToOperationWithContext(row) {\n\t\treturn {\n\t\t\toperation: {\n\t\t\t\tindex: row.index,\n\t\t\t\ttimestampUtcMs: row.timestampUtcMs,\n\t\t\t\thash: row.hash,\n\t\t\t\tskip: row.skip,\n\t\t\t\taction: row.action,\n\t\t\t\tid: row.opId\n\t\t\t},\n\t\t\tcontext: {\n\t\t\t\tdocumentId: row.documentId,\n\t\t\t\tdocumentType: row.documentType,\n\t\t\t\tscope: row.scope,\n\t\t\t\tbranch: row.branch,\n\t\t\t\tordinal: row.ordinal\n\t\t\t}\n\t\t};\n\t}\n\trowToOperationIndexEntry(row) {\n\t\treturn {\n\t\t\tordinal: row.ordinal,\n\t\t\tdocumentId: row.documentId,\n\t\t\tdocumentType: row.documentType,\n\t\t\tbranch: row.branch,\n\t\t\tscope: row.scope,\n\t\t\tindex: row.index,\n\t\t\ttimestampUtcMs: row.timestampUtcMs,\n\t\t\thash: row.hash,\n\t\t\tskip: row.skip,\n\t\t\taction: row.action,\n\t\t\tid: row.opId,\n\t\t\tsourceRemote: row.sourceRemote\n\t\t};\n\t}\n\tasync getLatestTimestampForCollection(collectionId, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\treturn (await this.queryExecutor.selectFrom(\"operation_index_operations as oi\").innerJoin(\"document_collections as dc\", \"oi.documentId\", \"dc.documentId\").select(\"oi.timestampUtcMs\").where(\"dc.collectionId\", \"=\", collectionId).where(sql`(dc.\"leftOrdinal\" IS NULL OR oi.ordinal < dc.\"leftOrdinal\")`).orderBy(\"oi.ordinal\", \"desc\").limit(1).executeTakeFirst())?.timestampUtcMs ?? null;\n\t}\n\tasync getCollectionsForDocuments(documentIds) {\n\t\tif (documentIds.length === 0) return {};\n\t\tconst rows = await this.queryExecutor.selectFrom(\"document_collections\").select([\"documentId\", \"collectionId\"]).where(\"documentId\", \"in\", documentIds).where(\"leftOrdinal\", \"is\", null).execute();\n\t\tconst result = {};\n\t\tfor (const row of rows) {\n\t\t\tif (!(row.documentId in result)) result[row.documentId] = [];\n\t\t\tresult[row.documentId].push(row.collectionId);\n\t\t}\n\t\treturn result;\n\t}\n};\n//#endregion\n//#region src/cache/buffer/ring-buffer.ts\n/**\n* RingBuffer is a generic circular buffer implementation that stores a fixed number\n* of items. When the buffer is full, new items overwrite the oldest items.\n*\n* This implementation maintains O(1) time complexity for push operations and provides\n* items in chronological order (oldest to newest) via getAll().\n*\n* @template T - The type of items stored in the buffer\n*/\nvar RingBuffer = class {\n\tbuffer;\n\thead = 0;\n\tsize = 0;\n\tcapacity;\n\tconstructor(capacity) {\n\t\tif (capacity <= 0) throw new Error(\"Ring buffer capacity must be greater than 0\");\n\t\tthis.capacity = capacity;\n\t\tthis.buffer = new Array(capacity);\n\t}\n\t/**\n\t* Adds an item to the buffer. If the buffer is full, overwrites the oldest item.\n\t*\n\t* @param item - The item to add\n\t*/\n\tpush(item) {\n\t\tconst index = (this.head + this.size) % this.capacity;\n\t\tif (this.size < this.capacity) {\n\t\t\tthis.buffer[index] = item;\n\t\t\tthis.size++;\n\t\t} else {\n\t\t\tthis.buffer[this.head] = item;\n\t\t\tthis.head = (this.head + 1) % this.capacity;\n\t\t}\n\t}\n\t/**\n\t* Returns all items in the buffer in chronological order (oldest to newest).\n\t*\n\t* @returns Array of items in insertion order\n\t*/\n\tgetAll() {\n\t\tif (this.size === 0) return [];\n\t\tconst result = [];\n\t\tfor (let i = 0; i < this.size; i++) {\n\t\t\tconst index = (this.head + i) % this.capacity;\n\t\t\tresult.push(this.buffer[index]);\n\t\t}\n\t\treturn result;\n\t}\n\t/**\n\t* Clears all items from the buffer.\n\t*/\n\tclear() {\n\t\tthis.buffer = new Array(this.capacity);\n\t\tthis.head = 0;\n\t\tthis.size = 0;\n\t}\n\t/**\n\t* Gets the current number of items in the buffer.\n\t*/\n\tget length() {\n\t\treturn this.size;\n\t}\n};\n//#endregion\n//#region src/cache/kysely-write-cache.ts\nfunction extractModuleVersion(doc) {\n\tconst v = doc.state.document.version;\n\treturn v === 0 ? void 0 : v;\n}\n/**\n* In-memory write cache with keyframe persistence for PHDocuments.\n*\n* Caches document snapshots in ring buffers with LRU eviction. On cache miss,\n* rebuilds documents from nearest keyframe or full operation history.\n*\n* **Performance Characteristics:**\n* - Cache hit: O(1) lookup in ring buffer\n* - Cold miss: O(n) where n is total operation count, or O(k) where k is operations since keyframe\n* - Warm miss: O(m) where m is operations since cached revision\n* - Eviction: O(1) for LRU tracking and removal\n*\n* **Thread Safety:**\n* Not thread-safe. Designed for single-threaded job executor environment.\n* External synchronization required for concurrent access across multiple executors.\n*\n* **Example:**\n* ```typescript\n* const cache = new KyselyWriteCache(\n* keyframeStore,\n* operationStore,\n* registry,\n* { maxDocuments: 1000, ringBufferSize: 10, keyframeInterval: 10 }\n* );\n*\n* await cache.startup();\n*\n* // Retrieve or rebuild document\n* const doc = await cache.getState(docId, docType, scope, branch, revision);\n*\n* // Cache result after job execution\n* cache.putState(docId, docType, scope, branch, newRevision, updatedDoc);\n*\n* await cache.shutdown();\n* ```\n*/\nvar KyselyWriteCache = class KyselyWriteCache {\n\tstreams;\n\tlruTracker;\n\tkeyframeStore;\n\toperationStore;\n\tregistry;\n\tconfig;\n\tconstructor(keyframeStore, operationStore, registry, config) {\n\t\tthis.keyframeStore = keyframeStore;\n\t\tthis.operationStore = operationStore;\n\t\tthis.registry = registry;\n\t\tthis.config = {\n\t\t\tmaxDocuments: config.maxDocuments,\n\t\t\tringBufferSize: config.ringBufferSize,\n\t\t\tkeyframeInterval: config.keyframeInterval\n\t\t};\n\t\tthis.streams = /* @__PURE__ */ new Map();\n\t\tthis.lruTracker = new LRUTracker();\n\t}\n\twithScopedStores(operationStore, keyframeStore) {\n\t\tconst scoped = new KyselyWriteCache(keyframeStore, operationStore, this.registry, this.config);\n\t\tscoped.streams = this.streams;\n\t\tscoped.lruTracker = this.lruTracker;\n\t\treturn scoped;\n\t}\n\t/**\n\t* Initializes the write cache.\n\t* Currently a no-op as keyframe store lifecycle is managed externally.\n\t*/\n\tasync startup() {\n\t\treturn Promise.resolve();\n\t}\n\t/**\n\t* Shuts down the write cache.\n\t* Currently a no-op as keyframe store lifecycle is managed externally.\n\t*/\n\tasync shutdown() {\n\t\treturn Promise.resolve();\n\t}\n\t/**\n\t* Retrieves document state at a specific revision from cache or rebuilds it.\n\t*\n\t* Cache hit path: Returns cached snapshot if available (O(1))\n\t* Warm miss path: Rebuilds from cached base revision + incremental ops\n\t* Cold miss path: Rebuilds from keyframe or from scratch using all operations\n\t*\n\t* @param documentId - The document identifier\n\t* @param scope - The operation scope\n\t* @param branch - The operation branch\n\t* @param targetRevision - The target revision, or undefined for newest\n\t* @param signal - Optional abort signal to cancel the operation\n\t* @returns The document at the target revision\n\t* @throws {Error} \"Operation aborted\" if signal is aborted\n\t* @throws {ModuleNotFoundError} If document type not registered in registry\n\t* @throws {Error} \"Failed to rebuild document\" if operation store fails\n\t* @throws {Error} If reducer throws during operation application\n\t* @throws {Error} If document serialization fails\n\t*/\n\tasync getState(documentId, scope, branch, targetRevision, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst streamKey = this.makeStreamKey(documentId, scope, branch);\n\t\tconst stream = this.streams.get(streamKey);\n\t\tif (stream) {\n\t\t\tconst snapshots = stream.ringBuffer.getAll();\n\t\t\tif (targetRevision === void 0) {\n\t\t\t\tif (snapshots.length > 0) {\n\t\t\t\t\tconst newest = snapshots[snapshots.length - 1];\n\t\t\t\t\tthis.lruTracker.touch(streamKey);\n\t\t\t\t\treturn newest.document;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst exactMatch = snapshots.find((s) => s.revision === targetRevision);\n\t\t\t\tif (exactMatch) {\n\t\t\t\t\tthis.lruTracker.touch(streamKey);\n\t\t\t\t\treturn exactMatch.document;\n\t\t\t\t}\n\t\t\t\tconst newestOlder = this.findNearestOlderSnapshot(snapshots, targetRevision);\n\t\t\t\tif (newestOlder) {\n\t\t\t\t\tconst document = await this.warmMissRebuild(newestOlder.document, newestOlder.revision, documentId, scope, branch, targetRevision, signal);\n\t\t\t\t\tthis.putState(documentId, scope, branch, targetRevision, document);\n\t\t\t\t\tthis.lruTracker.touch(streamKey);\n\t\t\t\t\treturn document;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst document = await this.coldMissRebuild(documentId, scope, branch, targetRevision, signal);\n\t\tlet revision = targetRevision;\n\t\tif (revision === void 0) revision = document.header.revision[scope] || 0;\n\t\tthis.putState(documentId, scope, branch, revision, document);\n\t\treturn document;\n\t}\n\t/**\n\t* Stores a document snapshot in the cache at a specific revision.\n\t*\n\t* The cached document is a shallow copy of the input with its operation history\n\t* truncated to the last operation per scope and its clipboard cleared. This keeps\n\t* memory use and copy costs constant regardless of operation count. Consumers of\n\t* getState() must not rely on the full operation history being present; the only\n\t* guaranteed invariant is that operations[scope].at(-1) reflects the latest\n\t* operation index for each scope.\n\t*\n\t* Updates LRU tracker and may evict least recently used stream if at capacity.\n\t* Asynchronously persists keyframes at configured intervals (fire-and-forget).\n\t*\n\t* @param documentId - The document identifier\n\t* @param scope - The operation scope\n\t* @param branch - The operation branch\n\t* @param revision - The revision number\n\t* @param document - The document to cache\n\t* @throws {Error} If document serialization fails\n\t*/\n\tputState(documentId, scope, branch, revision, document) {\n\t\tconst streamKey = this.makeStreamKey(documentId, scope, branch);\n\t\tconst stream = this.getOrCreateStream(streamKey);\n\t\tconst snapshot = {\n\t\t\trevision,\n\t\t\tdocument: {\n\t\t\t\t...document,\n\t\t\t\toperations: Object.fromEntries(Object.entries(document.operations).map(([k, ops]) => [k, ops.length ? [ops.at(-1)] : []])),\n\t\t\t\tclipboard: []\n\t\t\t}\n\t\t};\n\t\tstream.ringBuffer.push(snapshot);\n\t\tif (this.isKeyframeRevision(revision)) this.keyframeStore.putKeyframe(documentId, scope, branch, revision, {\n\t\t\t...document,\n\t\t\toperations: {},\n\t\t\tclipboard: []\n\t\t}).catch((err) => {\n\t\t\tconsole.error(`Failed to persist keyframe ${documentId}@${revision}:`, err);\n\t\t});\n\t}\n\t/**\n\t* Invalidates cached document streams.\n\t*\n\t* Supports three invalidation scopes:\n\t* - Document-level: invalidate(documentId) - removes all streams for document\n\t* - Scope-level: invalidate(documentId, scope) - removes all branches for scope\n\t* - Stream-level: invalidate(documentId, scope, branch) - removes specific stream\n\t*\n\t* @param documentId - The document identifier\n\t* @param scope - Optional scope to narrow invalidation\n\t* @param branch - Optional branch to narrow invalidation (requires scope)\n\t* @returns The number of streams evicted\n\t*/\n\tinvalidate(documentId, scope, branch) {\n\t\tlet evicted = 0;\n\t\tif (scope === void 0 && branch === void 0) {\n\t\t\tfor (const [key] of this.streams.entries()) if (key.startsWith(`${documentId}:`)) {\n\t\t\t\tthis.streams.delete(key);\n\t\t\t\tthis.lruTracker.remove(key);\n\t\t\t\tevicted++;\n\t\t\t}\n\t\t} else if (scope !== void 0 && branch === void 0) {\n\t\t\tfor (const [key] of this.streams.entries()) if (key.startsWith(`${documentId}:${scope}:`)) {\n\t\t\t\tthis.streams.delete(key);\n\t\t\t\tthis.lruTracker.remove(key);\n\t\t\t\tevicted++;\n\t\t\t}\n\t\t} else if (scope !== void 0 && branch !== void 0) {\n\t\t\tconst key = this.makeStreamKey(documentId, scope, branch);\n\t\t\tif (this.streams.has(key)) {\n\t\t\t\tthis.streams.delete(key);\n\t\t\t\tthis.lruTracker.remove(key);\n\t\t\t\tevicted = 1;\n\t\t\t}\n\t\t}\n\t\treturn evicted;\n\t}\n\t/**\n\t* Clears the entire cache, removing all cached document streams.\n\t* Resets LRU tracking state. This operation always succeeds.\n\t*/\n\tclear() {\n\t\tthis.streams.clear();\n\t\tthis.lruTracker.clear();\n\t}\n\t/**\n\t* Retrieves a specific stream for a document. Exposed on the implementation\n\t* for testing, but not on the interface.\n\t*\n\t* @internal\n\t*/\n\tgetStream(documentId, scope, branch) {\n\t\tconst key = this.makeStreamKey(documentId, scope, branch);\n\t\treturn this.streams.get(key);\n\t}\n\tasync findNearestKeyframe(documentId, scope, branch, targetRevision, signal) {\n\t\tif (targetRevision === Number.MAX_SAFE_INTEGER || targetRevision <= 0) return;\n\t\treturn this.keyframeStore.findNearestKeyframe(documentId, scope, branch, targetRevision, signal);\n\t}\n\tasync coldMissRebuild(documentId, scope, branch, targetRevision, signal) {\n\t\tconst effectiveTargetRevision = targetRevision || Number.MAX_SAFE_INTEGER;\n\t\tconst keyframe = await this.findNearestKeyframe(documentId, scope, branch, effectiveTargetRevision, signal);\n\t\tlet document;\n\t\tlet startRevision;\n\t\tlet documentType;\n\t\tif (keyframe) {\n\t\t\tdocument = keyframe.document;\n\t\t\tstartRevision = keyframe.revision;\n\t\t\tdocumentType = keyframe.document.header.documentType;\n\t\t} else {\n\t\t\tdocument = void 0;\n\t\t\tstartRevision = -1;\n\t\t\tconst createOpResult = await this.operationStore.getSince(documentId, \"document\", branch, -1, void 0, {\n\t\t\t\tcursor: \"0\",\n\t\t\t\tlimit: 1\n\t\t\t}, signal);\n\t\t\tif (createOpResult.results.length === 0) throw new Error(`Failed to rebuild document ${documentId}: no CREATE_DOCUMENT operation found in document scope`);\n\t\t\tconst createOp = createOpResult.results[0];\n\t\t\tif (createOp.action.type !== \"CREATE_DOCUMENT\") throw new Error(`Failed to rebuild document ${documentId}: first operation in document scope must be CREATE_DOCUMENT, found ${createOp.action.type}`);\n\t\t\tconst documentCreateAction = createOp.action;\n\t\t\tdocumentType = documentCreateAction.input.model;\n\t\t\tif (!documentType) throw new Error(`Failed to rebuild document ${documentId}: CREATE_DOCUMENT action missing model in input`);\n\t\t\tdocument = createDocumentFromAction(documentCreateAction);\n\t\t\tlet docModule = this.registry.getModule(documentType, extractModuleVersion(document));\n\t\t\tconst docScopeOps = await this.operationStore.getSince(documentId, \"document\", branch, 0, void 0, void 0, signal);\n\t\t\tfor (const operation of docScopeOps.results) {\n\t\t\t\tif (operation.index === 0) continue;\n\t\t\t\tif (operation.action.type === \"UPGRADE_DOCUMENT\") {\n\t\t\t\t\tconst upgradeAction = operation.action;\n\t\t\t\t\tdocument = applyUpgradeDocumentAction(document, upgradeAction);\n\t\t\t\t\tdocModule = this.registry.getModule(documentType, extractModuleVersion(document));\n\t\t\t\t} else if (operation.action.type === \"DELETE_DOCUMENT\") applyDeleteDocumentAction(document, operation.action);\n\t\t\t\telse {\n\t\t\t\t\tconst protocolVersion = document.header.protocolVersions?.[\"base-reducer\"] ?? 1;\n\t\t\t\t\tdocument = docModule.reducer(document, operation.action, void 0, {\n\t\t\t\t\t\tskip: operation.skip,\n\t\t\t\t\t\tprotocolVersion\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst module = this.registry.getModule(documentType, extractModuleVersion(document));\n\t\tlet cursor = void 0;\n\t\tconst pageSize = 100;\n\t\tlet hasMorePages;\n\t\tdo {\n\t\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\t\tconst paging = {\n\t\t\t\tcursor: cursor || \"0\",\n\t\t\t\tlimit: pageSize\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tconst result = await this.operationStore.getSince(documentId, scope, branch, startRevision, void 0, paging, signal);\n\t\t\t\tfor (const operation of result.results) {\n\t\t\t\t\tif (targetRevision !== void 0 && operation.index > targetRevision) break;\n\t\t\t\t\tconst protocolVersion = document.header.protocolVersions?.[\"base-reducer\"] ?? 1;\n\t\t\t\t\tdocument = module.reducer(document, operation.action, void 0, {\n\t\t\t\t\t\tskip: operation.skip,\n\t\t\t\t\t\tprotocolVersion\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tconst reachedTarget = targetRevision !== void 0 && result.results.some((op) => op.index >= targetRevision);\n\t\t\t\thasMorePages = Boolean(result.nextCursor) && !reachedTarget;\n\t\t\t\tif (hasMorePages) cursor = result.nextCursor;\n\t\t\t} catch (err) {\n\t\t\t\tthrow new Error(`Failed to rebuild document ${documentId}: ${err instanceof Error ? err.message : String(err)}`);\n\t\t\t}\n\t\t} while (hasMorePages);\n\t\tconst revisions = await this.operationStore.getRevisions(documentId, branch, signal);\n\t\tdocument.header.revision = revisions.revision;\n\t\tdocument.header.lastModifiedAtUtcIso = revisions.latestTimestamp;\n\t\treturn document;\n\t}\n\tasync warmMissRebuild(baseDocument, baseRevision, documentId, scope, branch, targetRevision, signal) {\n\t\tconst documentType = baseDocument.header.documentType;\n\t\tconst module = this.registry.getModule(documentType);\n\t\tlet document = baseDocument;\n\t\ttry {\n\t\t\tconst pagedResults = await this.operationStore.getSince(documentId, scope, branch, baseRevision, void 0, void 0, signal);\n\t\t\tfor (const operation of pagedResults.results) {\n\t\t\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\t\t\tif (targetRevision !== void 0 && operation.index > targetRevision) break;\n\t\t\t\tconst protocolVersion = document.header.protocolVersions?.[\"base-reducer\"] ?? 1;\n\t\t\t\tdocument = module.reducer(document, operation.action, void 0, {\n\t\t\t\t\tskip: operation.skip,\n\t\t\t\t\tprotocolVersion\n\t\t\t\t});\n\t\t\t\tif (targetRevision !== void 0 && operation.index === targetRevision) break;\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tthrow new Error(`Failed to rebuild document ${documentId}: ${err instanceof Error ? err.message : String(err)}`);\n\t\t}\n\t\tconst revisions = await this.operationStore.getRevisions(documentId, branch, signal);\n\t\tdocument.header.revision = revisions.revision;\n\t\tdocument.header.lastModifiedAtUtcIso = revisions.latestTimestamp;\n\t\treturn document;\n\t}\n\tfindNearestOlderSnapshot(snapshots, targetRevision) {\n\t\tlet nearest = void 0;\n\t\tfor (const snapshot of snapshots) if (snapshot.revision < targetRevision) {\n\t\t\tif (!nearest || snapshot.revision > nearest.revision) nearest = snapshot;\n\t\t}\n\t\treturn nearest;\n\t}\n\tmakeStreamKey(documentId, scope, branch) {\n\t\treturn `${documentId}:${scope}:${branch}`;\n\t}\n\tgetOrCreateStream(key) {\n\t\tlet stream = this.streams.get(key);\n\t\tif (!stream) {\n\t\t\tif (this.streams.size >= this.config.maxDocuments) {\n\t\t\t\tconst evictKey = this.lruTracker.evict();\n\t\t\t\tif (evictKey) this.streams.delete(evictKey);\n\t\t\t}\n\t\t\tstream = {\n\t\t\t\tkey,\n\t\t\t\tringBuffer: new RingBuffer(this.config.ringBufferSize)\n\t\t\t};\n\t\t\tthis.streams.set(key, stream);\n\t\t}\n\t\tthis.lruTracker.touch(key);\n\t\treturn stream;\n\t}\n\tisKeyframeRevision(revision) {\n\t\treturn revision > 0 && revision % this.config.keyframeInterval === 0;\n\t}\n};\n//#endregion\n//#region src/events/event-bus.ts\nvar EventBus = class {\n\teventTypeToSubscribers = /* @__PURE__ */ new Map();\n\tsubscribe(type, subscriber) {\n\t\tlet list = this.eventTypeToSubscribers.get(type);\n\t\tif (!list) {\n\t\t\tlist = [];\n\t\t\tthis.eventTypeToSubscribers.set(type, list);\n\t\t}\n\t\tlist.push(subscriber);\n\t\tlet done = false;\n\t\treturn () => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tconst arr = this.eventTypeToSubscribers.get(type);\n\t\t\tif (!arr) return;\n\t\t\tconst idx = arr.indexOf(subscriber);\n\t\t\tif (idx !== -1) arr.splice(idx, 1);\n\t\t\tif (arr.length === 0) this.eventTypeToSubscribers.delete(type);\n\t\t};\n\t}\n\tasync emit(type, data) {\n\t\tconst list = this.eventTypeToSubscribers.get(type);\n\t\tif (!list || list.length === 0) return;\n\t\tconst snapshot = list.slice();\n\t\tconst errors = [];\n\t\tfor (const fn of snapshot) try {\n\t\t\tawait Promise.resolve(fn(type, data));\n\t\t} catch (err) {\n\t\t\terrors.push(err);\n\t\t}\n\t\tif (errors.length > 0) throw new EventBusAggregateError(errors);\n\t}\n};\n//#endregion\n//#region src/executor/execution-scope.ts\nvar DefaultExecutionScope = class {\n\tconstructor(operationStore, operationIndex, writeCache, documentMetaCache, collectionMembershipCache) {\n\t\tthis.operationStore = operationStore;\n\t\tthis.operationIndex = operationIndex;\n\t\tthis.writeCache = writeCache;\n\t\tthis.documentMetaCache = documentMetaCache;\n\t\tthis.collectionMembershipCache = collectionMembershipCache;\n\t}\n\tasync run(fn, signal) {\n\t\tsignal?.throwIfAborted();\n\t\treturn fn({\n\t\t\toperationStore: this.operationStore,\n\t\t\toperationIndex: this.operationIndex,\n\t\t\twriteCache: this.writeCache,\n\t\t\tdocumentMetaCache: this.documentMetaCache,\n\t\t\tcollectionMembershipCache: this.collectionMembershipCache\n\t\t});\n\t}\n};\nvar KyselyExecutionScope = class {\n\tconstructor(db, operationStore, operationIndex, keyframeStore, writeCache, documentMetaCache, collectionMembershipCache) {\n\t\tthis.db = db;\n\t\tthis.operationStore = operationStore;\n\t\tthis.operationIndex = operationIndex;\n\t\tthis.keyframeStore = keyframeStore;\n\t\tthis.writeCache = writeCache;\n\t\tthis.documentMetaCache = documentMetaCache;\n\t\tthis.collectionMembershipCache = collectionMembershipCache;\n\t}\n\tasync run(fn, signal) {\n\t\tsignal?.throwIfAborted();\n\t\treturn this.db.transaction().execute(async (trx) => {\n\t\t\tconst scopedOperationStore = this.operationStore.withTransaction(trx);\n\t\t\tconst scopedOperationIndex = this.operationIndex.withTransaction(trx);\n\t\t\tconst scopedKeyframeStore = this.keyframeStore.withTransaction(trx);\n\t\t\treturn fn({\n\t\t\t\toperationStore: scopedOperationStore,\n\t\t\t\toperationIndex: scopedOperationIndex,\n\t\t\t\twriteCache: this.writeCache.withScopedStores(scopedOperationStore, scopedKeyframeStore),\n\t\t\t\tdocumentMetaCache: this.documentMetaCache.withScopedStore(scopedOperationStore),\n\t\t\t\tcollectionMembershipCache: this.collectionMembershipCache.withScopedIndex(scopedOperationIndex)\n\t\t\t});\n\t\t});\n\t}\n};\n//#endregion\n//#region src/queue/types.ts\n/**\n* State of a job in the queue\n*/\nlet JobQueueState = /* @__PURE__ */ function(JobQueueState) {\n\tJobQueueState[JobQueueState[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n\tJobQueueState[JobQueueState[\"PREPROCESSING\"] = 0] = \"PREPROCESSING\";\n\tJobQueueState[JobQueueState[\"PENDING\"] = 1] = \"PENDING\";\n\tJobQueueState[JobQueueState[\"READY\"] = 2] = \"READY\";\n\tJobQueueState[JobQueueState[\"RUNNING\"] = 3] = \"RUNNING\";\n\tJobQueueState[JobQueueState[\"RESOLVED\"] = 4] = \"RESOLVED\";\n\treturn JobQueueState;\n}({});\n/**\n* Event types for the queue system\n*/\nconst QueueEventTypes = { JOB_AVAILABLE: 1e4 };\n//#endregion\n//#region src/registry/implementation.ts\n/**\n* Error thrown when a document model module is not found in the registry.\n*/\nvar ModuleNotFoundError = class extends Error {\n\tdocumentType;\n\trequestedVersion;\n\tconstructor(documentType, version) {\n\t\tconst versionSuffix = version !== void 0 ? ` version ${version}` : \"\";\n\t\tsuper(`Document model module not found for type: ${documentType}${versionSuffix}`);\n\t\tthis.name = \"ModuleNotFoundError\";\n\t\tthis.documentType = documentType;\n\t\tthis.requestedVersion = version;\n\t}\n\tstatic isError(error) {\n\t\treturn Error.isError(error) && error.name === \"ModuleNotFoundError\";\n\t}\n};\n/**\n* Error thrown when attempting to register a module that already exists.\n*/\nvar DuplicateModuleError = class extends Error {\n\tconstructor(documentType, version) {\n\t\tconst versionSuffix = version !== void 0 ? ` (version ${version})` : \"\";\n\t\tsuper(`Document model module already registered for type: ${documentType}${versionSuffix}`);\n\t\tthis.name = \"DuplicateModuleError\";\n\t}\n\tstatic isError(error) {\n\t\treturn Error.isError(error) && error.name === \"DuplicateModuleError\";\n\t}\n};\n/**\n* Error thrown when a module is invalid or malformed.\n*/\nvar InvalidModuleError = class extends Error {\n\tconstructor(message) {\n\t\tsuper(`Invalid document model module: ${message}`);\n\t\tthis.name = \"InvalidModuleError\";\n\t}\n};\n/**\n* Error thrown when attempting to register an upgrade manifest that already exists.\n*/\nvar DuplicateManifestError = class extends Error {\n\tconstructor(documentType) {\n\t\tsuper(`Upgrade manifest already registered for type: ${documentType}`);\n\t\tthis.name = \"DuplicateManifestError\";\n\t}\n\tstatic isError(error) {\n\t\treturn Error.isError(error) && error.name === \"DuplicateManifestError\";\n\t}\n};\n/**\n* Error thrown when an upgrade manifest is not found.\n*/\nvar ManifestNotFoundError = class extends Error {\n\tconstructor(documentType) {\n\t\tsuper(`Upgrade manifest not found for type: ${documentType}`);\n\t\tthis.name = \"ManifestNotFoundError\";\n\t}\n};\n/**\n* Error thrown when attempting a downgrade operation.\n*/\nvar DowngradeNotSupportedError = class extends Error {\n\tconstructor(documentType, fromVersion, toVersion) {\n\t\tsuper(`Downgrade not supported for ${documentType}: cannot go from version ${fromVersion} to ${toVersion}`);\n\t\tthis.name = \"DowngradeNotSupportedError\";\n\t}\n};\n/**\n* Error thrown when a required upgrade transition is missing from the manifest.\n*/\nvar MissingUpgradeTransitionError = class extends Error {\n\tconstructor(documentType, fromVersion, toVersion) {\n\t\tsuper(`Missing upgrade transition for ${documentType}: v${fromVersion} to v${toVersion}`);\n\t\tthis.name = \"MissingUpgradeTransitionError\";\n\t}\n};\n/**\n* Error thrown when getUpgradeReducer is called with a non-single-step version increment.\n*/\nvar InvalidUpgradeStepError = class extends Error {\n\tconstructor(documentType, fromVersion, toVersion) {\n\t\tsuper(`Invalid upgrade step for ${documentType}: must be single version increment, got v${fromVersion} to v${toVersion}`);\n\t\tthis.name = \"InvalidUpgradeStepError\";\n\t}\n};\n/**\n* In-memory implementation of the IDocumentModelRegistry interface.\n* Manages document model modules with version-aware storage and upgrade manifest support.\n*/\nvar DocumentModelRegistry = class {\n\tmodules = [];\n\tmanifests = [];\n\tregisterModules(...modules) {\n\t\treturn modules.map((module) => {\n\t\t\ttry {\n\t\t\t\tconst documentType = module.documentModel.global.id;\n\t\t\t\tconst version = module.version ?? 1;\n\t\t\t\tfor (let i = 0; i < this.modules.length; i++) {\n\t\t\t\t\tconst existing = this.modules[i];\n\t\t\t\t\tconst existingType = existing.documentModel.global.id;\n\t\t\t\t\tconst existingVersion = existing.version ?? 1;\n\t\t\t\t\tif (existingType === documentType && existingVersion === version) throw new DuplicateModuleError(documentType, version);\n\t\t\t\t}\n\t\t\t\tthis.modules.push(module);\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"success\",\n\t\t\t\t\titem: module\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\titem: module,\n\t\t\t\t\terror: error instanceof Error ? error : new Error(String(error))\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\t}\n\tunregisterModules(...documentTypes) {\n\t\tlet allFound = true;\n\t\tfor (const documentType of documentTypes) {\n\t\t\tif (!this.modules.some((m) => m.documentModel.global.id === documentType)) allFound = false;\n\t\t\tthis.modules = this.modules.filter((m) => m.documentModel.global.id !== documentType);\n\t\t}\n\t\treturn allFound;\n\t}\n\tgetModule(documentType, version) {\n\t\tlet latestModule;\n\t\tlet latestVersion = -1;\n\t\tfor (let i = 0; i < this.modules.length; i++) {\n\t\t\tconst module = this.modules[i];\n\t\t\tconst moduleType = module.documentModel.global.id;\n\t\t\tconst moduleVersion = module.version ?? 1;\n\t\t\tif (moduleType === documentType) {\n\t\t\t\tif (version !== void 0 && moduleVersion === version) return module;\n\t\t\t\tif (moduleVersion > latestVersion) {\n\t\t\t\t\tlatestModule = module;\n\t\t\t\t\tlatestVersion = moduleVersion;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (version === void 0 && latestModule !== void 0) return latestModule;\n\t\tthrow new ModuleNotFoundError(documentType, version);\n\t}\n\tgetAllModules() {\n\t\treturn [...this.modules];\n\t}\n\tclear() {\n\t\tthis.modules = [];\n\t\tthis.manifests = [];\n\t}\n\tgetSupportedVersions(documentType) {\n\t\tconst versions = [];\n\t\tfor (const module of this.modules) if (module.documentModel.global.id === documentType) versions.push(module.version ?? 1);\n\t\tif (versions.length === 0) throw new ModuleNotFoundError(documentType);\n\t\treturn versions.sort((a, b) => a - b);\n\t}\n\tgetLatestVersion(documentType) {\n\t\tlet latest = -1;\n\t\tlet found = false;\n\t\tfor (const module of this.modules) if (module.documentModel.global.id === documentType) {\n\t\t\tfound = true;\n\t\t\tconst version = module.version ?? 1;\n\t\t\tif (version > latest) latest = version;\n\t\t}\n\t\tif (!found) throw new ModuleNotFoundError(documentType);\n\t\treturn latest;\n\t}\n\tregisterUpgradeManifests(...manifestsToRegister) {\n\t\treturn manifestsToRegister.map((manifestToRegister) => {\n\t\t\ttry {\n\t\t\t\tif (!manifestToRegister.documentType) throw new Error(\"Upgrade manifest is missing a documentType\");\n\t\t\t\tfor (const registeredManifest of this.manifests) if (registeredManifest.documentType === manifestToRegister.documentType) throw new DuplicateManifestError(manifestToRegister.documentType);\n\t\t\t\tthis.manifests.push(manifestToRegister);\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"success\",\n\t\t\t\t\titem: manifestToRegister\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\titem: manifestToRegister,\n\t\t\t\t\terror: error instanceof Error ? error : new Error(String(error))\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\t}\n\tunregisterUpgradeManifests(...documentTypes) {\n\t\tlet allFound = true;\n\t\tfor (const documentType of documentTypes) {\n\t\t\tif (!this.manifests.some((m) => m.documentType === documentType)) allFound = false;\n\t\t\tthis.manifests = this.manifests.filter((m) => m.documentType !== documentType);\n\t\t}\n\t\treturn allFound;\n\t}\n\tgetUpgradeManifest(documentType) {\n\t\tfor (let i = 0; i < this.manifests.length; i++) if (this.manifests[i].documentType === documentType) return this.manifests[i];\n\t\tthrow new ManifestNotFoundError(documentType);\n\t}\n\tcomputeUpgradePath(documentType, fromVersion, toVersion) {\n\t\tif (fromVersion === toVersion) return [];\n\t\tif (toVersion < fromVersion) throw new DowngradeNotSupportedError(documentType, fromVersion, toVersion);\n\t\tconst manifest = this.getUpgradeManifest(documentType);\n\t\tconst path = [];\n\t\tfor (let v = fromVersion + 1; v <= toVersion; v++) {\n\t\t\tconst key = `v${v}`;\n\t\t\tif (!(key in manifest.upgrades)) throw new MissingUpgradeTransitionError(documentType, v - 1, v);\n\t\t\tconst transition = manifest.upgrades[key];\n\t\t\tpath.push(transition);\n\t\t}\n\t\treturn path;\n\t}\n\tgetUpgradeReducer(documentType, fromVersion, toVersion) {\n\t\tif (toVersion !== fromVersion + 1) throw new InvalidUpgradeStepError(documentType, fromVersion, toVersion);\n\t\tconst manifest = this.getUpgradeManifest(documentType);\n\t\tconst key = `v${toVersion}`;\n\t\tif (!(key in manifest.upgrades)) throw new MissingUpgradeTransitionError(documentType, fromVersion, toVersion);\n\t\treturn manifest.upgrades[key].upgradeReducer;\n\t}\n};\n//#endregion\n//#region src/executor/simple-job-executor-manager.ts\n/**\n* Manages multiple job executors and coordinates job distribution.\n* Listens for job available events and dispatches jobs to executors.\n*/\nvar SimpleJobExecutorManager = class {\n\texecutors = [];\n\tisRunning = false;\n\tactiveJobs = 0;\n\ttotalJobsProcessed = 0;\n\tunsubscribe;\n\tdeferredJobs = /* @__PURE__ */ new Map();\n\tjobTimeoutMs;\n\tconstructor(executorFactory, eventBus, queue, jobTracker, logger, resolver, jobTimeoutMs = 3e4) {\n\t\tthis.executorFactory = executorFactory;\n\t\tthis.eventBus = eventBus;\n\t\tthis.queue = queue;\n\t\tthis.jobTracker = jobTracker;\n\t\tthis.logger = logger;\n\t\tthis.resolver = resolver;\n\t\tthis.jobTimeoutMs = jobTimeoutMs;\n\t}\n\tasync start(numExecutors) {\n\t\tif (this.isRunning) throw new Error(\"JobExecutorManager is already running\");\n\t\tif (numExecutors < 1) throw new Error(\"Number of executors must be at least 1\");\n\t\tthis.executors = [];\n\t\tfor (let i = 0; i < numExecutors; i++) this.executors.push(this.executorFactory());\n\t\tthis.unsubscribe = this.eventBus.subscribe(QueueEventTypes.JOB_AVAILABLE, async () => {\n\t\t\tif (this.activeJobs < this.executors.length) await this.processNextJob();\n\t\t});\n\t\tthis.isRunning = true;\n\t\tawait this.processExistingJobs();\n\t}\n\tasync stop(graceful = true) {\n\t\tif (!this.isRunning) return;\n\t\tif (this.unsubscribe) {\n\t\t\tthis.unsubscribe();\n\t\t\tthis.unsubscribe = void 0;\n\t\t}\n\t\tif (graceful) while (this.activeJobs > 0) await new Promise((resolve) => setTimeout(resolve, 100));\n\t\tfor (const [, jobs] of this.deferredJobs) for (const job of jobs) {\n\t\t\tconst errorInfo = this.toErrorInfo(new DocumentNotFoundError(job.documentId));\n\t\t\tthis.jobTracker.markFailed(job.id, errorInfo, job);\n\t\t\tthis.eventBus.emit(ReactorEventTypes.JOB_FAILED, {\n\t\t\t\tjobId: job.id,\n\t\t\t\terror: new DocumentNotFoundError(job.documentId),\n\t\t\t\tjob\n\t\t\t}).catch(() => {});\n\t\t}\n\t\tthis.deferredJobs.clear();\n\t\tthis.executors = [];\n\t\tthis.isRunning = false;\n\t}\n\tgetExecutors() {\n\t\treturn [...this.executors];\n\t}\n\tgetStatus() {\n\t\treturn {\n\t\t\tisRunning: this.isRunning,\n\t\t\tnumExecutors: this.executors.length,\n\t\t\tactiveJobs: this.activeJobs,\n\t\t\ttotalJobsProcessed: this.totalJobsProcessed\n\t\t};\n\t}\n\tasync processNextJob() {\n\t\tlet handle;\n\t\ttry {\n\t\t\thandle = await this.queue.dequeueNext();\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\"Error dequeueing next job: @Error\", error);\n\t\t\treturn;\n\t\t}\n\t\tif (!handle) return;\n\t\thandle.start();\n\t\tthis.activeJobs++;\n\t\tthis.jobTracker.markRunning(handle.job.id);\n\t\tconst runningEvent = {\n\t\t\tjobId: handle.job.id,\n\t\t\tjobMeta: handle.job.meta\n\t\t};\n\t\tthis.eventBus.emit(ReactorEventTypes.JOB_RUNNING, runningEvent).catch(() => {});\n\t\tconst executorIndex = this.totalJobsProcessed % this.executors.length;\n\t\tconst executor = this.executors[executorIndex];\n\t\tconst signal = AbortSignal.timeout(this.jobTimeoutMs);\n\t\tconst toError = (reason) => reason instanceof Error ? reason : new Error(String(reason));\n\t\tconst abortPromise = new Promise((_, reject) => {\n\t\t\tif (signal.aborted) {\n\t\t\t\treject(toError(signal.reason));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsignal.addEventListener(\"abort\", () => reject(toError(signal.reason)), { once: true });\n\t\t});\n\t\tlet result;\n\t\ttry {\n\t\t\tresult = await Promise.race([executor.executeJob(handle.job, signal), abortPromise]);\n\t\t} catch (error) {\n\t\t\tconst errorInfo = this.toErrorInfo(error instanceof Error ? error : String(error));\n\t\t\thandle.fail(errorInfo);\n\t\t\tthis.activeJobs--;\n\t\t\tthis.jobTracker.markFailed(handle.job.id, errorInfo, handle.job);\n\t\t\tthis.eventBus.emit(ReactorEventTypes.JOB_FAILED, {\n\t\t\t\tjobId: handle.job.id,\n\t\t\t\terror: new Error(errorInfo.message),\n\t\t\t\tjob: handle.job\n\t\t\t}).catch(() => {});\n\t\t\tawait this.checkForMoreJobs();\n\t\t\treturn;\n\t\t}\n\t\tif (result.success) {\n\t\t\thandle.complete();\n\t\t\tthis.totalJobsProcessed++;\n\t\t\tif (this.hasCreateDocumentAction(handle.job)) await this.flushDeferredJobs(handle.job.documentId);\n\t\t} else {\n\t\t\tif (result.error && ModuleNotFoundError.isError(result.error)) {\n\t\t\t\tlet modelLoaded = false;\n\t\t\t\ttry {\n\t\t\t\t\tawait this.resolver.ensureModelLoaded(result.error.documentType);\n\t\t\t\t\tmodelLoaded = true;\n\t\t\t\t} catch {}\n\t\t\t\tif (modelLoaded) {\n\t\t\t\t\tconst errorInfo = this.toErrorInfo(result.error);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.queue.retryJob(handle.job.id, errorInfo);\n\t\t\t\t\t\tthis.activeJobs--;\n\t\t\t\t\t\tawait this.checkForMoreJobs();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (result.error && DocumentNotFoundError.isError(result.error)) {\n\t\t\t\tconst job = handle.job;\n\t\t\t\thandle.defer();\n\t\t\t\tthis.activeJobs--;\n\t\t\t\tconst docId = job.documentId;\n\t\t\t\tconst existing = this.deferredJobs.get(docId) ?? [];\n\t\t\t\texisting.push(job);\n\t\t\t\tthis.deferredJobs.set(docId, existing);\n\t\t\t\tawait this.checkForMoreJobs();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (result.error && DocumentDeletedError.isError(result.error)) {\n\t\t\t\tconst errorInfo = this.toErrorInfo(result.error);\n\t\t\t\tthis.jobTracker.markFailed(handle.job.id, errorInfo, handle.job);\n\t\t\t\tthis.eventBus.emit(ReactorEventTypes.JOB_FAILED, {\n\t\t\t\t\tjobId: handle.job.id,\n\t\t\t\t\terror: result.error,\n\t\t\t\t\tjob: handle.job\n\t\t\t\t}).catch(() => {});\n\t\t\t\thandle.fail(errorInfo);\n\t\t\t\tthis.activeJobs--;\n\t\t\t\tawait this.checkForMoreJobs();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst retryCount = handle.job.retryCount || 0;\n\t\t\tif (retryCount < (handle.job.maxRetries || 0)) {\n\t\t\t\tconst currentErrorInfo = result.error ? this.toErrorInfo(result.error) : this.toErrorInfo(\"Unknown error\");\n\t\t\t\ttry {\n\t\t\t\t\tawait this.queue.retryJob(handle.job.id, currentErrorInfo);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst retryErrorInfo = this.toErrorInfo(error instanceof Error ? error : \"Failed to retry job\");\n\t\t\t\t\tthis.jobTracker.markFailed(handle.job.id, retryErrorInfo, handle.job);\n\t\t\t\t\tthis.eventBus.emit(ReactorEventTypes.JOB_FAILED, {\n\t\t\t\t\t\tjobId: handle.job.id,\n\t\t\t\t\t\terror: result.error ?? new Error(retryErrorInfo.message),\n\t\t\t\t\t\tjob: handle.job\n\t\t\t\t\t}).catch(() => {});\n\t\t\t\t\thandle.fail(retryErrorInfo);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst currentErrorInfo = result.error ? this.toErrorInfo(result.error) : this.toErrorInfo(\"Unknown error\");\n\t\t\t\tconst fullErrorInfo = this.formatErrorHistory(handle.job.errorHistory, currentErrorInfo, retryCount + 1);\n\t\t\t\tthis.jobTracker.markFailed(handle.job.id, fullErrorInfo, handle.job);\n\t\t\t\tthis.eventBus.emit(ReactorEventTypes.JOB_FAILED, {\n\t\t\t\t\tjobId: handle.job.id,\n\t\t\t\t\terror: result.error ?? new Error(fullErrorInfo.message),\n\t\t\t\t\tjob: handle.job\n\t\t\t\t}).catch(() => {});\n\t\t\t\thandle.fail(fullErrorInfo);\n\t\t\t}\n\t\t}\n\t\tthis.activeJobs--;\n\t\tawait this.checkForMoreJobs();\n\t}\n\tasync checkForMoreJobs() {\n\t\tif (!this.isRunning) return;\n\t\tlet hasMore;\n\t\ttry {\n\t\t\thasMore = await this.queue.hasJobs();\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\"Error checking for more jobs: @Error\", error);\n\t\t\treturn;\n\t\t}\n\t\tif (hasMore) await this.processNextJob();\n\t}\n\tasync processExistingJobs() {\n\t\tlet hasJobs;\n\t\ttry {\n\t\t\thasJobs = await this.queue.hasJobs();\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\"Error checking for existing jobs: @Error\", error);\n\t\t\treturn;\n\t\t}\n\t\tif (hasJobs) {\n\t\t\tconst promises = [];\n\t\t\tfor (let i = 0; i < Math.min(this.executors.length, 5); i++) promises.push(this.processNextJob());\n\t\t\ttry {\n\t\t\t\tawait Promise.all(promises);\n\t\t\t} catch (error) {\n\t\t\t\tthis.logger.error(\"Error processing existing jobs: @Error\", error);\n\t\t\t}\n\t\t}\n\t}\n\ttoErrorInfo(error) {\n\t\tif (error instanceof Error) return {\n\t\t\tmessage: error.message,\n\t\t\tstack: error.stack || (/* @__PURE__ */ new Error()).stack || \"\"\n\t\t};\n\t\treturn {\n\t\t\tmessage: error,\n\t\t\tstack: (/* @__PURE__ */ new Error()).stack || \"\"\n\t\t};\n\t}\n\thasCreateDocumentAction(job) {\n\t\tfor (const action of job.actions) if (action.type === \"CREATE_DOCUMENT\") return true;\n\t\tfor (const operation of job.operations) if (operation.action.type === \"CREATE_DOCUMENT\") return true;\n\t\treturn false;\n\t}\n\tasync flushDeferredJobs(documentId) {\n\t\tconst jobs = this.deferredJobs.get(documentId);\n\t\tif (!jobs || jobs.length === 0) return;\n\t\tthis.deferredJobs.delete(documentId);\n\t\tfor (const job of jobs) try {\n\t\t\tawait this.queue.enqueue(job);\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\"Error re-enqueuing deferred job: @Error\", error);\n\t\t}\n\t}\n\tformatErrorHistory(errorHistory, currentError, totalAttempts) {\n\t\tconst allErrors = [...errorHistory, currentError];\n\t\tif (allErrors.length === 1) return currentError;\n\t\tconst messageLines = [`Job failed after ${totalAttempts} attempts:`];\n\t\tconst stackLines = [];\n\t\tallErrors.forEach((error, index) => {\n\t\t\tmessageLines.push(`[Attempt ${index + 1}] ${error.message}`);\n\t\t\tstackLines.push(`[Attempt ${index + 1}] Stack trace:\\n${error.stack}`);\n\t\t});\n\t\treturn {\n\t\t\tmessage: messageLines.join(\"\\n\"),\n\t\t\tstack: stackLines.join(\"\\n\\n\")\n\t\t};\n\t}\n};\n//#endregion\n//#region src/shared/utils.ts\nfunction matchesScope(view = {}, scope) {\n\tif (view.scopes) return view.scopes.includes(scope);\n\treturn true;\n}\nfunction yieldToMain() {\n\tconst s = globalThis.scheduler;\n\tif (s?.yield) return s.yield();\n\treturn new Promise((resolve) => setTimeout(resolve, 0));\n}\n//#endregion\n//#region src/utils/reshuffle.ts\nconst STRICT_ORDER_ACTION_TYPES = new Set([\n\t\"CREATE_DOCUMENT\",\n\t\"DELETE_DOCUMENT\",\n\t\"UPGRADE_DOCUMENT\",\n\t\"ADD_RELATIONSHIP\",\n\t\"REMOVE_RELATIONSHIP\"\n]);\n/**\n* Reshuffles operations by timestamp, then applies deterministic tie-breaking.\n* Used for merging concurrent operations from different branches.\n*\n* For strict document-structure actions (e.g., CREATE_DOCUMENT/UPGRADE_DOCUMENT),\n* logical index (index - skip) is prioritized to preserve causal replay order.\n*\n* For other actions, action ID is prioritized to ensure a canonical cross-reactor order\n* for concurrent operations that may have diverged local indices due to prior reshuffles.\n* Logical index and operation ID are then used as deterministic tie-breakers.\n*\n* Example:\n* [0:0, 1:0, 2:0, A3:0, A4:0, A5:0] + [0:0, 1:0, 2:0, B3:0, B4:2, B5:0]\n* GC => [0:0, 1:0, 2:0, A3:0, A4:0, A5:0] + [0:0, 1:0, B4:2, B5:0]\n* Split => [0:0, 1:0] + [2:0, A3:0, A4:0, A5:0] + [B4:2, B5:0]\n* Reshuffle(6:4) => [6:4, 7:0, 8:0, 9:0, 10:0, 11:0]\n* merge => [0:0, 1:0, 6:4, 7:0, 8:0, 9:0, 10:0, 11:0]\n*/\nfunction reshuffleByTimestamp(startIndex, opsA, opsB) {\n\treturn [...opsA, ...opsB].sort((a, b) => {\n\t\tconst timestampDiff = new Date(a.timestampUtcMs).getTime() - new Date(b.timestampUtcMs).getTime();\n\t\tif (timestampDiff !== 0) return timestampDiff;\n\t\tconst shouldPrioritizeLogicalIndex = STRICT_ORDER_ACTION_TYPES.has(a.action?.type ?? \"\") || STRICT_ORDER_ACTION_TYPES.has(b.action?.type ?? \"\");\n\t\tconst logicalIndexDiff = a.index - a.skip - (b.index - b.skip);\n\t\tif (shouldPrioritizeLogicalIndex) {\n\t\t\tif (logicalIndexDiff !== 0) return logicalIndexDiff;\n\t\t}\n\t\tconst actionIdDiff = (a.action?.id ?? \"\").localeCompare(b.action?.id ?? \"\");\n\t\tif (actionIdDiff !== 0) return actionIdDiff;\n\t\tif (!shouldPrioritizeLogicalIndex && logicalIndexDiff !== 0) return logicalIndexDiff;\n\t\treturn a.id.localeCompare(b.id);\n\t}).map((op, i) => ({\n\t\t...op,\n\t\tindex: startIndex.index + i,\n\t\tskip: i === 0 ? startIndex.skip : 0\n\t}));\n}\n//#endregion\n//#region src/cache/operation-index-types.ts\nfunction driveCollectionId(branch, driveId) {\n\treturn `drive.${branch}.${driveId}`;\n}\n//#endregion\n//#region src/executor/document-action-handler.ts\nvar DocumentActionHandler = class {\n\tconstructor(registry, logger) {\n\t\tthis.registry = registry;\n\t\tthis.logger = logger;\n\t}\n\tasync execute(job, action, startTime, indexTxn, stores, skip = 0, sourceRemote = \"\", signal) {\n\t\tswitch (action.type) {\n\t\t\tcase \"CREATE_DOCUMENT\": return this.executeCreate(job, action, startTime, indexTxn, stores, skip, sourceRemote, signal);\n\t\t\tcase \"DELETE_DOCUMENT\": return this.executeDelete(job, action, startTime, indexTxn, stores, sourceRemote, signal);\n\t\t\tcase \"UPGRADE_DOCUMENT\": return this.executeUpgrade(job, action, startTime, indexTxn, stores, skip, sourceRemote, signal);\n\t\t\tcase \"ADD_RELATIONSHIP\": return this.executeAddRelationship(job, action, startTime, indexTxn, stores, sourceRemote, signal);\n\t\t\tcase \"REMOVE_RELATIONSHIP\": return this.executeRemoveRelationship(job, action, startTime, indexTxn, stores, sourceRemote, signal);\n\t\t\tdefault: return buildErrorResult(job, /* @__PURE__ */ new Error(`Unknown document action type: ${action.type}`), startTime);\n\t\t}\n\t}\n\tasync executeCreate(job, action, startTime, indexTxn, stores, skip = 0, sourceRemote = \"\", signal) {\n\t\tif (job.scope !== \"document\") return {\n\t\t\tjob,\n\t\t\tsuccess: false,\n\t\t\terror: /* @__PURE__ */ new Error(`CREATE_DOCUMENT must be in \"document\" scope, got \"${job.scope}\"`),\n\t\t\tduration: Date.now() - startTime\n\t\t};\n\t\tconst document = createDocumentFromAction(action);\n\t\tconst operation = createOperation(action, 0, skip, {\n\t\t\tdocumentId: document.header.id,\n\t\t\tscope: job.scope,\n\t\t\tbranch: job.branch\n\t\t});\n\t\tconst resultingStateObj = {\n\t\t\theader: document.header,\n\t\t\t...document.state\n\t\t};\n\t\tconst resultingState = JSON.stringify(resultingStateObj);\n\t\tconst writeError = await this.writeOperationToStore(document.header.id, document.header.documentType, job.scope, job.branch, operation, job, startTime, stores, signal);\n\t\tif (writeError !== null) return writeError;\n\t\tupdateDocumentRevision(document, job.scope, operation.index);\n\t\tstores.writeCache.putState(document.header.id, job.scope, job.branch, operation.index, document);\n\t\tindexTxn.write([{\n\t\t\t...operation,\n\t\t\tdocumentId: document.header.id,\n\t\t\tdocumentType: document.header.documentType,\n\t\t\tbranch: job.branch,\n\t\t\tscope: job.scope,\n\t\t\tsourceRemote\n\t\t}]);\n\t\tif (document.header.documentType === \"powerhouse/document-drive\") {\n\t\t\tconst collectionId = driveCollectionId(job.branch, document.header.id);\n\t\t\tindexTxn.createCollection(collectionId);\n\t\t\tindexTxn.addToCollection(collectionId, document.header.id);\n\t\t}\n\t\tstores.documentMetaCache.putDocumentMeta(document.header.id, job.branch, {\n\t\t\tstate: document.state.document,\n\t\t\tdocumentType: document.header.documentType,\n\t\t\tdocumentScopeRevision: 1\n\t\t});\n\t\treturn buildSuccessResult(job, operation, document.header.id, document.header.documentType, resultingState, startTime);\n\t}\n\tasync executeDelete(job, action, startTime, indexTxn, stores, sourceRemote = \"\", signal) {\n\t\tconst input = action.input;\n\t\tif (!input.documentId) return buildErrorResult(job, /* @__PURE__ */ new Error(\"DELETE_DOCUMENT action requires a documentId in input\"), startTime);\n\t\tconst documentId = input.documentId;\n\t\tlet document;\n\t\ttry {\n\t\t\tdocument = await stores.writeCache.getState(documentId, job.scope, job.branch, void 0, signal);\n\t\t} catch (error) {\n\t\t\treturn buildErrorResult(job, /* @__PURE__ */ new Error(`Failed to fetch document before deletion: ${error instanceof Error ? error.message : String(error)}`), startTime);\n\t\t}\n\t\tconst documentState = document.state.document;\n\t\tif (documentState.isDeleted) return buildErrorResult(job, new DocumentDeletedError(documentId, documentState.deletedAtUtcIso), startTime);\n\t\tconst operation = createOperation(action, getNextIndexForScope(document, job.scope), 0, {\n\t\t\tdocumentId,\n\t\t\tscope: job.scope,\n\t\t\tbranch: job.branch\n\t\t});\n\t\tapplyDeleteDocumentAction(document, action);\n\t\tconst resultingStateObj = {\n\t\t\theader: document.header,\n\t\t\tdocument: document.state.document\n\t\t};\n\t\tconst resultingState = JSON.stringify(resultingStateObj);\n\t\tconst writeError = await this.writeOperationToStore(documentId, document.header.documentType, job.scope, job.branch, operation, job, startTime, stores, signal);\n\t\tif (writeError !== null) return writeError;\n\t\tupdateDocumentRevision(document, job.scope, operation.index);\n\t\tstores.writeCache.putState(documentId, job.scope, job.branch, operation.index, document);\n\t\tindexTxn.write([{\n\t\t\t...operation,\n\t\t\tdocumentId,\n\t\t\tdocumentType: document.header.documentType,\n\t\t\tbranch: job.branch,\n\t\t\tscope: job.scope,\n\t\t\tsourceRemote\n\t\t}]);\n\t\tstores.documentMetaCache.putDocumentMeta(documentId, job.branch, {\n\t\t\tstate: document.state.document,\n\t\t\tdocumentType: document.header.documentType,\n\t\t\tdocumentScopeRevision: operation.index + 1\n\t\t});\n\t\treturn buildSuccessResult(job, operation, documentId, document.header.documentType, resultingState, startTime);\n\t}\n\tasync executeUpgrade(job, action, startTime, indexTxn, stores, skip = 0, sourceRemote = \"\", signal) {\n\t\tconst input = action.input;\n\t\tif (!input.documentId) return buildErrorResult(job, /* @__PURE__ */ new Error(\"UPGRADE_DOCUMENT action requires a documentId in input\"), startTime);\n\t\tconst documentId = input.documentId;\n\t\tconst fromVersion = input.fromVersion;\n\t\tconst toVersion = input.toVersion;\n\t\tlet document;\n\t\ttry {\n\t\t\tdocument = await stores.writeCache.getState(documentId, job.scope, job.branch, void 0, signal);\n\t\t} catch (error) {\n\t\t\treturn buildErrorResult(job, /* @__PURE__ */ new Error(`Failed to fetch document for upgrade: ${error instanceof Error ? error.message : String(error)}`), startTime);\n\t\t}\n\t\tconst documentState = document.state.document;\n\t\tif (documentState.isDeleted) return buildErrorResult(job, new DocumentDeletedError(documentId, documentState.deletedAtUtcIso), startTime);\n\t\tconst nextIndex = getNextIndexForScope(document, job.scope);\n\t\tlet upgradePath;\n\t\tif (fromVersion > 0 && fromVersion < toVersion) try {\n\t\t\tupgradePath = this.registry.computeUpgradePath(document.header.documentType, fromVersion, toVersion);\n\t\t} catch (error) {\n\t\t\treturn buildErrorResult(job, error instanceof Error ? error : new Error(String(error)), startTime);\n\t\t}\n\t\tif (fromVersion === toVersion && fromVersion > 0) return {\n\t\t\tjob,\n\t\t\tsuccess: true,\n\t\t\toperations: [],\n\t\t\toperationsWithContext: [],\n\t\t\tduration: Date.now() - startTime\n\t\t};\n\t\ttry {\n\t\t\tdocument = applyUpgradeDocumentAction(document, action, upgradePath);\n\t\t} catch (error) {\n\t\t\treturn buildErrorResult(job, error instanceof Error ? error : new Error(String(error)), startTime);\n\t\t}\n\t\tconst operation = createOperation(action, nextIndex, skip, {\n\t\t\tdocumentId,\n\t\t\tscope: job.scope,\n\t\t\tbranch: job.branch\n\t\t});\n\t\tconst resultingStateObj = {\n\t\t\theader: document.header,\n\t\t\t...document.state\n\t\t};\n\t\tconst resultingState = JSON.stringify(resultingStateObj);\n\t\tconst writeError = await this.writeOperationToStore(documentId, document.header.documentType, job.scope, job.branch, operation, job, startTime, stores, signal);\n\t\tif (writeError !== null) return writeError;\n\t\tupdateDocumentRevision(document, job.scope, operation.index);\n\t\tstores.writeCache.putState(documentId, job.scope, job.branch, operation.index, document);\n\t\tindexTxn.write([{\n\t\t\t...operation,\n\t\t\tdocumentId,\n\t\t\tdocumentType: document.header.documentType,\n\t\t\tbranch: job.branch,\n\t\t\tscope: job.scope,\n\t\t\tsourceRemote\n\t\t}]);\n\t\tstores.documentMetaCache.putDocumentMeta(documentId, job.branch, {\n\t\t\tstate: document.state.document,\n\t\t\tdocumentType: document.header.documentType,\n\t\t\tdocumentScopeRevision: operation.index + 1\n\t\t});\n\t\treturn buildSuccessResult(job, operation, documentId, document.header.documentType, resultingState, startTime);\n\t}\n\tasync executeAddRelationship(job, action, startTime, indexTxn, stores, sourceRemote = \"\", signal) {\n\t\tif (job.scope !== \"document\") return buildErrorResult(job, /* @__PURE__ */ new Error(`ADD_RELATIONSHIP must be in \"document\" scope, got \"${job.scope}\"`), startTime);\n\t\tconst input = action.input;\n\t\tif (!input.sourceId || !input.targetId || !input.relationshipType) return buildErrorResult(job, /* @__PURE__ */ new Error(\"ADD_RELATIONSHIP action requires sourceId, targetId, and relationshipType in input\"), startTime);\n\t\tif (input.sourceId === input.targetId) return buildErrorResult(job, /* @__PURE__ */ new Error(\"ADD_RELATIONSHIP: sourceId and targetId cannot be the same (self-relationships not allowed)\"), startTime);\n\t\tlet sourceDoc;\n\t\ttry {\n\t\t\tsourceDoc = await stores.writeCache.getState(input.sourceId, \"document\", job.branch, void 0, signal);\n\t\t} catch (error) {\n\t\t\treturn buildErrorResult(job, /* @__PURE__ */ new Error(`ADD_RELATIONSHIP: source document ${input.sourceId} not found: ${error instanceof Error ? error.message : String(error)}`), startTime);\n\t\t}\n\t\tconst operation = createOperation(action, getNextIndexForScope(sourceDoc, job.scope), 0, {\n\t\t\tdocumentId: input.sourceId,\n\t\t\tscope: job.scope,\n\t\t\tbranch: job.branch\n\t\t});\n\t\tconst writeError = await this.writeOperationToStore(input.sourceId, sourceDoc.header.documentType, job.scope, job.branch, operation, job, startTime, stores, signal);\n\t\tif (writeError !== null) return writeError;\n\t\tsourceDoc.header.lastModifiedAtUtcIso = operation.timestampUtcMs || (/* @__PURE__ */ new Date()).toISOString();\n\t\tupdateDocumentRevision(sourceDoc, job.scope, operation.index);\n\t\tsourceDoc.operations = {\n\t\t\t...sourceDoc.operations,\n\t\t\t[job.scope]: [...sourceDoc.operations[job.scope] ?? [], operation]\n\t\t};\n\t\tconst scopeState = sourceDoc.state[job.scope];\n\t\tconst resultingStateObj = {\n\t\t\theader: structuredClone(sourceDoc.header),\n\t\t\t[job.scope]: scopeState === void 0 ? {} : structuredClone(scopeState)\n\t\t};\n\t\tconst resultingState = JSON.stringify(resultingStateObj);\n\t\tstores.writeCache.putState(input.sourceId, job.scope, job.branch, operation.index, sourceDoc);\n\t\tindexTxn.write([{\n\t\t\t...operation,\n\t\t\tdocumentId: input.sourceId,\n\t\t\tdocumentType: sourceDoc.header.documentType,\n\t\t\tbranch: job.branch,\n\t\t\tscope: job.scope,\n\t\t\tsourceRemote\n\t\t}]);\n\t\tif (sourceDoc.header.documentType === \"powerhouse/document-drive\") {\n\t\t\tconst collectionId = driveCollectionId(job.branch, input.sourceId);\n\t\t\tindexTxn.addToCollection(collectionId, input.targetId);\n\t\t\tstores.collectionMembershipCache.invalidate(input.targetId);\n\t\t}\n\t\tstores.documentMetaCache.putDocumentMeta(input.sourceId, job.branch, {\n\t\t\tstate: sourceDoc.state.document,\n\t\t\tdocumentType: sourceDoc.header.documentType,\n\t\t\tdocumentScopeRevision: operation.index + 1\n\t\t});\n\t\treturn buildSuccessResult(job, operation, input.sourceId, sourceDoc.header.documentType, resultingState, startTime);\n\t}\n\tasync executeRemoveRelationship(job, action, startTime, indexTxn, stores, sourceRemote = \"\", signal) {\n\t\tif (job.scope !== \"document\") return buildErrorResult(job, /* @__PURE__ */ new Error(`REMOVE_RELATIONSHIP must be in \"document\" scope, got \"${job.scope}\"`), startTime);\n\t\tconst input = action.input;\n\t\tif (!input.sourceId || !input.targetId || !input.relationshipType) return buildErrorResult(job, /* @__PURE__ */ new Error(\"REMOVE_RELATIONSHIP action requires sourceId, targetId, and relationshipType in input\"), startTime);\n\t\tlet sourceDoc;\n\t\ttry {\n\t\t\tsourceDoc = await stores.writeCache.getState(input.sourceId, \"document\", job.branch, void 0, signal);\n\t\t} catch (error) {\n\t\t\treturn buildErrorResult(job, /* @__PURE__ */ new Error(`REMOVE_RELATIONSHIP: source document ${input.sourceId} not found: ${error instanceof Error ? error.message : String(error)}`), startTime);\n\t\t}\n\t\tconst operation = createOperation(action, getNextIndexForScope(sourceDoc, job.scope), 0, {\n\t\t\tdocumentId: input.sourceId,\n\t\t\tscope: job.scope,\n\t\t\tbranch: job.branch\n\t\t});\n\t\tconst writeError = await this.writeOperationToStore(input.sourceId, sourceDoc.header.documentType, job.scope, job.branch, operation, job, startTime, stores, signal);\n\t\tif (writeError !== null) return writeError;\n\t\tsourceDoc.header.lastModifiedAtUtcIso = operation.timestampUtcMs || (/* @__PURE__ */ new Date()).toISOString();\n\t\tupdateDocumentRevision(sourceDoc, job.scope, operation.index);\n\t\tsourceDoc.operations = {\n\t\t\t...sourceDoc.operations,\n\t\t\t[job.scope]: [...sourceDoc.operations[job.scope] ?? [], operation]\n\t\t};\n\t\tconst scopeState = sourceDoc.state[job.scope];\n\t\tconst resultingStateObj = {\n\t\t\theader: structuredClone(sourceDoc.header),\n\t\t\t[job.scope]: scopeState === void 0 ? {} : structuredClone(scopeState)\n\t\t};\n\t\tconst resultingState = JSON.stringify(resultingStateObj);\n\t\tstores.writeCache.putState(input.sourceId, job.scope, job.branch, operation.index, sourceDoc);\n\t\tindexTxn.write([{\n\t\t\t...operation,\n\t\t\tdocumentId: input.sourceId,\n\t\t\tdocumentType: sourceDoc.header.documentType,\n\t\t\tbranch: job.branch,\n\t\t\tscope: job.scope,\n\t\t\tsourceRemote\n\t\t}]);\n\t\tif (sourceDoc.header.documentType === \"powerhouse/document-drive\") {\n\t\t\tconst collectionId = driveCollectionId(job.branch, input.sourceId);\n\t\t\tindexTxn.removeFromCollection(collectionId, input.targetId);\n\t\t\tstores.collectionMembershipCache.invalidate(input.targetId);\n\t\t}\n\t\tstores.documentMetaCache.putDocumentMeta(input.sourceId, job.branch, {\n\t\t\tstate: sourceDoc.state.document,\n\t\t\tdocumentType: sourceDoc.header.documentType,\n\t\t\tdocumentScopeRevision: operation.index + 1\n\t\t});\n\t\treturn buildSuccessResult(job, operation, input.sourceId, sourceDoc.header.documentType, resultingState, startTime);\n\t}\n\tasync writeOperationToStore(documentId, documentType, scope, branch, operation, job, startTime, stores, signal) {\n\t\ttry {\n\t\t\tawait stores.operationStore.apply(documentId, documentType, scope, branch, operation.index, (txn) => {\n\t\t\t\ttxn.addOperations(operation);\n\t\t\t}, signal);\n\t\t\treturn null;\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\"Error writing @Operation to IOperationStore: @Error\", operation, error);\n\t\t\tstores.writeCache.invalidate(documentId, scope, branch);\n\t\t\treturn {\n\t\t\t\tjob,\n\t\t\t\tsuccess: false,\n\t\t\t\terror: /* @__PURE__ */ new Error(`Failed to write operation to IOperationStore: ${error instanceof Error ? error.message : String(error)}`),\n\t\t\t\tduration: Date.now() - startTime\n\t\t\t};\n\t\t}\n\t}\n};\n//#endregion\n//#region src/executor/signature-verifier.ts\nvar SignatureVerifier = class {\n\tconstructor(verifier) {\n\t\tthis.verifier = verifier;\n\t}\n\tasync verifyActions(documentId, branch, actions) {\n\t\tif (!this.verifier) return;\n\t\tfor (const action of actions) {\n\t\t\tconst signer = action.context?.signer;\n\t\t\tif (!signer) continue;\n\t\t\tif (signer.signatures.length === 0) throw new InvalidSignatureError(documentId, `Action ${action.id} has signer but no signatures`);\n\t\t\tconst publicKey = signer.app.key;\n\t\t\tlet isValid = false;\n\t\t\ttry {\n\t\t\t\tconst tempOperation = {\n\t\t\t\t\tid: deriveOperationId(documentId, action.scope, branch, action.id),\n\t\t\t\t\tindex: 0,\n\t\t\t\t\ttimestampUtcMs: action.timestampUtcMs || (/* @__PURE__ */ new Date()).toISOString(),\n\t\t\t\t\thash: \"\",\n\t\t\t\t\tskip: 0,\n\t\t\t\t\taction\n\t\t\t\t};\n\t\t\t\tisValid = await this.verifier(tempOperation, publicKey);\n\t\t\t} catch (error) {\n\t\t\t\tconst errorMessage = error instanceof Error ? error.message : String(error);\n\t\t\t\tthrow new InvalidSignatureError(documentId, `Action ${action.id} verification failed: ${errorMessage}`);\n\t\t\t}\n\t\t\tif (!isValid) throw new InvalidSignatureError(documentId, `Action ${action.id} signature verification returned false`);\n\t\t}\n\t}\n\tasync verifyOperations(documentId, operations) {\n\t\tif (!this.verifier) return;\n\t\tfor (let i = 0; i < operations.length; i++) {\n\t\t\tconst operation = operations[i];\n\t\t\tconst signer = operation.action.context?.signer;\n\t\t\tif (!signer) continue;\n\t\t\tif (signer.signatures.length === 0) throw new InvalidSignatureError(documentId, `Operation ${operation.id} at index ${operation.index} has signer but no signatures`);\n\t\t\tconst publicKey = signer.app.key;\n\t\t\tlet isValid = false;\n\t\t\ttry {\n\t\t\t\tisValid = await this.verifier(operation, publicKey);\n\t\t\t} catch (error) {\n\t\t\t\tconst errorMessage = error instanceof Error ? error.message : String(error);\n\t\t\t\tthrow new InvalidSignatureError(documentId, `Operation ${operation.id} at index ${operation.index} verification failed: ${errorMessage}`);\n\t\t\t}\n\t\t\tif (!isValid) throw new InvalidSignatureError(documentId, `Operation ${operation.id} at index ${operation.index} signature verification returned false`);\n\t\t}\n\t}\n};\n//#endregion\n//#region src/executor/simple-job-executor.ts\nconst MAX_SKIP_THRESHOLD = 1e3;\nconst ISO_TIMESTAMP_REGEX = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$/;\nfunction isValidISOTimestamp(value) {\n\tif (!ISO_TIMESTAMP_REGEX.test(value)) return false;\n\treturn !isNaN(new Date(value).getTime());\n}\nconst documentScopeActions = [\n\t\"CREATE_DOCUMENT\",\n\t\"DELETE_DOCUMENT\",\n\t\"UPGRADE_DOCUMENT\",\n\t\"ADD_RELATIONSHIP\",\n\t\"REMOVE_RELATIONSHIP\"\n];\n/**\n* Simple job executor that processes a job by applying actions through document model reducers.\n*/\nvar SimpleJobExecutor = class {\n\tconfig;\n\tsignatureVerifierModule;\n\tdocumentActionHandler;\n\texecutionScope;\n\tconstructor(logger, registry, operationStore, eventBus, writeCache, operationIndex, documentMetaCache, collectionMembershipCache, config, signatureVerifier, executionScope) {\n\t\tthis.logger = logger;\n\t\tthis.registry = registry;\n\t\tthis.operationStore = operationStore;\n\t\tthis.eventBus = eventBus;\n\t\tthis.writeCache = writeCache;\n\t\tthis.operationIndex = operationIndex;\n\t\tthis.documentMetaCache = documentMetaCache;\n\t\tthis.collectionMembershipCache = collectionMembershipCache;\n\t\tthis.config = {\n\t\t\tmaxSkipThreshold: config.maxSkipThreshold ?? MAX_SKIP_THRESHOLD,\n\t\t\tmaxConcurrency: config.maxConcurrency ?? 1,\n\t\t\tjobTimeoutMs: config.jobTimeoutMs ?? 3e4,\n\t\t\tretryBaseDelayMs: config.retryBaseDelayMs ?? 100,\n\t\t\tretryMaxDelayMs: config.retryMaxDelayMs ?? 5e3,\n\t\t\tyieldDeadlineMs: config.yieldDeadlineMs ?? 50\n\t\t};\n\t\tthis.signatureVerifierModule = new SignatureVerifier(signatureVerifier);\n\t\tthis.documentActionHandler = new DocumentActionHandler(registry, logger);\n\t\tthis.executionScope = executionScope ?? new DefaultExecutionScope(operationStore, operationIndex, writeCache, documentMetaCache, collectionMembershipCache);\n\t}\n\t/**\n\t* Execute a single job by applying all its actions through the appropriate reducers.\n\t* Actions are processed sequentially in order.\n\t*/\n\tasync executeJob(job, signal) {\n\t\tconst startTime = Date.now();\n\t\tconst touchedCacheEntries = [];\n\t\tlet pendingEvent;\n\t\tlet result;\n\t\ttry {\n\t\t\tresult = await this.executionScope.run(async (stores) => {\n\t\t\t\tconst indexTxn = stores.operationIndex.start();\n\t\t\t\tif (job.kind === \"load\") {\n\t\t\t\t\tconst loadResult = await this.executeLoadJob(job, startTime, indexTxn, stores, signal);\n\t\t\t\t\tif (loadResult.success && loadResult.operationsWithContext) {\n\t\t\t\t\t\tfor (const owc of loadResult.operationsWithContext) touchedCacheEntries.push({\n\t\t\t\t\t\t\tdocumentId: owc.context.documentId,\n\t\t\t\t\t\t\tscope: owc.context.scope,\n\t\t\t\t\t\t\tbranch: owc.context.branch\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst ordinals = await stores.operationIndex.commit(indexTxn, signal);\n\t\t\t\t\t\tfor (let i = 0; i < loadResult.operationsWithContext.length; i++) loadResult.operationsWithContext[i].context.ordinal = ordinals[i];\n\t\t\t\t\t\tconst collectionMemberships = loadResult.operationsWithContext.length > 0 ? await this.getCollectionMembershipsForOperations(loadResult.operationsWithContext, stores) : {};\n\t\t\t\t\t\tpendingEvent = {\n\t\t\t\t\t\t\tjobId: job.id,\n\t\t\t\t\t\t\toperations: loadResult.operationsWithContext,\n\t\t\t\t\t\t\tjobMeta: job.meta,\n\t\t\t\t\t\t\tcollectionMemberships\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\treturn loadResult;\n\t\t\t\t}\n\t\t\t\tconst actionResult = await this.processActions(job, job.actions, startTime, indexTxn, stores, void 0, void 0, \"\", signal);\n\t\t\t\tif (!actionResult.success) return {\n\t\t\t\t\tjob,\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: actionResult.error,\n\t\t\t\t\tduration: Date.now() - startTime\n\t\t\t\t};\n\t\t\t\tif (actionResult.operationsWithContext.length > 0) for (const owc of actionResult.operationsWithContext) touchedCacheEntries.push({\n\t\t\t\t\tdocumentId: owc.context.documentId,\n\t\t\t\t\tscope: owc.context.scope,\n\t\t\t\t\tbranch: owc.context.branch\n\t\t\t\t});\n\t\t\t\tconst ordinals = await stores.operationIndex.commit(indexTxn, signal);\n\t\t\t\tif (actionResult.operationsWithContext.length > 0) {\n\t\t\t\t\tfor (let i = 0; i < actionResult.operationsWithContext.length; i++) actionResult.operationsWithContext[i].context.ordinal = ordinals[i];\n\t\t\t\t\tconst collectionMemberships = await this.getCollectionMembershipsForOperations(actionResult.operationsWithContext, stores);\n\t\t\t\t\tpendingEvent = {\n\t\t\t\t\t\tjobId: job.id,\n\t\t\t\t\t\toperations: actionResult.operationsWithContext,\n\t\t\t\t\t\tjobMeta: job.meta,\n\t\t\t\t\t\tcollectionMemberships\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tjob,\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\toperations: actionResult.generatedOperations,\n\t\t\t\t\toperationsWithContext: actionResult.operationsWithContext,\n\t\t\t\t\tduration: Date.now() - startTime\n\t\t\t\t};\n\t\t\t}, signal);\n\t\t} catch (error) {\n\t\t\tfor (const entry of touchedCacheEntries) {\n\t\t\t\tthis.writeCache.invalidate(entry.documentId, entry.scope, entry.branch);\n\t\t\t\tthis.documentMetaCache.invalidate(entry.documentId, entry.branch);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t\tif (pendingEvent) this.eventBus.emit(ReactorEventTypes.JOB_WRITE_READY, pendingEvent).catch((error) => {\n\t\t\tthis.logger.error(\"Failed to emit JOB_WRITE_READY event: @Event : @Error\", pendingEvent, error);\n\t\t});\n\t\treturn result;\n\t}\n\tasync getCollectionMembershipsForOperations(operations, stores) {\n\t\tconst documentIds = [...new Set(operations.map((op) => op.context.documentId))];\n\t\treturn stores.collectionMembershipCache.getCollectionsForDocuments(documentIds);\n\t}\n\tasync processActions(job, actions, startTime, indexTxn, stores, skipValues, sourceOperations, sourceRemote = \"\", signal) {\n\t\tconst generatedOperations = [];\n\t\tconst operationsWithContext = [];\n\t\ttry {\n\t\t\tawait this.signatureVerifierModule.verifyActions(job.documentId, job.branch, actions);\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tgeneratedOperations,\n\t\t\t\toperationsWithContext,\n\t\t\t\terror: error instanceof Error ? error : new Error(String(error))\n\t\t\t};\n\t\t}\n\t\tfor (const action of actions) if (action.timestampUtcMs && !isValidISOTimestamp(action.timestampUtcMs)) return {\n\t\t\tsuccess: false,\n\t\t\tgeneratedOperations,\n\t\t\toperationsWithContext,\n\t\t\terror: /* @__PURE__ */ new Error(`Invalid timestamp \"${action.timestampUtcMs}\" on action ${action.type} (id: ${action.id})`)\n\t\t};\n\t\tlet lastYield = performance.now();\n\t\tfor (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n\t\t\tconst action = actions[actionIndex];\n\t\t\tconst skip = skipValues?.[actionIndex] ?? 0;\n\t\t\tconst sourceOperation = sourceOperations?.[actionIndex];\n\t\t\tconst result = documentScopeActions.includes(action.type) ? await this.documentActionHandler.execute(job, action, startTime, indexTxn, stores, skip, sourceRemote, signal) : await this.executeRegularAction(job, action, startTime, indexTxn, stores, skip, sourceOperation, sourceRemote, signal);\n\t\t\tconst error = this.accumulateResultOrReturnError(result, generatedOperations, operationsWithContext);\n\t\t\tif (error !== null) return {\n\t\t\t\tsuccess: false,\n\t\t\t\tgeneratedOperations,\n\t\t\t\toperationsWithContext,\n\t\t\t\terror: error.error\n\t\t\t};\n\t\t\tif (performance.now() - lastYield > this.config.yieldDeadlineMs) {\n\t\t\t\tawait yieldToMain();\n\t\t\t\tlastYield = performance.now();\n\t\t\t\tif (signal?.aborted) return {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tgeneratedOperations,\n\t\t\t\t\toperationsWithContext,\n\t\t\t\t\terror: /* @__PURE__ */ new Error(\"Aborted\")\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tgeneratedOperations,\n\t\t\toperationsWithContext\n\t\t};\n\t}\n\tasync executeRegularAction(job, action, startTime, indexTxn, stores, skip = 0, sourceOperation, sourceRemote = \"\", signal) {\n\t\tlet docMeta;\n\t\ttry {\n\t\t\tdocMeta = await stores.documentMetaCache.getDocumentMeta(job.documentId, job.branch, signal);\n\t\t} catch (error) {\n\t\t\treturn buildErrorResult(job, error instanceof Error ? error : new Error(String(error)), startTime);\n\t\t}\n\t\tif (docMeta.state.isDeleted) return buildErrorResult(job, new DocumentDeletedError(job.documentId, docMeta.state.deletedAtUtcIso), startTime);\n\t\tif (isUndoRedo(action) || action.type === \"PRUNE\" || action.type === \"NOOP\" && skip > 0) stores.writeCache.invalidate(job.documentId, job.scope, job.branch);\n\t\tlet document;\n\t\ttry {\n\t\t\tdocument = await stores.writeCache.getState(job.documentId, job.scope, job.branch, void 0, signal);\n\t\t} catch (error) {\n\t\t\treturn buildErrorResult(job, error instanceof Error ? error : new Error(String(error)), startTime);\n\t\t}\n\t\tlet module;\n\t\ttry {\n\t\t\tconst moduleVersion = docMeta.state.version === 0 ? void 0 : docMeta.state.version;\n\t\t\tmodule = this.registry.getModule(document.header.documentType, moduleVersion);\n\t\t} catch (error) {\n\t\t\treturn buildErrorResult(job, error instanceof Error ? error : new Error(String(error)), startTime);\n\t\t}\n\t\tlet updatedDocument;\n\t\ttry {\n\t\t\tconst protocolVersion = document.header.protocolVersions?.[\"base-reducer\"] ?? 1;\n\t\t\tconst reducerOptions = sourceOperation ? {\n\t\t\t\tskip,\n\t\t\t\tbranch: job.branch,\n\t\t\t\treplayOptions: { operation: sourceOperation },\n\t\t\t\tprotocolVersion\n\t\t\t} : {\n\t\t\t\tskip,\n\t\t\t\tbranch: job.branch,\n\t\t\t\tprotocolVersion\n\t\t\t};\n\t\t\tupdatedDocument = module.reducer(document, action, void 0, reducerOptions);\n\t\t} catch (error) {\n\t\t\tconst contextMessage = `Failed to apply action to document:\\n Action type: ${action.type}\\n Document ID: ${job.documentId}\\n Document type: ${document.header.documentType}\\n Scope: ${job.scope}\\n Original error: ${error instanceof Error ? error.message : String(error)}`;\n\t\t\tconst enhancedError = new Error(contextMessage);\n\t\t\tif (error instanceof Error && error.stack) enhancedError.stack = `${contextMessage}\\n\\nOriginal stack trace:\\n${error.stack}`;\n\t\t\treturn buildErrorResult(job, enhancedError, startTime);\n\t\t}\n\t\tconst scope = job.scope;\n\t\tconst operations = updatedDocument.operations[scope];\n\t\tif (operations.length === 0) return buildErrorResult(job, /* @__PURE__ */ new Error(\"No operation generated from action\"), startTime);\n\t\tconst newOperation = operations[operations.length - 1];\n\t\tif (!isUndoRedo(action)) newOperation.skip = skip;\n\t\tconst resultingState = JSON.stringify({\n\t\t\t...updatedDocument.state,\n\t\t\theader: updatedDocument.header\n\t\t});\n\t\ttry {\n\t\t\tawait stores.operationStore.apply(job.documentId, document.header.documentType, scope, job.branch, newOperation.index, (txn) => {\n\t\t\t\ttxn.addOperations(newOperation);\n\t\t\t}, signal);\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\"Error writing @Operation to IOperationStore: @Error\", newOperation, error);\n\t\t\tstores.writeCache.invalidate(job.documentId, scope, job.branch);\n\t\t\treturn {\n\t\t\t\tjob,\n\t\t\t\tsuccess: false,\n\t\t\t\terror: /* @__PURE__ */ new Error(`Failed to write operation to IOperationStore: ${error instanceof Error ? error.message : String(error)}`),\n\t\t\t\tduration: Date.now() - startTime\n\t\t\t};\n\t\t}\n\t\tupdatedDocument.header.revision = {\n\t\t\t...updatedDocument.header.revision,\n\t\t\t[scope]: newOperation.index + 1\n\t\t};\n\t\tstores.writeCache.putState(job.documentId, scope, job.branch, newOperation.index, updatedDocument);\n\t\tindexTxn.write([{\n\t\t\t...newOperation,\n\t\t\tdocumentId: job.documentId,\n\t\t\tdocumentType: document.header.documentType,\n\t\t\tbranch: job.branch,\n\t\t\tscope,\n\t\t\tsourceRemote\n\t\t}]);\n\t\treturn {\n\t\t\tjob,\n\t\t\tsuccess: true,\n\t\t\toperations: [newOperation],\n\t\t\toperationsWithContext: [{\n\t\t\t\toperation: newOperation,\n\t\t\t\tcontext: {\n\t\t\t\t\tdocumentId: job.documentId,\n\t\t\t\t\tscope,\n\t\t\t\t\tbranch: job.branch,\n\t\t\t\t\tdocumentType: document.header.documentType,\n\t\t\t\t\tresultingState,\n\t\t\t\t\tordinal: 0\n\t\t\t\t}\n\t\t\t}],\n\t\t\tduration: Date.now() - startTime\n\t\t};\n\t}\n\tasync executeLoadJob(job, startTime, indexTxn, stores, signal) {\n\t\tif (job.operations.length === 0) return buildErrorResult(job, /* @__PURE__ */ new Error(\"Load job must include at least one operation\"), startTime);\n\t\tlet docMeta;\n\t\ttry {\n\t\t\tdocMeta = await stores.documentMetaCache.getDocumentMeta(job.documentId, job.branch, signal);\n\t\t} catch {}\n\t\tif (docMeta?.state.isDeleted) return buildErrorResult(job, new DocumentDeletedError(job.documentId, docMeta.state.deletedAtUtcIso), startTime);\n\t\tconst scope = job.scope;\n\t\tlet latestRevision = 0;\n\t\ttry {\n\t\t\tlatestRevision = (await stores.operationStore.getRevisions(job.documentId, job.branch, signal)).revision[scope] ?? 0;\n\t\t} catch {\n\t\t\tlatestRevision = 0;\n\t\t}\n\t\tfor (const operation of job.operations) if (operation.timestampUtcMs && !isValidISOTimestamp(operation.timestampUtcMs)) return {\n\t\t\tjob,\n\t\t\tsuccess: false,\n\t\t\terror: /* @__PURE__ */ new Error(`Invalid timestamp \"${operation.timestampUtcMs}\" on operation (index: ${operation.index})`),\n\t\t\tduration: Date.now() - startTime\n\t\t};\n\t\tlet minIncomingIndex = Number.POSITIVE_INFINITY;\n\t\tlet minIncomingTimestamp = job.operations[0]?.timestampUtcMs || \"\";\n\t\tfor (const operation of job.operations) {\n\t\t\tminIncomingIndex = Math.min(minIncomingIndex, operation.index);\n\t\t\tconst ts = operation.timestampUtcMs || \"\";\n\t\t\tif (ts < minIncomingTimestamp) minIncomingTimestamp = ts;\n\t\t}\n\t\tlet conflictingOps = [];\n\t\ttry {\n\t\t\tconflictingOps = (await stores.operationStore.getConflicting(job.documentId, scope, job.branch, minIncomingTimestamp, void 0, signal)).results;\n\t\t} catch {\n\t\t\tconflictingOps = [];\n\t\t}\n\t\tlet allOpsFromMinConflictingIndex = conflictingOps;\n\t\tif (conflictingOps.length > 0) {\n\t\t\tconst minConflictingIndex = Math.min(...conflictingOps.map((op) => op.index));\n\t\t\ttry {\n\t\t\t\tallOpsFromMinConflictingIndex = (await stores.operationStore.getSince(job.documentId, scope, job.branch, minConflictingIndex - 1, void 0, void 0, signal)).results;\n\t\t\t} catch {\n\t\t\t\tallOpsFromMinConflictingIndex = conflictingOps;\n\t\t\t}\n\t\t}\n\t\tconst nonSupersededOps = conflictingOps.filter((op) => {\n\t\t\tfor (const laterOp of allOpsFromMinConflictingIndex) if (laterOp.index > op.index && laterOp.skip > 0) {\n\t\t\t\tif (laterOp.index - laterOp.skip <= op.index) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\t\tconst existingOpsToReshuffle = nonSupersededOps;\n\t\tconst skipCount = existingOpsToReshuffle.length;\n\t\tif (skipCount > this.config.maxSkipThreshold) return {\n\t\t\tjob,\n\t\t\tsuccess: false,\n\t\t\terror: /* @__PURE__ */ new Error(`Excessive reshuffle detected: skip count of ${skipCount} exceeds threshold of ${this.config.maxSkipThreshold}. This indicates a significant divergence between local and incoming operations.`),\n\t\t\tduration: Date.now() - startTime\n\t\t};\n\t\tconst existingActionIds = new Set(nonSupersededOps.map((op) => op.action.id));\n\t\tconst seenIncomingActionIds = /* @__PURE__ */ new Set();\n\t\tconst incomingOpsToApply = job.operations.filter((op) => {\n\t\t\tif (existingActionIds.has(op.action.id)) return false;\n\t\t\tif (seenIncomingActionIds.has(op.action.id)) return false;\n\t\t\tseenIncomingActionIds.add(op.action.id);\n\t\t\treturn true;\n\t\t});\n\t\tif (incomingOpsToApply.length === 0) return {\n\t\t\tjob,\n\t\t\tsuccess: true,\n\t\t\toperations: [],\n\t\t\toperationsWithContext: [],\n\t\t\tduration: Date.now() - startTime\n\t\t};\n\t\tconst reshuffledOperations = reshuffleByTimestamp({\n\t\t\tindex: latestRevision,\n\t\t\tskip: skipCount\n\t\t}, existingOpsToReshuffle, incomingOpsToApply.map((operation) => ({\n\t\t\t...operation,\n\t\t\tid: operation.id\n\t\t})));\n\t\tfor (const operation of reshuffledOperations) if (operation.action.type === \"NOOP\") operation.skip = 1;\n\t\tconst actions = reshuffledOperations.map((operation) => operation.action);\n\t\tconst skipValues = reshuffledOperations.map((operation) => operation.skip);\n\t\tconst effectiveSourceRemote = skipCount > 0 ? \"\" : job.meta.sourceRemote || \"\";\n\t\tconst result = await this.processActions(job, actions, startTime, indexTxn, stores, skipValues, reshuffledOperations, effectiveSourceRemote, signal);\n\t\tif (!result.success) return {\n\t\t\tjob,\n\t\t\tsuccess: false,\n\t\t\terror: result.error,\n\t\t\tduration: Date.now() - startTime\n\t\t};\n\t\tstores.writeCache.invalidate(job.documentId, scope, job.branch);\n\t\tif (scope === \"document\") stores.documentMetaCache.invalidate(job.documentId, job.branch);\n\t\treturn {\n\t\t\tjob,\n\t\t\tsuccess: true,\n\t\t\toperations: result.generatedOperations,\n\t\t\toperationsWithContext: result.operationsWithContext,\n\t\t\tduration: Date.now() - startTime\n\t\t};\n\t}\n\taccumulateResultOrReturnError(result, generatedOperations, operationsWithContext) {\n\t\tif (!result.success) return result;\n\t\tif (result.operations && result.operations.length > 0) generatedOperations.push(...result.operations);\n\t\tif (result.operationsWithContext) operationsWithContext.push(...result.operationsWithContext);\n\t\treturn null;\n\t}\n};\n//#endregion\n//#region src/job-tracker/in-memory-job-tracker.ts\n/**\n* In-memory implementation of IJobTracker.\n* Maintains job status in a Map for synchronous access.\n* Subscribes to operation events to update job states.\n*/\nvar InMemoryJobTracker = class {\n\tjobs = /* @__PURE__ */ new Map();\n\tunsubscribers = [];\n\tconstructor(eventBus) {\n\t\tthis.eventBus = eventBus;\n\t\tthis.subscribeToEvents();\n\t}\n\tsubscribeToEvents() {\n\t\tthis.unsubscribers.push(this.eventBus.subscribe(ReactorEventTypes.JOB_WRITE_READY, (_type, event) => {\n\t\t\tthis.handleWriteReady(event);\n\t\t}));\n\t\tthis.unsubscribers.push(this.eventBus.subscribe(ReactorEventTypes.JOB_READ_READY, (_type, event) => {\n\t\t\tthis.handleReadReady(event);\n\t\t}));\n\t\tthis.unsubscribers.push(this.eventBus.subscribe(ReactorEventTypes.JOB_FAILED, (_type, event) => {\n\t\t\tthis.handleJobFailed(event);\n\t\t}));\n\t}\n\thandleWriteReady(event) {\n\t\tconst jobId = event.jobId;\n\t\tconst job = this.jobs.get(jobId);\n\t\tif (job && job.status === JobStatus.RUNNING) {\n\t\t\tconst consistencyToken = createConsistencyToken(event.operations);\n\t\t\tthis.jobs.set(jobId, {\n\t\t\t\t...job,\n\t\t\t\tstatus: JobStatus.WRITE_READY,\n\t\t\t\tconsistencyToken\n\t\t\t});\n\t\t}\n\t}\n\thandleReadReady(event) {\n\t\tconst jobId = event.jobId;\n\t\tconst job = this.jobs.get(jobId);\n\t\tif (job && job.status === JobStatus.WRITE_READY) this.jobs.set(jobId, {\n\t\t\t...job,\n\t\t\tstatus: JobStatus.READ_READY\n\t\t});\n\t}\n\thandleJobFailed(event) {\n\t\tthis.markFailed(event.jobId, {\n\t\t\tmessage: event.error.message,\n\t\t\tstack: event.error.stack || \"\"\n\t\t}, event.job);\n\t}\n\tshutdown() {\n\t\tfor (const unsubscribe of this.unsubscribers) unsubscribe();\n\t\tthis.unsubscribers = [];\n\t}\n\tregisterJob(jobInfo) {\n\t\tthis.jobs.set(jobInfo.id, { ...jobInfo });\n\t}\n\tmarkRunning(jobId) {\n\t\tconst job = this.jobs.get(jobId);\n\t\tif (!job) {\n\t\t\tthis.jobs.set(jobId, {\n\t\t\t\tid: jobId,\n\t\t\t\tstatus: JobStatus.RUNNING,\n\t\t\t\tcreatedAtUtcIso: (/* @__PURE__ */ new Date()).toISOString(),\n\t\t\t\tconsistencyToken: createEmptyConsistencyToken(),\n\t\t\t\tmeta: {\n\t\t\t\t\tbatchId: jobId,\n\t\t\t\t\tbatchJobIds: [jobId]\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tthis.jobs.set(jobId, {\n\t\t\t...job,\n\t\t\tstatus: JobStatus.RUNNING\n\t\t});\n\t}\n\tmarkFailed(jobId, error, job) {\n\t\tconst existing = this.jobs.get(jobId);\n\t\tif (!existing) {\n\t\t\tthis.jobs.set(jobId, {\n\t\t\t\tid: jobId,\n\t\t\t\tstatus: JobStatus.FAILED,\n\t\t\t\tcreatedAtUtcIso: (/* @__PURE__ */ new Date()).toISOString(),\n\t\t\t\tcompletedAtUtcIso: (/* @__PURE__ */ new Date()).toISOString(),\n\t\t\t\terror,\n\t\t\t\tjob,\n\t\t\t\tconsistencyToken: createEmptyConsistencyToken(),\n\t\t\t\tmeta: {\n\t\t\t\t\tbatchId: jobId,\n\t\t\t\t\tbatchJobIds: [jobId]\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tthis.jobs.set(jobId, {\n\t\t\t...existing,\n\t\t\tstatus: JobStatus.FAILED,\n\t\t\tcompletedAtUtcIso: (/* @__PURE__ */ new Date()).toISOString(),\n\t\t\terror,\n\t\t\tjob,\n\t\t\tconsistencyToken: createEmptyConsistencyToken()\n\t\t});\n\t}\n\tgetJobStatus(jobId) {\n\t\tconst job = this.jobs.get(jobId);\n\t\treturn job ? { ...job } : null;\n\t}\n};\n//#endregion\n//#region src/read-models/base-read-model.ts\n/**\n* Base class for read models that provides catch-up/rewind functionality.\n* Handles initialization, state tracking via ViewState table, and consistency tracking.\n* Subclasses override commitOperations() with their specific domain logic.\n*/\nvar BaseReadModel = class {\n\tlastOrdinal = 0;\n\tname;\n\tconstructor(db, operationIndex, writeCache, consistencyTracker, config) {\n\t\tthis.db = db;\n\t\tthis.operationIndex = operationIndex;\n\t\tthis.writeCache = writeCache;\n\t\tthis.consistencyTracker = consistencyTracker;\n\t\tthis.config = config;\n\t\tthis.name = config.readModelId;\n\t}\n\t/**\n\t* Initializes the read model by loading state and catching up on missed operations.\n\t*/\n\tasync init() {\n\t\tconst viewState = await this.loadState();\n\t\tif (viewState !== void 0) {\n\t\t\tthis.lastOrdinal = viewState;\n\t\t\tconst missedOperations = await this.operationIndex.getSinceOrdinal(this.lastOrdinal);\n\t\t\tif (missedOperations.results.length > 0) {\n\t\t\t\tconst ops = this.config.rebuildStateOnInit ? await this.rebuildStateForOperations(missedOperations.results) : missedOperations.results;\n\t\t\t\tawait this.indexOperations(ops);\n\t\t\t}\n\t\t} else {\n\t\t\tawait this.initializeState();\n\t\t\tconst allOperations = await this.operationIndex.getSinceOrdinal(0);\n\t\t\tif (allOperations.results.length > 0) {\n\t\t\t\tconst ops = this.config.rebuildStateOnInit ? await this.rebuildStateForOperations(allOperations.results) : allOperations.results;\n\t\t\t\tawait this.indexOperations(ops);\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t* Template method: runs domain-specific commitOperations, then persists\n\t* state and updates consistency tracking.\n\t*/\n\tasync indexOperations(items) {\n\t\tif (items.length === 0) return;\n\t\tawait this.commitOperations(items);\n\t\tawait this.db.transaction().execute(async (trx) => {\n\t\t\tawait this.saveState(trx, items);\n\t\t});\n\t\tthis.updateConsistencyTracker(items);\n\t}\n\t/**\n\t* Waits for the read model to reach the specified consistency level.\n\t*/\n\tasync waitForConsistency(token, timeoutMs, signal) {\n\t\tif (token.coordinates.length === 0) return;\n\t\tawait this.consistencyTracker.waitFor(token.coordinates, timeoutMs, signal);\n\t}\n\tasync commitOperations(items) {}\n\t/**\n\t* Rebuilds document state for each operation using the write cache.\n\t*/\n\tasync rebuildStateForOperations(operations) {\n\t\tconst result = [];\n\t\tfor (const op of operations) {\n\t\t\tconst { documentId, scope, branch } = op.context;\n\t\t\tconst targetRevision = op.operation.index;\n\t\t\tconst document = await this.writeCache.getState(documentId, scope, branch, targetRevision);\n\t\t\tresult.push({\n\t\t\t\toperation: op.operation,\n\t\t\t\tcontext: {\n\t\t\t\t\t...op.context,\n\t\t\t\t\tresultingState: JSON.stringify(document)\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn result;\n\t}\n\t/**\n\t* Loads the last processed ordinal from the ViewState table.\n\t* Returns undefined if no state exists for this read model.\n\t*/\n\tasync loadState() {\n\t\treturn (await this.db.selectFrom(\"ViewState\").select(\"lastOrdinal\").where(\"readModelId\", \"=\", this.config.readModelId).executeTakeFirst())?.lastOrdinal;\n\t}\n\t/**\n\t* Initializes the ViewState row for this read model.\n\t*/\n\tasync initializeState() {\n\t\tawait this.db.insertInto(\"ViewState\").values({\n\t\t\treadModelId: this.config.readModelId,\n\t\t\tlastOrdinal: 0\n\t\t}).execute();\n\t}\n\t/**\n\t* Saves the last processed ordinal to the ViewState table.\n\t*/\n\tasync saveState(trx, items) {\n\t\tconst maxOrdinal = Math.max(...items.map((item) => item.context.ordinal));\n\t\tthis.lastOrdinal = maxOrdinal;\n\t\tawait trx.updateTable(\"ViewState\").set({\n\t\t\tlastOrdinal: maxOrdinal,\n\t\t\tlastOperationTimestamp: /* @__PURE__ */ new Date()\n\t\t}).where(\"readModelId\", \"=\", this.config.readModelId).execute();\n\t}\n\t/**\n\t* Updates the consistency tracker with the processed operations.\n\t*/\n\tupdateConsistencyTracker(items) {\n\t\tconst coordinates = [];\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tconst item = items[i];\n\t\t\tcoordinates.push({\n\t\t\t\tdocumentId: item.context.documentId,\n\t\t\t\tscope: item.context.scope,\n\t\t\t\tbranch: item.context.branch,\n\t\t\t\toperationIndex: item.operation.index\n\t\t\t});\n\t\t}\n\t\tthis.consistencyTracker.update(coordinates);\n\t}\n};\n//#endregion\n//#region src/processors/utils.ts\nconst DRIVE_DOCUMENT_TYPE = \"powerhouse/document-drive\";\nfunction isDriveCreation(op) {\n\treturn op.operation.action.type === \"CREATE_DOCUMENT\" && op.context.documentType === \"powerhouse/document-drive\";\n}\nfunction isDriveDeletion(op) {\n\treturn op.operation.action.type === \"DELETE_DOCUMENT\";\n}\nfunction extractDriveHeader(op) {\n\tif (!op.context.resultingState) return void 0;\n\treturn JSON.parse(op.context.resultingState).header;\n}\nfunction extractDeletedDocumentId(op) {\n\treturn op.operation.action.input.documentId ?? op.context.documentId;\n}\nfunction createMinimalDriveHeader(driveId) {\n\treturn {\n\t\tid: driveId,\n\t\tdocumentType: DRIVE_DOCUMENT_TYPE,\n\t\tsig: {\n\t\t\tpublicKey: {},\n\t\t\tnonce: \"\"\n\t\t},\n\t\tslug: \"\",\n\t\tname: \"\",\n\t\tbranch: \"main\",\n\t\trevision: {},\n\t\tcreatedAtUtcIso: (/* @__PURE__ */ new Date()).toISOString(),\n\t\tlastModifiedAtUtcIso: (/* @__PURE__ */ new Date()).toISOString()\n\t};\n}\nfunction matchesFilter(op, filter) {\n\tif (filter.documentType && filter.documentType.length > 0) {\n\t\tif (!filter.documentType.includes(op.context.documentType)) return false;\n\t}\n\tif (filter.scope && filter.scope.length > 0) {\n\t\tif (!filter.scope.includes(op.context.scope)) return false;\n\t}\n\tif (filter.branch && filter.branch.length > 0) {\n\t\tif (!filter.branch.includes(op.context.branch)) return false;\n\t}\n\tif (filter.documentId && filter.documentId.length > 0) {\n\t\tif (!filter.documentId.includes(\"*\") && !filter.documentId.includes(op.context.documentId)) return false;\n\t}\n\treturn true;\n}\n//#endregion\n//#region src/processors/processor-manager.ts\n/**\n* Manages processor lifecycle based on operations.\n* Extends BaseReadModel to receive operations from ReadModelCoordinator.\n*\n* Responsibilities:\n* 1. Detect drive creation from CREATE_DOCUMENT operations\n* 2. Create processors for each drive using registered factories\n* 3. Route operations to matching processors based on filters\n* 4. Clean up processors when drives are deleted or factories are unregistered\n* 5. Track per-processor cursors for failure recovery and backfill\n*/\nvar ProcessorManager = class extends BaseReadModel {\n\tfactoryRegistry = /* @__PURE__ */ new Map();\n\tprocessorsByDrive = /* @__PURE__ */ new Map();\n\tfactoryToProcessors = /* @__PURE__ */ new Map();\n\tknownDriveIds = /* @__PURE__ */ new Set();\n\tcursorCache = /* @__PURE__ */ new Map();\n\tlogger;\n\tconstructor(db, operationIndex, writeCache, consistencyTracker, logger) {\n\t\tsuper(db, operationIndex, writeCache, consistencyTracker, {\n\t\t\treadModelId: \"processor-manager\",\n\t\t\trebuildStateOnInit: true\n\t\t});\n\t\tthis.logger = logger;\n\t}\n\tasync init() {\n\t\tawait super.init();\n\t\tawait this.loadAllCursors();\n\t\tawait this.discoverExistingDrives();\n\t}\n\tasync commitOperations(items) {\n\t\tawait this.detectAndRegisterNewDrives(items);\n\t\tawait this.detectAndCleanupDeletedDrives(items);\n\t\tawait this.routeOperationsToProcessors(items);\n\t}\n\tasync registerFactory(identifier, factory) {\n\t\tif (this.factoryRegistry.has(identifier)) await this.unregisterFactory(identifier);\n\t\tthis.factoryRegistry.set(identifier, factory);\n\t\tthis.factoryToProcessors.set(identifier, /* @__PURE__ */ new Map());\n\t\tfor (const driveId of this.knownDriveIds) {\n\t\t\tconst driveHeader = createMinimalDriveHeader(driveId);\n\t\t\tawait this.createProcessorsForDrive(driveId, identifier, factory, driveHeader);\n\t\t}\n\t}\n\tasync unregisterFactory(identifier) {\n\t\tconst factoryProcessors = this.factoryToProcessors.get(identifier);\n\t\tif (!factoryProcessors) return;\n\t\tfor (const [driveId, tracked] of factoryProcessors) {\n\t\t\tfor (const t of tracked) await this.safeDisconnect(t.record.processor);\n\t\t\tconst driveProcessors = this.processorsByDrive.get(driveId);\n\t\t\tif (driveProcessors) {\n\t\t\t\tconst remaining = driveProcessors.filter((p) => !tracked.includes(p));\n\t\t\t\tif (remaining.length > 0) this.processorsByDrive.set(driveId, remaining);\n\t\t\t\telse this.processorsByDrive.delete(driveId);\n\t\t\t}\n\t\t}\n\t\tawait this.deleteProcessorCursors({ factoryId: identifier });\n\t\tthis.factoryToProcessors.delete(identifier);\n\t\tthis.factoryRegistry.delete(identifier);\n\t}\n\tget(processorId) {\n\t\tfor (const tracked of this.allTrackedProcessors()) if (tracked.processorId === processorId) return tracked;\n\t}\n\tgetAll() {\n\t\treturn Array.from(this.allTrackedProcessors());\n\t}\n\t*allTrackedProcessors() {\n\t\tfor (const tracked of this.processorsByDrive.values()) yield* tracked;\n\t}\n\tasync detectAndRegisterNewDrives(operations) {\n\t\tfor (const op of operations) {\n\t\t\tif (!isDriveCreation(op)) continue;\n\t\t\tconst driveId = op.context.documentId;\n\t\t\tif (this.knownDriveIds.has(driveId)) continue;\n\t\t\tthis.knownDriveIds.add(driveId);\n\t\t\tconst driveHeader = extractDriveHeader(op);\n\t\t\tif (!driveHeader) continue;\n\t\t\tfor (const [identifier, factory] of this.factoryRegistry) await this.createProcessorsForDrive(driveId, identifier, factory, driveHeader);\n\t\t}\n\t}\n\tasync detectAndCleanupDeletedDrives(operations) {\n\t\tfor (const op of operations) {\n\t\t\tif (!isDriveDeletion(op)) continue;\n\t\t\tconst driveId = extractDeletedDocumentId(op);\n\t\t\tif (!driveId || !this.knownDriveIds.has(driveId)) continue;\n\t\t\tif (!this.isDeletedDocumentADrive(driveId)) continue;\n\t\t\tawait this.cleanupDriveProcessors(driveId);\n\t\t\tthis.knownDriveIds.delete(driveId);\n\t\t}\n\t}\n\tasync discoverExistingDrives() {\n\t\tconst drives = await this.db.selectFrom(\"DocumentSnapshot\").select(\"documentId\").where(\"documentType\", \"=\", DRIVE_DOCUMENT_TYPE).where(\"isDeleted\", \"=\", false).execute();\n\t\tfor (const drive of drives) this.knownDriveIds.add(drive.documentId);\n\t}\n\tisDeletedDocumentADrive(documentId) {\n\t\treturn this.knownDriveIds.has(documentId);\n\t}\n\tasync createProcessorsForDrive(driveId, identifier, factory, driveHeader) {\n\t\tlet records = [];\n\t\ttry {\n\t\t\trecords = await factory(driveHeader);\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\"Factory '@FactoryId' failed for drive '@DriveId': @Error\", identifier, driveId, error);\n\t\t\treturn;\n\t\t}\n\t\tif (records.length === 0) return;\n\t\tconst trackedList = [];\n\t\tfor (let i = 0; i < records.length; i++) {\n\t\t\tconst record = records[i];\n\t\t\tconst processorId = `${identifier}:${driveId}:${i}`;\n\t\t\tconst cached = this.cursorCache.get(processorId);\n\t\t\tlet lastOrdinal;\n\t\t\tlet status;\n\t\t\tlet lastError;\n\t\t\tlet lastErrorTimestamp;\n\t\t\tif (cached) {\n\t\t\t\tlastOrdinal = cached.lastOrdinal;\n\t\t\t\tstatus = cached.status;\n\t\t\t\tlastError = cached.lastError ?? void 0;\n\t\t\t\tlastErrorTimestamp = cached.lastErrorTimestamp ?? void 0;\n\t\t\t} else {\n\t\t\t\tlastOrdinal = (record.startFrom ?? \"beginning\") === \"current\" ? this.lastOrdinal : 0;\n\t\t\t\tstatus = \"active\";\n\t\t\t\tlastError = void 0;\n\t\t\t\tlastErrorTimestamp = void 0;\n\t\t\t}\n\t\t\tconst tracked = {\n\t\t\t\tprocessorId,\n\t\t\t\tfactoryId: identifier,\n\t\t\t\tdriveId,\n\t\t\t\tprocessorIndex: i,\n\t\t\t\trecord,\n\t\t\t\tlastOrdinal,\n\t\t\t\tstatus,\n\t\t\t\tlastError,\n\t\t\t\tlastErrorTimestamp,\n\t\t\t\tretry: () => this.retryProcessor(tracked)\n\t\t\t};\n\t\t\ttrackedList.push(tracked);\n\t\t\tawait this.saveProcessorCursor(tracked);\n\t\t}\n\t\tawait this.db.deleteFrom(\"ProcessorCursor\").where(\"factoryId\", \"=\", identifier).where(\"driveId\", \"=\", driveId).where(\"processorIndex\", \">=\", records.length).execute();\n\t\tfor (const [id, row] of this.cursorCache) if (row.factoryId === identifier && row.driveId === driveId && row.processorIndex >= records.length) this.cursorCache.delete(id);\n\t\tconst factoryProcessors = this.factoryToProcessors.get(identifier);\n\t\tif (factoryProcessors) factoryProcessors.set(driveId, trackedList);\n\t\tconst existingDriveProcessors = this.processorsByDrive.get(driveId) ?? [];\n\t\tthis.processorsByDrive.set(driveId, [...existingDriveProcessors, ...trackedList]);\n\t\tfor (const tracked of trackedList) if (tracked.status === \"active\" && tracked.lastOrdinal < this.lastOrdinal) await this.backfillProcessor(tracked);\n\t}\n\tasync backfillProcessor(tracked) {\n\t\tlet page = await this.operationIndex.getSinceOrdinal(tracked.lastOrdinal);\n\t\twhile (page.results.length > 0) {\n\t\t\tconst matching = page.results.filter((op) => matchesFilter(op, tracked.record.filter));\n\t\t\tif (matching.length > 0) try {\n\t\t\t\tawait tracked.record.processor.onOperations(matching);\n\t\t\t} catch (error) {\n\t\t\t\ttracked.status = \"errored\";\n\t\t\t\ttracked.lastError = error instanceof Error ? error.message : String(error);\n\t\t\t\ttracked.lastErrorTimestamp = /* @__PURE__ */ new Date();\n\t\t\t\tawait this.safeSaveProcessorCursor(tracked);\n\t\t\t\tthis.logger.error(\"Processor '@ProcessorId' failed during backfill at ordinal @Ordinal: @Error\", tracked.processorId, tracked.lastOrdinal, error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttracked.lastOrdinal = Math.max(...page.results.map((op) => op.context.ordinal));\n\t\t\tawait this.safeSaveProcessorCursor(tracked);\n\t\t\tif (!page.next) break;\n\t\t\tpage = await page.next();\n\t\t}\n\t}\n\tasync retryProcessor(tracked) {\n\t\tif (tracked.status !== \"errored\") return;\n\t\ttracked.status = \"active\";\n\t\ttracked.lastError = void 0;\n\t\ttracked.lastErrorTimestamp = void 0;\n\t\tawait this.saveProcessorCursor(tracked);\n\t\tawait this.backfillProcessor(tracked);\n\t}\n\tasync cleanupDriveProcessors(driveId) {\n\t\tconst processors = this.processorsByDrive.get(driveId);\n\t\tif (!processors) return;\n\t\tfor (const tracked of processors) await this.safeDisconnect(tracked.record.processor);\n\t\tthis.processorsByDrive.delete(driveId);\n\t\tfor (const factoryProcessors of this.factoryToProcessors.values()) factoryProcessors.delete(driveId);\n\t\tawait this.deleteProcessorCursors({ driveId });\n\t}\n\tasync safeDisconnect(processor) {\n\t\ttry {\n\t\t\tawait processor.onDisconnect();\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\"Error disconnecting processor: @Error\", error);\n\t\t}\n\t}\n\tasync routeOperationsToProcessors(operations) {\n\t\tconst maxOrdinal = Math.max(...operations.map((op) => op.context.ordinal));\n\t\tconst allTracked = Array.from(this.allTrackedProcessors());\n\t\tawait Promise.all(allTracked.map(async (tracked) => {\n\t\t\tif (tracked.status !== \"active\") return;\n\t\t\tconst matching = operations.filter((op) => op.context.ordinal > tracked.lastOrdinal).filter((op) => matchesFilter(op, tracked.record.filter));\n\t\t\tif (matching.length > 0) try {\n\t\t\t\tawait tracked.record.processor.onOperations(matching);\n\t\t\t} catch (error) {\n\t\t\t\ttracked.status = \"errored\";\n\t\t\t\ttracked.lastError = error instanceof Error ? error.message : String(error);\n\t\t\t\ttracked.lastErrorTimestamp = /* @__PURE__ */ new Date();\n\t\t\t\tawait this.safeSaveProcessorCursor(tracked);\n\t\t\t\tthis.logger.error(\"Processor '@ProcessorId' failed at ordinal @Ordinal: @Error\", tracked.processorId, tracked.lastOrdinal, error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttracked.lastOrdinal = maxOrdinal;\n\t\t\tawait this.safeSaveProcessorCursor(tracked);\n\t\t}));\n\t}\n\tasync loadAllCursors() {\n\t\tconst rows = await this.db.selectFrom(\"ProcessorCursor\").selectAll().execute();\n\t\tfor (const row of rows) this.cursorCache.set(row.processorId, row);\n\t}\n\tasync safeSaveProcessorCursor(tracked) {\n\t\ttry {\n\t\t\tawait this.saveProcessorCursor(tracked);\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\"Failed to persist cursor for '@ProcessorId': @Error\", tracked.processorId, error);\n\t\t}\n\t}\n\tasync saveProcessorCursor(tracked) {\n\t\tawait this.db.insertInto(\"ProcessorCursor\").values({\n\t\t\tprocessorId: tracked.processorId,\n\t\t\tfactoryId: tracked.factoryId,\n\t\t\tdriveId: tracked.driveId,\n\t\t\tprocessorIndex: tracked.processorIndex,\n\t\t\tlastOrdinal: tracked.lastOrdinal,\n\t\t\tstatus: tracked.status,\n\t\t\tlastError: tracked.lastError ?? null,\n\t\t\tlastErrorTimestamp: tracked.lastErrorTimestamp ?? null,\n\t\t\tupdatedAt: /* @__PURE__ */ new Date()\n\t\t}).onConflict((oc) => oc.column(\"processorId\").doUpdateSet({\n\t\t\tlastOrdinal: tracked.lastOrdinal,\n\t\t\tstatus: tracked.status,\n\t\t\tlastError: tracked.lastError ?? null,\n\t\t\tlastErrorTimestamp: tracked.lastErrorTimestamp ?? null,\n\t\t\tupdatedAt: /* @__PURE__ */ new Date()\n\t\t})).execute();\n\t\tthis.cursorCache.set(tracked.processorId, {\n\t\t\tprocessorId: tracked.processorId,\n\t\t\tfactoryId: tracked.factoryId,\n\t\t\tdriveId: tracked.driveId,\n\t\t\tprocessorIndex: tracked.processorIndex,\n\t\t\tlastOrdinal: tracked.lastOrdinal,\n\t\t\tstatus: tracked.status,\n\t\t\tlastError: tracked.lastError ?? null,\n\t\t\tlastErrorTimestamp: tracked.lastErrorTimestamp ?? null,\n\t\t\tcreatedAt: /* @__PURE__ */ new Date(),\n\t\t\tupdatedAt: /* @__PURE__ */ new Date()\n\t\t});\n\t}\n\tasync deleteProcessorCursors(filter) {\n\t\tif (\"factoryId\" in filter) {\n\t\t\tawait this.db.deleteFrom(\"ProcessorCursor\").where(\"factoryId\", \"=\", filter.factoryId).execute();\n\t\t\tfor (const [id, row] of this.cursorCache) if (row.factoryId === filter.factoryId) this.cursorCache.delete(id);\n\t\t} else {\n\t\t\tawait this.db.deleteFrom(\"ProcessorCursor\").where(\"driveId\", \"=\", filter.driveId).execute();\n\t\t\tfor (const [id, row] of this.cursorCache) if (row.driveId === filter.driveId) this.cursorCache.delete(id);\n\t\t}\n\t}\n};\n//#endregion\n//#region src/queue/job-execution-handle.ts\n/**\n* Implementation of the IJobExecutionHandle interface\n*/\nvar JobExecutionHandle = class {\n\t_state;\n\t_job;\n\tonStart;\n\tonComplete;\n\tonFail;\n\tonDefer;\n\tgetStateName(state) {\n\t\tswitch (state) {\n\t\t\tcase JobQueueState.PREPROCESSING: return \"PREPROCESSING\";\n\t\t\tcase JobQueueState.PENDING: return \"PENDING\";\n\t\t\tcase JobQueueState.READY: return \"READY\";\n\t\t\tcase JobQueueState.RUNNING: return \"RUNNING\";\n\t\t\tcase JobQueueState.RESOLVED: return \"RESOLVED\";\n\t\t\tdefault: return `UNKNOWN`;\n\t\t}\n\t}\n\tconstructor(job, initialState, callbacks) {\n\t\tthis._job = job;\n\t\tthis._state = initialState;\n\t\tthis.onStart = callbacks?.onStart;\n\t\tthis.onComplete = callbacks?.onComplete;\n\t\tthis.onFail = callbacks?.onFail;\n\t\tthis.onDefer = callbacks?.onDefer;\n\t}\n\tget job() {\n\t\treturn this._job;\n\t}\n\tget state() {\n\t\treturn this._state;\n\t}\n\tstart() {\n\t\tif (this._state !== JobQueueState.READY) throw new Error(`Cannot start job in state ${this.getStateName(this._state)}`);\n\t\tthis._state = JobQueueState.RUNNING;\n\t\tthis.onStart?.();\n\t}\n\tcomplete() {\n\t\tif (this._state !== JobQueueState.RUNNING) throw new Error(`Cannot complete job in state ${this.getStateName(this._state)}`);\n\t\tthis._state = JobQueueState.RESOLVED;\n\t\tthis.onComplete?.();\n\t}\n\tfail(error) {\n\t\tif (this._state !== JobQueueState.RUNNING) throw new Error(`Cannot fail job in state ${this.getStateName(this._state)}`);\n\t\tthis._state = JobQueueState.RESOLVED;\n\t\tthis.onFail?.(error);\n\t}\n\tdefer() {\n\t\tif (this._state !== JobQueueState.RUNNING) throw new Error(`Cannot defer job in state ${this.getStateName(this._state)}`);\n\t\tthis._state = JobQueueState.RESOLVED;\n\t\tthis.onDefer?.();\n\t}\n};\n//#endregion\n//#region src/queue/queue.ts\n/**\n* In-memory implementation of the IQueue interface.\n* Organizes jobs by documentId, scope, and branch to ensure proper ordering.\n* Ensures serial execution per document by tracking executing jobs.\n* Implements dependency management through queue hints.\n*/\nvar InMemoryQueue = class {\n\tqueues = /* @__PURE__ */ new Map();\n\tjobIdToQueueKey = /* @__PURE__ */ new Map();\n\tdocIdToJobId = /* @__PURE__ */ new Map();\n\tjobIdToDocId = /* @__PURE__ */ new Map();\n\tcompletedJobs = /* @__PURE__ */ new Set();\n\tjobIndex = /* @__PURE__ */ new Map();\n\tisBlocked = false;\n\tonDrainedCallback;\n\tisPausedFlag = false;\n\tconstructor(eventBus, resolver) {\n\t\tthis.eventBus = eventBus;\n\t\tthis.resolver = resolver;\n\t}\n\ttoErrorInfo(error) {\n\t\tif (error instanceof Error) return {\n\t\t\tmessage: error.message,\n\t\t\tstack: error.stack || (/* @__PURE__ */ new Error()).stack || \"\"\n\t\t};\n\t\treturn {\n\t\t\tmessage: error,\n\t\t\tstack: (/* @__PURE__ */ new Error()).stack || \"\"\n\t\t};\n\t}\n\t/**\n\t* Creates a unique key for a document/scope/branch combination\n\t*/\n\tcreateQueueKey(documentId, scope, branch) {\n\t\treturn `${documentId}:${scope}:${branch}`;\n\t}\n\t/**\n\t* Gets or creates a queue for the given key\n\t*/\n\tgetQueue(queueKey) {\n\t\tlet queue = this.queues.get(queueKey);\n\t\tif (!queue) {\n\t\t\tqueue = [];\n\t\t\tthis.queues.set(queueKey, queue);\n\t\t}\n\t\treturn queue;\n\t}\n\t/**\n\t* Check if a document has any jobs currently executing\n\t*/\n\tisDocumentExecuting(documentId) {\n\t\tconst executingSet = this.docIdToJobId.get(documentId);\n\t\treturn executingSet ? executingSet.size > 0 : false;\n\t}\n\t/**\n\t* Mark a job as executing for its document\n\t*/\n\tmarkJobExecuting(job) {\n\t\tlet executingSet = this.docIdToJobId.get(job.documentId);\n\t\tif (!executingSet) {\n\t\t\texecutingSet = /* @__PURE__ */ new Set();\n\t\t\tthis.docIdToJobId.set(job.documentId, executingSet);\n\t\t}\n\t\texecutingSet.add(job.id);\n\t\tthis.jobIdToDocId.set(job.id, job.documentId);\n\t}\n\t/**\n\t* Mark a job as no longer executing for its document\n\t*/\n\tmarkJobComplete(jobId, documentId) {\n\t\tconst executingSet = this.docIdToJobId.get(documentId);\n\t\tif (executingSet) {\n\t\t\texecutingSet.delete(jobId);\n\t\t\tif (executingSet.size === 0) this.docIdToJobId.delete(documentId);\n\t\t}\n\t\tthis.jobIdToDocId.delete(jobId);\n\t}\n\t/**\n\t* Check if all dependencies for a job have been completed\n\t*/\n\tareDependenciesMet(job) {\n\t\tif (job.queueHint.length === 0) return true;\n\t\treturn job.queueHint.every((depId) => this.completedJobs.has(depId));\n\t}\n\t/**\n\t* Get the next job that has all its dependencies met\n\t*/\n\tgetNextJobWithMetDependencies(queue) {\n\t\tfor (const job of queue) if (this.areDependenciesMet(job)) return job;\n\t\treturn null;\n\t}\n\tgetCreateDocumentType(job) {\n\t\tfor (const action of job.actions) if (action.type === \"CREATE_DOCUMENT\") return action.input.model;\n\t\tfor (const operation of job.operations) if (operation.action.type === \"CREATE_DOCUMENT\") return operation.action.input.model;\n\t}\n\tasync enqueue(job) {\n\t\tif (this.isBlocked) throw new Error(\"Queue is blocked\");\n\t\tconst queueKey = this.createQueueKey(job.documentId, job.scope, job.branch);\n\t\tthis.getQueue(queueKey).push(job);\n\t\tthis.jobIdToQueueKey.set(job.id, queueKey);\n\t\tthis.jobIndex.set(job.id, job);\n\t\tconst documentType = this.getCreateDocumentType(job);\n\t\tif (documentType) try {\n\t\t\tawait this.resolver.ensureModelLoaded(documentType);\n\t\t} catch {\n\t\t\tawait this.failJob(job.id, {\n\t\t\t\tmessage: `Failed to load document model for type: ${documentType}`,\n\t\t\t\tstack: (/* @__PURE__ */ new Error()).stack || \"\"\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tconst eventData = {\n\t\t\tdocumentId: job.documentId,\n\t\t\tscope: job.scope,\n\t\t\tbranch: job.branch,\n\t\t\tjobId: job.id\n\t\t};\n\t\tawait this.eventBus.emit(QueueEventTypes.JOB_AVAILABLE, eventData);\n\t}\n\tdequeue(documentId, scope, branch, signal) {\n\t\tconst queueKey = this.createQueueKey(documentId, scope, branch);\n\t\tconst queue = this.queues.get(queueKey);\n\t\tif (signal?.aborted) return Promise.reject(/* @__PURE__ */ new Error(\"Operation aborted\"));\n\t\tif (!queue || queue.length === 0) return Promise.resolve(null);\n\t\tconst job = this.getNextJobWithMetDependencies(queue);\n\t\tif (!job) return Promise.resolve(null);\n\t\tconst jobIndex = queue.indexOf(job);\n\t\tqueue.splice(jobIndex, 1);\n\t\tthis.jobIdToQueueKey.delete(job.id);\n\t\tthis.markJobExecuting(job);\n\t\tif (queue.length === 0) this.queues.delete(queueKey);\n\t\tconst handle = new JobExecutionHandle(job, JobQueueState.READY, {\n\t\t\tonStart: () => {},\n\t\t\tonComplete: () => {\n\t\t\t\tthis.completeJob(job.id);\n\t\t\t},\n\t\t\tonFail: (error) => {\n\t\t\t\tthis.failJob(job.id, error);\n\t\t\t},\n\t\t\tonDefer: () => {\n\t\t\t\tthis.deferJob(job.id);\n\t\t\t}\n\t\t});\n\t\treturn Promise.resolve(handle);\n\t}\n\tdequeueNext(signal) {\n\t\tif (signal?.aborted) return Promise.reject(/* @__PURE__ */ new Error(\"Operation aborted\"));\n\t\tif (this.isPausedFlag) return Promise.resolve(null);\n\t\tfor (const [queueKey, queue] of this.queues.entries()) if (queue.length > 0) {\n\t\t\tconst job = this.getNextJobWithMetDependencies(queue);\n\t\t\tif (!job) continue;\n\t\t\tif (!this.isDocumentExecuting(job.documentId)) {\n\t\t\t\tconst jobIdx = queue.indexOf(job);\n\t\t\t\tqueue.splice(jobIdx, 1);\n\t\t\t\tthis.jobIdToQueueKey.delete(job.id);\n\t\t\t\tthis.markJobExecuting(job);\n\t\t\t\tif (queue.length === 0) this.queues.delete(queueKey);\n\t\t\t\tconst handle = new JobExecutionHandle(job, JobQueueState.READY, {\n\t\t\t\t\tonStart: () => {},\n\t\t\t\t\tonComplete: () => {\n\t\t\t\t\t\tthis.completeJob(job.id);\n\t\t\t\t\t},\n\t\t\t\t\tonFail: (error) => {\n\t\t\t\t\t\tthis.failJob(job.id, error);\n\t\t\t\t\t},\n\t\t\t\t\tonDefer: () => {\n\t\t\t\t\t\tthis.deferJob(job.id);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn Promise.resolve(handle);\n\t\t\t}\n\t\t}\n\t\treturn Promise.resolve(null);\n\t}\n\tsize(documentId, scope, branch) {\n\t\tconst queueKey = this.createQueueKey(documentId, scope, branch);\n\t\tconst queue = this.queues.get(queueKey);\n\t\treturn Promise.resolve(queue ? queue.length : 0);\n\t}\n\ttotalSize() {\n\t\tlet total = 0;\n\t\tfor (const queue of this.queues.values()) total += queue.length;\n\t\treturn Promise.resolve(total);\n\t}\n\tremove(jobId) {\n\t\tconst queueKey = this.jobIdToQueueKey.get(jobId);\n\t\tif (!queueKey) return Promise.resolve(false);\n\t\tconst queue = this.queues.get(queueKey);\n\t\tif (!queue) {\n\t\t\tthis.jobIdToQueueKey.delete(jobId);\n\t\t\tthis.jobIndex.delete(jobId);\n\t\t\treturn Promise.resolve(false);\n\t\t}\n\t\tconst jobIdx = queue.findIndex((job) => job.id === jobId);\n\t\tif (jobIdx === -1) {\n\t\t\tthis.jobIdToQueueKey.delete(jobId);\n\t\t\tthis.jobIndex.delete(jobId);\n\t\t\treturn Promise.resolve(false);\n\t\t}\n\t\tqueue.splice(jobIdx, 1);\n\t\tthis.jobIdToQueueKey.delete(jobId);\n\t\tthis.jobIndex.delete(jobId);\n\t\tif (queue.length === 0) this.queues.delete(queueKey);\n\t\treturn Promise.resolve(true);\n\t}\n\tclear(documentId, scope, branch) {\n\t\tconst queueKey = this.createQueueKey(documentId, scope, branch);\n\t\tconst queue = this.queues.get(queueKey);\n\t\tif (queue) {\n\t\t\tfor (const job of queue) {\n\t\t\t\tthis.jobIdToQueueKey.delete(job.id);\n\t\t\t\tthis.jobIndex.delete(job.id);\n\t\t\t}\n\t\t\tthis.queues.delete(queueKey);\n\t\t}\n\t\treturn Promise.resolve();\n\t}\n\tclearAll() {\n\t\tthis.jobIdToQueueKey.clear();\n\t\tthis.jobIndex.clear();\n\t\tthis.completedJobs.clear();\n\t\tthis.queues.clear();\n\t\treturn Promise.resolve();\n\t}\n\thasJobs() {\n\t\treturn Promise.resolve(this.queues.size > 0 && Array.from(this.queues.values()).some((q) => q.length > 0));\n\t}\n\tasync completeJob(jobId) {\n\t\tconst documentId = this.jobIdToDocId.get(jobId);\n\t\tif (documentId) this.markJobComplete(jobId, documentId);\n\t\tthis.completedJobs.add(jobId);\n\t\tthis.jobIndex.delete(jobId);\n\t\tawait this.remove(jobId);\n\t\tthis.checkDrained();\n\t}\n\tasync failJob(jobId, error) {\n\t\tconst documentId = this.jobIdToDocId.get(jobId);\n\t\tif (documentId) this.markJobComplete(jobId, documentId);\n\t\tconst job = this.jobIndex.get(jobId);\n\t\tif (job) {\n\t\t\tjob.lastError = error;\n\t\t\tif (error) job.errorHistory.push(error);\n\t\t}\n\t\tthis.jobIndex.delete(jobId);\n\t\tthis.completedJobs.add(jobId);\n\t\tawait this.remove(jobId);\n\t\tthis.eventBus.emit(ReactorEventTypes.JOB_FAILED, {\n\t\t\tjobId,\n\t\t\terror: new Error(error?.message ?? \"Job failed\"),\n\t\t\tjob\n\t\t}).catch(() => {});\n\t\tthis.checkDrained();\n\t}\n\tdeferJob(jobId) {\n\t\tconst documentId = this.jobIdToDocId.get(jobId);\n\t\tif (documentId) this.markJobComplete(jobId, documentId);\n\t\tthis.jobIndex.delete(jobId);\n\t}\n\tasync retryJob(jobId, error) {\n\t\tconst job = this.jobIndex.get(jobId);\n\t\tif (!job) return;\n\t\tjob.lastError = error;\n\t\tconst documentId = this.jobIdToDocId.get(jobId);\n\t\tif (documentId) this.markJobComplete(jobId, documentId);\n\t\tthis.jobIndex.delete(jobId);\n\t\tthis.jobIdToQueueKey.delete(jobId);\n\t\tif (error) job.errorHistory.push(error);\n\t\tconst updatedJob = {\n\t\t\t...job,\n\t\t\tretryCount: (job.retryCount || 0) + 1,\n\t\t\tlastError: error\n\t\t};\n\t\tawait this.enqueue(updatedJob);\n\t}\n\t/**\n\t* Check if the queue is drained and call the callback if it is\n\t*/\n\tcheckDrained() {\n\t\tif (this.isDrained && this.onDrainedCallback) {\n\t\t\tconst callback = this.onDrainedCallback;\n\t\t\tthis.onDrainedCallback = void 0;\n\t\t\tcallback();\n\t\t}\n\t}\n\t/**\n\t* Returns true if and only if all jobs have been resolved.\n\t*/\n\tget isDrained() {\n\t\tconst hasPendingJobs = this.queues.size > 0 && Array.from(this.queues.values()).some((q) => q.length > 0);\n\t\tconst hasExecutingJobs = this.docIdToJobId.size > 0 && Array.from(this.docIdToJobId.values()).some((set) => set.size > 0);\n\t\treturn !hasPendingJobs && !hasExecutingJobs;\n\t}\n\t/**\n\t* Blocks the queue from accepting new jobs.\n\t* @param onDrained - Optional callback to call when the queue is drained\n\t*/\n\tblock(onDrained) {\n\t\tthis.isBlocked = true;\n\t\tthis.onDrainedCallback = onDrained;\n\t\tthis.checkDrained();\n\t}\n\t/**\n\t* Unblocks the queue from accepting new jobs.\n\t*/\n\tunblock() {\n\t\tthis.isBlocked = false;\n\t\tthis.onDrainedCallback = void 0;\n\t}\n\t/**\n\t* Pauses job dequeuing. Jobs can still be enqueued but dequeueNext() will return null.\n\t*/\n\tpause() {\n\t\tthis.isPausedFlag = true;\n\t}\n\t/**\n\t* Resumes job dequeuing and emits JOB_AVAILABLE events for pending jobs to wake up executors.\n\t*/\n\tasync resume() {\n\t\tthis.isPausedFlag = false;\n\t\tfor (const [, queue] of this.queues.entries()) if (queue.length > 0) {\n\t\t\tconst job = queue[0];\n\t\t\tawait this.eventBus.emit(QueueEventTypes.JOB_AVAILABLE, {\n\t\t\t\tdocumentId: job.documentId,\n\t\t\t\tscope: job.scope,\n\t\t\t\tbranch: job.branch,\n\t\t\t\tjobId: job.id\n\t\t\t});\n\t\t}\n\t}\n\t/**\n\t* Returns whether job dequeuing is paused.\n\t*/\n\tget paused() {\n\t\treturn this.isPausedFlag;\n\t}\n\t/**\n\t* Returns all pending jobs across all queues.\n\t*/\n\tgetPendingJobs() {\n\t\tconst jobs = [];\n\t\tfor (const queue of this.queues.values()) jobs.push(...queue);\n\t\treturn jobs;\n\t}\n\t/**\n\t* Returns a map of document IDs to sets of executing job IDs.\n\t*/\n\tgetExecutingJobIds() {\n\t\treturn new Map(Array.from(this.docIdToJobId.entries()).map(([k, v]) => [k, new Set(v)]));\n\t}\n\t/**\n\t* Returns a job by ID from the job index.\n\t*/\n\tgetJob(jobId) {\n\t\treturn this.jobIndex.get(jobId);\n\t}\n};\n//#endregion\n//#region src/read-models/coordinator.ts\n/**\n* Coordinates read model synchronization by listening to operation write events\n* and updating all registered read models in parallel.\n*\n* This coordinator is responsible for:\n* - Subscribing to OPERATION_WRITTEN events from the event bus\n* - Distributing operation updates to all registered read models\n* - Managing the lifecycle of read model subscriptions\n*\n* Read models are updated asynchronously and in parallel to avoid blocking\n* the write path. Errors in read model updates are propagated through the\n* event bus but do not affect the write operation success.\n*/\nvar ReadModelCoordinator = class {\n\tunsubscribe;\n\tisRunning = false;\n\treadModels;\n\tconstructor(eventBus, preReady, postReady) {\n\t\tthis.eventBus = eventBus;\n\t\tthis.preReady = preReady;\n\t\tthis.postReady = postReady;\n\t\tthis.readModels = [...preReady, ...postReady];\n\t}\n\t/**\n\t* Start listening for operation events and updating read models.\n\t* Can be called multiple times safely (subsequent calls are no-ops).\n\t*/\n\tstart() {\n\t\tif (this.isRunning) return;\n\t\tthis.unsubscribe = this.eventBus.subscribe(ReactorEventTypes.JOB_WRITE_READY, async (type, event) => {\n\t\t\tawait this.handleWriteReady(event);\n\t\t});\n\t\tthis.isRunning = true;\n\t}\n\t/**\n\t* Stop listening and clean up subscriptions.\n\t* Can be called multiple times safely (subsequent calls are no-ops).\n\t*/\n\tstop() {\n\t\tif (!this.isRunning) return;\n\t\tif (this.unsubscribe) {\n\t\t\tthis.unsubscribe();\n\t\t\tthis.unsubscribe = void 0;\n\t\t}\n\t\tthis.isRunning = false;\n\t}\n\t/**\n\t* Handle write ready events by updating all read models in parallel.\n\t* Errors from individual read models are collected and re-thrown as an aggregate.\n\t*/\n\tasync handleWriteReady(event) {\n\t\tawait Promise.all(this.preReady.map((readModel) => readModel.indexOperations(event.operations)));\n\t\tconst readyEvent = {\n\t\t\tjobId: event.jobId,\n\t\t\toperations: event.operations\n\t\t};\n\t\tawait this.eventBus.emit(ReactorEventTypes.JOB_READ_READY, readyEvent);\n\t\tawait Promise.all(this.postReady.map((readModel) => readModel.indexOperations(event.operations)));\n\t}\n};\n//#endregion\n//#region src/read-models/document-view.ts\nvar KyselyDocumentView = class extends BaseReadModel {\n\t_db;\n\tconstructor(db, operationStore, operationIndex, writeCache, consistencyTracker) {\n\t\tsuper(db, operationIndex, writeCache, consistencyTracker, {\n\t\t\treadModelId: \"document-view\",\n\t\t\trebuildStateOnInit: true\n\t\t});\n\t\tthis.operationStore = operationStore;\n\t\tthis._db = db;\n\t}\n\tasync commitOperations(items) {\n\t\tawait this._db.transaction().execute(async (trx) => {\n\t\t\tfor (const item of items) {\n\t\t\t\tconst { operation, context } = item;\n\t\t\t\tconst { documentId, scope, branch, documentType, resultingState } = context;\n\t\t\t\tconst { index, hash } = operation;\n\t\t\t\tif (!resultingState) throw new Error(`Missing resultingState in context for operation ${operation.id || \"unknown\"}. IDocumentView requires resultingState from upstream - it does not rebuild documents.`);\n\t\t\t\tlet fullState = {};\n\t\t\t\ttry {\n\t\t\t\t\tfullState = JSON.parse(resultingState);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow new Error(`Failed to parse resultingState for operation ${operation.id || \"unknown\"}: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t\t}\n\t\t\t\tconst operationType = operation.action.type;\n\t\t\t\tif (operationType === \"DELETE_DOCUMENT\") {\n\t\t\t\t\tconst now = /* @__PURE__ */ new Date();\n\t\t\t\t\tawait trx.updateTable(\"DocumentSnapshot\").set({\n\t\t\t\t\t\tisDeleted: true,\n\t\t\t\t\t\tdeletedAt: now,\n\t\t\t\t\t\tlastOperationIndex: index,\n\t\t\t\t\t\tlastOperationHash: hash,\n\t\t\t\t\t\tlastUpdatedAt: now\n\t\t\t\t\t}).where(\"documentId\", \"=\", documentId).where(\"branch\", \"=\", branch).execute();\n\t\t\t\t\tawait trx.deleteFrom(\"SlugMapping\").where(\"documentId\", \"=\", documentId).where(\"branch\", \"=\", branch).execute();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tlet scopesToIndex;\n\t\t\t\tif (operationType === \"CREATE_DOCUMENT\") scopesToIndex = Object.entries(fullState).filter(([key]) => key === \"header\" || key === \"document\" || key === \"auth\");\n\t\t\t\telse if (operationType === \"UPGRADE_DOCUMENT\") {\n\t\t\t\t\tconst scopeStatesToIndex = [];\n\t\t\t\t\tfor (const [scopeName, scopeState] of Object.entries(fullState)) {\n\t\t\t\t\t\tif (scopeName === \"header\") {\n\t\t\t\t\t\t\tscopeStatesToIndex.push([scopeName, scopeState]);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (scopeName === scope) {\n\t\t\t\t\t\t\tscopeStatesToIndex.push([scopeName, scopeState]);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!await trx.selectFrom(\"DocumentSnapshot\").select(\"scope\").where(\"documentId\", \"=\", documentId).where(\"scope\", \"=\", scopeName).where(\"branch\", \"=\", branch).executeTakeFirst()) scopeStatesToIndex.push([scopeName, scopeState]);\n\t\t\t\t\t}\n\t\t\t\t\tscopesToIndex = scopeStatesToIndex;\n\t\t\t\t} else {\n\t\t\t\t\tscopesToIndex = [];\n\t\t\t\t\tif (fullState.header !== void 0) scopesToIndex.push([\"header\", fullState.header]);\n\t\t\t\t\tif (fullState[scope] !== void 0) scopesToIndex.push([scope, fullState[scope]]);\n\t\t\t\t\telse scopesToIndex.push([scope, {}]);\n\t\t\t\t}\n\t\t\t\tfor (const [scopeName, scopeState] of scopesToIndex) {\n\t\t\t\t\tconst existingSnapshot = await trx.selectFrom(\"DocumentSnapshot\").selectAll().where(\"documentId\", \"=\", documentId).where(\"scope\", \"=\", scopeName).where(\"branch\", \"=\", branch).executeTakeFirst();\n\t\t\t\t\tconst newState = typeof scopeState === \"object\" && scopeState !== null ? scopeState : {};\n\t\t\t\t\tlet slug = existingSnapshot?.slug ?? null;\n\t\t\t\t\tlet name = existingSnapshot?.name ?? null;\n\t\t\t\t\tif (scopeName === \"header\") {\n\t\t\t\t\t\tconst headerSlug = newState.slug;\n\t\t\t\t\t\tconst headerName = newState.name;\n\t\t\t\t\t\tif (typeof headerSlug === \"string\") slug = headerSlug;\n\t\t\t\t\t\tif (typeof headerName === \"string\") name = headerName;\n\t\t\t\t\t\tif (slug && slug !== documentId) await trx.insertInto(\"SlugMapping\").values({\n\t\t\t\t\t\t\tslug,\n\t\t\t\t\t\t\tdocumentId,\n\t\t\t\t\t\t\tscope: scopeName,\n\t\t\t\t\t\t\tbranch\n\t\t\t\t\t\t}).onConflict((oc) => oc.column(\"slug\").doUpdateSet({\n\t\t\t\t\t\t\tdocumentId,\n\t\t\t\t\t\t\tscope: scopeName,\n\t\t\t\t\t\t\tbranch\n\t\t\t\t\t\t})).execute();\n\t\t\t\t\t}\n\t\t\t\t\tif (existingSnapshot) await trx.updateTable(\"DocumentSnapshot\").set({\n\t\t\t\t\t\tlastOperationIndex: index,\n\t\t\t\t\t\tlastOperationHash: hash,\n\t\t\t\t\t\tlastUpdatedAt: /* @__PURE__ */ new Date(),\n\t\t\t\t\t\tsnapshotVersion: existingSnapshot.snapshotVersion + 1,\n\t\t\t\t\t\tcontent: newState,\n\t\t\t\t\t\tslug,\n\t\t\t\t\t\tname\n\t\t\t\t\t}).where(\"documentId\", \"=\", documentId).where(\"scope\", \"=\", scopeName).where(\"branch\", \"=\", branch).execute();\n\t\t\t\t\telse {\n\t\t\t\t\t\tconst snapshot = {\n\t\t\t\t\t\t\tid: v4(),\n\t\t\t\t\t\t\tdocumentId,\n\t\t\t\t\t\t\tslug,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tscope: scopeName,\n\t\t\t\t\t\t\tbranch,\n\t\t\t\t\t\t\tcontent: newState,\n\t\t\t\t\t\t\tdocumentType,\n\t\t\t\t\t\t\tlastOperationIndex: index,\n\t\t\t\t\t\t\tlastOperationHash: hash,\n\t\t\t\t\t\t\tidentifiers: null,\n\t\t\t\t\t\t\tmetadata: null,\n\t\t\t\t\t\t\tdeletedAt: null\n\t\t\t\t\t\t};\n\t\t\t\t\t\tawait trx.insertInto(\"DocumentSnapshot\").values(snapshot).execute();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tasync exists(documentIds, consistencyToken, signal) {\n\t\tif (consistencyToken) await this.waitForConsistency(consistencyToken, void 0, signal);\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tif (documentIds.length === 0) return [];\n\t\tconst snapshots = await this._db.selectFrom(\"DocumentSnapshot\").select([\"documentId\"]).where(\"documentId\", \"in\", documentIds).where(\"isDeleted\", \"=\", false).distinct().execute();\n\t\tconst existingIds = new Set(snapshots.map((s) => s.documentId));\n\t\treturn documentIds.map((id) => existingIds.has(id));\n\t}\n\tasync get(documentId, view, consistencyToken, signal) {\n\t\tif (consistencyToken) await this.waitForConsistency(consistencyToken, void 0, signal);\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst branch = view?.branch || \"main\";\n\t\tlet scopesToQuery;\n\t\tif (view?.scopes && view.scopes.length > 0) scopesToQuery = [...new Set([\n\t\t\t\"header\",\n\t\t\t\"document\",\n\t\t\t...view.scopes\n\t\t])];\n\t\telse scopesToQuery = [];\n\t\tlet query = this._db.selectFrom(\"DocumentSnapshot\").selectAll().where(\"documentId\", \"=\", documentId).where(\"branch\", \"=\", branch).where(\"isDeleted\", \"=\", false);\n\t\tif (scopesToQuery.length > 0) query = query.where(\"scope\", \"in\", scopesToQuery);\n\t\tconst snapshots = await query.execute();\n\t\tif (snapshots.length === 0) throw new Error(`Document not found: ${documentId}`);\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst headerSnapshot = snapshots.find((s) => s.scope === \"header\");\n\t\tif (!headerSnapshot) throw new Error(`Document header not found: ${documentId}`);\n\t\tconst header = headerSnapshot.content;\n\t\tconst revisions = await this.operationStore.getRevisions(documentId, branch, signal);\n\t\theader.revision = revisions.revision;\n\t\theader.lastModifiedAtUtcIso = revisions.latestTimestamp;\n\t\tconst state = {};\n\t\tfor (const snapshot of snapshots) {\n\t\t\tif (snapshot.scope === \"header\") continue;\n\t\t\tstate[snapshot.scope] = snapshot.content;\n\t\t}\n\t\treturn {\n\t\t\theader,\n\t\t\tstate,\n\t\t\toperations: {},\n\t\t\tinitialState: state,\n\t\t\tclipboard: []\n\t\t};\n\t}\n\tasync getMany(documentIds, view, consistencyToken, signal) {\n\t\tif (documentIds.length === 0) return [];\n\t\tif (consistencyToken) await this.waitForConsistency(consistencyToken, void 0, signal);\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst branch = view?.branch || \"main\";\n\t\tlet scopesToQuery;\n\t\tif (view?.scopes && view.scopes.length > 0) scopesToQuery = [...new Set([\n\t\t\t\"header\",\n\t\t\t\"document\",\n\t\t\t...view.scopes\n\t\t])];\n\t\telse scopesToQuery = [];\n\t\tlet query = this._db.selectFrom(\"DocumentSnapshot\").selectAll().where(\"documentId\", \"in\", documentIds).where(\"branch\", \"=\", branch).where(\"isDeleted\", \"=\", false);\n\t\tif (scopesToQuery.length > 0) query = query.where(\"scope\", \"in\", scopesToQuery);\n\t\tconst allSnapshots = await query.execute();\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst snapshotsByDocId = /* @__PURE__ */ new Map();\n\t\tfor (const snapshot of allSnapshots) {\n\t\t\tconst existing = snapshotsByDocId.get(snapshot.documentId) || [];\n\t\t\texisting.push(snapshot);\n\t\t\tsnapshotsByDocId.set(snapshot.documentId, existing);\n\t\t}\n\t\tconst foundDocumentIds = [...snapshotsByDocId.keys()];\n\t\tconst revisionResults = await Promise.all(foundDocumentIds.map((docId) => this.operationStore.getRevisions(docId, branch, signal)));\n\t\tconst revisionsByDocId = /* @__PURE__ */ new Map();\n\t\tfor (let i = 0; i < foundDocumentIds.length; i++) revisionsByDocId.set(foundDocumentIds[i], revisionResults[i]);\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst documents = [];\n\t\tfor (const documentId of documentIds) {\n\t\t\tconst snapshots = snapshotsByDocId.get(documentId);\n\t\t\tif (!snapshots || snapshots.length === 0) continue;\n\t\t\tconst headerSnapshot = snapshots.find((s) => s.scope === \"header\");\n\t\t\tif (!headerSnapshot) continue;\n\t\t\tconst header = headerSnapshot.content;\n\t\t\tconst revisions = revisionsByDocId.get(documentId);\n\t\t\tif (revisions) {\n\t\t\t\theader.revision = revisions.revision;\n\t\t\t\theader.lastModifiedAtUtcIso = revisions.latestTimestamp;\n\t\t\t}\n\t\t\tconst state = {};\n\t\t\tfor (const snapshot of snapshots) {\n\t\t\t\tif (snapshot.scope === \"header\") continue;\n\t\t\t\tstate[snapshot.scope] = snapshot.content;\n\t\t\t}\n\t\t\tconst document = {\n\t\t\t\theader,\n\t\t\t\tstate,\n\t\t\t\toperations: {},\n\t\t\t\tinitialState: state,\n\t\t\t\tclipboard: []\n\t\t\t};\n\t\t\tdocuments.push(document);\n\t\t}\n\t\treturn documents;\n\t}\n\tasync getByIdOrSlug(identifier, view, consistencyToken, signal) {\n\t\tconst documentId = await this.resolveIdOrSlug(identifier, view, consistencyToken, signal);\n\t\treturn this.get(documentId, view, void 0, signal);\n\t}\n\tasync findByType(type, view, paging, consistencyToken, signal) {\n\t\tif (consistencyToken) await this.waitForConsistency(consistencyToken, void 0, signal);\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst branch = view?.branch || \"main\";\n\t\tconst startIndex = paging?.cursor ? parseInt(paging.cursor) : 0;\n\t\tconst limit = paging?.limit || 100;\n\t\tconst documents = [];\n\t\tconst processedDocumentIds = /* @__PURE__ */ new Set();\n\t\tconst allDocumentIds = [];\n\t\tconst snapshots = await this._db.selectFrom(\"DocumentSnapshot\").selectAll().where(\"documentType\", \"=\", type).where(\"branch\", \"=\", branch).where(\"isDeleted\", \"=\", false).orderBy(\"lastUpdatedAt\", \"desc\").execute();\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tfor (const snapshot of snapshots) {\n\t\t\tif (processedDocumentIds.has(snapshot.documentId)) continue;\n\t\t\tprocessedDocumentIds.add(snapshot.documentId);\n\t\t\tallDocumentIds.push(snapshot.documentId);\n\t\t}\n\t\tconst docsToFetch = allDocumentIds.slice(startIndex, startIndex + limit);\n\t\tfor (const documentId of docsToFetch) {\n\t\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\t\ttry {\n\t\t\t\tconst document = await this.get(documentId, view, void 0, signal);\n\t\t\t\tdocuments.push(document);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tconst hasMore = allDocumentIds.length > startIndex + limit;\n\t\tconst nextCursor = hasMore ? String(startIndex + limit) : void 0;\n\t\treturn {\n\t\t\tresults: documents,\n\t\t\toptions: paging || {\n\t\t\t\tcursor: \"0\",\n\t\t\t\tlimit: 100\n\t\t\t},\n\t\t\tnextCursor,\n\t\t\ttotalCount: allDocumentIds.length,\n\t\t\tnext: hasMore ? () => this.findByType(type, view, {\n\t\t\t\tcursor: nextCursor,\n\t\t\t\tlimit\n\t\t\t}, consistencyToken, signal) : void 0\n\t\t};\n\t}\n\tasync resolveSlug(slug, view, consistencyToken, signal) {\n\t\tif (consistencyToken) await this.waitForConsistency(consistencyToken, void 0, signal);\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst branch = view?.branch || \"main\";\n\t\tconst mapping = await this._db.selectFrom(\"SlugMapping\").select(\"documentId\").where(\"slug\", \"=\", slug).where(\"branch\", \"=\", branch).executeTakeFirst();\n\t\tif (!mapping) return;\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tif (view?.scopes && view.scopes.length > 0) {\n\t\t\tif (!await this._db.selectFrom(\"DocumentSnapshot\").select(\"scope\").where(\"documentId\", \"=\", mapping.documentId).where(\"branch\", \"=\", branch).where(\"scope\", \"in\", view.scopes).where(\"isDeleted\", \"=\", false).executeTakeFirst()) return;\n\t\t}\n\t\treturn mapping.documentId;\n\t}\n\tasync resolveSlugs(slugs, view, consistencyToken, signal) {\n\t\treturn (await Promise.all(slugs.map((slug) => this.resolveSlug(slug, view, consistencyToken, signal)))).filter((id) => id !== void 0);\n\t}\n\tasync resolveIdOrSlug(identifier, view, consistencyToken, signal) {\n\t\tif (consistencyToken) await this.waitForConsistency(consistencyToken, void 0, signal);\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst branch = view?.branch || \"main\";\n\t\tconst idCheckPromise = this._db.selectFrom(\"DocumentSnapshot\").select(\"documentId\").where(\"documentId\", \"=\", identifier).where(\"branch\", \"=\", branch).where(\"isDeleted\", \"=\", false).executeTakeFirst();\n\t\tconst slugCheckPromise = this._db.selectFrom(\"SlugMapping\").select(\"documentId\").where(\"slug\", \"=\", identifier).where(\"branch\", \"=\", branch).executeTakeFirst();\n\t\tconst [idMatch, slugMatch] = await Promise.all([idCheckPromise, slugCheckPromise]);\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst idMatchDocId = idMatch?.documentId;\n\t\tconst slugMatchDocId = slugMatch?.documentId;\n\t\tif (idMatchDocId && slugMatchDocId && idMatchDocId !== slugMatchDocId) throw new Error(`Ambiguous identifier \"${identifier}\": matches both document ID \"${idMatchDocId}\" and slug for document ID \"${slugMatchDocId}\". Please use get() for ID or resolveSlug() + get() for slug to be explicit.`);\n\t\tconst resolvedDocumentId = idMatchDocId || slugMatchDocId;\n\t\tif (!resolvedDocumentId) throw new Error(`Document not found: ${identifier}`);\n\t\treturn resolvedDocumentId;\n\t}\n};\n//#endregion\n//#region src/registry/document-model-resolver.ts\n/**\n* Encapsulates the logic for resolving document model modules on demand.\n* Shared between the queue (CREATE_DOCUMENT gate) and the executor manager\n* (post-failure recovery) so that both paths use the same deduplication\n* and failure-caching state.\n*/\nvar DocumentModelResolver = class {\n\tloadingModels = /* @__PURE__ */ new Map();\n\tfailedModelTypes = /* @__PURE__ */ new Set();\n\tconstructor(registry, loader) {\n\t\tthis.registry = registry;\n\t\tthis.loader = loader;\n\t}\n\tasync ensureModelLoaded(documentType) {\n\t\ttry {\n\t\t\tthis.registry.getModule(documentType);\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tif (!ModuleNotFoundError.isError(error)) throw error;\n\t\t}\n\t\tif (this.failedModelTypes.has(documentType)) throw new Error(`Document model type previously failed to load: ${documentType}`);\n\t\tconst existing = this.loadingModels.get(documentType);\n\t\tif (existing) return existing;\n\t\tconst loadPromise = (async () => {\n\t\t\ttry {\n\t\t\t\tconst module = await this.loader.load(documentType);\n\t\t\t\tconst [result] = this.registry.registerModules(module);\n\t\t\t\tif (result.status === \"error\" && !DuplicateModuleError.isError(result.error)) throw result.error;\n\t\t\t} catch (error) {\n\t\t\t\tthis.failedModelTypes.add(documentType);\n\t\t\t\tthrow error;\n\t\t\t} finally {\n\t\t\t\tthis.loadingModels.delete(documentType);\n\t\t\t}\n\t\t})();\n\t\tthis.loadingModels.set(documentType, loadPromise);\n\t\treturn loadPromise;\n\t}\n};\n/**\n* No-op resolver used when no document model loader is configured.\n* Checks the registry for the model and returns if found; throws if not.\n* Since there is no loader, missing models cannot be recovered.\n*/\nvar NullDocumentModelResolver = class {\n\tconstructor(registry) {\n\t\tthis.registry = registry;\n\t}\n\tensureModelLoaded(documentType) {\n\t\tif (this.registry) try {\n\t\t\tthis.registry.getModule(documentType);\n\t\t\treturn Promise.resolve();\n\t\t} catch {}\n\t\treturn Promise.reject(new ModuleNotFoundError(documentType));\n\t}\n};\n//#endregion\n//#region src/shared/consistency-tracker.ts\n/**\n* Creates a consistency key from documentId, scope, and branch.\n*/\nfunction makeConsistencyKey(documentId, scope, branch) {\n\treturn `${documentId}:${scope}:${branch}`;\n}\n/**\n* Tracks operation indexes for documents and provides read-after-write consistency guarantees.\n* Maintains an in-memory map of the latest operation index for each (documentId, scope, branch) tuple.\n*/\nvar ConsistencyTracker = class {\n\tstate = /* @__PURE__ */ new Map();\n\twaiters = [];\n\tupdate(coordinates) {\n\t\tconst deduplicated = this.deduplicateCoordinates(coordinates);\n\t\tfor (let i = 0; i < deduplicated.length; i++) {\n\t\t\tconst coord = deduplicated[i];\n\t\t\tconst key = makeConsistencyKey(coord.documentId, coord.scope, coord.branch);\n\t\t\tconst current = this.state.get(key);\n\t\t\tif (current === void 0 || coord.operationIndex > current) this.state.set(key, coord.operationIndex);\n\t\t}\n\t\tthis.checkWaiters();\n\t}\n\tgetLatest(key) {\n\t\treturn this.state.get(key);\n\t}\n\twaitFor(coordinates, timeoutMs, signal) {\n\t\tif (signal?.aborted) return Promise.reject(/* @__PURE__ */ new Error(\"Operation aborted\"));\n\t\tif (this.areCoordinatesSatisfied(coordinates)) return Promise.resolve();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst waiter = {\n\t\t\t\tcoordinates,\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t\tsignal\n\t\t\t};\n\t\t\tif (timeoutMs !== void 0) waiter.timeoutId = setTimeout(() => {\n\t\t\t\tthis.removeWaiter(waiter);\n\t\t\t\treject(/* @__PURE__ */ new Error(`Consistency wait timed out after ${timeoutMs}ms`));\n\t\t\t}, timeoutMs);\n\t\t\tif (signal) {\n\t\t\t\tconst abortHandler = () => {\n\t\t\t\t\tthis.removeWaiter(waiter);\n\t\t\t\t\treject(/* @__PURE__ */ new Error(\"Operation aborted\"));\n\t\t\t\t};\n\t\t\t\tsignal.addEventListener(\"abort\", abortHandler, { once: true });\n\t\t\t}\n\t\t\tthis.waiters.push(waiter);\n\t\t});\n\t}\n\tserialize() {\n\t\treturn Array.from(this.state.entries());\n\t}\n\thydrate(entries) {\n\t\tthis.state.clear();\n\t\tfor (const [key, index] of entries) this.state.set(key, index);\n\t}\n\tdeduplicateCoordinates(coordinates) {\n\t\tconst map = /* @__PURE__ */ new Map();\n\t\tfor (let i = 0; i < coordinates.length; i++) {\n\t\t\tconst coord = coordinates[i];\n\t\t\tconst key = makeConsistencyKey(coord.documentId, coord.scope, coord.branch);\n\t\t\tconst existing = map.get(key);\n\t\t\tif (!existing || coord.operationIndex > existing.operationIndex) map.set(key, coord);\n\t\t}\n\t\treturn Array.from(map.values());\n\t}\n\tareCoordinatesSatisfied(coordinates) {\n\t\tfor (let i = 0; i < coordinates.length; i++) {\n\t\t\tconst coord = coordinates[i];\n\t\t\tconst key = makeConsistencyKey(coord.documentId, coord.scope, coord.branch);\n\t\t\tconst latest = this.state.get(key);\n\t\t\tif (latest === void 0 || latest < coord.operationIndex) return false;\n\t\t}\n\t\treturn true;\n\t}\n\tcheckWaiters() {\n\t\tconst satisfiedWaiters = [];\n\t\tconst unsatisfiedWaiters = [];\n\t\tfor (const waiter of this.waiters) {\n\t\t\tif (waiter.signal?.aborted) continue;\n\t\t\tif (this.areCoordinatesSatisfied(waiter.coordinates)) satisfiedWaiters.push(waiter);\n\t\t\telse unsatisfiedWaiters.push(waiter);\n\t\t}\n\t\tthis.waiters = unsatisfiedWaiters;\n\t\tfor (const waiter of satisfiedWaiters) {\n\t\t\tif (waiter.timeoutId !== void 0) clearTimeout(waiter.timeoutId);\n\t\t\twaiter.resolve();\n\t\t}\n\t}\n\tremoveWaiter(waiter) {\n\t\tconst index = this.waiters.indexOf(waiter);\n\t\tif (index !== -1) this.waiters.splice(index, 1);\n\t\tif (waiter.timeoutId !== void 0) clearTimeout(waiter.timeoutId);\n\t}\n};\n//#endregion\n//#region src/shared/collect-all-pages.ts\n/**\n* Collects all results from a paged result set by following the next() function\n* until all pages have been fetched.\n*/\nasync function collectAllPages(firstPage, signal) {\n\tconst allResults = [...firstPage.results];\n\tlet currentPage = firstPage;\n\twhile (currentPage.next) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tcurrentPage = await currentPage.next();\n\t\tallResults.push(...currentPage.results);\n\t}\n\treturn allResults;\n}\n//#endregion\n//#region src/storage/kysely/document-indexer.ts\nvar KyselyDocumentIndexer = class extends BaseReadModel {\n\t_db;\n\tconstructor(db, operationIndex, writeCache, consistencyTracker) {\n\t\tsuper(db, operationIndex, writeCache, consistencyTracker, {\n\t\t\treadModelId: \"document-indexer\",\n\t\t\trebuildStateOnInit: false\n\t\t});\n\t\tthis._db = db;\n\t}\n\tasync commitOperations(items) {\n\t\tawait this._db.transaction().execute(async (trx) => {\n\t\t\tfor (const item of items) {\n\t\t\t\tconst { operation } = item;\n\t\t\t\tconst actionType = operation.action.type;\n\t\t\t\tif (actionType === \"ADD_RELATIONSHIP\") await this.handleAddRelationship(trx, operation);\n\t\t\t\telse if (actionType === \"REMOVE_RELATIONSHIP\") await this.handleRemoveRelationship(trx, operation);\n\t\t\t}\n\t\t});\n\t}\n\tasync getOutgoing(documentId, types, paging, consistencyToken, signal) {\n\t\tif (consistencyToken) await this.waitForConsistency(consistencyToken, void 0, signal);\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst startIndex = paging?.cursor ? parseInt(paging.cursor) : 0;\n\t\tconst limit = paging?.limit || 100;\n\t\tlet query = this._db.selectFrom(\"DocumentRelationship\").selectAll().where(\"sourceId\", \"=\", documentId);\n\t\tif (types && types.length > 0) query = query.where(\"relationshipType\", \"in\", types);\n\t\tconst rows = await query.orderBy(\"createdAt\", \"asc\").orderBy(\"id\", \"asc\").offset(startIndex).limit(limit + 1).execute();\n\t\tconst hasMore = rows.length > limit;\n\t\tconst results = hasMore ? rows.slice(0, limit) : rows;\n\t\tconst nextCursor = hasMore ? String(startIndex + limit) : void 0;\n\t\treturn {\n\t\t\tresults: results.map((row) => ({\n\t\t\t\tsourceId: row.sourceId,\n\t\t\t\ttargetId: row.targetId,\n\t\t\t\trelationshipType: row.relationshipType,\n\t\t\t\tmetadata: row.metadata ? row.metadata : void 0,\n\t\t\t\tcreatedAt: row.createdAt,\n\t\t\t\tupdatedAt: row.updatedAt\n\t\t\t})),\n\t\t\toptions: paging || {\n\t\t\t\tcursor: \"0\",\n\t\t\t\tlimit: 100\n\t\t\t},\n\t\t\tnextCursor,\n\t\t\tnext: hasMore ? () => this.getOutgoing(documentId, types, {\n\t\t\t\tcursor: nextCursor,\n\t\t\t\tlimit\n\t\t\t}, consistencyToken, signal) : void 0\n\t\t};\n\t}\n\tasync getIncoming(documentId, types, paging, consistencyToken, signal) {\n\t\tif (consistencyToken) await this.waitForConsistency(consistencyToken, void 0, signal);\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst startIndex = paging?.cursor ? parseInt(paging.cursor) : 0;\n\t\tconst limit = paging?.limit || 100;\n\t\tlet query = this._db.selectFrom(\"DocumentRelationship\").selectAll().where(\"targetId\", \"=\", documentId);\n\t\tif (types && types.length > 0) query = query.where(\"relationshipType\", \"in\", types);\n\t\tconst rows = await query.orderBy(\"createdAt\", \"asc\").orderBy(\"id\", \"asc\").offset(startIndex).limit(limit + 1).execute();\n\t\tconst hasMore = rows.length > limit;\n\t\tconst results = hasMore ? rows.slice(0, limit) : rows;\n\t\tconst nextCursor = hasMore ? String(startIndex + limit) : void 0;\n\t\treturn {\n\t\t\tresults: results.map((row) => ({\n\t\t\t\tsourceId: row.sourceId,\n\t\t\t\ttargetId: row.targetId,\n\t\t\t\trelationshipType: row.relationshipType,\n\t\t\t\tmetadata: row.metadata ? row.metadata : void 0,\n\t\t\t\tcreatedAt: row.createdAt,\n\t\t\t\tupdatedAt: row.updatedAt\n\t\t\t})),\n\t\t\toptions: paging || {\n\t\t\t\tcursor: \"0\",\n\t\t\t\tlimit: 100\n\t\t\t},\n\t\t\tnextCursor,\n\t\t\tnext: hasMore ? () => this.getIncoming(documentId, types, {\n\t\t\t\tcursor: nextCursor,\n\t\t\t\tlimit\n\t\t\t}, consistencyToken, signal) : void 0\n\t\t};\n\t}\n\tasync getOrphanedChildren(parentIds, types, signal) {\n\t\tif (parentIds.length === 0) return [];\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tlet query = this._db.selectFrom(\"DocumentRelationship as r\").select(\"r.targetId\").distinct().where(\"r.sourceId\", \"in\", parentIds).where((eb) => eb.not(eb.exists(eb.selectFrom(\"DocumentRelationship as other\").select(\"other.id\").whereRef(\"other.targetId\", \"=\", \"r.targetId\").where(\"other.sourceId\", \"not in\", parentIds))));\n\t\tif (types && types.length > 0) query = query.where(\"r.relationshipType\", \"in\", types);\n\t\treturn (await query.execute()).map((row) => row.targetId);\n\t}\n\tasync hasRelationship(sourceId, targetId, types, consistencyToken, signal) {\n\t\tif (consistencyToken) await this.waitForConsistency(consistencyToken, void 0, signal);\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tlet query = this._db.selectFrom(\"DocumentRelationship\").select(\"id\").where(\"sourceId\", \"=\", sourceId).where(\"targetId\", \"=\", targetId);\n\t\tif (types && types.length > 0) query = query.where(\"relationshipType\", \"in\", types);\n\t\treturn await query.executeTakeFirst() !== void 0;\n\t}\n\tasync getUndirectedRelationships(a, b, types, paging, consistencyToken, signal) {\n\t\tif (consistencyToken) await this.waitForConsistency(consistencyToken, void 0, signal);\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst startIndex = paging?.cursor ? parseInt(paging.cursor) : 0;\n\t\tconst limit = paging?.limit || 100;\n\t\tlet query = this._db.selectFrom(\"DocumentRelationship\").selectAll().where((eb) => eb.or([eb.and([eb(\"sourceId\", \"=\", a), eb(\"targetId\", \"=\", b)]), eb.and([eb(\"sourceId\", \"=\", b), eb(\"targetId\", \"=\", a)])]));\n\t\tif (types && types.length > 0) query = query.where(\"relationshipType\", \"in\", types);\n\t\tconst rows = await query.orderBy(\"createdAt\", \"asc\").orderBy(\"id\", \"asc\").offset(startIndex).limit(limit + 1).execute();\n\t\tconst hasMore = rows.length > limit;\n\t\tconst results = hasMore ? rows.slice(0, limit) : rows;\n\t\tconst nextCursor = hasMore ? String(startIndex + limit) : void 0;\n\t\treturn {\n\t\t\tresults: results.map((row) => ({\n\t\t\t\tsourceId: row.sourceId,\n\t\t\t\ttargetId: row.targetId,\n\t\t\t\trelationshipType: row.relationshipType,\n\t\t\t\tmetadata: row.metadata ? row.metadata : void 0,\n\t\t\t\tcreatedAt: row.createdAt,\n\t\t\t\tupdatedAt: row.updatedAt\n\t\t\t})),\n\t\t\toptions: paging || {\n\t\t\t\tcursor: \"0\",\n\t\t\t\tlimit: 100\n\t\t\t},\n\t\t\tnextCursor,\n\t\t\tnext: hasMore ? () => this.getUndirectedRelationships(a, b, types, {\n\t\t\t\tcursor: nextCursor,\n\t\t\t\tlimit\n\t\t\t}, consistencyToken, signal) : void 0\n\t\t};\n\t}\n\tasync getDirectedRelationships(sourceId, targetId, types, paging, consistencyToken, signal) {\n\t\tif (consistencyToken) await this.waitForConsistency(consistencyToken, void 0, signal);\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst startIndex = paging?.cursor ? parseInt(paging.cursor) : 0;\n\t\tconst limit = paging?.limit || 100;\n\t\tlet query = this._db.selectFrom(\"DocumentRelationship\").selectAll().where(\"sourceId\", \"=\", sourceId).where(\"targetId\", \"=\", targetId);\n\t\tif (types && types.length > 0) query = query.where(\"relationshipType\", \"in\", types);\n\t\tconst rows = await query.orderBy(\"createdAt\", \"asc\").orderBy(\"id\", \"asc\").offset(startIndex).limit(limit + 1).execute();\n\t\tconst hasMore = rows.length > limit;\n\t\tconst results = hasMore ? rows.slice(0, limit) : rows;\n\t\tconst nextCursor = hasMore ? String(startIndex + limit) : void 0;\n\t\treturn {\n\t\t\tresults: results.map((row) => ({\n\t\t\t\tsourceId: row.sourceId,\n\t\t\t\ttargetId: row.targetId,\n\t\t\t\trelationshipType: row.relationshipType,\n\t\t\t\tmetadata: row.metadata ? row.metadata : void 0,\n\t\t\t\tcreatedAt: row.createdAt,\n\t\t\t\tupdatedAt: row.updatedAt\n\t\t\t})),\n\t\t\toptions: paging || {\n\t\t\t\tcursor: \"0\",\n\t\t\t\tlimit: 100\n\t\t\t},\n\t\t\tnextCursor,\n\t\t\tnext: hasMore ? () => this.getDirectedRelationships(sourceId, targetId, types, {\n\t\t\t\tcursor: nextCursor,\n\t\t\t\tlimit\n\t\t\t}, consistencyToken, signal) : void 0\n\t\t};\n\t}\n\tasync findPath(sourceId, targetId, types, consistencyToken, signal) {\n\t\tif (consistencyToken) await this.waitForConsistency(consistencyToken, void 0, signal);\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tif (sourceId === targetId) return [sourceId];\n\t\tconst visited = /* @__PURE__ */ new Set();\n\t\tconst queue = [{\n\t\t\tid: sourceId,\n\t\t\tpath: [sourceId]\n\t\t}];\n\t\twhile (queue.length > 0) {\n\t\t\tconst current = queue.shift();\n\t\t\tif (current.id === targetId) return current.path;\n\t\t\tif (visited.has(current.id)) continue;\n\t\t\tvisited.add(current.id);\n\t\t\tconst outgoingRelationships = await collectAllPages(await this.getOutgoing(current.id, types, void 0, consistencyToken, signal), signal);\n\t\t\tfor (const rel of outgoingRelationships) if (!visited.has(rel.targetId)) queue.push({\n\t\t\t\tid: rel.targetId,\n\t\t\t\tpath: [...current.path, rel.targetId]\n\t\t\t});\n\t\t}\n\t\treturn null;\n\t}\n\tasync findAncestors(documentId, types, consistencyToken, signal) {\n\t\tif (consistencyToken) await this.waitForConsistency(consistencyToken, void 0, signal);\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst nodes = new Set([documentId]);\n\t\tconst edges = [];\n\t\tconst queue = [documentId];\n\t\tconst visited = /* @__PURE__ */ new Set();\n\t\twhile (queue.length > 0) {\n\t\t\tconst currentId = queue.shift();\n\t\t\tif (visited.has(currentId)) continue;\n\t\t\tvisited.add(currentId);\n\t\t\tconst incomingRelationships = await collectAllPages(await this.getIncoming(currentId, types, void 0, consistencyToken, signal), signal);\n\t\t\tfor (const rel of incomingRelationships) {\n\t\t\t\tnodes.add(rel.sourceId);\n\t\t\t\tedges.push({\n\t\t\t\t\tfrom: rel.sourceId,\n\t\t\t\t\tto: rel.targetId,\n\t\t\t\t\ttype: rel.relationshipType\n\t\t\t\t});\n\t\t\t\tif (!visited.has(rel.sourceId)) queue.push(rel.sourceId);\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tnodes: Array.from(nodes),\n\t\t\tedges\n\t\t};\n\t}\n\tasync getRelationshipTypes(consistencyToken, signal) {\n\t\tif (consistencyToken) await this.waitForConsistency(consistencyToken, void 0, signal);\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\treturn (await this._db.selectFrom(\"DocumentRelationship\").select(\"relationshipType\").distinct().execute()).map((row) => row.relationshipType);\n\t}\n\tasync handleAddRelationship(trx, operation) {\n\t\tconst input = operation.action.input;\n\t\tif (!await trx.selectFrom(\"Document\").select(\"id\").where(\"id\", \"=\", input.sourceId).executeTakeFirst()) await trx.insertInto(\"Document\").values({ id: input.sourceId }).execute();\n\t\tif (!await trx.selectFrom(\"Document\").select(\"id\").where(\"id\", \"=\", input.targetId).executeTakeFirst()) await trx.insertInto(\"Document\").values({ id: input.targetId }).execute();\n\t\tif (!await trx.selectFrom(\"DocumentRelationship\").select(\"id\").where(\"sourceId\", \"=\", input.sourceId).where(\"targetId\", \"=\", input.targetId).where(\"relationshipType\", \"=\", input.relationshipType).executeTakeFirst()) {\n\t\t\tconst relationship = {\n\t\t\t\tid: v4(),\n\t\t\t\tsourceId: input.sourceId,\n\t\t\t\ttargetId: input.targetId,\n\t\t\t\trelationshipType: input.relationshipType,\n\t\t\t\tmetadata: input.metadata || null\n\t\t\t};\n\t\t\tawait trx.insertInto(\"DocumentRelationship\").values(relationship).execute();\n\t\t}\n\t}\n\tasync handleRemoveRelationship(trx, operation) {\n\t\tconst input = operation.action.input;\n\t\tawait trx.deleteFrom(\"DocumentRelationship\").where(\"sourceId\", \"=\", input.sourceId).where(\"targetId\", \"=\", input.targetId).where(\"relationshipType\", \"=\", input.relationshipType).execute();\n\t}\n};\n//#endregion\n//#region src/storage/kysely/keyframe-store.ts\nvar KyselyKeyframeStore = class KyselyKeyframeStore {\n\ttrx;\n\tconstructor(db) {\n\t\tthis.db = db;\n\t}\n\tget queryExecutor() {\n\t\treturn this.trx ?? this.db;\n\t}\n\twithTransaction(trx) {\n\t\tconst instance = new KyselyKeyframeStore(this.db);\n\t\tinstance.trx = trx;\n\t\treturn instance;\n\t}\n\tasync putKeyframe(documentId, scope, branch, revision, document, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tawait this.queryExecutor.insertInto(\"Keyframe\").values({\n\t\t\tdocumentId,\n\t\t\tdocumentType: document.header.documentType,\n\t\t\tscope,\n\t\t\tbranch,\n\t\t\trevision,\n\t\t\tdocument\n\t\t}).onConflict((oc) => oc.columns([\n\t\t\t\"documentId\",\n\t\t\t\"scope\",\n\t\t\t\"branch\",\n\t\t\t\"revision\"\n\t\t]).doUpdateSet({ document })).execute();\n\t}\n\tasync findNearestKeyframe(documentId, scope, branch, targetRevision, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst row = await this.queryExecutor.selectFrom(\"Keyframe\").selectAll().where(\"documentId\", \"=\", documentId).where(\"scope\", \"=\", scope).where(\"branch\", \"=\", branch).where(\"revision\", \"<=\", targetRevision).orderBy(\"revision\", \"desc\").limit(1).executeTakeFirst();\n\t\tif (!row) return;\n\t\treturn {\n\t\t\trevision: row.revision,\n\t\t\tdocument: row.document\n\t\t};\n\t}\n\tasync listKeyframes(documentId, scope, branch, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tlet query = this.queryExecutor.selectFrom(\"Keyframe\").selectAll().where(\"documentId\", \"=\", documentId).orderBy(\"revision\", \"asc\");\n\t\tif (scope !== void 0) query = query.where(\"scope\", \"=\", scope);\n\t\tif (branch !== void 0) query = query.where(\"branch\", \"=\", branch);\n\t\treturn (await query.execute()).map((row) => ({\n\t\t\tscope: row.scope,\n\t\t\tbranch: row.branch,\n\t\t\trevision: row.revision,\n\t\t\tdocument: row.document\n\t\t}));\n\t}\n\tasync deleteKeyframes(documentId, scope, branch, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tlet query = this.queryExecutor.deleteFrom(\"Keyframe\").where(\"documentId\", \"=\", documentId);\n\t\tif (scope !== void 0 && branch !== void 0) query = query.where(\"scope\", \"=\", scope).where(\"branch\", \"=\", branch);\n\t\telse if (scope !== void 0) query = query.where(\"scope\", \"=\", scope);\n\t\tconst result = await query.executeTakeFirst();\n\t\treturn Number(result.numDeletedRows || 0n);\n\t}\n};\n//#endregion\n//#region src/storage/interfaces.ts\n/**\n* Thrown when an operation with the same identity already exists in the store.\n*/\nvar DuplicateOperationError = class extends Error {\n\tconstructor(description) {\n\t\tsuper(`Duplicate operation: ${description}`);\n\t\tthis.name = \"DuplicateOperationError\";\n\t}\n};\n/**\n* Thrown when a concurrent write conflict is detected during an atomic apply.\n*/\nvar OptimisticLockError = class extends Error {\n\tconstructor(message) {\n\t\tsuper(message);\n\t\tthis.name = \"OptimisticLockError\";\n\t}\n};\n/**\n* Thrown when the caller-provided revision does not match the current\n* stored revision, indicating a stale read.\n*/\nvar RevisionMismatchError = class extends Error {\n\tconstructor(expected, actual) {\n\t\tsuper(`Revision mismatch: expected ${expected}, got ${actual}`);\n\t\tthis.name = \"RevisionMismatchError\";\n\t}\n};\n//#endregion\n//#region src/storage/txn.ts\nvar AtomicTransaction = class {\n\toperations = [];\n\tconstructor(documentId, documentType, scope, branch, baseRevision) {\n\t\tthis.documentId = documentId;\n\t\tthis.documentType = documentType;\n\t\tthis.scope = scope;\n\t\tthis.branch = branch;\n\t\tthis.baseRevision = baseRevision;\n\t}\n\taddOperations(...operations) {\n\t\tfor (const op of operations) this.operations.push({\n\t\t\tjobId: v4(),\n\t\t\topId: op.id,\n\t\t\tprevOpId: \"\",\n\t\t\tdocumentId: this.documentId,\n\t\t\tdocumentType: this.documentType,\n\t\t\tscope: this.scope,\n\t\t\tbranch: this.branch,\n\t\t\ttimestampUtcMs: new Date(op.timestampUtcMs),\n\t\t\tindex: op.index,\n\t\t\taction: JSON.stringify(op.action),\n\t\t\tskip: op.skip,\n\t\t\terror: op.error || null,\n\t\t\thash: op.hash\n\t\t});\n\t}\n\tgetOperations() {\n\t\treturn this.operations;\n\t}\n};\n//#endregion\n//#region src/storage/kysely/store.ts\nvar KyselyOperationStore = class KyselyOperationStore {\n\ttrx;\n\tconstructor(db) {\n\t\tthis.db = db;\n\t}\n\tget queryExecutor() {\n\t\treturn this.trx ?? this.db;\n\t}\n\twithTransaction(trx) {\n\t\tconst instance = new KyselyOperationStore(this.db);\n\t\tinstance.trx = trx;\n\t\treturn instance;\n\t}\n\tasync apply(documentId, documentType, scope, branch, revision, fn, signal) {\n\t\tif (this.trx) await this.executeApply(this.trx, documentId, documentType, scope, branch, revision, fn, signal);\n\t\telse await this.db.transaction().execute(async (trx) => {\n\t\t\tawait this.executeApply(trx, documentId, documentType, scope, branch, revision, fn, signal);\n\t\t});\n\t}\n\tasync executeApply(trx, documentId, documentType, scope, branch, revision, fn, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst latestOp = await trx.selectFrom(\"Operation\").selectAll().where(\"documentId\", \"=\", documentId).where(\"scope\", \"=\", scope).where(\"branch\", \"=\", branch).orderBy(\"index\", \"desc\").limit(1).executeTakeFirst();\n\t\tconst currentRevision = latestOp ? latestOp.index : -1;\n\t\tif (currentRevision !== revision - 1) throw new RevisionMismatchError(currentRevision + 1, revision);\n\t\tconst atomicTxn = new AtomicTransaction(documentId, documentType, scope, branch, revision);\n\t\tawait fn(atomicTxn);\n\t\tconst operations = atomicTxn.getOperations();\n\t\tif (operations.length > 0) {\n\t\t\tlet prevOpId = latestOp?.opId || \"\";\n\t\t\tfor (const op of operations) {\n\t\t\t\top.prevOpId = prevOpId;\n\t\t\t\tprevOpId = op.opId;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait trx.insertInto(\"Operation\").values(operations).execute();\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof Error) {\n\t\t\t\t\tif (error.message.includes(\"unique constraint\")) {\n\t\t\t\t\t\tconst op = operations[0];\n\t\t\t\t\t\tthrow new DuplicateOperationError(`${op.opId} at index ${op.index} with skip ${op.skip}`);\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\tasync getSince(documentId, scope, branch, revision, filter, paging, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tlet query = this.queryExecutor.selectFrom(\"Operation\").selectAll().where(\"documentId\", \"=\", documentId).where(\"scope\", \"=\", scope).where(\"branch\", \"=\", branch).where(\"index\", \">\", revision).orderBy(\"index\", \"asc\");\n\t\tif (filter) {\n\t\t\tif (filter.actionTypes && filter.actionTypes.length > 0) {\n\t\t\t\tconst actionTypesArray = filter.actionTypes.map((t) => `'${t.replace(/'/g, \"''\")}'`).join(\",\");\n\t\t\t\tquery = query.where(sql`action->>'type' = ANY(ARRAY[${sql.raw(actionTypesArray)}]::text[])`);\n\t\t\t}\n\t\t\tif (filter.timestampFrom) query = query.where(\"timestampUtcMs\", \">=\", new Date(filter.timestampFrom));\n\t\t\tif (filter.timestampTo) query = query.where(\"timestampUtcMs\", \"<=\", new Date(filter.timestampTo));\n\t\t\tif (filter.sinceRevision !== void 0) query = query.where(\"index\", \">=\", filter.sinceRevision);\n\t\t}\n\t\tif (paging) {\n\t\t\tconst cursorValue = Number.parseInt(paging.cursor, 10);\n\t\t\tif (cursorValue > 0) query = query.where(\"index\", \">\", cursorValue);\n\t\t\tif (paging.limit) query = query.limit(paging.limit + 1);\n\t\t}\n\t\tconst rows = await query.execute();\n\t\tlet hasMore = false;\n\t\tlet items = rows;\n\t\tif (paging?.limit && rows.length > paging.limit) {\n\t\t\thasMore = true;\n\t\t\titems = rows.slice(0, paging.limit);\n\t\t}\n\t\tconst nextCursor = hasMore && items.length > 0 ? items[items.length - 1].index.toString() : void 0;\n\t\tconst cursor = paging?.cursor || \"0\";\n\t\tconst limit = paging?.limit || 100;\n\t\treturn {\n\t\t\tresults: items.map((row) => this.rowToOperation(row)),\n\t\t\toptions: {\n\t\t\t\tcursor,\n\t\t\t\tlimit\n\t\t\t},\n\t\t\tnextCursor,\n\t\t\tnext: hasMore ? () => this.getSince(documentId, scope, branch, revision, filter, {\n\t\t\t\tcursor: nextCursor,\n\t\t\t\tlimit\n\t\t\t}, signal) : void 0\n\t\t};\n\t}\n\tasync getSinceId(id, paging, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tlet query = this.queryExecutor.selectFrom(\"Operation\").selectAll().where(\"id\", \">\", id).orderBy(\"id\", \"asc\");\n\t\tif (paging) {\n\t\t\tconst cursorValue = Number.parseInt(paging.cursor, 10);\n\t\t\tif (cursorValue > 0) query = query.where(\"id\", \">\", cursorValue);\n\t\t\tif (paging.limit) query = query.limit(paging.limit + 1);\n\t\t}\n\t\tconst rows = await query.execute();\n\t\tlet hasMore = false;\n\t\tlet items = rows;\n\t\tif (paging?.limit && rows.length > paging.limit) {\n\t\t\thasMore = true;\n\t\t\titems = rows.slice(0, paging.limit);\n\t\t}\n\t\tconst nextCursor = hasMore && items.length > 0 ? items[items.length - 1].id.toString() : void 0;\n\t\tconst cursor = paging?.cursor || \"0\";\n\t\tconst limit = paging?.limit || 100;\n\t\treturn {\n\t\t\tresults: items.map((row) => this.rowToOperationWithContext(row)),\n\t\t\toptions: {\n\t\t\t\tcursor,\n\t\t\t\tlimit\n\t\t\t},\n\t\t\tnextCursor,\n\t\t\tnext: hasMore ? () => this.getSinceId(id, {\n\t\t\t\tcursor: nextCursor,\n\t\t\t\tlimit\n\t\t\t}, signal) : void 0\n\t\t};\n\t}\n\tasync getConflicting(documentId, scope, branch, minTimestamp, paging, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tlet query = this.queryExecutor.selectFrom(\"Operation\").selectAll().where(\"documentId\", \"=\", documentId).where(\"scope\", \"=\", scope).where(\"branch\", \"=\", branch).where(\"timestampUtcMs\", \">=\", new Date(minTimestamp)).orderBy(\"index\", \"asc\");\n\t\tif (paging) {\n\t\t\tconst cursorValue = Number.parseInt(paging.cursor, 10);\n\t\t\tif (cursorValue > 0) query = query.where(\"index\", \">\", cursorValue);\n\t\t\tif (paging.limit) query = query.limit(paging.limit + 1);\n\t\t}\n\t\tconst rows = await query.execute();\n\t\tlet hasMore = false;\n\t\tlet items = rows;\n\t\tif (paging?.limit && rows.length > paging.limit) {\n\t\t\thasMore = true;\n\t\t\titems = rows.slice(0, paging.limit);\n\t\t}\n\t\tconst nextCursor = hasMore && items.length > 0 ? items[items.length - 1].index.toString() : void 0;\n\t\tconst cursor = paging?.cursor || \"0\";\n\t\tconst limit = paging?.limit || 100;\n\t\treturn {\n\t\t\tresults: items.map((row) => this.rowToOperation(row)),\n\t\t\toptions: {\n\t\t\t\tcursor,\n\t\t\t\tlimit\n\t\t\t},\n\t\t\tnextCursor,\n\t\t\tnext: hasMore ? () => this.getConflicting(documentId, scope, branch, minTimestamp, {\n\t\t\t\tcursor: nextCursor,\n\t\t\t\tlimit\n\t\t\t}, signal) : void 0\n\t\t};\n\t}\n\tasync getRevisions(documentId, branch, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst scopeRevisions = await this.queryExecutor.selectFrom(\"Operation as o1\").select([\n\t\t\t\"o1.scope\",\n\t\t\t\"o1.index\",\n\t\t\t\"o1.timestampUtcMs\"\n\t\t]).where(\"o1.documentId\", \"=\", documentId).where(\"o1.branch\", \"=\", branch).where((eb) => eb(\"o1.index\", \"=\", eb.selectFrom(\"Operation as o2\").select((eb2) => eb2.fn.max(\"o2.index\").as(\"maxIndex\")).where(\"o2.documentId\", \"=\", eb.ref(\"o1.documentId\")).where(\"o2.branch\", \"=\", eb.ref(\"o1.branch\")).where(\"o2.scope\", \"=\", eb.ref(\"o1.scope\")))).execute();\n\t\tconst revision = {};\n\t\tlet latestTimestamp = (/* @__PURE__ */ new Date(0)).toISOString();\n\t\tfor (const row of scopeRevisions) {\n\t\t\trevision[row.scope] = row.index + 1;\n\t\t\tconst timestamp = row.timestampUtcMs.toISOString();\n\t\t\tif (timestamp > latestTimestamp) latestTimestamp = timestamp;\n\t\t}\n\t\treturn {\n\t\t\trevision,\n\t\t\tlatestTimestamp\n\t\t};\n\t}\n\trowToOperation(row) {\n\t\treturn {\n\t\t\tindex: row.index,\n\t\t\ttimestampUtcMs: row.timestampUtcMs.toISOString(),\n\t\t\thash: row.hash,\n\t\t\tskip: row.skip,\n\t\t\terror: row.error || void 0,\n\t\t\tid: row.opId,\n\t\t\taction: row.action\n\t\t};\n\t}\n\trowToOperationWithContext(row) {\n\t\treturn {\n\t\t\toperation: this.rowToOperation(row),\n\t\t\tcontext: {\n\t\t\t\tdocumentId: row.documentId,\n\t\t\t\tdocumentType: row.documentType,\n\t\t\t\tscope: row.scope,\n\t\t\t\tbranch: row.branch,\n\t\t\t\tordinal: row.id\n\t\t\t}\n\t\t};\n\t}\n};\n//#endregion\n//#region src/storage/migrations/001_create_operation_table.ts\nvar _001_create_operation_table_exports = /* @__PURE__ */ __exportAll({ up: () => up$13 });\nasync function up$13(db) {\n\tawait db.schema.createTable(\"Operation\").addColumn(\"id\", \"serial\", (col) => col.primaryKey()).addColumn(\"jobId\", \"text\", (col) => col.notNull()).addColumn(\"opId\", \"text\", (col) => col.notNull()).addColumn(\"prevOpId\", \"text\", (col) => col.notNull()).addColumn(\"writeTimestampUtcMs\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).addColumn(\"documentId\", \"text\", (col) => col.notNull()).addColumn(\"documentType\", \"text\", (col) => col.notNull()).addColumn(\"scope\", \"text\", (col) => col.notNull()).addColumn(\"branch\", \"text\", (col) => col.notNull()).addColumn(\"timestampUtcMs\", \"timestamptz\", (col) => col.notNull()).addColumn(\"index\", \"integer\", (col) => col.notNull()).addColumn(\"action\", \"jsonb\", (col) => col.notNull()).addColumn(\"skip\", \"integer\", (col) => col.notNull()).addColumn(\"error\", \"text\").addColumn(\"hash\", \"text\", (col) => col.notNull()).addUniqueConstraint(\"unique_revision\", [\n\t\t\"documentId\",\n\t\t\"scope\",\n\t\t\"branch\",\n\t\t\"index\"\n\t]).addUniqueConstraint(\"unique_operation_instance\", [\n\t\t\"opId\",\n\t\t\"index\",\n\t\t\"skip\"\n\t]).execute();\n\tawait db.schema.createIndex(\"streamOperations\").on(\"Operation\").columns([\n\t\t\"documentId\",\n\t\t\"scope\",\n\t\t\"branch\",\n\t\t\"id\"\n\t]).execute();\n\tawait db.schema.createIndex(\"branchlessStreamOperations\").on(\"Operation\").columns([\n\t\t\"documentId\",\n\t\t\"scope\",\n\t\t\"id\"\n\t]).execute();\n}\n//#endregion\n//#region src/storage/migrations/002_create_keyframe_table.ts\nvar _002_create_keyframe_table_exports = /* @__PURE__ */ __exportAll({ up: () => up$12 });\nasync function up$12(db) {\n\tawait db.schema.createTable(\"Keyframe\").addColumn(\"id\", \"serial\", (col) => col.primaryKey()).addColumn(\"documentId\", \"text\", (col) => col.notNull()).addColumn(\"documentType\", \"text\", (col) => col.notNull()).addColumn(\"scope\", \"text\", (col) => col.notNull()).addColumn(\"branch\", \"text\", (col) => col.notNull()).addColumn(\"revision\", \"integer\", (col) => col.notNull()).addColumn(\"document\", \"jsonb\", (col) => col.notNull()).addColumn(\"createdAt\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).addUniqueConstraint(\"unique_keyframe\", [\n\t\t\"documentId\",\n\t\t\"scope\",\n\t\t\"branch\",\n\t\t\"revision\"\n\t]).execute();\n\tawait db.schema.createIndex(\"keyframe_lookup\").on(\"Keyframe\").columns([\n\t\t\"documentId\",\n\t\t\"scope\",\n\t\t\"branch\",\n\t\t\"revision\"\n\t]).execute();\n}\n//#endregion\n//#region src/storage/migrations/003_create_document_table.ts\nvar _003_create_document_table_exports = /* @__PURE__ */ __exportAll({ up: () => up$11 });\nasync function up$11(db) {\n\tawait db.schema.createTable(\"Document\").addColumn(\"id\", \"text\", (col) => col.primaryKey()).addColumn(\"createdAt\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).addColumn(\"updatedAt\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).execute();\n}\n//#endregion\n//#region src/storage/migrations/004_create_document_relationship_table.ts\nvar _004_create_document_relationship_table_exports = /* @__PURE__ */ __exportAll({ up: () => up$10 });\nasync function up$10(db) {\n\tawait db.schema.createTable(\"DocumentRelationship\").addColumn(\"id\", \"text\", (col) => col.primaryKey()).addColumn(\"sourceId\", \"text\", (col) => col.notNull().references(\"Document.id\").onDelete(\"cascade\")).addColumn(\"targetId\", \"text\", (col) => col.notNull().references(\"Document.id\").onDelete(\"cascade\")).addColumn(\"relationshipType\", \"text\", (col) => col.notNull()).addColumn(\"metadata\", \"jsonb\").addColumn(\"createdAt\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).addColumn(\"updatedAt\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).addUniqueConstraint(\"unique_source_target_type\", [\n\t\t\"sourceId\",\n\t\t\"targetId\",\n\t\t\"relationshipType\"\n\t]).execute();\n\tawait db.schema.createIndex(\"idx_relationship_source\").on(\"DocumentRelationship\").column(\"sourceId\").execute();\n\tawait db.schema.createIndex(\"idx_relationship_target\").on(\"DocumentRelationship\").column(\"targetId\").execute();\n\tawait db.schema.createIndex(\"idx_relationship_type\").on(\"DocumentRelationship\").column(\"relationshipType\").execute();\n}\n//#endregion\n//#region src/storage/migrations/005_create_indexer_state_table.ts\nvar _005_create_indexer_state_table_exports = /* @__PURE__ */ __exportAll({ up: () => up$9 });\nasync function up$9(db) {\n\tawait db.schema.createTable(\"IndexerState\").addColumn(\"id\", \"integer\", (col) => col.primaryKey().generatedAlwaysAsIdentity()).addColumn(\"lastOperationId\", \"integer\", (col) => col.notNull()).addColumn(\"lastOperationTimestamp\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).execute();\n}\n//#endregion\n//#region src/storage/migrations/006_create_document_snapshot_table.ts\nvar _006_create_document_snapshot_table_exports = /* @__PURE__ */ __exportAll({ up: () => up$8 });\nasync function up$8(db) {\n\tawait db.schema.createTable(\"DocumentSnapshot\").addColumn(\"id\", \"text\", (col) => col.primaryKey()).addColumn(\"documentId\", \"text\", (col) => col.notNull()).addColumn(\"slug\", \"text\").addColumn(\"name\", \"text\").addColumn(\"scope\", \"text\", (col) => col.notNull()).addColumn(\"branch\", \"text\", (col) => col.notNull()).addColumn(\"content\", \"jsonb\", (col) => col.notNull()).addColumn(\"documentType\", \"text\", (col) => col.notNull()).addColumn(\"lastOperationIndex\", \"integer\", (col) => col.notNull()).addColumn(\"lastOperationHash\", \"text\", (col) => col.notNull()).addColumn(\"lastUpdatedAt\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).addColumn(\"snapshotVersion\", \"integer\", (col) => col.notNull().defaultTo(1)).addColumn(\"identifiers\", \"jsonb\").addColumn(\"metadata\", \"jsonb\").addColumn(\"isDeleted\", \"boolean\", (col) => col.notNull().defaultTo(false)).addColumn(\"deletedAt\", \"timestamptz\").addUniqueConstraint(\"unique_doc_scope_branch\", [\n\t\t\"documentId\",\n\t\t\"scope\",\n\t\t\"branch\"\n\t]).execute();\n\tawait db.schema.createIndex(\"idx_slug_scope_branch\").on(\"DocumentSnapshot\").columns([\n\t\t\"slug\",\n\t\t\"scope\",\n\t\t\"branch\"\n\t]).execute();\n\tawait db.schema.createIndex(\"idx_doctype_scope_branch\").on(\"DocumentSnapshot\").columns([\n\t\t\"documentType\",\n\t\t\"scope\",\n\t\t\"branch\"\n\t]).execute();\n\tawait db.schema.createIndex(\"idx_last_updated\").on(\"DocumentSnapshot\").column(\"lastUpdatedAt\").execute();\n\tawait db.schema.createIndex(\"idx_is_deleted\").on(\"DocumentSnapshot\").column(\"isDeleted\").execute();\n}\n//#endregion\n//#region src/storage/migrations/007_create_slug_mapping_table.ts\nvar _007_create_slug_mapping_table_exports = /* @__PURE__ */ __exportAll({ up: () => up$7 });\nasync function up$7(db) {\n\tawait db.schema.createTable(\"SlugMapping\").addColumn(\"slug\", \"text\", (col) => col.primaryKey()).addColumn(\"documentId\", \"text\", (col) => col.notNull()).addColumn(\"scope\", \"text\", (col) => col.notNull()).addColumn(\"branch\", \"text\", (col) => col.notNull()).addColumn(\"createdAt\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).addColumn(\"updatedAt\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).addUniqueConstraint(\"unique_docid_scope_branch\", [\n\t\t\"documentId\",\n\t\t\"scope\",\n\t\t\"branch\"\n\t]).execute();\n\tawait db.schema.createIndex(\"idx_slug_documentid\").on(\"SlugMapping\").column(\"documentId\").execute();\n}\n//#endregion\n//#region src/storage/migrations/008_create_view_state_table.ts\nvar _008_create_view_state_table_exports = /* @__PURE__ */ __exportAll({ up: () => up$6 });\nasync function up$6(db) {\n\tawait db.schema.createTable(\"ViewState\").addColumn(\"readModelId\", \"text\", (col) => col.primaryKey()).addColumn(\"lastOrdinal\", \"integer\", (col) => col.notNull().defaultTo(0)).addColumn(\"lastOperationTimestamp\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).execute();\n}\n//#endregion\n//#region src/storage/migrations/009_create_operation_index_tables.ts\nvar _009_create_operation_index_tables_exports = /* @__PURE__ */ __exportAll({ up: () => up$5 });\nasync function up$5(db) {\n\tawait db.schema.createTable(\"document_collections\").addColumn(\"documentId\", \"text\", (col) => col.notNull()).addColumn(\"collectionId\", \"text\", (col) => col.notNull()).addColumn(\"joinedOrdinal\", \"bigint\", (col) => col.notNull().defaultTo(0)).addColumn(\"leftOrdinal\", \"bigint\").addPrimaryKeyConstraint(\"document_collections_pkey\", [\"documentId\", \"collectionId\"]).execute();\n\tawait db.schema.createIndex(\"idx_document_collections_collectionId\").on(\"document_collections\").column(\"collectionId\").execute();\n\tawait db.schema.createIndex(\"idx_doc_collections_collection_range\").on(\"document_collections\").columns([\"collectionId\", \"joinedOrdinal\"]).execute();\n\tawait db.schema.createTable(\"operation_index_operations\").addColumn(\"ordinal\", \"serial\", (col) => col.primaryKey()).addColumn(\"opId\", \"text\", (col) => col.notNull()).addColumn(\"documentId\", \"text\", (col) => col.notNull()).addColumn(\"documentType\", \"text\", (col) => col.notNull()).addColumn(\"scope\", \"text\", (col) => col.notNull()).addColumn(\"branch\", \"text\", (col) => col.notNull()).addColumn(\"timestampUtcMs\", \"text\", (col) => col.notNull()).addColumn(\"writeTimestampUtcMs\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).addColumn(\"index\", \"integer\", (col) => col.notNull()).addColumn(\"skip\", \"integer\", (col) => col.notNull()).addColumn(\"hash\", \"text\", (col) => col.notNull()).addColumn(\"action\", \"jsonb\", (col) => col.notNull()).execute();\n\tawait db.schema.createIndex(\"idx_operation_index_operations_document\").on(\"operation_index_operations\").columns([\n\t\t\"documentId\",\n\t\t\"branch\",\n\t\t\"scope\"\n\t]).execute();\n\tawait db.schema.createIndex(\"idx_operation_index_operations_ordinal\").on(\"operation_index_operations\").column(\"ordinal\").execute();\n}\n//#endregion\n//#region src/storage/migrations/010_create_sync_tables.ts\nvar _010_create_sync_tables_exports = /* @__PURE__ */ __exportAll({ up: () => up$4 });\nasync function up$4(db) {\n\tawait db.schema.createTable(\"sync_remotes\").addColumn(\"name\", \"text\", (col) => col.primaryKey()).addColumn(\"collection_id\", \"text\", (col) => col.notNull()).addColumn(\"channel_type\", \"text\", (col) => col.notNull()).addColumn(\"channel_id\", \"text\", (col) => col.notNull().defaultTo(\"\")).addColumn(\"remote_name\", \"text\", (col) => col.notNull().defaultTo(\"\")).addColumn(\"channel_parameters\", \"jsonb\", (col) => col.notNull().defaultTo(sql`'{}'::jsonb`)).addColumn(\"filter_document_ids\", \"jsonb\").addColumn(\"filter_scopes\", \"jsonb\").addColumn(\"filter_branch\", \"text\", (col) => col.notNull().defaultTo(\"main\")).addColumn(\"push_state\", \"text\", (col) => col.notNull().defaultTo(\"idle\")).addColumn(\"push_last_success_utc_ms\", \"text\").addColumn(\"push_last_failure_utc_ms\", \"text\").addColumn(\"push_failure_count\", \"integer\", (col) => col.notNull().defaultTo(0)).addColumn(\"pull_state\", \"text\", (col) => col.notNull().defaultTo(\"idle\")).addColumn(\"pull_last_success_utc_ms\", \"text\").addColumn(\"pull_last_failure_utc_ms\", \"text\").addColumn(\"pull_failure_count\", \"integer\", (col) => col.notNull().defaultTo(0)).addColumn(\"created_at\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).addColumn(\"updated_at\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).execute();\n\tawait db.schema.createIndex(\"idx_sync_remotes_collection\").on(\"sync_remotes\").column(\"collection_id\").execute();\n\tawait db.schema.createTable(\"sync_cursors\").addColumn(\"remote_name\", \"text\", (col) => col.primaryKey().references(\"sync_remotes.name\").onDelete(\"cascade\")).addColumn(\"cursor_ordinal\", \"bigint\", (col) => col.notNull().defaultTo(0)).addColumn(\"last_synced_at_utc_ms\", \"text\").addColumn(\"updated_at\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).execute();\n\tawait db.schema.createIndex(\"idx_sync_cursors_ordinal\").on(\"sync_cursors\").column(\"cursor_ordinal\").execute();\n}\n//#endregion\n//#region src/storage/migrations/011_add_cursor_type_column.ts\nvar _011_add_cursor_type_column_exports = /* @__PURE__ */ __exportAll({ up: () => up$3 });\nasync function up$3(db) {\n\tawait db.deleteFrom(\"sync_cursors\").where(\"remote_name\", \"like\", \"outbox::%\").execute();\n\tawait db.deleteFrom(\"sync_remotes\").where(\"name\", \"like\", \"outbox::%\").execute();\n\tawait db.schema.dropTable(\"sync_cursors\").execute();\n\tawait db.schema.createTable(\"sync_cursors\").addColumn(\"remote_name\", \"text\", (col) => col.notNull()).addColumn(\"cursor_type\", \"text\", (col) => col.notNull().defaultTo(\"inbox\")).addColumn(\"cursor_ordinal\", \"bigint\", (col) => col.notNull().defaultTo(0)).addColumn(\"last_synced_at_utc_ms\", \"text\").addColumn(\"updated_at\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).addPrimaryKeyConstraint(\"sync_cursors_pk\", [\"remote_name\", \"cursor_type\"]).execute();\n\tawait db.schema.createIndex(\"idx_sync_cursors_ordinal\").on(\"sync_cursors\").column(\"cursor_ordinal\").execute();\n}\n//#endregion\n//#region src/storage/migrations/012_add_source_remote_column.ts\nvar _012_add_source_remote_column_exports = /* @__PURE__ */ __exportAll({ up: () => up$2 });\nasync function up$2(db) {\n\tawait db.schema.alterTable(\"operation_index_operations\").addColumn(\"sourceRemote\", \"text\", (col) => col.notNull().defaultTo(\"\")).execute();\n}\n//#endregion\n//#region src/storage/migrations/013_create_sync_dead_letters_table.ts\nvar _013_create_sync_dead_letters_table_exports = /* @__PURE__ */ __exportAll({ up: () => up$1 });\nasync function up$1(db) {\n\tawait db.schema.createTable(\"sync_dead_letters\").addColumn(\"ordinal\", \"serial\", (col) => col.primaryKey()).addColumn(\"id\", \"text\", (col) => col.unique().notNull()).addColumn(\"job_id\", \"text\", (col) => col.notNull()).addColumn(\"job_dependencies\", \"jsonb\", (col) => col.notNull().defaultTo(sql`'[]'::jsonb`)).addColumn(\"remote_name\", \"text\", (col) => col.notNull().references(\"sync_remotes.name\").onDelete(\"cascade\")).addColumn(\"document_id\", \"text\", (col) => col.notNull()).addColumn(\"scopes\", \"jsonb\", (col) => col.notNull().defaultTo(sql`'[]'::jsonb`)).addColumn(\"branch\", \"text\", (col) => col.notNull()).addColumn(\"operations\", \"jsonb\", (col) => col.notNull().defaultTo(sql`'[]'::jsonb`)).addColumn(\"error_source\", \"text\", (col) => col.notNull()).addColumn(\"error_message\", \"text\", (col) => col.notNull()).addColumn(\"created_at\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).execute();\n\tawait db.schema.createIndex(\"idx_sync_dead_letters_remote\").on(\"sync_dead_letters\").column(\"remote_name\").execute();\n}\n//#endregion\n//#region src/storage/migrations/014_create_processor_cursor_table.ts\nvar _014_create_processor_cursor_table_exports = /* @__PURE__ */ __exportAll({ up: () => up });\nasync function up(db) {\n\tawait db.schema.createTable(\"ProcessorCursor\").addColumn(\"processorId\", \"text\", (col) => col.primaryKey()).addColumn(\"factoryId\", \"text\", (col) => col.notNull()).addColumn(\"driveId\", \"text\", (col) => col.notNull()).addColumn(\"processorIndex\", \"integer\", (col) => col.notNull()).addColumn(\"lastOrdinal\", \"integer\", (col) => col.notNull().defaultTo(sql`0`)).addColumn(\"status\", \"text\", (col) => col.notNull().defaultTo(sql`'active'`)).addColumn(\"lastError\", \"text\").addColumn(\"lastErrorTimestamp\", \"timestamptz\").addColumn(\"createdAt\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).addColumn(\"updatedAt\", \"timestamptz\", (col) => col.notNull().defaultTo(sql`NOW()`)).execute();\n}\n//#endregion\n//#region src/storage/migrations/migrator.ts\nconst REACTOR_SCHEMA = \"reactor\";\nconst migrations = {\n\t\"001_create_operation_table\": _001_create_operation_table_exports,\n\t\"002_create_keyframe_table\": _002_create_keyframe_table_exports,\n\t\"003_create_document_table\": _003_create_document_table_exports,\n\t\"004_create_document_relationship_table\": _004_create_document_relationship_table_exports,\n\t\"005_create_indexer_state_table\": _005_create_indexer_state_table_exports,\n\t\"006_create_document_snapshot_table\": _006_create_document_snapshot_table_exports,\n\t\"007_create_slug_mapping_table\": _007_create_slug_mapping_table_exports,\n\t\"008_create_view_state_table\": _008_create_view_state_table_exports,\n\t\"009_create_operation_index_tables\": _009_create_operation_index_tables_exports,\n\t\"010_create_sync_tables\": _010_create_sync_tables_exports,\n\t\"011_add_cursor_type_column\": _011_add_cursor_type_column_exports,\n\t\"012_add_source_remote_column\": _012_add_source_remote_column_exports,\n\t\"013_create_sync_dead_letters_table\": _013_create_sync_dead_letters_table_exports,\n\t\"014_create_processor_cursor_table\": _014_create_processor_cursor_table_exports\n};\nvar ProgrammaticMigrationProvider = class {\n\tgetMigrations() {\n\t\treturn Promise.resolve(migrations);\n\t}\n};\nasync function runMigrations(db, schema = REACTOR_SCHEMA) {\n\ttry {\n\t\tawait sql`CREATE SCHEMA IF NOT EXISTS ${sql.id(schema)}`.execute(db);\n\t} catch (error) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmigrationsExecuted: [],\n\t\t\terror: error instanceof Error ? error : /* @__PURE__ */ new Error(\"Failed to create schema\")\n\t\t};\n\t}\n\tconst migrator = new Migrator({\n\t\tdb: db.withSchema(schema),\n\t\tprovider: new ProgrammaticMigrationProvider(),\n\t\tmigrationTableSchema: schema\n\t});\n\tlet error;\n\tlet results;\n\ttry {\n\t\tconst result = await migrator.migrateToLatest();\n\t\terror = result.error;\n\t\tresults = result.results;\n\t} catch (e) {\n\t\terror = e;\n\t\tresults = [];\n\t}\n\tconst migrationsExecuted = results?.map((result) => result.migrationName) ?? [];\n\tif (error) return {\n\t\tsuccess: false,\n\t\tmigrationsExecuted,\n\t\terror: error instanceof Error ? error : /* @__PURE__ */ new Error(\"Unknown migration error\")\n\t};\n\treturn {\n\t\tsuccess: true,\n\t\tmigrationsExecuted\n\t};\n}\nasync function getMigrationStatus(db, schema = REACTOR_SCHEMA) {\n\treturn await new Migrator({\n\t\tdb: db.withSchema(schema),\n\t\tprovider: new ProgrammaticMigrationProvider(),\n\t\tmigrationTableSchema: schema\n\t}).getMigrations();\n}\n//#endregion\n//#region src/subs/default-error-handler.ts\n/**\n* Default error handler that re-throws subscription errors.\n* This ensures that errors are not silently swallowed.\n*/\nvar DefaultSubscriptionErrorHandler = class {\n\thandleError(error, context) {\n\t\tconst errorMessage = `Subscription error in ${context.eventType} (${context.subscriptionId})`;\n\t\tif (error instanceof Error) {\n\t\t\tconst enhancedError = /* @__PURE__ */ new Error(`${errorMessage}: ${error.message}`);\n\t\t\tenhancedError.cause = error;\n\t\t\tenhancedError.stack = error.stack;\n\t\t\tthrow enhancedError;\n\t\t} else throw new Error(`${errorMessage}: ${String(error)}`);\n\t}\n};\n//#endregion\n//#region src/subs/react-subscription-manager.ts\nvar ReactorSubscriptionManager = class {\n\tcreatedSubscriptions = /* @__PURE__ */ new Map();\n\tdeletedSubscriptions = /* @__PURE__ */ new Map();\n\tupdatedSubscriptions = /* @__PURE__ */ new Map();\n\trelationshipSubscriptions = /* @__PURE__ */ new Map();\n\tsubscriptionCounter = 0;\n\terrorHandler;\n\tconstructor(errorHandler) {\n\t\tthis.errorHandler = errorHandler;\n\t}\n\tonDocumentCreated(callback, search) {\n\t\tconst id = `created-${++this.subscriptionCounter}`;\n\t\tthis.createdSubscriptions.set(id, {\n\t\t\tid,\n\t\t\tcallback,\n\t\t\tsearch\n\t\t});\n\t\treturn () => {\n\t\t\tthis.createdSubscriptions.delete(id);\n\t\t};\n\t}\n\tonDocumentDeleted(callback, search) {\n\t\tconst id = `deleted-${++this.subscriptionCounter}`;\n\t\tthis.deletedSubscriptions.set(id, {\n\t\t\tid,\n\t\t\tcallback,\n\t\t\tsearch\n\t\t});\n\t\treturn () => {\n\t\t\tthis.deletedSubscriptions.delete(id);\n\t\t};\n\t}\n\tonDocumentStateUpdated(callback, search, view) {\n\t\tconst id = `updated-${++this.subscriptionCounter}`;\n\t\tthis.updatedSubscriptions.set(id, {\n\t\t\tid,\n\t\t\tcallback,\n\t\t\tsearch,\n\t\t\tview\n\t\t});\n\t\treturn () => {\n\t\t\tthis.updatedSubscriptions.delete(id);\n\t\t};\n\t}\n\tonRelationshipChanged(callback, search) {\n\t\tconst id = `relationship-${++this.subscriptionCounter}`;\n\t\tthis.relationshipSubscriptions.set(id, {\n\t\t\tid,\n\t\t\tcallback,\n\t\t\tsearch\n\t\t});\n\t\treturn () => {\n\t\t\tthis.relationshipSubscriptions.delete(id);\n\t\t};\n\t}\n\t/**\n\t* Notify subscribers about created documents\n\t*/\n\tnotifyDocumentsCreated(documentIds, documentTypes, parentIds) {\n\t\tconst result = {\n\t\t\tresults: documentIds,\n\t\t\toptions: {\n\t\t\t\tcursor: \"\",\n\t\t\t\tlimit: documentIds.length\n\t\t\t}\n\t\t};\n\t\tfor (const subscription of this.createdSubscriptions.values()) {\n\t\t\tconst filteredIds = this.filterDocumentIds(documentIds, subscription.search, documentTypes, parentIds);\n\t\t\tif (filteredIds.length > 0) try {\n\t\t\t\tsubscription.callback({\n\t\t\t\t\t...result,\n\t\t\t\t\tresults: filteredIds\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tthis.errorHandler.handleError(error, {\n\t\t\t\t\teventType: \"created\",\n\t\t\t\t\tsubscriptionId: subscription.id,\n\t\t\t\t\teventData: filteredIds\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t* Notify subscribers about deleted documents\n\t*/\n\tnotifyDocumentsDeleted(documentIds, documentTypes, parentIds) {\n\t\tfor (const subscription of this.deletedSubscriptions.values()) {\n\t\t\tconst filteredIds = this.filterDocumentIds(documentIds, subscription.search, documentTypes, parentIds);\n\t\t\tif (filteredIds.length > 0) try {\n\t\t\t\tsubscription.callback(filteredIds);\n\t\t\t} catch (error) {\n\t\t\t\tthis.errorHandler.handleError(error, {\n\t\t\t\t\teventType: \"deleted\",\n\t\t\t\t\tsubscriptionId: subscription.id,\n\t\t\t\t\teventData: filteredIds\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t* Notify subscribers about updated documents\n\t*/\n\tnotifyDocumentsUpdated(documents) {\n\t\tconst result = {\n\t\t\tresults: documents,\n\t\t\toptions: {\n\t\t\t\tcursor: \"\",\n\t\t\t\tlimit: documents.length\n\t\t\t}\n\t\t};\n\t\tfor (const subscription of this.updatedSubscriptions.values()) {\n\t\t\tconst filteredDocs = this.filterDocuments(documents, subscription.search);\n\t\t\tif (filteredDocs.length > 0) try {\n\t\t\t\tsubscription.callback({\n\t\t\t\t\t...result,\n\t\t\t\t\tresults: filteredDocs\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tthis.errorHandler.handleError(error, {\n\t\t\t\t\teventType: \"updated\",\n\t\t\t\t\tsubscriptionId: subscription.id,\n\t\t\t\t\teventData: filteredDocs\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t* Notify subscribers about relationship changes\n\t*/\n\tnotifyRelationshipChanged(parentId, childId, changeType, childType) {\n\t\tfor (const subscription of this.relationshipSubscriptions.values()) if (this.matchesRelationshipFilter(parentId, childId, childType, subscription.search)) try {\n\t\t\tsubscription.callback(parentId, childId, changeType);\n\t\t} catch (error) {\n\t\t\tthis.errorHandler.handleError(error, {\n\t\t\t\teventType: \"relationshipChanged\",\n\t\t\t\tsubscriptionId: subscription.id,\n\t\t\t\teventData: {\n\t\t\t\t\tparentId,\n\t\t\t\t\tchildId,\n\t\t\t\t\tchangeType\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\t/**\n\t* Clear all subscriptions\n\t*/\n\tclearAll() {\n\t\tthis.createdSubscriptions.clear();\n\t\tthis.deletedSubscriptions.clear();\n\t\tthis.updatedSubscriptions.clear();\n\t\tthis.relationshipSubscriptions.clear();\n\t}\n\tfilterDocumentIds(documentIds, search, documentTypes, parentIds) {\n\t\tif (!search) return documentIds;\n\t\treturn documentIds.filter((id) => {\n\t\t\tif (search.ids && !search.ids.includes(id)) return false;\n\t\t\tif (search.type && documentTypes) {\n\t\t\t\tif (documentTypes.get(id) !== search.type) return false;\n\t\t\t}\n\t\t\tif (search.parentId && parentIds) {\n\t\t\t\tif (parentIds.get(id) !== search.parentId) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\t}\n\tfilterDocuments(documents, search) {\n\t\tif (!search) return documents;\n\t\treturn documents.filter((doc) => {\n\t\t\tif (search.ids && !search.ids.includes(doc.header.id)) return false;\n\t\t\tif (search.type && doc.header.documentType !== search.type) return false;\n\t\t\tif (search.slugs && !search.slugs.includes(doc.header.slug)) return false;\n\t\t\treturn true;\n\t\t});\n\t}\n\tmatchesRelationshipFilter(parentId, childId, childType, search) {\n\t\tif (!search) return true;\n\t\tif (search.parentId && parentId !== search.parentId) return false;\n\t\tif (search.ids && !search.ids.includes(childId)) return false;\n\t\tif (search.type && childType && childType !== search.type) return false;\n\t\treturn true;\n\t}\n};\n//#endregion\n//#region src/subs/subscription-notification-read-model.ts\n/**\n* A read model that notifies the subscription manager when operations are processed.\n* This bridges the gap between operation processing and subscription callbacks.\n*\n* Must be processed AFTER other read models have completed and AFTER READ_READY\n* is emitted, so that reactor.get() returns fresh data when callbacks fire.\n*/\nvar SubscriptionNotificationReadModel = class {\n\tname = \"subscription-notification\";\n\tconstructor(subscriptionManager, documentView) {\n\t\tthis.subscriptionManager = subscriptionManager;\n\t\tthis.documentView = documentView;\n\t}\n\tasync indexOperations(operations) {\n\t\tif (operations.length === 0) return;\n\t\tconst created = [];\n\t\tconst deleted = [];\n\t\tconst updatedIds = /* @__PURE__ */ new Set();\n\t\tconst documentTypes = /* @__PURE__ */ new Map();\n\t\tconst parentIds = /* @__PURE__ */ new Map();\n\t\tfor (const item of operations) {\n\t\t\tconst { operation, context } = item;\n\t\t\tconst actionType = operation.action.type;\n\t\t\tdocumentTypes.set(context.documentId, context.documentType);\n\t\t\tif (actionType === \"CREATE_DOCUMENT\") created.push(context.documentId);\n\t\t\telse if (actionType === \"DELETE_DOCUMENT\") {\n\t\t\t\tconst deletedId = operation.action.input.documentId ?? context.documentId;\n\t\t\t\tdeleted.push(deletedId);\n\t\t\t} else if (actionType === \"ADD_RELATIONSHIP\") {\n\t\t\t\tconst input = operation.action.input;\n\t\t\t\tthis.subscriptionManager.notifyRelationshipChanged(input.sourceId, input.targetId, RelationshipChangeType.Added, input.childType);\n\t\t\t} else if (actionType === \"REMOVE_RELATIONSHIP\") {\n\t\t\t\tconst input = operation.action.input;\n\t\t\t\tthis.subscriptionManager.notifyRelationshipChanged(input.sourceId, input.targetId, RelationshipChangeType.Removed, input.childType);\n\t\t\t} else if (!created.includes(context.documentId)) updatedIds.add(context.documentId);\n\t\t}\n\t\tif (created.length > 0) this.subscriptionManager.notifyDocumentsCreated(created, documentTypes, parentIds);\n\t\tif (deleted.length > 0) this.subscriptionManager.notifyDocumentsDeleted(deleted, documentTypes, parentIds);\n\t\tif (updatedIds.size > 0 && this.documentView) {\n\t\t\tconst documents = await Promise.all(Array.from(updatedIds).map((id) => this.documentView.get(id)));\n\t\t\tthis.subscriptionManager.notifyDocumentsUpdated(documents);\n\t\t}\n\t}\n};\n//#endregion\n//#region src/sync/types.ts\nlet ChannelScheme = /* @__PURE__ */ function(ChannelScheme) {\n\tChannelScheme[\"CONNECT\"] = \"connect\";\n\tChannelScheme[\"SWITCHBOARD\"] = \"switchboard\";\n\treturn ChannelScheme;\n}({});\nlet SyncOperationStatus = /* @__PURE__ */ function(SyncOperationStatus) {\n\tSyncOperationStatus[SyncOperationStatus[\"Unknown\"] = -1] = \"Unknown\";\n\tSyncOperationStatus[SyncOperationStatus[\"TransportPending\"] = 0] = \"TransportPending\";\n\tSyncOperationStatus[SyncOperationStatus[\"ExecutionPending\"] = 1] = \"ExecutionPending\";\n\tSyncOperationStatus[SyncOperationStatus[\"Applied\"] = 2] = \"Applied\";\n\tSyncOperationStatus[SyncOperationStatus[\"Error\"] = 3] = \"Error\";\n\treturn SyncOperationStatus;\n}({});\nlet ChannelErrorSource = /* @__PURE__ */ function(ChannelErrorSource) {\n\tChannelErrorSource[\"None\"] = \"none\";\n\tChannelErrorSource[\"Channel\"] = \"channel\";\n\tChannelErrorSource[\"Inbox\"] = \"inbox\";\n\tChannelErrorSource[\"Outbox\"] = \"outbox\";\n\treturn ChannelErrorSource;\n}({});\n/**\n* Event types for sync lifecycle events.\n* These events track the sync progress of a job's operations to remotes.\n* Uses a separate namespace (20000 range) from ReactorEventTypes (10000 range).\n*/\nconst SyncEventTypes = {\n\tSYNC_PENDING: 20001,\n\tSYNC_SUCCEEDED: 20002,\n\tSYNC_FAILED: 20003,\n\tDEAD_LETTER_ADDED: 20004,\n\tCONNECTION_STATE_CHANGED: 20005\n};\n//#endregion\n//#region src/sync/mailbox.ts\nvar MailboxAggregateError = class extends Error {\n\terrors;\n\tconstructor(errors) {\n\t\tconst messages = errors.map((e) => e.message).join(\"; \");\n\t\tsuper(`Mailbox callback failed with ${errors.length} error(s): ${messages}`);\n\t\tthis.name = \"MailboxAggregateError\";\n\t\tthis.errors = errors;\n\t}\n};\nvar Mailbox = class {\n\titemsMap = /* @__PURE__ */ new Map();\n\taddedCallbacks = [];\n\tremovedCallbacks = [];\n\tpaused = false;\n\taddedBuffer = [];\n\tremovedBuffer = [];\n\t_ack = 0;\n\t_latestOrdinal = 0;\n\tinit(ackOrdinal) {\n\t\tthis._ack = this._latestOrdinal = ackOrdinal;\n\t}\n\tadvanceOrdinal(ordinal) {\n\t\tthis._latestOrdinal = Math.max(this._latestOrdinal, ordinal);\n\t}\n\tget items() {\n\t\treturn Array.from(this.itemsMap.values());\n\t}\n\tget ackOrdinal() {\n\t\treturn this._ack;\n\t}\n\tget latestOrdinal() {\n\t\treturn this._latestOrdinal;\n\t}\n\tget(id) {\n\t\treturn this.itemsMap.get(id);\n\t}\n\tadd(...items) {\n\t\tfor (const item of items) {\n\t\t\tthis.itemsMap.set(item.id, item);\n\t\t\tfor (const op of item.operations) this._latestOrdinal = Math.max(this._latestOrdinal, op.context.ordinal);\n\t\t\titem.on((syncOp, _, next) => {\n\t\t\t\tif (next === SyncOperationStatus.Applied) for (const op of syncOp.operations) this._ack = Math.max(this._ack, op.context.ordinal);\n\t\t\t});\n\t\t}\n\t\tif (this.paused) {\n\t\t\tthis.addedBuffer.push(...items);\n\t\t\treturn;\n\t\t}\n\t\tconst callbacks = [...this.addedCallbacks];\n\t\tconst errors = [];\n\t\tfor (const callback of callbacks) try {\n\t\t\tcallback(items);\n\t\t} catch (error) {\n\t\t\terrors.push(error instanceof Error ? error : new Error(String(error)));\n\t\t}\n\t\tif (errors.length > 0) throw new MailboxAggregateError(errors);\n\t}\n\tremove(...items) {\n\t\tfor (const item of items) this.itemsMap.delete(item.id);\n\t\tif (this.paused) {\n\t\t\tthis.removedBuffer.push(...items);\n\t\t\treturn;\n\t\t}\n\t\tconst callbacks = [...this.removedCallbacks];\n\t\tconst errors = [];\n\t\tfor (const callback of callbacks) try {\n\t\t\tcallback(items);\n\t\t} catch (error) {\n\t\t\terrors.push(error instanceof Error ? error : new Error(String(error)));\n\t\t}\n\t\tif (errors.length > 0) throw new MailboxAggregateError(errors);\n\t}\n\tonAdded(callback) {\n\t\tthis.addedCallbacks.push(callback);\n\t}\n\tonRemoved(callback) {\n\t\tthis.removedCallbacks.push(callback);\n\t}\n\tpause() {\n\t\tthis.paused = true;\n\t}\n\tresume() {\n\t\tthis.paused = false;\n\t\tthis.flush();\n\t}\n\tflush() {\n\t\tif (this.addedBuffer.length > 0) {\n\t\t\tconst items = this.addedBuffer.splice(0);\n\t\t\tconst callbacks = [...this.addedCallbacks];\n\t\t\tconst errors = [];\n\t\t\tfor (const callback of callbacks) try {\n\t\t\t\tcallback(items);\n\t\t\t} catch (error) {\n\t\t\t\terrors.push(error instanceof Error ? error : new Error(String(error)));\n\t\t\t}\n\t\t\tif (errors.length > 0) throw new MailboxAggregateError(errors);\n\t\t}\n\t\tif (this.removedBuffer.length > 0) {\n\t\t\tconst items = this.removedBuffer.splice(0);\n\t\t\tconst callbacks = [...this.removedCallbacks];\n\t\t\tconst errors = [];\n\t\t\tfor (const callback of callbacks) try {\n\t\t\t\tcallback(items);\n\t\t\t} catch (error) {\n\t\t\t\terrors.push(error instanceof Error ? error : new Error(String(error)));\n\t\t\t}\n\t\t\tif (errors.length > 0) throw new MailboxAggregateError(errors);\n\t\t}\n\t}\n\tisPaused() {\n\t\treturn this.paused;\n\t}\n};\n//#endregion\n//#region src/sync/buffered-mailbox.ts\nvar BufferedMailbox = class {\n\titemsMap = /* @__PURE__ */ new Map();\n\taddedCallbacks = [];\n\tremovedCallbacks = [];\n\taddedBuffer = [];\n\tremovedBuffer = [];\n\taddedTimer = null;\n\tremovedTimer = null;\n\tmilliseconds;\n\tmaxQueued;\n\tpaused = false;\n\t_ack = 0;\n\t_latestOrdinal = 0;\n\tconstructor(milliseconds, maxQueued) {\n\t\tthis.milliseconds = milliseconds;\n\t\tthis.maxQueued = maxQueued;\n\t}\n\tinit(ackOrdinal) {\n\t\tthis._ack = this._latestOrdinal = ackOrdinal;\n\t}\n\tadvanceOrdinal(ordinal) {\n\t\tthis._latestOrdinal = Math.max(this._latestOrdinal, ordinal);\n\t}\n\tget items() {\n\t\treturn Array.from(this.itemsMap.values());\n\t}\n\tget ackOrdinal() {\n\t\treturn this._ack;\n\t}\n\tget latestOrdinal() {\n\t\treturn this._latestOrdinal;\n\t}\n\tget(id) {\n\t\treturn this.itemsMap.get(id);\n\t}\n\tadd(...items) {\n\t\tfor (const item of items) {\n\t\t\tthis.itemsMap.set(item.id, item);\n\t\t\tfor (const op of item.operations) this._latestOrdinal = Math.max(this._latestOrdinal, op.context.ordinal);\n\t\t\titem.on((syncOp, _, next) => {\n\t\t\t\tif (next === SyncOperationStatus.Applied) for (const op of syncOp.operations) this._ack = Math.max(this._ack, op.context.ordinal);\n\t\t\t});\n\t\t}\n\t\tthis.addedBuffer.push(...items);\n\t\tif (this.paused) return;\n\t\tif (this.addedBuffer.length >= this.maxQueued) this.flushAdded();\n\t\telse this.scheduleAddedFlush();\n\t}\n\tremove(...items) {\n\t\tfor (const item of items) this.itemsMap.delete(item.id);\n\t\tthis.removedBuffer.push(...items);\n\t\tif (this.paused) return;\n\t\tif (this.removedBuffer.length >= this.maxQueued) this.flushRemoved();\n\t\telse this.scheduleRemovedFlush();\n\t}\n\tonAdded(callback) {\n\t\tthis.addedCallbacks.push(callback);\n\t}\n\tonRemoved(callback) {\n\t\tthis.removedCallbacks.push(callback);\n\t}\n\tpause() {\n\t\tthis.paused = true;\n\t\tif (this.addedTimer !== null) {\n\t\t\tclearTimeout(this.addedTimer);\n\t\t\tthis.addedTimer = null;\n\t\t}\n\t\tif (this.removedTimer !== null) {\n\t\t\tclearTimeout(this.removedTimer);\n\t\t\tthis.removedTimer = null;\n\t\t}\n\t}\n\tresume() {\n\t\tthis.paused = false;\n\t\tif (this.addedBuffer.length > 0) this.scheduleAddedFlush();\n\t\tif (this.removedBuffer.length > 0) this.scheduleRemovedFlush();\n\t}\n\tisPaused() {\n\t\treturn this.paused;\n\t}\n\tflush() {\n\t\tthis.flushAdded();\n\t\tthis.flushRemoved();\n\t}\n\tscheduleAddedFlush() {\n\t\tif (this.addedTimer !== null) clearTimeout(this.addedTimer);\n\t\tthis.addedTimer = setTimeout(() => {\n\t\t\tthis.flushAdded();\n\t\t}, this.milliseconds);\n\t}\n\tscheduleRemovedFlush() {\n\t\tif (this.removedTimer !== null) clearTimeout(this.removedTimer);\n\t\tthis.removedTimer = setTimeout(() => {\n\t\t\tthis.flushRemoved();\n\t\t}, this.milliseconds);\n\t}\n\tflushAdded() {\n\t\tif (this.addedTimer !== null) {\n\t\t\tclearTimeout(this.addedTimer);\n\t\t\tthis.addedTimer = null;\n\t\t}\n\t\tconst items = this.addedBuffer;\n\t\tthis.addedBuffer = [];\n\t\tif (items.length > 0) this.invokeCallbacks(this.addedCallbacks, items);\n\t}\n\tflushRemoved() {\n\t\tif (this.removedTimer !== null) {\n\t\t\tclearTimeout(this.removedTimer);\n\t\t\tthis.removedTimer = null;\n\t\t}\n\t\tconst items = this.removedBuffer;\n\t\tthis.removedBuffer = [];\n\t\tif (items.length > 0) this.invokeCallbacks(this.removedCallbacks, items);\n\t}\n\tinvokeCallbacks(callbacks, items) {\n\t\tconst callbacksCopy = [...callbacks];\n\t\tconst errors = [];\n\t\tfor (const callback of callbacksCopy) try {\n\t\t\tcallback(items);\n\t\t} catch (error) {\n\t\t\terrors.push(error instanceof Error ? error : new Error(String(error)));\n\t\t}\n\t\tif (errors.length > 0) throw new MailboxAggregateError(errors);\n\t}\n};\n//#endregion\n//#region src/sync/errors.ts\nvar GraphQLRequestError = class extends Error {\n\tstatusCode;\n\tcategory;\n\tconstructor(message, category, statusCode) {\n\t\tsuper(message);\n\t\tthis.name = \"GraphQLRequestError\";\n\t\tthis.category = category;\n\t\tthis.statusCode = statusCode;\n\t}\n};\nvar PollingChannelError = class extends Error {\n\tconstructor(message) {\n\t\tsuper(message);\n\t\tthis.name = \"PollingChannelError\";\n\t}\n};\nvar ChannelError = class extends Error {\n\tsource;\n\terror;\n\tconstructor(source, error) {\n\t\tsuper(`ChannelError[${source}]: ${error.message}`);\n\t\tthis.name = \"ChannelError\";\n\t\tthis.source = source;\n\t\tthis.error = error;\n\t}\n};\n//#endregion\n//#region src/sync/sync-operation.ts\nvar SyncOperationAggregateError = class extends Error {\n\terrors;\n\tconstructor(errors) {\n\t\tconst messages = errors.map((e) => e.message).join(\"; \");\n\t\tsuper(`SyncOperation callback failed with ${errors.length} error(s): ${messages}`);\n\t\tthis.name = \"SyncOperationAggregateError\";\n\t\tthis.errors = errors;\n\t}\n};\nvar SyncOperation = class {\n\tid;\n\tjobId;\n\tjobDependencies;\n\tremoteName;\n\tdocumentId;\n\tscopes;\n\tbranch;\n\toperations;\n\tstatus;\n\terror;\n\tcallbacks = [];\n\tconstructor(id, jobId, jobDependencies, remoteName, documentId, scopes, branch, operations) {\n\t\tthis.id = id;\n\t\tthis.jobId = jobId;\n\t\tthis.jobDependencies = jobDependencies;\n\t\tthis.remoteName = remoteName;\n\t\tthis.documentId = documentId;\n\t\tthis.scopes = scopes;\n\t\tthis.branch = branch;\n\t\tthis.operations = operations;\n\t\tthis.status = SyncOperationStatus.Unknown;\n\t}\n\ton(callback) {\n\t\tthis.callbacks.push(callback);\n\t}\n\tstarted() {\n\t\tthis.transition(SyncOperationStatus.TransportPending);\n\t}\n\ttransported() {\n\t\tthis.transition(SyncOperationStatus.ExecutionPending);\n\t}\n\texecuted() {\n\t\tthis.transition(SyncOperationStatus.Applied);\n\t}\n\tfailed(error) {\n\t\tthis.error = error;\n\t\tthis.transition(SyncOperationStatus.Error);\n\t}\n\ttransition(next) {\n\t\tconst prev = this.status;\n\t\tif (next <= prev) return;\n\t\tthis.status = next;\n\t\tconst errors = [];\n\t\tfor (const callback of this.callbacks) try {\n\t\t\tcallback(this, prev, next);\n\t\t} catch (error) {\n\t\t\terrors.push(error instanceof Error ? error : new Error(String(error)));\n\t\t}\n\t\tif (errors.length > 0) throw new SyncOperationAggregateError(errors);\n\t}\n};\n//#endregion\n//#region src/sync/utils.ts\n/**\n* Trims a mailbox using the jobIds from a batch.\n*/\nfunction trimMailboxFromBatch(mailbox, batch) {\n\tconst toRemove = [];\n\tfor (const syncOp of batch.entries) for (const item of mailbox.items) if (syncOp.event.jobId === item.jobId) {\n\t\ttoRemove.push(item);\n\t\tbreak;\n\t}\n\tif (toRemove.length > 0) {\n\t\tfor (const syncOp of toRemove) syncOp.executed();\n\t\tmailbox.remove(...toRemove);\n\t}\n}\n/**\n* Trims a mailbox using the ack ordinal.\n*/\nfunction trimMailboxFromAckOrdinal(mailbox, ackOrdinal) {\n\tconst toRemove = [];\n\tfor (const syncOp of mailbox.items) {\n\t\tlet maxOrdinal = 0;\n\t\tfor (const op of syncOp.operations) maxOrdinal = Math.max(maxOrdinal, op.context.ordinal);\n\t\tif (maxOrdinal <= ackOrdinal) toRemove.push(syncOp);\n\t}\n\tif (toRemove.length > 0) {\n\t\tfor (const syncOp of toRemove) syncOp.executed();\n\t\tmailbox.remove(...toRemove);\n\t}\n}\n/**\n* Filters operations based on a remote's filter criteria.\n*\n* @param operations - The operations to filter\n* @param filter - The filter criteria to apply\n* @returns The filtered operations that match the criteria\n*/\nfunction filterOperations(operations, filter) {\n\treturn operations.filter((op) => {\n\t\tif (filter.branch && op.context.branch !== filter.branch) return false;\n\t\tif (filter.documentId.length > 0 && !filter.documentId.includes(op.context.documentId)) return false;\n\t\tif (filter.scope.length > 0 && !filter.scope.includes(op.context.scope)) return false;\n\t\treturn true;\n\t});\n}\n/**\n* Creates an idle channel health status.\n*\n* @returns A new idle channel health object\n*/\nfunction createIdleHealth() {\n\treturn {\n\t\tstate: \"idle\",\n\t\tfailureCount: 0\n\t};\n}\n/**\n* Batches consecutive operations by documentId and scope, preserving ordering.\n*\n* For operations [a1_doc, a1_global, a2_doc, b1_global], this returns:\n* - Batch 1: [a1_doc] for doc-a, document scope\n* - Batch 2: [a1_global] for doc-a, global scope\n* - Batch 3: [a2_doc] for doc-a, document scope\n* - Batch 4: [b1_global] for doc-b, global scope\n*\n* This ensures operations are grouped for efficient processing while maintaining\n* causality across documents and scopes.\n*/\n/**\n* Sorts envelopes by the timestamp of their first operation.\n* Envelopes without operations are placed at the end.\n*/\nfunction sortEnvelopesByFirstOperationTimestamp(envelopes) {\n\treturn envelopes.slice().sort((a, b) => {\n\t\tconst aTimestamp = a.operations?.[0]?.operation.timestampUtcMs;\n\t\tconst bTimestamp = b.operations?.[0]?.operation.timestampUtcMs;\n\t\tif (!aTimestamp && !bTimestamp) return 0;\n\t\tif (!aTimestamp) return 1;\n\t\tif (!bTimestamp) return -1;\n\t\treturn new Date(aTimestamp).getTime() - new Date(bTimestamp).getTime();\n\t});\n}\nfunction batchOperationsByDocument(operations) {\n\tconst batches = [];\n\tlet currentDocId = null;\n\tlet currentScope = null;\n\tlet currentBatch = [];\n\tconst flushBatch = () => {\n\t\tif (currentBatch.length === 0 || currentDocId === null || currentScope === null) return;\n\t\tbatches.push({\n\t\t\tdocumentId: currentDocId,\n\t\t\tbranch: currentBatch[0].context.branch,\n\t\t\tscope: currentScope,\n\t\t\toperations: currentBatch\n\t\t});\n\t\tcurrentBatch = [];\n\t};\n\tfor (const op of operations) {\n\t\tconst docId = op.context.documentId;\n\t\tconst scope = op.context.scope;\n\t\tif (docId !== currentDocId || scope !== currentScope) {\n\t\t\tflushBatch();\n\t\t\tcurrentDocId = docId;\n\t\t\tcurrentScope = scope;\n\t\t}\n\t\tcurrentBatch.push(op);\n\t}\n\tflushBatch();\n\treturn batches;\n}\nfunction toOperationWithContext(entry) {\n\treturn {\n\t\toperation: {\n\t\t\tid: entry.id,\n\t\t\tindex: entry.index,\n\t\t\tskip: entry.skip,\n\t\t\thash: entry.hash,\n\t\t\ttimestampUtcMs: entry.timestampUtcMs,\n\t\t\taction: entry.action\n\t\t},\n\t\tcontext: {\n\t\t\tdocumentId: entry.documentId,\n\t\t\tdocumentType: entry.documentType,\n\t\t\tscope: entry.scope,\n\t\t\tbranch: entry.branch,\n\t\t\tordinal: entry.ordinal ?? 0\n\t\t}\n\t};\n}\n/**\n* Merges SyncOperations that share the same (documentId, scope, branch) into\n* a single SyncOperation per group. Within each group, operations are sorted\n* by context.ordinal. The merged SyncOperation keeps the first group member's\n* jobId; all other jobIds are remapped so external dependencies still resolve.\n*/\nfunction consolidateSyncOperations(syncOps) {\n\tif (syncOps.length <= 1) return syncOps;\n\tconst groups = /* @__PURE__ */ new Map();\n\tconst jobIdRemap = /* @__PURE__ */ new Map();\n\tconst insertionOrder = [];\n\tfor (const syncOp of syncOps) {\n\t\tconst key = `${syncOp.documentId}|${syncOp.scopes.slice().sort().join(\",\")}|${syncOp.branch}`;\n\t\tconst existing = groups.get(key);\n\t\tif (existing) {\n\t\t\texisting.ops.push(syncOp);\n\t\t\tif (syncOp.jobId && syncOp.jobId !== existing.canonicalJobId) jobIdRemap.set(syncOp.jobId, existing.canonicalJobId);\n\t\t} else {\n\t\t\tgroups.set(key, {\n\t\t\t\tops: [syncOp],\n\t\t\t\tcanonicalJobId: syncOp.jobId\n\t\t\t});\n\t\t\tinsertionOrder.push(key);\n\t\t}\n\t}\n\tconst result = [];\n\tfor (const key of insertionOrder) {\n\t\tconst group = groups.get(key);\n\t\tconst allOperations = group.ops.flatMap((op) => op.operations).sort((a, b) => a.context.ordinal - b.context.ordinal);\n\t\tconst allDeps = /* @__PURE__ */ new Set();\n\t\tfor (const op of group.ops) for (const dep of op.jobDependencies) allDeps.add(dep);\n\t\tallDeps.delete(group.canonicalJobId);\n\t\tfor (const op of group.ops) allDeps.delete(op.jobId);\n\t\tconst remappedDeps = [];\n\t\tfor (const dep of allDeps) {\n\t\t\tconst mapped = jobIdRemap.get(dep) ?? dep;\n\t\t\tif (!remappedDeps.includes(mapped) && mapped !== group.canonicalJobId) remappedDeps.push(mapped);\n\t\t}\n\t\tconst first = group.ops[0];\n\t\tconst merged = new SyncOperation(first.id, first.jobId, remappedDeps, first.remoteName, first.documentId, first.scopes, first.branch, allOperations);\n\t\tif (first.status > SyncOperationStatus.TransportPending) if (first.status >= SyncOperationStatus.Error) merged.executed();\n\t\telse if (first.status >= SyncOperationStatus.Applied) merged.transported();\n\t\telse merged.started();\n\t\tresult.push(merged);\n\t}\n\treturn result;\n}\nfunction mergeCollectionMemberships(events) {\n\tconst mergedMemberships = {};\n\tfor (const event of events) {\n\t\tif (event.collectionMemberships) for (const [docId, collections] of Object.entries(event.collectionMemberships)) {\n\t\t\tif (!(docId in mergedMemberships)) mergedMemberships[docId] = [];\n\t\t\tfor (const c of collections) if (!mergedMemberships[docId].includes(c)) mergedMemberships[docId].push(c);\n\t\t}\n\t\tfor (const op of event.operations) {\n\t\t\tconst action = op.operation.action;\n\t\t\tif (action.type !== \"ADD_RELATIONSHIP\") continue;\n\t\t\tconst input = action.input;\n\t\t\tif (!input?.sourceId || !input.targetId) continue;\n\t\t\tconst collectionId = driveCollectionId(op.context.branch, input.sourceId);\n\t\t\tif (!(input.targetId in mergedMemberships)) mergedMemberships[input.targetId] = [];\n\t\t\tif (!mergedMemberships[input.targetId].includes(collectionId)) mergedMemberships[input.targetId].push(collectionId);\n\t\t}\n\t}\n\treturn mergedMemberships;\n}\n/**\n* Chunks sync operations into batches that respect dependency-connected\n* components. SyncOps linked by jobDependencies are kept in the same chunk.\n* If a connected component exceeds maxSize, it is split by topological order.\n*/\nfunction chunkSyncOperations(items, maxSize) {\n\tif (items.length === 0) return [];\n\tif (items.length <= maxSize) return [items];\n\tconst parent = items.map((_, i) => i);\n\tconst rank = new Array(items.length).fill(0);\n\tfunction find(x) {\n\t\twhile (parent[x] !== x) {\n\t\t\tparent[x] = parent[parent[x]];\n\t\t\tx = parent[x];\n\t\t}\n\t\treturn x;\n\t}\n\tfunction union(a, b) {\n\t\tconst ra = find(a);\n\t\tconst rb = find(b);\n\t\tif (ra === rb) return;\n\t\tif (rank[ra] < rank[rb]) parent[ra] = rb;\n\t\telse if (rank[ra] > rank[rb]) parent[rb] = ra;\n\t\telse {\n\t\t\tparent[rb] = ra;\n\t\t\trank[ra]++;\n\t\t}\n\t}\n\tconst jobIdToIndex = /* @__PURE__ */ new Map();\n\tfor (let i = 0; i < items.length; i++) jobIdToIndex.set(items[i].syncOp.jobId, i);\n\tfor (let i = 0; i < items.length; i++) for (const dep of items[i].syncOp.jobDependencies) {\n\t\tconst depIdx = jobIdToIndex.get(dep);\n\t\tif (depIdx !== void 0) union(i, depIdx);\n\t}\n\tconst componentMap = /* @__PURE__ */ new Map();\n\tfor (let i = 0; i < items.length; i++) {\n\t\tconst root = find(i);\n\t\tlet component = componentMap.get(root);\n\t\tif (!component) {\n\t\t\tcomponent = [];\n\t\t\tcomponentMap.set(root, component);\n\t\t}\n\t\tcomponent.push(items[i]);\n\t}\n\tconst components = [...componentMap.values()];\n\tconst chunks = [];\n\tlet currentChunk = [];\n\tfor (const component of components) {\n\t\tif (component.length > maxSize) {\n\t\t\tif (currentChunk.length > 0) {\n\t\t\t\tchunks.push(currentChunk);\n\t\t\t\tcurrentChunk = [];\n\t\t\t}\n\t\t\tfor (const subChunk of splitComponent(component, maxSize)) chunks.push(subChunk);\n\t\t\tcontinue;\n\t\t}\n\t\tif (currentChunk.length + component.length > maxSize) {\n\t\t\tif (currentChunk.length > 0) chunks.push(currentChunk);\n\t\t\tcurrentChunk = [...component];\n\t\t} else currentChunk.push(...component);\n\t}\n\tif (currentChunk.length > 0) chunks.push(currentChunk);\n\treturn chunks;\n}\n/**\n* Splits an oversized connected component into chunks by topological order.\n* Cross-chunk dependency references are handled by the caller's dep filter.\n*/\nfunction splitComponent(items, maxSize) {\n\tconst jobIdToItem = /* @__PURE__ */ new Map();\n\tconst jobIds = /* @__PURE__ */ new Set();\n\tfor (const item of items) {\n\t\tjobIdToItem.set(item.syncOp.jobId, item);\n\t\tjobIds.add(item.syncOp.jobId);\n\t}\n\tconst inDegree = /* @__PURE__ */ new Map();\n\tconst adjacency = /* @__PURE__ */ new Map();\n\tfor (const item of items) {\n\t\tconst key = item.syncOp.jobId;\n\t\tif (!inDegree.has(key)) inDegree.set(key, 0);\n\t\tif (!adjacency.has(key)) adjacency.set(key, []);\n\t\tfor (const dep of item.syncOp.jobDependencies) if (jobIds.has(dep)) {\n\t\t\tinDegree.set(key, (inDegree.get(key) ?? 0) + 1);\n\t\t\tif (!adjacency.has(dep)) adjacency.set(dep, []);\n\t\t\tadjacency.get(dep).push(key);\n\t\t}\n\t}\n\tconst queue = [];\n\tfor (const [key, degree] of inDegree) if (degree === 0) queue.push(key);\n\tconst sorted = [];\n\twhile (queue.length > 0) {\n\t\tconst key = queue.shift();\n\t\tsorted.push(jobIdToItem.get(key));\n\t\tfor (const neighbor of adjacency.get(key) ?? []) {\n\t\t\tconst newDegree = (inDegree.get(neighbor) ?? 1) - 1;\n\t\t\tinDegree.set(neighbor, newDegree);\n\t\t\tif (newDegree === 0) queue.push(neighbor);\n\t\t}\n\t}\n\tif (sorted.length < items.length) {\n\t\tconst sortedIds = new Set(sorted.map((item) => item.syncOp.jobId));\n\t\tfor (const item of items) if (!sortedIds.has(item.syncOp.jobId)) sorted.push(item);\n\t}\n\tconst chunks = [];\n\tfor (let i = 0; i < sorted.length; i += maxSize) chunks.push(sorted.slice(i, i + maxSize));\n\treturn chunks;\n}\n//#endregion\n//#region src/sync/channels/interval-poll-timer.ts\nconst DEFAULT_CONFIG = {\n\tintervalMs: 2e3,\n\tmaxQueueDepth: 100,\n\tbackpressureCheckIntervalMs: 500,\n\tretryBaseDelayMs: 1e3,\n\tretryMaxDelayMs: 3e5\n};\nfunction calculateBackoffDelay(consecutiveFailures, retryBaseDelayMs, retryMaxDelayMs, random) {\n\tconst backoff = Math.min(retryMaxDelayMs, retryBaseDelayMs * Math.pow(2, consecutiveFailures - 1));\n\treturn backoff / 2 + random * (backoff / 2);\n}\n/**\n* Default poll timer using setTimeout.\n* Waits for delegate completion before scheduling next tick.\n* Checks queue depth and defers polling when backpressure is detected.\n*/\nvar IntervalPollTimer = class {\n\tdelegate;\n\ttimer;\n\trunning;\n\tpaused;\n\tconsecutiveFailures;\n\tqueue;\n\tconfig;\n\tconstructor(queue, config = {}) {\n\t\tthis.queue = queue;\n\t\tthis.config = {\n\t\t\t...DEFAULT_CONFIG,\n\t\t\t...config\n\t\t};\n\t\tthis.running = false;\n\t\tthis.paused = false;\n\t\tthis.consecutiveFailures = 0;\n\t}\n\tsetDelegate(delegate) {\n\t\tthis.delegate = delegate;\n\t}\n\tstart() {\n\t\tthis.running = true;\n\t\tthis.consecutiveFailures = 0;\n\t\tthis.tick();\n\t}\n\tstop() {\n\t\tthis.running = false;\n\t\tif (this.timer) {\n\t\t\tclearTimeout(this.timer);\n\t\t\tthis.timer = void 0;\n\t\t}\n\t}\n\ttick() {\n\t\tif (!this.delegate || !this.running) return;\n\t\tconst delegate = this.delegate;\n\t\tthis.queue.totalSize().then((size) => {\n\t\t\tif (!this.running) return;\n\t\t\tif (size > this.config.maxQueueDepth) this.scheduleBackpressureRecheck();\n\t\t\telse delegate().then(() => {\n\t\t\t\tthis.consecutiveFailures = 0;\n\t\t\t\tthis.scheduleNext();\n\t\t\t}).catch(() => {\n\t\t\t\tthis.consecutiveFailures++;\n\t\t\t\tthis.scheduleRetry();\n\t\t\t});\n\t\t}).catch(() => {\n\t\t\tthis.scheduleNext();\n\t\t});\n\t}\n\tscheduleNext() {\n\t\tif (!this.running || this.paused) return;\n\t\tthis.timer = setTimeout(() => this.tick(), this.config.intervalMs);\n\t}\n\tscheduleRetry() {\n\t\tif (!this.running || this.paused) return;\n\t\tconst delay = calculateBackoffDelay(this.consecutiveFailures, this.config.retryBaseDelayMs, this.config.retryMaxDelayMs, Math.random());\n\t\tthis.timer = setTimeout(() => this.tick(), delay);\n\t}\n\tscheduleBackpressureRecheck() {\n\t\tif (!this.running || this.paused) return;\n\t\tthis.timer = setTimeout(() => this.tick(), this.config.backpressureCheckIntervalMs);\n\t}\n\tpause() {\n\t\tthis.paused = true;\n\t\tif (this.timer) {\n\t\t\tclearTimeout(this.timer);\n\t\t\tthis.timer = void 0;\n\t\t}\n\t}\n\tresume() {\n\t\tthis.paused = false;\n\t\tif (this.running) this.scheduleNext();\n\t}\n\ttriggerNow() {\n\t\tif (this.running && this.delegate) this.tick();\n\t}\n\tisPaused() {\n\t\treturn this.paused;\n\t}\n\tisRunning() {\n\t\treturn this.running;\n\t}\n\tgetIntervalMs() {\n\t\treturn this.config.intervalMs;\n\t}\n\tsetIntervalMs(ms) {\n\t\tthis.config.intervalMs = ms;\n\t}\n};\n//#endregion\n//#region src/sync/channels/utils.ts\nlet syncOpCounter = 0;\n/**\n* Serializes an action for GraphQL transport, converting signature tuples to strings.\n*/\nfunction serializeAction(action) {\n\tconst signer = action.context?.signer;\n\tif (!signer?.signatures) return action;\n\treturn {\n\t\t...action,\n\t\tcontext: {\n\t\t\t...action.context,\n\t\t\tsigner: {\n\t\t\t\t...signer,\n\t\t\t\tsignatures: signer.signatures.map((sig) => Array.isArray(sig) ? sig.join(\", \") : sig)\n\t\t\t}\n\t\t}\n\t};\n}\n/**\n* Serializes a SyncEnvelope for GraphQL transport.\n*\n* Signatures are serialized as comma-separated strings since GraphQL schema\n* defines them as [String!]!. The resultingState context field is stripped\n* since it is not defined in OperationContextInput.\n*/\nfunction serializeEnvelope(envelope) {\n\treturn {\n\t\ttype: envelope.type.toUpperCase(),\n\t\tchannelMeta: envelope.channelMeta,\n\t\toperations: envelope.operations?.map((opWithContext) => ({\n\t\t\toperation: {\n\t\t\t\tindex: opWithContext.operation.index,\n\t\t\t\ttimestampUtcMs: opWithContext.operation.timestampUtcMs,\n\t\t\t\thash: opWithContext.operation.hash,\n\t\t\t\tskip: opWithContext.operation.skip,\n\t\t\t\terror: opWithContext.operation.error,\n\t\t\t\tid: opWithContext.operation.id,\n\t\t\t\taction: serializeAction(opWithContext.operation.action)\n\t\t\t},\n\t\t\tcontext: {\n\t\t\t\tdocumentId: opWithContext.context.documentId,\n\t\t\t\tdocumentType: opWithContext.context.documentType,\n\t\t\t\tscope: opWithContext.context.scope,\n\t\t\t\tbranch: opWithContext.context.branch,\n\t\t\t\tordinal: opWithContext.context.ordinal\n\t\t\t}\n\t\t})),\n\t\tcursor: envelope.cursor,\n\t\tkey: envelope.key,\n\t\tdependsOn: envelope.dependsOn\n\t};\n}\n/**\n* Deserializes a signature from a comma-separated string back to a tuple.\n*\n* GraphQL serializes Signature tuples as comma-separated strings for transport.\n* This function converts them back to the expected [string, string, string, string, string] format.\n*/\nfunction deserializeSignature(sig) {\n\tif (Array.isArray(sig)) return sig;\n\treturn sig.split(\", \");\n}\n/**\n* Deserializes signatures in an operation's signer context from strings back to tuples.\n*\n* When operations are transported via GraphQL, signatures are serialized as comma-separated\n* strings. This function restores them to the Signature tuple format required for verification.\n*/\nfunction deserializeOperationSignatures(opWithContext) {\n\tconst signer = opWithContext.operation.action.context?.signer;\n\tif (!signer?.signatures || signer.signatures.length === 0) return opWithContext;\n\tconst deserializedSignatures = signer.signatures.map(deserializeSignature);\n\tconst deserializedOperation = {\n\t\t...opWithContext.operation,\n\t\taction: {\n\t\t\t...opWithContext.operation.action,\n\t\t\tcontext: {\n\t\t\t\t...opWithContext.operation.action.context,\n\t\t\t\tsigner: {\n\t\t\t\t\t...signer,\n\t\t\t\t\tsignatures: deserializedSignatures\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\treturn {\n\t\t...opWithContext,\n\t\toperation: deserializedOperation\n\t};\n}\n/**\n* Converts a SyncEnvelope containing operations into multiple SyncOperations.\n*\n* This function batches operations by documentId, preserving cross-document ordering.\n* For operations [a1, a2, a3, b1, b2, a4], it returns:\n* - SyncOperation 1: [a1, a2, a3] for doc-a\n* - SyncOperation 2: [b1, b2] for doc-b\n* - SyncOperation 3: [a4] for doc-a\n*\n* This ensures operations are grouped for efficient processing while maintaining\n* causality across documents.\n*/\nfunction envelopesToSyncOperations(envelope, remoteName) {\n\tif (!envelope.operations || envelope.operations.length === 0) return [];\n\treturn batchOperationsByDocument(envelope.operations.map(deserializeOperationSignatures)).map((batch) => {\n\t\treturn new SyncOperation(`syncop-${envelope.channelMeta.id}-${Date.now()}-${syncOpCounter++}`, envelope.key ?? \"\", (envelope.dependsOn ?? []).filter(Boolean), remoteName, batch.documentId, [batch.scope], batch.branch, batch.operations);\n\t});\n}\nconst getLatestAppliedOrdinal = (syncOps) => {\n\tlet maxOrdinal = 0;\n\tfor (const syncOp of syncOps) if (syncOp.status === SyncOperationStatus.Applied) for (const op of syncOp.operations) maxOrdinal = Math.max(maxOrdinal, op.context.ordinal);\n\treturn maxOrdinal;\n};\n//#endregion\n//#region src/sync/channels/gql-req-channel.ts\n/**\n* GraphQL-based synchronization channel for network communication between reactors.\n*/\nvar GqlRequestChannel = class {\n\tinbox;\n\toutbox;\n\tdeadLetter;\n\tconfig;\n\tbufferedOutbox;\n\tchannelId;\n\tremoteName;\n\tcursorStorage;\n\toperationIndex;\n\tpollTimer;\n\tabortController = new AbortController();\n\tisShutdown;\n\tfailureCount;\n\tlastSuccessUtcMs;\n\tlastFailureUtcMs;\n\tlastPersistedInboxOrdinal = 0;\n\tlastPersistedOutboxOrdinal = 0;\n\tpushFailureCount = 0;\n\tpushRetryTimer = null;\n\tpushBlocked = false;\n\tisPushing = false;\n\tpendingDrain = false;\n\treceivingPages = false;\n\tconnectionState = \"connecting\";\n\tconnectionStateCallbacks = /* @__PURE__ */ new Set();\n\tconstructor(logger, channelId, remoteName, cursorStorage, config, operationIndex, pollTimer) {\n\t\tthis.logger = logger;\n\t\tthis.channelId = channelId;\n\t\tthis.remoteName = remoteName;\n\t\tthis.cursorStorage = cursorStorage;\n\t\tthis.operationIndex = operationIndex;\n\t\tthis.pollTimer = pollTimer;\n\t\tthis.config = {\n\t\t\turl: config.url,\n\t\t\tjwtHandler: config.jwtHandler,\n\t\t\tfetchFn: config.fetchFn,\n\t\t\tcollectionId: config.collectionId,\n\t\t\tfilter: config.filter,\n\t\t\tretryBaseDelayMs: config.retryBaseDelayMs,\n\t\t\tretryMaxDelayMs: config.retryMaxDelayMs\n\t\t};\n\t\tthis.isShutdown = false;\n\t\tthis.failureCount = 0;\n\t\tthis.inbox = new Mailbox();\n\t\tthis.bufferedOutbox = new BufferedMailbox(500, 25);\n\t\tthis.outbox = this.bufferedOutbox;\n\t\tthis.deadLetter = new Mailbox();\n\t\tthis.deadLetter.onAdded((syncOps) => {\n\t\t\tfor (const syncOp of syncOps) this.logger.warn(\"Dead letter added for document @DocumentId on channel @ChannelId\", syncOp.documentId, this.channelId);\n\t\t});\n\t\tthis.outbox.onAdded((syncOps) => {\n\t\t\tif (this.isShutdown) return;\n\t\t\tif (this.isPushing) {\n\t\t\t\tthis.pendingDrain = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.pushBlocked) return;\n\t\t\tif (this.receivingPages) {\n\t\t\t\tthis.pendingDrain = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.attemptPush(syncOps);\n\t\t});\n\t\tthis.outbox.onRemoved((syncOps) => {\n\t\t\tconst maxOrdinal = getLatestAppliedOrdinal(syncOps);\n\t\t\tif (maxOrdinal > this.lastPersistedOutboxOrdinal) {\n\t\t\t\tthis.lastPersistedOutboxOrdinal = maxOrdinal;\n\t\t\t\tthis.cursorStorage.upsert({\n\t\t\t\t\tremoteName: this.remoteName,\n\t\t\t\t\tcursorType: \"outbox\",\n\t\t\t\t\tcursorOrdinal: maxOrdinal,\n\t\t\t\t\tlastSyncedAtUtcMs: Date.now()\n\t\t\t\t}).catch((error) => {\n\t\t\t\t\tthis.logger.error(\"Failed to update outbox cursor for @ChannelId! This means that future application runs may resend duplicate operations. This is recoverable (with deduplication protection), but not-optimal: @Error\", this.channelId, error);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tthis.inbox.onRemoved((syncOps) => {\n\t\t\tconst maxOrdinal = getLatestAppliedOrdinal(syncOps);\n\t\t\tif (maxOrdinal > this.lastPersistedInboxOrdinal) {\n\t\t\t\tthis.lastPersistedInboxOrdinal = maxOrdinal;\n\t\t\t\tthis.cursorStorage.upsert({\n\t\t\t\t\tremoteName: this.remoteName,\n\t\t\t\t\tcursorType: \"inbox\",\n\t\t\t\t\tcursorOrdinal: maxOrdinal,\n\t\t\t\t\tlastSyncedAtUtcMs: Date.now()\n\t\t\t\t}).catch((error) => {\n\t\t\t\t\tthis.logger.error(\"Failed to update inbox cursor for @ChannelId! This is unlikely to cause a problem, but not-optimal: @Error\", this.channelId, error);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\t/**\n\t* Shuts down the channel and prevents further operations.\n\t*/\n\tshutdown() {\n\t\tthis.abortController.abort();\n\t\tthis.bufferedOutbox.flush();\n\t\tthis.isShutdown = true;\n\t\tthis.pollTimer.stop();\n\t\tif (this.pushRetryTimer) {\n\t\t\tclearTimeout(this.pushRetryTimer);\n\t\t\tthis.pushRetryTimer = null;\n\t\t}\n\t\tthis.transitionConnectionState(\"disconnected\");\n\t\treturn Promise.resolve();\n\t}\n\tgetConnectionState() {\n\t\treturn {\n\t\t\tstate: this.connectionState,\n\t\t\tfailureCount: this.failureCount,\n\t\t\tlastSuccessUtcMs: this.lastSuccessUtcMs ?? 0,\n\t\t\tlastFailureUtcMs: this.lastFailureUtcMs ?? 0,\n\t\t\tpushBlocked: this.pushBlocked,\n\t\t\tpushFailureCount: this.pushFailureCount,\n\t\t\treceivingPages: this.receivingPages\n\t\t};\n\t}\n\tonConnectionStateChange(callback) {\n\t\tthis.connectionStateCallbacks.add(callback);\n\t\treturn () => {\n\t\t\tthis.connectionStateCallbacks.delete(callback);\n\t\t};\n\t}\n\t/**\n\t* Initializes the channel by registering it on the remote server and starting polling.\n\t*/\n\tasync init() {\n\t\tconst { ackOrdinal } = await this.touchRemoteChannel();\n\t\tconst cursors = await this.cursorStorage.list(this.remoteName);\n\t\tconst inboxOrdinal = cursors.find((c) => c.cursorType === \"inbox\")?.cursorOrdinal ?? 0;\n\t\tconst outboxOrdinal = cursors.find((c) => c.cursorType === \"outbox\")?.cursorOrdinal ?? 0;\n\t\tthis.inbox.init(inboxOrdinal);\n\t\tthis.outbox.init(outboxOrdinal);\n\t\tthis.lastPersistedInboxOrdinal = inboxOrdinal;\n\t\tthis.lastPersistedOutboxOrdinal = outboxOrdinal;\n\t\tif (ackOrdinal > 0) trimMailboxFromAckOrdinal(this.outbox, ackOrdinal);\n\t\tthis.pollTimer.setDelegate(() => this.poll());\n\t\tthis.pollTimer.start();\n\t\tthis.transitionConnectionState(\"connected\");\n\t}\n\ttransitionConnectionState(next) {\n\t\tif (this.connectionState === next) return;\n\t\tthis.connectionState = next;\n\t\tconst snapshot = this.getConnectionState();\n\t\tfor (const callback of this.connectionStateCallbacks) try {\n\t\t\tcallback(snapshot);\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\"Connection state change callback error: @Error\", error);\n\t\t}\n\t}\n\t/**\n\t* Polls the remote for new sync envelopes.\n\t*/\n\tasync poll() {\n\t\tif (this.isShutdown) return;\n\t\tlet response;\n\t\ttry {\n\t\t\tresponse = await this.pollSyncEnvelopes(this.inbox.ackOrdinal, this.inbox.latestOrdinal);\n\t\t} catch (error) {\n\t\t\tif (!this.handlePollError(error)) throw error;\n\t\t\treturn;\n\t\t}\n\t\tconst { envelopes, ackOrdinal, deadLetters, hasMore } = response;\n\t\tif (ackOrdinal > 0) trimMailboxFromAckOrdinal(this.outbox, ackOrdinal);\n\t\tconst sortedEnvelopes = sortEnvelopesByFirstOperationTimestamp(envelopes);\n\t\tconst allSyncOps = [];\n\t\tfor (const envelope of sortedEnvelopes) if (envelope.type.toLowerCase() === \"operations\" && envelope.operations) {\n\t\t\tconst syncOps = envelopesToSyncOperations(envelope, this.remoteName);\n\t\t\tfor (const syncOp of syncOps) syncOp.transported();\n\t\t\tallSyncOps.push(...syncOps);\n\t\t}\n\t\tconst consolidated = allSyncOps.length > 1 ? consolidateSyncOperations(allSyncOps) : allSyncOps;\n\t\tif (consolidated.length > 0) this.inbox.add(...consolidated);\n\t\tif (deadLetters.length > 0) this.handleRemoteDeadLetters(deadLetters);\n\t\tif (hasMore) this.receivingPages = true;\n\t\telse if (this.receivingPages) {\n\t\t\tthis.receivingPages = false;\n\t\t\tthis.drainOutbox();\n\t\t}\n\t\tthis.lastSuccessUtcMs = Date.now();\n\t\tthis.failureCount = 0;\n\t\tthis.transitionConnectionState(\"connected\");\n\t}\n\t/**\n\t* Handles dead letters reported by the remote server.\n\t* Creates local dead letter SyncOperations so the channel quiesces.\n\t*/\n\thandleRemoteDeadLetters(deadLetters) {\n\t\tfor (const dl of deadLetters) this.logger.error(\"Remote dead letter on @ChannelId: document @DocumentId failed with: @Error\", this.channelId, dl.documentId, dl.error);\n\t\tconst syncOps = [];\n\t\tfor (const dl of deadLetters) {\n\t\t\tconst syncOp = new SyncOperation(crypto.randomUUID(), dl.jobId, [], this.remoteName, dl.documentId, dl.scopes, dl.branch, []);\n\t\t\tsyncOp.failed(new ChannelError(ChannelErrorSource.Outbox, new Error(dl.error)));\n\t\t\tsyncOps.push(syncOp);\n\t\t}\n\t\tthis.deadLetter.add(...syncOps);\n\t}\n\t/**\n\t* Handles polling errors with error classification.\n\t* Returns true if the error was handled (caller should not rethrow).\n\t*/\n\thandlePollError(error) {\n\t\tif (this.isShutdown) return true;\n\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\tif (err.message.includes(\"Channel not found\")) {\n\t\t\tthis.transitionConnectionState(\"reconnecting\");\n\t\t\tthis.recoverFromChannelNotFound();\n\t\t\treturn true;\n\t\t}\n\t\tconst classification = this.classifyError(err);\n\t\tthis.failureCount++;\n\t\tthis.lastFailureUtcMs = Date.now();\n\t\tconst channelError = new ChannelError(ChannelErrorSource.Inbox, err);\n\t\tthis.logger.error(\"GqlChannel poll error (@FailureCount, @Classification): @Error\", this.failureCount, classification, channelError);\n\t\tif (classification === \"unrecoverable\") {\n\t\t\tthis.pollTimer.stop();\n\t\t\tthis.transitionConnectionState(\"error\");\n\t\t\treturn true;\n\t\t}\n\t\tthis.transitionConnectionState(\"error\");\n\t\treturn false;\n\t}\n\t/**\n\t* Recovers from a \"Channel not found\" error by re-registering and restarting polling.\n\t* Self-retries with backoff instead of restarting the poll timer on failure.\n\t*/\n\trecoverFromChannelNotFound() {\n\t\tthis.logger.info(\"GqlChannel @ChannelId not found on remote, re-registering...\", this.channelId);\n\t\tthis.pollTimer.stop();\n\t\tconst attemptRecovery = (attempt) => {\n\t\t\tif (this.isShutdown) return;\n\t\t\tthis.touchRemoteChannel().then(({ ackOrdinal }) => {\n\t\t\t\tthis.logger.info(\"GqlChannel @ChannelId re-registered successfully\", this.channelId);\n\t\t\t\tthis.failureCount = 0;\n\t\t\t\tif (ackOrdinal > 0) trimMailboxFromAckOrdinal(this.outbox, ackOrdinal);\n\t\t\t\tthis.pollTimer.start();\n\t\t\t\tthis.transitionConnectionState(\"connected\");\n\t\t\t}).catch((recoveryError) => {\n\t\t\t\tconst err = recoveryError instanceof Error ? recoveryError : new Error(String(recoveryError));\n\t\t\t\tconst classification = this.classifyError(err);\n\t\t\t\tthis.logger.error(\"GqlChannel @ChannelId recovery attempt @Attempt failed (@Classification): @Error\", this.channelId, attempt, classification, recoveryError);\n\t\t\t\tthis.failureCount++;\n\t\t\t\tthis.lastFailureUtcMs = Date.now();\n\t\t\t\tif (classification === \"unrecoverable\") {\n\t\t\t\t\tthis.transitionConnectionState(\"error\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.transitionConnectionState(\"reconnecting\");\n\t\t\t\tconst delay = calculateBackoffDelay(attempt, this.config.retryBaseDelayMs, this.config.retryMaxDelayMs, Math.random());\n\t\t\t\tsetTimeout(() => attemptRecovery(attempt + 1), delay);\n\t\t\t});\n\t\t};\n\t\tattemptRecovery(1);\n\t}\n\t/**\n\t* Queries the remote GraphQL endpoint for sync envelopes.\n\t*/\n\tasync pollSyncEnvelopes(ackOrdinal, latestOrdinal) {\n\t\tconst query = `\n query PollSyncEnvelopes($channelId: String!, $outboxAck: Int!, $outboxLatest: Int!) {\n pollSyncEnvelopes(channelId: $channelId, outboxAck: $outboxAck, outboxLatest: $outboxLatest) {\n envelopes {\n type\n channelMeta {\n id\n }\n operations {\n operation {\n index\n timestampUtcMs\n hash\n skip\n error\n id\n action {\n id\n type\n timestampUtcMs\n input\n scope\n attachments {\n data\n mimeType\n hash\n extension\n fileName\n }\n context {\n signer {\n user {\n address\n networkId\n chainId\n }\n app {\n name\n key\n }\n signatures\n }\n }\n }\n }\n context {\n documentId\n documentType\n scope\n branch\n ordinal\n }\n }\n cursor {\n remoteName\n cursorOrdinal\n lastSyncedAtUtcMs\n }\n key\n dependsOn\n }\n ackOrdinal\n deadLetters {\n documentId\n error\n jobId\n branch\n scopes\n operationCount\n }\n hasMore\n }\n }\n `;\n\t\tconst variables = {\n\t\t\tchannelId: this.channelId,\n\t\t\toutboxAck: ackOrdinal,\n\t\t\toutboxLatest: latestOrdinal\n\t\t};\n\t\tconst response = await this.executeGraphQL(query, variables);\n\t\treturn {\n\t\t\tenvelopes: response.pollSyncEnvelopes.envelopes,\n\t\t\tackOrdinal: response.pollSyncEnvelopes.ackOrdinal,\n\t\t\tdeadLetters: response.pollSyncEnvelopes.deadLetters ?? [],\n\t\t\thasMore: response.pollSyncEnvelopes.hasMore\n\t\t};\n\t}\n\t/**\n\t* Registers or updates this channel on the remote server via GraphQL mutation.\n\t* Returns the remote's ack ordinal so the client can trim its outbox.\n\t*/\n\tasync touchRemoteChannel() {\n\t\tlet sinceTimestampUtcMs = \"0\";\n\t\ttry {\n\t\t\tconst result = await this.operationIndex.getLatestTimestampForCollection(this.config.collectionId);\n\t\t\tif (result) sinceTimestampUtcMs = result;\n\t\t} catch {}\n\t\tconst mutation = `\n mutation TouchChannel($input: TouchChannelInput!) {\n touchChannel(input: $input) {\n success\n ackOrdinal\n }\n }\n `;\n\t\tconst variables = { input: {\n\t\t\tid: this.channelId,\n\t\t\tname: this.channelId,\n\t\t\tcollectionId: this.config.collectionId,\n\t\t\tfilter: {\n\t\t\t\tdocumentId: this.config.filter.documentId,\n\t\t\t\tscope: this.config.filter.scope,\n\t\t\t\tbranch: this.config.filter.branch\n\t\t\t},\n\t\t\tsinceTimestampUtcMs\n\t\t} };\n\t\tconst data = await this.executeGraphQL(mutation, variables);\n\t\tif (!data.touchChannel.success) throw new GraphQLRequestError(\"touchChannel returned success=false\", \"graphql\");\n\t\treturn { ackOrdinal: data.touchChannel.ackOrdinal };\n\t}\n\t/**\n\t* Fire-and-forget push with retry on recoverable errors.\n\t* On success, clears push blocked state. On recoverable error, blocks\n\t* further pushes and schedules a retry. On unrecoverable error, moves\n\t* ops to deadLetter.\n\t*/\n\tattemptPush(syncOps) {\n\t\tthis.isPushing = true;\n\t\tthis.pushSyncOperations(syncOps).then(() => {\n\t\t\tthis.isPushing = false;\n\t\t\tthis.pushBlocked = false;\n\t\t\tthis.pushFailureCount = 0;\n\t\t\tif (this.connectionState === \"reconnecting\" || this.connectionState === \"error\") this.transitionConnectionState(\"connected\");\n\t\t\tthis.drainOutbox();\n\t\t}).catch((error) => {\n\t\t\tthis.isPushing = false;\n\t\t\tthis.pendingDrain = false;\n\t\t\tif (this.isShutdown) return;\n\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\tif (this.classifyError(err) === \"recoverable\") {\n\t\t\t\tthis.pushFailureCount++;\n\t\t\t\tthis.pushBlocked = true;\n\t\t\t\tthis.logger.error(\"GqlChannel push failed (attempt @FailureCount), will retry: @Error\", this.pushFailureCount, err);\n\t\t\t\tthis.transitionConnectionState(\"reconnecting\");\n\t\t\t\tthis.schedulePushRetry();\n\t\t\t} else {\n\t\t\t\tconst channelError = new ChannelError(ChannelErrorSource.Outbox, err);\n\t\t\t\tfor (const syncOp of syncOps) syncOp.failed(channelError);\n\t\t\t\tthis.deadLetter.add(...syncOps);\n\t\t\t\tthis.outbox.remove(...syncOps);\n\t\t\t\tthis.transitionConnectionState(\"error\");\n\t\t\t}\n\t\t});\n\t}\n\t/**\n\t* Schedules a retry of all current outbox items using exponential backoff.\n\t*/\n\tschedulePushRetry() {\n\t\tif (this.pushRetryTimer) return;\n\t\tconst delay = calculateBackoffDelay(this.pushFailureCount, this.config.retryBaseDelayMs, this.config.retryMaxDelayMs, Math.random());\n\t\tthis.pushRetryTimer = setTimeout(() => {\n\t\t\tthis.pushRetryTimer = null;\n\t\t\tif (this.isShutdown) return;\n\t\t\tconst allItems = this.outbox.items;\n\t\t\tif (allItems.length === 0) {\n\t\t\t\tthis.pushBlocked = false;\n\t\t\t\tthis.pushFailureCount = 0;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.attemptPush([...allItems]);\n\t\t}, delay);\n\t}\n\t/**\n\t* Drains pending outbox items that arrived while a push was in-flight.\n\t* Server-side action.id dedup handles any overlap with the previous push.\n\t*/\n\tdrainOutbox() {\n\t\tif (!this.pendingDrain) return;\n\t\tthis.pendingDrain = false;\n\t\tif (this.isShutdown) return;\n\t\tconst items = this.outbox.items;\n\t\tif (items.length === 0) return;\n\t\tthis.attemptPush([...items]);\n\t}\n\t/**\n\t* Classifies an error as recoverable or unrecoverable based on its type.\n\t* Recoverable errors are transient and worth retrying (network, 5xx, parse).\n\t* Unrecoverable errors will not self-heal (auth, client errors, GraphQL rejections).\n\t*/\n\tclassifyError(error) {\n\t\tif (!(error instanceof GraphQLRequestError)) return \"recoverable\";\n\t\tswitch (error.category) {\n\t\t\tcase \"network\": return \"recoverable\";\n\t\t\tcase \"http\":\n\t\t\t\tif (error.statusCode !== void 0 && error.statusCode >= 500) return \"recoverable\";\n\t\t\t\treturn \"unrecoverable\";\n\t\t\tcase \"parse\": return \"recoverable\";\n\t\t\tcase \"graphql\": return \"unrecoverable\";\n\t\t\tcase \"missing-data\": return \"unrecoverable\";\n\t\t}\n\t}\n\t/**\n\t* Pushes multiple sync operations to the remote via a single GraphQL mutation.\n\t* Creates one SyncEnvelope per SyncOperation with key/dependsOn for batch ordering.\n\t*/\n\tasync pushSyncOperations(syncOps) {\n\t\tfor (const syncOp of syncOps) syncOp.started();\n\t\tconst jobIdToKeys = /* @__PURE__ */ new Map();\n\t\tconst envelopes = [];\n\t\tfor (let i = 0; i < syncOps.length; i++) {\n\t\t\tconst syncOp = syncOps[i];\n\t\t\tconst key = String(i);\n\t\t\tif (syncOp.jobId) {\n\t\t\t\tif (!jobIdToKeys.has(syncOp.jobId)) jobIdToKeys.set(syncOp.jobId, []);\n\t\t\t\tjobIdToKeys.get(syncOp.jobId).push(key);\n\t\t\t}\n\t\t\tconst dependsOn = [];\n\t\t\tfor (const dep of syncOp.jobDependencies) {\n\t\t\t\tconst depKeys = jobIdToKeys.get(dep);\n\t\t\t\tif (depKeys) dependsOn.push(...depKeys);\n\t\t\t}\n\t\t\tthis.logger.debug(\"[PUSH]: @Operations\", syncOp.operations.map((op) => `(${op.context.documentId}, ${op.context.branch}, ${op.context.scope}, ${op.operation.index})`));\n\t\t\tenvelopes.push({\n\t\t\t\ttype: \"operations\",\n\t\t\t\tchannelMeta: { id: this.channelId },\n\t\t\t\toperations: syncOp.operations,\n\t\t\t\tkey,\n\t\t\t\tdependsOn\n\t\t\t});\n\t\t}\n\t\tconst mutation = `\n mutation PushSyncEnvelopes($envelopes: [SyncEnvelopeInput!]!) {\n pushSyncEnvelopes(envelopes: $envelopes)\n }\n `;\n\t\tconst variables = { envelopes: envelopes.map((e) => serializeEnvelope(e)) };\n\t\tawait this.executeGraphQL(mutation, variables);\n\t}\n\t/**\n\t* Gets the authorization header value using jwtHandler.\n\t*/\n\tasync getAuthorizationHeader() {\n\t\tif (!this.config.jwtHandler) return;\n\t\ttry {\n\t\t\tconst token = await this.config.jwtHandler(this.config.url);\n\t\t\tif (token) return `Bearer ${token}`;\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\"JWT handler failed: @Error\", error);\n\t\t}\n\t}\n\t/**\n\t* Executes a GraphQL query or mutation against the remote endpoint.\n\t*/\n\tasync executeGraphQL(query, variables) {\n\t\tconst headers = { \"Content-Type\": \"application/json\" };\n\t\tconst authHeader = await this.getAuthorizationHeader();\n\t\tif (authHeader) headers[\"Authorization\"] = authHeader;\n\t\tconst operationName = query.match(/(?:query|mutation)\\s+(\\w+)/)?.[1] ?? \"unknown\";\n\t\tthis.logger.verbose(\"GQL request @channelId @operation @url vars=@variables\", this.channelId, operationName, this.config.url, JSON.stringify(variables));\n\t\tconst fetchFn = this.config.fetchFn ?? fetch;\n\t\tlet response;\n\t\ttry {\n\t\t\tresponse = await fetchFn(this.config.url, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders,\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tquery,\n\t\t\t\t\tvariables\n\t\t\t\t}),\n\t\t\t\tsignal: this.abortController.signal\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthrow new GraphQLRequestError(`GraphQL request failed: ${error instanceof Error ? error.message : String(error)}`, \"network\");\n\t\t}\n\t\tif (!response.ok) throw new GraphQLRequestError(`GraphQL request failed: ${response.status} ${response.statusText}`, \"http\", response.status);\n\t\tlet result;\n\t\ttry {\n\t\t\tresult = await response.json();\n\t\t} catch (error) {\n\t\t\tthrow new GraphQLRequestError(`Failed to parse GraphQL response: ${error instanceof Error ? error.message : String(error)}`, \"parse\");\n\t\t}\n\t\tthis.logger.verbose(\"GQL response @channelId @operation status=@status data=@data errors=@errors\", this.channelId, operationName, response.status, JSON.stringify(result.data), result.errors ? JSON.stringify(result.errors) : \"none\");\n\t\tif (result.errors) throw new GraphQLRequestError(`GraphQL errors: ${JSON.stringify(result.errors, null, 2)}`, \"graphql\");\n\t\tif (!result.data) throw new GraphQLRequestError(\"GraphQL response missing data field\", \"missing-data\");\n\t\treturn result.data;\n\t}\n\tget poller() {\n\t\treturn this.pollTimer;\n\t}\n};\n//#endregion\n//#region src/sync/channels/gql-request-channel-factory.ts\n/**\n* Factory for creating GqlRequestChannel instances.\n*\n* Extracts GraphQL-specific configuration from ChannelConfig.parameters and\n* instantiates GqlRequestChannel instances for network-based synchronization.\n*\n* The optional jwtHandler enables dynamic JWT token generation per-request,\n* which is useful for short-lived tokens with audience-specific claims.\n*/\nvar GqlRequestChannelFactory = class {\n\tlogger;\n\tjwtHandler;\n\tqueue;\n\tconstructor(logger, jwtHandler, queue) {\n\t\tthis.logger = logger;\n\t\tthis.jwtHandler = jwtHandler;\n\t\tthis.queue = queue;\n\t}\n\t/**\n\t* Creates a new GqlRequestChannel instance with the given configuration.\n\t* See GqlChannelConfig for the expected parameters.\n\t*\n\t* @param config - Channel configuration including type and parameters\n\t* @param cursorStorage - Storage for persisting synchronization cursors\n\t* @param operationIndex - Operation index for querying timestamps\n\t* @returns A new GqlRequestChannel instance\n\t*/\n\tinstance(remoteId, remoteName, config, cursorStorage, collectionId, filter, operationIndex) {\n\t\tconst url = config.parameters.url;\n\t\tif (typeof url !== \"string\" || !url) throw new Error(\"GqlRequestChannelFactory requires \\\"url\\\" parameter in config.parameters\");\n\t\tconst gqlConfig = {\n\t\t\turl,\n\t\t\tcollectionId,\n\t\t\tfilter,\n\t\t\tjwtHandler: this.jwtHandler,\n\t\t\tretryBaseDelayMs: 1e3,\n\t\t\tretryMaxDelayMs: 3e5\n\t\t};\n\t\tlet pollIntervalMs = 2e3;\n\t\tif (config.parameters.pollIntervalMs !== void 0) {\n\t\t\tif (typeof config.parameters.pollIntervalMs !== \"number\") throw new Error(\"\\\"pollIntervalMs\\\" parameter must be a number\");\n\t\t\tpollIntervalMs = config.parameters.pollIntervalMs;\n\t\t}\n\t\tlet retryBaseDelayMs;\n\t\tif (config.parameters.retryBaseDelayMs !== void 0) {\n\t\t\tif (typeof config.parameters.retryBaseDelayMs !== \"number\") throw new Error(\"\\\"retryBaseDelayMs\\\" parameter must be a number\");\n\t\t\tretryBaseDelayMs = config.parameters.retryBaseDelayMs;\n\t\t}\n\t\tlet retryMaxDelayMs;\n\t\tif (config.parameters.retryMaxDelayMs !== void 0) {\n\t\t\tif (typeof config.parameters.retryMaxDelayMs !== \"number\") throw new Error(\"\\\"retryMaxDelayMs\\\" parameter must be a number\");\n\t\t\tretryMaxDelayMs = config.parameters.retryMaxDelayMs;\n\t\t}\n\t\tif (config.parameters.fetchFn !== void 0) {\n\t\t\tif (typeof config.parameters.fetchFn !== \"function\") throw new Error(\"\\\"fetchFn\\\" parameter must be a function\");\n\t\t\tgqlConfig.fetchFn = config.parameters.fetchFn;\n\t\t}\n\t\tif (retryBaseDelayMs !== void 0) gqlConfig.retryBaseDelayMs = retryBaseDelayMs;\n\t\tif (retryMaxDelayMs !== void 0) gqlConfig.retryMaxDelayMs = retryMaxDelayMs;\n\t\tlet maxQueueDepth;\n\t\tif (config.parameters.maxQueueDepth !== void 0) {\n\t\t\tif (typeof config.parameters.maxQueueDepth !== \"number\") throw new Error(\"\\\"maxQueueDepth\\\" parameter must be a number\");\n\t\t\tmaxQueueDepth = config.parameters.maxQueueDepth;\n\t\t}\n\t\tlet backpressureCheckIntervalMs;\n\t\tif (config.parameters.backpressureCheckIntervalMs !== void 0) {\n\t\t\tif (typeof config.parameters.backpressureCheckIntervalMs !== \"number\") throw new Error(\"\\\"backpressureCheckIntervalMs\\\" parameter must be a number\");\n\t\t\tbackpressureCheckIntervalMs = config.parameters.backpressureCheckIntervalMs;\n\t\t}\n\t\tconst pollTimer = new IntervalPollTimer(this.queue, {\n\t\t\tintervalMs: pollIntervalMs,\n\t\t\t...retryBaseDelayMs !== void 0 && { retryBaseDelayMs },\n\t\t\t...retryMaxDelayMs !== void 0 && { retryMaxDelayMs },\n\t\t\t...maxQueueDepth !== void 0 && { maxQueueDepth },\n\t\t\t...backpressureCheckIntervalMs !== void 0 && { backpressureCheckIntervalMs }\n\t\t});\n\t\treturn new GqlRequestChannel(this.logger, remoteId, remoteName, cursorStorage, gqlConfig, operationIndex, pollTimer);\n\t}\n};\n//#endregion\n//#region src/sync/channels/gql-res-channel.ts\n/**\n* This class is used server-side to accumulate inbox + outbox operations.\n*\n* In general, the resolvers are responsible for updating mailboxes.\n*/\nvar GqlResponseChannel = class {\n\tinbox;\n\toutbox;\n\tdeadLetter;\n\tchannelId;\n\tremoteName;\n\tcursorStorage;\n\tisShutdown;\n\tlastPersistedInboxOrdinal = 0;\n\tlastPersistedOutboxOrdinal = 0;\n\tconnectionState = \"connecting\";\n\tconnectionStateCallbacks = /* @__PURE__ */ new Set();\n\tconstructor(logger, channelId, remoteName, cursorStorage) {\n\t\tthis.logger = logger;\n\t\tthis.channelId = channelId;\n\t\tthis.remoteName = remoteName;\n\t\tthis.cursorStorage = cursorStorage;\n\t\tthis.isShutdown = false;\n\t\tthis.inbox = new Mailbox();\n\t\tthis.outbox = new Mailbox();\n\t\tthis.deadLetter = new Mailbox();\n\t\tthis.outbox.onRemoved((syncOps) => {\n\t\t\tconst maxOrdinal = getLatestAppliedOrdinal(syncOps);\n\t\t\tif (maxOrdinal > this.lastPersistedOutboxOrdinal) {\n\t\t\t\tthis.lastPersistedOutboxOrdinal = maxOrdinal;\n\t\t\t\tthis.cursorStorage.upsert({\n\t\t\t\t\tremoteName: this.remoteName,\n\t\t\t\t\tcursorType: \"outbox\",\n\t\t\t\t\tcursorOrdinal: maxOrdinal,\n\t\t\t\t\tlastSyncedAtUtcMs: Date.now()\n\t\t\t\t}).catch((error) => {\n\t\t\t\t\tthis.logger.error(\"Failed to update outbox cursor for @ChannelId! This means that future application runs may resend duplicate operations. This is recoverable (with deduplication protection), but not-optimal: @Error\", this.channelId, error);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tthis.inbox.onRemoved((syncOps) => {\n\t\t\tconst maxOrdinal = getLatestAppliedOrdinal(syncOps);\n\t\t\tif (maxOrdinal > this.lastPersistedInboxOrdinal) {\n\t\t\t\tthis.lastPersistedInboxOrdinal = maxOrdinal;\n\t\t\t\tthis.cursorStorage.upsert({\n\t\t\t\t\tremoteName: this.remoteName,\n\t\t\t\t\tcursorType: \"inbox\",\n\t\t\t\t\tcursorOrdinal: maxOrdinal,\n\t\t\t\t\tlastSyncedAtUtcMs: Date.now()\n\t\t\t\t}).catch((error) => {\n\t\t\t\t\tthis.logger.error(\"Failed to update inbox cursor for @ChannelId! This is unlikely to cause a problem, but not-optimal: @Error\", this.channelId, error);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\tshutdown() {\n\t\tthis.isShutdown = true;\n\t\tthis.transitionConnectionState(\"disconnected\");\n\t\treturn Promise.resolve();\n\t}\n\tgetConnectionState() {\n\t\treturn {\n\t\t\tstate: this.connectionState,\n\t\t\tfailureCount: 0,\n\t\t\tlastSuccessUtcMs: 0,\n\t\t\tlastFailureUtcMs: 0,\n\t\t\tpushBlocked: false,\n\t\t\tpushFailureCount: 0,\n\t\t\treceivingPages: false\n\t\t};\n\t}\n\tonConnectionStateChange(callback) {\n\t\tthis.connectionStateCallbacks.add(callback);\n\t\treturn () => {\n\t\t\tthis.connectionStateCallbacks.delete(callback);\n\t\t};\n\t}\n\ttransitionConnectionState(next) {\n\t\tif (this.connectionState === next) return;\n\t\tthis.connectionState = next;\n\t\tconst snapshot = this.getConnectionState();\n\t\tfor (const callback of this.connectionStateCallbacks) try {\n\t\t\tcallback(snapshot);\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\"Connection state change callback error: @Error\", error);\n\t\t}\n\t}\n\tasync init() {\n\t\tconst cursors = await this.cursorStorage.list(this.remoteName);\n\t\tconst inboxOrdinal = cursors.find((c) => c.cursorType === \"inbox\")?.cursorOrdinal ?? 0;\n\t\tconst outboxOrdinal = cursors.find((c) => c.cursorType === \"outbox\")?.cursorOrdinal ?? 0;\n\t\tthis.inbox.init(inboxOrdinal);\n\t\tthis.outbox.init(outboxOrdinal);\n\t\tthis.lastPersistedInboxOrdinal = inboxOrdinal;\n\t\tthis.lastPersistedOutboxOrdinal = outboxOrdinal;\n\t\tthis.transitionConnectionState(\"connected\");\n\t}\n};\n//#endregion\n//#region src/sync/channels/gql-response-channel-factory.ts\n/**\n* Factory for creating GqlResponseChannel instances.\n*/\nvar GqlResponseChannelFactory = class {\n\tlogger;\n\tconstructor(logger) {\n\t\tthis.logger = logger;\n\t}\n\tinstance(remoteId, remoteName, config, cursorStorage) {\n\t\treturn new GqlResponseChannel(this.logger, remoteId, remoteName, cursorStorage);\n\t}\n};\n//#endregion\n//#region src/storage/kysely/sync-cursor-storage.ts\nfunction rowToRemoteCursor(row) {\n\treturn {\n\t\tremoteName: row.remote_name,\n\t\tcursorType: row.cursor_type,\n\t\tcursorOrdinal: Number(row.cursor_ordinal),\n\t\tlastSyncedAtUtcMs: row.last_synced_at_utc_ms ? new Date(row.last_synced_at_utc_ms).getTime() : void 0\n\t};\n}\nfunction remoteCursorToRow(cursor) {\n\treturn {\n\t\tremote_name: cursor.remoteName,\n\t\tcursor_type: cursor.cursorType,\n\t\tcursor_ordinal: BigInt(cursor.cursorOrdinal),\n\t\tlast_synced_at_utc_ms: cursor.lastSyncedAtUtcMs ? new Date(cursor.lastSyncedAtUtcMs).toISOString() : null\n\t};\n}\nvar KyselySyncCursorStorage = class {\n\tconstructor(db) {\n\t\tthis.db = db;\n\t}\n\tasync list(remoteName, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst rows = await this.db.selectFrom(\"sync_cursors\").selectAll().where(\"remote_name\", \"=\", remoteName).execute();\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\treturn rows.map(rowToRemoteCursor);\n\t}\n\tasync get(remoteName, cursorType, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst row = await this.db.selectFrom(\"sync_cursors\").selectAll().where(\"remote_name\", \"=\", remoteName).where(\"cursor_type\", \"=\", cursorType).executeTakeFirst();\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tif (!row) return {\n\t\t\tremoteName,\n\t\t\tcursorType,\n\t\t\tcursorOrdinal: 0\n\t\t};\n\t\treturn rowToRemoteCursor(row);\n\t}\n\tasync upsert(cursor, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tawait this.db.transaction().execute(async (trx) => {\n\t\t\tconst insertable = remoteCursorToRow(cursor);\n\t\t\tawait trx.insertInto(\"sync_cursors\").values(insertable).onConflict((oc) => oc.columns([\"remote_name\", \"cursor_type\"]).doUpdateSet({\n\t\t\t\t...insertable,\n\t\t\t\tupdated_at: sql`NOW()`\n\t\t\t})).execute();\n\t\t});\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t}\n\tasync remove(remoteName, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tawait this.db.transaction().execute(async (trx) => {\n\t\t\tawait trx.deleteFrom(\"sync_cursors\").where(\"remote_name\", \"=\", remoteName).execute();\n\t\t});\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t}\n};\n//#endregion\n//#region src/storage/kysely/sync-dead-letter-storage.ts\nfunction rowToDeadLetterRecord(row) {\n\treturn {\n\t\tid: row.id,\n\t\tjobId: row.job_id,\n\t\tjobDependencies: row.job_dependencies,\n\t\tremoteName: row.remote_name,\n\t\tdocumentId: row.document_id,\n\t\tscopes: row.scopes,\n\t\tbranch: row.branch,\n\t\toperations: row.operations,\n\t\terrorSource: row.error_source,\n\t\terrorMessage: row.error_message\n\t};\n}\nfunction deadLetterRecordToRow(record) {\n\treturn {\n\t\tid: record.id,\n\t\tjob_id: record.jobId,\n\t\tjob_dependencies: JSON.stringify(record.jobDependencies),\n\t\tremote_name: record.remoteName,\n\t\tdocument_id: record.documentId,\n\t\tscopes: JSON.stringify(record.scopes),\n\t\tbranch: record.branch,\n\t\toperations: JSON.stringify(record.operations),\n\t\terror_source: record.errorSource,\n\t\terror_message: record.errorMessage\n\t};\n}\n/**\n* PGlite/Kysely-backed implementation of {@link ISyncDeadLetterStorage}.\n*/\nvar KyselySyncDeadLetterStorage = class {\n\tconstructor(db) {\n\t\tthis.db = db;\n\t}\n\tasync list(remoteName, paging, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst startIndex = paging?.cursor ? parseInt(paging.cursor) : 0;\n\t\tconst limit = paging?.limit || 100;\n\t\tconst rows = await this.db.selectFrom(\"sync_dead_letters\").selectAll().where(\"remote_name\", \"=\", remoteName).orderBy(\"ordinal\", \"desc\").offset(startIndex).limit(limit + 1).execute();\n\t\tlet hasMore = false;\n\t\tlet items = rows;\n\t\tif (paging?.limit && rows.length > limit) {\n\t\t\thasMore = true;\n\t\t\titems = rows.slice(0, limit);\n\t\t}\n\t\tconst nextCursor = hasMore ? String(startIndex + limit) : void 0;\n\t\tconst cursor = paging?.cursor || \"0\";\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\treturn {\n\t\t\tresults: items.map(rowToDeadLetterRecord),\n\t\t\toptions: {\n\t\t\t\tcursor,\n\t\t\t\tlimit\n\t\t\t},\n\t\t\tnextCursor\n\t\t};\n\t}\n\tasync add(deadLetter, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tawait this.db.transaction().execute(async (trx) => {\n\t\t\tconst insertable = deadLetterRecordToRow(deadLetter);\n\t\t\tawait trx.insertInto(\"sync_dead_letters\").values(insertable).onConflict((oc) => oc.column(\"id\").doNothing()).execute();\n\t\t});\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t}\n\tasync remove(id, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tawait this.db.transaction().execute(async (trx) => {\n\t\t\tawait trx.deleteFrom(\"sync_dead_letters\").where(\"id\", \"=\", id).execute();\n\t\t});\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t}\n\tasync removeByRemote(remoteName, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tawait this.db.transaction().execute(async (trx) => {\n\t\t\tawait trx.deleteFrom(\"sync_dead_letters\").where(\"remote_name\", \"=\", remoteName).execute();\n\t\t});\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t}\n\tasync listQuarantinedDocumentIds(signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst rows = await this.db.selectFrom(\"sync_dead_letters\").select(\"document_id\").distinct().execute();\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\treturn rows.map((row) => row.document_id);\n\t}\n};\n//#endregion\n//#region src/storage/kysely/sync-remote-storage.ts\nfunction rowToRemoteRecord(row) {\n\treturn {\n\t\tid: row.channel_id,\n\t\tname: row.name,\n\t\tcollectionId: row.collection_id,\n\t\tchannelConfig: {\n\t\t\ttype: row.channel_type,\n\t\t\tparameters: row.channel_parameters ?? {}\n\t\t},\n\t\tfilter: {\n\t\t\tdocumentId: row.filter_document_ids ?? [],\n\t\t\tscope: row.filter_scopes ?? [],\n\t\t\tbranch: row.filter_branch\n\t\t},\n\t\toptions: { sinceTimestampUtcMs: \"0\" },\n\t\tstatus: {\n\t\t\tpush: {\n\t\t\t\tstate: row.push_state,\n\t\t\t\tlastSuccessUtcMs: row.push_last_success_utc_ms ? new Date(row.push_last_success_utc_ms).getTime() : void 0,\n\t\t\t\tlastFailureUtcMs: row.push_last_failure_utc_ms ? new Date(row.push_last_failure_utc_ms).getTime() : void 0,\n\t\t\t\tfailureCount: row.push_failure_count\n\t\t\t},\n\t\t\tpull: {\n\t\t\t\tstate: row.pull_state,\n\t\t\t\tlastSuccessUtcMs: row.pull_last_success_utc_ms ? new Date(row.pull_last_success_utc_ms).getTime() : void 0,\n\t\t\t\tlastFailureUtcMs: row.pull_last_failure_utc_ms ? new Date(row.pull_last_failure_utc_ms).getTime() : void 0,\n\t\t\t\tfailureCount: row.pull_failure_count\n\t\t\t}\n\t\t}\n\t};\n}\nfunction remoteRecordToRow(remote) {\n\treturn {\n\t\tname: remote.name,\n\t\tcollection_id: remote.collectionId,\n\t\tchannel_type: remote.channelConfig.type,\n\t\tchannel_id: remote.id,\n\t\tremote_name: remote.name,\n\t\tchannel_parameters: remote.channelConfig.parameters,\n\t\tfilter_document_ids: remote.filter.documentId.length > 0 ? remote.filter.documentId : null,\n\t\tfilter_scopes: remote.filter.scope.length > 0 ? remote.filter.scope : null,\n\t\tfilter_branch: remote.filter.branch,\n\t\tpush_state: remote.status.push.state,\n\t\tpush_last_success_utc_ms: remote.status.push.lastSuccessUtcMs ? new Date(remote.status.push.lastSuccessUtcMs).toISOString() : null,\n\t\tpush_last_failure_utc_ms: remote.status.push.lastFailureUtcMs ? new Date(remote.status.push.lastFailureUtcMs).toISOString() : null,\n\t\tpush_failure_count: remote.status.push.failureCount,\n\t\tpull_state: remote.status.pull.state,\n\t\tpull_last_success_utc_ms: remote.status.pull.lastSuccessUtcMs ? new Date(remote.status.pull.lastSuccessUtcMs).toISOString() : null,\n\t\tpull_last_failure_utc_ms: remote.status.pull.lastFailureUtcMs ? new Date(remote.status.pull.lastFailureUtcMs).toISOString() : null,\n\t\tpull_failure_count: remote.status.pull.failureCount\n\t};\n}\nvar KyselySyncRemoteStorage = class {\n\tconstructor(db) {\n\t\tthis.db = db;\n\t}\n\tasync list(signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst rows = await this.db.selectFrom(\"sync_remotes\").selectAll().execute();\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\treturn rows.map(rowToRemoteRecord);\n\t}\n\tasync get(name, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tconst row = await this.db.selectFrom(\"sync_remotes\").selectAll().where(\"name\", \"=\", name).executeTakeFirst();\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tif (!row) throw new Error(`Remote not found: ${name}`);\n\t\treturn rowToRemoteRecord(row);\n\t}\n\tasync upsert(remote, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tawait this.db.transaction().execute(async (trx) => {\n\t\t\tconst insertable = remoteRecordToRow(remote);\n\t\t\tawait trx.insertInto(\"sync_remotes\").values(insertable).onConflict((oc) => oc.column(\"name\").doUpdateSet({\n\t\t\t\t...insertable,\n\t\t\t\tupdated_at: sql`NOW()`\n\t\t\t})).execute();\n\t\t});\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t}\n\tasync remove(name, signal) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\tawait this.db.transaction().execute(async (trx) => {\n\t\t\tawait trx.deleteFrom(\"sync_remotes\").where(\"name\", \"=\", name).execute();\n\t\t});\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t}\n};\n//#endregion\n//#region src/sync/batch-aggregator.ts\nvar BatchAggregator = class {\n\tlogger;\n\tonBatchReady;\n\tqueue = [];\n\tprocessing = false;\n\tpendingBatches = /* @__PURE__ */ new Map();\n\tconstructor(logger, onBatchReady) {\n\t\tthis.logger = logger;\n\t\tthis.onBatchReady = onBatchReady;\n\t}\n\tasync enqueueWriteReady(event) {\n\t\tthis.queue.push(event);\n\t\tawait this.processQueue();\n\t}\n\tasync handleJobFailed(event) {\n\t\tconst batchId = event.job?.meta.batchId;\n\t\tif (!batchId) return;\n\t\tconst pending = this.pendingBatches.get(batchId);\n\t\tif (!pending) return;\n\t\tthis.pendingBatches.delete(batchId);\n\t\tif (pending.events.length > 0) await this.onBatchReady(this.prepareBatch(pending.events));\n\t}\n\tclear() {\n\t\tthis.queue = [];\n\t\tthis.pendingBatches.clear();\n\t}\n\tasync processQueue() {\n\t\tif (this.processing) return;\n\t\tthis.processing = true;\n\t\ttry {\n\t\t\twhile (this.queue.length > 0) {\n\t\t\t\tconst event = this.queue.shift();\n\t\t\t\ttry {\n\t\t\t\t\tawait this.handleWriteReady(event);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\tthis.logger.error(\"Failed to process write-ready event (@jobId, @error)\", event.jobId, err.message);\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.processing = false;\n\t\t}\n\t}\n\tasync handleWriteReady(event) {\n\t\tconst { batchId, batchJobIds } = event.jobMeta;\n\t\tif (batchJobIds.length <= 1) {\n\t\t\tawait this.onBatchReady(this.prepareBatch([event]));\n\t\t\treturn;\n\t\t}\n\t\tlet pending = this.pendingBatches.get(batchId);\n\t\tif (!pending) {\n\t\t\tpending = {\n\t\t\t\texpectedJobIds: new Set(batchJobIds),\n\t\t\t\tarrivedJobIds: /* @__PURE__ */ new Set(),\n\t\t\t\tevents: []\n\t\t\t};\n\t\t\tthis.pendingBatches.set(batchId, pending);\n\t\t}\n\t\tpending.arrivedJobIds.add(event.jobId);\n\t\tpending.events.push(event);\n\t\tif (pending.arrivedJobIds.size >= pending.expectedJobIds.size) {\n\t\t\tthis.pendingBatches.delete(batchId);\n\t\t\tawait this.onBatchReady(this.prepareBatch(pending.events));\n\t\t}\n\t}\n\tprepareBatch(events) {\n\t\tconst collectionMemberships = mergeCollectionMemberships(events);\n\t\tconst isBatch = events.length > 1;\n\t\tconst priorJobIds = [];\n\t\tconst entries = [];\n\t\tfor (const event of events) {\n\t\t\tentries.push({\n\t\t\t\tevent,\n\t\t\t\tjobDependencies: isBatch ? [...priorJobIds] : []\n\t\t\t});\n\t\t\tif (isBatch && event.jobId) priorJobIds.push(event.jobId);\n\t\t}\n\t\treturn {\n\t\t\tcollectionMemberships,\n\t\t\tentries\n\t\t};\n\t}\n};\n//#endregion\n//#region src/sync/sync-awaiter.ts\n/**\n* Provides a promise-based interface for waiting on sync completion.\n* Subscribes to sync events at construction and tracks completed sync results\n* to provide a fast path for jobs that have already synced.\n*/\nvar SyncAwaiter = class {\n\tcompletedResults = /* @__PURE__ */ new Map();\n\tpendingWaiters = /* @__PURE__ */ new Map();\n\tunsubscribers = [];\n\tisShutdown = false;\n\tconstructor(eventBus) {\n\t\tthis.eventBus = eventBus;\n\t\tthis.subscribeToEvents();\n\t}\n\t/**\n\t* Waits for sync operations for a job to complete.\n\t* Resolves when SYNC_SUCCEEDED is emitted.\n\t* Rejects when SYNC_FAILED is emitted.\n\t*\n\t* @param jobId - The job id to wait for\n\t* @param signal - Optional abort signal\n\t* @returns The sync result\n\t*/\n\twaitForSync(jobId, signal) {\n\t\tif (signal?.aborted) return Promise.reject(/* @__PURE__ */ new Error(\"Operation aborted\"));\n\t\tif (this.isShutdown) return Promise.reject(/* @__PURE__ */ new Error(\"SyncAwaiter is shutdown\"));\n\t\tconst completedResult = this.completedResults.get(jobId);\n\t\tif (completedResult) return Promise.resolve(completedResult);\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst waiter = {\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t\tsignal\n\t\t\t};\n\t\t\tconst existingWaiters = this.pendingWaiters.get(jobId) || [];\n\t\t\texistingWaiters.push(waiter);\n\t\t\tthis.pendingWaiters.set(jobId, existingWaiters);\n\t\t\tif (signal) {\n\t\t\t\tconst abortHandler = () => {\n\t\t\t\t\tconst waiters = this.pendingWaiters.get(jobId);\n\t\t\t\t\tif (waiters) {\n\t\t\t\t\t\tconst index = waiters.indexOf(waiter);\n\t\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\t\twaiters.splice(index, 1);\n\t\t\t\t\t\t\tif (waiters.length === 0) this.pendingWaiters.delete(jobId);\n\t\t\t\t\t\t\twaiter.reject(/* @__PURE__ */ new Error(\"Operation aborted\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tsignal.addEventListener(\"abort\", abortHandler, { once: true });\n\t\t\t}\n\t\t});\n\t}\n\t/**\n\t* Shuts down the sync awaiter. This will synchronously reject all pending waiters.\n\t*/\n\tshutdown() {\n\t\tthis.isShutdown = true;\n\t\tfor (const unsubscribe of this.unsubscribers) unsubscribe();\n\t\tthis.unsubscribers.length = 0;\n\t\tfor (const [, waiters] of this.pendingWaiters) for (const waiter of waiters) waiter.reject(/* @__PURE__ */ new Error(\"SyncAwaiter shutdown\"));\n\t\tthis.pendingWaiters.clear();\n\t}\n\tsubscribeToEvents() {\n\t\tthis.unsubscribers.push(this.eventBus.subscribe(SyncEventTypes.SYNC_SUCCEEDED, (_type, event) => {\n\t\t\tthis.handleSyncSucceeded(event);\n\t\t}));\n\t\tthis.unsubscribers.push(this.eventBus.subscribe(SyncEventTypes.SYNC_FAILED, (_type, event) => {\n\t\t\tthis.handleSyncFailed(event);\n\t\t}));\n\t}\n\thandleSyncSucceeded(event) {\n\t\tconst result = {\n\t\t\tjobId: event.jobId,\n\t\t\tstatus: \"succeeded\",\n\t\t\tsyncOperationCount: event.syncOperationCount,\n\t\t\tsuccessCount: event.syncOperationCount,\n\t\t\tfailureCount: 0,\n\t\t\terrors: []\n\t\t};\n\t\tthis.completedResults.set(event.jobId, result);\n\t\tthis.resolveWaiters(event.jobId, result);\n\t}\n\thandleSyncFailed(event) {\n\t\tconst result = {\n\t\t\tjobId: event.jobId,\n\t\t\tstatus: \"failed\",\n\t\t\tsyncOperationCount: event.successCount + event.failureCount,\n\t\t\tsuccessCount: event.successCount,\n\t\t\tfailureCount: event.failureCount,\n\t\t\terrors: event.errors\n\t\t};\n\t\tthis.completedResults.set(event.jobId, result);\n\t\tthis.resolveWaiters(event.jobId, result);\n\t}\n\tresolveWaiters(jobId, result) {\n\t\tconst waiters = this.pendingWaiters.get(jobId);\n\t\tif (!waiters || waiters.length === 0) return;\n\t\tthis.pendingWaiters.delete(jobId);\n\t\tfor (const waiter of waiters) if (waiter.signal?.aborted) waiter.reject(/* @__PURE__ */ new Error(\"Operation aborted\"));\n\t\telse waiter.resolve(result);\n\t}\n};\n//#endregion\n//#region src/sync/sync-status-tracker.ts\nlet SyncStatus = /* @__PURE__ */ function(SyncStatus) {\n\tSyncStatus[\"Synced\"] = \"SYNCED\";\n\tSyncStatus[\"Outgoing\"] = \"OUTGOING\";\n\tSyncStatus[\"Incoming\"] = \"INCOMING\";\n\tSyncStatus[\"OutgoingAndIncoming\"] = \"OUTGOING_AND_INCOMING\";\n\tSyncStatus[\"Error\"] = \"ERROR\";\n\treturn SyncStatus;\n}({});\nvar SyncStatusTracker = class {\n\tremotes = /* @__PURE__ */ new Map();\n\tseen = /* @__PURE__ */ new Set();\n\tcallbacks = /* @__PURE__ */ new Set();\n\tgetStatus(documentId) {\n\t\tif (!this.seen.has(documentId)) return;\n\t\tlet totalInbox = 0;\n\t\tlet totalOutbox = 0;\n\t\tlet totalErrors = 0;\n\t\tfor (const documents of this.remotes.values()) {\n\t\t\tconst counts = documents.get(documentId);\n\t\t\tif (counts) {\n\t\t\t\ttotalInbox += counts.inboxCount;\n\t\t\t\ttotalOutbox += counts.outboxCount;\n\t\t\t\ttotalErrors += counts.errorCount;\n\t\t\t}\n\t\t}\n\t\treturn deriveStatus(totalInbox, totalOutbox, totalErrors);\n\t}\n\tonChange(callback) {\n\t\tthis.callbacks.add(callback);\n\t\treturn () => {\n\t\t\tthis.callbacks.delete(callback);\n\t\t};\n\t}\n\ttrackRemote(remoteName, channel) {\n\t\tthis.remotes.set(remoteName, /* @__PURE__ */ new Map());\n\t\tchannel.inbox.onAdded((syncOps) => this.handleAdded(remoteName, \"inbox\", syncOps));\n\t\tchannel.inbox.onRemoved((syncOps) => this.handleRemoved(remoteName, \"inbox\", syncOps));\n\t\tchannel.outbox.onAdded((syncOps) => this.handleAdded(remoteName, \"outbox\", syncOps));\n\t\tchannel.outbox.onRemoved((syncOps) => this.handleRemoved(remoteName, \"outbox\", syncOps));\n\t\tchannel.deadLetter.onAdded((syncOps) => this.handleAdded(remoteName, \"deadLetter\", syncOps));\n\t}\n\tuntrackRemote(remoteName) {\n\t\tconst documents = this.remotes.get(remoteName);\n\t\tif (!documents) return;\n\t\tconst affectedDocumentIds = [...documents.keys()];\n\t\tthis.remotes.delete(remoteName);\n\t\tfor (const documentId of affectedDocumentIds) this.notifyChange(documentId);\n\t}\n\tclear() {\n\t\tthis.remotes.clear();\n\t\tthis.seen.clear();\n\t\tthis.callbacks.clear();\n\t}\n\thandleAdded(remoteName, mailboxType, syncOps) {\n\t\tconst changedDocuments = /* @__PURE__ */ new Set();\n\t\tfor (const syncOp of syncOps) {\n\t\t\tif (mailboxType === \"inbox\" && !syncOp.remoteName) continue;\n\t\t\tconst counts = this.getOrCreateCounts(remoteName, syncOp.documentId);\n\t\t\tthis.seen.add(syncOp.documentId);\n\t\t\tif (mailboxType === \"inbox\") counts.inboxCount++;\n\t\t\telse if (mailboxType === \"outbox\") counts.outboxCount++;\n\t\t\telse counts.errorCount++;\n\t\t\tchangedDocuments.add(syncOp.documentId);\n\t\t}\n\t\tfor (const documentId of changedDocuments) this.notifyChange(documentId);\n\t}\n\thandleRemoved(remoteName, mailboxType, syncOps) {\n\t\tconst changedDocuments = /* @__PURE__ */ new Set();\n\t\tfor (const syncOp of syncOps) {\n\t\t\tconst counts = this.getOrCreateCounts(remoteName, syncOp.documentId);\n\t\t\tif (mailboxType === \"inbox\") counts.inboxCount = Math.max(0, counts.inboxCount - 1);\n\t\t\telse if (mailboxType === \"outbox\") counts.outboxCount = Math.max(0, counts.outboxCount - 1);\n\t\t\tchangedDocuments.add(syncOp.documentId);\n\t\t}\n\t\tfor (const documentId of changedDocuments) this.notifyChange(documentId);\n\t}\n\tgetOrCreateCounts(remoteName, documentId) {\n\t\tlet documents = this.remotes.get(remoteName);\n\t\tif (!documents) {\n\t\t\tdocuments = /* @__PURE__ */ new Map();\n\t\t\tthis.remotes.set(remoteName, documents);\n\t\t}\n\t\tlet counts = documents.get(documentId);\n\t\tif (!counts) {\n\t\t\tcounts = {\n\t\t\t\tinboxCount: 0,\n\t\t\t\toutboxCount: 0,\n\t\t\t\terrorCount: 0\n\t\t\t};\n\t\t\tdocuments.set(documentId, counts);\n\t\t}\n\t\treturn counts;\n\t}\n\tnotifyChange(documentId) {\n\t\tconst status = this.getStatus(documentId);\n\t\tif (status === void 0) return;\n\t\tfor (const callback of [...this.callbacks]) callback(documentId, status);\n\t}\n};\nfunction deriveStatus(inboxCount, outboxCount, errorCount) {\n\tif (errorCount > 0) return SyncStatus.Error;\n\tif (inboxCount > 0 && outboxCount > 0) return SyncStatus.OutgoingAndIncoming;\n\tif (inboxCount > 0) return SyncStatus.Incoming;\n\tif (outboxCount > 0) return SyncStatus.Outgoing;\n\treturn SyncStatus.Synced;\n}\n//#endregion\n//#region src/sync/sync-manager.ts\nvar OutboxMode = /* @__PURE__ */ function(OutboxMode) {\n\tOutboxMode[\"Backfill\"] = \"backfill\";\n\tOutboxMode[\"BatchTriggered\"] = \"batch-triggered\";\n\treturn OutboxMode;\n}(OutboxMode || {});\nconst defaultSyncManagerConfig = {\n\tmaxDeadLettersPerRemote: 100,\n\tmaxInboxBatchSize: 32\n};\nvar SyncManager = class {\n\tlogger;\n\tremoteStorage;\n\tcursorStorage;\n\tdeadLetterStorage;\n\tchannelFactory;\n\toperationIndex;\n\treactor;\n\teventBus;\n\tremotes;\n\tawaiter;\n\tsyncAwaiter;\n\tabortController = new AbortController();\n\tisShutdown;\n\teventUnsubscribe;\n\tfailedEventUnsubscribe;\n\tbatchAggregator;\n\tsyncStatusTracker;\n\tconfig;\n\tconnectionStateUnsubscribes = /* @__PURE__ */ new Map();\n\tquarantinedDocumentIds = /* @__PURE__ */ new Set();\n\tbackfillAbortControllers = /* @__PURE__ */ new Map();\n\tconstructor(logger, remoteStorage, cursorStorage, deadLetterStorage, channelFactory, operationIndex, reactor, eventBus, config = {}) {\n\t\tthis.logger = logger;\n\t\tthis.remoteStorage = remoteStorage;\n\t\tthis.cursorStorage = cursorStorage;\n\t\tthis.deadLetterStorage = deadLetterStorage;\n\t\tthis.channelFactory = channelFactory;\n\t\tthis.operationIndex = operationIndex;\n\t\tthis.reactor = reactor;\n\t\tthis.eventBus = eventBus;\n\t\tthis.config = {\n\t\t\t...defaultSyncManagerConfig,\n\t\t\t...config\n\t\t};\n\t\tthis.remotes = /* @__PURE__ */ new Map();\n\t\tthis.awaiter = new JobAwaiter(eventBus, (jobId, signal) => reactor.getJobStatus(jobId, signal));\n\t\tthis.syncAwaiter = new SyncAwaiter(eventBus);\n\t\tthis.isShutdown = false;\n\t\tthis.batchAggregator = new BatchAggregator(logger, (batch) => this.processCompleteBatch(batch));\n\t\tthis.syncStatusTracker = new SyncStatusTracker();\n\t}\n\tasync startup() {\n\t\tif (this.isShutdown) throw new Error(\"SyncManager is already shutdown and cannot be started\");\n\t\ttry {\n\t\t\tconst quarantinedIds = await this.deadLetterStorage.listQuarantinedDocumentIds();\n\t\t\tfor (const id of quarantinedIds) this.quarantinedDocumentIds.add(id);\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\"Failed to load quarantined document IDs (@error)\", error instanceof Error ? error.message : String(error));\n\t\t}\n\t\tconst remoteRecords = await this.remoteStorage.list();\n\t\tfor (const record of remoteRecords) {\n\t\t\tconst channel = this.channelFactory.instance(record.id, record.name, record.channelConfig, this.cursorStorage, record.collectionId, record.filter, this.operationIndex);\n\t\t\tconst remote = {\n\t\t\t\tid: record.id,\n\t\t\t\tname: record.name,\n\t\t\t\tcollectionId: record.collectionId,\n\t\t\t\tfilter: record.filter,\n\t\t\t\toptions: record.options,\n\t\t\t\tchannel\n\t\t\t};\n\t\t\tthis.remotes.set(record.name, remote);\n\t\t\tawait this.loadDeadLetters(remote);\n\t\t\tthis.wireChannelCallbacks(remote);\n\t\t\ttry {\n\t\t\t\tawait channel.init();\n\t\t\t} catch (error) {\n\t\t\t\tthis.logger.error(\"Error initializing channel for remote (@name, @error)\", record.name, error instanceof Error ? error.message : String(error));\n\t\t\t\tthis.remotes.delete(record.name);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst outboxAckOrdinal = remote.channel.outbox.ackOrdinal;\n\t\t\tif (outboxAckOrdinal > 0) {\n\t\t\t\tconst backfillController = new AbortController();\n\t\t\t\tthis.backfillAbortControllers.set(record.name, backfillController);\n\t\t\t\tthis.updateOutbox(remote, outboxAckOrdinal, OutboxMode.Backfill, backfillController.signal).catch((error) => {\n\t\t\t\t\tif (backfillController.signal.aborted) return;\n\t\t\t\t\tthis.logger.error(\"Backfill failed for remote @RemoteName: @Error\", remote.name, error instanceof Error ? error : new Error(String(error)));\n\t\t\t\t}).finally(() => {\n\t\t\t\t\tthis.backfillAbortControllers.delete(record.name);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tthis.eventUnsubscribe = this.eventBus.subscribe(ReactorEventTypes.JOB_WRITE_READY, async (_type, event) => this.batchAggregator.enqueueWriteReady(event));\n\t\tthis.failedEventUnsubscribe = this.eventBus.subscribe(ReactorEventTypes.JOB_FAILED, async (_type, event) => this.batchAggregator.handleJobFailed(event));\n\t}\n\tshutdown() {\n\t\tthis.isShutdown = true;\n\t\tthis.abortController.abort();\n\t\tfor (const controller of this.backfillAbortControllers.values()) controller.abort();\n\t\tthis.backfillAbortControllers.clear();\n\t\tthis.batchAggregator.clear();\n\t\tif (this.eventUnsubscribe) {\n\t\t\tthis.eventUnsubscribe();\n\t\t\tthis.eventUnsubscribe = void 0;\n\t\t}\n\t\tif (this.failedEventUnsubscribe) {\n\t\t\tthis.failedEventUnsubscribe();\n\t\t\tthis.failedEventUnsubscribe = void 0;\n\t\t}\n\t\tthis.awaiter.shutdown();\n\t\tthis.syncAwaiter.shutdown();\n\t\tthis.syncStatusTracker.clear();\n\t\tfor (const unsub of this.connectionStateUnsubscribes.values()) unsub();\n\t\tthis.connectionStateUnsubscribes.clear();\n\t\tconst promises = [];\n\t\tfor (const remote of this.remotes.values()) promises.push(remote.channel.shutdown());\n\t\tthis.remotes.clear();\n\t\treturn {\n\t\t\tisShutdown: true,\n\t\t\tcompleted: Promise.all(promises).then(() => void 0)\n\t\t};\n\t}\n\tgetByName(name) {\n\t\tconst remote = this.remotes.get(name);\n\t\tif (!remote) throw new Error(`Remote with name '${name}' does not exist`);\n\t\treturn remote;\n\t}\n\tgetById(id) {\n\t\tfor (const remote of this.remotes.values()) if (remote.id === id) return remote;\n\t\tthrow new Error(`Remote with id '${id}' does not exist`);\n\t}\n\tasync add(name, collectionId, channelConfig, filter = {\n\t\tdocumentId: [],\n\t\tscope: [],\n\t\tbranch: \"\"\n\t}, options = { sinceTimestampUtcMs: \"0\" }, id) {\n\t\tif (this.isShutdown) throw new Error(\"SyncManager is shutdown and cannot add remotes\");\n\t\tif (this.remotes.has(name)) throw new Error(`Remote with name '${name}' already exists`);\n\t\tthis.logger.debug(\"Adding remote (@name, @collectionId, @channelConfig, @filter, @options, @id)\", name, collectionId, channelConfig, filter, options, id);\n\t\tconst remoteId = id ?? crypto.randomUUID();\n\t\tconst remoteRecord = {\n\t\t\tid: remoteId,\n\t\t\tname,\n\t\t\tcollectionId,\n\t\t\tchannelConfig,\n\t\t\tfilter,\n\t\t\toptions,\n\t\t\tstatus: {\n\t\t\t\tpush: createIdleHealth(),\n\t\t\t\tpull: createIdleHealth()\n\t\t\t}\n\t\t};\n\t\tawait this.remoteStorage.upsert(remoteRecord);\n\t\tconst channel = this.channelFactory.instance(remoteId, name, channelConfig, this.cursorStorage, collectionId, filter, this.operationIndex);\n\t\tconst remote = {\n\t\t\tid: remoteId,\n\t\t\tname,\n\t\t\tcollectionId,\n\t\t\tfilter,\n\t\t\toptions,\n\t\t\tchannel\n\t\t};\n\t\tthis.remotes.set(name, remote);\n\t\tawait this.loadDeadLetters(remote);\n\t\tthis.wireChannelCallbacks(remote);\n\t\ttry {\n\t\t\tawait channel.init();\n\t\t} catch (error) {\n\t\t\tthis.remotes.delete(name);\n\t\t\tawait this.remoteStorage.remove(name);\n\t\t\tthrow error;\n\t\t}\n\t\tconst backfillController = new AbortController();\n\t\tthis.backfillAbortControllers.set(name, backfillController);\n\t\tthis.updateOutbox(remote, 0, OutboxMode.Backfill, backfillController.signal).catch((error) => {\n\t\t\tif (backfillController.signal.aborted) return;\n\t\t\tthis.logger.error(\"Backfill failed for remote @RemoteName: @Error\", remote.name, error instanceof Error ? error : new Error(String(error)));\n\t\t}).finally(() => {\n\t\t\tthis.backfillAbortControllers.delete(name);\n\t\t});\n\t\treturn remote;\n\t}\n\tasync remove(name) {\n\t\tconst remote = this.remotes.get(name);\n\t\tif (!remote) throw new Error(`Remote with name '${name}' does not exist`);\n\t\tconst backfillController = this.backfillAbortControllers.get(name);\n\t\tif (backfillController) {\n\t\t\tbackfillController.abort();\n\t\t\tthis.backfillAbortControllers.delete(name);\n\t\t}\n\t\tawait remote.channel.shutdown();\n\t\tawait this.remoteStorage.remove(name);\n\t\tawait this.cursorStorage.remove(name);\n\t\tthis.syncStatusTracker.untrackRemote(name);\n\t\tconst unsub = this.connectionStateUnsubscribes.get(name);\n\t\tif (unsub) {\n\t\t\tunsub();\n\t\t\tthis.connectionStateUnsubscribes.delete(name);\n\t\t}\n\t\tthis.remotes.delete(name);\n\t}\n\tlist() {\n\t\treturn Array.from(this.remotes.values());\n\t}\n\twaitForSync(jobId, signal) {\n\t\treturn this.syncAwaiter.waitForSync(jobId, signal);\n\t}\n\tgetSyncStatus(documentId) {\n\t\treturn this.syncStatusTracker.getStatus(documentId);\n\t}\n\tonSyncStatusChange(callback) {\n\t\treturn this.syncStatusTracker.onChange(callback);\n\t}\n\twireChannelCallbacks(remote) {\n\t\tremote.channel.inbox.onAdded((syncOps) => this.handleInboxAdded(remote, syncOps));\n\t\tthis.syncStatusTracker.trackRemote(remote.name, remote.channel);\n\t\tconst unsubscribe = remote.channel.onConnectionStateChange((snapshot) => {\n\t\t\tthis.eventBus.emit(SyncEventTypes.CONNECTION_STATE_CHANGED, {\n\t\t\t\tremoteName: remote.name,\n\t\t\t\tremoteId: remote.id,\n\t\t\t\tprevious: snapshot.state,\n\t\t\t\tcurrent: snapshot.state,\n\t\t\t\tsnapshot\n\t\t\t}).catch(() => {});\n\t\t});\n\t\tthis.connectionStateUnsubscribes.set(remote.name, unsubscribe);\n\t\tremote.channel.deadLetter.onAdded((syncOps) => {\n\t\t\tfor (const syncOp of syncOps) {\n\t\t\t\tthis.logger.error(\"Dead letter (@remote, @documentId, @jobId, @error, @dependencies)\", remote.name, syncOp.documentId, syncOp.jobId, syncOp.error?.message ?? \"unknown\", syncOp.jobDependencies);\n\t\t\t\tthis.quarantinedDocumentIds.add(syncOp.documentId);\n\t\t\t\tconst record = {\n\t\t\t\t\tid: syncOp.id,\n\t\t\t\t\tjobId: syncOp.jobId,\n\t\t\t\t\tjobDependencies: syncOp.jobDependencies,\n\t\t\t\t\tremoteName: syncOp.remoteName,\n\t\t\t\t\tdocumentId: syncOp.documentId,\n\t\t\t\t\tscopes: syncOp.scopes,\n\t\t\t\t\tbranch: syncOp.branch,\n\t\t\t\t\toperations: syncOp.operations,\n\t\t\t\t\terrorSource: syncOp.error?.source ?? ChannelErrorSource.None,\n\t\t\t\t\terrorMessage: syncOp.error?.error.message ?? \"unknown\"\n\t\t\t\t};\n\t\t\t\tthis.deadLetterStorage.add(record).catch((err) => {\n\t\t\t\t\tthis.logger.error(\"Failed to persist dead letter (@id, @error)\", record.id, err instanceof Error ? err.message : String(err));\n\t\t\t\t});\n\t\t\t\tthis.eventBus.emit(SyncEventTypes.DEAD_LETTER_ADDED, {\n\t\t\t\t\tid: record.id,\n\t\t\t\t\tjobId: record.jobId,\n\t\t\t\t\tremoteName: record.remoteName,\n\t\t\t\t\tdocumentId: record.documentId,\n\t\t\t\t\terrorSource: record.errorSource\n\t\t\t\t}).catch(() => {});\n\t\t\t}\n\t\t\tconst items = remote.channel.deadLetter.items;\n\t\t\tif (items.length > this.config.maxDeadLettersPerRemote) {\n\t\t\t\tconst excessCount = items.length - this.config.maxDeadLettersPerRemote;\n\t\t\t\tconst toEvict = items.slice(0, excessCount);\n\t\t\t\tremote.channel.deadLetter.remove(...toEvict);\n\t\t\t}\n\t\t});\n\t}\n\tasync loadDeadLetters(remote) {\n\t\tlet records;\n\t\ttry {\n\t\t\trecords = (await this.deadLetterStorage.list(remote.name, {\n\t\t\t\tcursor: \"0\",\n\t\t\t\tlimit: this.config.maxDeadLettersPerRemote\n\t\t\t})).results;\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\"Failed to load dead letters for remote (@name, @error)\", remote.name, error instanceof Error ? error.message : String(error));\n\t\t\treturn;\n\t\t}\n\t\tif (records.length === 0) return;\n\t\trecords.reverse();\n\t\tconst syncOps = [];\n\t\tfor (const record of records) {\n\t\t\tconst syncOp = new SyncOperation(record.id, record.jobId, record.jobDependencies, record.remoteName, record.documentId, record.scopes, record.branch, record.operations);\n\t\t\tsyncOp.failed(new ChannelError(record.errorSource, new Error(record.errorMessage)));\n\t\t\tsyncOps.push(syncOp);\n\t\t}\n\t\tremote.channel.deadLetter.add(...syncOps);\n\t\tthis.logger.debug(\"Loaded @count persisted dead letters for remote @name\", records.length, remote.name);\n\t}\n\tgetRemotesForCollection(collectionId) {\n\t\treturn Array.from(this.remotes.values()).filter((remote) => remote.collectionId === collectionId);\n\t}\n\tasync processCompleteBatch(batch) {\n\t\tif (this.isShutdown) return;\n\t\tconst collectionIds = [...new Set(Object.values(batch.collectionMemberships).flatMap((collections) => collections))];\n\t\tconst affectedRemotes = [];\n\t\tfor (const collectionId of collectionIds) {\n\t\t\tconst remotes = this.getRemotesForCollection(collectionId);\n\t\t\tfor (const remote of remotes) if (!affectedRemotes.includes(remote)) affectedRemotes.push(remote);\n\t\t}\n\t\tfor (const remote of affectedRemotes) trimMailboxFromBatch(remote.channel.inbox, batch);\n\t\tfor (const remote of affectedRemotes) await this.updateOutbox(remote, remote.channel.outbox.latestOrdinal, OutboxMode.BatchTriggered);\n\t}\n\thandleInboxAdded(remote, syncOps) {\n\t\tif (this.isShutdown) return;\n\t\tconst eligible = syncOps.filter((op) => !this.quarantinedDocumentIds.has(op.documentId));\n\t\tif (eligible.length === 0) return;\n\t\tconst keyed = [];\n\t\tconst nonKeyed = [];\n\t\tfor (const syncOp of eligible) if (syncOp.jobId) keyed.push(syncOp);\n\t\telse nonKeyed.push(syncOp);\n\t\tfor (const syncOp of nonKeyed) this.applyInboxJob(remote, syncOp);\n\t\tif (keyed.length > 0) {\n\t\t\tconst chunks = chunkSyncOperations(keyed.map((syncOp) => ({\n\t\t\t\tremote,\n\t\t\t\tsyncOp\n\t\t\t})), this.config.maxInboxBatchSize);\n\t\t\tthis.processInboxChunks(chunks);\n\t\t}\n\t}\n\tasync processInboxChunks(chunks) {\n\t\tfor (const chunk of chunks) {\n\t\t\tif (this.isShutdown) return;\n\t\t\tawait this.applyInboxBatch(chunk);\n\t\t}\n\t}\n\tasync applyInboxJob(remote, syncOp) {\n\t\tconst operations = syncOp.operations.map((op) => op.operation);\n\t\tlet jobInfo;\n\t\ttry {\n\t\t\tjobInfo = await this.reactor.load(syncOp.documentId, syncOp.branch, operations, this.abortController.signal, { sourceRemote: remote.name });\n\t\t} catch (error) {\n\t\t\tif (this.isShutdown) return;\n\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\tthis.logger.error(\"Failed to load operations from inbox (@remote, @documentId, @error)\", remote.name, syncOp.documentId, err.message);\n\t\t\tconst channelError = new ChannelError(ChannelErrorSource.Inbox, err);\n\t\t\tsyncOp.failed(channelError);\n\t\t\tremote.channel.deadLetter.add(syncOp);\n\t\t\tremote.channel.inbox.remove(syncOp);\n\t\t\treturn;\n\t\t}\n\t\tlet completedJobInfo;\n\t\ttry {\n\t\t\tcompletedJobInfo = await this.awaiter.waitForJob(jobInfo.id, this.abortController.signal);\n\t\t} catch (error) {\n\t\t\tif (this.isShutdown) return;\n\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\tthis.logger.error(\"Failed to wait for job completion (@remote, @documentId, @jobId, @error)\", remote.name, syncOp.documentId, jobInfo.id, err.message);\n\t\t\tconst channelError = new ChannelError(ChannelErrorSource.Inbox, err);\n\t\t\tsyncOp.failed(channelError);\n\t\t\tremote.channel.deadLetter.add(syncOp);\n\t\t\tremote.channel.inbox.remove(syncOp);\n\t\t\treturn;\n\t\t}\n\t\tif (this.isShutdown) return;\n\t\tif (completedJobInfo.status === JobStatus.FAILED) {\n\t\t\tconst errorMessage = completedJobInfo.error?.message || \"Unknown error\";\n\t\t\tthis.logger.error(\"Failed to apply operations from inbox (@remote, @documentId, @jobId, @error)\", remote.name, syncOp.documentId, completedJobInfo.id, errorMessage);\n\t\t\tconst error = new ChannelError(ChannelErrorSource.Inbox, /* @__PURE__ */ new Error(`Failed to apply operations: ${errorMessage}`));\n\t\t\tsyncOp.failed(error);\n\t\t\tremote.channel.deadLetter.add(syncOp);\n\t\t} else syncOp.executed();\n\t\tremote.channel.inbox.remove(syncOp);\n\t}\n\tasync applyInboxBatch(items) {\n\t\tconst sourceRemote = items[0].remote.name;\n\t\tconst chunkKeys = new Set(items.map(({ syncOp }) => syncOp.jobId));\n\t\tconst request = { jobs: items.map(({ syncOp }) => ({\n\t\t\tkey: syncOp.jobId,\n\t\t\tdocumentId: syncOp.documentId,\n\t\t\tscope: syncOp.scopes[0],\n\t\t\tbranch: syncOp.branch,\n\t\t\toperations: syncOp.operations.map((op) => op.operation),\n\t\t\tdependsOn: syncOp.jobDependencies.filter((dep) => dep && chunkKeys.has(dep))\n\t\t})) };\n\t\tlet result;\n\t\ttry {\n\t\t\tresult = await this.reactor.loadBatch(request, this.abortController.signal, { sourceRemote });\n\t\t} catch (error) {\n\t\t\tif (this.isShutdown) return;\n\t\t\tfor (const { remote, syncOp } of items) {\n\t\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\t\tsyncOp.failed(new ChannelError(ChannelErrorSource.Inbox, err));\n\t\t\t\tremote.channel.deadLetter.add(syncOp);\n\t\t\t\tremote.channel.inbox.remove(syncOp);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (this.isShutdown) return;\n\t\tfor (const { remote, syncOp } of items) {\n\t\t\tif (!(syncOp.jobId in result.jobs)) {\n\t\t\t\tthis.logger.error(\"Job key missing from batch load result (@remote, @documentId, @jobId)\", remote.name, syncOp.documentId, syncOp.jobId);\n\t\t\t\tconst error = new ChannelError(ChannelErrorSource.Inbox, /* @__PURE__ */ new Error(`Job key '${syncOp.jobId}' missing from batch load result`));\n\t\t\t\tsyncOp.failed(error);\n\t\t\t\tremote.channel.deadLetter.add(syncOp);\n\t\t\t\tremote.channel.inbox.remove(syncOp);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst jobInfo = result.jobs[syncOp.jobId];\n\t\t\tlet completedJobInfo;\n\t\t\ttry {\n\t\t\t\tcompletedJobInfo = await this.awaiter.waitForJob(jobInfo.id, this.abortController.signal);\n\t\t\t} catch (error) {\n\t\t\t\tif (this.isShutdown) continue;\n\t\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\t\tsyncOp.failed(new ChannelError(ChannelErrorSource.Inbox, err));\n\t\t\t\tremote.channel.deadLetter.add(syncOp);\n\t\t\t\tremote.channel.inbox.remove(syncOp);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (this.isShutdown) return;\n\t\t\tif (completedJobInfo.status === JobStatus.FAILED) {\n\t\t\t\tconst errorMessage = completedJobInfo.error?.message || \"Unknown error\";\n\t\t\t\tconst channelError = new ChannelError(ChannelErrorSource.Inbox, /* @__PURE__ */ new Error(`Failed to apply operations: ${errorMessage}`));\n\t\t\t\tsyncOp.failed(channelError);\n\t\t\t\tremote.channel.deadLetter.add(syncOp);\n\t\t\t} else syncOp.executed();\n\t\t\tremote.channel.inbox.remove(syncOp);\n\t\t}\n\t}\n\tasync updateOutbox(remote, ackOrdinal, mode = OutboxMode.Backfill, signal) {\n\t\tconst composedSignal = signal ? AbortSignal.any([signal, this.abortController.signal]) : this.abortController.signal;\n\t\tlet maxOrdinal = ackOrdinal;\n\t\tconst lastJobByDoc = /* @__PURE__ */ new Map();\n\t\tconst sinceTimestamp = remote.options.sinceTimestampUtcMs;\n\t\tlet page = await this.operationIndex.find(remote.collectionId, ackOrdinal, { excludeSourceRemote: remote.name }, void 0, composedSignal);\n\t\tlet hasMore;\n\t\tdo {\n\t\t\tif (composedSignal.aborted) return;\n\t\t\tfor (const entry of page.results) maxOrdinal = Math.max(maxOrdinal, entry.ordinal ?? 0);\n\t\t\tlet operations = page.results.map((entry) => toOperationWithContext(entry));\n\t\t\tif (sinceTimestamp && sinceTimestamp !== \"0\") operations = operations.filter((op) => op.operation.timestampUtcMs >= sinceTimestamp);\n\t\t\toperations = filterOperations(operations, remote.filter);\n\t\t\toperations = operations.filter((op) => !this.quarantinedDocumentIds.has(op.context.documentId));\n\t\t\tif (operations.length > 0) {\n\t\t\t\toperations.sort((a, b) => {\n\t\t\t\t\tif (a.context.documentId !== b.context.documentId) return a.context.documentId < b.context.documentId ? -1 : 1;\n\t\t\t\t\tif (a.context.scope !== b.context.scope) return a.context.scope < b.context.scope ? -1 : 1;\n\t\t\t\t\treturn a.context.ordinal - b.context.ordinal;\n\t\t\t\t});\n\t\t\t\tconst batches = batchOperationsByDocument(operations);\n\t\t\t\tconst syncOps = [];\n\t\t\t\tlet prevChainJobId;\n\t\t\t\tfor (const batch of batches) {\n\t\t\t\t\tconst jobId = crypto.randomUUID();\n\t\t\t\t\tconst prevJobId = lastJobByDoc.get(batch.documentId);\n\t\t\t\t\tconst deps = [];\n\t\t\t\t\tif (prevJobId) deps.push(prevJobId);\n\t\t\t\t\tif (mode === OutboxMode.BatchTriggered && prevChainJobId && prevChainJobId !== prevJobId) deps.push(prevChainJobId);\n\t\t\t\t\tconst syncOp = new SyncOperation(crypto.randomUUID(), jobId, deps, remote.name, batch.documentId, [batch.scope], batch.branch, batch.operations);\n\t\t\t\t\tsyncOps.push(syncOp);\n\t\t\t\t\tlastJobByDoc.set(batch.documentId, jobId);\n\t\t\t\t\tif (mode === OutboxMode.BatchTriggered) prevChainJobId = jobId;\n\t\t\t\t}\n\t\t\t\tremote.channel.outbox.add(...syncOps);\n\t\t\t}\n\t\t\thasMore = !!page.next;\n\t\t\tif (hasMore) page = await page.next();\n\t\t} while (hasMore);\n\t\tremote.channel.outbox.advanceOrdinal(maxOrdinal);\n\t}\n};\n//#endregion\n//#region src/sync/sync-builder.ts\nvar SyncBuilder = class {\n\tchannelFactory;\n\tremoteStorage;\n\tcursorStorage;\n\tdeadLetterStorage;\n\tconfig = {};\n\twithChannelFactory(factory) {\n\t\tthis.channelFactory = factory;\n\t\treturn this;\n\t}\n\twithRemoteStorage(storage) {\n\t\tthis.remoteStorage = storage;\n\t\treturn this;\n\t}\n\twithCursorStorage(storage) {\n\t\tthis.cursorStorage = storage;\n\t\treturn this;\n\t}\n\twithDeadLetterStorage(storage) {\n\t\tthis.deadLetterStorage = storage;\n\t\treturn this;\n\t}\n\twithMaxDeadLettersPerRemote(limit) {\n\t\tthis.config.maxDeadLettersPerRemote = limit;\n\t\treturn this;\n\t}\n\twithMaxInboxBatchSize(limit) {\n\t\tthis.config.maxInboxBatchSize = limit;\n\t\treturn this;\n\t}\n\tbuild(reactor, logger, operationIndex, eventBus, db) {\n\t\treturn this.buildModule(reactor, logger, operationIndex, eventBus, db).syncManager;\n\t}\n\tbuildModule(reactor, logger, operationIndex, eventBus, db) {\n\t\tif (!this.channelFactory) throw new Error(\"Channel factory is required\");\n\t\tconst remoteStorage = this.remoteStorage ?? new KyselySyncRemoteStorage(db);\n\t\tconst cursorStorage = this.cursorStorage ?? new KyselySyncCursorStorage(db);\n\t\tconst deadLetterStorage = this.deadLetterStorage ?? new KyselySyncDeadLetterStorage(db);\n\t\tconst syncManager = new SyncManager(logger, remoteStorage, cursorStorage, deadLetterStorage, this.channelFactory, operationIndex, reactor, eventBus, this.config);\n\t\treturn {\n\t\t\tremoteStorage,\n\t\t\tcursorStorage,\n\t\t\tdeadLetterStorage,\n\t\t\tchannelFactory: this.channelFactory,\n\t\t\tsyncManager\n\t\t};\n\t}\n};\n//#endregion\n//#region src/core/create-default-database.ts\nasync function createDefaultDatabase() {\n\tconst { Kysely } = await import(\"kysely\");\n\tconst { PGlite } = await import(\"@electric-sql/pglite\");\n\tconst { PGliteDialect } = await import(\"kysely-pglite-dialect\");\n\treturn new Kysely({ dialect: new PGliteDialect(new PGlite()) });\n}\n//#endregion\n//#region src/shared/factories.ts\n/**\n* Factory method to create a ShutdownStatus that can be updated\n*\n* @param initialState - Initial shutdown state (default: false)\n* @returns A tuple of [ShutdownStatus, setShutdown function, setCompleted function]\n*/\nfunction createMutableShutdownStatus(initialState = false) {\n\tlet shutdownState = initialState;\n\tlet completedPromise = Promise.resolve();\n\tconst status = {\n\t\tget isShutdown() {\n\t\t\treturn shutdownState;\n\t\t},\n\t\tget completed() {\n\t\t\treturn completedPromise;\n\t\t}\n\t};\n\tconst setShutdown = (value) => {\n\t\tshutdownState = value;\n\t};\n\tconst setCompleted = (promise) => {\n\t\tcompletedPromise = promise;\n\t};\n\treturn [\n\t\tstatus,\n\t\tsetShutdown,\n\t\tsetCompleted\n\t];\n}\n//#endregion\n//#region src/core/types.ts\nvar AbortError = class extends Error {\n\tconstructor(message) {\n\t\tsuper(message || \"Aborted\");\n\t\tthis.name = \"AbortError\";\n\t}\n};\n//#endregion\n//#region src/core/reactor.ts\n/**\n* This class implements the IReactor interface and serves as the main entry point\n* for the new Reactor architecture.\n*/\nvar Reactor = class {\n\tlogger;\n\tdocumentModelRegistry;\n\tshutdownStatus;\n\tsetShutdown;\n\tsetCompleted;\n\tqueue;\n\tjobTracker;\n\treadModelCoordinator;\n\tfeatures;\n\tdocumentView;\n\tdocumentIndexer;\n\toperationStore;\n\teventBus;\n\texecutorManager;\n\tconstructor(logger, documentModelRegistry, queue, jobTracker, readModelCoordinator, features, documentView, documentIndexer, operationStore, eventBus, executorManager) {\n\t\tthis.logger = logger;\n\t\tthis.documentModelRegistry = documentModelRegistry;\n\t\tthis.queue = queue;\n\t\tthis.jobTracker = jobTracker;\n\t\tthis.readModelCoordinator = readModelCoordinator;\n\t\tthis.features = features;\n\t\tthis.documentView = documentView;\n\t\tthis.documentIndexer = documentIndexer;\n\t\tthis.operationStore = operationStore;\n\t\tthis.eventBus = eventBus;\n\t\tthis.executorManager = executorManager;\n\t\tconst [status, setShutdown, setCompleted] = createMutableShutdownStatus(false);\n\t\tthis.shutdownStatus = status;\n\t\tthis.setShutdown = setShutdown;\n\t\tthis.setCompleted = setCompleted;\n\t\tthis.eventBus.subscribe(ReactorEventTypes.JOB_FAILED, (_type, event) => {\n\t\t\tthis.logger.error(\"Job @JobId failed with @Message: @Job\", event.jobId, event.error.message, event.job);\n\t\t});\n\t\tthis.readModelCoordinator.start();\n\t}\n\tkill() {\n\t\tthis.logger.verbose(\"kill()\");\n\t\tif (this.shutdownStatus.isShutdown) return this.shutdownStatus;\n\t\tthis.setShutdown(true);\n\t\tconst shutdownAsync = async () => {\n\t\t\tawait this.executorManager.stop(true);\n\t\t\tthis.readModelCoordinator.stop();\n\t\t\tthis.jobTracker.shutdown();\n\t\t};\n\t\tthis.setCompleted(shutdownAsync());\n\t\treturn this.shutdownStatus;\n\t}\n\tgetDocumentModels(namespace, paging, signal) {\n\t\tthis.logger.verbose(\"getDocumentModels(@namespace, @paging)\", namespace, paging);\n\t\tif (signal?.aborted) throw new AbortError();\n\t\tconst filteredModels = this.documentModelRegistry.getAllModules().filter((module) => !namespace || module.documentModel.global.id.startsWith(namespace));\n\t\tconst startIndex = paging ? parseInt(paging.cursor) || 0 : 0;\n\t\tconst limit = paging?.limit || filteredModels.length;\n\t\tconst pagedModels = filteredModels.slice(startIndex, startIndex + limit);\n\t\tconst hasMore = startIndex + limit < filteredModels.length;\n\t\tconst nextCursor = hasMore ? String(startIndex + limit) : void 0;\n\t\treturn Promise.resolve({\n\t\t\tresults: pagedModels,\n\t\t\toptions: paging || {\n\t\t\t\tcursor: \"0\",\n\t\t\t\tlimit: filteredModels.length\n\t\t\t},\n\t\t\tnextCursor,\n\t\t\tnext: hasMore ? () => this.getDocumentModels(namespace, {\n\t\t\t\tcursor: nextCursor,\n\t\t\t\tlimit\n\t\t\t}, signal) : void 0\n\t\t});\n\t}\n\tasync get(id, view, consistencyToken, signal) {\n\t\tthis.logger.verbose(\"get(@id, @view)\", id, view);\n\t\treturn await this.documentView.get(id, view, consistencyToken, signal);\n\t}\n\tasync getBySlug(slug, view, consistencyToken, signal) {\n\t\tthis.logger.verbose(\"getBySlug(@slug, @view)\", slug, view);\n\t\tconst documentId = await this.documentView.resolveSlug(slug, view, consistencyToken, signal);\n\t\tif (!documentId) throw new Error(`Document not found with slug: ${slug}`);\n\t\treturn await this.get(documentId, view, consistencyToken, signal);\n\t}\n\tasync getByIdOrSlug(identifier, view, consistencyToken, signal) {\n\t\tthis.logger.verbose(\"getByIdOrSlug(@identifier, @view)\", identifier, view);\n\t\treturn await this.documentView.getByIdOrSlug(identifier, view, consistencyToken, signal);\n\t}\n\tasync getChildren(documentId, consistencyToken, signal) {\n\t\tconst relationships = await this.documentIndexer.getOutgoing(documentId, [\"child\"], void 0, consistencyToken, signal);\n\t\tif (signal?.aborted) throw new AbortError();\n\t\treturn relationships.results.map((rel) => rel.targetId);\n\t}\n\tasync getParents(childId, consistencyToken, signal) {\n\t\tconst relationships = await this.documentIndexer.getIncoming(childId, [\"parent\"], void 0, consistencyToken, signal);\n\t\tif (signal?.aborted) throw new AbortError();\n\t\treturn relationships.results.map((rel) => rel.sourceId);\n\t}\n\tasync getOperations(documentId, view, filter, paging, consistencyToken, signal) {\n\t\tthis.logger.verbose(\"getOperations(@documentId, @view, @filter, @paging)\", documentId, view, filter, paging);\n\t\tconst branch = view?.branch || \"main\";\n\t\tconst revisions = await this.operationStore.getRevisions(documentId, branch, signal);\n\t\tif (signal?.aborted) throw new AbortError();\n\t\tconst allScopes = Object.keys(revisions.revision);\n\t\tconst result = {};\n\t\tfor (const scope of allScopes) {\n\t\t\tif (!matchesScope(view, scope)) continue;\n\t\t\tif (signal?.aborted) throw new AbortError();\n\t\t\tconst scopeResult = await this.operationStore.getSince(documentId, scope, branch, -1, filter, paging, signal);\n\t\t\tresult[scope] = {\n\t\t\t\tresults: scopeResult.results,\n\t\t\t\toptions: scopeResult.options,\n\t\t\t\tnextCursor: scopeResult.nextCursor,\n\t\t\t\tnext: scopeResult.next ? async () => {\n\t\t\t\t\treturn (await this.getOperations(documentId, view, filter, {\n\t\t\t\t\t\tcursor: scopeResult.nextCursor,\n\t\t\t\t\t\tlimit: scopeResult.options.limit\n\t\t\t\t\t}, consistencyToken, signal))[scope];\n\t\t\t\t} : void 0\n\t\t\t};\n\t\t}\n\t\treturn result;\n\t}\n\tasync find(search, view, paging, consistencyToken, signal) {\n\t\tthis.logger.verbose(\"find(@search, @view, @paging)\", search, view, paging);\n\t\tlet results;\n\t\tif (search.ids) {\n\t\t\tif (search.slugs && search.slugs.length > 0) throw new Error(\"Cannot use both ids and slugs in the same search\");\n\t\t\tresults = await this.findByIds(search.ids, view, paging, consistencyToken, signal);\n\t\t\tif (search.type) results = filterByType(results, search.type);\n\t\t} else if (search.slugs) {\n\t\t\tresults = await this.findBySlugs(search.slugs, view, paging, consistencyToken, signal);\n\t\t\tif (search.type) results = filterByType(results, search.type);\n\t\t} else if (search.parentId) {\n\t\t\tresults = await this.findByParentId(search.parentId, view, paging, consistencyToken, signal);\n\t\t\tif (search.type) results = filterByType(results, search.type);\n\t\t} else if (search.type) results = await this.findByType(search.type, view, paging, consistencyToken, signal);\n\t\telse throw new Error(\"No search criteria provided\");\n\t\tif (signal?.aborted) throw new AbortError();\n\t\treturn results;\n\t}\n\tasync create(document, signer, signal, meta) {\n\t\tthis.logger.verbose(\"create(@id, @type, @slug)\", document.header.id, document.header.documentType, document.header.slug);\n\t\tconst createdAtUtcIso = (/* @__PURE__ */ new Date()).toISOString();\n\t\tif (signal?.aborted) throw new AbortError();\n\t\tlet actions = [createDocumentAction({\n\t\t\tmodel: document.header.documentType,\n\t\t\tversion: 0,\n\t\t\tdocumentId: document.header.id,\n\t\t\tsigning: {\n\t\t\t\tsignature: document.header.id,\n\t\t\t\tpublicKey: document.header.sig.publicKey,\n\t\t\t\tnonce: document.header.sig.nonce,\n\t\t\t\tcreatedAtUtcIso: document.header.createdAtUtcIso,\n\t\t\t\tdocumentType: document.header.documentType\n\t\t\t},\n\t\t\tslug: document.header.slug,\n\t\t\tname: document.header.name,\n\t\t\tbranch: document.header.branch,\n\t\t\tmeta: document.header.meta,\n\t\t\tprotocolVersions: document.header.protocolVersions ?? { \"base-reducer\": 2 }\n\t\t}), upgradeDocumentAction({\n\t\t\tdocumentId: document.header.id,\n\t\t\tmodel: document.header.documentType,\n\t\t\tfromVersion: 0,\n\t\t\ttoVersion: document.state.document.version,\n\t\t\tinitialState: document.state\n\t\t})];\n\t\tif (signer) actions = await signActions(actions, signer, signal);\n\t\tconst jobId = v4();\n\t\tconst jobMeta = buildSingleJobMeta(jobId, meta);\n\t\tconst job = {\n\t\t\tid: jobId,\n\t\t\tkind: \"mutation\",\n\t\t\tdocumentId: document.header.id,\n\t\t\tscope: \"document\",\n\t\t\tbranch: \"main\",\n\t\t\tactions,\n\t\t\toperations: [],\n\t\t\tcreatedAt: (/* @__PURE__ */ new Date()).toISOString(),\n\t\t\tqueueHint: [],\n\t\t\tmaxRetries: 3,\n\t\t\terrorHistory: [],\n\t\t\tmeta: jobMeta\n\t\t};\n\t\tconst jobInfo = {\n\t\t\tid: jobId,\n\t\t\tstatus: JobStatus.PENDING,\n\t\t\tcreatedAtUtcIso,\n\t\t\tconsistencyToken: {\n\t\t\t\tversion: 1,\n\t\t\t\tcreatedAtUtcIso,\n\t\t\t\tcoordinates: []\n\t\t\t},\n\t\t\tmeta: jobMeta\n\t\t};\n\t\tthis.jobTracker.registerJob(jobInfo);\n\t\tthis.emitJobPending(jobInfo.id, jobMeta);\n\t\tawait this.queue.enqueue(job);\n\t\treturn jobInfo;\n\t}\n\tasync deleteDocument(id, signer, signal, meta) {\n\t\tthis.logger.verbose(\"deleteDocument(@id)\", id);\n\t\tconst createdAtUtcIso = (/* @__PURE__ */ new Date()).toISOString();\n\t\tif (signal?.aborted) throw new AbortError();\n\t\tlet action = deleteDocumentAction(id);\n\t\tif (signer) action = await signAction(action, signer, signal);\n\t\tconst jobId = v4();\n\t\tconst jobMeta = buildSingleJobMeta(jobId, meta);\n\t\tconst job = {\n\t\t\tid: jobId,\n\t\t\tkind: \"mutation\",\n\t\t\tdocumentId: id,\n\t\t\tscope: \"document\",\n\t\t\tbranch: \"main\",\n\t\t\tactions: [action],\n\t\t\toperations: [],\n\t\t\tcreatedAt: (/* @__PURE__ */ new Date()).toISOString(),\n\t\t\tqueueHint: [],\n\t\t\tmaxRetries: 3,\n\t\t\terrorHistory: [],\n\t\t\tmeta: jobMeta\n\t\t};\n\t\tconst jobInfo = {\n\t\t\tid: jobId,\n\t\t\tstatus: JobStatus.PENDING,\n\t\t\tcreatedAtUtcIso,\n\t\t\tconsistencyToken: {\n\t\t\t\tversion: 1,\n\t\t\t\tcreatedAtUtcIso,\n\t\t\t\tcoordinates: []\n\t\t\t},\n\t\t\tmeta: jobMeta\n\t\t};\n\t\tthis.jobTracker.registerJob(jobInfo);\n\t\tthis.emitJobPending(jobInfo.id, jobMeta);\n\t\tawait this.queue.enqueue(job);\n\t\treturn jobInfo;\n\t}\n\tasync execute(docId, branch, actions, signal, meta) {\n\t\tthis.logger.verbose(\"execute(@docId, @branch, @actions)\", docId, branch, actions);\n\t\tif (signal?.aborted) throw new AbortError();\n\t\tconst createdAtUtcIso = (/* @__PURE__ */ new Date()).toISOString();\n\t\tconst scope = getSharedActionScope(actions);\n\t\tconst jobId = v4();\n\t\tconst jobMeta = buildSingleJobMeta(jobId, meta);\n\t\tconst job = {\n\t\t\tid: jobId,\n\t\t\tkind: \"mutation\",\n\t\t\tdocumentId: docId,\n\t\t\tscope,\n\t\t\tbranch,\n\t\t\tactions,\n\t\t\toperations: [],\n\t\t\tcreatedAt: (/* @__PURE__ */ new Date()).toISOString(),\n\t\t\tqueueHint: [],\n\t\t\tmaxRetries: 3,\n\t\t\terrorHistory: [],\n\t\t\tmeta: jobMeta\n\t\t};\n\t\tconst jobInfo = {\n\t\t\tid: jobId,\n\t\t\tstatus: JobStatus.PENDING,\n\t\t\tcreatedAtUtcIso,\n\t\t\tconsistencyToken: {\n\t\t\t\tversion: 1,\n\t\t\t\tcreatedAtUtcIso,\n\t\t\t\tcoordinates: []\n\t\t\t},\n\t\t\tmeta: jobMeta\n\t\t};\n\t\tthis.jobTracker.registerJob(jobInfo);\n\t\tthis.emitJobPending(jobInfo.id, jobMeta);\n\t\tawait this.queue.enqueue(job);\n\t\tif (signal?.aborted) throw new AbortError();\n\t\treturn jobInfo;\n\t}\n\tasync load(docId, branch, operations, signal, meta) {\n\t\tthis.logger.verbose(\"load(@docId, @branch, @count, @operations)\", docId, branch, operations.length, operations);\n\t\tif (signal?.aborted) throw new AbortError();\n\t\tif (operations.length === 0) throw new Error(\"load requires at least one operation\");\n\t\tconst scope = getSharedOperationScope(operations);\n\t\tconst createdAtUtcIso = (/* @__PURE__ */ new Date()).toISOString();\n\t\tconst jobId = v4();\n\t\tconst jobMeta = buildSingleJobMeta(jobId, meta);\n\t\tconst job = {\n\t\t\tid: jobId,\n\t\t\tkind: \"load\",\n\t\t\tdocumentId: docId,\n\t\t\tscope,\n\t\t\tbranch,\n\t\t\tactions: [],\n\t\t\toperations,\n\t\t\tcreatedAt: createdAtUtcIso,\n\t\t\tqueueHint: [],\n\t\t\tmaxRetries: 3,\n\t\t\terrorHistory: [],\n\t\t\tmeta: jobMeta\n\t\t};\n\t\tconst jobInfo = {\n\t\t\tid: jobId,\n\t\t\tstatus: JobStatus.PENDING,\n\t\t\tcreatedAtUtcIso,\n\t\t\tconsistencyToken: {\n\t\t\t\tversion: 1,\n\t\t\t\tcreatedAtUtcIso,\n\t\t\t\tcoordinates: []\n\t\t\t},\n\t\t\tmeta: jobMeta\n\t\t};\n\t\tthis.jobTracker.registerJob(jobInfo);\n\t\tthis.emitJobPending(jobInfo.id, jobMeta);\n\t\tawait this.queue.enqueue(job);\n\t\tif (signal?.aborted) throw new AbortError();\n\t\treturn jobInfo;\n\t}\n\tasync executeBatch(request, signal, meta) {\n\t\tthis.logger.verbose(\"executeBatch(@count jobs)\", request.jobs.length);\n\t\tif (signal?.aborted) throw new AbortError();\n\t\tvalidateBatchRequest(request.jobs);\n\t\tfor (const jobPlan of request.jobs) validateActionScopes(jobPlan);\n\t\tconst createdAtUtcIso = (/* @__PURE__ */ new Date()).toISOString();\n\t\tconst planKeyToJobId = /* @__PURE__ */ new Map();\n\t\tfor (const jobPlan of request.jobs) planKeyToJobId.set(jobPlan.key, v4());\n\t\tconst batchId = v4();\n\t\tconst batchJobIds = [...planKeyToJobId.values()];\n\t\tconst batchMeta = {\n\t\t\t...meta,\n\t\t\tbatchId,\n\t\t\tbatchJobIds\n\t\t};\n\t\tconst jobInfos = /* @__PURE__ */ new Map();\n\t\tfor (const jobPlan of request.jobs) {\n\t\t\tconst jobInfo = {\n\t\t\t\tid: planKeyToJobId.get(jobPlan.key),\n\t\t\t\tstatus: JobStatus.PENDING,\n\t\t\t\tcreatedAtUtcIso,\n\t\t\t\tconsistencyToken: {\n\t\t\t\t\tversion: 1,\n\t\t\t\t\tcreatedAtUtcIso,\n\t\t\t\t\tcoordinates: []\n\t\t\t\t},\n\t\t\t\tmeta: batchMeta\n\t\t\t};\n\t\t\tthis.jobTracker.registerJob(jobInfo);\n\t\t\tthis.emitJobPending(jobInfo.id, batchMeta);\n\t\t\tjobInfos.set(jobPlan.key, jobInfo);\n\t\t}\n\t\tconst sortedKeys = topologicalSort(request.jobs);\n\t\tconst enqueuedKeys = [];\n\t\ttry {\n\t\t\tfor (const key of sortedKeys) {\n\t\t\t\tif (signal?.aborted) throw new AbortError();\n\t\t\t\tconst jobPlan = request.jobs.find((j) => j.key === key);\n\t\t\t\tconst jobId = planKeyToJobId.get(key);\n\t\t\t\tconst queueHint = jobPlan.dependsOn.map((depKey) => planKeyToJobId.get(depKey));\n\t\t\t\tconst job = {\n\t\t\t\t\tid: jobId,\n\t\t\t\t\tkind: \"mutation\",\n\t\t\t\t\tdocumentId: jobPlan.documentId,\n\t\t\t\t\tscope: jobPlan.scope,\n\t\t\t\t\tbranch: jobPlan.branch,\n\t\t\t\t\tactions: jobPlan.actions,\n\t\t\t\t\toperations: [],\n\t\t\t\t\tcreatedAt: createdAtUtcIso,\n\t\t\t\t\tqueueHint,\n\t\t\t\t\tmaxRetries: 3,\n\t\t\t\t\terrorHistory: [],\n\t\t\t\t\tmeta: batchMeta\n\t\t\t\t};\n\t\t\t\tawait this.queue.enqueue(job);\n\t\t\t\tenqueuedKeys.push(key);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tfor (const key of enqueuedKeys) {\n\t\t\t\tconst jobId = planKeyToJobId.get(key);\n\t\t\t\ttry {\n\t\t\t\t\tawait this.queue.remove(jobId);\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t\tfor (const jobInfo of jobInfos.values()) this.jobTracker.markFailed(jobInfo.id, toErrorInfo(\"Batch enqueue failed\"));\n\t\t\tthrow error;\n\t\t}\n\t\treturn { jobs: Object.fromEntries(jobInfos) };\n\t}\n\tasync loadBatch(request, signal, meta) {\n\t\tthis.logger.verbose(\"loadBatch(@count jobs)\", request.jobs.length);\n\t\tif (signal?.aborted) throw new AbortError();\n\t\tvalidateBatchLoadRequest(request.jobs);\n\t\tfor (const jobPlan of request.jobs) validateOperationScopes(jobPlan);\n\t\tconst createdAtUtcIso = (/* @__PURE__ */ new Date()).toISOString();\n\t\tconst planKeyToJobId = /* @__PURE__ */ new Map();\n\t\tfor (const jobPlan of request.jobs) planKeyToJobId.set(jobPlan.key, v4());\n\t\tconst batchId = v4();\n\t\tconst batchJobIds = [...planKeyToJobId.values()];\n\t\tconst batchMeta = {\n\t\t\t...meta,\n\t\t\tbatchId,\n\t\t\tbatchJobIds\n\t\t};\n\t\tconst jobInfos = /* @__PURE__ */ new Map();\n\t\tfor (const jobPlan of request.jobs) {\n\t\t\tconst jobInfo = {\n\t\t\t\tid: planKeyToJobId.get(jobPlan.key),\n\t\t\t\tstatus: JobStatus.PENDING,\n\t\t\t\tcreatedAtUtcIso,\n\t\t\t\tconsistencyToken: {\n\t\t\t\t\tversion: 1,\n\t\t\t\t\tcreatedAtUtcIso,\n\t\t\t\t\tcoordinates: []\n\t\t\t\t},\n\t\t\t\tmeta: batchMeta\n\t\t\t};\n\t\t\tthis.jobTracker.registerJob(jobInfo);\n\t\t\tthis.emitJobPending(jobInfo.id, batchMeta);\n\t\t\tjobInfos.set(jobPlan.key, jobInfo);\n\t\t}\n\t\tconst sortedKeys = topologicalSort(request.jobs);\n\t\tconst enqueuedKeys = [];\n\t\ttry {\n\t\t\tfor (const key of sortedKeys) {\n\t\t\t\tif (signal?.aborted) throw new AbortError();\n\t\t\t\tconst jobPlan = request.jobs.find((j) => j.key === key);\n\t\t\t\tconst jobId = planKeyToJobId.get(key);\n\t\t\t\tconst queueHint = jobPlan.dependsOn.map((depKey) => planKeyToJobId.get(depKey));\n\t\t\t\tconst job = {\n\t\t\t\t\tid: jobId,\n\t\t\t\t\tkind: \"load\",\n\t\t\t\t\tdocumentId: jobPlan.documentId,\n\t\t\t\t\tscope: jobPlan.scope,\n\t\t\t\t\tbranch: jobPlan.branch,\n\t\t\t\t\tactions: [],\n\t\t\t\t\toperations: jobPlan.operations,\n\t\t\t\t\tcreatedAt: createdAtUtcIso,\n\t\t\t\t\tqueueHint,\n\t\t\t\t\tmaxRetries: 3,\n\t\t\t\t\terrorHistory: [],\n\t\t\t\t\tmeta: batchMeta\n\t\t\t\t};\n\t\t\t\tawait this.queue.enqueue(job);\n\t\t\t\tenqueuedKeys.push(key);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tfor (const key of enqueuedKeys) {\n\t\t\t\tconst jobId = planKeyToJobId.get(key);\n\t\t\t\ttry {\n\t\t\t\t\tawait this.queue.remove(jobId);\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t\tfor (const jobInfo of jobInfos.values()) this.jobTracker.markFailed(jobInfo.id, toErrorInfo(\"Batch enqueue failed\"));\n\t\t\tthrow error;\n\t\t}\n\t\treturn { jobs: Object.fromEntries(jobInfos) };\n\t}\n\tasync addChildren(parentId, documentIds, branch = \"main\", signer, signal) {\n\t\tthis.logger.verbose(\"addChildren(@parentId, @count children, @branch)\", parentId, documentIds.length, branch);\n\t\tif (signal?.aborted) throw new AbortError();\n\t\tlet actions = documentIds.map((childId) => addRelationshipAction(parentId, childId, \"child\"));\n\t\tif (signer) actions = await signActions(actions, signer, signal);\n\t\treturn await this.execute(parentId, branch, actions, signal);\n\t}\n\tasync removeChildren(parentId, documentIds, branch = \"main\", signer, signal) {\n\t\tthis.logger.verbose(\"removeChildren(@parentId, @count children, @branch)\", parentId, documentIds.length, branch);\n\t\tif (signal?.aborted) throw new AbortError();\n\t\tlet actions = documentIds.map((childId) => removeRelationshipAction(parentId, childId, \"child\"));\n\t\tif (signer) actions = await signActions(actions, signer, signal);\n\t\treturn await this.execute(parentId, branch, actions, signal);\n\t}\n\tgetJobStatus(jobId, signal) {\n\t\tthis.logger.verbose(\"getJobStatus(@jobId)\", jobId);\n\t\tif (signal?.aborted) throw new AbortError();\n\t\tconst jobInfo = this.jobTracker.getJobStatus(jobId);\n\t\tif (!jobInfo) {\n\t\t\tconst now = (/* @__PURE__ */ new Date()).toISOString();\n\t\t\treturn Promise.resolve({\n\t\t\t\tid: jobId,\n\t\t\t\tstatus: JobStatus.FAILED,\n\t\t\t\tcreatedAtUtcIso: now,\n\t\t\t\tcompletedAtUtcIso: now,\n\t\t\t\terror: toErrorInfo(\"Job not found\"),\n\t\t\t\tconsistencyToken: {\n\t\t\t\t\tversion: 1,\n\t\t\t\t\tcreatedAtUtcIso: now,\n\t\t\t\t\tcoordinates: []\n\t\t\t\t},\n\t\t\t\tmeta: {\n\t\t\t\t\tbatchId: jobId,\n\t\t\t\t\tbatchJobIds: [jobId]\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn Promise.resolve(jobInfo);\n\t}\n\tasync findByIds(ids, view, paging, consistencyToken, signal) {\n\t\tthis.logger.verbose(\"findByIds(@count ids)\", ids.length);\n\t\tconst startIndex = paging?.cursor ? parseInt(paging.cursor) || 0 : 0;\n\t\tconst limit = paging?.limit || ids.length;\n\t\tconst pagedIds = ids.slice(startIndex, startIndex + limit);\n\t\tconst results = await this.documentView.getMany(pagedIds, view, consistencyToken, signal);\n\t\tconst nextCursor = startIndex + limit < ids.length ? String(startIndex + limit) : void 0;\n\t\treturn {\n\t\t\tresults,\n\t\t\toptions: paging || {\n\t\t\t\tcursor: \"0\",\n\t\t\t\tlimit: ids.length\n\t\t\t},\n\t\t\tnextCursor\n\t\t};\n\t}\n\tasync findBySlugs(slugs, view, paging, consistencyToken, signal) {\n\t\tthis.logger.verbose(\"findBySlugs(@count slugs)\", slugs.length);\n\t\tconst ids = await this.documentView.resolveSlugs(slugs, view, consistencyToken, signal);\n\t\treturn await this.findByIds(ids, view, paging, consistencyToken, signal);\n\t}\n\tasync findByParentId(parentId, view, paging, consistencyToken, signal) {\n\t\tthis.logger.verbose(\"findByParentId(@parentId)\", parentId);\n\t\tconst ids = (await this.documentIndexer.getOutgoing(parentId, [\"child\"], paging, consistencyToken, signal)).results.map((rel) => rel.targetId);\n\t\treturn await this.findByIds(ids, view, paging, void 0, signal);\n\t}\n\tasync findByType(type, view, paging, consistencyToken, signal) {\n\t\tthis.logger.verbose(\"findByType(@type)\", type);\n\t\treturn await this.documentView.findByType(type, view, paging, consistencyToken, signal);\n\t}\n\temitJobPending(jobId, meta) {\n\t\tconst event = {\n\t\t\tjobId,\n\t\t\tjobMeta: meta\n\t\t};\n\t\tthis.eventBus.emit(ReactorEventTypes.JOB_PENDING, event).catch(() => {});\n\t}\n};\n//#endregion\n//#region src/core/reactor-builder.ts\nvar ReactorBuilder = class {\n\tlogger;\n\tdocumentModels = [];\n\tupgradeManifests = [];\n\tfeatures = { legacyStorageEnabled: false };\n\treadModels = [];\n\texecutorManager;\n\texecutorConfig = {};\n\twriteCacheConfig;\n\tmigrationStrategy = \"auto\";\n\tsyncBuilder;\n\teventBus;\n\treadModelCoordinator;\n\tsignatureVerifier;\n\tkyselyInstance;\n\tsignalHandlersEnabled = false;\n\tqueueInstance;\n\tchannelScheme;\n\tjwtHandler;\n\tdocumentModelLoader;\n\twithLogger(logger) {\n\t\tthis.logger = logger;\n\t\treturn this;\n\t}\n\twithDocumentModels(models) {\n\t\tthis.documentModels = models;\n\t\treturn this;\n\t}\n\twithUpgradeManifests(manifests) {\n\t\tthis.upgradeManifests = manifests;\n\t\treturn this;\n\t}\n\twithFeatures(features) {\n\t\tthis.features = {\n\t\t\t...this.features,\n\t\t\t...features\n\t\t};\n\t\treturn this;\n\t}\n\twithReadModel(readModel) {\n\t\tthis.readModels.push(readModel);\n\t\treturn this;\n\t}\n\twithReadModelCoordinator(readModelCoordinator) {\n\t\tthis.readModelCoordinator = readModelCoordinator;\n\t\treturn this;\n\t}\n\twithExecutor(executor) {\n\t\tthis.executorManager = executor;\n\t\treturn this;\n\t}\n\twithExecutorConfig(config) {\n\t\tthis.executorConfig = {\n\t\t\t...this.executorConfig,\n\t\t\t...config\n\t\t};\n\t\treturn this;\n\t}\n\twithWriteCacheConfig(config) {\n\t\tthis.writeCacheConfig = config;\n\t\treturn this;\n\t}\n\twithMigrationStrategy(strategy) {\n\t\tthis.migrationStrategy = strategy;\n\t\treturn this;\n\t}\n\twithSync(syncBuilder) {\n\t\tthis.syncBuilder = syncBuilder;\n\t\treturn this;\n\t}\n\twithEventBus(eventBus) {\n\t\tthis.eventBus = eventBus;\n\t\treturn this;\n\t}\n\twithSignatureVerifier(verifier) {\n\t\tthis.signatureVerifier = verifier;\n\t\treturn this;\n\t}\n\twithKysely(kysely) {\n\t\tthis.kyselyInstance = kysely;\n\t\treturn this;\n\t}\n\twithQueue(queue) {\n\t\tthis.queueInstance = queue;\n\t\treturn this;\n\t}\n\twithChannelScheme(scheme) {\n\t\tthis.channelScheme = scheme;\n\t\treturn this;\n\t}\n\twithJwtHandler(handler) {\n\t\tthis.jwtHandler = handler;\n\t\treturn this;\n\t}\n\twithDocumentModelLoader(loader) {\n\t\tthis.documentModelLoader = loader;\n\t\treturn this;\n\t}\n\twithSignalHandlers() {\n\t\tthis.signalHandlersEnabled = true;\n\t\treturn this;\n\t}\n\tasync build() {\n\t\treturn (await this.buildModule()).reactor;\n\t}\n\tasync buildModule() {\n\t\tif (!this.logger) this.logger = new ConsoleLogger([\"reactor\"]);\n\t\tconst documentModelRegistry = new DocumentModelRegistry();\n\t\tif (this.upgradeManifests.length > 0) {\n\t\t\tconst results = documentModelRegistry.registerUpgradeManifests(...this.upgradeManifests);\n\t\t\tfor (const result of results) if (result.status === \"error\") this.logger.error(\"Failed to register upgrade manifest: @error\", result.error.message);\n\t\t}\n\t\tif (this.documentModels.length > 0) {\n\t\t\tconst results = documentModelRegistry.registerModules(...this.documentModels);\n\t\t\tfor (const result of results) if (result.status === \"error\") this.logger.error(\"Failed to register document model: @error\", result.error.message);\n\t\t}\n\t\tconst baseDatabase = this.kyselyInstance ?? await createDefaultDatabase();\n\t\tif (this.migrationStrategy === \"auto\") {\n\t\t\tconst result = await runMigrations(baseDatabase, REACTOR_SCHEMA);\n\t\t\tif (!result.success && result.error) throw new Error(`Database migration failed: ${result.error.message}`);\n\t\t}\n\t\tconst database = baseDatabase.withSchema(REACTOR_SCHEMA);\n\t\tconst operationStore = new KyselyOperationStore(database);\n\t\tconst keyframeStore = new KyselyKeyframeStore(database);\n\t\tconst eventBus = this.eventBus || new EventBus();\n\t\tconst resolver = this.documentModelLoader ? new DocumentModelResolver(documentModelRegistry, this.documentModelLoader) : new NullDocumentModelResolver(documentModelRegistry);\n\t\tconst queue = this.queueInstance ?? new InMemoryQueue(eventBus, resolver);\n\t\tconst jobTracker = new InMemoryJobTracker(eventBus);\n\t\tconst writeCache = new KyselyWriteCache(keyframeStore, operationStore, documentModelRegistry, {\n\t\t\tmaxDocuments: this.writeCacheConfig?.maxDocuments ?? 100,\n\t\t\tringBufferSize: this.writeCacheConfig?.ringBufferSize ?? 10,\n\t\t\tkeyframeInterval: this.writeCacheConfig?.keyframeInterval ?? 10\n\t\t});\n\t\tawait writeCache.startup();\n\t\tconst operationIndex = new KyselyOperationIndex(database);\n\t\tconst documentMetaCache = new DocumentMetaCache(operationStore, { maxDocuments: 1e3 });\n\t\tawait documentMetaCache.startup();\n\t\tconst collectionMembershipCache = new CollectionMembershipCache(operationIndex);\n\t\tconst executionScope = new KyselyExecutionScope(database, operationStore, operationIndex, keyframeStore, writeCache, documentMetaCache, collectionMembershipCache);\n\t\tlet executorManager = this.executorManager;\n\t\tif (!executorManager) executorManager = new SimpleJobExecutorManager(() => new SimpleJobExecutor(this.logger, documentModelRegistry, operationStore, eventBus, writeCache, operationIndex, documentMetaCache, collectionMembershipCache, this.executorConfig, this.signatureVerifier, executionScope), eventBus, queue, jobTracker, this.logger, resolver, this.executorConfig.jobTimeoutMs);\n\t\tawait executorManager.start(this.executorConfig.maxConcurrency ?? 1);\n\t\tconst readModelInstances = Array.from(new Set([...this.readModels]));\n\t\tconst documentViewConsistencyTracker = new ConsistencyTracker();\n\t\tconst documentView = new KyselyDocumentView(database, operationStore, operationIndex, writeCache, documentViewConsistencyTracker);\n\t\ttry {\n\t\t\tawait documentView.init();\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error initializing document view\", error);\n\t\t}\n\t\treadModelInstances.push(documentView);\n\t\tconst documentIndexerConsistencyTracker = new ConsistencyTracker();\n\t\tconst documentIndexer = new KyselyDocumentIndexer(database, operationIndex, writeCache, documentIndexerConsistencyTracker);\n\t\ttry {\n\t\t\tawait documentIndexer.init();\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error initializing document indexer\", error);\n\t\t}\n\t\treadModelInstances.push(documentIndexer);\n\t\tconst subscriptionManager = new ReactorSubscriptionManager(new DefaultSubscriptionErrorHandler());\n\t\tconst subscriptionNotificationReadModel = new SubscriptionNotificationReadModel(subscriptionManager, documentView);\n\t\tconst processorManagerConsistencyTracker = new ConsistencyTracker();\n\t\tconst processorManager = new ProcessorManager(database, operationIndex, writeCache, processorManagerConsistencyTracker, this.logger);\n\t\ttry {\n\t\t\tawait processorManager.init();\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error initializing processor manager\", error);\n\t\t}\n\t\tconst readModelCoordinator = this.readModelCoordinator ? this.readModelCoordinator : new ReadModelCoordinator(eventBus, readModelInstances, [subscriptionNotificationReadModel, processorManager]);\n\t\tconst reactor = new Reactor(this.logger, documentModelRegistry, queue, jobTracker, readModelCoordinator, this.features, documentView, documentIndexer, operationStore, eventBus, executorManager);\n\t\tlet syncModule = void 0;\n\t\tif (this.channelScheme) {\n\t\t\tconst factory = this.channelScheme === ChannelScheme.CONNECT ? new GqlRequestChannelFactory(this.logger, this.jwtHandler, queue) : new GqlResponseChannelFactory(this.logger);\n\t\t\tsyncModule = new SyncBuilder().withChannelFactory(factory).buildModule(reactor, this.logger, operationIndex, eventBus, database);\n\t\t\tawait syncModule.syncManager.startup();\n\t\t} else if (this.syncBuilder) {\n\t\t\tsyncModule = this.syncBuilder.buildModule(reactor, this.logger, operationIndex, eventBus, database);\n\t\t\tawait syncModule.syncManager.startup();\n\t\t}\n\t\tconst module = {\n\t\t\teventBus,\n\t\t\tdocumentModelRegistry,\n\t\t\tqueue,\n\t\t\tjobTracker,\n\t\t\texecutorManager,\n\t\t\tdatabase,\n\t\t\toperationStore,\n\t\t\tkeyframeStore,\n\t\t\twriteCache,\n\t\t\toperationIndex,\n\t\t\tdocumentView,\n\t\t\tdocumentViewConsistencyTracker,\n\t\t\tdocumentIndexer,\n\t\t\tdocumentIndexerConsistencyTracker,\n\t\t\treadModelCoordinator,\n\t\t\tsubscriptionManager,\n\t\t\tprocessorManager,\n\t\t\tprocessorManagerConsistencyTracker,\n\t\t\tsyncModule,\n\t\t\treactor\n\t\t};\n\t\tif (this.signalHandlersEnabled) this.attachSignalHandlers(module);\n\t\treturn module;\n\t}\n\tattachSignalHandlers(module) {\n\t\tif (typeof globalThis === \"undefined\" || !(\"process\" in globalThis) || typeof globalThis.process.on !== \"function\") return;\n\t\tconst nodeProcess = globalThis.process;\n\t\tlet shutdownInProgress = false;\n\t\tconst handler = async (signal) => {\n\t\t\tif (shutdownInProgress) {\n\t\t\t\tthis.logger.warn(`Received ${signal} again, forcing exit`);\n\t\t\t\tnodeProcess.exit(1);\n\t\t\t}\n\t\t\tshutdownInProgress = true;\n\t\t\tthis.logger.info(`Received ${signal}, starting graceful shutdown...`);\n\t\t\tconst status = module.reactor.kill();\n\t\t\ttry {\n\t\t\t\tawait status.completed;\n\t\t\t} catch (error) {\n\t\t\t\tthis.logger.error(\"Shutdown failed waiting for reactor:\", error);\n\t\t\t\tnodeProcess.exit(1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait module.database.destroy();\n\t\t\t} catch (error) {\n\t\t\t\tthis.logger.error(\"Shutdown failed destroying database:\", error);\n\t\t\t\tnodeProcess.exit(1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.logger.info(\"Shutdown complete\");\n\t\t\tnodeProcess.exit(0);\n\t\t};\n\t\tnodeProcess.on(\"SIGINT\", () => void handler(\"SIGINT\"));\n\t\tnodeProcess.on(\"SIGTERM\", () => void handler(\"SIGTERM\"));\n\t}\n};\n//#endregion\n//#region src/signer/passthrough-signer.ts\n/**\n* A no-op signer that returns empty values for all methods.\n* Used when signing is not required.\n*/\nvar PassthroughSigner = class {\n\tpublicKey = {};\n\tsign() {\n\t\treturn Promise.resolve(new Uint8Array(0));\n\t}\n\tverify() {\n\t\treturn Promise.resolve();\n\t}\n\tsignAction() {\n\t\treturn Promise.resolve([\n\t\t\t\"\",\n\t\t\t\"\",\n\t\t\t\"\",\n\t\t\t\"\",\n\t\t\t\"\"\n\t\t]);\n\t}\n};\n//#endregion\n//#region src/core/reactor-client-builder.ts\n/**\n* Builder class for constructing ReactorClient instances with proper configuration\n*/\nvar ReactorClientBuilder = class {\n\tlogger;\n\treactorBuilder;\n\treactor;\n\teventBus;\n\tdocumentIndexer;\n\tdocumentView;\n\tsigner;\n\tsignatureVerifier;\n\tsubscriptionManager;\n\tjobAwaiter;\n\tdocumentModelLoader;\n\t/**\n\t* Sets the logger for the ReactorClient.\n\t* @param logger - The logger to use.\n\t* @returns The ReactorClientBuilder instance.\n\t*/\n\twithLogger(logger) {\n\t\tthis.logger = logger;\n\t\treturn this;\n\t}\n\t/**\n\t* Either this or withReactor must be set.\n\t*/\n\twithReactorBuilder(reactorBuilder) {\n\t\tif (this.reactor) throw new Error(\"Reactor is already set\");\n\t\tthis.reactorBuilder = reactorBuilder;\n\t\treturn this;\n\t}\n\t/**\n\t* Either this or withReactorBuilder must be set.\n\t*/\n\twithReactor(reactor, eventBus, documentIndexer, documentView) {\n\t\tif (this.reactorBuilder) throw new Error(\"ReactorBuilder is already set\");\n\t\tthis.reactor = reactor;\n\t\tthis.eventBus = eventBus;\n\t\tthis.documentIndexer = documentIndexer;\n\t\tthis.documentView = documentView;\n\t\treturn this;\n\t}\n\t/**\n\t* Sets the signer configuration for signing and verifying actions.\n\t*\n\t* @param config - Either an ISigner for signing only, or a SignerConfig for both signing and verification\n\t*/\n\twithSigner(config) {\n\t\tif (\"signer\" in config) {\n\t\t\tthis.signer = config.signer;\n\t\t\tthis.signatureVerifier = config.verifier;\n\t\t} else this.signer = config;\n\t\treturn this;\n\t}\n\twithSubscriptionManager(subscriptionManager) {\n\t\tthis.subscriptionManager = subscriptionManager;\n\t\treturn this;\n\t}\n\twithJobAwaiter(jobAwaiter) {\n\t\tthis.jobAwaiter = jobAwaiter;\n\t\treturn this;\n\t}\n\twithDocumentModelLoader(loader) {\n\t\tthis.documentModelLoader = loader;\n\t\treturn this;\n\t}\n\tasync build() {\n\t\treturn (await this.buildModule()).client;\n\t}\n\tasync buildModule() {\n\t\tif (!this.logger) this.logger = new ConsoleLogger([\"reactor-client\"]);\n\t\tlet reactor;\n\t\tlet eventBus;\n\t\tlet documentIndexer;\n\t\tlet documentView;\n\t\tlet reactorModule;\n\t\tif (this.reactorBuilder) {\n\t\t\tif (this.signatureVerifier) this.reactorBuilder.withSignatureVerifier(this.signatureVerifier);\n\t\t\tif (this.documentModelLoader) this.reactorBuilder.withDocumentModelLoader(this.documentModelLoader);\n\t\t\treactorModule = await this.reactorBuilder.buildModule();\n\t\t\treactor = reactorModule.reactor;\n\t\t\teventBus = reactorModule.eventBus;\n\t\t\tdocumentIndexer = reactorModule.documentIndexer;\n\t\t\tdocumentView = reactorModule.documentView;\n\t\t} else if (this.reactor && this.eventBus && this.documentIndexer && this.documentView) {\n\t\t\treactor = this.reactor;\n\t\t\teventBus = this.eventBus;\n\t\t\tdocumentIndexer = this.documentIndexer;\n\t\t\tdocumentView = this.documentView;\n\t\t\treactorModule = void 0;\n\t\t} else throw new Error(\"Either ReactorBuilder or (Reactor + EventBus + DocumentIndexer + DocumentView) is required\");\n\t\tconst signer = this.signer ?? new PassthroughSigner();\n\t\tconst subscriptionManager = this.subscriptionManager ?? reactorModule?.subscriptionManager ?? new ReactorSubscriptionManager(new DefaultSubscriptionErrorHandler());\n\t\tconst jobAwaiter = this.jobAwaiter ?? new JobAwaiter(eventBus, (jobId, signal) => reactor.getJobStatus(jobId, signal));\n\t\treturn {\n\t\t\tclient: new ReactorClient(this.logger, reactor, signer, subscriptionManager, jobAwaiter, documentIndexer, documentView),\n\t\t\treactor,\n\t\t\teventBus,\n\t\t\tdocumentIndexer,\n\t\t\tdocumentView,\n\t\t\tsigner,\n\t\t\tsubscriptionManager,\n\t\t\tjobAwaiter,\n\t\t\treactorModule\n\t\t};\n\t}\n};\n//#endregion\n//#region src/shared/drive-url.ts\n/**\n* Parse a drive URL to extract drive ID and construct GraphQL endpoint.\n* e.g., \"http://localhost:4001/d/abc123\" -> { driveId: \"abc123\", graphqlEndpoint: \"http://localhost:4001/graphql/r\" }\n*/\nfunction parseDriveUrl(url) {\n\tconst parsedUrl = new URL(url);\n\treturn {\n\t\turl,\n\t\tdriveId: url.split(\"/\").pop() ?? \"\",\n\t\tgraphqlEndpoint: `${parsedUrl.protocol}//${parsedUrl.host}/graphql/r`\n\t};\n}\n/**\n* Extract drive ID from a drive URL.\n*/\nfunction driveIdFromUrl(url) {\n\treturn url.split(\"/\").pop() ?? \"\";\n}\n//#endregion\n//#region src/executor/types.ts\n/**\n* Event types for the job executor\n*/\nconst JobExecutorEventTypes = {\n\tJOB_STARTED: 2e4,\n\tJOB_COMPLETED: 20001,\n\tJOB_FAILED: 20002,\n\tEXECUTOR_STARTED: 20003,\n\tEXECUTOR_STOPPED: 20004\n};\n//#endregion\n//#region src/admin/document-integrity-service.ts\nconst nullKeyframeStore = {\n\tputKeyframe: () => Promise.resolve(),\n\tfindNearestKeyframe: () => Promise.resolve(void 0),\n\tlistKeyframes: () => Promise.resolve([]),\n\tdeleteKeyframes: () => Promise.resolve(0)\n};\nvar DocumentIntegrityService = class {\n\tkeyframeStore;\n\toperationStore;\n\twriteCache;\n\tdocumentView;\n\tdocumentModelRegistry;\n\tconstructor(keyframeStore, operationStore, writeCache, documentView, documentModelRegistry) {\n\t\tthis.keyframeStore = keyframeStore;\n\t\tthis.operationStore = operationStore;\n\t\tthis.writeCache = writeCache;\n\t\tthis.documentView = documentView;\n\t\tthis.documentModelRegistry = documentModelRegistry;\n\t}\n\tasync validateDocument(documentId, branch = \"main\", signal) {\n\t\tconst keyframeIssues = [];\n\t\tconst snapshotIssues = [];\n\t\tconst replayCache = new KyselyWriteCache(nullKeyframeStore, this.operationStore, this.documentModelRegistry, {\n\t\t\tmaxDocuments: 1,\n\t\t\tringBufferSize: 1,\n\t\t\tkeyframeInterval: Number.MAX_SAFE_INTEGER\n\t\t});\n\t\tconst keyframes = await this.keyframeStore.listKeyframes(documentId, void 0, branch, signal);\n\t\tfor (const keyframe of keyframes) {\n\t\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\t\treplayCache.invalidate(documentId, keyframe.scope, branch);\n\t\t\tconst replayedDoc = await replayCache.getState(documentId, keyframe.scope, branch, keyframe.revision, signal);\n\t\t\tconst kfHash = hashDocumentStateForScope(keyframe.document, keyframe.scope);\n\t\t\tconst replayHash = hashDocumentStateForScope(replayedDoc, keyframe.scope);\n\t\t\tif (kfHash !== replayHash) keyframeIssues.push({\n\t\t\t\tscope: keyframe.scope,\n\t\t\t\tbranch,\n\t\t\t\trevision: keyframe.revision,\n\t\t\t\tkeyframeHash: kfHash,\n\t\t\t\treplayedHash: replayHash\n\t\t\t});\n\t\t}\n\t\tlet currentDoc;\n\t\ttry {\n\t\t\tcurrentDoc = await this.documentView.get(documentId);\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tdocumentId,\n\t\t\t\tisConsistent: keyframeIssues.length === 0,\n\t\t\t\tkeyframeIssues,\n\t\t\t\tsnapshotIssues\n\t\t\t};\n\t\t}\n\t\tconst revisions = await this.operationStore.getRevisions(documentId, branch, signal);\n\t\tconst allScopes = Object.keys(revisions.revision);\n\t\tfor (const scope of allScopes) {\n\t\t\tif (scope === \"document\") continue;\n\t\t\treplayCache.invalidate(documentId, scope, branch);\n\t\t\tlet replayedDoc;\n\t\t\ttry {\n\t\t\t\treplayedDoc = await replayCache.getState(documentId, scope, branch, void 0, signal);\n\t\t\t} catch {\n\t\t\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst snapshotHash = hashDocumentStateForScope(currentDoc, scope);\n\t\t\tconst replayHash = hashDocumentStateForScope(replayedDoc, scope);\n\t\t\tif (snapshotHash !== replayHash) snapshotIssues.push({\n\t\t\t\tscope,\n\t\t\t\tbranch,\n\t\t\t\tsnapshotHash,\n\t\t\t\treplayedHash: replayHash\n\t\t\t});\n\t\t}\n\t\treturn {\n\t\t\tdocumentId,\n\t\t\tisConsistent: keyframeIssues.length === 0 && snapshotIssues.length === 0,\n\t\t\tkeyframeIssues,\n\t\t\tsnapshotIssues\n\t\t};\n\t}\n\tasync rebuildKeyframes(documentId, branch = \"main\", signal) {\n\t\treturn {\n\t\t\tdocumentId,\n\t\t\tkeyframesDeleted: await this.keyframeStore.deleteKeyframes(documentId, void 0, branch, signal),\n\t\t\tscopesInvalidated: 0\n\t\t};\n\t}\n\tasync rebuildSnapshots(documentId, branch = \"main\", signal) {\n\t\tconst scopes = await this.discoverScopes(documentId, branch, signal);\n\t\tfor (const scope of scopes) {\n\t\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\t\tthis.writeCache.invalidate(documentId, scope, branch);\n\t\t}\n\t\treturn {\n\t\t\tdocumentId,\n\t\t\tkeyframesDeleted: 0,\n\t\t\tscopesInvalidated: scopes.length\n\t\t};\n\t}\n\tasync discoverScopes(documentId, branch, signal) {\n\t\tconst revisions = await this.operationStore.getRevisions(documentId, branch, signal);\n\t\treturn Object.keys(revisions.revision);\n\t}\n};\n//#endregion\nexport { BaseReadModel, ChannelError, ChannelErrorSource, ChannelScheme, ConsistencyTracker, DefaultSubscriptionErrorHandler, DocumentChangeType, DocumentIntegrityService, DocumentModelRegistry, DuplicateManifestError, DuplicateModuleError, DuplicateOperationError, EventBus, EventBusAggregateError, GqlRequestChannel, GqlRequestChannelFactory, GqlResponseChannel, GqlResponseChannelFactory, SimpleJobExecutor as InMemoryJobExecutor, SimpleJobExecutor, InMemoryJobTracker, InMemoryQueue, IntervalPollTimer, InvalidModuleError, JobAwaiter, JobExecutorEventTypes, JobStatus, KyselyDocumentIndexer, KyselyDocumentView, KyselyKeyframeStore, KyselyOperationStore, KyselySyncCursorStorage, KyselySyncRemoteStorage, KyselyWriteCache, Mailbox, ModuleNotFoundError, NullDocumentModelResolver, OptimisticLockError, PollingChannelError, ProcessorManager, PropagationMode, QueueEventTypes, REACTOR_SCHEMA, Reactor, ReactorBuilder, ReactorClient, ReactorClientBuilder, ReactorEventTypes, ReactorSubscriptionManager, ReadModelCoordinator, RelationalDbProcessor, RelationshipChangeType, RevisionMismatchError, SimpleJobExecutorManager, SyncBuilder, SyncEventTypes, SyncOperation, SyncOperationAggregateError, SyncOperationStatus, SyncStatus, SyncStatusTracker, addRelationshipAction, batchOperationsByDocument, consolidateSyncOperations, createDocumentAction, createMutableShutdownStatus, createRelationalDb, deleteDocumentAction, documentActions, driveCollectionId, driveIdFromUrl, envelopesToSyncOperations, getMigrationStatus, makeConsistencyKey, parseDriveUrl, removeRelationshipAction, runMigrations, sortEnvelopesByFirstOperationTimestamp, trimMailboxFromAckOrdinal, upgradeDocumentAction };\n\n//# sourceMappingURL=index.js.map","import { t as makePHEventFunctions } from \"./make-ph-event-functions-Cr4GqOTT.js\";\nimport { logger } from \"document-model\";\nimport { buildSignedAction } from \"@powerhousedao/shared/document-model\";\nimport { DocumentChangeType } from \"@powerhousedao/reactor\";\nimport { BrowserAnalyticsStore } from \"@powerhousedao/analytics-engine-browser\";\nimport { AnalyticsQueryEngine } from \"@powerhousedao/analytics-engine-core\";\nimport { use, useCallback, useSyncExternalStore } from \"react\";\n//#region src/actions/queue.ts\nasync function queueActions(document, actionOrActions) {\n\tif (!document) throw new Error(\"No document provided\");\n\tif (!actionOrActions) throw new Error(\"No actions provided\");\n\tconst actions = Array.isArray(actionOrActions) ? actionOrActions : [actionOrActions];\n\tif (actions.length === 0) throw new Error(\"No actions provided\");\n\tconst reactorClient = window.ph?.reactorClient;\n\tif (!reactorClient) throw new Error(\"ReactorClient not initialized\");\n\treturn await reactorClient.execute(document.header.id, \"main\", actions);\n}\nasync function queueOperations(documentId, operationOrOperations) {\n\tif (!documentId) throw new Error(\"No documentId provided\");\n\tif (!operationOrOperations) throw new Error(\"No operations provided\");\n\tconst operations = Array.isArray(operationOrOperations) ? operationOrOperations : [operationOrOperations];\n\tif (operations.length === 0) throw new Error(\"No operations provided\");\n\tconst reactorClient = window.ph?.reactorClient;\n\tif (!reactorClient) throw new Error(\"ReactorClient not initialized\");\n\tconst actions = operations.map((op) => op.action);\n\treturn await reactorClient.execute(documentId, \"main\", actions);\n}\nasync function uploadOperations(documentId, allOperations, pushOperations, options) {\n\tconst operationsLimit = options?.operationsLimit || 50;\n\tconst onProgress = options?.onProgress;\n\tlogger.verbose(`uploadDocumentOperations(documentId:${documentId}, ops: ${Object.keys(allOperations).join(\",\")}, limit:${operationsLimit})`);\n\tconst allOperationsArray = Object.values(allOperations).filter((ops) => ops !== void 0);\n\tconst totalOperations = allOperationsArray.reduce((total, operations) => total + operations.length, 0);\n\tlet uploadedOperations = 0;\n\tfor (const operations of allOperationsArray) for (let i = 0; i < operations.length; i += operationsLimit) {\n\t\tlogger.verbose(`uploadDocumentOperations:for(i:${i}, ops:${operations.length}, limit:${operationsLimit}): START`);\n\t\tconst chunk = operations.slice(i, i + operationsLimit);\n\t\tconst operation = chunk.at(-1);\n\t\tif (!operation) break;\n\t\tconst scope = operation.action.scope;\n\t\tawait pushOperations(documentId, chunk);\n\t\tuploadedOperations += chunk.length;\n\t\tif (onProgress) onProgress({\n\t\t\tstage: \"uploading\",\n\t\t\tprogress: Math.round(uploadedOperations / totalOperations * 100),\n\t\t\ttotalOperations,\n\t\t\tuploadedOperations\n\t\t});\n\t\tlogger.verbose(`uploadDocumentOperations:for:waitForUpdate(${documentId}:${scope} rev ${operation.index}): NEXT`);\n\t}\n\tlogger.verbose(`uploadDocumentOperations:for:waitForUpdate(${documentId}): END`);\n}\n//#endregion\n//#region src/actions/sign.ts\nasync function signAction(action, document) {\n\tconst reactor = window.ph?.reactorClient;\n\tif (!reactor) return action;\n\tconst reducer = (await reactor.getDocumentModelModule(document.header.documentType)).reducer;\n\tconst renown = window.ph?.renown;\n\tif (!renown?.user) return action;\n\tif (!action.context?.signer) return action;\n\tconst actionSigner = action.context.signer;\n\treturn await buildSignedAction(action, reducer, document, actionSigner, renown.crypto.sign);\n}\nfunction addActionContext(action) {\n\tconst renown = window.ph?.renown;\n\tif (!renown?.user) return action;\n\treturn {\n\t\tcontext: { signer: {\n\t\t\tapp: {\n\t\t\t\tname: \"Connect\",\n\t\t\t\tkey: renown.did\n\t\t\t},\n\t\t\tuser: {\n\t\t\t\taddress: renown.user.address,\n\t\t\t\tnetworkId: renown.user.networkId,\n\t\t\t\tchainId: renown.user.chainId\n\t\t\t},\n\t\t\tsignatures: []\n\t\t} },\n\t\t...action\n\t};\n}\nasync function makeSignedActionWithContext(action, document) {\n\tif (!action) {\n\t\tlogger.error(\"No action found\");\n\t\treturn;\n\t}\n\tif (!document) {\n\t\tlogger.error(\"No document found\");\n\t\treturn;\n\t}\n\treturn addActionContext(await signAction(action, document));\n}\nasync function makeSignedActionsWithContext(actionOrActions, document) {\n\tif (!actionOrActions) {\n\t\tlogger.error(\"No actions found\");\n\t\treturn;\n\t}\n\tconst actions = Array.isArray(actionOrActions) ? actionOrActions : [actionOrActions];\n\treturn (await Promise.all(actions.map((action) => makeSignedActionWithContext(action, document)))).filter((a) => a !== void 0);\n}\n//#endregion\n//#region src/actions/dispatch.ts\nasync function getDocument(documentId) {\n\ttry {\n\t\treturn await window.ph?.reactorClient?.get(documentId);\n\t} catch (error) {\n\t\tlogger.debug(`Failed to get document with id ${documentId}:`, error);\n\t\treturn;\n\t}\n}\nfunction getActionErrors(result, actions) {\n\treturn actions.reduce((errors, a) => {\n\t\tconst scopeOperations = result.operations[a.scope];\n\t\tif (!scopeOperations) return errors;\n\t\tconst op = scopeOperations.findLast((op) => op.action.id === a.id);\n\t\tif (op?.error) errors.push(new Error(op.error));\n\t\treturn errors;\n\t}, new Array());\n}\nasync function dispatchActions(actionOrActions, documentOrDocumentId, onErrors, onSuccess) {\n\tconst document = typeof documentOrDocumentId === \"string\" ? await getDocument(documentOrDocumentId) : documentOrDocumentId;\n\tif (!document) {\n\t\tlogger.error(`Document with id ${JSON.stringify(documentOrDocumentId)} not found`);\n\t\treturn;\n\t}\n\tconst signedActionsWithContext = await makeSignedActionsWithContext(actionOrActions, document);\n\tif (!signedActionsWithContext) {\n\t\tlogger.error(\"No signed actions with context found\");\n\t\treturn;\n\t}\n\tconst result = await queueActions(document, signedActionsWithContext);\n\tif (onErrors && result) {\n\t\tconst errors = getActionErrors(result, signedActionsWithContext);\n\t\tif (errors.length) onErrors(errors);\n\t}\n\tif (onSuccess && result) onSuccess(result);\n\treturn result;\n}\n//#endregion\n//#region src/global/core.ts\nfunction getGlobal(namespace) {\n\tif (typeof window === \"undefined\") return void 0;\n\treturn window.powerhouse?.[namespace];\n}\nfunction setGlobal(namespace, value) {\n\tif (typeof window === \"undefined\") return;\n\twindow.powerhouse = window.powerhouse || {};\n\twindow.powerhouse[namespace] = value;\n}\nfunction clearGlobal(namespace) {\n\tif (typeof window === \"undefined\") return;\n\tif (window.powerhouse?.[namespace]) {\n\t\tdelete window.powerhouse[namespace];\n\t\tif (Object.keys(window.powerhouse).length === 0) delete window.powerhouse;\n\t}\n}\n//#endregion\n//#region src/analytics/store.ts\nasync function createAnalyticsStore(options) {\n\tconst store = new BrowserAnalyticsStore(options);\n\tawait store.init();\n\treturn {\n\t\tstore,\n\t\tengine: new AnalyticsQueryEngine(store),\n\t\toptions\n\t};\n}\nasync function getAnalyticsStore() {\n\treturn (await getGlobal(\"analytics\"))?.store ?? null;\n}\n//#endregion\n//#region src/document-cache.ts\nfunction addPromiseState(promise) {\n\tif (\"status\" in promise) return promise;\n\tconst promiseWithState = promise;\n\tpromiseWithState.status = \"pending\";\n\tpromiseWithState.then((value) => {\n\t\tpromiseWithState.status = \"fulfilled\";\n\t\tpromiseWithState.value = value;\n\t}, (reason) => {\n\t\tpromiseWithState.status = \"rejected\";\n\t\tpromiseWithState.reason = reason;\n\t\tthrow reason;\n\t});\n\treturn promiseWithState;\n}\nfunction readPromiseState(promise) {\n\treturn \"status\" in promise ? promise : { status: \"pending\" };\n}\n/**\n* Document cache implementation that uses the new ReactorClient API.\n*\n* This cache subscribes to document change events via IReactorClient.subscribe()\n* and automatically updates the cache when documents are created, updated, or deleted.\n*/\nvar DocumentCache = class {\n\tdocuments = /* @__PURE__ */ new Map();\n\tbatchPromises = /* @__PURE__ */ new Map();\n\tlisteners = /* @__PURE__ */ new Map();\n\tunsubscribe = null;\n\tconstructor(client) {\n\t\tthis.client = client;\n\t\tthis.unsubscribe = client.subscribe({}, (event) => {\n\t\t\tthis.handleDocumentChange(event);\n\t\t});\n\t}\n\thandleDocumentChange(event) {\n\t\tif (event.type === DocumentChangeType.Deleted) {\n\t\t\tconst documentId = event.context?.childId;\n\t\t\tif (documentId) this.handleDocumentDeleted(documentId);\n\t\t} else if (event.type === DocumentChangeType.Updated) for (const doc of event.documents) this.handleDocumentUpdated(doc.header.id).catch(console.warn);\n\t}\n\thandleDocumentDeleted(documentId) {\n\t\tconst listeners = this.listeners.get(documentId);\n\t\tthis.documents.delete(documentId);\n\t\tthis.invalidateBatchesContaining(documentId);\n\t\tif (listeners) listeners.forEach((listener) => listener());\n\t\tthis.listeners.delete(documentId);\n\t}\n\tasync handleDocumentUpdated(documentId) {\n\t\tif (this.documents.has(documentId)) {\n\t\t\tawait this.get(documentId, true);\n\t\t\tconst listeners = this.listeners.get(documentId);\n\t\t\tif (listeners) listeners.forEach((listener) => listener());\n\t\t}\n\t}\n\tinvalidateBatchesContaining(documentId) {\n\t\tfor (const key of this.batchPromises.keys()) if (key.split(\",\").includes(documentId)) this.batchPromises.delete(key);\n\t}\n\tget(id, refetch) {\n\t\tconst currentData = this.documents.get(id);\n\t\tif (currentData) {\n\t\t\tif (currentData.status === \"pending\") return currentData;\n\t\t\tif (!refetch) return currentData;\n\t\t}\n\t\tconst documentPromise = this.client.get(id);\n\t\tthis.documents.set(id, addPromiseState(documentPromise));\n\t\treturn documentPromise;\n\t}\n\tgetBatch(ids) {\n\t\tconst key = ids.join(\",\");\n\t\tconst cached = this.batchPromises.get(key);\n\t\tconst hasDeletedDocuments = ids.some((id) => !this.documents.has(id));\n\t\tconst currentPromises = ids.map((id) => this.get(id));\n\t\tif (hasDeletedDocuments) {\n\t\t\tconst batchPromise = Promise.all(currentPromises);\n\t\t\tthis.batchPromises.set(key, {\n\t\t\t\tpromises: currentPromises,\n\t\t\t\tpromise: batchPromise\n\t\t\t});\n\t\t\treturn batchPromise;\n\t\t}\n\t\tif (cached) {\n\t\t\tif (currentPromises.every((p, i) => p === cached.promises[i])) return cached.promise;\n\t\t}\n\t\tconst states = currentPromises.map((p) => readPromiseState(p));\n\t\tif (states.every((s) => s.status === \"fulfilled\")) {\n\t\t\tconst values = states.map((s) => s.value);\n\t\t\tconst batchPromise = Promise.resolve(values);\n\t\t\tbatchPromise.status = \"fulfilled\";\n\t\t\tbatchPromise.value = values;\n\t\t\tthis.batchPromises.set(key, {\n\t\t\t\tpromises: currentPromises,\n\t\t\t\tpromise: batchPromise\n\t\t\t});\n\t\t\treturn batchPromise;\n\t\t}\n\t\tif (cached) return cached.promise;\n\t\tconst batchPromise = Promise.all(currentPromises);\n\t\tthis.batchPromises.set(key, {\n\t\t\tpromises: currentPromises,\n\t\t\tpromise: batchPromise\n\t\t});\n\t\treturn batchPromise;\n\t}\n\tsubscribe(id, callback) {\n\t\tconst ids = Array.isArray(id) ? id : [id];\n\t\tfor (const docId of ids) {\n\t\t\tconst listeners = this.listeners.get(docId) ?? [];\n\t\t\tthis.listeners.set(docId, [...listeners, callback]);\n\t\t}\n\t\treturn () => {\n\t\t\tfor (const docId of ids) {\n\t\t\t\tconst listeners = this.listeners.get(docId) ?? [];\n\t\t\t\tthis.listeners.set(docId, listeners.filter((listener) => listener !== callback));\n\t\t\t}\n\t\t};\n\t}\n\t/**\n\t* Disposes of the cache and unsubscribes from document change events.\n\t*/\n\tdispose() {\n\t\tif (this.unsubscribe) {\n\t\t\tthis.unsubscribe();\n\t\t\tthis.unsubscribe = null;\n\t\t}\n\t}\n};\n//#endregion\n//#region src/hooks/document-cache.ts\nconst documentEventFunctions = makePHEventFunctions(\"documentCache\");\n/** Returns all documents in the reactor. */\nconst useDocumentCache = documentEventFunctions.useValue;\n/** Sets all of the documents in the reactor. */\nconst setDocumentCache = documentEventFunctions.setValue;\n/** Adds an event handler for all of the documents in the reactor. */\nconst addDocumentCacheEventHandler = documentEventFunctions.addEventHandler;\n/**\n* Reads the state of a document promise and converts it to a query state object.\n* @param promise - The document promise to read\n* @returns An object containing the status, data, error, and isPending flag\n*/\nfunction getDocumentQueryState(promise) {\n\tconst state = readPromiseState(promise);\n\tswitch (state.status) {\n\t\tcase \"pending\": return {\n\t\t\tstatus: \"pending\",\n\t\t\tisPending: true,\n\t\t\terror: void 0,\n\t\t\tdata: void 0\n\t\t};\n\t\tcase \"fulfilled\": return {\n\t\t\tstatus: \"success\",\n\t\t\tisPending: false,\n\t\t\terror: void 0,\n\t\t\tdata: state.value\n\t\t};\n\t\tcase \"rejected\": return {\n\t\t\tstatus: \"error\",\n\t\t\tisPending: false,\n\t\t\terror: state.reason,\n\t\t\tdata: void 0\n\t\t};\n\t}\n}\n/**\n* Retrieves a document from the reactor and subscribes to changes using React Suspense.\n* This hook will suspend rendering while the document is loading.\n* @param id - The document ID to retrieve, or null/undefined to skip retrieval\n* @returns The document if found, or undefined if id is null/undefined\n*/\nfunction useDocument(id) {\n\tconst documentCache = useDocumentCache();\n\tconst document = useSyncExternalStore((cb) => id && documentCache ? documentCache.subscribe(id, cb) : () => {}, () => id ? documentCache?.get(id) : void 0);\n\treturn document ? use(document) : void 0;\n}\n/**\n* Retrieves multiple documents from the reactor using React Suspense.\n* This hook will suspend rendering while any of the documents are loading.\n*\n* Uses getBatch from the document cache which handles promise caching internally,\n* ensuring stable references for useSyncExternalStore.\n*\n* @param ids - Array of document IDs to retrieve, or null/undefined to skip retrieval\n* @returns An array of documents if found, or empty array if ids is null/undefined\n*/\nfunction useDocuments(ids) {\n\tconst documentCache = useDocumentCache();\n\tconst documents = useSyncExternalStore((cb) => ids?.length && documentCache ? documentCache.subscribe(ids, cb) : () => {}, () => ids?.length && documentCache ? documentCache.getBatch(ids) : void 0);\n\treturn documents ? use(documents) : [];\n}\n/**\n* Returns a function to retrieve a document from the cache.\n* The returned function fetches and returns a document by ID.\n* @returns A function that takes a document ID and returns a Promise of the document\n*/\nfunction useGetDocument() {\n\tconst documentCache = useDocumentCache();\n\treturn useCallback((id) => {\n\t\tif (!documentCache) return Promise.reject(/* @__PURE__ */ new Error(\"Document cache not initialized\"));\n\t\treturn documentCache.get(id);\n\t}, [documentCache]);\n}\n/**\n* Returns a function to retrieve multiple documents from the cache.\n* The returned function fetches and returns documents by their IDs.\n* @returns A function that takes an array of document IDs and returns a Promise of the documents\n*/\nfunction useGetDocuments() {\n\tconst documentCache = useDocumentCache();\n\treturn useCallback((ids) => {\n\t\tif (!documentCache) return Promise.reject(/* @__PURE__ */ new Error(\"Document cache not initialized\"));\n\t\treturn documentCache.getBatch(ids);\n\t}, [documentCache]);\n}\n/**\n* Retrieves a document from the reactor without suspending rendering.\n* Returns the current state of the document loading operation.\n* @param id - The document ID to retrieve, or null/undefined to skip retrieval\n* @returns An object containing:\n* - status: \"initial\" | \"pending\" | \"success\" | \"error\"\n* - data: The document if successfully loaded\n* - isPending: Boolean indicating if the document is currently loading\n* - error: Any error that occurred during loading\n* - reload: Function to force reload the document from cache\n*/\nfunction useGetDocumentAsync(id) {\n\tconst documentCache = useDocumentCache();\n\tif (!id || !documentCache) return {\n\t\tstatus: \"initial\",\n\t\tdata: void 0,\n\t\tisPending: false,\n\t\terror: void 0,\n\t\treload: void 0\n\t};\n\treturn {\n\t\t...getDocumentQueryState(documentCache.get(id)),\n\t\treload: () => documentCache.get(id, true)\n\t};\n}\n//#endregion\n//#region src/hooks/dispatch.ts\nfunction useDispatch(document) {\n\t/**\n\t* Dispatches actions to the document.\n\t* @param actionOrActions - The action or actions to dispatch.\n\t* @param onErrors - Callback invoked with any errors that occurred during action execution.\n\t*/\n\tfunction dispatch(actionOrActions, onErrors, onSuccess) {\n\t\tdispatchActions(actionOrActions, document, onErrors, onSuccess).catch(logger.error);\n\t}\n\treturn [document, dispatch];\n}\n//#endregion\n//#region src/hooks/document-by-id.ts\n/** Returns a document by id. */\nfunction useDocumentById(id) {\n\tconst document = useDocument(id);\n\tconst [, dispatch] = useDispatch(document);\n\treturn [document, dispatch];\n}\n/** Returns documents by ids. */\nfunction useDocumentsByIds(ids) {\n\treturn useDocuments(ids);\n}\n//#endregion\nexport { uploadOperations as C, queueOperations as S, clearGlobal as _, setDocumentCache as a, dispatchActions as b, useDocuments as c, useGetDocuments as d, DocumentCache as f, getAnalyticsStore as g, createAnalyticsStore as h, addDocumentCacheEventHandler as i, useGetDocument as l, readPromiseState as m, useDocumentsByIds as n, useDocument as o, addPromiseState as p, useDispatch as r, useDocumentCache as s, useDocumentById as t, useGetDocumentAsync as u, getGlobal as v, queueActions as x, setGlobal as y };\n\n//# sourceMappingURL=document-by-id-CDLUqru5.js.map","import { t as makePHEventFunctions } from \"./make-ph-event-functions-Cr4GqOTT.js\";\nimport { logger } from \"document-model\";\nimport { Children, cloneElement, forwardRef, isValidElement, useCallback, useEffect, useRef, useState, useSyncExternalStore } from \"react\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nimport { BrowserKeyStorage, RenownBuilder, RenownCryptoBuilder } from \"@renown/sdk\";\n//#region src/hooks/loading.ts\nconst { useValue: useLoading, setValue: setLoading, addEventHandler: addLoadingEventHandler } = makePHEventFunctions(\"loading\");\nconst loading = null;\n//#endregion\n//#region src/hooks/renown.ts\nconst renownEventFunctions = makePHEventFunctions(\"renown\");\n/** Adds an event handler for the renown instance */\nconst addRenownEventHandler = renownEventFunctions.addEventHandler;\n/** Returns the renown instance */\nconst useRenown = renownEventFunctions.useValue;\n/** Sets the renown instance */\nconst setRenown = renownEventFunctions.setValue;\n/** Returns the DID from the renown instance */\nfunction useDid() {\n\treturn useRenown()?.did;\n}\n/** Returns the current user from the renown instance, subscribing to user events */\nfunction useUser() {\n\tconst renown = useRenown();\n\tconst [user, setUser] = useState(renown?.user);\n\tuseEffect(() => {\n\t\tsetUser(renown?.user);\n\t\tif (!renown) return;\n\t\treturn renown.on(\"user\", setUser);\n\t}, [renown]);\n\treturn user;\n}\n/** Returns the login status, subscribing to renown status events */\nfunction useLoginStatus() {\n\tconst renown = useRenown();\n\treturn useSyncExternalStore((cb) => {\n\t\tif (!renown) return () => {};\n\t\treturn renown.on(\"status\", cb);\n\t}, () => renown === null ? \"loading\" : renown?.status, () => void 0);\n}\n//#endregion\n//#region src/renown/constants.ts\nconst RENOWN_URL = \"https://www.renown.id\";\nconst RENOWN_NETWORK_ID = \"eip155\";\nconst RENOWN_CHAIN_ID = \"1\";\nconst DOMAIN_TYPE = [\n\t{\n\t\tname: \"name\",\n\t\ttype: \"string\"\n\t},\n\t{\n\t\tname: \"version\",\n\t\ttype: \"string\"\n\t},\n\t{\n\t\tname: \"chainId\",\n\t\ttype: \"uint256\"\n\t},\n\t{\n\t\tname: \"verifyingContract\",\n\t\ttype: \"address\"\n\t}\n];\nconst VERIFIABLE_CREDENTIAL_EIP712_TYPE = [\n\t{\n\t\tname: \"@context\",\n\t\ttype: \"string[]\"\n\t},\n\t{\n\t\tname: \"type\",\n\t\ttype: \"string[]\"\n\t},\n\t{\n\t\tname: \"id\",\n\t\ttype: \"string\"\n\t},\n\t{\n\t\tname: \"issuer\",\n\t\ttype: \"Issuer\"\n\t},\n\t{\n\t\tname: \"credentialSubject\",\n\t\ttype: \"CredentialSubject\"\n\t},\n\t{\n\t\tname: \"credentialSchema\",\n\t\ttype: \"CredentialSchema\"\n\t},\n\t{\n\t\tname: \"issuanceDate\",\n\t\ttype: \"string\"\n\t},\n\t{\n\t\tname: \"expirationDate\",\n\t\ttype: \"string\"\n\t}\n];\nconst CREDENTIAL_SCHEMA_EIP712_TYPE = [{\n\tname: \"id\",\n\ttype: \"string\"\n}, {\n\tname: \"type\",\n\ttype: \"string\"\n}];\nconst CREDENTIAL_SUBJECT_TYPE = [\n\t{\n\t\tname: \"app\",\n\t\ttype: \"string\"\n\t},\n\t{\n\t\tname: \"id\",\n\t\ttype: \"string\"\n\t},\n\t{\n\t\tname: \"name\",\n\t\ttype: \"string\"\n\t}\n];\nconst ISSUER_TYPE = [{\n\tname: \"id\",\n\ttype: \"string\"\n}, {\n\tname: \"ethereumAddress\",\n\ttype: \"string\"\n}];\nconst CREDENTIAL_TYPES = {\n\tEIP712Domain: DOMAIN_TYPE,\n\tVerifiableCredential: VERIFIABLE_CREDENTIAL_EIP712_TYPE,\n\tCredentialSchema: CREDENTIAL_SCHEMA_EIP712_TYPE,\n\tCredentialSubject: CREDENTIAL_SUBJECT_TYPE,\n\tIssuer: ISSUER_TYPE\n};\n//#endregion\n//#region src/renown/utils.ts\nfunction openRenown(documentId) {\n\tconst renown = window.ph?.renown;\n\tlet renownUrl = renown?.baseUrl;\n\tif (!renownUrl) {\n\t\tlogger.warn(\"Renown instance not found, falling back to: \", RENOWN_URL);\n\t\trenownUrl = RENOWN_URL;\n\t}\n\tif (documentId) {\n\t\twindow.open(`${renownUrl}/profile/${documentId}`, \"_blank\")?.focus();\n\t\treturn;\n\t}\n\tconst url = new URL(renownUrl);\n\turl.searchParams.set(\"app\", renown?.did ?? \"\");\n\turl.searchParams.set(\"connect\", renown?.did ?? \"\");\n\turl.searchParams.set(\"network\", RENOWN_NETWORK_ID);\n\turl.searchParams.set(\"chain\", \"1\");\n\tconst returnUrl = new URL(window.location.pathname, window.location.origin);\n\turl.searchParams.set(\"returnUrl\", returnUrl.toJSON());\n\twindow.open(url, \"_self\")?.focus();\n}\n/**\n* Reads the `?user=` DID from the URL if present.\n* Returns the DID and cleans up the URL parameter.\n*/\nfunction consumeDidFromUrl() {\n\tif (typeof window === \"undefined\") return;\n\tconst userParam = new URLSearchParams(window.location.search).get(\"user\");\n\tif (!userParam) return;\n\tconst userDid = decodeURIComponent(userParam);\n\tconst cleanUrl = new URL(window.location.href);\n\tcleanUrl.searchParams.delete(\"user\");\n\twindow.history.replaceState({}, \"\", cleanUrl.toString());\n\treturn userDid;\n}\n/**\n* Log in the user. Resolves the user DID from (in order):\n* 1. Explicit `userDid` argument\n* 2. `?user=` URL parameter (from Renown portal redirect)\n* 3. Previously stored session in the Renown instance\n*/\nasync function login(userDid, renown) {\n\tif (!renown) return;\n\tconst did = userDid ?? consumeDidFromUrl();\n\ttry {\n\t\tconst user = renown.user;\n\t\tif (user?.did && (user.did === did || !did)) return user;\n\t\tif (!did) return;\n\t\treturn await renown.login(did);\n\t} catch (error) {\n\t\tlogger.error(error instanceof Error ? error.message : JSON.stringify(error));\n\t}\n}\nasync function logout() {\n\tawait (window.ph?.renown)?.logout();\n\tconst url = new URL(window.location.href);\n\tif (url.searchParams.has(\"user\")) {\n\t\turl.searchParams.delete(\"user\");\n\t\twindow.history.replaceState(null, \"\", url.toString());\n\t}\n}\n//#endregion\n//#region src/renown/use-renown-auth.ts\nfunction truncateAddress$1(address) {\n\tif (address.length <= 13) return address;\n\treturn `${address.slice(0, 7)}...${address.slice(-5)}`;\n}\nfunction toRenownAuthStatus(loginStatus, user) {\n\tif (loginStatus === \"authorized\") return user ? \"authorized\" : \"checking\";\n\treturn loginStatus;\n}\nfunction useRenownAuth() {\n\tconst user = useUser();\n\tconst status = toRenownAuthStatus(useLoginStatus(), user);\n\tconst address = user?.address;\n\tconst ensName = user?.ens?.name;\n\tconst avatarUrl = user?.profile?.userImage ?? user?.ens?.avatarUrl;\n\tconst profileId = user?.profile?.documentId;\n\treturn {\n\t\tstatus,\n\t\tuser,\n\t\taddress,\n\t\tensName,\n\t\tavatarUrl,\n\t\tprofileId,\n\t\tdisplayName: ensName ?? user?.profile?.username ?? void 0,\n\t\tdisplayAddress: address ? truncateAddress$1(address) : void 0,\n\t\tlogin: useCallback(() => {\n\t\t\topenRenown();\n\t\t}, []),\n\t\tlogout: useCallback(async () => {\n\t\t\tawait logout();\n\t\t}, []),\n\t\topenProfile: useCallback(() => {\n\t\t\tif (profileId) openRenown(profileId);\n\t\t}, [profileId])\n\t};\n}\n//#endregion\n//#region src/renown/components/icons.tsx\nfunction RenownLogo({ width = 71, height = 19, hovered = false, color = \"currentColor\", className }) {\n\treturn /* @__PURE__ */ jsxs(\"svg\", {\n\t\twidth,\n\t\theight,\n\t\tviewBox: \"0 0 71 19\",\n\t\tfill: color,\n\t\txmlns: \"http://www.w3.org/2000/svg\",\n\t\tclassName,\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(\"path\", { d: \"M53.6211 18.4887V9.0342H56.435V10.8096H56.4923C56.7377 10.181 57.1085 9.70244 57.6047 9.37398C58.101 9.03986 58.6981 8.8728 59.3962 8.8728C60.4105 8.8728 61.2039 9.1871 61.7765 9.8157C62.3546 10.4443 62.6436 11.3164 62.6436 12.432V18.4887H59.7397V13.0776C59.7397 12.5283 59.6007 12.1007 59.3225 11.7949C59.0499 11.4835 58.6654 11.3277 58.1692 11.3277C57.6784 11.3277 57.2803 11.4976 56.9749 11.8374C56.6695 12.1772 56.5168 12.6161 56.5168 13.1541V18.4887H53.6211Z\" }),\n\t\t\t/* @__PURE__ */ jsx(\"path\", { d: \"M53.097 9.03394L50.7412 18.4884H47.6164L46.1522 12.075H46.0949L44.6389 18.4884H41.5632L39.1992 9.03394H42.1195L43.3056 15.7532H43.3628L44.7861 9.03394H47.551L48.9906 15.7532H49.0479L50.234 9.03394H53.097Z\" }),\n\t\t\t/* @__PURE__ */ jsx(\"path\", { d: \"M37.8661 17.3926C37.0427 18.2591 35.9084 18.6923 34.4632 18.6923C33.0181 18.6923 31.8838 18.2591 31.0604 17.3926C30.2369 16.5205 29.8252 15.3086 29.8252 13.7569C29.8252 12.2336 30.2424 11.033 31.0767 10.1552C31.9111 9.2718 33.0399 8.83008 34.4632 8.83008C35.892 8.83008 37.0208 9.26896 37.8497 10.1467C38.6841 11.0188 39.1013 12.2222 39.1013 13.7569C39.1013 15.3143 38.6896 16.5262 37.8661 17.3926ZM33.2117 15.7702C33.5116 16.2402 33.9288 16.4752 34.4632 16.4752C34.9977 16.4752 35.4148 16.2402 35.7148 15.7702C36.0147 15.2945 36.1647 14.6234 36.1647 13.7569C36.1647 12.9131 36.012 12.2506 35.7066 11.7692C35.4012 11.2878 34.9868 11.0472 34.4632 11.0472C33.9343 11.0472 33.5171 11.2878 33.2117 11.7692C32.9118 12.2449 32.7618 12.9075 32.7618 13.7569C32.7618 14.6234 32.9118 15.2945 33.2117 15.7702Z\" }),\n\t\t\t/* @__PURE__ */ jsx(\"path\", { d: \"M20.0088 18.4887V9.0342H22.8227V10.8096H22.88C23.1254 10.181 23.4962 9.70244 23.9924 9.37398C24.4887 9.03986 25.0858 8.8728 25.7838 8.8728C26.7982 8.8728 27.5916 9.1871 28.1642 9.8157C28.7423 10.4443 29.0313 11.3164 29.0313 12.432V18.4887H26.1274V13.0776C26.1274 12.5283 25.9883 12.1007 25.7102 11.7949C25.4376 11.4835 25.0531 11.3277 24.5569 11.3277C24.0661 11.3277 23.668 11.4976 23.3626 11.8374C23.0572 12.1772 22.9045 12.6161 22.9045 13.1541V18.4887H20.0088Z\" }),\n\t\t\t/* @__PURE__ */ jsx(\"path\", { d: \"M14.7486 10.9707C14.2851 10.9707 13.8952 11.1321 13.5789 11.4549C13.2626 11.7777 13.0854 12.1911 13.0472 12.6951H16.4337C16.4064 12.1741 16.2374 11.7579 15.9265 11.4464C15.6212 11.1293 15.2285 10.9707 14.7486 10.9707ZM16.4991 15.5153H19.1167C18.9749 16.4837 18.5141 17.2567 17.7343 17.8343C16.9599 18.4063 15.9838 18.6923 14.8059 18.6923C13.3662 18.6923 12.2374 18.2591 11.4194 17.3926C10.6014 16.5262 10.1924 15.3313 10.1924 13.8079C10.1924 12.2845 10.5987 11.0755 11.4112 10.1807C12.2237 9.28029 13.3226 8.83008 14.7077 8.83008C16.0656 8.83008 17.1481 9.26047 17.9552 10.1213C18.7677 10.9764 19.174 12.1231 19.174 13.5616V14.4195H13.0145V14.6064C13.0145 15.184 13.1835 15.6541 13.5216 16.0165C13.8597 16.3733 14.3015 16.5517 14.8468 16.5517C15.2503 16.5517 15.5993 16.461 15.8938 16.2798C16.1883 16.0929 16.3901 15.8381 16.4991 15.5153Z\" }),\n\t\t\t/* @__PURE__ */ jsx(\"path\", { d: \"M3.00205 8.58396V12.0667H4.7771C5.32789 12.0667 5.7587 11.911 6.06954 11.5995C6.38038 11.2881 6.5358 10.8662 6.5358 10.3338C6.5358 9.80718 6.37492 9.38528 6.05318 9.06815C5.73143 8.74535 5.30335 8.58396 4.76892 8.58396H3.00205ZM3.00205 14.1989V18.4886H0V6.23096H5.07158C6.53307 6.23096 7.65373 6.5849 8.43355 7.29278C9.21337 8.00066 9.60328 8.99453 9.60328 10.2744C9.60328 11.0446 9.42605 11.7439 9.07159 12.3725C8.71712 12.9955 8.2236 13.4514 7.59101 13.7402L9.94684 18.4886H6.5767L4.55624 14.1989H3.00205Z\" }),\n\t\t\t/* @__PURE__ */ jsx(\"path\", {\n\t\t\t\td: \"M65.7255 0.211478C65.0841 2.46724 63.3737 4.2455 61.2041 4.90969C60.932 4.99366 60.932 5.39096 61.2041 5.47492C63.3725 6.13912 65.0841 7.91738 65.7255 10.1731C65.8056 10.4551 66.1932 10.4551 66.2745 10.1731C66.9159 7.91738 68.6263 6.13912 70.7959 5.47492C71.068 5.39096 71.068 4.99366 70.7959 4.90969C68.6276 4.2455 66.9159 2.46724 66.2745 0.211478C66.1944 -0.0704925 65.8068 -0.0704925 65.7255 0.211478Z\",\n\t\t\t\tfill: hovered ? \"#21FFB4\" : color\n\t\t\t})\n\t\t]\n\t});\n}\nfunction CopyIcon({ size = 14, color = \"#9EA0A1\" }) {\n\treturn /* @__PURE__ */ jsxs(\"svg\", {\n\t\twidth: size,\n\t\theight: size,\n\t\tviewBox: \"0 0 16 16\",\n\t\tfill: \"none\",\n\t\txmlns: \"http://www.w3.org/2000/svg\",\n\t\tchildren: [/* @__PURE__ */ jsx(\"rect\", {\n\t\t\tx: \"5\",\n\t\t\ty: \"5\",\n\t\t\twidth: \"9\",\n\t\t\theight: \"9\",\n\t\t\trx: \"1\",\n\t\t\tstroke: color,\n\t\t\tstrokeWidth: \"1.5\"\n\t\t}), /* @__PURE__ */ jsx(\"path\", {\n\t\t\td: \"M11 5V3C11 2.44772 10.5523 2 10 2H3C2.44772 2 2 2.44772 2 3V10C2 10.5523 2.44772 11 3 11H5\",\n\t\t\tstroke: color,\n\t\t\tstrokeWidth: \"1.5\"\n\t\t})]\n\t});\n}\nfunction DisconnectIcon({ size = 14, color = \"#EA4335\" }) {\n\treturn /* @__PURE__ */ jsxs(\"svg\", {\n\t\twidth: size,\n\t\theight: size,\n\t\tviewBox: \"0 0 16 16\",\n\t\tfill: \"none\",\n\t\txmlns: \"http://www.w3.org/2000/svg\",\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(\"path\", {\n\t\t\t\td: \"M6 14H3.33333C2.97971 14 2.64057 13.8595 2.39052 13.6095C2.14048 13.3594 2 13.0203 2 12.6667V3.33333C2 2.97971 2.14048 2.64057 2.39052 2.39052C2.64057 2.14048 2.97971 2 3.33333 2H6\",\n\t\t\t\tstroke: color,\n\t\t\t\tstrokeWidth: \"1.5\",\n\t\t\t\tstrokeLinecap: \"round\",\n\t\t\t\tstrokeLinejoin: \"round\"\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"path\", {\n\t\t\t\td: \"M10.6667 11.3333L14 8L10.6667 4.66667\",\n\t\t\t\tstroke: color,\n\t\t\t\tstrokeWidth: \"1.5\",\n\t\t\t\tstrokeLinecap: \"round\",\n\t\t\t\tstrokeLinejoin: \"round\"\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"path\", {\n\t\t\t\td: \"M14 8H6\",\n\t\t\t\tstroke: color,\n\t\t\t\tstrokeWidth: \"1.5\",\n\t\t\t\tstrokeLinecap: \"round\",\n\t\t\t\tstrokeLinejoin: \"round\"\n\t\t\t})\n\t\t]\n\t});\n}\nfunction SpinnerIcon({ size = 14, color = \"currentColor\" }) {\n\treturn /* @__PURE__ */ jsxs(\"svg\", {\n\t\twidth: size,\n\t\theight: size,\n\t\tviewBox: \"0 0 16 16\",\n\t\tfill: \"none\",\n\t\txmlns: \"http://www.w3.org/2000/svg\",\n\t\tstyle: { animation: \"spin 1s linear infinite\" },\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(\"style\", { children: `@keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }` }),\n\t\t\t/* @__PURE__ */ jsx(\"path\", {\n\t\t\t\td: \"M8 1V4\",\n\t\t\t\tstroke: color,\n\t\t\t\tstrokeWidth: \"1.5\",\n\t\t\t\tstrokeLinecap: \"round\"\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"path\", {\n\t\t\t\td: \"M8 12V15\",\n\t\t\t\tstroke: color,\n\t\t\t\tstrokeWidth: \"1.5\",\n\t\t\t\tstrokeLinecap: \"round\",\n\t\t\t\topacity: \"0.3\"\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"path\", {\n\t\t\t\td: \"M3.05 3.05L5.17 5.17\",\n\t\t\t\tstroke: color,\n\t\t\t\tstrokeWidth: \"1.5\",\n\t\t\t\tstrokeLinecap: \"round\",\n\t\t\t\topacity: \"0.9\"\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"path\", {\n\t\t\t\td: \"M10.83 10.83L12.95 12.95\",\n\t\t\t\tstroke: color,\n\t\t\t\tstrokeWidth: \"1.5\",\n\t\t\t\tstrokeLinecap: \"round\",\n\t\t\t\topacity: \"0.4\"\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"path\", {\n\t\t\t\td: \"M1 8H4\",\n\t\t\t\tstroke: color,\n\t\t\t\tstrokeWidth: \"1.5\",\n\t\t\t\tstrokeLinecap: \"round\",\n\t\t\t\topacity: \"0.8\"\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"path\", {\n\t\t\t\td: \"M12 8H15\",\n\t\t\t\tstroke: color,\n\t\t\t\tstrokeWidth: \"1.5\",\n\t\t\t\tstrokeLinecap: \"round\",\n\t\t\t\topacity: \"0.5\"\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"path\", {\n\t\t\t\td: \"M3.05 12.95L5.17 10.83\",\n\t\t\t\tstroke: color,\n\t\t\t\tstrokeWidth: \"1.5\",\n\t\t\t\tstrokeLinecap: \"round\",\n\t\t\t\topacity: \"0.7\"\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"path\", {\n\t\t\t\td: \"M10.83 5.17L12.95 3.05\",\n\t\t\t\tstroke: color,\n\t\t\t\tstrokeWidth: \"1.5\",\n\t\t\t\tstrokeLinecap: \"round\",\n\t\t\t\topacity: \"0.6\"\n\t\t\t})\n\t\t]\n\t});\n}\nfunction ChevronDownIcon({ size = 14, color = \"currentColor\", style }) {\n\treturn /* @__PURE__ */ jsx(\"svg\", {\n\t\twidth: size,\n\t\theight: size,\n\t\tviewBox: \"0 0 16 16\",\n\t\tfill: \"none\",\n\t\txmlns: \"http://www.w3.org/2000/svg\",\n\t\tstyle,\n\t\tchildren: /* @__PURE__ */ jsx(\"path\", {\n\t\t\td: \"M4 6L8 10L12 6\",\n\t\t\tstroke: color,\n\t\t\tstrokeWidth: \"1.5\",\n\t\t\tstrokeLinecap: \"round\",\n\t\t\tstrokeLinejoin: \"round\"\n\t\t})\n\t});\n}\nfunction UserIcon({ size = 24, color = \"#6366f1\" }) {\n\treturn /* @__PURE__ */ jsxs(\"svg\", {\n\t\twidth: size,\n\t\theight: size,\n\t\tviewBox: \"0 0 24 24\",\n\t\tfill: \"none\",\n\t\txmlns: \"http://www.w3.org/2000/svg\",\n\t\tchildren: [/* @__PURE__ */ jsx(\"circle\", {\n\t\t\tcx: \"12\",\n\t\t\tcy: \"8\",\n\t\t\tr: \"4\",\n\t\t\tstroke: color,\n\t\t\tstrokeWidth: \"2\"\n\t\t}), /* @__PURE__ */ jsx(\"path\", {\n\t\t\td: \"M4 20C4 16.6863 7.58172 14 12 14C16.4183 14 20 16.6863 20 20\",\n\t\t\tstroke: color,\n\t\t\tstrokeWidth: \"2\",\n\t\t\tstrokeLinecap: \"round\"\n\t\t})]\n\t});\n}\n//#endregion\n//#region src/renown/components/slot.tsx\nfunction mergeProps(parentProps, childProps) {\n\tconst merged = { ...parentProps };\n\tfor (const key of Object.keys(childProps)) {\n\t\tconst parentValue = parentProps[key];\n\t\tconst childValue = childProps[key];\n\t\tif (key === \"style\") merged[key] = {\n\t\t\t...parentValue,\n\t\t\t...childValue\n\t\t};\n\t\telse if (key === \"className\") merged[key] = [parentValue, childValue].filter(Boolean).join(\" \");\n\t\telse if (typeof parentValue === \"function\" && typeof childValue === \"function\") merged[key] = (...args) => {\n\t\t\tchildValue(...args);\n\t\t\tparentValue(...args);\n\t\t};\n\t\telse if (childValue !== void 0) merged[key] = childValue;\n\t}\n\treturn merged;\n}\nconst Slot = forwardRef(({ children, ...props }, ref) => {\n\tconst child = Children.only(children);\n\tif (!isValidElement(child)) return null;\n\tconst childElement = child;\n\tconst mergedProps = mergeProps(props, childElement.props);\n\tif (ref) mergedProps.ref = ref;\n\treturn cloneElement(childElement, mergedProps);\n});\nSlot.displayName = \"Slot\";\n//#endregion\n//#region src/renown/components/RenownLoginButton.tsx\nconst lightStyles = {\n\ttrigger: {\n\t\tbackgroundColor: \"#ffffff\",\n\t\tborderWidth: \"1px\",\n\t\tborderStyle: \"solid\",\n\t\tborderColor: \"#d1d5db\",\n\t\tcolor: \"#111827\"\n\t},\n\ttriggerHover: {\n\t\tbackgroundColor: \"#ecf3f8\",\n\t\tborderColor: \"#9ca3af\"\n\t}\n};\nconst darkStyles = {\n\ttrigger: {\n\t\tbackgroundColor: \"#1f2937\",\n\t\tborderWidth: \"1px\",\n\t\tborderStyle: \"solid\",\n\t\tborderColor: \"#4b5563\",\n\t\tcolor: \"#ecf3f8\"\n\t},\n\ttriggerHover: {\n\t\tbackgroundColor: \"#374151\",\n\t\tborderColor: \"#6b7280\"\n\t}\n};\nconst styles$1 = {\n\twrapper: {\n\t\tposition: \"relative\",\n\t\tdisplay: \"inline-block\"\n\t},\n\ttrigger: {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tgap: \"8px\",\n\t\tpadding: \"8px 32px\",\n\t\tborderRadius: \"8px\",\n\t\tcursor: \"pointer\",\n\t\tfontSize: \"14px\",\n\t\tfontWeight: 500,\n\t\tfontFamily: \"inherit\",\n\t\tlineHeight: \"20px\",\n\t\ttransition: \"background-color 150ms, border-color 150ms\"\n\t}\n};\nfunction RenownLoginButton({ onLogin: onLoginProp, darkMode = false, style, className, asChild = false, children }) {\n\tconst onLogin = onLoginProp ?? (() => openRenown());\n\tconst [isLoading, setIsLoading] = useState(false);\n\tconst [isHovered, setIsHovered] = useState(false);\n\tconst handleMouseEnter = useCallback(() => setIsHovered(true), []);\n\tconst handleMouseLeave = useCallback(() => setIsHovered(false), []);\n\tconst handleClick = () => {\n\t\tif (!isLoading) {\n\t\t\tsetIsLoading(true);\n\t\t\tonLogin();\n\t\t}\n\t};\n\tconst themeStyles = darkMode ? darkStyles : lightStyles;\n\tconst triggerStyle = {\n\t\t...styles$1.trigger,\n\t\t...themeStyles.trigger,\n\t\t...isHovered && !isLoading ? themeStyles.triggerHover : {},\n\t\tcursor: isLoading ? \"wait\" : \"pointer\",\n\t\t...style\n\t};\n\tconst triggerElement = asChild ? /* @__PURE__ */ jsx(Slot, {\n\t\tonClick: handleClick,\n\t\t\"data-renown-state\": \"login\",\n\t\t...isLoading ? { \"data-loading\": \"\" } : {},\n\t\tchildren\n\t}) : /* @__PURE__ */ jsx(\"button\", {\n\t\ttype: \"button\",\n\t\tstyle: triggerStyle,\n\t\t\"aria-label\": \"Log in with Renown\",\n\t\tonClick: handleClick,\n\t\t\"data-renown-state\": \"login\",\n\t\t...isLoading ? { \"data-loading\": \"\" } : {},\n\t\tchildren: isLoading ? /* @__PURE__ */ jsx(SpinnerIcon, { size: 16 }) : /* @__PURE__ */ jsx(\"span\", { children: \"Log in\" })\n\t});\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\tstyle: styles$1.wrapper,\n\t\tclassName,\n\t\tonMouseEnter: handleMouseEnter,\n\t\tonMouseLeave: handleMouseLeave,\n\t\tchildren: triggerElement\n\t});\n}\n//#endregion\n//#region src/renown/components/RenownUserButton.tsx\nconst POPOVER_GAP = 4;\nconst POPOVER_HEIGHT = 150;\nconst styles = {\n\twrapper: {\n\t\tposition: \"relative\",\n\t\tdisplay: \"inline-block\"\n\t},\n\ttrigger: {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tgap: \"8px\",\n\t\tpadding: \"6px 12px\",\n\t\tborderWidth: \"1px\",\n\t\tborderStyle: \"solid\",\n\t\tborderColor: \"#e5e7eb\",\n\t\tbackgroundColor: \"#ffffff\",\n\t\tcursor: \"pointer\",\n\t\tborderRadius: \"8px\",\n\t\tfontSize: \"12px\",\n\t\tfontWeight: 500,\n\t\tfontFamily: \"inherit\",\n\t\tcolor: \"#111827\",\n\t\ttransition: \"background-color 150ms, border-color 150ms\"\n\t},\n\ttriggerHover: {\n\t\tbackgroundColor: \"#f9fafb\",\n\t\tborderColor: \"#9ca3af\"\n\t},\n\tavatar: {\n\t\twidth: \"28px\",\n\t\theight: \"28px\",\n\t\tborderRadius: \"50%\",\n\t\tobjectFit: \"cover\",\n\t\tflexShrink: 0\n\t},\n\tavatarPlaceholder: {\n\t\twidth: \"28px\",\n\t\theight: \"28px\",\n\t\tborderRadius: \"50%\",\n\t\tbackground: \"linear-gradient(135deg, #8b5cf6, #3b82f6)\",\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tflexShrink: 0\n\t},\n\tavatarInitial: {\n\t\tfontSize: \"12px\",\n\t\tfontWeight: 700,\n\t\tcolor: \"#ffffff\",\n\t\tlineHeight: 1\n\t},\n\tdisplayName: {\n\t\tmaxWidth: \"120px\",\n\t\toverflow: \"hidden\",\n\t\ttextOverflow: \"ellipsis\",\n\t\twhiteSpace: \"nowrap\"\n\t},\n\tchevron: {\n\t\tflexShrink: 0,\n\t\ttransition: \"transform 150ms\",\n\t\tcolor: \"#6b7280\"\n\t},\n\tchevronOpen: { transform: \"rotate(180deg)\" },\n\tpopoverBase: {\n\t\tposition: \"absolute\",\n\t\tright: 0,\n\t\tbackgroundColor: \"#ffffff\",\n\t\tborderRadius: \"8px\",\n\t\tboxShadow: \"0 4px 12px rgba(0, 0, 0, 0.12), 0 1px 3px rgba(0, 0, 0, 0.08)\",\n\t\twidth: \"100%\",\n\t\tzIndex: 1e3,\n\t\tcolor: \"#111827\",\n\t\tborderWidth: \"1px\",\n\t\tborderStyle: \"solid\",\n\t\tborderColor: \"#e5e7eb\",\n\t\toverflow: \"hidden\"\n\t},\n\theader: {\n\t\tpadding: \"12px 16px\",\n\t\tborderBottom: \"1px solid #e5e7eb\"\n\t},\n\theaderUsername: {\n\t\tfontSize: \"14px\",\n\t\tfontWeight: 600,\n\t\tcolor: \"#111827\",\n\t\tmargin: 0\n\t},\n\taddressRow: {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tgap: \"4px\",\n\t\tmarginTop: \"4px\"\n\t},\n\taddressButton: {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tgap: \"4px\",\n\t\tpadding: 0,\n\t\tborder: \"none\",\n\t\tbackgroundColor: \"transparent\",\n\t\tcursor: \"pointer\",\n\t\tfontSize: \"12px\",\n\t\tcolor: \"#6b7280\",\n\t\tfontFamily: \"inherit\",\n\t\tposition: \"relative\",\n\t\twidth: \"100%\"\n\t},\n\tcopiedText: {\n\t\tfontSize: \"12px\",\n\t\tcolor: \"#059669\",\n\t\tposition: \"absolute\",\n\t\tleft: 0,\n\t\ttransition: \"opacity 150ms\",\n\t\tfontWeight: 500\n\t},\n\taddressText: {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tgap: \"4px\",\n\t\ttransition: \"opacity 150ms\"\n\t},\n\tmenuSection: { padding: \"4px 0\" },\n\tmenuItem: {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tgap: \"8px\",\n\t\twidth: \"100%\",\n\t\tpadding: \"8px 16px\",\n\t\tborder: \"none\",\n\t\tbackgroundColor: \"transparent\",\n\t\tcursor: \"pointer\",\n\t\tfontSize: \"14px\",\n\t\tcolor: \"#374151\",\n\t\ttextDecoration: \"none\",\n\t\tfontFamily: \"inherit\",\n\t\ttransition: \"background-color 150ms\"\n\t},\n\tmenuItemHover: { backgroundColor: \"#f3f4f6\" },\n\tdisconnectItem: { color: \"#dc2626\" },\n\tseparator: {\n\t\theight: \"1px\",\n\t\tbackgroundColor: \"#e5e7eb\",\n\t\tmargin: 0,\n\t\tborder: \"none\"\n\t}\n};\nfunction truncateAddress(address) {\n\tif (address.length <= 13) return address;\n\treturn `${address.slice(0, 7)}...${address.slice(-5)}`;\n}\nfunction RenownUserButton({ address: addressProp, username: usernameProp, avatarUrl: avatarUrlProp, userId: userIdProp, onDisconnect: onDisconnectProp, style, className, asChild = false, children, menuItems }) {\n\tconst user = useUser();\n\tconst address = addressProp ?? user?.address ?? \"\";\n\tconst username = usernameProp ?? user?.profile?.username ?? user?.ens?.name;\n\tconst avatarUrl = avatarUrlProp ?? user?.profile?.userImage ?? user?.ens?.avatarUrl;\n\tconst userId = userIdProp ?? user?.profile?.documentId;\n\tconst onDisconnect = onDisconnectProp ?? (() => void logout());\n\tconst displayName = username ?? (address ? truncateAddress(address) : \"Account\");\n\tconst profileId = userId ?? address;\n\tconst [isOpen, setIsOpen] = useState(false);\n\tconst [isHovered, setIsHovered] = useState(false);\n\tconst [isCopied, setIsCopied] = useState(false);\n\tconst [showAbove, setShowAbove] = useState(true);\n\tconst [hoveredItem, setHoveredItem] = useState(null);\n\tconst wrapperRef = useRef(null);\n\tconst closeTimeoutRef = useRef(null);\n\tconst calculatePosition = useCallback(() => {\n\t\tif (!wrapperRef.current) return;\n\t\tconst spaceAbove = wrapperRef.current.getBoundingClientRect().top;\n\t\tsetShowAbove(spaceAbove >= POPOVER_HEIGHT + POPOVER_GAP);\n\t}, []);\n\tconst handleMouseEnter = useCallback(() => {\n\t\tsetIsHovered(true);\n\t\tif (closeTimeoutRef.current) {\n\t\t\tclearTimeout(closeTimeoutRef.current);\n\t\t\tcloseTimeoutRef.current = null;\n\t\t}\n\t\tcalculatePosition();\n\t\tsetIsOpen(true);\n\t}, [calculatePosition]);\n\tconst handleMouseLeave = useCallback(() => {\n\t\tcloseTimeoutRef.current = setTimeout(() => {\n\t\t\tsetIsOpen(false);\n\t\t\tsetIsHovered(false);\n\t\t\tsetHoveredItem(null);\n\t\t}, 150);\n\t}, []);\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (closeTimeoutRef.current) clearTimeout(closeTimeoutRef.current);\n\t\t};\n\t}, []);\n\tconst copyToClipboard = useCallback(async () => {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(address);\n\t\t\tsetIsCopied(true);\n\t\t\tsetTimeout(() => setIsCopied(false), 2e3);\n\t\t} catch (err) {\n\t\t\tconsole.error(\"Failed to copy address:\", err);\n\t\t}\n\t}, [address]);\n\tconst triggerElement = asChild ? /* @__PURE__ */ jsx(Slot, {\n\t\t\"data-renown-state\": \"authenticated\",\n\t\tchildren\n\t}) : /* @__PURE__ */ jsxs(\"button\", {\n\t\ttype: \"button\",\n\t\tstyle: {\n\t\t\t...styles.trigger,\n\t\t\t...isHovered ? styles.triggerHover : {},\n\t\t\t...style\n\t\t},\n\t\t\"aria-label\": \"Open account menu\",\n\t\t\"data-renown-state\": \"authenticated\",\n\t\tchildren: [\n\t\t\tavatarUrl ? /* @__PURE__ */ jsx(\"img\", {\n\t\t\t\tsrc: avatarUrl,\n\t\t\t\talt: \"Avatar\",\n\t\t\t\tstyle: styles.avatar\n\t\t\t}) : /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tstyle: styles.avatarPlaceholder,\n\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\tstyle: styles.avatarInitial,\n\t\t\t\t\tchildren: (displayName || \"U\")[0].toUpperCase()\n\t\t\t\t})\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\tstyle: styles.displayName,\n\t\t\t\tchildren: displayName\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(ChevronDownIcon, {\n\t\t\t\tsize: 14,\n\t\t\t\tstyle: {\n\t\t\t\t\t...styles.chevron,\n\t\t\t\t\t...isOpen ? styles.chevronOpen : {}\n\t\t\t\t}\n\t\t\t})\n\t\t]\n\t});\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tref: wrapperRef,\n\t\tstyle: styles.wrapper,\n\t\tclassName,\n\t\tonMouseEnter: handleMouseEnter,\n\t\tonMouseLeave: handleMouseLeave,\n\t\tchildren: [triggerElement, isOpen && /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tstyle: {\n\t\t\t\t...styles.popoverBase,\n\t\t\t\t...showAbove ? { bottom: `calc(100% + ${POPOVER_GAP}px)` } : { top: `calc(100% + ${POPOVER_GAP}px)` }\n\t\t\t},\n\t\t\tchildren: [\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tstyle: styles.header,\n\t\t\t\t\tchildren: [username && /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\tstyle: styles.headerUsername,\n\t\t\t\t\t\tchildren: username\n\t\t\t\t\t}), address && /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\tstyle: styles.addressRow,\n\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\tonClick: () => void copyToClipboard(),\n\t\t\t\t\t\t\tstyle: styles.addressButton,\n\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\t\t\tgap: \"4px\",\n\t\t\t\t\t\t\t\t\twidth: \"100%\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t...styles.addressText,\n\t\t\t\t\t\t\t\t\t\topacity: isCopied ? 0 : 1\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"span\", { children: truncateAddress(address) }), /* @__PURE__ */ jsx(CopyIcon, {\n\t\t\t\t\t\t\t\t\t\tsize: 12,\n\t\t\t\t\t\t\t\t\t\tcolor: \"#9ca3af\"\n\t\t\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t\t\t}), /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t...styles.copiedText,\n\t\t\t\t\t\t\t\t\t\topacity: isCopied ? 1 : 0\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tchildren: \"Copied!\"\n\t\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t})\n\t\t\t\t\t})]\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tstyle: styles.menuSection,\n\t\t\t\t\tchildren: [profileId && /* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\tonClick: () => openRenown(profileId),\n\t\t\t\t\t\tonMouseEnter: () => setHoveredItem(\"profile\"),\n\t\t\t\t\t\tonMouseLeave: () => setHoveredItem(null),\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t...styles.menuItem,\n\t\t\t\t\t\t\t...hoveredItem === \"profile\" ? styles.menuItemHover : {}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(UserIcon, {\n\t\t\t\t\t\t\tsize: 14,\n\t\t\t\t\t\t\tcolor: \"#6b7280\"\n\t\t\t\t\t\t}), \"View Profile\"]\n\t\t\t\t\t}), menuItems?.map((item) => /* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\tonClick: item.onClick,\n\t\t\t\t\t\tonMouseEnter: () => setHoveredItem(item.label),\n\t\t\t\t\t\tonMouseLeave: () => setHoveredItem(null),\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t...styles.menuItem,\n\t\t\t\t\t\t\t...hoveredItem === item.label ? styles.menuItemHover : {},\n\t\t\t\t\t\t\t...item.style\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchildren: [item.icon, item.label]\n\t\t\t\t\t}, item.label))]\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsx(\"hr\", { style: styles.separator }),\n\t\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tstyle: styles.menuSection,\n\t\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\tonClick: onDisconnect,\n\t\t\t\t\t\tonMouseEnter: () => setHoveredItem(\"disconnect\"),\n\t\t\t\t\t\tonMouseLeave: () => setHoveredItem(null),\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t...styles.menuItem,\n\t\t\t\t\t\t\t...styles.disconnectItem,\n\t\t\t\t\t\t\t...hoveredItem === \"disconnect\" ? styles.menuItemHover : {}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(DisconnectIcon, {\n\t\t\t\t\t\t\tsize: 14,\n\t\t\t\t\t\t\tcolor: \"#dc2626\"\n\t\t\t\t\t\t}), \"Log out\"]\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t]\n\t\t})]\n\t});\n}\n//#endregion\n//#region src/renown/components/RenownAuthButton.tsx\nfunction RenownAuthButton({ className = \"\", darkMode, loginContent, userContent, loadingContent, children }) {\n\tconst auth = useRenownAuth();\n\tif (children) return /* @__PURE__ */ jsx(Fragment, { children: children(auth) });\n\tif (auth.status === \"loading\" || auth.status === \"checking\") {\n\t\tif (loadingContent) return /* @__PURE__ */ jsx(\"div\", {\n\t\t\tclassName,\n\t\t\tchildren: loadingContent\n\t\t});\n\t\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName,\n\t\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tstyle: {\n\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\tgap: \"8px\",\n\t\t\t\t\tpadding: \"6px 12px\",\n\t\t\t\t\tborderRadius: \"8px\",\n\t\t\t\t\tborder: \"1px solid #e5e7eb\",\n\t\t\t\t\tanimation: \"pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite\"\n\t\t\t\t},\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"div\", { style: {\n\t\t\t\t\twidth: \"28px\",\n\t\t\t\t\theight: \"28px\",\n\t\t\t\t\tborderRadius: \"50%\",\n\t\t\t\t\tbackgroundColor: \"#e5e7eb\"\n\t\t\t\t} }), /* @__PURE__ */ jsx(\"div\", { style: {\n\t\t\t\t\twidth: \"80px\",\n\t\t\t\t\theight: \"14px\",\n\t\t\t\t\tborderRadius: \"4px\",\n\t\t\t\t\tbackgroundColor: \"#e5e7eb\"\n\t\t\t\t} })]\n\t\t\t}), /* @__PURE__ */ jsx(\"style\", { children: `@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }` })]\n\t\t});\n\t}\n\tif (auth.status === \"authorized\") {\n\t\tif (userContent) return /* @__PURE__ */ jsx(\"div\", {\n\t\t\tclassName,\n\t\t\tchildren: userContent\n\t\t});\n\t\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\t\tclassName,\n\t\t\tchildren: /* @__PURE__ */ jsx(RenownUserButton, {})\n\t\t});\n\t}\n\tif (loginContent) return /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName,\n\t\tchildren: loginContent\n\t});\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName,\n\t\tchildren: /* @__PURE__ */ jsx(RenownLoginButton, { darkMode })\n\t});\n}\n//#endregion\n//#region src/renown/crypto.ts\n/**\n* @deprecated Use {@link initRenownCrypto} instead\n*\n* Initialize ConnectCrypto\n* @returns ConnectCrypto instance\n*/\nasync function initConnectCrypto() {\n\treturn initRenownCrypto();\n}\n/**\n* Initialize RenownCrypto\n* @returns RenownCrypto instance\n*/\nasync function initRenownCrypto() {\n\tconst keyStorage = await BrowserKeyStorage.create();\n\treturn await new RenownCryptoBuilder().withKeyPairStorage(keyStorage).build();\n}\n//#endregion\n//#region src/renown/use-renown-init.ts\nasync function initRenown(appName, namespace, url) {\n\taddRenownEventHandler();\n\tsetRenown(null);\n\tconst renown = await new RenownBuilder(appName, {\n\t\tbasename: namespace,\n\t\tbaseUrl: url\n\t}).build();\n\tsetRenown(renown);\n\tawait login(void 0, renown);\n\treturn renown;\n}\n/**\n* Hook that initializes the Renown SDK.\n* Call once at the top of your app. Options are read only on first mount.\n* Returns a promise that resolves with the Renown instance.\n*\n* @example\n* ```tsx\n* function App() {\n* const renownPromise = useRenownInit({ appName: \"my-app\" });\n* return <MyApp />;\n* }\n* ```\n*/\nfunction useRenownInit({ appName, namespace, url }) {\n\tconst promiseRef = useRef(Promise.withResolvers());\n\tconst initRef = useRef(false);\n\tif (typeof window === \"undefined\") {\n\t\tpromiseRef.current.reject(/* @__PURE__ */ new Error(\"window is undefined\"));\n\t\treturn promiseRef.current.promise;\n\t}\n\tif (initRef.current) return promiseRef.current.promise;\n\tinitRef.current = true;\n\tinitRenown(appName, namespace, url).then(promiseRef.current.resolve).catch(promiseRef.current.reject);\n\treturn promiseRef.current.promise;\n}\n//#endregion\n//#region src/renown/renown-init.tsx\n/**\n* Side-effect component that initializes the Renown SDK.\n* Renders nothing — place it alongside your app tree.\n*\n* @example\n* ```tsx\n* function App() {\n* return (\n* <>\n* <Renown appName=\"my-app\" onError={console.error} />\n* <MyApp />\n* </>\n* );\n* }\n* ```\n*/\nfunction Renown({ onError, ...initOptions }) {\n\tuseRenownInit(initOptions).catch(onError ?? console.error);\n\treturn null;\n}\n//#endregion\nexport { useLoginStatus as A, RENOWN_CHAIN_ID as C, addRenownEventHandler as D, VERIFIABLE_CREDENTIAL_EIP712_TYPE as E, setLoading as F, useLoading as I, useUser as M, addLoadingEventHandler as N, setRenown as O, loading as P, ISSUER_TYPE as S, RENOWN_URL as T, openRenown as _, RenownAuthButton as a, CREDENTIAL_TYPES as b, ChevronDownIcon as c, RenownLogo as d, SpinnerIcon as f, logout as g, login as h, initRenownCrypto as i, useRenown as j, useDid as k, CopyIcon as l, useRenownAuth as m, useRenownInit as n, RenownUserButton as o, UserIcon as p, initConnectCrypto as r, RenownLoginButton as s, Renown as t, DisconnectIcon as u, CREDENTIAL_SCHEMA_EIP712_TYPE as v, RENOWN_NETWORK_ID as w, DOMAIN_TYPE as x, CREDENTIAL_SUBJECT_TYPE as y };\n\n//# sourceMappingURL=renown-CV_45Xc1.js.map","/* global btoa */\nlet base64\n\nif (typeof window !== 'undefined') {\n if (window.btoa) {\n base64 = function (input) {\n return btoa(unescape(encodeURIComponent(input)))\n }\n } else {\n // Polyfill for environments that don't have btoa or Buffer class (notably, React Native).\n // Based on https://github.com/davidchambers/Base64.js/blob/a121f75bb10c8dd5d557886c4b1069b31258d230/base64.js\n base64 = function (input) {\n const str = unescape(encodeURIComponent(input + ''))\n let output = ''\n for (\n let block, charCode, idx = 0, map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n str.charAt(idx | 0) || (map = '=', idx % 1);\n output += map.charAt(63 & block >> 8 - idx % 1 * 8)\n ) {\n charCode = str.charCodeAt(idx += 3 / 4)\n // This is a coherence check. The result of unescape(encodeURIComponent()) should always be\n // characters with code points that fit into two bytes.\n /* c8 ignore next 3 */\n if (charCode > 0xFF) {\n throw new Error(\"'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.\")\n }\n block = block << 8 | charCode\n }\n return output\n }\n }\n} else {\n base64 = function (input) {\n return Buffer.from(input).toString('base64')\n }\n}\n\nfunction slug (string, opts) {\n let result = slugify(string, opts)\n const fallback = opts && opts.fallback !== undefined ? opts.fallback : slug.defaults.fallback\n // If output is an empty string, try slug for base64 of string.\n if (fallback === true && result === '') {\n result = slugify(base64(string), opts)\n }\n return result\n}\n\nconst locales = {\n // http://www.eki.ee/wgrs/rom1_bg.pdf\n bg: { Й: 'Y', й: 'y', X: 'H', x: 'h', Ц: 'Ts', ц: 'ts', Щ: 'Sht', щ: 'sht', Ъ: 'A', ъ: 'a', Ь: 'Y', ь: 'y' },\n // Need a reference URL for German, although this is pretty well-known.\n de: { Ä: 'AE', ä: 'ae', Ö: 'OE', ö: 'oe', Ü: 'UE', ü: 'ue' },\n // Need a reference URL for Serbian.\n sr: { đ: 'dj', Đ: 'DJ' },\n // https://assets.publishing.service.gov.uk/government/uploads/system/uploads/attachment_data/file/864314/ROMANIZATION_OF_UKRAINIAN.pdf\n uk: { И: 'Y', и: 'y', Й: 'Y', й: 'y', Ц: 'Ts', ц: 'ts', Х: 'Kh', х: 'kh', Щ: 'Shch', щ: 'shch', Г: 'H', г: 'h' }\n}\n\nlet defaultLocale = {}\n\nfunction slugify (string, opts) {\n if (typeof string !== 'string') {\n throw new Error('slug() requires a string argument, received ' + typeof string)\n }\n if (!string.isWellFormed()) {\n throw new Error('slug() received a malformed string with lone surrogates')\n }\n if (typeof opts === 'string') { opts = { replacement: opts } }\n opts = opts ? Object.assign({}, opts) : {}\n opts.mode = opts.mode || slug.defaults.mode\n const defaults = slug.defaults.modes[opts.mode]\n const keys = ['replacement', 'multicharmap', 'charmap', 'remove', 'lower', 'trim']\n for (let key, i = 0, l = keys.length; i < l; i++) {\n key = keys[i]\n opts[key] = (key in opts) ? opts[key] : defaults[key]\n }\n const localeMap = locales[opts.locale] || defaultLocale\n\n let lengths = []\n for (const key in opts.multicharmap) {\n if (!Object.prototype.hasOwnProperty.call(opts.multicharmap, key)) { continue }\n\n const len = key.length\n if (lengths.indexOf(len) === -1) { lengths.push(len) }\n }\n\n // We want to match the longest string if there are multiple matches, so\n // sort lengths in descending order.\n lengths = lengths.sort(function (a, b) { return b - a })\n\n const disallowedChars = opts.mode === 'rfc3986' ? /[^\\w\\s\\-.~]/ : /[^A-Za-z0-9\\s]/\n\n let result = ''\n for (let char, i = 0, l = string.length; i < l; i++) {\n char = string[i]\n let matchedMultichar = false\n for (let j = 0; j < lengths.length; j++) {\n const len = lengths[j]\n const str = string.substr(i, len)\n if (opts.multicharmap[str]) {\n i += len - 1\n char = opts.multicharmap[str]\n matchedMultichar = true\n break\n }\n }\n if (!matchedMultichar) {\n if (localeMap[char]) {\n char = localeMap[char]\n } else if (opts.charmap[char]) {\n char = opts.charmap[char].replace(opts.replacement, ' ')\n } else if (char.includes(opts.replacement)) {\n // preserve the replacement character in case it is excluded by disallowedChars\n char = char.replace(opts.replacement, ' ')\n } else {\n char = char.replace(disallowedChars, '')\n }\n }\n result += char\n }\n\n if (opts.remove) {\n result = result.replace(opts.remove, '')\n }\n if (opts.trim) {\n result = result.trim()\n }\n result = result.replace(/\\s+/g, opts.replacement) // convert spaces\n if (opts.lower) {\n result = result.toLowerCase()\n }\n return result\n}\n\nconst initialMulticharmap = {\n // multibyte devanagari characters (hindi, sanskrit, etc.)\n फ़: 'Fi',\n ग़: 'Ghi',\n ख़: 'Khi',\n क़: 'Qi',\n ड़: 'ugDha',\n ढ़: 'ugDhha',\n य़: 'Yi',\n ज़: 'Za',\n // hebrew\n // Refs: http://www.eki.ee/wgrs/rom1_he.pdf\n // Refs: https://en.wikipedia.org/wiki/Niqqud\n בִי: 'i',\n בֵ: 'e',\n בֵי: 'e',\n בֶ: 'e',\n בַ: 'a',\n בָ: 'a',\n בֹ: 'o',\n וֹ: 'o',\n בֻ: 'u',\n וּ: 'u',\n בּ: 'b',\n כּ: 'k',\n ךּ: 'k',\n פּ: 'p',\n שׁ: 'sh',\n שׂ: 's',\n בְ: 'e',\n חֱ: 'e',\n חֲ: 'a',\n חֳ: 'o',\n בִ: 'i'\n}\n\n// https://github.com/django/django/blob/master/django/contrib/admin/static/admin/js/urlify.js\nconst initialCharmap = {\n // latin\n À: 'A',\n Á: 'A',\n Â: 'A',\n Ã: 'A',\n Ä: 'A',\n Å: 'A',\n Æ: 'AE',\n Ç: 'C',\n È: 'E',\n É: 'E',\n Ê: 'E',\n Ë: 'E',\n Ì: 'I',\n Í: 'I',\n Î: 'I',\n Ï: 'I',\n Ð: 'D',\n Ñ: 'N',\n Ò: 'O',\n Ó: 'O',\n Ô: 'O',\n Õ: 'O',\n Ö: 'O',\n Ő: 'O',\n Ø: 'O',\n Ō: 'O',\n Ù: 'U',\n Ú: 'U',\n Û: 'U',\n Ü: 'U',\n Ű: 'U',\n Ý: 'Y',\n Þ: 'TH',\n ß: 'ss',\n à: 'a',\n á: 'a',\n â: 'a',\n ã: 'a',\n ä: 'a',\n å: 'a',\n æ: 'ae',\n ç: 'c',\n è: 'e',\n é: 'e',\n ê: 'e',\n ë: 'e',\n ì: 'i',\n í: 'i',\n î: 'i',\n ï: 'i',\n ð: 'd',\n ñ: 'n',\n ò: 'o',\n ó: 'o',\n ô: 'o',\n õ: 'o',\n ö: 'o',\n ő: 'o',\n ø: 'o',\n ō: 'o',\n Œ: 'OE',\n œ: 'oe',\n ù: 'u',\n ú: 'u',\n û: 'u',\n ü: 'u',\n ű: 'u',\n ý: 'y',\n þ: 'th',\n ÿ: 'y',\n ẞ: 'SS',\n // greek\n α: 'a',\n β: 'b',\n γ: 'g',\n δ: 'd',\n ε: 'e',\n ζ: 'z',\n η: 'h',\n θ: 'th',\n ι: 'i',\n κ: 'k',\n λ: 'l',\n μ: 'm',\n ν: 'n',\n ξ: '3',\n ο: 'o',\n π: 'p',\n ρ: 'r',\n σ: 's',\n τ: 't',\n υ: 'y',\n φ: 'f',\n χ: 'x',\n ψ: 'ps',\n ω: 'w',\n ά: 'a',\n έ: 'e',\n ί: 'i',\n ό: 'o',\n ύ: 'y',\n ή: 'h',\n ώ: 'w',\n ς: 's',\n ϊ: 'i',\n ΰ: 'y',\n ϋ: 'y',\n ΐ: 'i',\n Α: 'A',\n Β: 'B',\n Γ: 'G',\n Δ: 'D',\n Ε: 'E',\n Ζ: 'Z',\n Η: 'H',\n Θ: 'Th',\n Ι: 'I',\n Κ: 'K',\n Λ: 'L',\n Μ: 'M',\n Ν: 'N',\n Ξ: '3',\n Ο: 'O',\n Π: 'P',\n Ρ: 'R',\n Σ: 'S',\n Τ: 'T',\n Υ: 'Y',\n Φ: 'F',\n Χ: 'X',\n Ψ: 'PS',\n Ω: 'W',\n Ά: 'A',\n Έ: 'E',\n Ί: 'I',\n Ό: 'O',\n Ύ: 'Y',\n Ή: 'H',\n Ώ: 'W',\n Ϊ: 'I',\n Ϋ: 'Y',\n // turkish\n ş: 's',\n Ş: 'S',\n ı: 'i',\n İ: 'I',\n ğ: 'g',\n Ğ: 'G',\n // russian\n а: 'a',\n б: 'b',\n в: 'v',\n г: 'g',\n д: 'd',\n е: 'e',\n ё: 'yo',\n ж: 'zh',\n з: 'z',\n и: 'i',\n й: 'j',\n к: 'k',\n л: 'l',\n м: 'm',\n н: 'n',\n о: 'o',\n п: 'p',\n р: 'r',\n с: 's',\n т: 't',\n у: 'u',\n ф: 'f',\n х: 'h',\n ц: 'c',\n ч: 'ch',\n ш: 'sh',\n щ: 'sh',\n ъ: 'u',\n ы: 'y',\n ь: '',\n э: 'e',\n ю: 'yu',\n я: 'ya',\n А: 'A',\n Б: 'B',\n В: 'V',\n Г: 'G',\n Д: 'D',\n Е: 'E',\n Ё: 'Yo',\n Ж: 'Zh',\n З: 'Z',\n И: 'I',\n Й: 'J',\n К: 'K',\n Л: 'L',\n М: 'M',\n Н: 'N',\n О: 'O',\n П: 'P',\n Р: 'R',\n С: 'S',\n Т: 'T',\n У: 'U',\n Ф: 'F',\n Х: 'H',\n Ц: 'C',\n Ч: 'Ch',\n Ш: 'Sh',\n Щ: 'Sh',\n Ъ: 'U',\n Ы: 'Y',\n Ь: '',\n Э: 'E',\n Ю: 'Yu',\n Я: 'Ya',\n // ukranian\n Є: 'Ye',\n І: 'I',\n Ї: 'Yi',\n Ґ: 'G',\n є: 'ye',\n і: 'i',\n ї: 'yi',\n ґ: 'g',\n // czech\n č: 'c',\n ď: 'd',\n ě: 'e',\n ň: 'n',\n ř: 'r',\n š: 's',\n ť: 't',\n ů: 'u',\n ž: 'z',\n Č: 'C',\n Ď: 'D',\n Ě: 'E',\n Ň: 'N',\n Ř: 'R',\n Š: 'S',\n Ť: 'T',\n Ů: 'U',\n Ž: 'Z',\n // slovak\n ľ: 'l',\n ĺ: 'l',\n ŕ: 'r',\n Ľ: 'L',\n Ĺ: 'L',\n Ŕ: 'R',\n // polish\n ą: 'a',\n ć: 'c',\n ę: 'e',\n ł: 'l',\n ń: 'n',\n ś: 's',\n ź: 'z',\n ż: 'z',\n Ą: 'A',\n Ć: 'C',\n Ę: 'E',\n Ł: 'L',\n Ń: 'N',\n Ś: 'S',\n Ź: 'Z',\n Ż: 'Z',\n // latvian\n ā: 'a',\n ē: 'e',\n ģ: 'g',\n ī: 'i',\n ķ: 'k',\n ļ: 'l',\n ņ: 'n',\n ū: 'u',\n Ā: 'A',\n Ē: 'E',\n Ģ: 'G',\n Ī: 'I',\n Ķ: 'K',\n Ļ: 'L',\n Ņ: 'N',\n Ū: 'U',\n // arabic\n أ: 'a',\n إ: 'i',\n ب: 'b',\n ت: 't',\n ث: 'th',\n ج: 'g',\n ح: 'h',\n خ: 'kh',\n د: 'd',\n ذ: 'th',\n ر: 'r',\n ز: 'z',\n س: 's',\n ش: 'sh',\n ص: 's',\n ض: 'd',\n ط: 't',\n ظ: 'th',\n ع: 'aa',\n غ: 'gh',\n ف: 'f',\n ق: 'k',\n ك: 'k',\n ل: 'l',\n م: 'm',\n ن: 'n',\n ه: 'h',\n و: 'o',\n ي: 'y',\n ء: 'aa',\n ة: 'a',\n // farsi\n آ: 'a',\n ا: 'a',\n پ: 'p',\n ژ: 'zh',\n گ: 'g',\n چ: 'ch',\n ک: 'k',\n ی: 'i',\n // lithuanian\n ė: 'e',\n į: 'i',\n ų: 'u',\n Ė: 'E',\n Į: 'I',\n Ų: 'U',\n // romanian\n ț: 't',\n Ț: 'T',\n ţ: 't',\n Ţ: 'T',\n ș: 's',\n Ș: 'S',\n ă: 'a',\n Ă: 'A',\n // vietnamese\n Ạ: 'A',\n Ả: 'A',\n Ầ: 'A',\n Ấ: 'A',\n Ậ: 'A',\n Ẩ: 'A',\n Ẫ: 'A',\n Ằ: 'A',\n Ắ: 'A',\n Ặ: 'A',\n Ẳ: 'A',\n Ẵ: 'A',\n Ẹ: 'E',\n Ẻ: 'E',\n Ẽ: 'E',\n Ề: 'E',\n Ế: 'E',\n Ệ: 'E',\n Ể: 'E',\n Ễ: 'E',\n Ị: 'I',\n Ỉ: 'I',\n Ĩ: 'I',\n Ọ: 'O',\n Ỏ: 'O',\n Ồ: 'O',\n Ố: 'O',\n Ộ: 'O',\n Ổ: 'O',\n Ỗ: 'O',\n Ơ: 'O',\n Ờ: 'O',\n Ớ: 'O',\n Ợ: 'O',\n Ở: 'O',\n Ỡ: 'O',\n Ụ: 'U',\n Ủ: 'U',\n Ũ: 'U',\n Ư: 'U',\n Ừ: 'U',\n Ứ: 'U',\n Ự: 'U',\n Ử: 'U',\n Ữ: 'U',\n Ỳ: 'Y',\n Ỵ: 'Y',\n Ỷ: 'Y',\n Ỹ: 'Y',\n Đ: 'D',\n ạ: 'a',\n ả: 'a',\n ầ: 'a',\n ấ: 'a',\n ậ: 'a',\n ẩ: 'a',\n ẫ: 'a',\n ằ: 'a',\n ắ: 'a',\n ặ: 'a',\n ẳ: 'a',\n ẵ: 'a',\n ẹ: 'e',\n ẻ: 'e',\n ẽ: 'e',\n ề: 'e',\n ế: 'e',\n ệ: 'e',\n ể: 'e',\n ễ: 'e',\n ị: 'i',\n ỉ: 'i',\n ĩ: 'i',\n ọ: 'o',\n ỏ: 'o',\n ồ: 'o',\n ố: 'o',\n ộ: 'o',\n ổ: 'o',\n ỗ: 'o',\n ơ: 'o',\n ờ: 'o',\n ớ: 'o',\n ợ: 'o',\n ở: 'o',\n ỡ: 'o',\n ụ: 'u',\n ủ: 'u',\n ũ: 'u',\n ư: 'u',\n ừ: 'u',\n ứ: 'u',\n ự: 'u',\n ử: 'u',\n ữ: 'u',\n ỳ: 'y',\n ỵ: 'y',\n ỷ: 'y',\n ỹ: 'y',\n đ: 'd',\n // kazakh\n Ә: 'AE',\n ә: 'ae',\n Ғ: 'GH',\n ғ: 'gh',\n Қ: 'KH',\n қ: 'kh',\n Ң: 'NG',\n ң: 'ng',\n Ү: 'UE',\n ү: 'ue',\n Ұ: 'U',\n ұ: 'u',\n Һ: 'H',\n һ: 'h',\n Ө: 'OE',\n ө: 'oe',\n // serbian\n ђ: 'dj',\n ј: 'j',\n љ: 'lj',\n њ: 'nj',\n ћ: 'c',\n џ: 'dz',\n Ђ: 'Dj',\n Ј: 'j',\n Љ: 'Lj',\n Њ: 'Nj',\n Ћ: 'C',\n Џ: 'Dz',\n nj: 'nj',\n lj: 'lj',\n Nj: 'NJ',\n Lj: 'LJ',\n // hindi\n अ: 'a',\n आ: 'aa',\n ए: 'e',\n ई: 'ii',\n ऍ: 'ei',\n ऎ: 'ae',\n ऐ: 'ai',\n इ: 'i',\n ओ: 'o',\n ऑ: 'oi',\n ऒ: 'oii',\n ऊ: 'uu',\n औ: 'ou',\n उ: 'u',\n ब: 'B',\n भ: 'Bha',\n च: 'Ca',\n छ: 'Chha',\n ड: 'Da',\n ढ: 'Dha',\n फ: 'Fa',\n ग: 'Ga',\n घ: 'Gha',\n ग़: 'Ghi',\n ह: 'Ha',\n ज: 'Ja',\n झ: 'Jha',\n क: 'Ka',\n ख: 'Kha',\n ख़: 'Khi',\n ल: 'L',\n ळ: 'Li',\n ऌ: 'Li',\n ऴ: 'Lii',\n ॡ: 'Lii',\n म: 'Ma',\n न: 'Na',\n ङ: 'Na',\n ञ: 'Nia',\n ण: 'Nae',\n ऩ: 'Ni',\n ॐ: 'oms',\n प: 'Pa',\n क़: 'Qi',\n र: 'Ra',\n ऋ: 'Ri',\n ॠ: 'Ri',\n ऱ: 'Ri',\n स: 'Sa',\n श: 'Sha',\n ष: 'Shha',\n ट: 'Ta',\n त: 'Ta',\n ठ: 'Tha',\n द: 'Tha',\n थ: 'Tha',\n ध: 'Thha',\n ड़: 'ugDha',\n ढ़: 'ugDhha',\n व: 'Va',\n य: 'Ya',\n य़: 'Yi',\n ज़: 'Za',\n // azerbaijani\n ə: 'e',\n Ə: 'E',\n // georgian\n ა: 'a',\n ბ: 'b',\n გ: 'g',\n დ: 'd',\n ე: 'e',\n ვ: 'v',\n ზ: 'z',\n თ: 't',\n ი: 'i',\n კ: 'k',\n ლ: 'l',\n მ: 'm',\n ნ: 'n',\n ო: 'o',\n პ: 'p',\n ჟ: 'zh',\n რ: 'r',\n ს: 's',\n ტ: 't',\n უ: 'u',\n ფ: 'p',\n ქ: 'k',\n ღ: 'gh',\n ყ: 'q',\n შ: 'sh',\n ჩ: 'ch',\n ც: 'ts',\n ძ: 'dz',\n წ: 'ts',\n ჭ: 'ch',\n ხ: 'kh',\n ჯ: 'j',\n ჰ: 'h',\n // hebrew\n ב: 'v',\n גּ: 'g',\n ג: 'g',\n ד: 'd',\n דּ: 'd',\n ה: 'h',\n ו: 'v',\n ז: 'z',\n ח: 'h',\n ט: 't',\n י: 'y',\n כ: 'kh',\n ך: 'kh',\n ל: 'l',\n מ: 'm',\n ם: 'm',\n נ: 'n',\n ן: 'n',\n ס: 's',\n פ: 'f',\n ף: 'f',\n ץ: 'ts',\n צ: 'ts',\n ק: 'k',\n ר: 'r',\n תּ: 't',\n ת: 't'\n}\n\nslug.charmap = Object.assign({}, initialCharmap)\nslug.multicharmap = Object.assign({}, initialMulticharmap)\nslug.defaults = {\n charmap: slug.charmap,\n mode: 'pretty',\n modes: {\n rfc3986: {\n replacement: '-',\n remove: null,\n lower: true,\n charmap: slug.charmap,\n multicharmap: slug.multicharmap,\n trim: true\n },\n pretty: {\n replacement: '-',\n remove: null,\n lower: true,\n charmap: slug.charmap,\n multicharmap: slug.multicharmap,\n trim: true\n }\n },\n multicharmap: slug.multicharmap,\n fallback: true\n}\n\nslug.reset = function () {\n slug.defaults.modes.rfc3986.charmap = slug.defaults.modes.pretty.charmap = slug.charmap = slug.defaults.charmap = Object.assign({}, initialCharmap)\n slug.defaults.modes.rfc3986.multicharmap = slug.defaults.modes.pretty.multicharmap = slug.multicharmap = slug.defaults.multicharmap = Object.assign({}, initialMulticharmap)\n defaultLocale = ''\n}\n\nslug.extend = function (customMap) {\n const keys = Object.keys(customMap)\n const multi = {}\n const single = {}\n for (let i = 0; i < keys.length; i++) {\n if (keys[i].length > 1) {\n multi[keys[i]] = customMap[keys[i]]\n } else {\n single[keys[i]] = customMap[keys[i]]\n }\n }\n Object.assign(slug.charmap, single)\n Object.assign(slug.multicharmap, multi)\n}\n\nslug.setLocale = function (locale) {\n defaultLocale = locales[locale] || {}\n}\n\nexport default slug\n","// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>\n// This work is free. You can redistribute it and/or modify it\n// under the terms of the WTFPL, Version 2\n// For more information see LICENSE.txt or http://www.wtfpl.net/\n//\n// For more information, the home page:\n// http://pieroxy.net/blog/pages/lz-string/testing.html\n//\n// LZ-based compression algorithm, version 1.4.5\nvar LZString = (function() {\n\n// private property\nvar f = String.fromCharCode;\nvar keyStrBase64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\nvar keyStrUriSafe = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$\";\nvar baseReverseDic = {};\n\nfunction getBaseValue(alphabet, character) {\n if (!baseReverseDic[alphabet]) {\n baseReverseDic[alphabet] = {};\n for (var i=0 ; i<alphabet.length ; i++) {\n baseReverseDic[alphabet][alphabet.charAt(i)] = i;\n }\n }\n return baseReverseDic[alphabet][character];\n}\n\nvar LZString = {\n compressToBase64 : function (input) {\n if (input == null) return \"\";\n var res = LZString._compress(input, 6, function(a){return keyStrBase64.charAt(a);});\n switch (res.length % 4) { // To produce valid Base64\n default: // When could this happen ?\n case 0 : return res;\n case 1 : return res+\"===\";\n case 2 : return res+\"==\";\n case 3 : return res+\"=\";\n }\n },\n\n decompressFromBase64 : function (input) {\n if (input == null) return \"\";\n if (input == \"\") return null;\n return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrBase64, input.charAt(index)); });\n },\n\n compressToUTF16 : function (input) {\n if (input == null) return \"\";\n return LZString._compress(input, 15, function(a){return f(a+32);}) + \" \";\n },\n\n decompressFromUTF16: function (compressed) {\n if (compressed == null) return \"\";\n if (compressed == \"\") return null;\n return LZString._decompress(compressed.length, 16384, function(index) { return compressed.charCodeAt(index) - 32; });\n },\n\n //compress into uint8array (UCS-2 big endian format)\n compressToUint8Array: function (uncompressed) {\n var compressed = LZString.compress(uncompressed);\n var buf=new Uint8Array(compressed.length*2); // 2 bytes per character\n\n for (var i=0, TotalLen=compressed.length; i<TotalLen; i++) {\n var current_value = compressed.charCodeAt(i);\n buf[i*2] = current_value >>> 8;\n buf[i*2+1] = current_value % 256;\n }\n return buf;\n },\n\n //decompress from uint8array (UCS-2 big endian format)\n decompressFromUint8Array:function (compressed) {\n if (compressed===null || compressed===undefined){\n return LZString.decompress(compressed);\n } else {\n var buf=new Array(compressed.length/2); // 2 bytes per character\n for (var i=0, TotalLen=buf.length; i<TotalLen; i++) {\n buf[i]=compressed[i*2]*256+compressed[i*2+1];\n }\n\n var result = [];\n buf.forEach(function (c) {\n result.push(f(c));\n });\n return LZString.decompress(result.join(''));\n\n }\n\n },\n\n\n //compress into a string that is already URI encoded\n compressToEncodedURIComponent: function (input) {\n if (input == null) return \"\";\n return LZString._compress(input, 6, function(a){return keyStrUriSafe.charAt(a);});\n },\n\n //decompress from an output of compressToEncodedURIComponent\n decompressFromEncodedURIComponent:function (input) {\n if (input == null) return \"\";\n if (input == \"\") return null;\n input = input.replace(/ /g, \"+\");\n return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrUriSafe, input.charAt(index)); });\n },\n\n compress: function (uncompressed) {\n return LZString._compress(uncompressed, 16, function(a){return f(a);});\n },\n _compress: function (uncompressed, bitsPerChar, getCharFromInt) {\n if (uncompressed == null) return \"\";\n var i, value,\n context_dictionary= {},\n context_dictionaryToCreate= {},\n context_c=\"\",\n context_wc=\"\",\n context_w=\"\",\n context_enlargeIn= 2, // Compensate for the first entry which should not count\n context_dictSize= 3,\n context_numBits= 2,\n context_data=[],\n context_data_val=0,\n context_data_position=0,\n ii;\n\n for (ii = 0; ii < uncompressed.length; ii += 1) {\n context_c = uncompressed.charAt(ii);\n if (!Object.prototype.hasOwnProperty.call(context_dictionary,context_c)) {\n context_dictionary[context_c] = context_dictSize++;\n context_dictionaryToCreate[context_c] = true;\n }\n\n context_wc = context_w + context_c;\n if (Object.prototype.hasOwnProperty.call(context_dictionary,context_wc)) {\n context_w = context_wc;\n } else {\n if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {\n if (context_w.charCodeAt(0)<256) {\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<8 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n } else {\n value = 1;\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | value;\n if (context_data_position ==bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = 0;\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<16 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n delete context_dictionaryToCreate[context_w];\n } else {\n value = context_dictionary[context_w];\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n\n\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n // Add wc to the dictionary.\n context_dictionary[context_wc] = context_dictSize++;\n context_w = String(context_c);\n }\n }\n\n // Output the code for w.\n if (context_w !== \"\") {\n if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {\n if (context_w.charCodeAt(0)<256) {\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<8 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n } else {\n value = 1;\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | value;\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = 0;\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<16 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n delete context_dictionaryToCreate[context_w];\n } else {\n value = context_dictionary[context_w];\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n\n\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n }\n\n // Mark the end of the stream\n value = 2;\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n\n // Flush the last char\n while (true) {\n context_data_val = (context_data_val << 1);\n if (context_data_position == bitsPerChar-1) {\n context_data.push(getCharFromInt(context_data_val));\n break;\n }\n else context_data_position++;\n }\n return context_data.join('');\n },\n\n decompress: function (compressed) {\n if (compressed == null) return \"\";\n if (compressed == \"\") return null;\n return LZString._decompress(compressed.length, 32768, function(index) { return compressed.charCodeAt(index); });\n },\n\n _decompress: function (length, resetValue, getNextValue) {\n var dictionary = [],\n next,\n enlargeIn = 4,\n dictSize = 4,\n numBits = 3,\n entry = \"\",\n result = [],\n i,\n w,\n bits, resb, maxpower, power,\n c,\n data = {val:getNextValue(0), position:resetValue, index:1};\n\n for (i = 0; i < 3; i += 1) {\n dictionary[i] = i;\n }\n\n bits = 0;\n maxpower = Math.pow(2,2);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n\n switch (next = bits) {\n case 0:\n bits = 0;\n maxpower = Math.pow(2,8);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n c = f(bits);\n break;\n case 1:\n bits = 0;\n maxpower = Math.pow(2,16);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n c = f(bits);\n break;\n case 2:\n return \"\";\n }\n dictionary[3] = c;\n w = c;\n result.push(c);\n while (true) {\n if (data.index > length) {\n return \"\";\n }\n\n bits = 0;\n maxpower = Math.pow(2,numBits);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n\n switch (c = bits) {\n case 0:\n bits = 0;\n maxpower = Math.pow(2,8);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n\n dictionary[dictSize++] = f(bits);\n c = dictSize-1;\n enlargeIn--;\n break;\n case 1:\n bits = 0;\n maxpower = Math.pow(2,16);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n dictionary[dictSize++] = f(bits);\n c = dictSize-1;\n enlargeIn--;\n break;\n case 2:\n return result.join('');\n }\n\n if (enlargeIn == 0) {\n enlargeIn = Math.pow(2, numBits);\n numBits++;\n }\n\n if (dictionary[c]) {\n entry = dictionary[c];\n } else {\n if (c === dictSize) {\n entry = w + w.charAt(0);\n } else {\n return null;\n }\n }\n result.push(entry);\n\n // Add w+entry[0] to the dictionary.\n dictionary[dictSize++] = w + entry.charAt(0);\n enlargeIn--;\n\n w = entry;\n\n if (enlargeIn == 0) {\n enlargeIn = Math.pow(2, numBits);\n numBits++;\n }\n\n }\n }\n};\n return LZString;\n})();\n\nif (typeof define === 'function' && define.amd) {\n define(function () { return LZString; });\n} else if( typeof module !== 'undefined' && module != null ) {\n module.exports = LZString\n} else if( typeof angular !== 'undefined' && angular != null ) {\n angular.module('LZString', [])\n .factory('LZString', function () {\n return LZString;\n });\n}\n","import { C as uploadOperations, S as queueOperations, _ as clearGlobal, a as setDocumentCache, b as dispatchActions, c as useDocuments, d as useGetDocuments, f as DocumentCache, g as getAnalyticsStore, h as createAnalyticsStore, i as addDocumentCacheEventHandler, l as useGetDocument, m as readPromiseState, n as useDocumentsByIds, o as useDocument, p as addPromiseState, r as useDispatch, s as useDocumentCache, t as useDocumentById, u as useGetDocumentAsync, v as getGlobal, x as queueActions, y as setGlobal } from \"./document-by-id-CDLUqru5.js\";\nimport { n as PropagationMode, t as createClient } from \"./client-DMdsUVJw.js\";\nimport { t as makePHEventFunctions } from \"./make-ph-event-functions-Cr4GqOTT.js\";\nimport { A as useLoginStatus, C as RENOWN_CHAIN_ID, D as addRenownEventHandler, E as VERIFIABLE_CREDENTIAL_EIP712_TYPE, F as setLoading, I as useLoading, M as useUser, N as addLoadingEventHandler, O as setRenown, P as loading, S as ISSUER_TYPE, T as RENOWN_URL, _ as openRenown, a as RenownAuthButton, b as CREDENTIAL_TYPES, c as ChevronDownIcon, d as RenownLogo, f as SpinnerIcon, g as logout, h as login, i as initRenownCrypto, j as useRenown, k as useDid, l as CopyIcon, m as useRenownAuth, n as useRenownInit, o as RenownUserButton, p as UserIcon, r as initConnectCrypto, s as RenownLoginButton, t as Renown, u as DisconnectIcon, v as CREDENTIAL_SCHEMA_EIP712_TYPE, w as RENOWN_NETWORK_ID, x as DOMAIN_TYPE, y as CREDENTIAL_SUBJECT_TYPE } from \"./renown-CV_45Xc1.js\";\nimport { n as useRelationalQuery, r as useRelationalDb, t as createProcessorQuery } from \"./relational-jwreqDwz.js\";\nimport { documentModelDocumentModelModule, logger } from \"document-model\";\nimport { baseLoadFromInput, baseSaveToFileHandle, createPresignedHeader, createZip, documentModelDocumentType, generateId, replayDocument, setName, validateInitialState, validateModules, validateStateSchemaName } from \"@powerhousedao/shared/document-model\";\nimport { addFolder as addFolder$1, copyNode, deleteNode as deleteNode$1, driveCreateDocument, generateNodesCopy, getDescendants, handleTargetNameCollisions, isFileNode, isFolderNode, moveNode, setAvailableOffline, setSharingType, updateNode } from \"@powerhousedao/shared/document-drive\";\nimport { ChannelScheme, DocumentChangeType, DocumentIntegrityService, DuplicateManifestError, DuplicateModuleError, GqlRequestChannel, InMemoryQueue, IntervalPollTimer, ModuleNotFoundError, REACTOR_SCHEMA, REACTOR_SCHEMA as REACTOR_SCHEMA$1, ReactorBuilder, ReactorClientBuilder, RelationalDbProcessor, SyncOperationStatus, SyncStatus, driveCollectionId, driveCollectionId as driveCollectionId$1, driveIdFromUrl, parseDriveUrl } from \"@powerhousedao/reactor\";\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from \"react\";\nimport slug from \"slug\";\nimport * as lzString from \"lz-string\";\n//#region src/errors.ts\nvar UnsupportedDocumentTypeError = class extends Error {\n\tconstructor(documentType) {\n\t\tsuper(`Document type ${documentType} is not supported`);\n\t\tthis.name = \"UnsupportedDocumentTypeError\";\n\t}\n\tstatic isError(error) {\n\t\treturn Error.isError(error) && error.name === \"UnsupportedDocumentTypeError\";\n\t}\n};\nvar DocumentModelNotFoundError = class extends Error {\n\tdocumentType;\n\tname = \"DocumentModelNotFoundError\";\n\tconstructor(documentType) {\n\t\tsuper(`Document model module for type ${documentType} not found`);\n\t\tthis.documentType = documentType;\n\t}\n\tstatic isError(error) {\n\t\treturn Error.isError(error) && error.name === \"DocumentModelNotFoundError\";\n\t}\n};\nvar DocumentTypeMismatchError = class extends Error {\n\tconstructor(documentId, expectedType, actualType) {\n\t\tsuper(`Document ${documentId} is not of type ${expectedType}. Actual type: ${actualType}`);\n\t}\n};\nvar NoSelectedDocumentError = class extends Error {\n\tconstructor() {\n\t\tsuper(\"There is no selected document. Did you mean to call 'useSelectedDocumentSafe' instead?\");\n\t}\n};\n//#endregion\n//#region src/utils/documents.ts\nfunction isDocumentTypeSupported(documentType, supportedDocuments) {\n\tif (!supportedDocuments?.length) return true;\n\treturn supportedDocuments.some((pattern) => {\n\t\tif (pattern.endsWith(\"/*\")) {\n\t\t\tconst prefix = pattern.slice(0, -2);\n\t\t\treturn documentType.startsWith(prefix + \"/\");\n\t\t}\n\t\tif (pattern.endsWith(\"*\") && !pattern.endsWith(\"/*\")) {\n\t\t\tconst prefix = pattern.slice(0, -1);\n\t\t\treturn documentType.startsWith(prefix);\n\t\t}\n\t\treturn pattern === documentType;\n\t});\n}\n//#endregion\n//#region src/utils/user.ts\nfunction getUserPermissions() {\n\tconst user = window.ph?.renown?.user;\n\tconst allowList = window.ph?.allowList;\n\tif (!allowList) return {\n\t\tisAllowedToCreateDocuments: true,\n\t\tisAllowedToEditDocuments: true\n\t};\n\treturn {\n\t\tisAllowedToCreateDocuments: allowList.includes(user?.address ?? \"\"),\n\t\tisAllowedToEditDocuments: allowList.includes(user?.address ?? \"\")\n\t};\n}\n//#endregion\n//#region src/actions/document.ts\nconst BASE_STATE_KEYS = new Set([\"auth\"]);\nconst NON_DOMAIN_SCOPES = new Set([\"auth\", \"document\"]);\nasync function isDocumentInLocation(document, driveId, parentFolder) {\n\tconst reactorClient = window.ph?.reactorClient;\n\tif (!reactorClient) return { isDuplicate: false };\n\tlet drive;\n\ttry {\n\t\tdrive = await reactorClient.get(driveId);\n\t} catch {\n\t\treturn { isDuplicate: false };\n\t}\n\tconst nodeById = drive.state.global.nodes.find((node) => node.id === document.header.id);\n\tif (nodeById && nodeById.parentFolder === (parentFolder ?? null)) return {\n\t\tisDuplicate: true,\n\t\tduplicateType: \"id\",\n\t\tnodeId: nodeById.id\n\t};\n\tconst nodeByNameAndType = drive.state.global.nodes.find((node) => isFileNode(node) && node.name === document.header.name && node.documentType === document.header.documentType && node.parentFolder === (parentFolder ?? null));\n\tif (nodeByNameAndType) return {\n\t\tisDuplicate: true,\n\t\tduplicateType: \"name\",\n\t\tnodeId: nodeByNameAndType.id\n\t};\n\treturn { isDuplicate: false };\n}\nfunction getDocumentTypeIcon(document) {\n\tswitch (document.header.documentType) {\n\t\tcase \"powerhouse/document-model\": return \"document-model\";\n\t\tcase \"powerhouse/app\": return \"app\";\n\t\tcase \"powerhouse/document-editor\": return \"editor\";\n\t\tcase \"powerhouse/subgraph\": return \"subgraph\";\n\t\tcase \"powerhouse/package\": return \"package\";\n\t\tcase \"powerhouse/processor\": {\n\t\t\tconst processorType = document.state.global?.type;\n\t\t\tif (processorType === \"analytics\") return \"analytics-processor\";\n\t\t\tif (processorType === \"relational\") return \"relational-processor\";\n\t\t\tif (processorType === \"codegen\") return \"codegen-processor\";\n\t\t\treturn;\n\t\t}\n\t\tdefault: return;\n\t}\n}\nasync function downloadFile(document, fileName) {\n\t(await createZip(document)).generateAsync({ type: \"blob\" }).then((blob) => {\n\t\tconst link = window.document.createElement(\"a\");\n\t\tlink.style.display = \"none\";\n\t\tlink.href = URL.createObjectURL(blob);\n\t\tlink.download = fileName;\n\t\twindow.document.body.appendChild(link);\n\t\tlink.click();\n\t\twindow.document.body.removeChild(link);\n\t}).catch(logger.error);\n}\nasync function getDocumentExtension(document) {\n\tconst documentType = document.header.documentType;\n\tlet rawExtension;\n\tif (documentType === documentModelDocumentType) rawExtension = document.state.global?.extension;\n\telse {\n\t\tconst reactorClient = window.ph?.reactorClient;\n\t\tif (reactorClient) {\n\t\t\tconst { results: documentModelModules } = await reactorClient.getDocumentModelModules();\n\t\t\trawExtension = documentModelModules.find((m) => m.documentModel.global.id === documentType)?.utils.fileExtension;\n\t\t}\n\t}\n\treturn (rawExtension ?? \"\").replace(/^\\.+|\\.+$/g, \"\");\n}\n/**\n* Fetches all operations for a document using cursor-based pagination.\n* The reactor client handles multi-scope cursors transparently via\n* composite cursors, so all scopes are fetched in a single paginated stream.\n*/\nasync function fetchDocumentOperations(reactorClient, document, pageSize = 100) {\n\tconst scopes = Object.keys(document.state).filter((k) => !BASE_STATE_KEYS.has(k));\n\tconst operations = {};\n\tfor (const scope of scopes) operations[scope] = [];\n\tlet cursor = \"\";\n\tdo {\n\t\tconst page = await reactorClient.getOperations(document.header.id, { scopes }, void 0, {\n\t\t\tcursor,\n\t\t\tlimit: pageSize\n\t\t});\n\t\tfor (const op of page.results) {\n\t\t\tconst scope = op.action.scope ?? \"global\";\n\t\t\tif (operations[scope]) operations[scope].push(op);\n\t\t}\n\t\tcursor = page.nextCursor ?? \"\";\n\t} while (cursor);\n\treturn operations;\n}\nfunction extractInitialState(documentScopeOps) {\n\tconst upgradeOp = documentScopeOps.find((op) => op.action.type === \"UPGRADE_DOCUMENT\");\n\tif (!upgradeOp) throw new Error(\"No UPGRADE_DOCUMENT operation found — document is invalid\");\n\tconst input = upgradeOp.action.input;\n\tconst initialState = input.initialState ?? input.state;\n\tif (!initialState) throw new Error(\"UPGRADE_DOCUMENT operation has no initialState — document is invalid\");\n\treturn initialState;\n}\nfunction filterDomainOperations(operations) {\n\treturn Object.fromEntries(Object.entries(operations).filter(([scope]) => !NON_DOMAIN_SCOPES.has(scope)));\n}\nasync function exportFile(document, suggestedName) {\n\tconst reactorClient = window.ph?.reactorClient;\n\tif (!reactorClient) throw new Error(\"ReactorClient not initialized\");\n\tconst operations = await fetchDocumentOperations(reactorClient, document);\n\tconst initialState = extractInitialState(operations[\"document\"] ?? []);\n\tconst documentWithOps = {\n\t\t...document,\n\t\toperations,\n\t\tinitialState\n\t};\n\tconst extension = await getDocumentExtension(documentWithOps);\n\tconst baseName = suggestedName || documentWithOps.header.name || \"Untitled\";\n\tconst name = extension ? `${baseName}.${extension}.phd` : `${baseName}.phd`;\n\tif (!window.showSaveFilePicker) return await downloadFile(documentWithOps, name);\n\ttry {\n\t\tconst fileHandle = await window.showSaveFilePicker({ suggestedName: name });\n\t\tawait baseSaveToFileHandle(documentWithOps, fileHandle);\n\t\treturn fileHandle;\n\t} catch (e) {\n\t\tif (!(e instanceof DOMException && e.name === \"AbortError\")) throw e;\n\t}\n}\nasync function loadFile(path) {\n\tconst baseDocument = await baseLoadFromInput(path, (state) => state, { checkHashes: true });\n\tconst reactorClient = window.ph?.reactorClient;\n\tif (!reactorClient) throw new Error(\"ReactorClient not initialized\");\n\tconst { results: documentModelModules } = await reactorClient.getDocumentModelModules();\n\tconst documentModelModule = documentModelModules.find((module) => module.documentModel.global.id === baseDocument.header.documentType);\n\tif (!documentModelModule) throw new DocumentModelNotFoundError(baseDocument.header.documentType);\n\treturn documentModelModule.utils.loadFromInput(path);\n}\nasync function addDocument(driveId, name, documentType, parentFolder, document, id, preferredEditor) {\n\tconst { isAllowedToCreateDocuments } = getUserPermissions();\n\tif (!isAllowedToCreateDocuments) throw new Error(\"User is not allowed to create documents\");\n\tconst reactorClient = window.ph?.reactorClient;\n\tif (!reactorClient) throw new Error(\"ReactorClient not initialized\");\n\tconst documentModelModule = await reactorClient.getDocumentModelModule(documentType);\n\tconst newDocument = document ?? documentModelModule.utils.createDocument();\n\tnewDocument.header.name = name;\n\tif (preferredEditor) newDocument.header.meta = {\n\t\t...newDocument.header.meta,\n\t\tpreferredEditor\n\t};\n\tlet newDoc;\n\ttry {\n\t\tnewDoc = await reactorClient.createDocumentInDrive(driveId, newDocument, parentFolder);\n\t} catch (e) {\n\t\tlogger.error(\"Error adding document\", e);\n\t\tthrow new Error(\"There was an error adding document\");\n\t}\n\treturn {\n\t\tid: newDoc.header.id,\n\t\tname: newDoc.header.name,\n\t\tdocumentType,\n\t\tparentFolder: parentFolder ?? null,\n\t\tkind: \"file\"\n\t};\n}\nasync function addFile(file, driveId, name, parentFolder) {\n\tlogger.verbose(`addFile(drive: ${driveId}, name: ${name}, folder: ${parentFolder})`);\n\tconst { isAllowedToCreateDocuments } = getUserPermissions();\n\tif (!isAllowedToCreateDocuments) throw new Error(\"User is not allowed to create files\");\n\tconst document = await loadFile(file);\n\tlet duplicateId = false;\n\tconst reactorClient = window.ph?.reactorClient;\n\tif (!reactorClient) throw new Error(\"ReactorClient not initialized\");\n\ttry {\n\t\tawait reactorClient.get(document.header.id);\n\t\tduplicateId = true;\n\t} catch {}\n\tconst documentId = duplicateId ? generateId() : document.header.id;\n\tconst header = createPresignedHeader(documentId, document.header.documentType);\n\theader.lastModifiedAtUtcIso = document.header.createdAtUtcIso;\n\theader.meta = document.header.meta;\n\theader.name = name || document.header.name;\n\tconst initialDocument = {\n\t\t...document,\n\t\theader,\n\t\tstate: document.initialState,\n\t\toperations: Object.keys(document.operations).reduce((acc, key) => {\n\t\t\tacc[key] = [];\n\t\t\treturn acc;\n\t\t}, {})\n\t};\n\tawait addDocument(driveId, name || document.header.name, document.header.documentType, parentFolder, initialDocument, documentId, document.header.meta?.preferredEditor);\n\tawait uploadOperations(documentId, filterDomainOperations(document.operations), queueOperations);\n}\nasync function addFileWithProgress(file, driveId, name, parentFolder, onProgress, documentTypes, resolveConflict) {\n\tlogger.verbose(`addFileWithProgress(drive: ${driveId}, name: ${name}, folder: ${parentFolder})`);\n\tconst reactor = window.ph?.reactorClient;\n\tif (!reactor) return;\n\tconst { isAllowedToCreateDocuments } = getUserPermissions();\n\tif (!isAllowedToCreateDocuments) throw new Error(\"User is not allowed to create files\");\n\ttry {\n\t\tonProgress?.({\n\t\t\tstage: \"loading\",\n\t\t\tprogress: 0\n\t\t});\n\t\tlet document;\n\t\ttry {\n\t\t\tdocument = await loadFile(file);\n\t\t} catch (loadError) {\n\t\t\tconst discoveryService = window.ph?.packageDiscoveryService;\n\t\t\tif (discoveryService && DocumentModelNotFoundError.isError(loadError)) {\n\t\t\t\tretryAfterDiscovery(discoveryService, loadError.documentType, file, driveId, name, parentFolder, onProgress, documentTypes, resolveConflict);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow loadError;\n\t\t}\n\t\tconst duplicateCheck = await isDocumentInLocation(document, driveId, parentFolder);\n\t\tif (duplicateCheck.isDuplicate && !resolveConflict) {\n\t\t\tonProgress?.({\n\t\t\t\tstage: \"conflict\",\n\t\t\t\tprogress: 0,\n\t\t\t\tduplicateType: duplicateCheck.duplicateType\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (duplicateCheck.isDuplicate && resolveConflict === \"replace\" && duplicateCheck.nodeId) await deleteNode(driveId, duplicateCheck.nodeId);\n\t\tconst documentType = getDocumentTypeIcon(document);\n\t\tif (documentType) onProgress?.({\n\t\t\tstage: \"loading\",\n\t\t\tprogress: 10,\n\t\t\tdocumentType\n\t\t});\n\t\telse onProgress?.({\n\t\t\tstage: \"loading\",\n\t\t\tprogress: 10\n\t\t});\n\t\tif (!isDocumentTypeSupported(document.header.documentType, documentTypes)) {\n\t\t\tonProgress?.({\n\t\t\t\tstage: \"unsupported-document-type\",\n\t\t\t\tprogress: 100,\n\t\t\t\terror: `Document type ${document.header.documentType} is not supported`\n\t\t\t});\n\t\t\tthrow new UnsupportedDocumentTypeError(document.header.documentType);\n\t\t}\n\t\tawait reactor.getDocumentModelModule(document.header.documentType);\n\t\tonProgress?.({\n\t\t\tstage: \"initializing\",\n\t\t\tprogress: 10\n\t\t});\n\t\tlet duplicateId = false;\n\t\ttry {\n\t\t\tawait reactor.get(document.header.id);\n\t\t\tduplicateId = true;\n\t\t} catch {}\n\t\tconst documentId = duplicateId ? generateId() : document.header.id;\n\t\tconst header = createPresignedHeader(documentId, document.header.documentType);\n\t\theader.lastModifiedAtUtcIso = document.header.createdAtUtcIso;\n\t\theader.meta = document.header.meta;\n\t\theader.name = name || document.header.name;\n\t\tconst initialDocument = {\n\t\t\t...document,\n\t\t\theader,\n\t\t\tstate: document.initialState,\n\t\t\toperations: Object.keys(document.operations).reduce((acc, key) => {\n\t\t\t\tacc[key] = [];\n\t\t\t\treturn acc;\n\t\t\t}, {})\n\t\t};\n\t\tconst fileNode = await addDocument(driveId, name || document.header.name, document.header.documentType, parentFolder, initialDocument, documentId, document.header.meta?.preferredEditor);\n\t\tif (!fileNode) throw new Error(\"There was an error adding file\");\n\t\tonProgress?.({\n\t\t\tstage: \"initializing\",\n\t\t\tprogress: 20\n\t\t});\n\t\tawait reactor.get(documentId);\n\t\tconsole.log(\"Document created, starting upload of operations\");\n\t\tawait uploadOperations(documentId, filterDomainOperations(document.operations), queueOperations, { onProgress: (uploadProgress) => {\n\t\t\tif (uploadProgress.totalOperations && uploadProgress.uploadedOperations !== void 0) {\n\t\t\t\tconst uploadPercent = uploadProgress.totalOperations > 0 ? uploadProgress.uploadedOperations / uploadProgress.totalOperations : 0;\n\t\t\t\tconst overallProgress = 20 + Math.round(uploadPercent * 80);\n\t\t\t\tonProgress?.({\n\t\t\t\t\tstage: \"uploading\",\n\t\t\t\t\tprogress: overallProgress,\n\t\t\t\t\ttotalOperations: uploadProgress.totalOperations,\n\t\t\t\t\tuploadedOperations: uploadProgress.uploadedOperations\n\t\t\t\t});\n\t\t\t}\n\t\t} });\n\t\tonProgress?.({\n\t\t\tstage: \"complete\",\n\t\t\tprogress: 100,\n\t\t\tfileNode\n\t\t});\n\t\treturn fileNode;\n\t} catch (error) {\n\t\tif (!UnsupportedDocumentTypeError.isError(error)) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : \"Unknown error occurred\";\n\t\t\tonProgress?.({\n\t\t\t\tstage: \"failed\",\n\t\t\t\tprogress: 100,\n\t\t\t\terror: errorMessage\n\t\t\t});\n\t\t}\n\t\tthrow error;\n\t}\n}\nasync function retryAfterDiscovery(discoveryService, documentType, file, driveId, name, parentFolder, onProgress, documentTypes, resolveConflict) {\n\tif (!discoveryService) return;\n\ttry {\n\t\tawait discoveryService.load(documentType);\n\t} catch {\n\t\tonProgress?.({\n\t\t\tstage: \"unsupported-document-type\",\n\t\t\tprogress: 100,\n\t\t\terror: `Document type ${documentType} is not supported`\n\t\t});\n\t\treturn;\n\t}\n\tawait addFileWithProgress(file, driveId, name, parentFolder, onProgress, documentTypes, resolveConflict);\n}\nasync function addFolder(driveId, name, parentFolder) {\n\tconst { isAllowedToCreateDocuments } = getUserPermissions();\n\tif (!isAllowedToCreateDocuments) throw new Error(\"User is not allowed to create folders\");\n\tconst reactorClient = window.ph?.reactorClient;\n\tif (!reactorClient) throw new Error(\"ReactorClient not initialized\");\n\tawait reactorClient.get(driveId);\n\tconst folderId = generateId();\n\tconst node = (await reactorClient.execute(driveId, \"main\", [addFolder$1({\n\t\tid: folderId,\n\t\tname,\n\t\tparentFolder\n\t})])).state.global.nodes.find((node) => node.id === folderId);\n\tif (!node || !isFolderNode(node)) throw new Error(\"There was an error adding folder\");\n\treturn node;\n}\nasync function deleteNode(driveId, nodeId) {\n\tconst { isAllowedToCreateDocuments } = getUserPermissions();\n\tif (!isAllowedToCreateDocuments) throw new Error(\"User is not allowed to delete documents\");\n\tconst reactorClient = window.ph?.reactorClient;\n\tif (!reactorClient) throw new Error(\"ReactorClient not initialized\");\n\tconst drive = await reactorClient.get(driveId);\n\tconst node = drive.state.global.nodes.find((n) => n.id === nodeId);\n\tif (!node) throw new Error(`Node ${nodeId} not found in drive ${driveId}`);\n\tif (isFolderNode(node)) {\n\t\tconst fileDescendants = getDescendants(node, drive.state.global.nodes).filter(isFileNode);\n\t\tfor (const file of fileDescendants) await reactorClient.deleteDocument(file.id);\n\t\tawait reactorClient.execute(driveId, \"main\", [deleteNode$1({ id: nodeId })]);\n\t\treturn;\n\t}\n\tawait reactorClient.deleteDocument(nodeId);\n}\nasync function renameNode(driveId, nodeId, name) {\n\tconst { isAllowedToCreateDocuments } = getUserPermissions();\n\tif (!isAllowedToCreateDocuments) throw new Error(\"User is not allowed to rename documents\");\n\tconst reactorClient = window.ph?.reactorClient;\n\tif (!reactorClient) throw new Error(\"ReactorClient not initialized\");\n\tif ((await reactorClient.execute(nodeId, \"main\", [setName({ name })])).header.name !== name) throw new Error(\"There was an error renaming the node\");\n\tconst node = (await reactorClient.execute(driveId, \"main\", [updateNode({\n\t\tid: nodeId,\n\t\tname\n\t})])).state.global.nodes.find((n) => n.id === nodeId);\n\tif (!node) throw new Error(\"There was an error renaming node in the drive\");\n\treturn node;\n}\nasync function renameDriveNode(driveId, nodeId, name) {\n\tconst { isAllowedToCreateDocuments } = getUserPermissions();\n\tif (!isAllowedToCreateDocuments) throw new Error(\"User is not allowed to rename documents\");\n\tconst reactorClient = window.ph?.reactorClient;\n\tif (!reactorClient) throw new Error(\"ReactorClient not initialized\");\n\tif ((await reactorClient.execute(nodeId, \"main\", [setName({ name })])).header.name !== name) throw new Error(\"There was an error renaming the node\");\n\tawait reactorClient.execute(driveId, \"main\", [updateNode({\n\t\tid: nodeId,\n\t\tname\n\t})]);\n\treturn (await reactorClient.get(driveId)).state.global.nodes.find((n) => n.id === nodeId);\n}\nasync function moveNode$1(driveId, src, target) {\n\tconst { isAllowedToCreateDocuments } = getUserPermissions();\n\tif (!isAllowedToCreateDocuments) throw new Error(\"User is not allowed to move documents\");\n\tconst reactorClient = window.ph?.reactorClient;\n\tif (!reactorClient) throw new Error(\"ReactorClient not initialized\");\n\treturn await reactorClient.execute(driveId, \"main\", [moveNode({\n\t\tsrcFolder: src.id,\n\t\ttargetParentFolder: target?.id\n\t})]);\n}\nasync function _duplicateDocument(reactor, document, newId = generateId()) {\n\tconst documentModule = await reactor.getDocumentModelModule(document.header.documentType);\n\treturn replayDocument(document.initialState, document.operations, documentModule.reducer, createPresignedHeader(newId, document.header.documentType));\n}\nasync function copyNode$1(driveId, src, target) {\n\tconst reactor = window.ph?.reactorClient;\n\tif (!reactor) return;\n\tconst { isAllowedToCreateDocuments } = getUserPermissions();\n\tif (!isAllowedToCreateDocuments) throw new Error(\"User is not allowed to copy documents\");\n\tconst drive = await reactor.get(driveId);\n\tconst copyNodesInput = generateNodesCopy({\n\t\tsrcId: src.id,\n\t\ttargetParentFolder: target?.id,\n\t\ttargetName: src.name\n\t}, () => generateId(), drive.state.global.nodes);\n\tconst resolvedNamesMap = /* @__PURE__ */ new Map();\n\tfor (const copyNodeInput of copyNodesInput) {\n\t\tconst node = drive.state.global.nodes.find((n) => n.id === copyNodeInput.srcId);\n\t\tif (node) {\n\t\t\tconst resolvedName = handleTargetNameCollisions({\n\t\t\t\tnodes: drive.state.global.nodes,\n\t\t\t\tsrcName: copyNodeInput.targetName || node.name,\n\t\t\t\tsrcKind: isFileNode(node) ? \"file\" : \"folder\",\n\t\t\t\ttargetParentFolder: copyNodeInput.targetParentFolder || null\n\t\t\t});\n\t\t\tresolvedNamesMap.set(copyNodeInput.targetId, resolvedName);\n\t\t}\n\t}\n\tconst fileNodesToCopy = copyNodesInput.filter((copyNodeInput) => {\n\t\tconst node = drive.state.global.nodes.find((node) => node.id === copyNodeInput.srcId);\n\t\treturn node !== void 0 && isFileNode(node);\n\t});\n\tfor (const fileNodeToCopy of fileNodesToCopy) try {\n\t\tconst duplicatedDocument = await _duplicateDocument(reactor, await reactor.get(fileNodeToCopy.srcId), fileNodeToCopy.targetId);\n\t\tconst resolvedName = resolvedNamesMap.get(fileNodeToCopy.targetId);\n\t\tif (resolvedName) duplicatedDocument.header.name = resolvedName;\n\t\tawait reactor.createDocumentInDrive(driveId, duplicatedDocument, target?.id);\n\t} catch (e) {\n\t\tlogger.error(`Error copying document ${fileNodeToCopy.srcId}: ${String(e)}`);\n\t}\n\treturn await queueActions(drive, copyNodesInput.map((copyNodeInput) => copyNode(copyNodeInput)));\n}\n//#endregion\n//#region src/actions/drive.ts\nasync function addDrive(input, preferredEditor) {\n\tconst { isAllowedToCreateDocuments } = getUserPermissions();\n\tif (!isAllowedToCreateDocuments) throw new Error(\"User is not allowed to create drives\");\n\tconst reactorClient = window.ph?.reactorClient;\n\tif (!reactorClient) throw new Error(\"ReactorClient not initialized\");\n\tconst driveDoc = driveCreateDocument({ global: {\n\t\tname: input.global.name || \"\",\n\t\ticon: input.global.icon ?? null,\n\t\tnodes: []\n\t} });\n\tif (preferredEditor) driveDoc.header.meta = { preferredEditor };\n\treturn await reactorClient.create(driveDoc);\n}\nasync function addRemoteDrive(url, driveId) {\n\tif (!window.ph?.reactorClient) throw new Error(\"ReactorClient not initialized\");\n\tconst sync = window.ph?.reactorClientModule?.reactorModule?.syncModule?.syncManager;\n\tif (!sync) throw new Error(\"Sync not initialized\");\n\tconst response = await fetch(url);\n\tif (!response.ok) throw new Error(`Failed to resolve drive info from ${url}`);\n\tconst driveInfo = await response.json();\n\tconst resolvedDriveId = driveId ?? driveInfo.id;\n\tconst collectionId = driveCollectionId$1(\"main\", resolvedDriveId);\n\tif (sync.list().find((remote) => remote.collectionId === collectionId)) return resolvedDriveId;\n\tconst remoteName = crypto.randomUUID();\n\tawait sync.add(remoteName, collectionId, {\n\t\ttype: \"gql\",\n\t\tparameters: { url: driveInfo.graphqlEndpoint }\n\t});\n\treturn resolvedDriveId;\n}\nasync function deleteDrive(driveId) {\n\tconst { isAllowedToCreateDocuments } = getUserPermissions();\n\tif (!isAllowedToCreateDocuments) throw new Error(\"User is not allowed to delete drives\");\n\tconst reactorClient = window.ph?.reactorClient;\n\tif (!reactorClient) throw new Error(\"ReactorClient not initialized\");\n\tawait reactorClient.deleteDocument(driveId);\n}\nasync function renameDrive(driveId, name) {\n\tconst { isAllowedToCreateDocuments } = getUserPermissions();\n\tif (!isAllowedToCreateDocuments) throw new Error(\"User is not allowed to rename drives\");\n\tconst reactorClient = window.ph?.reactorClient;\n\tif (!reactorClient) throw new Error(\"ReactorClient not initialized\");\n\treturn await reactorClient.rename(driveId, name);\n}\nasync function setDriveAvailableOffline(driveId, availableOffline) {\n\tconst { isAllowedToCreateDocuments } = getUserPermissions();\n\tif (!isAllowedToCreateDocuments) throw new Error(\"User is not allowed to change drive availability\");\n\tconst reactorClient = window.ph?.reactorClient;\n\tif (!reactorClient) throw new Error(\"ReactorClient not initialized\");\n\treturn await reactorClient.execute(driveId, \"main\", [setAvailableOffline({ availableOffline })]);\n}\nasync function setDriveSharingType(driveId, sharingType) {\n\tconst { isAllowedToCreateDocuments } = getUserPermissions();\n\tif (!isAllowedToCreateDocuments) throw new Error(\"User is not allowed to change drive sharing type\");\n\tconst reactorClient = window.ph?.reactorClient;\n\tif (!reactorClient) throw new Error(\"ReactorClient not initialized\");\n\treturn await reactorClient.execute(driveId, \"main\", [setSharingType({ type: sharingType })]);\n}\n//#endregion\n//#region src/constants.ts\nconst DEFAULT_DRIVE_EDITOR_ID = \"powerhouse/generic-drive-explorer\";\nconst COMMON_PACKAGE_ID = \"powerhouse/common\";\n//#endregion\n//#region src/document-model.ts\nconst baseDocumentModelsMap = { DocumentModel: documentModelDocumentModelModule };\nconst baseDocumentModels = Object.values(baseDocumentModelsMap);\n//#endregion\n//#region src/hooks/config/editor.ts\nconst isExternalControlsEnabledEventFunctions = makePHEventFunctions(\"isExternalControlsEnabled\");\n/** Sets whether external controls are enabled for a given editor. */\nconst setIsExternalControlsEnabled = isExternalControlsEnabledEventFunctions.setValue;\n/** Gets whether external controls are enabled for a given editor. */\nconst useIsExternalControlsEnabled = isExternalControlsEnabledEventFunctions.useValue;\n/** Adds an event handler for when the external controls enabled state changes. */\nconst addIsExternalControlsEnabledEventHandler = isExternalControlsEnabledEventFunctions.addEventHandler;\nconst isDragAndDropEnabledEventFunctions = makePHEventFunctions(\"isDragAndDropEnabled\");\n/** Sets whether drag and drop is enabled for a given app. */\nconst setIsDragAndDropEnabled = isDragAndDropEnabledEventFunctions.setValue;\n/** Gets whether drag and drop is enabled for a given app. */\nconst useIsDragAndDropEnabled = isDragAndDropEnabledEventFunctions.useValue;\n/** Adds an event handler for when the drag and drop enabled state changes. */\nconst addIsDragAndDropEnabledEventHandler = isDragAndDropEnabledEventFunctions.addEventHandler;\nconst allowedDocumentTypesEventFunctions = makePHEventFunctions(\"allowedDocumentTypes\");\n/** Sets the allowed document types for a given app. */\nconst setAllowedDocumentTypes = allowedDocumentTypesEventFunctions.setValue;\n/** Defines the document types a drive supports.\n*\n* Defaults to all of the document types registered in the reactor.\n*/\nfunction useAllowedDocumentTypes() {\n\treturn allowedDocumentTypesEventFunctions.useValue();\n}\n/** Adds an event handler for when the allowed document types for a given app changes. */\nconst addAllowedDocumentTypesEventHandler = allowedDocumentTypesEventFunctions.addEventHandler;\nconst phAppConfigSetters = {\n\tallowedDocumentTypes: setAllowedDocumentTypes,\n\tisDragAndDropEnabled: setIsDragAndDropEnabled\n};\nconst phDocumentEditorConfigSetters = { isExternalControlsEnabled: setIsExternalControlsEnabled };\nconst phAppConfigHooks = {\n\tallowedDocumentTypes: useAllowedDocumentTypes,\n\tisDragAndDropEnabled: useIsDragAndDropEnabled\n};\nconst phDocumentEditorConfigHooks = { isExternalControlsEnabled: useIsExternalControlsEnabled };\n//#endregion\n//#region src/hooks/config/connect.ts\nconst { useValue: useRouterBasename, setValue: setRouterBasename, addEventHandler: addRouterBasenameEventHandler } = makePHEventFunctions(\"routerBasename\");\nconst { useValue: useVersion, setValue: setVersion, addEventHandler: addVersionEventHandler } = makePHEventFunctions(\"version\");\nconst { useValue: useRequiresHardRefresh, setValue: setRequiresHardRefresh, addEventHandler: addRequiresHardRefreshEventHandler } = makePHEventFunctions(\"requiresHardRefresh\");\nconst { useValue: useWarnOutdatedApp, setValue: setWarnOutdatedApp, addEventHandler: addWarnOutdatedAppEventHandler } = makePHEventFunctions(\"warnOutdatedApp\");\nconst { useValue: useStudioMode, setValue: setStudioMode, addEventHandler: addStudioModeEventHandler } = makePHEventFunctions(\"studioMode\");\nconst { useValue: useBasePath, setValue: setBasePath, addEventHandler: addBasePathEventHandler } = makePHEventFunctions(\"basePath\");\nconst { useValue: useVersionCheckInterval, setValue: setVersionCheckInterval, addEventHandler: addVersionCheckIntervalEventHandler } = makePHEventFunctions(\"versionCheckInterval\");\nconst { useValue: useCliVersion, setValue: setCliVersion, addEventHandler: addCliVersionEventHandler } = makePHEventFunctions(\"cliVersion\");\nconst { useValue: useFileUploadOperationsChunkSize, setValue: setFileUploadOperationsChunkSize, addEventHandler: addFileUploadOperationsChunkSizeEventHandler } = makePHEventFunctions(\"fileUploadOperationsChunkSize\");\nconst { useValue: useIsDocumentModelSelectionSettingsEnabled, setValue: setIsDocumentModelSelectionSettingsEnabled, addEventHandler: addIsDocumentModelSelectionSettingsEnabledEventHandler } = makePHEventFunctions(\"isDocumentModelSelectionSettingsEnabled\");\nconst { useValue: useGaTrackingId, setValue: setGaTrackingId, addEventHandler: addGaTrackingIdEventHandler } = makePHEventFunctions(\"gaTrackingId\");\nconst { useValue: useDefaultDrivesUrl, setValue: setDefaultDrivesUrl, addEventHandler: addDefaultDrivesUrlEventHandler } = makePHEventFunctions(\"defaultDrivesUrl\");\nconst { useValue: useDrivesPreserveStrategy, setValue: setDrivesPreserveStrategy, addEventHandler: addDrivesPreserveStrategyEventHandler } = makePHEventFunctions(\"drivesPreserveStrategy\");\nconst { useValue: useIsLocalDrivesEnabled, setValue: setIsLocalDrivesEnabled, addEventHandler: addIsLocalDrivesEnabledEventHandler } = makePHEventFunctions(\"isLocalDrivesEnabled\");\nconst { useValue: useIsAddDriveEnabled, setValue: setIsAddDriveEnabled, addEventHandler: addIsAddDriveEnabledEventHandler } = makePHEventFunctions(\"isAddDriveEnabled\");\nconst { useValue: useIsPublicDrivesEnabled, setValue: setIsPublicDrivesEnabled, addEventHandler: addIsPublicDrivesEnabledEventHandler } = makePHEventFunctions(\"isPublicDrivesEnabled\");\nconst { useValue: useIsAddPublicDrivesEnabled, setValue: setIsAddPublicDrivesEnabled, addEventHandler: addIsAddPublicDrivesEnabledEventHandler } = makePHEventFunctions(\"isAddPublicDrivesEnabled\");\nconst { useValue: useIsDeletePublicDrivesEnabled, setValue: setIsDeletePublicDrivesEnabled, addEventHandler: addIsDeletePublicDrivesEnabledEventHandler } = makePHEventFunctions(\"isDeletePublicDrivesEnabled\");\nconst { useValue: useIsCloudDrivesEnabled, setValue: setIsCloudDrivesEnabled, addEventHandler: addIsCloudDrivesEnabledEventHandler } = makePHEventFunctions(\"isCloudDrivesEnabled\");\nconst { useValue: useIsAddCloudDrivesEnabled, setValue: setIsAddCloudDrivesEnabled, addEventHandler: addIsAddCloudDrivesEnabledEventHandler } = makePHEventFunctions(\"isAddCloudDrivesEnabled\");\nconst { useValue: useIsDeleteCloudDrivesEnabled, setValue: setIsDeleteCloudDrivesEnabled, addEventHandler: addIsDeleteCloudDrivesEnabledEventHandler } = makePHEventFunctions(\"isDeleteCloudDrivesEnabled\");\nconst { useValue: useLocalDrivesEnabled, setValue: setLocalDrivesEnabled, addEventHandler: addLocalDrivesEnabledEventHandler } = makePHEventFunctions(\"isLocalDrivesEnabled\");\nconst { useValue: useIsAddLocalDrivesEnabled, setValue: setIsAddLocalDrivesEnabled, addEventHandler: addIsAddLocalDrivesEnabledEventHandler } = makePHEventFunctions(\"isAddLocalDrivesEnabled\");\nconst { useValue: useIsDeleteLocalDrivesEnabled, setValue: setIsDeleteLocalDrivesEnabled, addEventHandler: addIsDeleteLocalDrivesEnabledEventHandler } = makePHEventFunctions(\"isDeleteLocalDrivesEnabled\");\nconst { useValue: useIsEditorDebugModeEnabled, setValue: setIsEditorDebugModeEnabled, addEventHandler: addIsEditorDebugModeEnabledEventHandler } = makePHEventFunctions(\"isEditorDebugModeEnabled\");\nconst { useValue: useIsEditorReadModeEnabled, setValue: setIsEditorReadModeEnabled, addEventHandler: addIsEditorReadModeEnabledEventHandler } = makePHEventFunctions(\"isEditorReadModeEnabled\");\nconst { useValue: useIsAnalyticsDatabaseWorkerEnabled, setValue: setIsAnalyticsDatabaseWorkerEnabled, addEventHandler: addIsAnalyticsDatabaseWorkerEnabledEventHandler } = makePHEventFunctions(\"isAnalyticsDatabaseWorkerEnabled\");\nconst { useValue: useIsDiffAnalyticsEnabled, setValue: setIsDiffAnalyticsEnabled, addEventHandler: addIsDiffAnalyticsEnabledEventHandler } = makePHEventFunctions(\"isDiffAnalyticsEnabled\");\nconst { useValue: useIsDriveAnalyticsEnabled, setValue: setIsDriveAnalyticsEnabled, addEventHandler: addIsDriveAnalyticsEnabledEventHandler } = makePHEventFunctions(\"isDriveAnalyticsEnabled\");\nconst { useValue: useRenownUrl, setValue: setRenownUrl, addEventHandler: addRenownUrlEventHandler } = makePHEventFunctions(\"renownUrl\");\nconst { useValue: useRenownNetworkId, setValue: setRenownNetworkId, addEventHandler: addRenownNetworkIdEventHandler } = makePHEventFunctions(\"renownNetworkId\");\nconst { useValue: useRenownChainId, setValue: setRenownChainId, addEventHandler: addRenownChainIdEventHandler } = makePHEventFunctions(\"renownChainId\");\nconst { useValue: useSentryRelease, setValue: setSentryRelease, addEventHandler: addSentryReleaseEventHandler } = makePHEventFunctions(\"sentryRelease\");\nconst { useValue: useSentryDsn, setValue: setSentryDsn, addEventHandler: addSentryDsnEventHandler } = makePHEventFunctions(\"sentryDsn\");\nconst { useValue: useSentryEnv, setValue: setSentryEnv, addEventHandler: addSentryEnvEventHandler } = makePHEventFunctions(\"sentryEnv\");\nconst { useValue: useIsSentryTracingEnabled, setValue: setIsSentryTracingEnabled, addEventHandler: addIsSentryTracingEnabledEventHandler } = makePHEventFunctions(\"isSentryTracingEnabled\");\nconst { useValue: useIsExternalProcessorsEnabled, setValue: setIsExternalProcessorsEnabled, addEventHandler: addIsExternalProcessorsEnabledEventHandler } = makePHEventFunctions(\"isExternalProcessorsEnabled\");\nconst { useValue: useIsExternalPackagesEnabled, setValue: setIsExternalPackagesEnabled, addEventHandler: addIsExternalPackagesEnabledEventHandler } = makePHEventFunctions(\"isExternalPackagesEnabled\");\nconst enabledEditorsEventFunctions = makePHEventFunctions(\"enabledEditors\");\n/** Sets the enabled editors for Connect. */\nconst setEnabledEditors = enabledEditorsEventFunctions.setValue;\n/** Gets the enabled editors for Connect. */\nconst useEnabledEditors = enabledEditorsEventFunctions.useValue;\n/** Adds an event handler for when the enabled editors for Connect changes. */\nconst addEnabledEditorsEventHandler = enabledEditorsEventFunctions.addEventHandler;\nconst disabledEditorsEventFunctions = makePHEventFunctions(\"disabledEditors\");\n/** Sets the disabled editors for Connect. */\nconst setDisabledEditors = disabledEditorsEventFunctions.setValue;\n/** Gets the disabled editors for Connect. */\nconst useDisabledEditors = disabledEditorsEventFunctions.useValue;\n/** Adds an event handler for when the disabled editors for Connect changes. */\nconst addDisabledEditorsEventHandler = disabledEditorsEventFunctions.addEventHandler;\nconst isRelationalProcessorsEnabled = makePHEventFunctions(\"isRelationalProcessorsEnabled\");\n/** Sets the isRelationalProcessorsEnabled for Connect. */\nconst setIsRelationalProcessorsEnabled = isRelationalProcessorsEnabled.setValue;\n/** Gets the isRelationalProcessorsEnabled for Connect. */\nconst useIsRelationalProcessorsEnabled = isRelationalProcessorsEnabled.useValue;\n/** Adds an event handler for when the isRelationalProcessorsEnabled for Connect changes. */\nconst addIsRelationalProcessorsEnabledEventHandler = isRelationalProcessorsEnabled.addEventHandler;\nconst isExternalRelationalProcessorsEnabled = makePHEventFunctions(\"isExternalRelationalProcessorsEnabled\");\n/** Sets the isExternalRelationalProcessorsEnabled for Connect. */\nconst setIsExternalRelationalProcessorsEnabled = isExternalRelationalProcessorsEnabled.setValue;\n/** Gets the isExternalRelationalProcessorsEnabled for Connect. */\nconst useIsExternalRelationalProcessorsEnabled = isExternalRelationalProcessorsEnabled.useValue;\n/** Adds an event handler for when the isExternalRelationalProcessorsEnabled for Connect changes. */\nconst addIsExternalRelationalProcessorsEnabledEventHandler = isExternalRelationalProcessorsEnabled.addEventHandler;\nconst isAnalyticsEnabledEventFunctions = makePHEventFunctions(\"isAnalyticsEnabled\");\n/** Sets the isAnalyticsEnabled for Connect. */\nconst setIsAnalyticsEnabled = isAnalyticsEnabledEventFunctions.setValue;\n/** Gets the isAnalyticsEnabled for Connect. */\nconst useIsAnalyticsEnabled = isAnalyticsEnabledEventFunctions.useValue;\n/** Adds an event handler for when the isAnalyticsEnabled for Connect changes. */\nconst addIsAnalyticsEnabledEventHandler = isAnalyticsEnabledEventFunctions.addEventHandler;\nconst isAnalyticsExternalProcessorsEnabled = makePHEventFunctions(\"isAnalyticsExternalProcessorsEnabled\");\n/** Sets the isAnalyticsExternalProcessorsEnabled for Connect. */\nconst setIsAnalyticsExternalProcessorsEnabled = isAnalyticsExternalProcessorsEnabled.setValue;\n/** Gets the isAnalyticsExternalProcessorsEnabled for Connect. */\nconst useIsAnalyticsExternalProcessorsEnabled = isAnalyticsExternalProcessorsEnabled.useValue;\n/** Adds an event handler for when the isAnalyticsExternalProcessorsEnabled for Connect changes. */\nconst addIsAnalyticsExternalProcessorsEnabledEventHandler = isAnalyticsExternalProcessorsEnabled.addEventHandler;\nconst analyticsDatabaseNameEventFunctions = makePHEventFunctions(\"analyticsDatabaseName\");\n/** Sets the analytics database name for Connect. */\nconst setAnalyticsDatabaseName = analyticsDatabaseNameEventFunctions.setValue;\n/** Gets the analytics database name for Connect. */\nconst useAnalyticsDatabaseName = analyticsDatabaseNameEventFunctions.useValue;\n/** Adds an event handler for when the analytics database name for Connect changes. */\nconst addAnalyticsDatabaseNameEventHandler = analyticsDatabaseNameEventFunctions.addEventHandler;\nconst logLevelEventFunctions = makePHEventFunctions(\"logLevel\");\n/** Sets the log level for Connect. */\nconst setLogLevel = logLevelEventFunctions.setValue;\n/** Gets the log level for Connect. */\nconst useLogLevel = logLevelEventFunctions.useValue;\n/** Adds an event handler for when the log level for Connect changes. */\nconst addLogLevelEventHandler = logLevelEventFunctions.addEventHandler;\nconst allowListEventFunctions = makePHEventFunctions(\"allowList\");\n/** Sets the allow list for Connect. */\nconst setAllowList = allowListEventFunctions.setValue;\n/** Gets the allow list for Connect. */\nconst useAllowList = allowListEventFunctions.useValue;\n/** Adds an event handler for when the allow list for Connect changes. */\nconst addAllowListEventHandler = allowListEventFunctions.addEventHandler;\nconst nonUserConfigSetters = {\n\trouterBasename: setRouterBasename,\n\tversion: setVersion,\n\trequiresHardRefresh: setRequiresHardRefresh,\n\twarnOutdatedApp: setWarnOutdatedApp,\n\tstudioMode: setStudioMode,\n\tbasePath: setBasePath,\n\tversionCheckInterval: setVersionCheckInterval,\n\tcliVersion: setCliVersion,\n\tfileUploadOperationsChunkSize: setFileUploadOperationsChunkSize,\n\tisDocumentModelSelectionSettingsEnabled: setIsDocumentModelSelectionSettingsEnabled,\n\tgaTrackingId: setGaTrackingId,\n\tdefaultDrivesUrl: setDefaultDrivesUrl,\n\tdrivesPreserveStrategy: setDrivesPreserveStrategy,\n\tisLocalDrivesEnabled: setIsLocalDrivesEnabled,\n\tisAddDriveEnabled: setIsAddDriveEnabled,\n\tisPublicDrivesEnabled: setIsPublicDrivesEnabled,\n\tisAddPublicDrivesEnabled: setIsAddPublicDrivesEnabled,\n\tisDeletePublicDrivesEnabled: setIsDeletePublicDrivesEnabled,\n\tisCloudDrivesEnabled: setIsCloudDrivesEnabled,\n\tisAddCloudDrivesEnabled: setIsAddCloudDrivesEnabled,\n\tisDeleteCloudDrivesEnabled: setIsDeleteCloudDrivesEnabled,\n\tisAddLocalDrivesEnabled: setIsAddLocalDrivesEnabled,\n\tisDeleteLocalDrivesEnabled: setIsDeleteLocalDrivesEnabled,\n\tisEditorDebugModeEnabled: setIsEditorDebugModeEnabled,\n\tisEditorReadModeEnabled: setIsEditorReadModeEnabled,\n\tisRelationalProcessorsEnabled: setIsRelationalProcessorsEnabled,\n\tisExternalRelationalProcessorsEnabled: setIsExternalRelationalProcessorsEnabled,\n\tisAnalyticsEnabled: setIsAnalyticsEnabled,\n\tanalyticsDatabaseName: setAnalyticsDatabaseName,\n\tisAnalyticsExternalProcessorsEnabled: setIsAnalyticsExternalProcessorsEnabled,\n\tisAnalyticsDatabaseWorkerEnabled: setIsAnalyticsDatabaseWorkerEnabled,\n\tisDiffAnalyticsEnabled: setIsDiffAnalyticsEnabled,\n\tisDriveAnalyticsEnabled: setIsDriveAnalyticsEnabled,\n\trenownUrl: setRenownUrl,\n\trenownNetworkId: setRenownNetworkId,\n\trenownChainId: setRenownChainId,\n\tsentryRelease: setSentryRelease,\n\tsentryDsn: setSentryDsn,\n\tsentryEnv: setSentryEnv,\n\tisSentryTracingEnabled: setIsSentryTracingEnabled,\n\tisExternalProcessorsEnabled: setIsExternalProcessorsEnabled,\n\tisExternalPackagesEnabled: setIsExternalPackagesEnabled,\n\tallowList: setAllowList,\n\tlogLevel: setLogLevel,\n\tdisabledEditors: setDisabledEditors,\n\tenabledEditors: setEnabledEditors\n};\nconst phGlobalConfigSetters = {\n\t...phAppConfigSetters,\n\t...phDocumentEditorConfigSetters,\n\t...nonUserConfigSetters\n};\nconst nonUserConfigHooks = {\n\trouterBasename: useRouterBasename,\n\tversion: useVersion,\n\trequiresHardRefresh: useRequiresHardRefresh,\n\twarnOutdatedApp: useWarnOutdatedApp,\n\tstudioMode: useStudioMode,\n\tbasePath: useBasePath,\n\tversionCheckInterval: useVersionCheckInterval,\n\tcliVersion: useCliVersion,\n\tfileUploadOperationsChunkSize: useFileUploadOperationsChunkSize,\n\tisDocumentModelSelectionSettingsEnabled: useIsDocumentModelSelectionSettingsEnabled,\n\tgaTrackingId: useGaTrackingId,\n\tdefaultDrivesUrl: useDefaultDrivesUrl,\n\tdrivesPreserveStrategy: useDrivesPreserveStrategy,\n\tisAddDriveEnabled: useIsAddDriveEnabled,\n\tisPublicDrivesEnabled: useIsPublicDrivesEnabled,\n\tisAddPublicDrivesEnabled: useIsAddPublicDrivesEnabled,\n\tisDeletePublicDrivesEnabled: useIsDeletePublicDrivesEnabled,\n\tisCloudDrivesEnabled: useIsCloudDrivesEnabled,\n\tisAddCloudDrivesEnabled: useIsAddCloudDrivesEnabled,\n\tisDeleteCloudDrivesEnabled: useIsDeleteCloudDrivesEnabled,\n\tisLocalDrivesEnabled: useIsLocalDrivesEnabled,\n\tisAddLocalDrivesEnabled: useIsAddLocalDrivesEnabled,\n\tisDeleteLocalDrivesEnabled: useIsDeleteLocalDrivesEnabled,\n\tisEditorDebugModeEnabled: useIsEditorDebugModeEnabled,\n\tisEditorReadModeEnabled: useIsEditorReadModeEnabled,\n\tisAnalyticsDatabaseWorkerEnabled: useIsAnalyticsDatabaseWorkerEnabled,\n\tisDiffAnalyticsEnabled: useIsDiffAnalyticsEnabled,\n\tisDriveAnalyticsEnabled: useIsDriveAnalyticsEnabled,\n\trenownUrl: useRenownUrl,\n\trenownNetworkId: useRenownNetworkId,\n\trenownChainId: useRenownChainId,\n\tsentryRelease: useSentryRelease,\n\tsentryDsn: useSentryDsn,\n\tsentryEnv: useSentryEnv,\n\tisSentryTracingEnabled: useIsSentryTracingEnabled,\n\tisExternalProcessorsEnabled: useIsExternalProcessorsEnabled,\n\tisExternalPackagesEnabled: useIsExternalPackagesEnabled,\n\tallowList: useAllowList,\n\tisAnalyticsEnabled: useIsAnalyticsEnabled,\n\tisAnalyticsExternalProcessorsEnabled: useIsAnalyticsExternalProcessorsEnabled,\n\tisRelationalProcessorsEnabled: useIsRelationalProcessorsEnabled,\n\tisExternalRelationalProcessorsEnabled: useIsExternalRelationalProcessorsEnabled,\n\tanalyticsDatabaseName: useAnalyticsDatabaseName,\n\tlogLevel: useLogLevel,\n\tdisabledEditors: useDisabledEditors,\n\tenabledEditors: useEnabledEditors\n};\nconst phGlobalConfigHooks = {\n\t...phAppConfigHooks,\n\t...phDocumentEditorConfigHooks,\n\t...nonUserConfigHooks\n};\n//#endregion\n//#region src/hooks/features.ts\nconst featuresEventFunctions = makePHEventFunctions(\"features\");\nconst useFeatures = featuresEventFunctions.useValue;\nconst setFeatures = featuresEventFunctions.setValue;\nconst addFeaturesEventHandler = featuresEventFunctions.addEventHandler;\n//#endregion\n//#region src/hooks/package-discovery.ts\nconst packageDiscoveryFunctions = makePHEventFunctions(\"packageDiscoveryService\");\nconst usePackageDiscoveryService = packageDiscoveryFunctions.useValue;\nconst setPackageDiscoveryService = packageDiscoveryFunctions.setValue;\nconst addPackageDiscoveryServiceEventHandler = packageDiscoveryFunctions.addEventHandler;\n//#endregion\n//#region src/hooks/drives.ts\nconst drivesEventFunctions = makePHEventFunctions(\"drives\");\n/** Returns all of the drives in the reactor */\nconst useDrives = drivesEventFunctions.useValue;\n/** Sets the drives in the reactor */\nconst setDrives = drivesEventFunctions.setValue;\n/** Adds an event handler for the drives */\nconst addDrivesEventHandler = drivesEventFunctions.addEventHandler;\n//#endregion\n//#region src/hooks/modals.ts\nconst modalEventFunctions = makePHEventFunctions(\"modal\");\n/** Returns the current modal */\nconst usePHModal = modalEventFunctions.useValue;\n/** Sets the current modal */\nconst setPHModal = modalEventFunctions.setValue;\n/** Adds an event handler for the modal */\nconst addModalEventHandler = modalEventFunctions.addEventHandler;\n/** Shows a modal */\nfunction showPHModal(modal) {\n\tsetPHModal(modal);\n}\n/** Closes the current modal */\nfunction closePHModal() {\n\tsetPHModal(void 0);\n}\n/** Shows the create document modal */\nfunction showCreateDocumentModal(documentType) {\n\tsetPHModal({\n\t\ttype: \"createDocument\",\n\t\tdocumentType\n\t});\n}\n/** Shows the delete node modal */\nfunction showDeleteNodeModal(nodeOrId) {\n\tsetPHModal({\n\t\ttype: \"deleteItem\",\n\t\tid: typeof nodeOrId === \"string\" ? nodeOrId : nodeOrId.id\n\t});\n}\n//#endregion\n//#region src/hooks/reactor.ts\nconst reactorClientModuleEventFunctions = makePHEventFunctions(\"reactorClientModule\");\nconst reactorClientEventFunctions = makePHEventFunctions(\"reactorClient\");\n/** Returns the reactor client module */\nconst useReactorClientModule = reactorClientModuleEventFunctions.useValue;\n/** Sets the reactor client module */\nconst setReactorClientModule = reactorClientModuleEventFunctions.setValue;\n/** Adds an event handler for the reactor client module */\nconst addReactorClientModuleEventHandler = reactorClientModuleEventFunctions.addEventHandler;\n/** Returns the reactor client */\nconst useReactorClient = reactorClientEventFunctions.useValue;\n/** Sets the reactor client */\nconst setReactorClient = reactorClientEventFunctions.setValue;\n/** Adds an event handler for the reactor client */\nconst addReactorClientEventHandler = reactorClientEventFunctions.addEventHandler;\nconst useSync = () => useReactorClientModule()?.reactorModule?.syncModule?.syncManager;\nconst useSyncList = () => {\n\treturn useSync()?.list() ?? [];\n};\nconst useModelRegistry = () => useReactorClientModule()?.reactorModule?.documentModelRegistry;\nconst useDatabase = () => useReactorClientModule()?.reactorModule?.database;\nconst usePGlite = () => useReactorClientModule()?.pg;\n//#endregion\n//#region src/hooks/revision-history.ts\nconst revisionHistoryEventFunctions = makePHEventFunctions(\"revisionHistoryVisible\");\n/** Returns whether revision history is visible */\nconst useRevisionHistoryVisible = revisionHistoryEventFunctions.useValue;\n/** Sets revision history visibility */\nconst setRevisionHistoryVisible = revisionHistoryEventFunctions.setValue;\n/** Adds event handler for revision history visibility */\nconst addRevisionHistoryVisibleEventHandler = revisionHistoryEventFunctions.addEventHandler;\n/** Shows the revision history */\nfunction showRevisionHistory() {\n\tsetRevisionHistoryVisible(true);\n}\n/** Hides the revision history */\nfunction hideRevisionHistory() {\n\tsetRevisionHistoryVisible(false);\n}\n//#endregion\n//#region src/utils/url.ts\nfunction resolveUrlPathname(path) {\n\treturn new URL(path.replace(/^\\/+/, \"\"), window.location.origin + (window.ph?.basePath ?? \"/\")).pathname;\n}\n/** Returns the current path without the base path */\nfunction getPathWithoutBase(path) {\n\tconst basePath = window.ph?.basePath ?? \"/\";\n\treturn path.replace(basePath, basePath.endsWith(\"/\") ? \"/\" : \"\");\n}\n/** Makes a URL component for a drive. */\nfunction makeDriveUrlComponent(drive) {\n\tif (!drive) return \"\";\n\treturn `/d/${slug(drive.header.slug)}`;\n}\n/** Makes a URL component for a node. */\nfunction makeNodeSlug(node) {\n\tif (!node) return \"\";\n\tconst nodeName = node.name;\n\tif (!nodeName) return slug(node.id);\n\treturn slug(`${nodeName}-${node.id}`);\n}\n/** Extracts the node slug from a path.\n*\n* The path is expected to be in the format `/d/<drive-slug>/<node-slug>`.\n*/\nfunction extractNodeSlugFromPath(path) {\n\tconst currentPath = getPathWithoutBase(path);\n\treturn /^\\/d\\/[^/]+\\/([^/]+)$/.exec(currentPath)?.[1];\n}\n/** Finds a UUID in a string, used for extracting node ids from node slugs in the URL. */\nfunction findUuid(input) {\n\tif (!input) return void 0;\n\treturn /\\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\\b/.exec(input)?.[0];\n}\nfunction extractNodeIdFromSlug(nodeSlug) {\n\treturn findUuid(nodeSlug);\n}\nfunction extractNodeIdFromPath(path) {\n\treturn extractNodeIdFromSlug(extractNodeSlugFromPath(path));\n}\n/** Extracts the drive slug from a path.\n* Used for extracting drive ids from drive slugs in the URL.\n* Expects the path to be in the format `/d/<drive-slug>`.\n*/\nfunction extractDriveSlugFromPath(path) {\n\tconst currentPath = getPathWithoutBase(path);\n\treturn /^\\/d\\/([^/]+)/.exec(currentPath)?.[1] ?? \"\";\n}\nfunction extractDriveIdFromSlug(driveSlug) {\n\treturn findUuid(driveSlug);\n}\nfunction extractDriveIdFromPath(path) {\n\treturn extractDriveIdFromSlug(extractDriveSlugFromPath(path));\n}\n/**\n* Creates a URL string with the given pathname while preserving existing query parameters.\n*/\nfunction createUrlWithPreservedParams(pathname) {\n\tconst search = window.location.search;\n\treturn search ? `${pathname}${search}` : pathname;\n}\n//#endregion\n//#region src/hooks/selected-drive.ts\nconst selectedDriveIdEventFunctions = makePHEventFunctions(\"selectedDriveId\");\n/** Returns the selected drive id */\nconst useSelectedDriveId = selectedDriveIdEventFunctions.useValue;\n/** Sets the selected drive id */\nconst setSelectedDriveId = selectedDriveIdEventFunctions.setValue;\n/** Adds an event handler for the selected drive id */\nconst addSelectedDriveIdEventHandler = selectedDriveIdEventFunctions.addEventHandler;\n/** Returns the selected drive */\nfunction useSelectedDrive() {\n\tconst drive = useSelectedDriveSafe();\n\tif (!drive[0]) throw new Error(\"There is no drive selected. Did you mean to call 'useSelectedDriveSafe'?\");\n\treturn drive;\n}\n/** Returns the selected drive, or undefined if no drive is selected */\nfunction useSelectedDriveSafe() {\n\tconst selectedDriveId = useSelectedDriveId();\n\tconst selectedDrive = useDrives()?.find((drive) => drive.header.id === selectedDriveId);\n\tconst [drive, dispatch] = useDispatch(selectedDrive);\n\tif (!selectedDrive) return [void 0, void 0];\n\treturn [drive, dispatch];\n}\nfunction setSelectedDrive(driveOrDriveSlug) {\n\tconst driveSlug = typeof driveOrDriveSlug === \"string\" ? driveOrDriveSlug : driveOrDriveSlug?.header.slug;\n\tconst driveId = (window.ph?.drives?.find((d) => d.header.slug === driveSlug))?.header.id;\n\tsetSelectedDriveId(driveId);\n\tif (!driveId) {\n\t\tconst pathname = resolveUrlPathname(\"/\");\n\t\tif (pathname === window.location.pathname) return;\n\t\twindow.history.pushState(null, \"\", createUrlWithPreservedParams(pathname));\n\t\treturn;\n\t}\n\tconst pathname = resolveUrlPathname(`/d/${driveSlug}`);\n\tif (pathname === window.location.pathname) return;\n\twindow.history.pushState(null, \"\", createUrlWithPreservedParams(pathname));\n}\nfunction addSetSelectedDriveOnPopStateEventHandler() {\n\twindow.addEventListener(\"popstate\", () => {\n\t\tconst pathname = window.location.pathname;\n\t\tconst driveId = extractDriveIdFromPath(pathname);\n\t\tif (driveId !== window.ph?.selectedDriveId) setSelectedDrive(driveId);\n\t});\n}\n//#endregion\n//#region src/utils/nodes.ts\n/** Sorts nodes by name. */\nfunction sortNodesByName(nodes) {\n\treturn nodes.toSorted((a, b) => a.name.localeCompare(b.name));\n}\n/** Returns whether a node is a file. */\nfunction isFileNodeKind(node) {\n\tif (!node) return false;\n\treturn node.kind.toUpperCase() === \"FILE\";\n}\n/** Returns whether a node is a folder. */\nfunction isFolderNodeKind(node) {\n\tif (!node) return false;\n\treturn node.kind.toUpperCase() === \"FOLDER\";\n}\n//#endregion\n//#region src/hooks/items-in-selected-drive.ts\n/** Returns the nodes in the selected drive. */\nfunction useNodesInSelectedDrive() {\n\tconst [selectedDrive] = useSelectedDriveSafe();\n\treturn selectedDrive?.state.global.nodes;\n}\n/** Returns the file nodes in the selected drive. */\nfunction useFileNodesInSelectedDrive() {\n\treturn useNodesInSelectedDrive()?.filter((n) => isFileNodeKind(n));\n}\n/** Returns the folder nodes in the selected drive. */\nfunction useFolderNodesInSelectedDrive() {\n\treturn useNodesInSelectedDrive()?.filter((n) => isFolderNodeKind(n));\n}\n/** Returns the documents in the selected drive. */\nfunction useDocumentsInSelectedDrive() {\n\tconst fileNodeIds = useFileNodesInSelectedDrive()?.map((node) => node.id);\n\treturn useDocumentsByIds(fileNodeIds);\n}\n/** Returns the document types supported by the selected drive, as defined by the document model documents present in the drive */\nfunction useDocumentTypesInSelectedDrive() {\n\treturn (useDocumentsInSelectedDrive()?.filter(isDocumentModelDocument))?.map((doc) => doc.state.global.id);\n}\nfunction isDocumentModelDocument(document) {\n\treturn document.header.documentType === \"powerhouse/document-model\";\n}\n//#endregion\n//#region src/hooks/selected-node.ts\nconst selectedNodeIdEventFunctions = makePHEventFunctions(\"selectedNodeId\");\nconst useSelectedNodeId = selectedNodeIdEventFunctions.useValue;\nconst setSelectedNodeId = selectedNodeIdEventFunctions.setValue;\nconst addSelectedNodeIdEventHandler = selectedNodeIdEventFunctions.addEventHandler;\n/** Returns the selected node. */\nfunction useSelectedNode() {\n\tconst selectedNodeId = useSelectedNodeId();\n\treturn useNodesInSelectedDrive()?.find((n) => n.id === selectedNodeId);\n}\n/** Sets the selected node (file or folder). */\nfunction setSelectedNode(nodeOrNodeSlug) {\n\tconst nodeSlug = typeof nodeOrNodeSlug === \"string\" ? nodeOrNodeSlug : makeNodeSlug(nodeOrNodeSlug);\n\tsetSelectedNodeId(extractNodeIdFromSlug(nodeSlug));\n\tconst driveSlugFromPath = extractDriveSlugFromPath(window.location.pathname);\n\tif (!driveSlugFromPath) return;\n\tif (!nodeSlug) {\n\t\tconst pathname = resolveUrlPathname(`/d/${driveSlugFromPath}`);\n\t\tif (pathname === window.location.pathname) return;\n\t\twindow.history.pushState(null, \"\", createUrlWithPreservedParams(pathname));\n\t\treturn;\n\t}\n\tconst pathname = resolveUrlPathname(`/d/${driveSlugFromPath}/${nodeSlug}`);\n\tif (pathname === window.location.pathname) return;\n\twindow.history.pushState(null, \"\", createUrlWithPreservedParams(pathname));\n}\nfunction addResetSelectedNodeEventHandler() {\n\twindow.addEventListener(\"ph:selectedDriveIdUpdated\", () => {\n\t\tsetSelectedNodeId(void 0);\n\t});\n}\nfunction addSetSelectedNodeOnPopStateEventHandler() {\n\twindow.addEventListener(\"popstate\", () => {\n\t\tconst pathname = window.location.pathname;\n\t\tconst nodeSlug = extractNodeSlugFromPath(pathname);\n\t\tif (nodeSlug !== window.ph?.selectedNodeId) setSelectedNode(nodeSlug);\n\t});\n}\n//#endregion\n//#region src/hooks/selected-timeline-item.ts\nconst selectedTimelineItemEventFunctions = makePHEventFunctions(\"selectedTimelineItem\");\n/** Returns the selected timeline item */\nconst useSelectedTimelineItem = selectedTimelineItemEventFunctions.useValue;\n/** Sets the selected timeline item */\nconst setSelectedTimelineItem = selectedTimelineItemEventFunctions.setValue;\n/** Adds event handler for selected timeline item */\nconst addSelectedTimelineItemEventHandler = selectedTimelineItemEventFunctions.addEventHandler;\n//#endregion\n//#region src/hooks/timeline-revision.ts\nconst selectedTimelineRevisionEventFunctions = makePHEventFunctions(\"selectedTimelineRevision\");\n/** Returns the selected timeline revision. */\nconst useSelectedTimelineRevision = selectedTimelineRevisionEventFunctions.useValue;\n/** Sets the selected timeline revision. */\nconst setSelectedTimelineRevision = selectedTimelineRevisionEventFunctions.setValue;\n/** Adds an event handler for the selected timeline revision. */\nconst addSelectedTimelineRevisionEventHandler = selectedTimelineRevisionEventFunctions.addEventHandler;\n//#endregion\n//#region src/hooks/toast.ts\nconst toastEventFunctions = makePHEventFunctions(\"toast\");\n/** Returns the toast function */\nconst usePHToast = toastEventFunctions.useValue;\n/** Sets the toast function */\nconst setPHToast = toastEventFunctions.setValue;\n/** Adds an event handler for the toast */\nconst addToastEventHandler = toastEventFunctions.addEventHandler;\n//#endregion\n//#region src/hooks/vetra-packages.ts\nconst vetraPackageManagerFunctions = makePHEventFunctions(\"vetraPackageManager\");\nconst useVetraPackageManager = vetraPackageManagerFunctions.useValue;\n/** Returns all of the Vetra packages loaded by the Connect instance */\nconst useVetraPackages = () => {\n\tconst packageManager = useVetraPackageManager();\n\treturn useSyncExternalStore((cb) => packageManager ? packageManager.subscribe(cb) : () => {}, () => packageManager?.packages ?? []);\n};\n/** Adds the Vetra package manager event handler */\nconst addVetraPackageManagerEventHandler = vetraPackageManagerFunctions.addEventHandler;\n/** Sets the Vetra package manager and registers its packages */\nfunction setVetraPackageManager(packageManager) {\n\tvetraPackageManagerFunctions.setValue(packageManager);\n\tupdateReactorClientDocumentModels(packageManager.packages);\n\tupdateReactorClientUpgradeManifests(packageManager.packages);\n\tpackageManager.subscribe(({ packages }) => {\n\t\tupdateReactorClientDocumentModels(packages);\n\t\tupdateReactorClientUpgradeManifests(packages);\n\t});\n}\nfunction updateReactorClientDocumentModels(packages) {\n\tconst documentModelModules = packages.flatMap((pkg) => pkg.documentModels);\n\tconst registry = window.ph?.reactorClientModule?.reactorModule?.documentModelRegistry;\n\tif (!registry || documentModelModules.length === 0) return;\n\tconst results = registry.registerModules(...documentModelModules);\n\tconst duplicates = [];\n\tfor (const result of results) if (result.status === \"error\") if (DuplicateModuleError.isError(result.error)) duplicates.push(result);\n\telse console.error(\"Failed to register document model module:\", result.error);\n\tif (duplicates.length > 0) {\n\t\tconst duplicateTypes = duplicates.map((r) => r.item.documentModel.global.id);\n\t\tregistry.unregisterModules(...duplicateTypes);\n\t\tregistry.registerModules(...duplicates.map((r) => r.item));\n\t}\n}\nfunction updateReactorClientUpgradeManifests(packages) {\n\tconst upgradeManifests = packages.flatMap((pkg) => pkg.upgradeManifests).filter((u) => u !== void 0);\n\tconst registry = window.ph?.reactorClientModule?.reactorModule?.documentModelRegistry;\n\tif (!registry || upgradeManifests.length === 0) return;\n\tconst results = registry.registerUpgradeManifests(...upgradeManifests);\n\tconst duplicates = [];\n\tfor (const result of results) if (result.status === \"error\") if (DuplicateManifestError.isError(result.error)) duplicates.push(result);\n\telse console.error(\"Failed to register upgrade manifest:\", result.error);\n\tif (duplicates.length > 0) {\n\t\tconst duplicateTypes = duplicates.map((r) => r.item.documentType).filter((t) => !!t);\n\t\tregistry.unregisterUpgradeManifests(...duplicateTypes);\n\t\tregistry.registerUpgradeManifests(...duplicates.map((r) => r.item));\n\t}\n}\n//#endregion\n//#region src/hooks/add-ph-event-handlers.ts\nconst phGlobalEventHandlerRegisterFunctions = {\n\tloading: addLoadingEventHandler,\n\treactorClientModule: addReactorClientModuleEventHandler,\n\treactorClient: addReactorClientEventHandler,\n\tfeatures: addFeaturesEventHandler,\n\tmodal: addModalEventHandler,\n\trenown: addRenownEventHandler,\n\tdrives: addDrivesEventHandler,\n\tdocumentCache: addDocumentCacheEventHandler,\n\tselectedDriveId: () => {\n\t\taddSelectedDriveIdEventHandler();\n\t\taddSetSelectedDriveOnPopStateEventHandler();\n\t\taddResetSelectedNodeEventHandler();\n\t},\n\tselectedNodeId: () => {\n\t\taddSelectedNodeIdEventHandler();\n\t\taddSetSelectedNodeOnPopStateEventHandler();\n\t},\n\tvetraPackageManager: addVetraPackageManagerEventHandler,\n\tpackageDiscoveryService: addPackageDiscoveryServiceEventHandler,\n\tselectedTimelineRevision: addSelectedTimelineRevisionEventHandler,\n\trevisionHistoryVisible: addRevisionHistoryVisibleEventHandler,\n\tselectedTimelineItem: addSelectedTimelineItemEventHandler,\n\trouterBasename: addRouterBasenameEventHandler,\n\tversion: addVersionEventHandler,\n\tlogLevel: addLogLevelEventHandler,\n\trequiresHardRefresh: addRequiresHardRefreshEventHandler,\n\twarnOutdatedApp: addWarnOutdatedAppEventHandler,\n\tstudioMode: addStudioModeEventHandler,\n\tbasePath: addBasePathEventHandler,\n\tversionCheckInterval: addVersionCheckIntervalEventHandler,\n\tcliVersion: addCliVersionEventHandler,\n\tfileUploadOperationsChunkSize: addFileUploadOperationsChunkSizeEventHandler,\n\tisDocumentModelSelectionSettingsEnabled: addIsDocumentModelSelectionSettingsEnabledEventHandler,\n\tgaTrackingId: addGaTrackingIdEventHandler,\n\tallowList: addAllowListEventHandler,\n\tdefaultDrivesUrl: addDefaultDrivesUrlEventHandler,\n\tdrivesPreserveStrategy: addDrivesPreserveStrategyEventHandler,\n\tallowedDocumentTypes: addAllowedDocumentTypesEventHandler,\n\tenabledEditors: addEnabledEditorsEventHandler,\n\tdisabledEditors: addDisabledEditorsEventHandler,\n\tisAddDriveEnabled: addIsAddDriveEnabledEventHandler,\n\tisLocalDrivesEnabled: addIsLocalDrivesEnabledEventHandler,\n\tisPublicDrivesEnabled: addIsPublicDrivesEnabledEventHandler,\n\tisAddPublicDrivesEnabled: addIsAddPublicDrivesEnabledEventHandler,\n\tisDeletePublicDrivesEnabled: addIsDeletePublicDrivesEnabledEventHandler,\n\tisCloudDrivesEnabled: addIsCloudDrivesEnabledEventHandler,\n\tisAddCloudDrivesEnabled: addIsAddCloudDrivesEnabledEventHandler,\n\tisDeleteCloudDrivesEnabled: addIsDeleteCloudDrivesEnabledEventHandler,\n\tisAddLocalDrivesEnabled: addIsAddLocalDrivesEnabledEventHandler,\n\tisDeleteLocalDrivesEnabled: addIsDeleteLocalDrivesEnabledEventHandler,\n\tisDragAndDropEnabled: addIsDragAndDropEnabledEventHandler,\n\tisExternalControlsEnabled: addIsExternalControlsEnabledEventHandler,\n\tisEditorDebugModeEnabled: addIsEditorDebugModeEnabledEventHandler,\n\tisEditorReadModeEnabled: addIsEditorReadModeEnabledEventHandler,\n\tisRelationalProcessorsEnabled: addIsRelationalProcessorsEnabledEventHandler,\n\tisExternalRelationalProcessorsEnabled: addIsExternalRelationalProcessorsEnabledEventHandler,\n\tisAnalyticsEnabled: addIsAnalyticsEnabledEventHandler,\n\tisAnalyticsExternalProcessorsEnabled: addIsAnalyticsExternalProcessorsEnabledEventHandler,\n\tanalyticsDatabaseName: addAnalyticsDatabaseNameEventHandler,\n\tisAnalyticsDatabaseWorkerEnabled: addIsAnalyticsDatabaseWorkerEnabledEventHandler,\n\tisDiffAnalyticsEnabled: addIsDiffAnalyticsEnabledEventHandler,\n\tisDriveAnalyticsEnabled: addIsDriveAnalyticsEnabledEventHandler,\n\trenownUrl: addRenownUrlEventHandler,\n\trenownNetworkId: addRenownNetworkIdEventHandler,\n\trenownChainId: addRenownChainIdEventHandler,\n\tsentryRelease: addSentryReleaseEventHandler,\n\tsentryDsn: addSentryDsnEventHandler,\n\tsentryEnv: addSentryEnvEventHandler,\n\tisSentryTracingEnabled: addIsSentryTracingEnabledEventHandler,\n\tisExternalProcessorsEnabled: addIsExternalProcessorsEnabledEventHandler,\n\tisExternalPackagesEnabled: addIsExternalPackagesEnabledEventHandler,\n\ttoast: addToastEventHandler\n};\nfunction addPHEventHandlers() {\n\tfor (const fn of Object.values(phGlobalEventHandlerRegisterFunctions)) fn();\n}\n//#endregion\n//#region src/hooks/document-model-modules.ts\nfunction useDocumentModelModules() {\n\treturn useVetraPackages().flatMap((pkg) => pkg.documentModels).filter((module, index, modules) => modules.findIndex((m) => m.documentModel.global.id === module.documentModel.global.id && m.version === module.version) === index);\n}\nfunction useDocumentModelModuleById(id) {\n\treturn useDocumentModelModules()?.find((module) => module.documentModel.global.id === id);\n}\n//#endregion\n//#region src/hooks/allowed-document-model-modules.ts\nfunction useAllowedDocumentModelModules() {\n\tconst documentModelModules = useDocumentModelModules();\n\tconst allowedDocumentTypes = useAllowedDocumentTypes();\n\tif (!allowedDocumentTypes?.length) return documentModelModules;\n\treturn documentModelModules?.filter((module) => allowedDocumentTypes.includes(module.documentModel.global.id));\n}\n//#endregion\n//#region src/hooks/selected-folder.ts\n/** Returns the selected folder. */\nfunction useSelectedFolder() {\n\tconst selectedNode = useSelectedNode();\n\tif (isFolderNodeKind(selectedNode)) return selectedNode;\n}\n//#endregion\n//#region src/hooks/child-nodes.ts\n/** Returns the child nodes for the selected drive or folder. */\nfunction useNodesInSelectedDriveOrFolder() {\n\tconst nodes = useNodesInSelectedDrive();\n\tconst selectedFolderId = useSelectedFolder()?.id;\n\tif (!nodes) return [];\n\tif (!selectedFolderId) return sortNodesByName(nodes.filter((n) => !n.parentFolder));\n\treturn sortNodesByName(nodes.filter((n) => n.parentFolder === selectedFolderId));\n}\n//#endregion\n//#region src/hooks/config/set-config-by-key.ts\nfunction setPHGlobalConfigByKey(key, value) {\n\tconst setter = phGlobalConfigSetters[key];\n\tsetter(value);\n}\nfunction setPHAppConfigByKey(key, value) {\n\tconst setter = phAppConfigSetters[key];\n\tsetter(value);\n}\nfunction setPHDocumentEditorConfigByKey(key, value) {\n\tconst setter = phDocumentEditorConfigSetters[key];\n\tsetter(value);\n}\n//#endregion\n//#region src/hooks/config/utils.ts\nfunction callGlobalSetterForKey(key, value) {\n\tconst setter = phGlobalConfigSetters[key];\n\tsetter(value);\n}\n//#endregion\n//#region src/hooks/config/set-config-by-object.ts\nfunction setDefaultPHGlobalConfig(config) {\n\tfor (const key of Object.keys(config)) callGlobalSetterForKey(key, config[key]);\n}\nfunction useSetDefaultPHGlobalConfig(config) {\n\tconst [isInitialized, setIsInitialized] = useState(false);\n\tuseEffect(() => {\n\t\tif (isInitialized) return;\n\t\tsetDefaultPHGlobalConfig(config);\n\t\tsetIsInitialized(true);\n\t}, [config, isInitialized]);\n}\nfunction useResetPHGlobalConfig(defaultConfigForReset) {\n\treturn function reset() {\n\t\tsetPHGlobalConfig(defaultConfigForReset);\n\t};\n}\nfunction setPHGlobalConfig(config) {\n\tfor (const key of Object.keys(config)) callGlobalSetterForKey(key, config[key]);\n}\nfunction useSetPHGlobalConfig(config) {\n\tconst [isInitialized, setIsInitialized] = useState(false);\n\tuseEffect(() => {\n\t\tif (isInitialized) return;\n\t\tsetPHGlobalConfig(config);\n\t\tsetIsInitialized(true);\n\t}, [config, isInitialized]);\n}\n/** Sets the global drive config.\n*\n* Pass in a partial object of the global drive config to set.\n*/\nfunction setPHAppConfig(config) {\n\tfor (const key of Object.keys(config)) callGlobalSetterForKey(key, config[key]);\n}\n/** Sets the global document config.\n*\n* Pass in a partial object of the global document config to set.\n*/\nfunction setPHDocumentEditorConfig(config) {\n\tfor (const key of Object.keys(config)) callGlobalSetterForKey(key, config[key]);\n}\n/** Wrapper hook for setting the global app config.\n*\n* Automatically sets the global app config when the component mounts.\n*\n* Pass in a partial object of the global app config to set.\n*/\nfunction useSetPHAppConfig(config) {\n\tconst [isInitialized, setIsInitialized] = useState(false);\n\tuseEffect(() => {\n\t\tif (isInitialized) return;\n\t\tsetPHAppConfig(config);\n\t\tsetIsInitialized(true);\n\t}, [config, isInitialized]);\n}\n/** Wrapper hook for setting the global document editor config.\n*\n* Automatically sets the global document editor config when the component mounts.\n*\n* Pass in a partial object of the global document editor config to set.\n*/\nfunction useSetPHDocumentEditorConfig(config) {\n\tconst [isInitialized, setIsInitialized] = useState(false);\n\tuseEffect(() => {\n\t\tif (isInitialized) return;\n\t\tsetPHDocumentEditorConfig(config);\n\t\tsetIsInitialized(true);\n\t}, [config, isInitialized]);\n}\n//#endregion\n//#region src/hooks/config/use-value-by-key.ts\nfunction usePHGlobalConfigByKey(key) {\n\tconst useValueHook = phGlobalConfigHooks[key];\n\treturn useValueHook();\n}\n/** Gets the value of an item in the global drive config for a given key.\n*\n* Strongly typed, inferred from type definition for the key.\n*/\nfunction usePHAppConfigByKey(key) {\n\tconst useValueHook = phAppConfigHooks[key];\n\treturn useValueHook();\n}\n/** Gets the value of an item in the global document config for a given key.\n*\n* Strongly typed, inferred from type definition for the key.\n*/\nfunction usePHDocumentEditorConfigByKey(key) {\n\tconst useValueHook = phDocumentEditorConfigHooks[key];\n\treturn useValueHook();\n}\n//#endregion\n//#region src/hooks/connection-state.ts\n/**\n* Returns a map of remote name to connection state snapshot for all remotes.\n* Re-renders when any remote's connection state changes.\n*/\nfunction useConnectionStates() {\n\tconst syncManager = useSync();\n\tconst [states, setStates] = useState(() => buildSnapshot(syncManager));\n\tconst unsubscribesRef = useRef([]);\n\tuseEffect(() => {\n\t\tif (!syncManager) return;\n\t\tfunction subscribe() {\n\t\t\tfor (const unsub of unsubscribesRef.current) unsub();\n\t\t\tunsubscribesRef.current = [];\n\t\t\tconst remotes = syncManager.list();\n\t\t\tfor (const remote of remotes) {\n\t\t\t\tconst unsub = remote.channel.onConnectionStateChange(() => {\n\t\t\t\t\tsetStates(buildSnapshot(syncManager));\n\t\t\t\t});\n\t\t\t\tunsubscribesRef.current.push(unsub);\n\t\t\t}\n\t\t\tsetStates(buildSnapshot(syncManager));\n\t\t}\n\t\tsubscribe();\n\t\tconst interval = setInterval(subscribe, 5e3);\n\t\treturn () => {\n\t\t\tclearInterval(interval);\n\t\t\tfor (const unsub of unsubscribesRef.current) unsub();\n\t\t\tunsubscribesRef.current = [];\n\t\t};\n\t}, [syncManager]);\n\treturn states;\n}\n/**\n* Returns the connection state snapshot for a specific remote by name.\n*/\nfunction useConnectionState(remoteName) {\n\treturn useConnectionStates().get(remoteName);\n}\nfunction buildSnapshot(syncManager) {\n\tconst map = /* @__PURE__ */ new Map();\n\tif (!syncManager) return map;\n\tfor (const remote of syncManager.list()) map.set(remote.name, remote.channel.getConnectionState());\n\treturn map;\n}\n//#endregion\n//#region src/hooks/document-of-type.ts\n/** Returns a document of a specific type, throws an error if the found document has a different type */\nfunction useDocumentOfType(documentId, documentType) {\n\tconst [document, dispatch] = useDocumentById(documentId);\n\tconst documentModelModule = useDocumentModelModuleById(documentType);\n\tif (!documentId || !documentType) return [];\n\tif (!document) throw new Error(`Document not found: ${documentId}`);\n\tif (!documentModelModule) throw new ModuleNotFoundError(documentType);\n\tif (document.header.documentType !== documentType) throw new DocumentTypeMismatchError(documentId, documentType, document.header.documentType);\n\treturn [document, dispatch];\n}\n//#endregion\n//#region src/hooks/document-operations.ts\n/**\n* Hook to fetch document operations via the reactor client.\n* Operations are no longer auto-populated on documents and must be fetched explicitly.\n*\n* @param documentId - The document ID to fetch operations for\n* @returns Object containing globalOperations, localOperations, isLoading, and error\n*/\nfunction useDocumentOperations(documentId) {\n\tconst reactorClient = useReactorClient();\n\tconst hasFetchedRef = useRef(false);\n\tconst [state, setState] = useState(() => ({\n\t\tglobalOperations: [],\n\t\tlocalOperations: [],\n\t\tisLoading: !!documentId,\n\t\terror: void 0\n\t}));\n\tconst fetchOperations = useCallback(async (retryCount = 0) => {\n\t\tconst MAX_RETRIES = 5;\n\t\tconst RETRY_DELAY_MS = 500;\n\t\tif (!documentId || !reactorClient) {\n\t\t\tsetState({\n\t\t\t\tglobalOperations: [],\n\t\t\t\tlocalOperations: [],\n\t\t\t\tisLoading: false,\n\t\t\t\terror: void 0\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tsetState((prev) => ({\n\t\t\t...prev,\n\t\t\tisLoading: true,\n\t\t\terror: void 0\n\t\t}));\n\t\tlet globalOps = [];\n\t\tlet localOps = [];\n\t\tlet fetchError;\n\t\ttry {\n\t\t\tglobalOps = (await reactorClient.getOperations(documentId, { scopes: [\"global\"] })).results;\n\t\t} catch (err) {\n\t\t\tfetchError = err instanceof Error ? err : new Error(String(err));\n\t\t}\n\t\tif (!fetchError) try {\n\t\t\tlocalOps = (await reactorClient.getOperations(documentId, { scopes: [\"local\"] })).results;\n\t\t} catch (err) {\n\t\t\tfetchError = err instanceof Error ? err : new Error(String(err));\n\t\t}\n\t\tif (!fetchError && globalOps.length === 0 && localOps.length === 0 && retryCount < MAX_RETRIES) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, RETRY_DELAY_MS));\n\t\t\treturn fetchOperations(retryCount + 1);\n\t\t}\n\t\tsetState({\n\t\t\tglobalOperations: globalOps,\n\t\t\tlocalOperations: localOps,\n\t\t\tisLoading: false,\n\t\t\terror: fetchError\n\t\t});\n\t\thasFetchedRef.current = true;\n\t}, [documentId, reactorClient]);\n\tuseEffect(() => {\n\t\tif (documentId && reactorClient) fetchOperations();\n\t\telse if (!documentId) {\n\t\t\tsetState({\n\t\t\t\tglobalOperations: [],\n\t\t\t\tlocalOperations: [],\n\t\t\t\tisLoading: false,\n\t\t\t\terror: void 0\n\t\t\t});\n\t\t\thasFetchedRef.current = false;\n\t\t}\n\t}, [\n\t\tdocumentId,\n\t\treactorClient,\n\t\tfetchOperations\n\t]);\n\tconst refetch = useCallback(() => {\n\t\tfetchOperations(0);\n\t}, [fetchOperations]);\n\treturn {\n\t\t...state,\n\t\trefetch\n\t};\n}\n//#endregion\n//#region src/hooks/supported-document-types.ts\n/** Returns the supported document types for the reactor (derived from the document model modules) */\nfunction useSupportedDocumentTypesInReactor() {\n\treturn useDocumentModelModules()?.map((module) => module.documentModel.global.id);\n}\n//#endregion\n//#region src/hooks/document-types.ts\n/** Returns the document types a app supports.\n*\n* If present, uses the `allowedDocumentTypes` config value.\n* Otherwise, uses the supported document types from the reactor.\n*/\nfunction useDocumentTypes() {\n\tconst allowedDocumentTypes = useAllowedDocumentTypes();\n\tconst supportedDocumentTypes = useSupportedDocumentTypesInReactor();\n\treturn allowedDocumentTypes ?? supportedDocumentTypes;\n}\n//#endregion\n//#region src/hooks/drive-by-id.ts\nfunction useDriveById(driveId) {\n\tconst foundDrive = useDrives()?.find((drive) => drive.header.id === driveId);\n\tconst [drive, dispatch] = useDispatch(foundDrive);\n\tif (!foundDrive) throw new Error(`Drive with id ${driveId} not found`);\n\treturn [drive, dispatch];\n}\n//#endregion\n//#region src/hooks/editor-modules.ts\nfunction useEditorModules() {\n\treturn useVetraPackages().flatMap((pkg) => pkg.editors).filter((module) => !module.documentTypes.includes(\"powerhouse/document-drive\"));\n}\nfunction useAppModules() {\n\treturn useVetraPackages().flatMap((pkg) => pkg.editors).filter((module) => module.documentTypes.includes(\"powerhouse/document-drive\"));\n}\nfunction useFallbackEditorModule(documentType) {\n\tconst editorModules = useEditorModules();\n\tif (!documentType) return void 0;\n\tif (editorModules?.length === 0) return void 0;\n\treturn (editorModules?.filter((module) => module.documentTypes.includes(documentType)))?.[0];\n}\nfunction useAppModuleById(id) {\n\treturn useAppModules()?.find((module) => module.config.id === id);\n}\nfunction useDefaultAppModule() {\n\treturn useAppModuleById(DEFAULT_DRIVE_EDITOR_ID);\n}\nfunction useEditorModuleById(id) {\n\treturn useEditorModules()?.find((module) => module.config.id === id);\n}\nfunction useEditorModulesForDocumentType(documentType) {\n\tconst editorModules = useEditorModules();\n\tif (!documentType) return void 0;\n\treturn editorModules?.filter((module) => module.documentTypes.includes(documentType));\n}\n//#endregion\n//#region src/hooks/folder-by-id.ts\nfunction useFolderById(id) {\n\treturn useFolderNodesInSelectedDrive()?.find((n) => n.id === id);\n}\n//#endregion\n//#region src/hooks/items-in-selected-folder.ts\n/** Returns the nodes in the selected folder. */\nfunction useNodesInSelectedFolder() {\n\tconst selectedFolder = useSelectedFolder();\n\tconst nodes = useNodesInSelectedDrive();\n\tif (!selectedFolder || !nodes) return void 0;\n\treturn nodes.filter((n) => n.parentFolder === selectedFolder.id);\n}\n/** Returns the file nodes in the selected folder. */\nfunction useFileNodesInSelectedFolder() {\n\tconst nodes = useNodesInSelectedFolder();\n\tif (!nodes) return void 0;\n\treturn nodes.filter((n) => isFileNodeKind(n));\n}\n/** Returns the folder nodes in the selected folder. */\nfunction useFolderNodesInSelectedFolder() {\n\tconst nodes = useNodesInSelectedFolder();\n\tif (!nodes) return void 0;\n\treturn nodes.filter((n) => isFolderNodeKind(n));\n}\n/** Returns the documents in the selected folder. */\nfunction useDocumentsInSelectedFolder() {\n\tconst documents = useDocumentsInSelectedDrive();\n\tconst fileNodeIds = useFileNodesInSelectedFolder()?.map((node) => node.id);\n\treturn documents?.filter((d) => fileNodeIds?.includes(d.header.id));\n}\n//#endregion\n//#region src/hooks/node-actions.ts\nfunction resolveNode(driveId, node) {\n\treturn node?.id !== driveId ? node : void 0;\n}\nfunction useNodeActions() {\n\tconst [selectedDrive] = useSelectedDriveSafe();\n\tconst selectedFolder = useSelectedFolder();\n\tconst selectedParentFolder = useFolderById(useSelectedNode()?.parentFolder);\n\tconst selectedDriveId = selectedDrive?.header.id;\n\tconst drives = useDrives();\n\tasync function onAddFile(file, parent) {\n\t\tif (!selectedDriveId) return;\n\t\treturn addFile(file, selectedDriveId, file.name.replace(/\\..+/gim, \"\"), resolveNode(selectedDriveId, parent)?.id);\n\t}\n\tasync function onAddFolder(name, parent) {\n\t\tif (!selectedDriveId) return;\n\t\treturn addFolder(selectedDriveId, name, resolveNode(selectedDriveId, parent)?.id);\n\t}\n\tasync function onRenameNode(newName, node) {\n\t\tif (!selectedDriveId) return;\n\t\tif (!resolveNode(selectedDriveId, node)) {\n\t\t\tconsole.error(`Node ${node.id} not found`);\n\t\t\treturn;\n\t\t}\n\t\treturn await renameNode(selectedDriveId, node.id, newName);\n\t}\n\tasync function onCopyNode(src, target) {\n\t\tif (!selectedDriveId) return;\n\t\tconst resolvedSrc = resolveNode(selectedDriveId, src);\n\t\tif (!resolvedSrc) {\n\t\t\tconsole.error(`Node ${src.id} not found`);\n\t\t\treturn;\n\t\t}\n\t\tawait copyNode$1(selectedDriveId, resolvedSrc, resolveNode(selectedDriveId, target));\n\t}\n\tasync function onMoveNode(src, target) {\n\t\tif (!selectedDriveId) return;\n\t\tconst resolvedSrc = resolveNode(selectedDriveId, src);\n\t\tif (!resolvedSrc) {\n\t\t\tconsole.error(`Node ${src.id} not found`);\n\t\t\treturn;\n\t\t}\n\t\tconst resolvedTarget = resolveNode(selectedDriveId, target);\n\t\tif (!resolvedTarget?.id && !src.parentFolder || resolvedTarget?.id === src.parentFolder) return;\n\t\tawait moveNode$1(selectedDriveId, resolvedSrc, resolvedTarget);\n\t}\n\tasync function onDuplicateNode(src) {\n\t\tif (!selectedDriveId) return;\n\t\tconst resolvedSrc = resolveNode(selectedDriveId, src);\n\t\tif (!resolvedSrc) {\n\t\t\tconsole.error(`Node ${src.id} not found`);\n\t\t\treturn;\n\t\t}\n\t\tawait copyNode$1(selectedDriveId, resolvedSrc, resolveNode(selectedDriveId, selectedFolder ?? selectedParentFolder));\n\t}\n\tasync function onAddAndSelectNewFolder(name) {\n\t\tif (!name) return;\n\t\tif (!selectedDriveId) return;\n\t\tconst resolvedTarget = resolveNode(selectedDriveId, selectedFolder ?? selectedParentFolder);\n\t\tif (!resolvedTarget) return;\n\t\tconst newFolder = await onAddFolder(name, resolvedTarget);\n\t\tif (newFolder) setSelectedNode(newFolder);\n\t}\n\tasync function onRenameDriveNodes(newName, nodeId) {\n\t\tif (!drives) return;\n\t\tconst drivesWithNode = drives.filter((drive) => drive.state.global.nodes.some((n) => n.id === nodeId));\n\t\tawait Promise.all(drivesWithNode.map((drive) => renameDriveNode(drive.header.id, nodeId, newName)));\n\t}\n\treturn {\n\t\tonAddFile,\n\t\tonAddFolder,\n\t\tonRenameNode,\n\t\tonCopyNode,\n\t\tonMoveNode,\n\t\tonDuplicateNode,\n\t\tonAddAndSelectNewFolder,\n\t\tonRenameDriveNodes\n\t};\n}\n//#endregion\n//#region src/hooks/node-by-id.ts\n/** Returns a node in the selected drive by id. */\nfunction useNodeById(id) {\n\treturn useNodesInSelectedDrive()?.find((n) => n.id === id);\n}\n//#endregion\n//#region src/hooks/node-path.ts\n/** Returns the path to a node in the selected drive */\nfunction useNodePathById(id) {\n\tconst nodes = useNodesInSelectedDrive();\n\tif (!nodes) return [];\n\tconst path = [];\n\tlet current = nodes.find((n) => n.id === id);\n\twhile (current) {\n\t\tpath.push(current);\n\t\tif (!current.parentFolder) break;\n\t\tcurrent = nodes.find((n) => n.id === current?.parentFolder);\n\t}\n\treturn path.reverse();\n}\n/** Returns the path to the currently selected node in the selected drive. */\nfunction useSelectedNodePath() {\n\treturn useNodePathById(useSelectedNode()?.id);\n}\n//#endregion\n//#region src/hooks/parent-folder.ts\nfunction useNodeParentFolderById(id) {\n\treturn useFolderById(useNodeById(id)?.parentFolder);\n}\nfunction useParentFolderForSelectedNode() {\n\treturn useNodeParentFolderById(useSelectedNode()?.id);\n}\n//#endregion\n//#region src/hooks/selected-document.ts\n/** Returns the selected document id */\nfunction useSelectedDocumentId() {\n\tconst selectedNode = useSelectedNode();\n\treturn selectedNode && isFileNode(selectedNode) ? selectedNode.id : void 0;\n}\n/** Returns the selected document. */\nfunction useSelectedDocument() {\n\tconst [document, dispatch] = useDocumentById(useSelectedDocumentId());\n\tif (!document) throw new NoSelectedDocumentError();\n\treturn [document, dispatch];\n}\n/** Returns the selected document. */\nfunction useSelectedDocumentSafe() {\n\treturn useDocumentById(useSelectedDocumentId());\n}\nfunction useSelectedDocumentOfType(documentType) {\n\tconst documentId = useSelectedDocumentId();\n\tif (!documentType) return [];\n\tif (!documentId) throw new NoSelectedDocumentError();\n\treturn useDocumentOfType(documentId, documentType);\n}\n//#endregion\n//#region src/hooks/subgraph-modules.ts\nfunction useSubgraphModules() {\n\treturn useVetraPackages().flatMap((pkg) => pkg.subgraphs || []);\n}\n//#endregion\n//#region src/utils/drives.ts\nconst syncStatusToUI = {\n\t[SyncStatus.Synced]: \"SUCCESS\",\n\t[SyncStatus.Outgoing]: \"SYNCING\",\n\t[SyncStatus.Incoming]: \"SYNCING\",\n\t[SyncStatus.OutgoingAndIncoming]: \"SYNCING\",\n\t[SyncStatus.Error]: \"ERROR\"\n};\nasync function getDrives(reactor) {\n\treturn (await reactor.find({ type: \"powerhouse/document-drive\" })).results;\n}\nfunction getSyncStatus(documentId, sharingType) {\n\treturn Promise.resolve(getSyncStatusSync(documentId, sharingType));\n}\nfunction getSyncStatusSync(documentId, sharingType) {\n\tif (sharingType === \"LOCAL\") return;\n\tconst syncManager = window.ph?.reactorClientModule?.reactorModule?.syncModule?.syncManager;\n\tif (!syncManager) return;\n\tconst status = syncManager.getSyncStatus(documentId);\n\tif (status === void 0) return;\n\treturn syncStatusToUI[status];\n}\n//#endregion\n//#region src/utils/validate-document.ts\nconst validateDocument = (document) => {\n\tconst errors = [];\n\tif (document.header.documentType !== \"powerhouse/document-model\") return errors;\n\tconst doc = document;\n\tconst specs = doc.state.global.specifications[0];\n\tconst initialStateErrors = Object.keys(specs.state).reduce((acc, scopeKey) => {\n\t\tconst scope = scopeKey;\n\t\treturn [...acc, ...validateInitialState(specs.state[scope].initialValue, scope !== \"global\").map((err) => ({\n\t\t\t...err,\n\t\t\tmessage: `${err.message}. Scope: ${scope}`,\n\t\t\tdetails: {\n\t\t\t\t...err.details,\n\t\t\t\tscope\n\t\t\t}\n\t\t}))];\n\t}, []);\n\tconst schemaStateErrors = Object.keys(specs.state).reduce((acc, scopeKey) => {\n\t\tconst scope = scopeKey;\n\t\tconst isGlobalScope = scope === \"global\";\n\t\treturn [...acc, ...validateStateSchemaName(specs.state[scope].schema, doc.state.global?.name || doc.header.name || \"\", !isGlobalScope ? scope : \"\", !isGlobalScope).map((err) => ({\n\t\t\t...err,\n\t\t\tmessage: `${err.message}. Scope: ${scope}`,\n\t\t\tdetails: {\n\t\t\t\t...err.details,\n\t\t\t\tscope\n\t\t\t}\n\t\t}))];\n\t}, []);\n\tconst modulesErrors = validateModules(specs.modules);\n\treturn [\n\t\t...initialStateErrors,\n\t\t...schemaStateErrors,\n\t\t...modulesErrors\n\t];\n};\n//#endregion\n//#region src/utils/export-document.ts\nconst exportDocument = (document) => {\n\tif (!document) return;\n\tif (validateDocument(document).length) showPHModal({\n\t\ttype: \"exportDocumentWithErrors\",\n\t\tdocumentId: document.header.id\n\t});\n\telse return exportFile(document);\n};\n//#endregion\n//#region src/utils/get-revision-from-date.ts\nconst getRevisionFromDate = (startDate, endDate, operations = []) => {\n\tif (!startDate || !endDate) return 0;\n\tconst operation = operations.find((operation) => {\n\t\tconst operationDate = new Date(operation.timestampUtcMs);\n\t\treturn operationDate >= startDate && operationDate <= endDate;\n\t});\n\treturn operation ? operation.index : 0;\n};\n//#endregion\n//#region src/utils/switchboard.ts\nasync function getDriveIdBySlug(driveUrl, slug) {\n\tif (!driveUrl) return;\n\tconst urlParts = driveUrl.split(\"/\");\n\turlParts.pop();\n\turlParts.pop();\n\turlParts.push(\"drives\");\n\tconst drivesUrl = urlParts.join(\"/\");\n\treturn (await (await fetch(drivesUrl, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\tbody: JSON.stringify({\n\t\t\tquery: `\n query getDriveIdBySlug($slug: String!) {\n driveIdBySlug(slug: $slug)\n }\n `,\n\t\t\tvariables: { slug }\n\t\t})\n\t})).json()).data.driveIdBySlug;\n}\nfunction getSlugFromDriveUrl(driveUrl) {\n\treturn driveUrl.split(\"/\").pop();\n}\nfunction getSwitchboardGatewayUrlFromDriveUrl(driveUrl) {\n\tconst urlParts = driveUrl.split(\"/\");\n\turlParts.pop();\n\turlParts.pop();\n\turlParts.push(\"graphql\");\n\treturn urlParts.join(\"/\");\n}\nfunction getDocumentGraphqlQuery() {\n\treturn `query getDocument($documentId: String!) {\n document(id: $documentId) {\n id\n documentType\n createdAtUtcIso\n lastModifiedAtUtcIso\n name\n revision\n stateJSON\n }\n }`;\n}\nfunction buildDocumentSubgraphQuery(driveUrl, documentId, authToken) {\n\tconst driveSlug = getSlugFromDriveUrl(driveUrl);\n\tconst query = getDocumentGraphqlQuery();\n\tconst variables = {\n\t\tdocumentId,\n\t\tdriveId: driveSlug\n\t};\n\tconst headers = authToken ? { Authorization: `Bearer ${authToken}` } : void 0;\n\tconst payload = {\n\t\tdocument: query.trim(),\n\t\tvariables: JSON.stringify(variables, null, 2)\n\t};\n\tif (headers) payload.headers = JSON.stringify(headers);\n\treturn lzString.compressToEncodedURIComponent(JSON.stringify(payload));\n}\nfunction buildDocumentSubgraphUrl(driveUrl, documentId, authToken) {\n\treturn `${driveUrl}?explorerURLState=${buildDocumentSubgraphQuery(driveUrl, documentId, authToken)}`;\n}\n//#endregion\n//#region src/hooks/use-get-switchboard-link.ts\n/**\n* Hook that returns a function to generate a document's switchboard URL.\n* Only returns a function for documents in remote drives.\n* Returns null for local drives or when the document/drive cannot be determined.\n*\n* The returned function generates a fresh bearer token and builds the switchboard URL\n* with authentication when called.\n*\n* @param document - The document to create a switchboard URL generator for\n* @returns An async function that returns the switchboard URL, or null if not applicable\n*/\nfunction useGetSwitchboardLink(document) {\n\tconst [drive] = useSelectedDrive();\n\tconst remotes = useSyncList();\n\tconst isRemoteDrive = useMemo(() => {\n\t\treturn remotes.some((remote) => remote.collectionId === driveCollectionId$1(\"main\", drive.header.id));\n\t}, [remotes, drive]);\n\tconst remoteUrl = useMemo(() => {\n\t\ttry {\n\t\t\tconst channelUrl = (remotes.find((remote) => remote.collectionId === driveCollectionId$1(\"main\", drive.header.id))?.channel)?.config.url;\n\t\t\tif (typeof channelUrl === \"string\") return channelUrl;\n\t\t\treturn null;\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error determining remote URL:\", error);\n\t\t\treturn null;\n\t\t}\n\t}, [remotes, drive]);\n\tconst renown = useRenown();\n\tconst user = useUser();\n\treturn useMemo(() => {\n\t\tif (!isRemoteDrive || !document?.header.id || !remoteUrl) return null;\n\t\treturn async () => {\n\t\t\tconst token = user?.address ? await renown?.getBearerToken({\n\t\t\t\texpiresIn: 600,\n\t\t\t\taud: remoteUrl\n\t\t\t}) : void 0;\n\t\t\treturn buildDocumentSubgraphUrl(remoteUrl, document.header.id, token);\n\t\t};\n\t}, [\n\t\tisRemoteDrive,\n\t\tremoteUrl,\n\t\tdocument,\n\t\tuser,\n\t\trenown\n\t]);\n}\n//#endregion\n//#region src/hooks/use-on-drop-file.ts\nconst useOnDropFile = (documentTypesOverride) => {\n\tconst selectedDriveId = useSelectedDriveId();\n\tconst selectedFolder = useSelectedFolder();\n\tconst documentTypes = useDocumentTypes();\n\tconst onDropFile = async (file, onProgress, resolveConflict) => {\n\t\tif (!selectedDriveId) {\n\t\t\tconsole.warn(\"No selected drive - upload skipped\");\n\t\t\treturn;\n\t\t}\n\t\tconst fileName = file.name.replace(/\\..+/gim, \"\");\n\t\tconst targetNodeId = selectedFolder?.id;\n\t\treturn await addFileWithProgress(file, selectedDriveId, fileName, targetNodeId, onProgress, documentTypesOverride ?? documentTypes, resolveConflict);\n\t};\n\treturn onDropFile;\n};\n//#endregion\n//#region src/hooks/user-permissions.ts\nfunction useUserPermissions() {\n\tconst user = useUser();\n\tconst allowList = useAllowList();\n\tif (!allowList) return {\n\t\tisAllowedToCreateDocuments: true,\n\t\tisAllowedToEditDocuments: true\n\t};\n\treturn {\n\t\tisAllowedToCreateDocuments: allowList.includes(user?.address ?? \"\"),\n\t\tisAllowedToEditDocuments: allowList.includes(user?.address ?? \"\")\n\t};\n}\n//#endregion\n//#region src/pglite/drop.ts\nasync function dropTablesInSchema(pg, schema) {\n\tawait pg.exec(`\nDO $$\nDECLARE\n _schemaname text := '${schema}';\n _tablename text;\nBEGIN\n FOR _tablename IN SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = _schemaname LOOP\n RAISE INFO 'Dropping table %.%', _schemaname, _tablename;\n EXECUTE format('DROP TABLE %I.%I CASCADE;', _schemaname, _tablename);\n END LOOP;\n IF NOT FOUND THEN\n RAISE WARNING 'Schema % does not exist', _schemaname;\n END IF;\nEND $$;\n`);\n}\nasync function truncateAllTables(pg, schema = REACTOR_SCHEMA$1) {\n\tawait dropTablesInSchema(pg, schema);\n}\nasync function dropAllReactorStorage(pg) {\n\tawait dropTablesInSchema(pg, REACTOR_SCHEMA$1);\n\tawait dropTablesInSchema(pg, \"public\");\n}\n//#endregion\n//#region src/reactor.ts\nconst DEFAULT_DEBOUNCE_DELAY_MS = 200;\nconst DEFAULT_IMMEDIATE_THRESHOLD_MS = 1e3;\nasync function _refreshReactorData(reactor) {\n\tsetDrives(await getDrives(reactor));\n}\nasync function _refreshReactorDataClient(reactor) {\n\tif (!reactor) return;\n\tsetDrives((await reactor.find({ type: \"powerhouse/document-drive\" })).results);\n}\nfunction createDebouncedRefreshReactorData(debounceDelayMs = DEFAULT_DEBOUNCE_DELAY_MS, immediateThresholdMs = DEFAULT_IMMEDIATE_THRESHOLD_MS) {\n\tlet timeout = null;\n\tlet lastRefreshTime = 0;\n\treturn (reactor, immediate = false) => {\n\t\tconst now = Date.now();\n\t\tconst timeSinceLastRefresh = now - lastRefreshTime;\n\t\tif (timeout !== null) clearTimeout(timeout);\n\t\tif (immediate || timeSinceLastRefresh >= immediateThresholdMs) {\n\t\t\tlastRefreshTime = now;\n\t\t\treturn _refreshReactorData(reactor);\n\t\t}\n\t\treturn new Promise((resolve) => {\n\t\t\ttimeout = setTimeout(() => {\n\t\t\t\tlastRefreshTime = Date.now();\n\t\t\t\t_refreshReactorData(reactor).then(resolve);\n\t\t\t}, debounceDelayMs);\n\t\t});\n\t};\n}\nfunction createDebouncedRefreshReactorDataClient(debounceDelayMs = DEFAULT_DEBOUNCE_DELAY_MS, immediateThresholdMs = DEFAULT_IMMEDIATE_THRESHOLD_MS) {\n\tlet timeout = null;\n\tlet lastRefreshTime = 0;\n\treturn (reactor, immediate = false) => {\n\t\tconst now = Date.now();\n\t\tconst timeSinceLastRefresh = now - lastRefreshTime;\n\t\tif (timeout !== null) clearTimeout(timeout);\n\t\tif (immediate || timeSinceLastRefresh >= immediateThresholdMs) {\n\t\t\tlastRefreshTime = now;\n\t\t\treturn _refreshReactorDataClient(reactor);\n\t\t}\n\t\treturn new Promise((resolve) => {\n\t\t\ttimeout = setTimeout(() => {\n\t\t\t\tlastRefreshTime = Date.now();\n\t\t\t\t_refreshReactorDataClient(reactor).then(resolve);\n\t\t\t}, debounceDelayMs);\n\t\t});\n\t};\n}\nconst refreshReactorData = createDebouncedRefreshReactorData();\nconst refreshReactorDataClient = createDebouncedRefreshReactorDataClient();\n//#endregion\n//#region src/registry/fetchers.ts\nfunction trimTrailingSlash(url) {\n\treturn url.endsWith(\"/\") ? url.slice(0, -1) : url;\n}\nasync function getPackages(registryUrl) {\n\tconst res = await fetch(`${trimTrailingSlash(registryUrl)}/packages`);\n\tif (!res.ok) throw new Error(`Registry error: HTTP ${res.status}`);\n\treturn await res.json();\n}\nasync function getPackagesByDocumentType(registryUrl, documentType) {\n\tconst encodedType = encodeURIComponent(documentType);\n\tconst res = await fetch(`${trimTrailingSlash(registryUrl)}/packages/by-document-type?type=${encodedType}`);\n\tif (!res.ok) throw new Error(`Registry error: HTTP ${res.status}`);\n\treturn await res.json();\n}\n//#endregion\n//#region src/registry/client.ts\nfunction cdnUrlToApiUrl(cdnUrl) {\n\treturn cdnUrl.replace(/\\/-\\/cdn\\/?$/, \"\");\n}\nvar RegistryClient = class {\n\tapiUrl;\n\tconstructor(cdnUrl) {\n\t\tthis.apiUrl = cdnUrlToApiUrl(cdnUrl);\n\t}\n\tasync getPackages() {\n\t\treturn await getPackages(this.apiUrl);\n\t}\n\tasync getPackagesByDocumentType(documentType) {\n\t\treturn await getPackagesByDocumentType(this.apiUrl, documentType);\n\t}\n\tasync searchPackages(query) {\n\t\tconst packages = await this.getPackages();\n\t\tif (!query) return packages;\n\t\tconst lowerQuery = query.toLowerCase();\n\t\treturn packages.filter((pkg) => pkg.name.toLowerCase().includes(lowerQuery) || pkg.manifest?.description?.toLowerCase().includes(lowerQuery));\n\t}\n\tonPublish(callback) {\n\t\tconst eventSource = new EventSource(`${this.apiUrl}/-/events`);\n\t\teventSource.addEventListener(\"publish\", (e) => {\n\t\t\tcallback(JSON.parse(e.data));\n\t\t});\n\t\treturn () => {\n\t\t\teventSource.close();\n\t\t};\n\t}\n};\n//#endregion\n//#region src/remote-controller/action-tracker.ts\n/**\n* Tracks pending actions with their operation context (prevOpHash, prevOpIndex).\n* Actions are accumulated until flushed (on push).\n*/\nvar ActionTracker = class {\n\tpending = [];\n\t/** Track a new action with its operation context. */\n\ttrack(action, prevOpHash, prevOpIndex) {\n\t\tthis.pending.push({\n\t\t\taction,\n\t\t\tprevOpHash,\n\t\t\tprevOpIndex\n\t\t});\n\t}\n\t/** Flush all pending actions and return them. Clears the internal queue. */\n\tflush() {\n\t\tconst actions = this.pending;\n\t\tthis.pending = [];\n\t\treturn actions;\n\t}\n\t/** Number of pending actions. */\n\tget count() {\n\t\treturn this.pending.length;\n\t}\n\t/** Prepend previously flushed actions back to the queue (for retry on failure). */\n\trestore(actions) {\n\t\tthis.pending = [...actions, ...this.pending];\n\t}\n\t/** Clear all pending actions without returning them. */\n\tclear() {\n\t\tthis.pending = [];\n\t}\n};\n//#endregion\n//#region src/remote-controller/remote-client.ts\n/**\n* Thin facade over the GraphQL SDK for remote document operations.\n*/\nconst DEFAULT_PAGE_SIZE = 100;\nvar RemoteClient = class {\n\tpageSize;\n\tconstructor(client, pageSize) {\n\t\tthis.client = client;\n\t\tthis.pageSize = pageSize ?? DEFAULT_PAGE_SIZE;\n\t}\n\t/** Fetch a document by identifier. Returns null if not found. */\n\tasync getDocument(identifier, branch) {\n\t\treturn (await this.client.GetDocument({\n\t\t\tidentifier,\n\t\t\tview: branch ? { branch } : void 0\n\t\t})).document ?? null;\n\t}\n\t/**\n\t* Fetch a document and its operations.\n\t*\n\t* When scopes are provided and BatchGetDocumentWithOperations is available,\n\t* fetches the document and per-scope operations in a single HTTP request.\n\t* Otherwise falls back to GetDocumentWithOperations for the first page,\n\t* then paginates remaining operations per scope.\n\t*/\n\tasync getDocumentWithOperations(identifier, branch, sinceRevision, scopes) {\n\t\tif (this.client.BatchGetDocumentWithOperations && scopes && scopes.length > 0) return this.batchGetDocumentWithOperations(identifier, branch, sinceRevision, scopes);\n\t\tconst result = await this.client.GetDocumentWithOperations({\n\t\t\tidentifier,\n\t\t\tview: branch ? { branch } : void 0,\n\t\t\toperationsPaging: {\n\t\t\t\tlimit: this.pageSize,\n\t\t\t\tcursor: null\n\t\t\t}\n\t\t});\n\t\tif (!result.document) return null;\n\t\tconst doc = result.document.document;\n\t\tconst opsPage = doc.operations;\n\t\tconst operationsByScope = {};\n\t\tif (opsPage) for (const op of opsPage.items) (operationsByScope[op.action.scope] ??= []).push(op);\n\t\tconst expectedTotal = doc.revisionsList.reduce((sum, r) => sum + r.revision, 0);\n\t\tif ((opsPage?.items.length ?? 0) >= expectedTotal) return {\n\t\t\tdocument: doc,\n\t\t\tchildIds: result.document.childIds,\n\t\t\toperations: { operationsByScope }\n\t\t};\n\t\tconst allScopes = doc.revisionsList.map((r) => r.scope);\n\t\tconst allOps = await this.getAllOperations(doc.id, branch, sinceRevision, allScopes);\n\t\treturn {\n\t\t\tdocument: doc,\n\t\t\tchildIds: result.document.childIds,\n\t\t\toperations: allOps\n\t\t};\n\t}\n\t/**\n\t* Fetch document + per-scope operations in a single HTTP request\n\t* via BatchGetDocumentWithOperations, then paginate any remaining pages.\n\t*/\n\tasync batchGetDocumentWithOperations(identifier, branch, sinceRevision, scopes) {\n\t\tconst view = branch ? { branch } : void 0;\n\t\tconst filters = scopes.map((scope) => ({\n\t\t\tdocumentId: identifier,\n\t\t\tbranch: branch ?? null,\n\t\t\tsinceRevision: sinceRevision?.[scope] ?? 0,\n\t\t\tscopes: [scope]\n\t\t}));\n\t\tconst pagings = scopes.map(() => ({\n\t\t\tlimit: this.pageSize,\n\t\t\tcursor: null\n\t\t}));\n\t\tconst result = await this.client.BatchGetDocumentWithOperations(identifier, view, filters, pagings);\n\t\tif (!result.document) return null;\n\t\tconst operationsByScope = {};\n\t\tlet pending = [];\n\t\tfor (let i = 0; i < scopes.length; i++) {\n\t\t\tconst page = result.operations[i];\n\t\t\tfor (const op of page.items) (operationsByScope[op.action.scope] ??= []).push(op);\n\t\t\tif (page.hasNextPage && page.cursor) pending.push({\n\t\t\t\tscope: scopes[i],\n\t\t\t\tfilter: filters[i],\n\t\t\t\tcursor: page.cursor\n\t\t\t});\n\t\t}\n\t\twhile (pending.length > 0) {\n\t\t\tconst pages = await this.fetchOperationPages(pending.map((p) => p.filter), pending.map((p) => ({\n\t\t\t\tlimit: this.pageSize,\n\t\t\t\tcursor: p.cursor\n\t\t\t})));\n\t\t\tconst nextPending = [];\n\t\t\tfor (let i = 0; i < pending.length; i++) {\n\t\t\t\tconst page = pages[i];\n\t\t\t\tfor (const op of page.items) (operationsByScope[op.action.scope] ??= []).push(op);\n\t\t\t\tif (page.hasNextPage && page.cursor) nextPending.push({\n\t\t\t\t\t...pending[i],\n\t\t\t\t\tcursor: page.cursor\n\t\t\t\t});\n\t\t\t}\n\t\t\tpending = nextPending;\n\t\t}\n\t\treturn {\n\t\t\tdocument: result.document.document,\n\t\t\tchildIds: result.document.childIds,\n\t\t\toperations: { operationsByScope }\n\t\t};\n\t}\n\t/**\n\t* Fetch all operations for a document, paginating through all pages.\n\t* Each scope is queried individually because the API only returns\n\t* pagination cursors for single-scope queries.\n\t*/\n\tasync getAllOperations(documentId, branch, sinceRevision, scopes) {\n\t\tif (scopes && scopes.length > 0) {\n\t\t\tconst operationsByScope = {};\n\t\t\tlet pending = scopes.map((scope) => ({\n\t\t\t\tscope,\n\t\t\t\tfilter: {\n\t\t\t\t\tdocumentId,\n\t\t\t\t\tbranch: branch ?? null,\n\t\t\t\t\tsinceRevision: sinceRevision?.[scope] ?? 0,\n\t\t\t\t\tscopes: [scope]\n\t\t\t\t},\n\t\t\t\tcursor: null\n\t\t\t}));\n\t\t\twhile (pending.length > 0) {\n\t\t\t\tconst pages = await this.fetchOperationPages(pending.map((p) => p.filter), pending.map((p) => ({\n\t\t\t\t\tlimit: this.pageSize,\n\t\t\t\t\tcursor: p.cursor\n\t\t\t\t})));\n\t\t\t\tconst nextPending = [];\n\t\t\t\tfor (let i = 0; i < pending.length; i++) {\n\t\t\t\t\tconst page = pages[i];\n\t\t\t\t\tfor (const op of page.items) (operationsByScope[op.action.scope] ??= []).push(op);\n\t\t\t\t\tif (page.hasNextPage && page.cursor) nextPending.push({\n\t\t\t\t\t\t...pending[i],\n\t\t\t\t\t\tcursor: page.cursor\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tpending = nextPending;\n\t\t\t}\n\t\t\treturn { operationsByScope };\n\t\t}\n\t\treturn this.fetchOperationsForScope(documentId, branch);\n\t}\n\t/**\n\t* Fetch one page of operations per filter.\n\t* Uses the composed query (single HTTP request) when available,\n\t* otherwise falls back to parallel individual requests.\n\t*/\n\tasync fetchOperationPages(filters, pagings) {\n\t\tif (this.client.BatchGetDocumentOperations) return this.client.BatchGetDocumentOperations(filters, pagings);\n\t\treturn Promise.all(filters.map((filter, i) => this.client.GetDocumentOperations({\n\t\t\tfilter,\n\t\t\tpaging: pagings[i]\n\t\t}).then((r) => r.documentOperations)));\n\t}\n\t/** Fetch all pages of operations for a single scope (or all scopes if none specified). */\n\tasync fetchOperationsForScope(documentId, branch, sinceRevision, scope) {\n\t\tconst operationsByScope = {};\n\t\tlet cursor;\n\t\tlet hasNextPage = true;\n\t\twhile (hasNextPage) {\n\t\t\tconst page = (await this.client.GetDocumentOperations({\n\t\t\t\tfilter: {\n\t\t\t\t\tdocumentId,\n\t\t\t\t\tbranch: branch ?? null,\n\t\t\t\t\tsinceRevision: sinceRevision ?? 0,\n\t\t\t\t\tscopes: scope ? [scope] : null\n\t\t\t\t},\n\t\t\t\tpaging: {\n\t\t\t\t\tlimit: this.pageSize,\n\t\t\t\t\tcursor: cursor ?? null\n\t\t\t\t}\n\t\t\t})).documentOperations;\n\t\t\tfor (const op of page.items) {\n\t\t\t\tconst s = op.action.scope;\n\t\t\t\t(operationsByScope[s] ??= []).push(op);\n\t\t\t}\n\t\t\thasNextPage = page.hasNextPage;\n\t\t\tcursor = page.cursor;\n\t\t}\n\t\treturn { operationsByScope };\n\t}\n\t/** Push actions to an existing document via MutateDocument. */\n\tasync pushActions(documentIdentifier, actions, branch) {\n\t\treturn (await this.client.MutateDocument({\n\t\t\tdocumentIdentifier,\n\t\t\tactions,\n\t\t\tview: branch ? { branch } : void 0\n\t\t})).mutateDocument;\n\t}\n\t/** Create a new document on the remote. */\n\tasync createDocument(document, parentIdentifier) {\n\t\treturn (await this.client.CreateDocument({\n\t\t\tdocument,\n\t\t\tparentIdentifier: parentIdentifier ?? null\n\t\t})).createDocument;\n\t}\n\t/** Create an empty document of a given type on the remote. */\n\tasync createEmptyDocument(documentType, parentIdentifier) {\n\t\treturn (await this.client.CreateEmptyDocument({\n\t\t\tdocumentType,\n\t\t\tparentIdentifier: parentIdentifier ?? null\n\t\t})).createEmptyDocument;\n\t}\n\t/** Delete a document on the remote. Returns true if successful. */\n\tasync deleteDocument(identifier, propagate) {\n\t\treturn (await this.client.DeleteDocument({\n\t\t\tidentifier,\n\t\t\tpropagate\n\t\t})).deleteDocument;\n\t}\n};\n//#endregion\n//#region src/remote-controller/utils.ts\n/** Convert SCREAMING_SNAKE_CASE to camelCase (e.g. \"SET_MODEL_NAME\" → \"setModelName\"). */\nfunction screamingSnakeToCamel(s) {\n\treturn s.toLowerCase().replace(/_([a-z])/g, (_, c) => c.toUpperCase());\n}\n/** Error thrown when a push conflict is detected with the \"reject\" strategy. */\nvar ConflictError = class extends Error {\n\tconstructor(conflict) {\n\t\tsuper(\"Push conflict: remote has new operations since last pull\");\n\t\tthis.conflict = conflict;\n\t\tthis.name = \"ConflictError\";\n\t}\n};\n/** Convert a remote operation to the local Operation type. */\nfunction remoteOperationToLocal(remote) {\n\treturn {\n\t\tid: remote.id ?? \"\",\n\t\tindex: remote.index,\n\t\tskip: remote.skip,\n\t\ttimestampUtcMs: remote.timestampUtcMs,\n\t\thash: remote.hash,\n\t\terror: remote.error ?? void 0,\n\t\taction: {\n\t\t\tid: remote.action.id,\n\t\t\ttype: remote.action.type,\n\t\t\ttimestampUtcMs: remote.action.timestampUtcMs,\n\t\t\tinput: remote.action.input,\n\t\t\tscope: remote.action.scope,\n\t\t\tattachments: remote.action.attachments?.map((a) => ({\n\t\t\t\tdata: a.data,\n\t\t\t\tmimeType: a.mimeType,\n\t\t\t\thash: a.hash,\n\t\t\t\textension: a.extension ?? void 0,\n\t\t\t\tfileName: a.fileName ?? void 0\n\t\t\t})),\n\t\t\tcontext: remote.action.context?.signer ? { signer: {\n\t\t\t\tuser: remote.action.context.signer.user ?? {\n\t\t\t\t\taddress: \"\",\n\t\t\t\t\tnetworkId: \"\",\n\t\t\t\t\tchainId: 0\n\t\t\t\t},\n\t\t\t\tapp: remote.action.context.signer.app ?? {\n\t\t\t\t\tname: \"\",\n\t\t\t\t\tkey: \"\"\n\t\t\t\t},\n\t\t\t\tsignatures: remote.action.context.signer.signatures.map((s) => deserializeSignature(s))\n\t\t\t} } : void 0\n\t\t}\n\t};\n}\n/**\n* Deserialize a signature string back to a 5-element tuple.\n* The server serializes tuples via `tuple.join(\", \")`.\n*/\nfunction deserializeSignature(s) {\n\tconst parts = s.split(\", \");\n\treturn [\n\t\tparts[0] ?? \"\",\n\t\tparts[1] ?? \"\",\n\t\tparts[2] ?? \"\",\n\t\tparts[3] ?? \"\",\n\t\tparts[4] ?? \"\"\n\t];\n}\n/** Convert remote operations to local DocumentOperations format. */\nfunction convertRemoteOperations(operationsByScope) {\n\tconst operations = {};\n\tfor (const [scope, remoteOps] of Object.entries(operationsByScope)) operations[scope] = remoteOps.map((op) => remoteOperationToLocal(op));\n\treturn operations;\n}\n/** Reconstruct a PHDocument from remote document data and operations. */\nfunction buildPulledDocument(remoteDoc, operations, initialDoc, branch) {\n\treturn {\n\t\theader: {\n\t\t\t...initialDoc.header,\n\t\t\tid: remoteDoc.id,\n\t\t\tname: remoteDoc.name,\n\t\t\tslug: remoteDoc.slug ?? \"\",\n\t\t\tdocumentType: remoteDoc.documentType,\n\t\t\tcreatedAtUtcIso: typeof remoteDoc.createdAtUtcIso === \"string\" ? remoteDoc.createdAtUtcIso : remoteDoc.createdAtUtcIso.toISOString(),\n\t\t\tlastModifiedAtUtcIso: typeof remoteDoc.lastModifiedAtUtcIso === \"string\" ? remoteDoc.lastModifiedAtUtcIso : remoteDoc.lastModifiedAtUtcIso.toISOString(),\n\t\t\trevision: Object.fromEntries(remoteDoc.revisionsList.map((r) => [r.scope, r.revision])),\n\t\t\tbranch\n\t\t},\n\t\tstate: remoteDoc.state,\n\t\tinitialState: initialDoc.initialState,\n\t\toperations,\n\t\tclipboard: []\n\t};\n}\n/** Extract revision map from a remote document's revisionsList. */\nfunction extractRevisionMap(revisionsList) {\n\treturn Object.fromEntries(revisionsList.map((r) => [r.scope, r.revision]));\n}\n/**\n* Check if any scope in currentRevision is ahead of knownRevision.\n* When `scopes` is provided, only those scopes are checked.\n*/\nfunction hasRevisionConflict(currentRevision, knownRevision, scopes) {\n\tfor (const scope in currentRevision) {\n\t\tif (scopes && !scopes.has(scope)) continue;\n\t\tif ((currentRevision[scope] ?? 0) > (knownRevision[scope] ?? 0)) return true;\n\t}\n\treturn false;\n}\n//#endregion\n//#region src/remote-controller/remote-controller.ts\n/**\n* A controller that wraps a PHDocumentController with remote push/pull capabilities.\n* Composes a local controller and adds GraphQL-based sync with a reactor server.\n*/\nvar RemoteDocumentController = class RemoteDocumentController {\n\tinner;\n\tremoteClient;\n\ttracker = new ActionTracker();\n\toptions;\n\tdocumentId;\n\tremoteRevision = {};\n\thasPulled = false;\n\tpushScheduled = false;\n\tpushQueue = Promise.resolve();\n\tlisteners = [];\n\tconstructor(inner, options) {\n\t\tthis.inner = inner;\n\t\tthis.options = options;\n\t\tthis.documentId = options.documentId ?? \"\";\n\t\tthis.remoteClient = new RemoteClient(options.client, options.operationsPageSize);\n\t\tthis.setupActionInterceptors();\n\t}\n\tget header() {\n\t\treturn this.inner.header;\n\t}\n\tget state() {\n\t\treturn this.inner.state;\n\t}\n\tget operations() {\n\t\treturn this.inner.operations;\n\t}\n\tget document() {\n\t\treturn this.inner.document;\n\t}\n\tget status() {\n\t\treturn {\n\t\t\tpendingActionCount: this.tracker.count,\n\t\t\tconnected: this.documentId !== \"\",\n\t\t\tdocumentId: this.documentId,\n\t\t\tremoteRevision: { ...this.remoteRevision }\n\t\t};\n\t}\n\t/** Register a listener for document changes. Returns an unsubscribe function. */\n\tonChange(listener) {\n\t\tthis.listeners.push(listener);\n\t\treturn () => {\n\t\t\tthis.listeners = this.listeners.filter((l) => l !== listener);\n\t\t};\n\t}\n\tnotifyListeners(source) {\n\t\tif (this.listeners.length === 0) return;\n\t\tconst event = {\n\t\t\tsource,\n\t\t\tdocument: this.document\n\t\t};\n\t\tfor (const listener of this.listeners) listener(event);\n\t}\n\t/** Push all pending actions to remote, then pull latest state. */\n\tasync push() {\n\t\tlet tracked = this.tracker.flush();\n\t\tif (tracked.length === 0 && this.documentId !== \"\") return {\n\t\t\tremoteDocument: await this.pull(),\n\t\t\tactionCount: 0,\n\t\t\toperations: []\n\t\t};\n\t\ttry {\n\t\t\tawait this.ensureRemoteDocument();\n\t\t\tif (this.options.onConflict && tracked.length > 0) tracked = await this.handleConflicts(tracked, this.options.onConflict);\n\t\t} catch (error) {\n\t\t\tthis.tracker.restore(tracked);\n\t\t\tthrow error;\n\t\t}\n\t\tlet pushedActions = [];\n\t\ttry {\n\t\t\tif (tracked.length > 0) {\n\t\t\t\tconst actions = await this.prepareActionsForPush(tracked);\n\t\t\t\tpushedActions = actions;\n\t\t\t\tawait this.remoteClient.pushActions(this.documentId, actions, this.options.branch);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.tracker.restore(tracked);\n\t\t\tthrow error;\n\t\t}\n\t\treturn {\n\t\t\tremoteDocument: await this.pull(),\n\t\t\tactionCount: tracked.length,\n\t\t\toperations: pushedActions\n\t\t};\n\t}\n\t/** Delete the document on the remote. */\n\tasync delete(propagate) {\n\t\tif (this.documentId === \"\") throw new Error(\"Cannot delete: no document ID set\");\n\t\treturn await this.remoteClient.deleteDocument(this.documentId, propagate);\n\t}\n\t/** Pull latest state from remote, replacing local document. Returns the remote document data. */\n\tasync pull() {\n\t\tif (this.documentId === \"\") throw new Error(\"Cannot pull: no document ID set\");\n\t\tconst { remoteDoc, operations } = await this.fetchDocumentAndOperations();\n\t\tconst pulledDocument = buildPulledDocument(remoteDoc, operations, this.inner.module.utils.createDocument(), this.options.branch ?? \"main\");\n\t\tconst ControllerClass = this.inner.constructor;\n\t\tthis.inner = new ControllerClass(pulledDocument);\n\t\tthis.setupActionInterceptors();\n\t\tthis.tracker.clear();\n\t\tthis.remoteRevision = extractRevisionMap(remoteDoc.revisionsList);\n\t\tthis.notifyListeners(\"pull\");\n\t\treturn remoteDoc;\n\t}\n\t/**\n\t* Pull an existing document from remote and create a controller for it.\n\t*/\n\tstatic async pull(ControllerClass, options) {\n\t\tconst remote = new RemoteDocumentController(new ControllerClass(), options);\n\t\tif (options.documentId) await remote.pull();\n\t\treturn remote;\n\t}\n\t/**\n\t* Wrap an existing controller instance with remote capabilities.\n\t* Pending local actions on the inner controller are NOT tracked\n\t* (only new actions through the remote controller are tracked).\n\t*/\n\tstatic from(controller, options) {\n\t\treturn new RemoteDocumentController(controller, options);\n\t}\n\t/** Create the document on the remote if it doesn't exist yet. */\n\tasync ensureRemoteDocument() {\n\t\tif (this.documentId !== \"\") return;\n\t\tthis.documentId = (await this.remoteClient.createEmptyDocument(this.inner.header.documentType, this.options.parentIdentifier)).id;\n\t}\n\t/** Set up interceptors for all action methods on the inner controller. */\n\tsetupActionInterceptors() {\n\t\tconst module = this.inner[\"module\"];\n\t\tfor (const actionType in module.actions) {\n\t\t\tif (actionType in RemoteDocumentController.prototype) continue;\n\t\t\tObject.defineProperty(this, actionType, {\n\t\t\t\tvalue: (input) => {\n\t\t\t\t\tconst opCountsBefore = {};\n\t\t\t\t\tfor (const scope in this.inner.operations) opCountsBefore[scope] = this.inner.operations[scope].length;\n\t\t\t\t\tthis.inner[actionType](input);\n\t\t\t\t\tconst newOp = this.findNewOperation(opCountsBefore);\n\t\t\t\t\tconst prevOp = newOp ? this.getLastOperationInScope(newOp.action.scope, newOp) : void 0;\n\t\t\t\t\tconst prevOpHash = prevOp?.hash ?? \"\";\n\t\t\t\t\tconst prevOpIndex = prevOp?.index ?? -1;\n\t\t\t\t\tif (!newOp) return this;\n\t\t\t\t\tthis.tracker.track(newOp.action, prevOpHash, prevOpIndex);\n\t\t\t\t\tthis.notifyListeners(\"action\");\n\t\t\t\t\tif (this.options.mode === \"streaming\") this.schedulePush();\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true\n\t\t\t});\n\t\t}\n\t}\n\t/**\n\t* Find the new operation added after applying an action,\n\t* by comparing current operation counts against a previous snapshot.\n\t*/\n\tfindNewOperation(opCountsBefore) {\n\t\tconst ops = this.inner.operations;\n\t\tfor (const scope in ops) {\n\t\t\tconst scopeOps = ops[scope];\n\t\t\tconst prevCount = opCountsBefore[scope] ?? 0;\n\t\t\tif (scopeOps.length > prevCount) return scopeOps[scopeOps.length - 1];\n\t\t}\n\t}\n\t/**\n\t* Get the last operation in a specific scope, optionally excluding\n\t* a given operation (e.g. the one just added).\n\t*/\n\tgetLastOperationInScope(scope, excludeOp) {\n\t\tconst scopeOps = this.inner.operations[scope];\n\t\tif (scopeOps.length === 0) return void 0;\n\t\tfor (let i = scopeOps.length - 1; i >= 0; i--) if (scopeOps[i] !== excludeOp) return scopeOps[i];\n\t}\n\t/**\n\t* Detect and handle conflicts between local pending actions and remote state.\n\t* Returns the (possibly rebased) tracked actions to push.\n\t*/\n\tasync handleConflicts(localTracked, strategy) {\n\t\tconst remoteResult = await this.remoteClient.getDocument(this.documentId, this.options.branch);\n\t\tif (!remoteResult) throw new Error(`Document \"${this.documentId}\" not found on remote`);\n\t\tconst currentRevision = extractRevisionMap(remoteResult.document.revisionsList);\n\t\tconst localScopes = new Set(localTracked.map((t) => t.action.scope));\n\t\tif (!hasRevisionConflict(currentRevision, this.remoteRevision, localScopes)) return localTracked;\n\t\tconst conflictingScopes = [...localScopes].filter((scope) => (currentRevision[scope] ?? 0) > (this.remoteRevision[scope] ?? 0));\n\t\tconst { operationsByScope } = await this.remoteClient.getAllOperations(this.documentId, this.options.branch, this.remoteRevision, conflictingScopes);\n\t\tconst remoteOperations = {};\n\t\tfor (const [scope, ops] of Object.entries(operationsByScope)) remoteOperations[scope] = ops;\n\t\tconst conflictInfo = {\n\t\t\tremoteOperations,\n\t\t\tlocalActions: localTracked,\n\t\t\tknownRevision: { ...this.remoteRevision },\n\t\t\tcurrentRevision: { ...currentRevision }\n\t\t};\n\t\tif (strategy === \"reject\") throw new ConflictError(conflictInfo);\n\t\tif (strategy === \"rebase\") return this.pullAndReplay(localTracked.map((t) => t.action));\n\t\tconst mergedActions = await strategy(conflictInfo);\n\t\treturn this.pullAndReplay(mergedActions);\n\t}\n\t/**\n\t* Pull latest remote state and replay actions through interceptors.\n\t* Returns newly tracked actions with correct prevOpHash values.\n\t*/\n\tasync pullAndReplay(actions) {\n\t\tawait this.pull();\n\t\tfor (const action of actions) {\n\t\t\tconst methodName = screamingSnakeToCamel(action.type);\n\t\t\tconst method = this[methodName];\n\t\t\tif (typeof method === \"function\") method.call(this, action.input);\n\t\t}\n\t\treturn this.tracker.flush();\n\t}\n\t/** Prepare actions for push, optionally signing them. */\n\tasync prepareActionsForPush(tracked) {\n\t\tconst actions = [];\n\t\tfor (const { action, prevOpHash, prevOpIndex } of tracked) {\n\t\t\tlet prepared = {\n\t\t\t\t...action,\n\t\t\t\tcontext: {\n\t\t\t\t\t...action.context,\n\t\t\t\t\tprevOpHash,\n\t\t\t\t\tprevOpIndex\n\t\t\t\t}\n\t\t\t};\n\t\t\tif (this.options.signer) prepared = await this.signAction(prepared);\n\t\t\tactions.push(prepared);\n\t\t}\n\t\treturn actions;\n\t}\n\t/** Sign an action using the configured signer, preserving existing signatures. */\n\tasync signAction(action) {\n\t\tconst signer = this.options.signer;\n\t\tconst signature = await signer.signAction(action);\n\t\tconst existingSignatures = action.context?.signer?.signatures ?? [];\n\t\treturn {\n\t\t\t...action,\n\t\t\tcontext: {\n\t\t\t\t...action.context,\n\t\t\t\tsigner: {\n\t\t\t\t\tuser: signer.user,\n\t\t\t\t\tapp: signer.app,\n\t\t\t\t\tsignatures: [...existingSignatures, signature]\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\t/**\n\t* Fetch document and operations from the remote.\n\t*\n\t* On the first pull, uses the combined document+operations query.\n\t* On subsequent pulls, fetches only new operations per scope using\n\t* sinceRevision, then merges with existing local operations.\n\t* Falls back to a full fetch if the merge produces a count mismatch.\n\t*/\n\tasync fetchDocumentAndOperations() {\n\t\tif (this.hasPulled) return this.incrementalFetch();\n\t\tconst result = await this.remoteClient.getDocumentWithOperations(this.documentId, this.options.branch);\n\t\tif (!result) throw new Error(`Document \"${this.documentId}\" not found on remote`);\n\t\tthis.hasPulled = true;\n\t\treturn {\n\t\t\tremoteDoc: result.document,\n\t\t\toperations: convertRemoteOperations(result.operations.operationsByScope)\n\t\t};\n\t}\n\t/**\n\t* Incremental fetch: fetches the document and only new operations per scope\n\t* using sinceRevision in a single request when possible.\n\t* Falls back to a full fetch on count mismatch.\n\t*/\n\tasync incrementalFetch() {\n\t\tconst scopes = Object.keys(this.remoteRevision);\n\t\tconst result = await this.remoteClient.getDocumentWithOperations(this.documentId, this.options.branch, this.remoteRevision, scopes.length > 0 ? scopes : void 0);\n\t\tif (!result) throw new Error(`Document \"${this.documentId}\" not found on remote`);\n\t\tconst remoteDoc = result.document;\n\t\tconst expectedRevision = extractRevisionMap(remoteDoc.revisionsList);\n\t\tconst newOps = convertRemoteOperations(result.operations.operationsByScope);\n\t\tconst merged = this.mergeOperations(this.inner.operations, newOps);\n\t\tif (this.hasExpectedOperationCounts(merged, expectedRevision)) return {\n\t\t\tremoteDoc,\n\t\t\toperations: merged\n\t\t};\n\t\treturn this.fullFetch(remoteDoc);\n\t}\n\t/**\n\t* Full fetch fallback: fetches all operations from the beginning.\n\t* Used when an incremental fetch produces a count mismatch.\n\t*/\n\tasync fullFetch(remoteDoc) {\n\t\tconst { operationsByScope } = await this.remoteClient.getAllOperations(this.documentId, this.options.branch);\n\t\treturn {\n\t\t\tremoteDoc,\n\t\t\toperations: convertRemoteOperations(operationsByScope)\n\t\t};\n\t}\n\t/**\n\t* Validate that the merged operations match the expected revision per scope.\n\t* Each scope's operation count should equal its revision number.\n\t*/\n\thasExpectedOperationCounts(operations, expectedRevision) {\n\t\tfor (const [scope, revision] of Object.entries(expectedRevision)) if ((scope in operations ? operations[scope].length : 0) !== revision) return false;\n\t\treturn true;\n\t}\n\t/**\n\t* Merge existing local operations with newly fetched operations.\n\t* Appends new operations to existing ones per scope.\n\t*/\n\tmergeOperations(existingOps, newOps) {\n\t\tconst merged = {};\n\t\tfor (const [scope, ops] of Object.entries(existingOps)) if (ops.length > 0) merged[scope] = [...ops];\n\t\tfor (const [scope, ops] of Object.entries(newOps)) if (ops.length > 0) (merged[scope] ??= []).push(...ops);\n\t\treturn merged;\n\t}\n\t/** Schedule a push via microtask (for streaming mode coalescing). */\n\tschedulePush() {\n\t\tif (this.pushScheduled) return;\n\t\tthis.pushScheduled = true;\n\t\tqueueMicrotask(() => {\n\t\t\tthis.pushScheduled = false;\n\t\t\tthis.pushQueue = this.pushQueue.then(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.push();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.options.onPushError?.(error);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n};\n//#endregion\n//#region src/storage/base-storage.ts\nvar BaseStorage = class {\n\t[Symbol.iterator]() {\n\t\treturn this.entries();\n\t}\n\tforEach(callback) {\n\t\tfor (const [key, value] of this) callback(value, key, this);\n\t}\n};\n//#endregion\n//#region src/storage/local-storage.ts\nvar BrowserLocalStorage = class extends BaseStorage {\n\t#namespace;\n\t#storage = window.localStorage;\n\tconstructor(namespace) {\n\t\tsuper();\n\t\tthis.#namespace = namespace;\n\t}\n\t#readMap() {\n\t\tconst raw = this.#storage.getItem(this.#namespace);\n\t\tif (!raw) return /* @__PURE__ */ new Map();\n\t\treturn new Map(JSON.parse(raw));\n\t}\n\t#writeMap(map) {\n\t\tthis.#storage.setItem(this.#namespace, JSON.stringify(Array.from(map.entries())));\n\t}\n\tget(key) {\n\t\treturn this.#readMap().get(key);\n\t}\n\tset(key, value) {\n\t\tconst map = this.#readMap();\n\t\tmap.set(key, value);\n\t\tthis.#writeMap(map);\n\t}\n\tdelete(key) {\n\t\tconst map = this.#readMap();\n\t\tconst deleted = map.delete(key);\n\t\tif (deleted) this.#writeMap(map);\n\t\treturn deleted;\n\t}\n\thas(key) {\n\t\treturn this.#readMap().has(key);\n\t}\n\tclear() {\n\t\tthis.#storage.removeItem(this.#namespace);\n\t}\n\tentries() {\n\t\treturn this.#readMap().entries();\n\t}\n\tkeys() {\n\t\treturn this.#readMap().keys();\n\t}\n\tvalues() {\n\t\treturn this.#readMap().values();\n\t}\n\t[Symbol.iterator]() {\n\t\treturn this.#readMap().entries();\n\t}\n};\n//#endregion\nexport { ActionTracker, BaseStorage, BrowserLocalStorage, COMMON_PACKAGE_ID, CREDENTIAL_SCHEMA_EIP712_TYPE, CREDENTIAL_SUBJECT_TYPE, CREDENTIAL_TYPES, ChannelScheme, ChevronDownIcon, ConflictError, CopyIcon, DEFAULT_DRIVE_EDITOR_ID, DOMAIN_TYPE, DisconnectIcon, DocumentCache, DocumentChangeType, DocumentIntegrityService, GqlRequestChannel, ISSUER_TYPE, InMemoryQueue, IntervalPollTimer, PropagationMode, REACTOR_SCHEMA, RENOWN_CHAIN_ID, RENOWN_NETWORK_ID, RENOWN_URL, ReactorBuilder, ReactorClientBuilder, RegistryClient, RelationalDbProcessor, RemoteClient, RemoteDocumentController, Renown, RenownAuthButton, RenownLoginButton, RenownLogo, RenownUserButton, SpinnerIcon, SyncOperationStatus, UserIcon, VERIFIABLE_CREDENTIAL_EIP712_TYPE, addAllowListEventHandler, addAllowedDocumentTypesEventHandler, addAnalyticsDatabaseNameEventHandler, addBasePathEventHandler, addCliVersionEventHandler, addDefaultDrivesUrlEventHandler, addDisabledEditorsEventHandler, addDocument, addDocumentCacheEventHandler, addDrive, addDrivesEventHandler, addDrivesPreserveStrategyEventHandler, addEnabledEditorsEventHandler, addFeaturesEventHandler, addFileUploadOperationsChunkSizeEventHandler, addFolder, addGaTrackingIdEventHandler, addIsAddCloudDrivesEnabledEventHandler, addIsAddDriveEnabledEventHandler, addIsAddLocalDrivesEnabledEventHandler, addIsAddPublicDrivesEnabledEventHandler, addIsAnalyticsDatabaseWorkerEnabledEventHandler, addIsAnalyticsEnabledEventHandler, addIsAnalyticsExternalProcessorsEnabledEventHandler, addIsCloudDrivesEnabledEventHandler, addIsDeleteCloudDrivesEnabledEventHandler, addIsDeleteLocalDrivesEnabledEventHandler, addIsDeletePublicDrivesEnabledEventHandler, addIsDiffAnalyticsEnabledEventHandler, addIsDocumentModelSelectionSettingsEnabledEventHandler, addIsDragAndDropEnabledEventHandler, addIsDriveAnalyticsEnabledEventHandler, addIsEditorDebugModeEnabledEventHandler, addIsEditorReadModeEnabledEventHandler, addIsExternalControlsEnabledEventHandler, addIsExternalPackagesEnabledEventHandler, addIsExternalProcessorsEnabledEventHandler, addIsExternalRelationalProcessorsEnabledEventHandler, addIsLocalDrivesEnabledEventHandler, addIsPublicDrivesEnabledEventHandler, addIsRelationalProcessorsEnabledEventHandler, addIsSentryTracingEnabledEventHandler, addLoadingEventHandler, addLocalDrivesEnabledEventHandler, addLogLevelEventHandler, addModalEventHandler, addPHEventHandlers, addPackageDiscoveryServiceEventHandler, addPromiseState, addReactorClientEventHandler, addReactorClientModuleEventHandler, addRemoteDrive, addRenownChainIdEventHandler, addRenownEventHandler, addRenownNetworkIdEventHandler, addRenownUrlEventHandler, addRequiresHardRefreshEventHandler, addResetSelectedNodeEventHandler, addRevisionHistoryVisibleEventHandler, addRouterBasenameEventHandler, addSelectedDriveIdEventHandler, addSelectedNodeIdEventHandler, addSelectedTimelineItemEventHandler, addSelectedTimelineRevisionEventHandler, addSentryDsnEventHandler, addSentryEnvEventHandler, addSentryReleaseEventHandler, addSetSelectedDriveOnPopStateEventHandler, addSetSelectedNodeOnPopStateEventHandler, addStudioModeEventHandler, addToastEventHandler, addVersionCheckIntervalEventHandler, addVersionEventHandler, addVetraPackageManagerEventHandler, addWarnOutdatedAppEventHandler, baseDocumentModels, baseDocumentModelsMap, buildDocumentSubgraphQuery, buildDocumentSubgraphUrl, callGlobalSetterForKey, clearGlobal, closePHModal, convertRemoteOperations, createAnalyticsStore, createClient, createProcessorQuery, createUrlWithPreservedParams, deleteDrive, deleteNode, dispatchActions, driveCollectionId, driveIdFromUrl, dropAllReactorStorage, exportDocument, exportFile, extractDriveIdFromPath, extractDriveIdFromSlug, extractDriveSlugFromPath, extractNodeIdFromPath, extractNodeIdFromSlug, extractNodeSlugFromPath, findUuid, getAnalyticsStore, getDocumentGraphqlQuery, getDriveIdBySlug, getDrives, getGlobal, getPackages, getPackagesByDocumentType, getPathWithoutBase, getRevisionFromDate, getSlugFromDriveUrl, getSwitchboardGatewayUrlFromDriveUrl, getSyncStatus, getSyncStatusSync, getUserPermissions, hideRevisionHistory, initConnectCrypto, initRenownCrypto, isDocumentTypeSupported, isExternalControlsEnabledEventFunctions, isFileNodeKind, isFolderNodeKind, loading, login, logout, makeDriveUrlComponent, makeNodeSlug, makePHEventFunctions, openRenown, parseDriveUrl, phAppConfigHooks, phAppConfigSetters, phDocumentEditorConfigHooks, phDocumentEditorConfigSetters, phGlobalConfigHooks, phGlobalConfigSetters, readPromiseState, refreshReactorData, refreshReactorDataClient, renameDrive, renameDriveNode, resolveUrlPathname, setAllowList, setAllowedDocumentTypes, setAnalyticsDatabaseName, setBasePath, setCliVersion, setDefaultDrivesUrl, setDefaultPHGlobalConfig, setDisabledEditors, setDocumentCache, setDriveAvailableOffline, setDriveSharingType, setDrives, setDrivesPreserveStrategy, setEnabledEditors, setFeatures, setFileUploadOperationsChunkSize, setGaTrackingId, setGlobal, setIsAddCloudDrivesEnabled, setIsAddDriveEnabled, setIsAddLocalDrivesEnabled, setIsAddPublicDrivesEnabled, setIsAnalyticsDatabaseWorkerEnabled, setIsAnalyticsEnabled, setIsAnalyticsExternalProcessorsEnabled, setIsCloudDrivesEnabled, setIsDeleteCloudDrivesEnabled, setIsDeleteLocalDrivesEnabled, setIsDeletePublicDrivesEnabled, setIsDiffAnalyticsEnabled, setIsDocumentModelSelectionSettingsEnabled, setIsDragAndDropEnabled, setIsDriveAnalyticsEnabled, setIsEditorDebugModeEnabled, setIsEditorReadModeEnabled, setIsExternalControlsEnabled, setIsExternalPackagesEnabled, setIsExternalProcessorsEnabled, setIsExternalRelationalProcessorsEnabled, setIsLocalDrivesEnabled, setIsPublicDrivesEnabled, setIsRelationalProcessorsEnabled, setIsSentryTracingEnabled, setLoading, setLocalDrivesEnabled, setLogLevel, setPHAppConfig, setPHAppConfigByKey, setPHDocumentEditorConfig, setPHDocumentEditorConfigByKey, setPHGlobalConfig, setPHGlobalConfigByKey, setPHModal, setPHToast, setPackageDiscoveryService, setReactorClient, setReactorClientModule, setRenown, setRenownChainId, setRenownNetworkId, setRenownUrl, setRequiresHardRefresh, setRevisionHistoryVisible, setRouterBasename, setSelectedDrive, setSelectedNode, setSelectedTimelineItem, setSelectedTimelineRevision, setSentryDsn, setSentryEnv, setSentryRelease, setStudioMode, setVersion, setVersionCheckInterval, setVetraPackageManager, setWarnOutdatedApp, showCreateDocumentModal, showDeleteNodeModal, showPHModal, showRevisionHistory, sortNodesByName, truncateAllTables, useAllowList, useAllowedDocumentModelModules, useAllowedDocumentTypes, useAnalyticsDatabaseName, useAppModuleById, useAppModules, useBasePath, useCliVersion, useConnectionState, useConnectionStates, useDatabase, useDefaultAppModule, useDefaultDrivesUrl, useDid, useDisabledEditors, useDispatch, useDocument, useDocumentById, useDocumentCache, useDocumentModelModuleById, useDocumentModelModules, useDocumentOfType, useDocumentOperations, useDocumentTypes, useDocumentTypesInSelectedDrive, useDocuments, useDocumentsByIds, useDocumentsInSelectedDrive, useDocumentsInSelectedFolder, useDriveById, useDrives, useDrivesPreserveStrategy, useEditorModuleById, useEditorModules, useEditorModulesForDocumentType, useEnabledEditors, useFallbackEditorModule, useFeatures, useFileNodesInSelectedDrive, useFileNodesInSelectedFolder, useFileUploadOperationsChunkSize, useFolderById, useFolderNodesInSelectedDrive, useFolderNodesInSelectedFolder, useGaTrackingId, useGetDocument, useGetDocumentAsync, useGetDocuments, useGetSwitchboardLink, useIsAddCloudDrivesEnabled, useIsAddDriveEnabled, useIsAddLocalDrivesEnabled, useIsAddPublicDrivesEnabled, useIsAnalyticsDatabaseWorkerEnabled, useIsAnalyticsEnabled, useIsAnalyticsExternalProcessorsEnabled, useIsCloudDrivesEnabled, useIsDeleteCloudDrivesEnabled, useIsDeleteLocalDrivesEnabled, useIsDeletePublicDrivesEnabled, useIsDiffAnalyticsEnabled, useIsDocumentModelSelectionSettingsEnabled, useIsDragAndDropEnabled, useIsDriveAnalyticsEnabled, useIsEditorDebugModeEnabled, useIsEditorReadModeEnabled, useIsExternalControlsEnabled, useIsExternalPackagesEnabled, useIsExternalProcessorsEnabled, useIsExternalRelationalProcessorsEnabled, useIsLocalDrivesEnabled, useIsPublicDrivesEnabled, useIsRelationalProcessorsEnabled, useIsSentryTracingEnabled, useLoading, useLocalDrivesEnabled, useLogLevel, useLoginStatus, useModelRegistry, useNodeActions, useNodeById, useNodeParentFolderById, useNodePathById, useNodesInSelectedDrive, useNodesInSelectedDriveOrFolder, useNodesInSelectedFolder, useOnDropFile, usePGlite, usePHAppConfigByKey, usePHDocumentEditorConfigByKey, usePHGlobalConfigByKey, usePHModal, usePHToast, usePackageDiscoveryService, useParentFolderForSelectedNode, useReactorClient, useReactorClientModule, useRelationalDb, useRelationalQuery, useRenown, useRenownAuth, useRenownChainId, useRenownInit, useRenownNetworkId, useRenownUrl, useRequiresHardRefresh, useResetPHGlobalConfig, useRevisionHistoryVisible, useRouterBasename, useSelectedDocument, useSelectedDocumentId, useSelectedDocumentOfType, useSelectedDocumentSafe, useSelectedDrive, useSelectedDriveId, useSelectedDriveSafe, useSelectedFolder, useSelectedNode, useSelectedNodePath, useSelectedTimelineItem, useSelectedTimelineRevision, useSentryDsn, useSentryEnv, useSentryRelease, useSetDefaultPHGlobalConfig, useSetPHAppConfig, useSetPHDocumentEditorConfig, useSetPHGlobalConfig, useStudioMode, useSubgraphModules, useSupportedDocumentTypesInReactor, useSync, useSyncList, useUser, useUserPermissions, useVersion, useVersionCheckInterval, useVetraPackageManager, useVetraPackages, useWarnOutdatedApp, validateDocument };\n\n//# sourceMappingURL=index.js.map","import React from 'react';\n\nvar isCheckBoxInput = (element) => element.type === 'checkbox';\n\nvar isDateObject = (value) => value instanceof Date;\n\nvar isNullOrUndefined = (value) => value == null;\n\nconst isObjectType = (value) => typeof value === 'object';\nvar isObject = (value) => !isNullOrUndefined(value) &&\n !Array.isArray(value) &&\n isObjectType(value) &&\n !isDateObject(value);\n\nvar getEventValue = (event) => isObject(event) && event.target\n ? isCheckBoxInput(event.target)\n ? event.target.checked\n : event.target.value\n : event;\n\nvar getNodeParentName = (name) => name.substring(0, name.search(/\\.\\d+(\\.|$)/)) || name;\n\nvar isNameInFieldArray = (names, name) => names.has(getNodeParentName(name));\n\nvar isPlainObject = (tempObject) => {\n const prototypeCopy = tempObject.constructor && tempObject.constructor.prototype;\n return (isObject(prototypeCopy) && prototypeCopy.hasOwnProperty('isPrototypeOf'));\n};\n\nvar isWeb = typeof window !== 'undefined' &&\n typeof window.HTMLElement !== 'undefined' &&\n typeof document !== 'undefined';\n\nfunction cloneObject(data) {\n if (data instanceof Date) {\n return new Date(data);\n }\n const isFileListInstance = typeof FileList !== 'undefined' && data instanceof FileList;\n if (isWeb && (data instanceof Blob || isFileListInstance)) {\n return data;\n }\n const isArray = Array.isArray(data);\n if (!isArray && !(isObject(data) && isPlainObject(data))) {\n return data;\n }\n const copy = isArray ? [] : Object.create(Object.getPrototypeOf(data));\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n copy[key] = cloneObject(data[key]);\n }\n }\n return copy;\n}\n\nvar isKey = (value) => /^\\w*$/.test(value);\n\nvar isUndefined = (val) => val === undefined;\n\nvar compact = (value) => Array.isArray(value) ? value.filter(Boolean) : [];\n\nvar stringToPath = (input) => compact(input.replace(/[\"|']|\\]/g, '').split(/\\.|\\[/));\n\nvar get = (object, path, defaultValue) => {\n if (!path || !isObject(object)) {\n return defaultValue;\n }\n const result = (isKey(path) ? [path] : stringToPath(path)).reduce((result, key) => isNullOrUndefined(result) ? result : result[key], object);\n return isUndefined(result) || result === object\n ? isUndefined(object[path])\n ? defaultValue\n : object[path]\n : result;\n};\n\nvar isBoolean = (value) => typeof value === 'boolean';\n\nvar isFunction = (value) => typeof value === 'function';\n\nvar set = (object, path, value) => {\n let index = -1;\n const tempPath = isKey(path) ? [path] : stringToPath(path);\n const length = tempPath.length;\n const lastIndex = length - 1;\n while (++index < length) {\n const key = tempPath[index];\n let newValue = value;\n if (index !== lastIndex) {\n const objValue = object[key];\n newValue =\n isObject(objValue) || Array.isArray(objValue)\n ? objValue\n : !isNaN(+tempPath[index + 1])\n ? []\n : {};\n }\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return;\n }\n object[key] = newValue;\n object = object[key];\n }\n};\n\nconst EVENTS = {\n BLUR: 'blur',\n FOCUS_OUT: 'focusout',\n CHANGE: 'change',\n};\nconst VALIDATION_MODE = {\n onBlur: 'onBlur',\n onChange: 'onChange',\n onSubmit: 'onSubmit',\n onTouched: 'onTouched',\n all: 'all',\n};\nconst INPUT_VALIDATION_RULES = {\n max: 'max',\n min: 'min',\n maxLength: 'maxLength',\n minLength: 'minLength',\n pattern: 'pattern',\n required: 'required',\n validate: 'validate',\n};\n\n/**\n * Separate context for `control` to prevent unnecessary rerenders.\n * Internal hooks that only need control use this instead of full form context.\n */\nconst HookFormControlContext = React.createContext(null);\nHookFormControlContext.displayName = 'HookFormControlContext';\n/**\n * @internal Internal hook to access only control from context.\n */\nconst useFormControlContext = () => React.useContext(HookFormControlContext);\n\nvar getProxyFormState = (formState, control, localProxyFormState, isRoot = true) => {\n const result = {\n defaultValues: control._defaultValues,\n };\n for (const key in formState) {\n Object.defineProperty(result, key, {\n get: () => {\n const _key = key;\n if (control._proxyFormState[_key] !== VALIDATION_MODE.all) {\n control._proxyFormState[_key] = !isRoot || VALIDATION_MODE.all;\n }\n localProxyFormState && (localProxyFormState[_key] = true);\n return formState[_key];\n },\n });\n }\n return result;\n};\n\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;\n\n/**\n * This custom hook allows you to subscribe to each form state, and isolate the re-render at the custom hook level. It has its scope in terms of form state subscription, so it would not affect other useFormState and useForm. Using this hook can reduce the re-render impact on large and complex form application.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useformstate) • [Demo](https://codesandbox.io/s/useformstate-75xly)\n *\n * @param props - include options on specify fields to subscribe. {@link UseFormStateReturn}\n *\n * @example\n * ```tsx\n * function App() {\n * const { register, handleSubmit, control } = useForm({\n * defaultValues: {\n * firstName: \"firstName\"\n * }});\n * const { dirtyFields } = useFormState({\n * control\n * });\n * const onSubmit = (data) => console.log(data);\n *\n * return (\n * <form onSubmit={handleSubmit(onSubmit)}>\n * <input {...register(\"firstName\")} placeholder=\"First Name\" />\n * {dirtyFields.firstName && <p>Field is dirty.</p>}\n * <input type=\"submit\" />\n * </form>\n * );\n * }\n * ```\n */\nfunction useFormState(props) {\n const formControl = useFormControlContext();\n const { control = formControl, disabled, name, exact } = props || {};\n const [formState, updateFormState] = React.useState(control._formState);\n const _localProxyFormState = React.useRef({\n isDirty: false,\n isLoading: false,\n dirtyFields: false,\n touchedFields: false,\n validatingFields: false,\n isValidating: false,\n isValid: false,\n errors: false,\n });\n useIsomorphicLayoutEffect(() => control._subscribe({\n name,\n formState: _localProxyFormState.current,\n exact,\n callback: (formState) => {\n !disabled &&\n updateFormState({\n ...control._formState,\n ...formState,\n });\n },\n }), [name, disabled, exact]);\n React.useEffect(() => {\n _localProxyFormState.current.isValid && control._setValid(true);\n }, [control]);\n return React.useMemo(() => getProxyFormState(formState, control, _localProxyFormState.current, false), [formState, control]);\n}\n\nvar isString = (value) => typeof value === 'string';\n\nvar generateWatchOutput = (names, _names, formValues, isGlobal, defaultValue) => {\n if (isString(names)) {\n isGlobal && _names.watch.add(names);\n return get(formValues, names, defaultValue);\n }\n if (Array.isArray(names)) {\n return names.map((fieldName) => (isGlobal && _names.watch.add(fieldName),\n get(formValues, fieldName)));\n }\n isGlobal && (_names.watchAll = true);\n return formValues;\n};\n\nvar isPrimitive = (value) => isNullOrUndefined(value) || !isObjectType(value);\n\nfunction deepEqual(object1, object2, _internal_visited = new WeakSet()) {\n if (isPrimitive(object1) || isPrimitive(object2)) {\n return Object.is(object1, object2);\n }\n if (isDateObject(object1) && isDateObject(object2)) {\n return Object.is(object1.getTime(), object2.getTime());\n }\n const keys1 = Object.keys(object1);\n const keys2 = Object.keys(object2);\n if (keys1.length !== keys2.length) {\n return false;\n }\n if (_internal_visited.has(object1) || _internal_visited.has(object2)) {\n return true;\n }\n _internal_visited.add(object1);\n _internal_visited.add(object2);\n for (const key of keys1) {\n const val1 = object1[key];\n if (!keys2.includes(key)) {\n return false;\n }\n if (key !== 'ref') {\n const val2 = object2[key];\n if ((isDateObject(val1) && isDateObject(val2)) ||\n (isObject(val1) && isObject(val2)) ||\n (Array.isArray(val1) && Array.isArray(val2))\n ? !deepEqual(val1, val2, _internal_visited)\n : !Object.is(val1, val2)) {\n return false;\n }\n }\n }\n return true;\n}\n\n/**\n * Custom hook to subscribe to field change and isolate re-rendering at the component level.\n *\n * @remarks\n *\n * [API](https://react-hook-form.com/docs/usewatch) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-usewatch-h9i5e)\n *\n * @example\n * ```tsx\n * const { control } = useForm();\n * const values = useWatch({\n * name: \"fieldName\"\n * control,\n * })\n * ```\n */\nfunction useWatch(props) {\n const formControl = useFormControlContext();\n const { control = formControl, name, defaultValue, disabled, exact, compute, } = props || {};\n const _defaultValue = React.useRef(defaultValue);\n const _compute = React.useRef(compute);\n const _computeFormValues = React.useRef(undefined);\n const _prevControl = React.useRef(control);\n const _prevName = React.useRef(name);\n _compute.current = compute;\n const [value, updateValue] = React.useState(() => {\n const defaultValue = control._getWatch(name, _defaultValue.current);\n return _compute.current ? _compute.current(defaultValue) : defaultValue;\n });\n const getCurrentOutput = React.useCallback((values) => {\n const formValues = generateWatchOutput(name, control._names, values || control._formValues, false, _defaultValue.current);\n return _compute.current ? _compute.current(formValues) : formValues;\n }, [control._formValues, control._names, name]);\n const refreshValue = React.useCallback((values) => {\n if (!disabled) {\n const formValues = generateWatchOutput(name, control._names, values || control._formValues, false, _defaultValue.current);\n if (_compute.current) {\n const computedFormValues = _compute.current(formValues);\n if (!deepEqual(computedFormValues, _computeFormValues.current)) {\n updateValue(computedFormValues);\n _computeFormValues.current = computedFormValues;\n }\n }\n else {\n updateValue(formValues);\n }\n }\n }, [control._formValues, control._names, disabled, name]);\n useIsomorphicLayoutEffect(() => {\n if (_prevControl.current !== control ||\n !deepEqual(_prevName.current, name)) {\n _prevControl.current = control;\n _prevName.current = name;\n refreshValue();\n }\n return control._subscribe({\n name,\n formState: {\n values: true,\n },\n exact,\n callback: (formState) => {\n refreshValue(formState.values);\n },\n });\n }, [control, exact, name, refreshValue]);\n React.useEffect(() => control._removeUnmounted());\n // If name or control changed for this render, synchronously reflect the\n // latest value so callers (like useController) see the correct value\n // immediately on the same render.\n // Optimize: Check control reference first before expensive deepEqual\n const controlChanged = _prevControl.current !== control;\n const prevName = _prevName.current;\n // Cache the computed output to avoid duplicate calls within the same render\n // We include shouldReturnImmediate in deps to ensure proper recomputation\n const computedOutput = React.useMemo(() => {\n if (disabled) {\n return null;\n }\n const nameChanged = !controlChanged && !deepEqual(prevName, name);\n const shouldReturnImmediate = controlChanged || nameChanged;\n return shouldReturnImmediate ? getCurrentOutput() : null;\n }, [disabled, controlChanged, name, prevName, getCurrentOutput]);\n return computedOutput !== null ? computedOutput : value;\n}\n\n/**\n * Custom hook to work with controlled component, this function provide you with both form and field level state. Re-render is isolated at the hook level.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/usecontroller) • [Demo](https://codesandbox.io/s/usecontroller-0o8px)\n *\n * @param props - the path name to the form field value, and validation rules.\n *\n * @returns field properties, field and form state. {@link UseControllerReturn}\n *\n * @example\n * ```tsx\n * function Input(props) {\n * const { field, fieldState, formState } = useController(props);\n * return (\n * <div>\n * <input {...field} placeholder={props.name} />\n * <p>{fieldState.isTouched && \"Touched\"}</p>\n * <p>{formState.isSubmitted ? \"submitted\" : \"\"}</p>\n * </div>\n * );\n * }\n * ```\n */\nfunction useController(props) {\n const formControl = useFormControlContext();\n const { name, disabled, control = formControl, shouldUnregister, defaultValue, exact = true, } = props;\n const isArrayField = isNameInFieldArray(control._names.array, name);\n const defaultValueMemo = React.useMemo(() => get(control._formValues, name, get(control._defaultValues, name, defaultValue)), [control, name, defaultValue]);\n const value = useWatch({\n control,\n name,\n defaultValue: defaultValueMemo,\n exact,\n });\n const formState = useFormState({\n control,\n name,\n exact,\n });\n const _props = React.useRef(props);\n const _previousNameRef = React.useRef(undefined);\n const _registerProps = React.useRef(control.register(name, {\n ...props.rules,\n value,\n ...(isBoolean(props.disabled) ? { disabled: props.disabled } : {}),\n }));\n _props.current = props;\n const fieldState = React.useMemo(() => Object.defineProperties({}, {\n invalid: {\n enumerable: true,\n get: () => !!get(formState.errors, name),\n },\n isDirty: {\n enumerable: true,\n get: () => !!get(formState.dirtyFields, name),\n },\n isTouched: {\n enumerable: true,\n get: () => !!get(formState.touchedFields, name),\n },\n isValidating: {\n enumerable: true,\n get: () => !!get(formState.validatingFields, name),\n },\n error: {\n enumerable: true,\n get: () => get(formState.errors, name),\n },\n }), [formState, name]);\n const onChange = React.useCallback((event) => _registerProps.current.onChange({\n target: {\n value: getEventValue(event),\n name: name,\n },\n type: EVENTS.CHANGE,\n }), [name]);\n const onBlur = React.useCallback(() => _registerProps.current.onBlur({\n target: {\n value: get(control._formValues, name),\n name: name,\n },\n type: EVENTS.BLUR,\n }), [name, control._formValues]);\n const ref = React.useCallback((elm) => {\n const field = get(control._fields, name);\n if (field && field._f && elm) {\n field._f.ref = {\n focus: () => isFunction(elm.focus) && elm.focus(),\n select: () => isFunction(elm.select) && elm.select(),\n setCustomValidity: (message) => isFunction(elm.setCustomValidity) && elm.setCustomValidity(message),\n reportValidity: () => isFunction(elm.reportValidity) && elm.reportValidity(),\n };\n }\n }, [control._fields, name]);\n const field = React.useMemo(() => ({\n name,\n value,\n ...(isBoolean(disabled) || formState.disabled\n ? { disabled: formState.disabled || disabled }\n : {}),\n onChange,\n onBlur,\n ref,\n }), [name, disabled, formState.disabled, onChange, onBlur, ref, value]);\n React.useEffect(() => {\n const _shouldUnregisterField = control._options.shouldUnregister || shouldUnregister;\n const previousName = _previousNameRef.current;\n if (previousName && previousName !== name && !isArrayField) {\n control.unregister(previousName);\n }\n control.register(name, {\n ..._props.current.rules,\n ...(isBoolean(_props.current.disabled)\n ? { disabled: _props.current.disabled }\n : {}),\n });\n const updateMounted = (name, value) => {\n const field = get(control._fields, name);\n if (field && field._f) {\n field._f.mount = value;\n }\n };\n updateMounted(name, true);\n if (_shouldUnregisterField) {\n const value = cloneObject(get(control._options.defaultValues, name, _props.current.defaultValue));\n set(control._defaultValues, name, value);\n if (isUndefined(get(control._formValues, name))) {\n set(control._formValues, name, value);\n }\n }\n !isArrayField && control.register(name);\n _previousNameRef.current = name;\n return () => {\n (isArrayField\n ? _shouldUnregisterField && !control._state.action\n : _shouldUnregisterField)\n ? control.unregister(name)\n : updateMounted(name, false);\n };\n }, [name, control, isArrayField, shouldUnregister]);\n React.useEffect(() => {\n control._setDisabledField({\n disabled,\n name,\n });\n }, [disabled, name, control]);\n return React.useMemo(() => ({\n field,\n formState,\n fieldState,\n }), [field, formState, fieldState]);\n}\n\n/**\n * Component based on `useController` hook to work with controlled component.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/usecontroller/controller) • [Demo](https://codesandbox.io/s/react-hook-form-v6-controller-ts-jwyzw) • [Video](https://www.youtube.com/watch?v=N2UNk_UCVyA)\n *\n * @param props - the path name to the form field value, and validation rules.\n *\n * @returns provide field handler functions, field and form state.\n *\n * @example\n * ```tsx\n * function App() {\n * const { control } = useForm<FormValues>({\n * defaultValues: {\n * test: \"\"\n * }\n * });\n *\n * return (\n * <form>\n * <Controller\n * control={control}\n * name=\"test\"\n * render={({ field: { onChange, onBlur, value, ref }, formState, fieldState }) => (\n * <>\n * <input\n * onChange={onChange} // send value to hook form\n * onBlur={onBlur} // notify when input is touched\n * value={value} // return updated value\n * ref={ref} // set ref for focus management\n * />\n * <p>{formState.isSubmitted ? \"submitted\" : \"\"}</p>\n * <p>{fieldState.isTouched ? \"touched\" : \"\"}</p>\n * </>\n * )}\n * />\n * </form>\n * );\n * }\n * ```\n */\nconst Controller = (props) => props.render(useController(props));\n\nconst flatten = (obj) => {\n const output = {};\n for (const key of Object.keys(obj)) {\n if (isObjectType(obj[key]) && obj[key] !== null) {\n const nested = flatten(obj[key]);\n for (const nestedKey of Object.keys(nested)) {\n output[`${key}.${nestedKey}`] = nested[nestedKey];\n }\n }\n else {\n output[key] = obj[key];\n }\n }\n return output;\n};\n\nconst HookFormContext = React.createContext(null);\nHookFormContext.displayName = 'HookFormContext';\n/**\n * This custom hook allows you to access the form context. useFormContext is intended to be used in deeply nested structures, where it would become inconvenient to pass the context as a prop. To be used with {@link FormProvider}.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useformcontext) • [Demo](https://codesandbox.io/s/react-hook-form-v7-form-context-ytudi)\n *\n * @returns return all useForm methods\n *\n * @example\n * ```tsx\n * function App() {\n * const methods = useForm();\n * const onSubmit = data => console.log(data);\n *\n * return (\n * <FormProvider {...methods} >\n * <form onSubmit={methods.handleSubmit(onSubmit)}>\n * <NestedInput />\n * <input type=\"submit\" />\n * </form>\n * </FormProvider>\n * );\n * }\n *\n * function NestedInput() {\n * const { register } = useFormContext(); // retrieve all hook methods\n * return <input {...register(\"test\")} />;\n * }\n * ```\n */\nconst useFormContext = () => React.useContext(HookFormContext);\n/**\n * A provider component that propagates the `useForm` methods to all children components via [React Context](https://react.dev/reference/react/useContext) API. To be used with {@link useFormContext}.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useformcontext) • [Demo](https://codesandbox.io/s/react-hook-form-v7-form-context-ytudi)\n *\n * @param props - all useForm methods\n *\n * @example\n * ```tsx\n * function App() {\n * const methods = useForm();\n * const onSubmit = data => console.log(data);\n *\n * return (\n * <FormProvider {...methods} >\n * <form onSubmit={methods.handleSubmit(onSubmit)}>\n * <NestedInput />\n * <input type=\"submit\" />\n * </form>\n * </FormProvider>\n * );\n * }\n *\n * function NestedInput() {\n * const { register } = useFormContext(); // retrieve all hook methods\n * return <input {...register(\"test\")} />;\n * }\n * ```\n */\nconst FormProvider = (props) => {\n const { children, watch, getValues, getFieldState, setError, clearErrors, setValue, trigger, formState, resetField, reset, handleSubmit, unregister, control, register, setFocus, subscribe, } = props;\n return (React.createElement(HookFormContext.Provider, { value: React.useMemo(() => ({\n watch,\n getValues,\n getFieldState,\n setError,\n clearErrors,\n setValue,\n trigger,\n formState,\n resetField,\n reset,\n handleSubmit,\n unregister,\n control,\n register,\n setFocus,\n subscribe,\n }), [\n clearErrors,\n control,\n formState,\n getFieldState,\n getValues,\n handleSubmit,\n register,\n reset,\n resetField,\n setError,\n setFocus,\n setValue,\n subscribe,\n trigger,\n unregister,\n watch,\n ]) },\n React.createElement(HookFormControlContext.Provider, { value: control }, children)));\n};\n\nconst POST_REQUEST = 'post';\n/**\n * Form component to manage submission.\n *\n * @param props - to setup submission detail. {@link FormProps}\n *\n * @returns form component or headless render prop.\n *\n * @example\n * ```tsx\n * function App() {\n * const { control, formState: { errors } } = useForm();\n *\n * return (\n * <Form action=\"/api\" control={control}>\n * <input {...register(\"name\")} />\n * <p>{errors?.root?.server && 'Server error'}</p>\n * <button>Submit</button>\n * </Form>\n * );\n * }\n * ```\n */\nfunction Form(props) {\n const methods = useFormContext();\n const [mounted, setMounted] = React.useState(false);\n const { control = methods.control, onSubmit, children, action, method = POST_REQUEST, headers, encType, onError, render, onSuccess, validateStatus, ...rest } = props;\n const submit = async (event) => {\n let hasError = false;\n let type = '';\n await control.handleSubmit(async (data) => {\n const formData = new FormData();\n let formDataJson = '';\n try {\n formDataJson = JSON.stringify(data);\n }\n catch (_a) { }\n const flattenFormValues = flatten(control._formValues);\n for (const key in flattenFormValues) {\n formData.append(key, flattenFormValues[key]);\n }\n if (onSubmit) {\n await onSubmit({\n data,\n event,\n method,\n formData,\n formDataJson,\n });\n }\n if (action) {\n try {\n const shouldStringifySubmissionData = [\n headers && headers['Content-Type'],\n encType,\n ].some((value) => value && value.includes('json'));\n const response = await fetch(String(action), {\n method,\n headers: {\n ...headers,\n ...(encType && encType !== 'multipart/form-data'\n ? { 'Content-Type': encType }\n : {}),\n },\n body: shouldStringifySubmissionData ? formDataJson : formData,\n });\n if (response &&\n (validateStatus\n ? !validateStatus(response.status)\n : response.status < 200 || response.status >= 300)) {\n hasError = true;\n onError && onError({ response });\n type = String(response.status);\n }\n else {\n onSuccess && onSuccess({ response });\n }\n }\n catch (error) {\n hasError = true;\n onError && onError({ error });\n }\n }\n })(event);\n if (hasError && props.control) {\n props.control._subjects.state.next({\n isSubmitSuccessful: false,\n });\n props.control.setError('root.server', {\n type,\n });\n }\n };\n React.useEffect(() => {\n setMounted(true);\n }, []);\n return render ? (React.createElement(React.Fragment, null, render({\n submit,\n }))) : (React.createElement(\"form\", { noValidate: mounted, action: action, method: method, encType: encType, onSubmit: submit, ...rest }, children));\n}\n\nconst FormStateSubscribe = ({ control, disabled, exact, name, render, }) => render(useFormState({ control, name, disabled, exact }));\n\nvar appendErrors = (name, validateAllFieldCriteria, errors, type, message) => validateAllFieldCriteria\n ? {\n ...errors[name],\n types: {\n ...(errors[name] && errors[name].types ? errors[name].types : {}),\n [type]: message || true,\n },\n }\n : {};\n\nvar convertToArrayPayload = (value) => (Array.isArray(value) ? value : [value]);\n\nvar createSubject = () => {\n let _observers = [];\n const next = (value) => {\n for (const observer of _observers) {\n observer.next && observer.next(value);\n }\n };\n const subscribe = (observer) => {\n _observers.push(observer);\n return {\n unsubscribe: () => {\n _observers = _observers.filter((o) => o !== observer);\n },\n };\n };\n const unsubscribe = () => {\n _observers = [];\n };\n return {\n get observers() {\n return _observers;\n },\n next,\n subscribe,\n unsubscribe,\n };\n};\n\nfunction extractFormValues(fieldsState, formValues) {\n const values = {};\n for (const key in fieldsState) {\n if (fieldsState.hasOwnProperty(key)) {\n const fieldState = fieldsState[key];\n const fieldValue = formValues[key];\n if (fieldState && isObject(fieldState) && fieldValue) {\n const nestedFieldsState = extractFormValues(fieldState, fieldValue);\n if (isObject(nestedFieldsState)) {\n values[key] = nestedFieldsState;\n }\n }\n else if (fieldsState[key]) {\n values[key] = fieldValue;\n }\n }\n }\n return values;\n}\n\nvar isEmptyObject = (value) => isObject(value) && !Object.keys(value).length;\n\nvar isFileInput = (element) => element.type === 'file';\n\nvar isHTMLElement = (value) => {\n if (!isWeb) {\n return false;\n }\n const owner = value ? value.ownerDocument : 0;\n return (value instanceof\n (owner && owner.defaultView ? owner.defaultView.HTMLElement : HTMLElement));\n};\n\nvar isMultipleSelect = (element) => element.type === `select-multiple`;\n\nvar isRadioInput = (element) => element.type === 'radio';\n\nvar isRadioOrCheckbox = (ref) => isRadioInput(ref) || isCheckBoxInput(ref);\n\nvar live = (ref) => isHTMLElement(ref) && ref.isConnected;\n\nfunction baseGet(object, updatePath) {\n const length = updatePath.slice(0, -1).length;\n let index = 0;\n while (index < length) {\n object = isUndefined(object) ? index++ : object[updatePath[index++]];\n }\n return object;\n}\nfunction isEmptyArray(obj) {\n for (const key in obj) {\n if (obj.hasOwnProperty(key) && !isUndefined(obj[key])) {\n return false;\n }\n }\n return true;\n}\nfunction unset(object, path) {\n const paths = Array.isArray(path)\n ? path\n : isKey(path)\n ? [path]\n : stringToPath(path);\n const childObject = paths.length === 1 ? object : baseGet(object, paths);\n const index = paths.length - 1;\n const key = paths[index];\n if (childObject) {\n delete childObject[key];\n }\n if (index !== 0 &&\n ((isObject(childObject) && isEmptyObject(childObject)) ||\n (Array.isArray(childObject) && isEmptyArray(childObject)))) {\n unset(object, paths.slice(0, -1));\n }\n return object;\n}\n\nvar objectHasFunction = (data) => {\n for (const key in data) {\n if (isFunction(data[key])) {\n return true;\n }\n }\n return false;\n};\n\nfunction isTraversable(value) {\n return Array.isArray(value) || (isObject(value) && !objectHasFunction(value));\n}\nfunction markFieldsDirty(data, fields = {}) {\n for (const key in data) {\n const value = data[key];\n if (isTraversable(value)) {\n fields[key] = Array.isArray(value) ? [] : {};\n markFieldsDirty(value, fields[key]);\n }\n else if (!isUndefined(value)) {\n fields[key] = true;\n }\n }\n return fields;\n}\nfunction getDirtyFields(data, formValues, dirtyFieldsFromValues) {\n if (!dirtyFieldsFromValues) {\n dirtyFieldsFromValues = markFieldsDirty(formValues);\n }\n for (const key in data) {\n const value = data[key];\n if (isTraversable(value)) {\n if (isUndefined(formValues) || isPrimitive(dirtyFieldsFromValues[key])) {\n dirtyFieldsFromValues[key] = markFieldsDirty(value, Array.isArray(value) ? [] : {});\n }\n else {\n getDirtyFields(value, isNullOrUndefined(formValues) ? {} : formValues[key], dirtyFieldsFromValues[key]);\n }\n }\n else {\n const formValue = formValues[key];\n dirtyFieldsFromValues[key] = !deepEqual(value, formValue);\n }\n }\n return dirtyFieldsFromValues;\n}\n\nconst defaultResult = {\n value: false,\n isValid: false,\n};\nconst validResult = { value: true, isValid: true };\nvar getCheckboxValue = (options) => {\n if (Array.isArray(options)) {\n if (options.length > 1) {\n const values = options\n .filter((option) => option && option.checked && !option.disabled)\n .map((option) => option.value);\n return { value: values, isValid: !!values.length };\n }\n return options[0].checked && !options[0].disabled\n ? // @ts-expect-error expected to work in the browser\n options[0].attributes && !isUndefined(options[0].attributes.value)\n ? isUndefined(options[0].value) || options[0].value === ''\n ? validResult\n : { value: options[0].value, isValid: true }\n : validResult\n : defaultResult;\n }\n return defaultResult;\n};\n\nvar getFieldValueAs = (value, { valueAsNumber, valueAsDate, setValueAs }) => isUndefined(value)\n ? value\n : valueAsNumber\n ? value === ''\n ? NaN\n : value\n ? +value\n : value\n : valueAsDate && isString(value)\n ? new Date(value)\n : setValueAs\n ? setValueAs(value)\n : value;\n\nconst defaultReturn = {\n isValid: false,\n value: null,\n};\nvar getRadioValue = (options) => Array.isArray(options)\n ? options.reduce((previous, option) => option && option.checked && !option.disabled\n ? {\n isValid: true,\n value: option.value,\n }\n : previous, defaultReturn)\n : defaultReturn;\n\nfunction getFieldValue(_f) {\n const ref = _f.ref;\n if (isFileInput(ref)) {\n return ref.files;\n }\n if (isRadioInput(ref)) {\n return getRadioValue(_f.refs).value;\n }\n if (isMultipleSelect(ref)) {\n return [...ref.selectedOptions].map(({ value }) => value);\n }\n if (isCheckBoxInput(ref)) {\n return getCheckboxValue(_f.refs).value;\n }\n return getFieldValueAs(isUndefined(ref.value) ? _f.ref.value : ref.value, _f);\n}\n\nvar getResolverOptions = (fieldsNames, _fields, criteriaMode, shouldUseNativeValidation) => {\n const fields = {};\n for (const name of fieldsNames) {\n const field = get(_fields, name);\n field && set(fields, name, field._f);\n }\n return {\n criteriaMode,\n names: [...fieldsNames],\n fields,\n shouldUseNativeValidation,\n };\n};\n\nvar isRegex = (value) => value instanceof RegExp;\n\nvar getRuleValue = (rule) => isUndefined(rule)\n ? rule\n : isRegex(rule)\n ? rule.source\n : isObject(rule)\n ? isRegex(rule.value)\n ? rule.value.source\n : rule.value\n : rule;\n\nvar getValidationModes = (mode) => ({\n isOnSubmit: !mode || mode === VALIDATION_MODE.onSubmit,\n isOnBlur: mode === VALIDATION_MODE.onBlur,\n isOnChange: mode === VALIDATION_MODE.onChange,\n isOnAll: mode === VALIDATION_MODE.all,\n isOnTouch: mode === VALIDATION_MODE.onTouched,\n});\n\nconst ASYNC_FUNCTION = 'AsyncFunction';\nvar hasPromiseValidation = (fieldReference) => !!fieldReference &&\n !!fieldReference.validate &&\n !!((isFunction(fieldReference.validate) &&\n fieldReference.validate.constructor.name === ASYNC_FUNCTION) ||\n (isObject(fieldReference.validate) &&\n Object.values(fieldReference.validate).find((validateFunction) => validateFunction.constructor.name === ASYNC_FUNCTION)));\n\nvar hasValidation = (options) => options.mount &&\n (options.required ||\n options.min ||\n options.max ||\n options.maxLength ||\n options.minLength ||\n options.pattern ||\n options.validate);\n\nvar isWatched = (name, _names, isBlurEvent) => !isBlurEvent &&\n (_names.watchAll ||\n _names.watch.has(name) ||\n [..._names.watch].some((watchName) => name.startsWith(watchName) &&\n /^\\.\\w+/.test(name.slice(watchName.length))));\n\nconst iterateFieldsByAction = (fields, action, fieldsNames, abortEarly) => {\n for (const key of fieldsNames || Object.keys(fields)) {\n const field = get(fields, key);\n if (field) {\n const { _f, ...currentField } = field;\n if (_f) {\n if (_f.refs && _f.refs[0] && action(_f.refs[0], key) && !abortEarly) {\n return true;\n }\n else if (_f.ref && action(_f.ref, _f.name) && !abortEarly) {\n return true;\n }\n else {\n if (iterateFieldsByAction(currentField, action)) {\n break;\n }\n }\n }\n else if (isObject(currentField)) {\n if (iterateFieldsByAction(currentField, action)) {\n break;\n }\n }\n }\n }\n return;\n};\n\nfunction schemaErrorLookup(errors, _fields, name) {\n const error = get(errors, name);\n if (error || isKey(name)) {\n return {\n error,\n name,\n };\n }\n const names = name.split('.');\n while (names.length) {\n const fieldName = names.join('.');\n const field = get(_fields, fieldName);\n const foundError = get(errors, fieldName);\n if (field && !Array.isArray(field) && name !== fieldName) {\n return { name };\n }\n if (foundError && foundError.type) {\n return {\n name: fieldName,\n error: foundError,\n };\n }\n if (foundError && foundError.root && foundError.root.type) {\n return {\n name: `${fieldName}.root`,\n error: foundError.root,\n };\n }\n names.pop();\n }\n return {\n name,\n };\n}\n\nvar shouldRenderFormState = (formStateData, _proxyFormState, updateFormState, isRoot) => {\n updateFormState(formStateData);\n const { name, ...formState } = formStateData;\n return (isEmptyObject(formState) ||\n Object.keys(formState).length >= Object.keys(_proxyFormState).length ||\n Object.keys(formState).find((key) => _proxyFormState[key] ===\n (!isRoot || VALIDATION_MODE.all)));\n};\n\nvar shouldSubscribeByName = (name, signalName, exact) => !name ||\n !signalName ||\n name === signalName ||\n convertToArrayPayload(name).some((currentName) => currentName &&\n (exact\n ? currentName === signalName\n : currentName.startsWith(signalName) ||\n signalName.startsWith(currentName)));\n\nvar skipValidation = (isBlurEvent, isTouched, isSubmitted, reValidateMode, mode) => {\n if (mode.isOnAll) {\n return false;\n }\n else if (!isSubmitted && mode.isOnTouch) {\n return !(isTouched || isBlurEvent);\n }\n else if (isSubmitted ? reValidateMode.isOnBlur : mode.isOnBlur) {\n return !isBlurEvent;\n }\n else if (isSubmitted ? reValidateMode.isOnChange : mode.isOnChange) {\n return isBlurEvent;\n }\n return true;\n};\n\nvar unsetEmptyArray = (ref, name) => !compact(get(ref, name)).length && unset(ref, name);\n\nvar updateFieldArrayRootError = (errors, error, name) => {\n const fieldArrayErrors = convertToArrayPayload(get(errors, name));\n set(fieldArrayErrors, 'root', error[name]);\n set(errors, name, fieldArrayErrors);\n return errors;\n};\n\nfunction getValidateError(result, ref, type = 'validate') {\n if (isString(result) ||\n (Array.isArray(result) && result.every(isString)) ||\n (isBoolean(result) && !result)) {\n return {\n type,\n message: isString(result) ? result : '',\n ref,\n };\n }\n}\n\nvar getValueAndMessage = (validationData) => isObject(validationData) && !isRegex(validationData)\n ? validationData\n : {\n value: validationData,\n message: '',\n };\n\nvar validateField = async (field, disabledFieldNames, formValues, validateAllFieldCriteria, shouldUseNativeValidation, isFieldArray) => {\n const { ref, refs, required, maxLength, minLength, min, max, pattern, validate, name, valueAsNumber, mount, } = field._f;\n const inputValue = get(formValues, name);\n if (!mount || disabledFieldNames.has(name)) {\n return {};\n }\n const inputRef = refs ? refs[0] : ref;\n const setCustomValidity = (message) => {\n if (shouldUseNativeValidation && inputRef.reportValidity) {\n inputRef.setCustomValidity(isBoolean(message) ? '' : message || '');\n inputRef.reportValidity();\n }\n };\n const error = {};\n const isRadio = isRadioInput(ref);\n const isCheckBox = isCheckBoxInput(ref);\n const isRadioOrCheckbox = isRadio || isCheckBox;\n const isEmpty = ((valueAsNumber || isFileInput(ref)) &&\n isUndefined(ref.value) &&\n isUndefined(inputValue)) ||\n (isHTMLElement(ref) && ref.value === '') ||\n inputValue === '' ||\n (Array.isArray(inputValue) && !inputValue.length);\n const appendErrorsCurry = appendErrors.bind(null, name, validateAllFieldCriteria, error);\n const getMinMaxMessage = (exceedMax, maxLengthMessage, minLengthMessage, maxType = INPUT_VALIDATION_RULES.maxLength, minType = INPUT_VALIDATION_RULES.minLength) => {\n const message = exceedMax ? maxLengthMessage : minLengthMessage;\n error[name] = {\n type: exceedMax ? maxType : minType,\n message,\n ref,\n ...appendErrorsCurry(exceedMax ? maxType : minType, message),\n };\n };\n if (isFieldArray\n ? !Array.isArray(inputValue) || !inputValue.length\n : required &&\n ((!isRadioOrCheckbox && (isEmpty || isNullOrUndefined(inputValue))) ||\n (isBoolean(inputValue) && !inputValue) ||\n (isCheckBox && !getCheckboxValue(refs).isValid) ||\n (isRadio && !getRadioValue(refs).isValid))) {\n const { value, message } = isString(required)\n ? { value: !!required, message: required }\n : getValueAndMessage(required);\n if (value) {\n error[name] = {\n type: INPUT_VALIDATION_RULES.required,\n message,\n ref: inputRef,\n ...appendErrorsCurry(INPUT_VALIDATION_RULES.required, message),\n };\n if (!validateAllFieldCriteria) {\n setCustomValidity(message);\n return error;\n }\n }\n }\n if (!isEmpty && (!isNullOrUndefined(min) || !isNullOrUndefined(max))) {\n let exceedMax;\n let exceedMin;\n const maxOutput = getValueAndMessage(max);\n const minOutput = getValueAndMessage(min);\n if (!isNullOrUndefined(inputValue) && !isNaN(inputValue)) {\n const valueNumber = ref.valueAsNumber ||\n (inputValue ? +inputValue : inputValue);\n if (!isNullOrUndefined(maxOutput.value)) {\n exceedMax = valueNumber > maxOutput.value;\n }\n if (!isNullOrUndefined(minOutput.value)) {\n exceedMin = valueNumber < minOutput.value;\n }\n }\n else {\n const valueDate = ref.valueAsDate || new Date(inputValue);\n const convertTimeToDate = (time) => new Date(new Date().toDateString() + ' ' + time);\n const isTime = ref.type == 'time';\n const isWeek = ref.type == 'week';\n if (isString(maxOutput.value) && inputValue) {\n exceedMax = isTime\n ? convertTimeToDate(inputValue) > convertTimeToDate(maxOutput.value)\n : isWeek\n ? inputValue > maxOutput.value\n : valueDate > new Date(maxOutput.value);\n }\n if (isString(minOutput.value) && inputValue) {\n exceedMin = isTime\n ? convertTimeToDate(inputValue) < convertTimeToDate(minOutput.value)\n : isWeek\n ? inputValue < minOutput.value\n : valueDate < new Date(minOutput.value);\n }\n }\n if (exceedMax || exceedMin) {\n getMinMaxMessage(!!exceedMax, maxOutput.message, minOutput.message, INPUT_VALIDATION_RULES.max, INPUT_VALIDATION_RULES.min);\n if (!validateAllFieldCriteria) {\n setCustomValidity(error[name].message);\n return error;\n }\n }\n }\n if ((maxLength || minLength) &&\n !isEmpty &&\n (isString(inputValue) || (isFieldArray && Array.isArray(inputValue)))) {\n const maxLengthOutput = getValueAndMessage(maxLength);\n const minLengthOutput = getValueAndMessage(minLength);\n const exceedMax = !isNullOrUndefined(maxLengthOutput.value) &&\n inputValue.length > +maxLengthOutput.value;\n const exceedMin = !isNullOrUndefined(minLengthOutput.value) &&\n inputValue.length < +minLengthOutput.value;\n if (exceedMax || exceedMin) {\n getMinMaxMessage(exceedMax, maxLengthOutput.message, minLengthOutput.message);\n if (!validateAllFieldCriteria) {\n setCustomValidity(error[name].message);\n return error;\n }\n }\n }\n if (pattern && !isEmpty && isString(inputValue)) {\n const { value: patternValue, message } = getValueAndMessage(pattern);\n if (isRegex(patternValue) && !inputValue.match(patternValue)) {\n error[name] = {\n type: INPUT_VALIDATION_RULES.pattern,\n message,\n ref,\n ...appendErrorsCurry(INPUT_VALIDATION_RULES.pattern, message),\n };\n if (!validateAllFieldCriteria) {\n setCustomValidity(message);\n return error;\n }\n }\n }\n if (validate) {\n if (isFunction(validate)) {\n const result = await validate(inputValue, formValues);\n const validateError = getValidateError(result, inputRef);\n if (validateError) {\n error[name] = {\n ...validateError,\n ...appendErrorsCurry(INPUT_VALIDATION_RULES.validate, validateError.message),\n };\n if (!validateAllFieldCriteria) {\n setCustomValidity(validateError.message);\n return error;\n }\n }\n }\n else if (isObject(validate)) {\n let validationResult = {};\n for (const key in validate) {\n if (!isEmptyObject(validationResult) && !validateAllFieldCriteria) {\n break;\n }\n const validateError = getValidateError(await validate[key](inputValue, formValues), inputRef, key);\n if (validateError) {\n validationResult = {\n ...validateError,\n ...appendErrorsCurry(key, validateError.message),\n };\n setCustomValidity(validateError.message);\n if (validateAllFieldCriteria) {\n error[name] = validationResult;\n }\n }\n }\n if (!isEmptyObject(validationResult)) {\n error[name] = {\n ref: inputRef,\n ...validationResult,\n };\n if (!validateAllFieldCriteria) {\n return error;\n }\n }\n }\n }\n setCustomValidity(true);\n return error;\n};\n\nconst defaultOptions = {\n mode: VALIDATION_MODE.onSubmit,\n reValidateMode: VALIDATION_MODE.onChange,\n shouldFocusError: true,\n};\nfunction createFormControl(props = {}) {\n let _options = {\n ...defaultOptions,\n ...props,\n };\n let _formState = {\n submitCount: 0,\n isDirty: false,\n isReady: false,\n isLoading: isFunction(_options.defaultValues),\n isValidating: false,\n isSubmitted: false,\n isSubmitting: false,\n isSubmitSuccessful: false,\n isValid: false,\n touchedFields: {},\n dirtyFields: {},\n validatingFields: {},\n errors: _options.errors || {},\n disabled: _options.disabled || false,\n };\n let _fields = {};\n let _defaultValues = isObject(_options.defaultValues) || isObject(_options.values)\n ? cloneObject(_options.defaultValues || _options.values) || {}\n : {};\n let _formValues = _options.shouldUnregister\n ? {}\n : cloneObject(_defaultValues);\n let _state = {\n action: false,\n mount: false,\n watch: false,\n keepIsValid: false,\n };\n let _names = {\n mount: new Set(),\n disabled: new Set(),\n unMount: new Set(),\n array: new Set(),\n watch: new Set(),\n };\n let delayErrorCallback;\n let timer = 0;\n const defaultProxyFormState = {\n isDirty: false,\n dirtyFields: false,\n validatingFields: false,\n touchedFields: false,\n isValidating: false,\n isValid: false,\n errors: false,\n };\n const _proxyFormState = {\n ...defaultProxyFormState,\n };\n let _proxySubscribeFormState = {\n ..._proxyFormState,\n };\n const _subjects = {\n array: createSubject(),\n state: createSubject(),\n };\n const shouldDisplayAllAssociatedErrors = _options.criteriaMode === VALIDATION_MODE.all;\n const debounce = (callback) => (wait) => {\n clearTimeout(timer);\n timer = setTimeout(callback, wait);\n };\n const _setValid = async (shouldUpdateValid) => {\n if (_state.keepIsValid) {\n return;\n }\n if (!_options.disabled &&\n (_proxyFormState.isValid ||\n _proxySubscribeFormState.isValid ||\n shouldUpdateValid)) {\n let isValid;\n if (_options.resolver) {\n isValid = isEmptyObject((await _runSchema()).errors);\n _updateIsValidating();\n }\n else {\n isValid = await executeBuiltInValidation(_fields, true);\n }\n if (isValid !== _formState.isValid) {\n _subjects.state.next({\n isValid,\n });\n }\n }\n };\n const _updateIsValidating = (names, isValidating) => {\n if (!_options.disabled &&\n (_proxyFormState.isValidating ||\n _proxyFormState.validatingFields ||\n _proxySubscribeFormState.isValidating ||\n _proxySubscribeFormState.validatingFields)) {\n (names || Array.from(_names.mount)).forEach((name) => {\n if (name) {\n isValidating\n ? set(_formState.validatingFields, name, isValidating)\n : unset(_formState.validatingFields, name);\n }\n });\n _subjects.state.next({\n validatingFields: _formState.validatingFields,\n isValidating: !isEmptyObject(_formState.validatingFields),\n });\n }\n };\n const _setFieldArray = (name, values = [], method, args, shouldSetValues = true, shouldUpdateFieldsAndState = true) => {\n if (args && method && !_options.disabled) {\n _state.action = true;\n if (shouldUpdateFieldsAndState && Array.isArray(get(_fields, name))) {\n const fieldValues = method(get(_fields, name), args.argA, args.argB);\n shouldSetValues && set(_fields, name, fieldValues);\n }\n if (shouldUpdateFieldsAndState &&\n Array.isArray(get(_formState.errors, name))) {\n const errors = method(get(_formState.errors, name), args.argA, args.argB);\n shouldSetValues && set(_formState.errors, name, errors);\n unsetEmptyArray(_formState.errors, name);\n }\n if ((_proxyFormState.touchedFields ||\n _proxySubscribeFormState.touchedFields) &&\n shouldUpdateFieldsAndState &&\n Array.isArray(get(_formState.touchedFields, name))) {\n const touchedFields = method(get(_formState.touchedFields, name), args.argA, args.argB);\n shouldSetValues && set(_formState.touchedFields, name, touchedFields);\n }\n if (_proxyFormState.dirtyFields || _proxySubscribeFormState.dirtyFields) {\n _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);\n }\n _subjects.state.next({\n name,\n isDirty: _getDirty(name, values),\n dirtyFields: _formState.dirtyFields,\n errors: _formState.errors,\n isValid: _formState.isValid,\n });\n }\n else {\n set(_formValues, name, values);\n }\n };\n const updateErrors = (name, error) => {\n set(_formState.errors, name, error);\n _subjects.state.next({\n errors: _formState.errors,\n });\n };\n const _setErrors = (errors) => {\n _formState.errors = errors;\n _subjects.state.next({\n errors: _formState.errors,\n isValid: false,\n });\n };\n const updateValidAndValue = (name, shouldSkipSetValueAs, value, ref) => {\n const field = get(_fields, name);\n if (field) {\n const defaultValue = get(_formValues, name, isUndefined(value) ? get(_defaultValues, name) : value);\n isUndefined(defaultValue) ||\n (ref && ref.defaultChecked) ||\n shouldSkipSetValueAs\n ? set(_formValues, name, shouldSkipSetValueAs ? defaultValue : getFieldValue(field._f))\n : setFieldValue(name, defaultValue);\n _state.mount && !_state.action && _setValid();\n }\n };\n const updateTouchAndDirty = (name, fieldValue, isBlurEvent, shouldDirty, shouldRender) => {\n let shouldUpdateField = false;\n let isPreviousDirty = false;\n const output = {\n name,\n };\n if (!_options.disabled) {\n if (!isBlurEvent || shouldDirty) {\n if (_proxyFormState.isDirty || _proxySubscribeFormState.isDirty) {\n isPreviousDirty = _formState.isDirty;\n _formState.isDirty = output.isDirty = _getDirty();\n shouldUpdateField = isPreviousDirty !== output.isDirty;\n }\n const isCurrentFieldPristine = deepEqual(get(_defaultValues, name), fieldValue);\n isPreviousDirty = !!get(_formState.dirtyFields, name);\n isCurrentFieldPristine\n ? unset(_formState.dirtyFields, name)\n : set(_formState.dirtyFields, name, true);\n output.dirtyFields = _formState.dirtyFields;\n shouldUpdateField =\n shouldUpdateField ||\n ((_proxyFormState.dirtyFields ||\n _proxySubscribeFormState.dirtyFields) &&\n isPreviousDirty !== !isCurrentFieldPristine);\n }\n if (isBlurEvent) {\n const isPreviousFieldTouched = get(_formState.touchedFields, name);\n if (!isPreviousFieldTouched) {\n set(_formState.touchedFields, name, isBlurEvent);\n output.touchedFields = _formState.touchedFields;\n shouldUpdateField =\n shouldUpdateField ||\n ((_proxyFormState.touchedFields ||\n _proxySubscribeFormState.touchedFields) &&\n isPreviousFieldTouched !== isBlurEvent);\n }\n }\n shouldUpdateField && shouldRender && _subjects.state.next(output);\n }\n return shouldUpdateField ? output : {};\n };\n const shouldRenderByError = (name, isValid, error, fieldState) => {\n const previousFieldError = get(_formState.errors, name);\n const shouldUpdateValid = (_proxyFormState.isValid || _proxySubscribeFormState.isValid) &&\n isBoolean(isValid) &&\n _formState.isValid !== isValid;\n if (_options.delayError && error) {\n delayErrorCallback = debounce(() => updateErrors(name, error));\n delayErrorCallback(_options.delayError);\n }\n else {\n clearTimeout(timer);\n delayErrorCallback = null;\n error\n ? set(_formState.errors, name, error)\n : unset(_formState.errors, name);\n }\n if ((error ? !deepEqual(previousFieldError, error) : previousFieldError) ||\n !isEmptyObject(fieldState) ||\n shouldUpdateValid) {\n const updatedFormState = {\n ...fieldState,\n ...(shouldUpdateValid && isBoolean(isValid) ? { isValid } : {}),\n errors: _formState.errors,\n name,\n };\n _formState = {\n ..._formState,\n ...updatedFormState,\n };\n _subjects.state.next(updatedFormState);\n }\n };\n const _runSchema = async (name) => {\n _updateIsValidating(name, true);\n const result = await _options.resolver(_formValues, _options.context, getResolverOptions(name || _names.mount, _fields, _options.criteriaMode, _options.shouldUseNativeValidation));\n return result;\n };\n const executeSchemaAndUpdateState = async (names) => {\n const { errors } = await _runSchema(names);\n _updateIsValidating(names);\n if (names) {\n for (const name of names) {\n const error = get(errors, name);\n error\n ? set(_formState.errors, name, error)\n : unset(_formState.errors, name);\n }\n }\n else {\n _formState.errors = errors;\n }\n return errors;\n };\n const executeBuiltInValidation = async (fields, shouldOnlyCheckValid, context = {\n valid: true,\n }) => {\n for (const name in fields) {\n const field = fields[name];\n if (field) {\n const { _f, ...fieldValue } = field;\n if (_f) {\n const isFieldArrayRoot = _names.array.has(_f.name);\n const isPromiseFunction = field._f && hasPromiseValidation(field._f);\n if (isPromiseFunction && _proxyFormState.validatingFields) {\n _updateIsValidating([_f.name], true);\n }\n const fieldError = await validateField(field, _names.disabled, _formValues, shouldDisplayAllAssociatedErrors, _options.shouldUseNativeValidation && !shouldOnlyCheckValid, isFieldArrayRoot);\n if (isPromiseFunction && _proxyFormState.validatingFields) {\n _updateIsValidating([_f.name]);\n }\n if (fieldError[_f.name]) {\n context.valid = false;\n if (shouldOnlyCheckValid || props.shouldUseNativeValidation) {\n break;\n }\n }\n !shouldOnlyCheckValid &&\n (get(fieldError, _f.name)\n ? isFieldArrayRoot\n ? updateFieldArrayRootError(_formState.errors, fieldError, _f.name)\n : set(_formState.errors, _f.name, fieldError[_f.name])\n : unset(_formState.errors, _f.name));\n }\n !isEmptyObject(fieldValue) &&\n (await executeBuiltInValidation(fieldValue, shouldOnlyCheckValid, context));\n }\n }\n return context.valid;\n };\n const _removeUnmounted = () => {\n for (const name of _names.unMount) {\n const field = get(_fields, name);\n field &&\n (field._f.refs\n ? field._f.refs.every((ref) => !live(ref))\n : !live(field._f.ref)) &&\n unregister(name);\n }\n _names.unMount = new Set();\n };\n const _getDirty = (name, data) => !_options.disabled &&\n (name && data && set(_formValues, name, data),\n !deepEqual(getValues(), _defaultValues));\n const _getWatch = (names, defaultValue, isGlobal) => generateWatchOutput(names, _names, {\n ...(_state.mount\n ? _formValues\n : isUndefined(defaultValue)\n ? _defaultValues\n : isString(names)\n ? { [names]: defaultValue }\n : defaultValue),\n }, isGlobal, defaultValue);\n const _getFieldArray = (name) => compact(get(_state.mount ? _formValues : _defaultValues, name, _options.shouldUnregister ? get(_defaultValues, name, []) : []));\n const setFieldValue = (name, value, options = {}) => {\n const field = get(_fields, name);\n let fieldValue = value;\n if (field) {\n const fieldReference = field._f;\n if (fieldReference) {\n !fieldReference.disabled &&\n set(_formValues, name, getFieldValueAs(value, fieldReference));\n fieldValue =\n isHTMLElement(fieldReference.ref) && isNullOrUndefined(value)\n ? ''\n : value;\n if (isMultipleSelect(fieldReference.ref)) {\n [...fieldReference.ref.options].forEach((optionRef) => (optionRef.selected = fieldValue.includes(optionRef.value)));\n }\n else if (fieldReference.refs) {\n if (isCheckBoxInput(fieldReference.ref)) {\n fieldReference.refs.forEach((checkboxRef) => {\n if (!checkboxRef.defaultChecked || !checkboxRef.disabled) {\n if (Array.isArray(fieldValue)) {\n checkboxRef.checked = !!fieldValue.find((data) => data === checkboxRef.value);\n }\n else {\n checkboxRef.checked =\n fieldValue === checkboxRef.value || !!fieldValue;\n }\n }\n });\n }\n else {\n fieldReference.refs.forEach((radioRef) => (radioRef.checked = radioRef.value === fieldValue));\n }\n }\n else if (isFileInput(fieldReference.ref)) {\n fieldReference.ref.value = '';\n }\n else {\n fieldReference.ref.value = fieldValue;\n if (!fieldReference.ref.type) {\n _subjects.state.next({\n name,\n values: cloneObject(_formValues),\n });\n }\n }\n }\n }\n (options.shouldDirty || options.shouldTouch) &&\n updateTouchAndDirty(name, fieldValue, options.shouldTouch, options.shouldDirty, true);\n options.shouldValidate && trigger(name);\n };\n const setValues = (name, value, options) => {\n for (const fieldKey in value) {\n if (!value.hasOwnProperty(fieldKey)) {\n return;\n }\n const fieldValue = value[fieldKey];\n const fieldName = name + '.' + fieldKey;\n const field = get(_fields, fieldName);\n (_names.array.has(name) ||\n isObject(fieldValue) ||\n (field && !field._f)) &&\n !isDateObject(fieldValue)\n ? setValues(fieldName, fieldValue, options)\n : setFieldValue(fieldName, fieldValue, options);\n }\n };\n const setValue = (name, value, options = {}) => {\n const field = get(_fields, name);\n const isFieldArray = _names.array.has(name);\n const cloneValue = cloneObject(value);\n set(_formValues, name, cloneValue);\n if (isFieldArray) {\n _subjects.array.next({\n name,\n values: cloneObject(_formValues),\n });\n if ((_proxyFormState.isDirty ||\n _proxyFormState.dirtyFields ||\n _proxySubscribeFormState.isDirty ||\n _proxySubscribeFormState.dirtyFields) &&\n options.shouldDirty) {\n _subjects.state.next({\n name,\n dirtyFields: getDirtyFields(_defaultValues, _formValues),\n isDirty: _getDirty(name, cloneValue),\n });\n }\n }\n else {\n field && !field._f && !isNullOrUndefined(cloneValue)\n ? setValues(name, cloneValue, options)\n : setFieldValue(name, cloneValue, options);\n }\n if (isWatched(name, _names)) {\n _subjects.state.next({\n ..._formState,\n name,\n values: cloneObject(_formValues),\n });\n }\n else {\n _subjects.state.next({\n name: _state.mount ? name : undefined,\n values: cloneObject(_formValues),\n });\n }\n };\n const onChange = async (event) => {\n _state.mount = true;\n const target = event.target;\n let name = target.name;\n let isFieldValueUpdated = true;\n const field = get(_fields, name);\n const _updateIsFieldValueUpdated = (fieldValue) => {\n isFieldValueUpdated =\n Number.isNaN(fieldValue) ||\n (isDateObject(fieldValue) && isNaN(fieldValue.getTime())) ||\n deepEqual(fieldValue, get(_formValues, name, fieldValue));\n };\n const validationModeBeforeSubmit = getValidationModes(_options.mode);\n const validationModeAfterSubmit = getValidationModes(_options.reValidateMode);\n if (field) {\n let error;\n let isValid;\n const fieldValue = target.type\n ? getFieldValue(field._f)\n : getEventValue(event);\n const isBlurEvent = event.type === EVENTS.BLUR || event.type === EVENTS.FOCUS_OUT;\n const shouldSkipValidation = (!hasValidation(field._f) &&\n !_options.resolver &&\n !get(_formState.errors, name) &&\n !field._f.deps) ||\n skipValidation(isBlurEvent, get(_formState.touchedFields, name), _formState.isSubmitted, validationModeAfterSubmit, validationModeBeforeSubmit);\n const watched = isWatched(name, _names, isBlurEvent);\n set(_formValues, name, fieldValue);\n if (isBlurEvent) {\n if (!target || !target.readOnly) {\n field._f.onBlur && field._f.onBlur(event);\n delayErrorCallback && delayErrorCallback(0);\n }\n }\n else if (field._f.onChange) {\n field._f.onChange(event);\n }\n const fieldState = updateTouchAndDirty(name, fieldValue, isBlurEvent);\n const shouldRender = !isEmptyObject(fieldState) || watched;\n !isBlurEvent &&\n _subjects.state.next({\n name,\n type: event.type,\n values: cloneObject(_formValues),\n });\n if (shouldSkipValidation) {\n if (_proxyFormState.isValid || _proxySubscribeFormState.isValid) {\n if (_options.mode === 'onBlur') {\n if (isBlurEvent) {\n _setValid();\n }\n }\n else if (!isBlurEvent) {\n _setValid();\n }\n }\n return (shouldRender &&\n _subjects.state.next({ name, ...(watched ? {} : fieldState) }));\n }\n !isBlurEvent && watched && _subjects.state.next({ ..._formState });\n if (_options.resolver) {\n const { errors } = await _runSchema([name]);\n _updateIsValidating([name]);\n _updateIsFieldValueUpdated(fieldValue);\n if (isFieldValueUpdated) {\n const previousErrorLookupResult = schemaErrorLookup(_formState.errors, _fields, name);\n const errorLookupResult = schemaErrorLookup(errors, _fields, previousErrorLookupResult.name || name);\n error = errorLookupResult.error;\n name = errorLookupResult.name;\n isValid = isEmptyObject(errors);\n }\n }\n else {\n _updateIsValidating([name], true);\n error = (await validateField(field, _names.disabled, _formValues, shouldDisplayAllAssociatedErrors, _options.shouldUseNativeValidation))[name];\n _updateIsValidating([name]);\n _updateIsFieldValueUpdated(fieldValue);\n if (isFieldValueUpdated) {\n if (error) {\n isValid = false;\n }\n else if (_proxyFormState.isValid ||\n _proxySubscribeFormState.isValid) {\n isValid = await executeBuiltInValidation(_fields, true);\n }\n }\n }\n if (isFieldValueUpdated) {\n field._f.deps &&\n (!Array.isArray(field._f.deps) || field._f.deps.length > 0) &&\n trigger(field._f.deps);\n shouldRenderByError(name, isValid, error, fieldState);\n }\n }\n };\n const _focusInput = (ref, key) => {\n if (get(_formState.errors, key) && ref.focus) {\n ref.focus();\n return 1;\n }\n return;\n };\n const trigger = async (name, options = {}) => {\n let isValid;\n let validationResult;\n const fieldNames = convertToArrayPayload(name);\n if (_options.resolver) {\n const errors = await executeSchemaAndUpdateState(isUndefined(name) ? name : fieldNames);\n isValid = isEmptyObject(errors);\n validationResult = name\n ? !fieldNames.some((name) => get(errors, name))\n : isValid;\n }\n else if (name) {\n validationResult = (await Promise.all(fieldNames.map(async (fieldName) => {\n const field = get(_fields, fieldName);\n return await executeBuiltInValidation(field && field._f ? { [fieldName]: field } : field);\n }))).every(Boolean);\n !(!validationResult && !_formState.isValid) && _setValid();\n }\n else {\n validationResult = isValid = await executeBuiltInValidation(_fields);\n }\n _subjects.state.next({\n ...(!isString(name) ||\n ((_proxyFormState.isValid || _proxySubscribeFormState.isValid) &&\n isValid !== _formState.isValid)\n ? {}\n : { name }),\n ...(_options.resolver || !name ? { isValid } : {}),\n errors: _formState.errors,\n });\n options.shouldFocus &&\n !validationResult &&\n iterateFieldsByAction(_fields, _focusInput, name ? fieldNames : _names.mount);\n return validationResult;\n };\n const getValues = (fieldNames, config) => {\n let values = {\n ...(_state.mount ? _formValues : _defaultValues),\n };\n if (config) {\n values = extractFormValues(config.dirtyFields ? _formState.dirtyFields : _formState.touchedFields, values);\n }\n return isUndefined(fieldNames)\n ? values\n : isString(fieldNames)\n ? get(values, fieldNames)\n : fieldNames.map((name) => get(values, name));\n };\n const getFieldState = (name, formState) => ({\n invalid: !!get((formState || _formState).errors, name),\n isDirty: !!get((formState || _formState).dirtyFields, name),\n error: get((formState || _formState).errors, name),\n isValidating: !!get(_formState.validatingFields, name),\n isTouched: !!get((formState || _formState).touchedFields, name),\n });\n const clearErrors = (name) => {\n const names = name ? convertToArrayPayload(name) : undefined;\n names === null || names === void 0 ? void 0 : names.forEach((inputName) => unset(_formState.errors, inputName));\n if (names) {\n // Emit for each cleared field with the field name so that\n // shouldSubscribeByName can filter and avoid broad re-renders\n names.forEach((inputName) => {\n _subjects.state.next({\n name: inputName,\n errors: _formState.errors,\n });\n });\n }\n else {\n // Clear all errors - emit without name to notify all subscribers\n _subjects.state.next({\n errors: {},\n });\n }\n };\n const setError = (name, error, options) => {\n const ref = (get(_fields, name, { _f: {} })._f || {}).ref;\n const currentError = get(_formState.errors, name) || {};\n // Don't override existing error messages elsewhere in the object tree.\n const { ref: currentRef, message, type, ...restOfErrorTree } = currentError;\n set(_formState.errors, name, {\n ...restOfErrorTree,\n ...error,\n ref,\n });\n _subjects.state.next({\n name,\n errors: _formState.errors,\n isValid: false,\n });\n options && options.shouldFocus && ref && ref.focus && ref.focus();\n };\n const watch = (name, defaultValue) => isFunction(name)\n ? _subjects.state.subscribe({\n next: (payload) => 'values' in payload &&\n name(_getWatch(undefined, defaultValue), payload),\n })\n : _getWatch(name, defaultValue, true);\n const _subscribe = (props) => _subjects.state.subscribe({\n next: (formState) => {\n if (shouldSubscribeByName(props.name, formState.name, props.exact) &&\n shouldRenderFormState(formState, props.formState || _proxyFormState, _setFormState, props.reRenderRoot)) {\n props.callback({\n values: { ..._formValues },\n ..._formState,\n ...formState,\n defaultValues: _defaultValues,\n });\n }\n },\n }).unsubscribe;\n const subscribe = (props) => {\n _state.mount = true;\n _proxySubscribeFormState = {\n ..._proxySubscribeFormState,\n ...props.formState,\n };\n return _subscribe({\n ...props,\n formState: {\n ...defaultProxyFormState,\n ...props.formState,\n },\n });\n };\n const unregister = (name, options = {}) => {\n for (const fieldName of name ? convertToArrayPayload(name) : _names.mount) {\n _names.mount.delete(fieldName);\n _names.array.delete(fieldName);\n if (!options.keepValue) {\n unset(_fields, fieldName);\n unset(_formValues, fieldName);\n }\n !options.keepError && unset(_formState.errors, fieldName);\n !options.keepDirty && unset(_formState.dirtyFields, fieldName);\n !options.keepTouched && unset(_formState.touchedFields, fieldName);\n !options.keepIsValidating &&\n unset(_formState.validatingFields, fieldName);\n !_options.shouldUnregister &&\n !options.keepDefaultValue &&\n unset(_defaultValues, fieldName);\n }\n _subjects.state.next({\n values: cloneObject(_formValues),\n });\n _subjects.state.next({\n ..._formState,\n ...(!options.keepDirty ? {} : { isDirty: _getDirty() }),\n });\n !options.keepIsValid && _setValid();\n };\n const _setDisabledField = ({ disabled, name, }) => {\n if ((isBoolean(disabled) && _state.mount) ||\n !!disabled ||\n _names.disabled.has(name)) {\n const wasDisabled = _names.disabled.has(name);\n const isDisabled = !!disabled;\n const disabledStateChanged = wasDisabled !== isDisabled;\n disabled ? _names.disabled.add(name) : _names.disabled.delete(name);\n disabledStateChanged && _state.mount && !_state.action && _setValid();\n }\n };\n const register = (name, options = {}) => {\n let field = get(_fields, name);\n const disabledIsDefined = isBoolean(options.disabled) || isBoolean(_options.disabled);\n set(_fields, name, {\n ...(field || {}),\n _f: {\n ...(field && field._f ? field._f : { ref: { name } }),\n name,\n mount: true,\n ...options,\n },\n });\n _names.mount.add(name);\n if (field) {\n _setDisabledField({\n disabled: isBoolean(options.disabled)\n ? options.disabled\n : _options.disabled,\n name,\n });\n }\n else {\n updateValidAndValue(name, true, options.value);\n }\n return {\n ...(disabledIsDefined\n ? { disabled: options.disabled || _options.disabled }\n : {}),\n ...(_options.progressive\n ? {\n required: !!options.required,\n min: getRuleValue(options.min),\n max: getRuleValue(options.max),\n minLength: getRuleValue(options.minLength),\n maxLength: getRuleValue(options.maxLength),\n pattern: getRuleValue(options.pattern),\n }\n : {}),\n name,\n onChange,\n onBlur: onChange,\n ref: (ref) => {\n if (ref) {\n register(name, options);\n field = get(_fields, name);\n const fieldRef = isUndefined(ref.value)\n ? ref.querySelectorAll\n ? ref.querySelectorAll('input,select,textarea')[0] || ref\n : ref\n : ref;\n const radioOrCheckbox = isRadioOrCheckbox(fieldRef);\n const refs = field._f.refs || [];\n if (radioOrCheckbox\n ? refs.find((option) => option === fieldRef)\n : fieldRef === field._f.ref) {\n return;\n }\n set(_fields, name, {\n _f: {\n ...field._f,\n ...(radioOrCheckbox\n ? {\n refs: [\n ...refs.filter(live),\n fieldRef,\n ...(Array.isArray(get(_defaultValues, name)) ? [{}] : []),\n ],\n ref: { type: fieldRef.type, name },\n }\n : { ref: fieldRef }),\n },\n });\n updateValidAndValue(name, false, undefined, fieldRef);\n }\n else {\n field = get(_fields, name, {});\n if (field._f) {\n field._f.mount = false;\n }\n (_options.shouldUnregister || options.shouldUnregister) &&\n !(isNameInFieldArray(_names.array, name) && _state.action) &&\n _names.unMount.add(name);\n }\n },\n };\n };\n const _focusError = () => _options.shouldFocusError &&\n iterateFieldsByAction(_fields, _focusInput, _names.mount);\n const _disableForm = (disabled) => {\n if (isBoolean(disabled)) {\n _subjects.state.next({ disabled });\n iterateFieldsByAction(_fields, (ref, name) => {\n const currentField = get(_fields, name);\n if (currentField) {\n ref.disabled = currentField._f.disabled || disabled;\n if (Array.isArray(currentField._f.refs)) {\n currentField._f.refs.forEach((inputRef) => {\n inputRef.disabled = currentField._f.disabled || disabled;\n });\n }\n }\n }, 0, false);\n }\n };\n const handleSubmit = (onValid, onInvalid) => async (e) => {\n let onValidError = undefined;\n if (e) {\n e.preventDefault && e.preventDefault();\n e.persist &&\n e.persist();\n }\n let fieldValues = cloneObject(_formValues);\n _subjects.state.next({\n isSubmitting: true,\n });\n if (_options.resolver) {\n const { errors, values } = await _runSchema();\n _updateIsValidating();\n _formState.errors = errors;\n fieldValues = cloneObject(values);\n }\n else {\n await executeBuiltInValidation(_fields);\n }\n if (_names.disabled.size) {\n for (const name of _names.disabled) {\n unset(fieldValues, name);\n }\n }\n unset(_formState.errors, 'root');\n if (isEmptyObject(_formState.errors)) {\n _subjects.state.next({\n errors: {},\n });\n try {\n await onValid(fieldValues, e);\n }\n catch (error) {\n onValidError = error;\n }\n }\n else {\n if (onInvalid) {\n await onInvalid({ ..._formState.errors }, e);\n }\n _focusError();\n setTimeout(_focusError);\n }\n _subjects.state.next({\n isSubmitted: true,\n isSubmitting: false,\n isSubmitSuccessful: isEmptyObject(_formState.errors) && !onValidError,\n submitCount: _formState.submitCount + 1,\n errors: _formState.errors,\n });\n if (onValidError) {\n throw onValidError;\n }\n };\n const resetField = (name, options = {}) => {\n if (get(_fields, name)) {\n if (isUndefined(options.defaultValue)) {\n setValue(name, cloneObject(get(_defaultValues, name)));\n }\n else {\n setValue(name, options.defaultValue);\n set(_defaultValues, name, cloneObject(options.defaultValue));\n }\n if (!options.keepTouched) {\n unset(_formState.touchedFields, name);\n }\n if (!options.keepDirty) {\n unset(_formState.dirtyFields, name);\n _formState.isDirty = options.defaultValue\n ? _getDirty(name, cloneObject(get(_defaultValues, name)))\n : _getDirty();\n }\n if (!options.keepError) {\n unset(_formState.errors, name);\n _proxyFormState.isValid && _setValid();\n }\n _subjects.state.next({ ..._formState });\n }\n };\n const _reset = (formValues, keepStateOptions = {}) => {\n const updatedValues = formValues ? cloneObject(formValues) : _defaultValues;\n const cloneUpdatedValues = cloneObject(updatedValues);\n const isEmptyResetValues = isEmptyObject(formValues);\n const values = isEmptyResetValues ? _defaultValues : cloneUpdatedValues;\n if (!keepStateOptions.keepDefaultValues) {\n _defaultValues = updatedValues;\n }\n if (!keepStateOptions.keepValues) {\n if (keepStateOptions.keepDirtyValues) {\n const fieldsToCheck = new Set([\n ..._names.mount,\n ...Object.keys(getDirtyFields(_defaultValues, _formValues)),\n ]);\n for (const fieldName of Array.from(fieldsToCheck)) {\n const isDirty = get(_formState.dirtyFields, fieldName);\n const existingValue = get(_formValues, fieldName);\n const newValue = get(values, fieldName);\n if (isDirty && !isUndefined(existingValue)) {\n set(values, fieldName, existingValue);\n }\n else if (!isDirty && !isUndefined(newValue)) {\n setValue(fieldName, newValue);\n }\n }\n }\n else {\n if (isWeb && isUndefined(formValues)) {\n for (const name of _names.mount) {\n const field = get(_fields, name);\n if (field && field._f) {\n const fieldReference = Array.isArray(field._f.refs)\n ? field._f.refs[0]\n : field._f.ref;\n if (isHTMLElement(fieldReference)) {\n const form = fieldReference.closest('form');\n if (form) {\n form.reset();\n break;\n }\n }\n }\n }\n }\n if (keepStateOptions.keepFieldsRef) {\n for (const fieldName of _names.mount) {\n setValue(fieldName, get(values, fieldName));\n }\n }\n else {\n _fields = {};\n }\n }\n _formValues = _options.shouldUnregister\n ? keepStateOptions.keepDefaultValues\n ? cloneObject(_defaultValues)\n : {}\n : cloneObject(values);\n _subjects.array.next({\n values: { ...values },\n });\n _subjects.state.next({\n values: { ...values },\n });\n }\n _names = {\n mount: keepStateOptions.keepDirtyValues ? _names.mount : new Set(),\n unMount: new Set(),\n array: new Set(),\n disabled: new Set(),\n watch: new Set(),\n watchAll: false,\n focus: '',\n };\n _state.mount =\n !_proxyFormState.isValid ||\n !!keepStateOptions.keepIsValid ||\n !!keepStateOptions.keepDirtyValues ||\n (!_options.shouldUnregister && !isEmptyObject(values));\n _state.watch = !!_options.shouldUnregister;\n _state.keepIsValid = !!keepStateOptions.keepIsValid;\n _state.action = false;\n // Clear errors synchronously to prevent validation errors on subsequent submissions\n // This fixes the issue where form.reset() causes validation errors on subsequent\n // submissions in Next.js 16 with Server Actions\n if (!keepStateOptions.keepErrors) {\n _formState.errors = {};\n }\n _subjects.state.next({\n submitCount: keepStateOptions.keepSubmitCount\n ? _formState.submitCount\n : 0,\n isDirty: isEmptyResetValues\n ? false\n : keepStateOptions.keepDirty\n ? _formState.isDirty\n : !!(keepStateOptions.keepDefaultValues &&\n !deepEqual(formValues, _defaultValues)),\n isSubmitted: keepStateOptions.keepIsSubmitted\n ? _formState.isSubmitted\n : false,\n dirtyFields: isEmptyResetValues\n ? {}\n : keepStateOptions.keepDirtyValues\n ? keepStateOptions.keepDefaultValues && _formValues\n ? getDirtyFields(_defaultValues, _formValues)\n : _formState.dirtyFields\n : keepStateOptions.keepDefaultValues && formValues\n ? getDirtyFields(_defaultValues, formValues)\n : keepStateOptions.keepDirty\n ? _formState.dirtyFields\n : {},\n touchedFields: keepStateOptions.keepTouched\n ? _formState.touchedFields\n : {},\n errors: keepStateOptions.keepErrors ? _formState.errors : {},\n isSubmitSuccessful: keepStateOptions.keepIsSubmitSuccessful\n ? _formState.isSubmitSuccessful\n : false,\n isSubmitting: false,\n defaultValues: _defaultValues,\n });\n };\n const reset = (formValues, keepStateOptions) => _reset(isFunction(formValues)\n ? formValues(_formValues)\n : formValues, { ..._options.resetOptions, ...keepStateOptions });\n const setFocus = (name, options = {}) => {\n const field = get(_fields, name);\n const fieldReference = field && field._f;\n if (fieldReference) {\n const fieldRef = fieldReference.refs\n ? fieldReference.refs[0]\n : fieldReference.ref;\n if (fieldRef.focus) {\n // Use setTimeout to ensure focus happens after any pending state updates\n // This fixes the issue where setFocus doesn't work immediately after setError\n setTimeout(() => {\n fieldRef.focus();\n options.shouldSelect &&\n isFunction(fieldRef.select) &&\n fieldRef.select();\n });\n }\n }\n };\n const _setFormState = (updatedFormState) => {\n _formState = {\n ..._formState,\n ...updatedFormState,\n };\n };\n const _resetDefaultValues = () => isFunction(_options.defaultValues) &&\n _options.defaultValues().then((values) => {\n reset(values, _options.resetOptions);\n _subjects.state.next({\n isLoading: false,\n });\n });\n const methods = {\n control: {\n register,\n unregister,\n getFieldState,\n handleSubmit,\n setError,\n _subscribe,\n _runSchema,\n _updateIsValidating,\n _focusError,\n _getWatch,\n _getDirty,\n _setValid,\n _setFieldArray,\n _setDisabledField,\n _setErrors,\n _getFieldArray,\n _reset,\n _resetDefaultValues,\n _removeUnmounted,\n _disableForm,\n _subjects,\n _proxyFormState,\n get _fields() {\n return _fields;\n },\n get _formValues() {\n return _formValues;\n },\n get _state() {\n return _state;\n },\n set _state(value) {\n _state = value;\n },\n get _defaultValues() {\n return _defaultValues;\n },\n get _names() {\n return _names;\n },\n set _names(value) {\n _names = value;\n },\n get _formState() {\n return _formState;\n },\n get _options() {\n return _options;\n },\n set _options(value) {\n _options = {\n ..._options,\n ...value,\n };\n },\n },\n subscribe,\n trigger,\n register,\n handleSubmit,\n watch,\n setValue,\n getValues,\n reset,\n resetField,\n clearErrors,\n unregister,\n setError,\n setFocus,\n getFieldState,\n };\n return {\n ...methods,\n formControl: methods,\n };\n}\n\nvar generateId = () => {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n const d = typeof performance === 'undefined' ? Date.now() : performance.now() * 1000;\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = ((Math.random() * 16 + d) % 16) | 0;\n return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16);\n });\n};\n\nvar getFocusFieldName = (name, index, options = {}) => options.shouldFocus || isUndefined(options.shouldFocus)\n ? options.focusName ||\n `${name}.${isUndefined(options.focusIndex) ? index : options.focusIndex}.`\n : '';\n\nvar appendAt = (data, value) => [\n ...data,\n ...convertToArrayPayload(value),\n];\n\nvar fillEmptyArray = (value) => Array.isArray(value) ? value.map(() => undefined) : undefined;\n\nfunction insert(data, index, value) {\n return [\n ...data.slice(0, index),\n ...convertToArrayPayload(value),\n ...data.slice(index),\n ];\n}\n\nvar moveArrayAt = (data, from, to) => {\n if (!Array.isArray(data)) {\n return [];\n }\n if (isUndefined(data[to])) {\n data[to] = undefined;\n }\n data.splice(to, 0, data.splice(from, 1)[0]);\n return data;\n};\n\nvar prependAt = (data, value) => [\n ...convertToArrayPayload(value),\n ...convertToArrayPayload(data),\n];\n\nfunction removeAtIndexes(data, indexes) {\n let i = 0;\n const temp = [...data];\n for (const index of indexes) {\n temp.splice(index - i, 1);\n i++;\n }\n return compact(temp).length ? temp : [];\n}\nvar removeArrayAt = (data, index) => isUndefined(index)\n ? []\n : removeAtIndexes(data, convertToArrayPayload(index).sort((a, b) => a - b));\n\nvar swapArrayAt = (data, indexA, indexB) => {\n [data[indexA], data[indexB]] = [data[indexB], data[indexA]];\n};\n\nvar updateAt = (fieldValues, index, value) => {\n fieldValues[index] = value;\n return fieldValues;\n};\n\n/**\n * A custom hook that exposes convenient methods to perform operations with a list of dynamic inputs that need to be appended, updated, removed etc. • [Demo](https://codesandbox.io/s/react-hook-form-usefieldarray-ssugn) • [Video](https://youtu.be/4MrbfGSFY2A)\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/usefieldarray) • [Demo](https://codesandbox.io/s/react-hook-form-usefieldarray-ssugn)\n *\n * @param props - useFieldArray props\n *\n * @returns methods - functions to manipulate with the Field Arrays (dynamic inputs) {@link UseFieldArrayReturn}\n *\n * @example\n * ```tsx\n * function App() {\n * const { register, control, handleSubmit, reset, trigger, setError } = useForm({\n * defaultValues: {\n * test: []\n * }\n * });\n * const { fields, append } = useFieldArray({\n * control,\n * name: \"test\"\n * });\n *\n * return (\n * <form onSubmit={handleSubmit(data => console.log(data))}>\n * {fields.map((item, index) => (\n * <input key={item.id} {...register(`test.${index}.firstName`)} />\n * ))}\n * <button type=\"button\" onClick={() => append({ firstName: \"bill\" })}>\n * append\n * </button>\n * <input type=\"submit\" />\n * </form>\n * );\n * }\n * ```\n */\nfunction useFieldArray(props) {\n const formControl = useFormControlContext();\n const { control = formControl, name, keyName = 'id', shouldUnregister, rules, } = props;\n const [fields, setFields] = React.useState(control._getFieldArray(name));\n const ids = React.useRef(control._getFieldArray(name).map(generateId));\n const _actioned = React.useRef(false);\n control._names.array.add(name);\n React.useMemo(() => rules &&\n fields.length >= 0 &&\n control.register(name, rules), [control, name, fields.length, rules]);\n useIsomorphicLayoutEffect(() => control._subjects.array.subscribe({\n next: ({ values, name: fieldArrayName, }) => {\n if (fieldArrayName === name || !fieldArrayName) {\n const fieldValues = get(values, name);\n if (Array.isArray(fieldValues)) {\n setFields(fieldValues);\n ids.current = fieldValues.map(generateId);\n }\n }\n },\n }).unsubscribe, [control, name]);\n const updateValues = React.useCallback((updatedFieldArrayValues) => {\n _actioned.current = true;\n control._setFieldArray(name, updatedFieldArrayValues);\n }, [control, name]);\n const append = (value, options) => {\n const appendValue = convertToArrayPayload(cloneObject(value));\n const updatedFieldArrayValues = appendAt(control._getFieldArray(name), appendValue);\n control._names.focus = getFocusFieldName(name, updatedFieldArrayValues.length - 1, options);\n ids.current = appendAt(ids.current, appendValue.map(generateId));\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._setFieldArray(name, updatedFieldArrayValues, appendAt, {\n argA: fillEmptyArray(value),\n });\n };\n const prepend = (value, options) => {\n const prependValue = convertToArrayPayload(cloneObject(value));\n const updatedFieldArrayValues = prependAt(control._getFieldArray(name), prependValue);\n control._names.focus = getFocusFieldName(name, 0, options);\n ids.current = prependAt(ids.current, prependValue.map(generateId));\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._setFieldArray(name, updatedFieldArrayValues, prependAt, {\n argA: fillEmptyArray(value),\n });\n };\n const remove = (index) => {\n const updatedFieldArrayValues = removeArrayAt(control._getFieldArray(name), index);\n ids.current = removeArrayAt(ids.current, index);\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n !Array.isArray(get(control._fields, name)) &&\n set(control._fields, name, undefined);\n control._setFieldArray(name, updatedFieldArrayValues, removeArrayAt, {\n argA: index,\n });\n };\n const insert$1 = (index, value, options) => {\n const insertValue = convertToArrayPayload(cloneObject(value));\n const updatedFieldArrayValues = insert(control._getFieldArray(name), index, insertValue);\n control._names.focus = getFocusFieldName(name, index, options);\n ids.current = insert(ids.current, index, insertValue.map(generateId));\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._setFieldArray(name, updatedFieldArrayValues, insert, {\n argA: index,\n argB: fillEmptyArray(value),\n });\n };\n const swap = (indexA, indexB) => {\n const updatedFieldArrayValues = control._getFieldArray(name);\n swapArrayAt(updatedFieldArrayValues, indexA, indexB);\n swapArrayAt(ids.current, indexA, indexB);\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._setFieldArray(name, updatedFieldArrayValues, swapArrayAt, {\n argA: indexA,\n argB: indexB,\n }, false);\n };\n const move = (from, to) => {\n const updatedFieldArrayValues = control._getFieldArray(name);\n moveArrayAt(updatedFieldArrayValues, from, to);\n moveArrayAt(ids.current, from, to);\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._setFieldArray(name, updatedFieldArrayValues, moveArrayAt, {\n argA: from,\n argB: to,\n }, false);\n };\n const update = (index, value) => {\n const updateValue = cloneObject(value);\n const updatedFieldArrayValues = updateAt(control._getFieldArray(name), index, updateValue);\n ids.current = [...updatedFieldArrayValues].map((item, i) => !item || i === index ? generateId() : ids.current[i]);\n updateValues(updatedFieldArrayValues);\n setFields([...updatedFieldArrayValues]);\n control._setFieldArray(name, updatedFieldArrayValues, updateAt, {\n argA: index,\n argB: updateValue,\n }, true, false);\n };\n const replace = (value) => {\n const updatedFieldArrayValues = convertToArrayPayload(cloneObject(value));\n ids.current = updatedFieldArrayValues.map(generateId);\n updateValues([...updatedFieldArrayValues]);\n setFields([...updatedFieldArrayValues]);\n control._setFieldArray(name, [...updatedFieldArrayValues], (data) => data, {}, true, false);\n };\n React.useEffect(() => {\n control._state.action = false;\n isWatched(name, control._names) &&\n control._subjects.state.next({\n ...control._formState,\n });\n if (_actioned.current &&\n (!getValidationModes(control._options.mode).isOnSubmit ||\n control._formState.isSubmitted) &&\n !getValidationModes(control._options.reValidateMode).isOnSubmit) {\n if (control._options.resolver) {\n control._runSchema([name]).then((result) => {\n control._updateIsValidating([name]);\n const error = get(result.errors, name);\n const existingError = get(control._formState.errors, name);\n if (existingError\n ? (!error && existingError.type) ||\n (error &&\n (existingError.type !== error.type ||\n existingError.message !== error.message))\n : error && error.type) {\n error\n ? set(control._formState.errors, name, error)\n : unset(control._formState.errors, name);\n control._subjects.state.next({\n errors: control._formState.errors,\n });\n }\n });\n }\n else {\n const field = get(control._fields, name);\n if (field &&\n field._f &&\n !(getValidationModes(control._options.reValidateMode).isOnSubmit &&\n getValidationModes(control._options.mode).isOnSubmit)) {\n validateField(field, control._names.disabled, control._formValues, control._options.criteriaMode === VALIDATION_MODE.all, control._options.shouldUseNativeValidation, true).then((error) => !isEmptyObject(error) &&\n control._subjects.state.next({\n errors: updateFieldArrayRootError(control._formState.errors, error, name),\n }));\n }\n }\n }\n control._subjects.state.next({\n name,\n values: cloneObject(control._formValues),\n });\n control._names.focus &&\n iterateFieldsByAction(control._fields, (ref, key) => {\n if (control._names.focus &&\n key.startsWith(control._names.focus) &&\n ref.focus) {\n ref.focus();\n return 1;\n }\n return;\n });\n control._names.focus = '';\n control._setValid();\n _actioned.current = false;\n }, [fields, name, control]);\n React.useEffect(() => {\n !get(control._formValues, name) && control._setFieldArray(name);\n return () => {\n const updateMounted = (name, value) => {\n const field = get(control._fields, name);\n if (field && field._f) {\n field._f.mount = value;\n }\n };\n control._options.shouldUnregister || shouldUnregister\n ? control.unregister(name)\n : updateMounted(name, false);\n };\n }, [name, control, keyName, shouldUnregister]);\n return {\n swap: React.useCallback(swap, [updateValues, name, control]),\n move: React.useCallback(move, [updateValues, name, control]),\n prepend: React.useCallback(prepend, [updateValues, name, control]),\n append: React.useCallback(append, [updateValues, name, control]),\n remove: React.useCallback(remove, [updateValues, name, control]),\n insert: React.useCallback(insert$1, [updateValues, name, control]),\n update: React.useCallback(update, [updateValues, name, control]),\n replace: React.useCallback(replace, [updateValues, name, control]),\n fields: React.useMemo(() => fields.map((field, index) => ({\n ...field,\n [keyName]: ids.current[index] || generateId(),\n })), [fields, keyName]),\n };\n}\n\n/**\n * Custom hook to manage the entire form.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform) • [Demo](https://codesandbox.io/s/react-hook-form-get-started-ts-5ksmm) • [Video](https://www.youtube.com/watch?v=RkXv4AXXC_4)\n *\n * @param props - form configuration and validation parameters.\n *\n * @returns methods - individual functions to manage the form state. {@link UseFormReturn}\n *\n * @example\n * ```tsx\n * function App() {\n * const { register, handleSubmit, watch, formState: { errors } } = useForm();\n * const onSubmit = data => console.log(data);\n *\n * console.log(watch(\"example\"));\n *\n * return (\n * <form onSubmit={handleSubmit(onSubmit)}>\n * <input defaultValue=\"test\" {...register(\"example\")} />\n * <input {...register(\"exampleRequired\", { required: true })} />\n * {errors.exampleRequired && <span>This field is required</span>}\n * <button>Submit</button>\n * </form>\n * );\n * }\n * ```\n */\nfunction useForm(props = {}) {\n const _formControl = React.useRef(undefined);\n const _values = React.useRef(undefined);\n const [formState, updateFormState] = React.useState({\n isDirty: false,\n isValidating: false,\n isLoading: isFunction(props.defaultValues),\n isSubmitted: false,\n isSubmitting: false,\n isSubmitSuccessful: false,\n isValid: false,\n submitCount: 0,\n dirtyFields: {},\n touchedFields: {},\n validatingFields: {},\n errors: props.errors || {},\n disabled: props.disabled || false,\n isReady: false,\n defaultValues: isFunction(props.defaultValues)\n ? undefined\n : props.defaultValues,\n });\n if (!_formControl.current) {\n if (props.formControl) {\n _formControl.current = {\n ...props.formControl,\n formState,\n };\n if (props.defaultValues && !isFunction(props.defaultValues)) {\n props.formControl.reset(props.defaultValues, props.resetOptions);\n }\n }\n else {\n const { formControl, ...rest } = createFormControl(props);\n _formControl.current = {\n ...rest,\n formState,\n };\n }\n }\n const control = _formControl.current.control;\n control._options = props;\n useIsomorphicLayoutEffect(() => {\n const sub = control._subscribe({\n formState: control._proxyFormState,\n callback: () => updateFormState({ ...control._formState }),\n reRenderRoot: true,\n });\n updateFormState((data) => ({\n ...data,\n isReady: true,\n }));\n control._formState.isReady = true;\n return sub;\n }, [control]);\n React.useEffect(() => control._disableForm(props.disabled), [control, props.disabled]);\n React.useEffect(() => {\n if (props.mode) {\n control._options.mode = props.mode;\n }\n if (props.reValidateMode) {\n control._options.reValidateMode = props.reValidateMode;\n }\n }, [control, props.mode, props.reValidateMode]);\n React.useEffect(() => {\n if (props.errors) {\n control._setErrors(props.errors);\n control._focusError();\n }\n }, [control, props.errors]);\n React.useEffect(() => {\n props.shouldUnregister &&\n control._subjects.state.next({\n values: control._getWatch(),\n });\n }, [control, props.shouldUnregister]);\n React.useEffect(() => {\n if (control._proxyFormState.isDirty) {\n const isDirty = control._getDirty();\n if (isDirty !== formState.isDirty) {\n control._subjects.state.next({\n isDirty,\n });\n }\n }\n }, [control, formState.isDirty]);\n React.useEffect(() => {\n var _a;\n if (props.values && !deepEqual(props.values, _values.current)) {\n control._reset(props.values, {\n keepFieldsRef: true,\n ...control._options.resetOptions,\n });\n if (!((_a = control._options.resetOptions) === null || _a === void 0 ? void 0 : _a.keepIsValid)) {\n control._setValid();\n }\n _values.current = props.values;\n updateFormState((state) => ({ ...state }));\n }\n else {\n control._resetDefaultValues();\n }\n }, [control, props.values]);\n React.useEffect(() => {\n if (!control._state.mount) {\n control._setValid();\n control._state.mount = true;\n }\n if (control._state.watch) {\n control._state.watch = false;\n control._subjects.state.next({ ...control._formState });\n }\n control._removeUnmounted();\n });\n _formControl.current.formState = React.useMemo(() => getProxyFormState(formState, control), [control, formState]);\n return _formControl.current;\n}\n\n/**\n * Watch component that subscribes to form field changes and re-renders when watched fields update.\n *\n * @param control - The form control object from useForm\n * @param name - Can be field name, array of field names, or undefined to watch the entire form\n * @param disabled - Disable subscription\n * @param exact - Whether to watch exact field names or not\n * @param defaultValue - The default value to use if the field is not yet set\n * @param compute - Function to compute derived values from watched fields\n * @param render - The function that receives watched values and returns ReactNode\n * @returns The result of calling render function with watched values\n *\n * @example\n * The `Watch` component only re-render when the values of `foo`, `bar`, and `baz.qux` change.\n * The types of `foo`, `bar`, and `baz.qux` are precisely inferred.\n *\n * ```tsx\n * const { control } = useForm();\n *\n * <Watch\n * control={control}\n * names={['foo', 'bar', 'baz.qux']}\n * render={([foo, bar, baz_qux]) => <div>{foo}{bar}{baz_qux}</div>}\n * />\n * ```\n */\nconst Watch = (props) => props.render(useWatch({ name: props.names, ...props }));\n\nexport { Controller, Form, FormProvider, FormStateSubscribe, Watch, appendErrors, createFormControl, get, set, useController, useFieldArray, useForm, useFormContext, useFormState, useWatch };\n//# sourceMappingURL=index.esm.mjs.map\n","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n","import { useState, useCallback, useLayoutEffect, useEffect, useRef, useMemo } from 'react';\nimport debounce from 'lodash.debounce';\n\n// src/useBoolean/useBoolean.ts\nfunction useBoolean(defaultValue = false) {\n if (typeof defaultValue !== \"boolean\") {\n throw new Error(\"defaultValue must be `true` or `false`\");\n }\n const [value, setValue] = useState(defaultValue);\n const setTrue = useCallback(() => {\n setValue(true);\n }, []);\n const setFalse = useCallback(() => {\n setValue(false);\n }, []);\n const toggle = useCallback(() => {\n setValue((x) => !x);\n }, []);\n return { value, setValue, setTrue, setFalse, toggle };\n}\nvar useIsomorphicLayoutEffect = typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\n// src/useEventListener/useEventListener.ts\nfunction useEventListener(eventName, handler, element, options) {\n const savedHandler = useRef(handler);\n useIsomorphicLayoutEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n useEffect(() => {\n const targetElement = (element == null ? void 0 : element.current) ?? window;\n if (!(targetElement && targetElement.addEventListener))\n return;\n const listener = (event) => {\n savedHandler.current(event);\n };\n targetElement.addEventListener(eventName, listener, options);\n return () => {\n targetElement.removeEventListener(eventName, listener, options);\n };\n }, [eventName, element, options]);\n}\n\n// src/useClickAnyWhere/useClickAnyWhere.ts\nfunction useClickAnyWhere(handler) {\n useEventListener(\"click\", (event) => {\n handler(event);\n });\n}\nfunction useCopyToClipboard() {\n const [copiedText, setCopiedText] = useState(null);\n const copy = useCallback(async (text) => {\n if (!(navigator == null ? void 0 : navigator.clipboard)) {\n console.warn(\"Clipboard not supported\");\n return false;\n }\n try {\n await navigator.clipboard.writeText(text);\n setCopiedText(text);\n return true;\n } catch (error) {\n console.warn(\"Copy failed\", error);\n setCopiedText(null);\n return false;\n }\n }, []);\n return [copiedText, copy];\n}\nfunction useCounter(initialValue) {\n const [count, setCount] = useState(initialValue ?? 0);\n const increment = useCallback(() => {\n setCount((x) => x + 1);\n }, []);\n const decrement = useCallback(() => {\n setCount((x) => x - 1);\n }, []);\n const reset = useCallback(() => {\n setCount(initialValue ?? 0);\n }, [initialValue]);\n return {\n count,\n increment,\n decrement,\n reset,\n setCount\n };\n}\nfunction useInterval(callback, delay) {\n const savedCallback = useRef(callback);\n useIsomorphicLayoutEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n useEffect(() => {\n if (delay === null) {\n return;\n }\n const id = setInterval(() => {\n savedCallback.current();\n }, delay);\n return () => {\n clearInterval(id);\n };\n }, [delay]);\n}\n\n// src/useCountdown/useCountdown.ts\nfunction useCountdown({\n countStart,\n countStop = 0,\n intervalMs = 1e3,\n isIncrement = false\n}) {\n const {\n count,\n increment,\n decrement,\n reset: resetCounter\n } = useCounter(countStart);\n const {\n value: isCountdownRunning,\n setTrue: startCountdown,\n setFalse: stopCountdown\n } = useBoolean(false);\n const resetCountdown = useCallback(() => {\n stopCountdown();\n resetCounter();\n }, [stopCountdown, resetCounter]);\n const countdownCallback = useCallback(() => {\n if (count === countStop) {\n stopCountdown();\n return;\n }\n if (isIncrement) {\n increment();\n } else {\n decrement();\n }\n }, [count, countStop, decrement, increment, isIncrement, stopCountdown]);\n useInterval(countdownCallback, isCountdownRunning ? intervalMs : null);\n return [count, { startCountdown, stopCountdown, resetCountdown }];\n}\nfunction useEventCallback(fn) {\n const ref = useRef(() => {\n throw new Error(\"Cannot call an event handler while rendering.\");\n });\n useIsomorphicLayoutEffect(() => {\n ref.current = fn;\n }, [fn]);\n return useCallback((...args) => {\n var _a;\n return (_a = ref.current) == null ? void 0 : _a.call(ref, ...args);\n }, [ref]);\n}\n\n// src/useLocalStorage/useLocalStorage.ts\nvar IS_SERVER = typeof window === \"undefined\";\nfunction useLocalStorage(key, initialValue, options = {}) {\n const { initializeWithValue = true } = options;\n const serializer = useCallback(\n (value) => {\n if (options.serializer) {\n return options.serializer(value);\n }\n return JSON.stringify(value);\n },\n [options]\n );\n const deserializer = useCallback(\n (value) => {\n if (options.deserializer) {\n return options.deserializer(value);\n }\n if (value === \"undefined\") {\n return void 0;\n }\n const defaultValue = initialValue instanceof Function ? initialValue() : initialValue;\n let parsed;\n try {\n parsed = JSON.parse(value);\n } catch (error) {\n console.error(\"Error parsing JSON:\", error);\n return defaultValue;\n }\n return parsed;\n },\n [options, initialValue]\n );\n const readValue = useCallback(() => {\n const initialValueToUse = initialValue instanceof Function ? initialValue() : initialValue;\n if (IS_SERVER) {\n return initialValueToUse;\n }\n try {\n const raw = window.localStorage.getItem(key);\n return raw ? deserializer(raw) : initialValueToUse;\n } catch (error) {\n console.warn(`Error reading localStorage key \\u201C${key}\\u201D:`, error);\n return initialValueToUse;\n }\n }, [initialValue, key, deserializer]);\n const [storedValue, setStoredValue] = useState(() => {\n if (initializeWithValue) {\n return readValue();\n }\n return initialValue instanceof Function ? initialValue() : initialValue;\n });\n const setValue = useEventCallback((value) => {\n if (IS_SERVER) {\n console.warn(\n `Tried setting localStorage key \\u201C${key}\\u201D even though environment is not a client`\n );\n }\n try {\n const newValue = value instanceof Function ? value(readValue()) : value;\n window.localStorage.setItem(key, serializer(newValue));\n setStoredValue(newValue);\n window.dispatchEvent(new StorageEvent(\"local-storage\", { key }));\n } catch (error) {\n console.warn(`Error setting localStorage key \\u201C${key}\\u201D:`, error);\n }\n });\n const removeValue = useEventCallback(() => {\n if (IS_SERVER) {\n console.warn(\n `Tried removing localStorage key \\u201C${key}\\u201D even though environment is not a client`\n );\n }\n const defaultValue = initialValue instanceof Function ? initialValue() : initialValue;\n window.localStorage.removeItem(key);\n setStoredValue(defaultValue);\n window.dispatchEvent(new StorageEvent(\"local-storage\", { key }));\n });\n useEffect(() => {\n setStoredValue(readValue());\n }, [key]);\n const handleStorageChange = useCallback(\n (event) => {\n if (event.key && event.key !== key) {\n return;\n }\n setStoredValue(readValue());\n },\n [key, readValue]\n );\n useEventListener(\"storage\", handleStorageChange);\n useEventListener(\"local-storage\", handleStorageChange);\n return [storedValue, setValue, removeValue];\n}\nvar IS_SERVER2 = typeof window === \"undefined\";\nfunction useMediaQuery(query, {\n defaultValue = false,\n initializeWithValue = true\n} = {}) {\n const getMatches = (query2) => {\n if (IS_SERVER2) {\n return defaultValue;\n }\n return window.matchMedia(query2).matches;\n };\n const [matches, setMatches] = useState(() => {\n if (initializeWithValue) {\n return getMatches(query);\n }\n return defaultValue;\n });\n function handleChange() {\n setMatches(getMatches(query));\n }\n useIsomorphicLayoutEffect(() => {\n const matchMedia = window.matchMedia(query);\n handleChange();\n if (matchMedia.addListener) {\n matchMedia.addListener(handleChange);\n } else {\n matchMedia.addEventListener(\"change\", handleChange);\n }\n return () => {\n if (matchMedia.removeListener) {\n matchMedia.removeListener(handleChange);\n } else {\n matchMedia.removeEventListener(\"change\", handleChange);\n }\n };\n }, [query]);\n return matches;\n}\n\n// src/useDarkMode/useDarkMode.ts\nvar COLOR_SCHEME_QUERY = \"(prefers-color-scheme: dark)\";\nvar LOCAL_STORAGE_KEY = \"usehooks-ts-dark-mode\";\nfunction useDarkMode(options = {}) {\n const {\n defaultValue,\n localStorageKey = LOCAL_STORAGE_KEY,\n initializeWithValue = true\n } = options;\n const isDarkOS = useMediaQuery(COLOR_SCHEME_QUERY, {\n initializeWithValue,\n defaultValue\n });\n const [isDarkMode, setDarkMode] = useLocalStorage(\n localStorageKey,\n defaultValue ?? isDarkOS ?? false,\n { initializeWithValue }\n );\n useIsomorphicLayoutEffect(() => {\n if (isDarkOS !== isDarkMode) {\n setDarkMode(isDarkOS);\n }\n }, [isDarkOS]);\n return {\n isDarkMode,\n toggle: () => {\n setDarkMode((prev) => !prev);\n },\n enable: () => {\n setDarkMode(true);\n },\n disable: () => {\n setDarkMode(false);\n },\n set: (value) => {\n setDarkMode(value);\n }\n };\n}\nfunction useUnmount(func) {\n const funcRef = useRef(func);\n funcRef.current = func;\n useEffect(\n () => () => {\n funcRef.current();\n },\n []\n );\n}\n\n// src/useDebounceCallback/useDebounceCallback.ts\nfunction useDebounceCallback(func, delay = 500, options) {\n const debouncedFunc = useRef();\n useUnmount(() => {\n if (debouncedFunc.current) {\n debouncedFunc.current.cancel();\n }\n });\n const debounced = useMemo(() => {\n const debouncedFuncInstance = debounce(func, delay, options);\n const wrappedFunc = (...args) => {\n return debouncedFuncInstance(...args);\n };\n wrappedFunc.cancel = () => {\n debouncedFuncInstance.cancel();\n };\n wrappedFunc.isPending = () => {\n return !!debouncedFunc.current;\n };\n wrappedFunc.flush = () => {\n return debouncedFuncInstance.flush();\n };\n return wrappedFunc;\n }, [func, delay, options]);\n useEffect(() => {\n debouncedFunc.current = debounce(func, delay, options);\n }, [func, delay, options]);\n return debounced;\n}\nfunction useDebounceValue(initialValue, delay, options) {\n const eq = (options == null ? void 0 : options.equalityFn) ?? ((left, right) => left === right);\n const unwrappedInitialValue = initialValue instanceof Function ? initialValue() : initialValue;\n const [debouncedValue, setDebouncedValue] = useState(unwrappedInitialValue);\n const previousValueRef = useRef(unwrappedInitialValue);\n const updateDebouncedValue = useDebounceCallback(\n setDebouncedValue,\n delay,\n options\n );\n if (!eq(previousValueRef.current, unwrappedInitialValue)) {\n updateDebouncedValue(unwrappedInitialValue);\n previousValueRef.current = unwrappedInitialValue;\n }\n return [debouncedValue, updateDebouncedValue];\n}\nfunction useDocumentTitle(title, options = {}) {\n const { preserveTitleOnUnmount = true } = options;\n const defaultTitle = useRef(null);\n useIsomorphicLayoutEffect(() => {\n defaultTitle.current = window.document.title;\n }, []);\n useIsomorphicLayoutEffect(() => {\n window.document.title = title;\n }, [title]);\n useUnmount(() => {\n if (!preserveTitleOnUnmount && defaultTitle.current) {\n window.document.title = defaultTitle.current;\n }\n });\n}\nfunction useHover(elementRef) {\n const [value, setValue] = useState(false);\n const handleMouseEnter = () => {\n setValue(true);\n };\n const handleMouseLeave = () => {\n setValue(false);\n };\n useEventListener(\"mouseenter\", handleMouseEnter, elementRef);\n useEventListener(\"mouseleave\", handleMouseLeave, elementRef);\n return value;\n}\nfunction useIntersectionObserver({\n threshold = 0,\n root = null,\n rootMargin = \"0%\",\n freezeOnceVisible = false,\n initialIsIntersecting = false,\n onChange\n} = {}) {\n var _a;\n const [ref, setRef] = useState(null);\n const [state, setState] = useState(() => ({\n isIntersecting: initialIsIntersecting,\n entry: void 0\n }));\n const callbackRef = useRef();\n callbackRef.current = onChange;\n const frozen = ((_a = state.entry) == null ? void 0 : _a.isIntersecting) && freezeOnceVisible;\n useEffect(() => {\n if (!ref)\n return;\n if (!(\"IntersectionObserver\" in window))\n return;\n if (frozen)\n return;\n let unobserve;\n const observer = new IntersectionObserver(\n (entries) => {\n const thresholds = Array.isArray(observer.thresholds) ? observer.thresholds : [observer.thresholds];\n entries.forEach((entry) => {\n const isIntersecting = entry.isIntersecting && thresholds.some((threshold2) => entry.intersectionRatio >= threshold2);\n setState({ isIntersecting, entry });\n if (callbackRef.current) {\n callbackRef.current(isIntersecting, entry);\n }\n if (isIntersecting && freezeOnceVisible && unobserve) {\n unobserve();\n unobserve = void 0;\n }\n });\n },\n { threshold, root, rootMargin }\n );\n observer.observe(ref);\n return () => {\n observer.disconnect();\n };\n }, [\n ref,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(threshold),\n root,\n rootMargin,\n frozen,\n freezeOnceVisible\n ]);\n const prevRef = useRef(null);\n useEffect(() => {\n var _a2;\n if (!ref && ((_a2 = state.entry) == null ? void 0 : _a2.target) && !freezeOnceVisible && !frozen && prevRef.current !== state.entry.target) {\n prevRef.current = state.entry.target;\n setState({ isIntersecting: initialIsIntersecting, entry: void 0 });\n }\n }, [ref, state.entry, freezeOnceVisible, frozen, initialIsIntersecting]);\n const result = [\n setRef,\n !!state.isIntersecting,\n state.entry\n ];\n result.ref = result[0];\n result.isIntersecting = result[1];\n result.entry = result[2];\n return result;\n}\nfunction useIsClient() {\n const [isClient, setClient] = useState(false);\n useEffect(() => {\n setClient(true);\n }, []);\n return isClient;\n}\nfunction useIsMounted() {\n const isMounted = useRef(false);\n useEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n }, []);\n return useCallback(() => isMounted.current, []);\n}\nfunction useMap(initialState = /* @__PURE__ */ new Map()) {\n const [map, setMap] = useState(new Map(initialState));\n const actions = {\n set: useCallback((key, value) => {\n setMap((prev) => {\n const copy = new Map(prev);\n copy.set(key, value);\n return copy;\n });\n }, []),\n setAll: useCallback((entries) => {\n setMap(() => new Map(entries));\n }, []),\n remove: useCallback((key) => {\n setMap((prev) => {\n const copy = new Map(prev);\n copy.delete(key);\n return copy;\n });\n }, []),\n reset: useCallback(() => {\n setMap(() => /* @__PURE__ */ new Map());\n }, [])\n };\n return [map, actions];\n}\n\n// src/useOnClickOutside/useOnClickOutside.ts\nfunction useOnClickOutside(ref, handler, eventType = \"mousedown\", eventListenerOptions = {}) {\n useEventListener(\n eventType,\n (event) => {\n const target = event.target;\n if (!target || !target.isConnected) {\n return;\n }\n const isOutside = Array.isArray(ref) ? ref.filter((r) => Boolean(r.current)).every((r) => r.current && !r.current.contains(target)) : ref.current && !ref.current.contains(target);\n if (isOutside) {\n handler(event);\n }\n },\n void 0,\n eventListenerOptions\n );\n}\nvar IS_SERVER3 = typeof window === \"undefined\";\nfunction useReadLocalStorage(key, options = {}) {\n let { initializeWithValue = true } = options;\n if (IS_SERVER3) {\n initializeWithValue = false;\n }\n const deserializer = useCallback(\n (value) => {\n if (options.deserializer) {\n return options.deserializer(value);\n }\n if (value === \"undefined\") {\n return void 0;\n }\n let parsed;\n try {\n parsed = JSON.parse(value);\n } catch (error) {\n console.error(\"Error parsing JSON:\", error);\n return null;\n }\n return parsed;\n },\n [options]\n );\n const readValue = useCallback(() => {\n if (IS_SERVER3) {\n return null;\n }\n try {\n const raw = window.localStorage.getItem(key);\n return raw ? deserializer(raw) : null;\n } catch (error) {\n console.warn(`Error reading localStorage key \\u201C${key}\\u201D:`, error);\n return null;\n }\n }, [key, deserializer]);\n const [storedValue, setStoredValue] = useState(() => {\n if (initializeWithValue) {\n return readValue();\n }\n return void 0;\n });\n useEffect(() => {\n setStoredValue(readValue());\n }, [key]);\n const handleStorageChange = useCallback(\n (event) => {\n if (event.key && event.key !== key) {\n return;\n }\n setStoredValue(readValue());\n },\n [key, readValue]\n );\n useEventListener(\"storage\", handleStorageChange);\n useEventListener(\"local-storage\", handleStorageChange);\n return storedValue;\n}\nvar initialSize = {\n width: void 0,\n height: void 0\n};\nfunction useResizeObserver(options) {\n const { ref, box = \"content-box\" } = options;\n const [{ width, height }, setSize] = useState(initialSize);\n const isMounted = useIsMounted();\n const previousSize = useRef({ ...initialSize });\n const onResize = useRef(void 0);\n onResize.current = options.onResize;\n useEffect(() => {\n if (!ref.current)\n return;\n if (typeof window === \"undefined\" || !(\"ResizeObserver\" in window))\n return;\n const observer = new ResizeObserver(([entry]) => {\n const boxProp = box === \"border-box\" ? \"borderBoxSize\" : box === \"device-pixel-content-box\" ? \"devicePixelContentBoxSize\" : \"contentBoxSize\";\n const newWidth = extractSize(entry, boxProp, \"inlineSize\");\n const newHeight = extractSize(entry, boxProp, \"blockSize\");\n const hasChanged = previousSize.current.width !== newWidth || previousSize.current.height !== newHeight;\n if (hasChanged) {\n const newSize = { width: newWidth, height: newHeight };\n previousSize.current.width = newWidth;\n previousSize.current.height = newHeight;\n if (onResize.current) {\n onResize.current(newSize);\n } else {\n if (isMounted()) {\n setSize(newSize);\n }\n }\n }\n });\n observer.observe(ref.current, { box });\n return () => {\n observer.disconnect();\n };\n }, [box, ref, isMounted]);\n return { width, height };\n}\nfunction extractSize(entry, box, sizeType) {\n if (!entry[box]) {\n if (box === \"contentBoxSize\") {\n return entry.contentRect[sizeType === \"inlineSize\" ? \"width\" : \"height\"];\n }\n return void 0;\n }\n return Array.isArray(entry[box]) ? entry[box][0][sizeType] : (\n // @ts-ignore Support Firefox's non-standard behavior\n entry[box][sizeType]\n );\n}\nvar IS_SERVER4 = typeof window === \"undefined\";\nfunction useScreen(options = {}) {\n let { initializeWithValue = true } = options;\n if (IS_SERVER4) {\n initializeWithValue = false;\n }\n const readScreen = () => {\n if (IS_SERVER4) {\n return void 0;\n }\n return window.screen;\n };\n const [screen, setScreen] = useState(() => {\n if (initializeWithValue) {\n return readScreen();\n }\n return void 0;\n });\n const debouncedSetScreen = useDebounceCallback(\n setScreen,\n options.debounceDelay\n );\n function handleSize() {\n const newScreen = readScreen();\n const setSize = options.debounceDelay ? debouncedSetScreen : setScreen;\n if (newScreen) {\n const {\n width,\n height,\n availHeight,\n availWidth,\n colorDepth,\n orientation,\n pixelDepth\n } = newScreen;\n setSize({\n width,\n height,\n availHeight,\n availWidth,\n colorDepth,\n orientation,\n pixelDepth\n });\n }\n }\n useEventListener(\"resize\", handleSize);\n useIsomorphicLayoutEffect(() => {\n handleSize();\n }, []);\n return screen;\n}\nvar cachedScriptStatuses = /* @__PURE__ */ new Map();\nfunction getScriptNode(src) {\n const node = document.querySelector(\n `script[src=\"${src}\"]`\n );\n const status = node == null ? void 0 : node.getAttribute(\"data-status\");\n return {\n node,\n status\n };\n}\nfunction useScript(src, options) {\n const [status, setStatus] = useState(() => {\n if (!src || (options == null ? void 0 : options.shouldPreventLoad)) {\n return \"idle\";\n }\n if (typeof window === \"undefined\") {\n return \"loading\";\n }\n return cachedScriptStatuses.get(src) ?? \"loading\";\n });\n useEffect(() => {\n if (!src || (options == null ? void 0 : options.shouldPreventLoad)) {\n return;\n }\n const cachedScriptStatus = cachedScriptStatuses.get(src);\n if (cachedScriptStatus === \"ready\" || cachedScriptStatus === \"error\") {\n setStatus(cachedScriptStatus);\n return;\n }\n const script = getScriptNode(src);\n let scriptNode = script.node;\n if (!scriptNode) {\n scriptNode = document.createElement(\"script\");\n scriptNode.src = src;\n scriptNode.async = true;\n if (options == null ? void 0 : options.id) {\n scriptNode.id = options.id;\n }\n scriptNode.setAttribute(\"data-status\", \"loading\");\n document.body.appendChild(scriptNode);\n const setAttributeFromEvent = (event) => {\n const scriptStatus = event.type === \"load\" ? \"ready\" : \"error\";\n scriptNode == null ? void 0 : scriptNode.setAttribute(\"data-status\", scriptStatus);\n };\n scriptNode.addEventListener(\"load\", setAttributeFromEvent);\n scriptNode.addEventListener(\"error\", setAttributeFromEvent);\n } else {\n setStatus(script.status ?? cachedScriptStatus ?? \"loading\");\n }\n const setStateFromEvent = (event) => {\n const newStatus = event.type === \"load\" ? \"ready\" : \"error\";\n setStatus(newStatus);\n cachedScriptStatuses.set(src, newStatus);\n };\n scriptNode.addEventListener(\"load\", setStateFromEvent);\n scriptNode.addEventListener(\"error\", setStateFromEvent);\n return () => {\n if (scriptNode) {\n scriptNode.removeEventListener(\"load\", setStateFromEvent);\n scriptNode.removeEventListener(\"error\", setStateFromEvent);\n }\n if (scriptNode && (options == null ? void 0 : options.removeOnUnmount)) {\n scriptNode.remove();\n cachedScriptStatuses.delete(src);\n }\n };\n }, [src, options == null ? void 0 : options.shouldPreventLoad, options == null ? void 0 : options.removeOnUnmount, options == null ? void 0 : options.id]);\n return status;\n}\nvar IS_SERVER5 = typeof window === \"undefined\";\nfunction useScrollLock(options = {}) {\n const { autoLock = true, lockTarget, widthReflow = true } = options;\n const [isLocked, setIsLocked] = useState(false);\n const target = useRef(null);\n const originalStyle = useRef(null);\n const lock = () => {\n if (target.current) {\n const { overflow, paddingRight } = target.current.style;\n originalStyle.current = { overflow, paddingRight };\n if (widthReflow) {\n const offsetWidth = target.current === document.body ? window.innerWidth : target.current.offsetWidth;\n const currentPaddingRight = parseInt(window.getComputedStyle(target.current).paddingRight, 10) || 0;\n const scrollbarWidth = offsetWidth - target.current.scrollWidth;\n target.current.style.paddingRight = `${scrollbarWidth + currentPaddingRight}px`;\n }\n target.current.style.overflow = \"hidden\";\n setIsLocked(true);\n }\n };\n const unlock = () => {\n if (target.current && originalStyle.current) {\n target.current.style.overflow = originalStyle.current.overflow;\n if (widthReflow) {\n target.current.style.paddingRight = originalStyle.current.paddingRight;\n }\n }\n setIsLocked(false);\n };\n useIsomorphicLayoutEffect(() => {\n if (IS_SERVER5)\n return;\n if (lockTarget) {\n target.current = typeof lockTarget === \"string\" ? document.querySelector(lockTarget) : lockTarget;\n }\n if (!target.current) {\n target.current = document.body;\n }\n if (autoLock) {\n lock();\n }\n return () => {\n unlock();\n };\n }, [autoLock, lockTarget, widthReflow]);\n return { isLocked, lock, unlock };\n}\nvar IS_SERVER6 = typeof window === \"undefined\";\nfunction useSessionStorage(key, initialValue, options = {}) {\n const { initializeWithValue = true } = options;\n const serializer = useCallback(\n (value) => {\n if (options.serializer) {\n return options.serializer(value);\n }\n return JSON.stringify(value);\n },\n [options]\n );\n const deserializer = useCallback(\n (value) => {\n if (options.deserializer) {\n return options.deserializer(value);\n }\n if (value === \"undefined\") {\n return void 0;\n }\n const defaultValue = initialValue instanceof Function ? initialValue() : initialValue;\n let parsed;\n try {\n parsed = JSON.parse(value);\n } catch (error) {\n console.error(\"Error parsing JSON:\", error);\n return defaultValue;\n }\n return parsed;\n },\n [options, initialValue]\n );\n const readValue = useCallback(() => {\n const initialValueToUse = initialValue instanceof Function ? initialValue() : initialValue;\n if (IS_SERVER6) {\n return initialValueToUse;\n }\n try {\n const raw = window.sessionStorage.getItem(key);\n return raw ? deserializer(raw) : initialValueToUse;\n } catch (error) {\n console.warn(`Error reading sessionStorage key \\u201C${key}\\u201D:`, error);\n return initialValueToUse;\n }\n }, [initialValue, key, deserializer]);\n const [storedValue, setStoredValue] = useState(() => {\n if (initializeWithValue) {\n return readValue();\n }\n return initialValue instanceof Function ? initialValue() : initialValue;\n });\n const setValue = useEventCallback((value) => {\n if (IS_SERVER6) {\n console.warn(\n `Tried setting sessionStorage key \\u201C${key}\\u201D even though environment is not a client`\n );\n }\n try {\n const newValue = value instanceof Function ? value(readValue()) : value;\n window.sessionStorage.setItem(key, serializer(newValue));\n setStoredValue(newValue);\n window.dispatchEvent(new StorageEvent(\"session-storage\", { key }));\n } catch (error) {\n console.warn(`Error setting sessionStorage key \\u201C${key}\\u201D:`, error);\n }\n });\n const removeValue = useEventCallback(() => {\n if (IS_SERVER6) {\n console.warn(\n `Tried removing sessionStorage key \\u201C${key}\\u201D even though environment is not a client`\n );\n }\n const defaultValue = initialValue instanceof Function ? initialValue() : initialValue;\n window.sessionStorage.removeItem(key);\n setStoredValue(defaultValue);\n window.dispatchEvent(new StorageEvent(\"session-storage\", { key }));\n });\n useEffect(() => {\n setStoredValue(readValue());\n }, [key]);\n const handleStorageChange = useCallback(\n (event) => {\n if (event.key && event.key !== key) {\n return;\n }\n setStoredValue(readValue());\n },\n [key, readValue]\n );\n useEventListener(\"storage\", handleStorageChange);\n useEventListener(\"session-storage\", handleStorageChange);\n return [storedValue, setValue, removeValue];\n}\nfunction useStep(maxStep) {\n const [currentStep, setCurrentStep] = useState(1);\n const canGoToNextStep = currentStep + 1 <= maxStep;\n const canGoToPrevStep = currentStep - 1 > 0;\n const setStep = useCallback(\n (step) => {\n const newStep = step instanceof Function ? step(currentStep) : step;\n if (newStep >= 1 && newStep <= maxStep) {\n setCurrentStep(newStep);\n return;\n }\n throw new Error(\"Step not valid\");\n },\n [maxStep, currentStep]\n );\n const goToNextStep = useCallback(() => {\n if (canGoToNextStep) {\n setCurrentStep((step) => step + 1);\n }\n }, [canGoToNextStep]);\n const goToPrevStep = useCallback(() => {\n if (canGoToPrevStep) {\n setCurrentStep((step) => step - 1);\n }\n }, [canGoToPrevStep]);\n const reset = useCallback(() => {\n setCurrentStep(1);\n }, []);\n return [\n currentStep,\n {\n goToNextStep,\n goToPrevStep,\n canGoToNextStep,\n canGoToPrevStep,\n setStep,\n reset\n }\n ];\n}\n\n// src/useTernaryDarkMode/useTernaryDarkMode.ts\nvar COLOR_SCHEME_QUERY2 = \"(prefers-color-scheme: dark)\";\nvar LOCAL_STORAGE_KEY2 = \"usehooks-ts-ternary-dark-mode\";\nfunction useTernaryDarkMode({\n defaultValue = \"system\",\n localStorageKey = LOCAL_STORAGE_KEY2,\n initializeWithValue = true\n} = {}) {\n const isDarkOS = useMediaQuery(COLOR_SCHEME_QUERY2, { initializeWithValue });\n const [mode, setMode] = useLocalStorage(localStorageKey, defaultValue, {\n initializeWithValue\n });\n const isDarkMode = mode === \"dark\" || mode === \"system\" && isDarkOS;\n const toggleTernaryDarkMode = () => {\n const modes = [\"light\", \"system\", \"dark\"];\n setMode((prevMode) => {\n const nextIndex = (modes.indexOf(prevMode) + 1) % modes.length;\n return modes[nextIndex];\n });\n };\n return {\n isDarkMode,\n ternaryDarkMode: mode,\n setTernaryDarkMode: setMode,\n toggleTernaryDarkMode\n };\n}\nfunction useTimeout(callback, delay) {\n const savedCallback = useRef(callback);\n useIsomorphicLayoutEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n useEffect(() => {\n if (!delay && delay !== 0) {\n return;\n }\n const id = setTimeout(() => {\n savedCallback.current();\n }, delay);\n return () => {\n clearTimeout(id);\n };\n }, [delay]);\n}\nfunction useToggle(defaultValue) {\n const [value, setValue] = useState(!!defaultValue);\n const toggle = useCallback(() => {\n setValue((x) => !x);\n }, []);\n return [value, toggle, setValue];\n}\nvar IS_SERVER7 = typeof window === \"undefined\";\nfunction useWindowSize(options = {}) {\n let { initializeWithValue = true } = options;\n if (IS_SERVER7) {\n initializeWithValue = false;\n }\n const [windowSize, setWindowSize] = useState(() => {\n if (initializeWithValue) {\n return {\n width: window.innerWidth,\n height: window.innerHeight\n };\n }\n return {\n width: void 0,\n height: void 0\n };\n });\n const debouncedSetWindowSize = useDebounceCallback(\n setWindowSize,\n options.debounceDelay\n );\n function handleSize() {\n const setSize = options.debounceDelay ? debouncedSetWindowSize : setWindowSize;\n setSize({\n width: window.innerWidth,\n height: window.innerHeight\n });\n }\n useEventListener(\"resize\", handleSize);\n useIsomorphicLayoutEffect(() => {\n handleSize();\n }, []);\n return windowSize;\n}\n\nexport { useBoolean, useClickAnyWhere, useCopyToClipboard, useCountdown, useCounter, useDarkMode, useDebounceCallback, useDebounceValue, useDocumentTitle, useEventCallback, useEventListener, useHover, useIntersectionObserver, useInterval, useIsClient, useIsMounted, useIsomorphicLayoutEffect, useLocalStorage, useMap, useMediaQuery, useOnClickOutside, useReadLocalStorage, useResizeObserver, useScreen, useScript, useScrollLock, useSessionStorage, useStep, useTernaryDarkMode, useTimeout, useToggle, useUnmount, useWindowSize };\n","function memo(getDeps, fn, opts) {\n let deps = opts.initialDeps ?? [];\n let result;\n let isInitial = true;\n function memoizedFunction() {\n var _a, _b, _c;\n let depTime;\n if (opts.key && ((_a = opts.debug) == null ? void 0 : _a.call(opts))) depTime = Date.now();\n const newDeps = getDeps();\n const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);\n if (!depsChanged) {\n return result;\n }\n deps = newDeps;\n let resultTime;\n if (opts.key && ((_b = opts.debug) == null ? void 0 : _b.call(opts))) resultTime = Date.now();\n result = fn(...newDeps);\n if (opts.key && ((_c = opts.debug) == null ? void 0 : _c.call(opts))) {\n const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;\n const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;\n const resultFpsPercentage = resultEndTime / 16;\n const pad = (str, num) => {\n str = String(str);\n while (str.length < num) {\n str = \" \" + str;\n }\n return str;\n };\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120)\n )}deg 100% 31%);`,\n opts == null ? void 0 : opts.key\n );\n }\n if ((opts == null ? void 0 : opts.onChange) && !(isInitial && opts.skipInitialOnChange)) {\n opts.onChange(result);\n }\n isInitial = false;\n return result;\n }\n memoizedFunction.updateDeps = (newDeps) => {\n deps = newDeps;\n };\n return memoizedFunction;\n}\nfunction notUndefined(value, msg) {\n if (value === void 0) {\n throw new Error(`Unexpected undefined${msg ? `: ${msg}` : \"\"}`);\n } else {\n return value;\n }\n}\nconst approxEqual = (a, b) => Math.abs(a - b) < 1.01;\nconst debounce = (targetWindow, fn, ms) => {\n let timeoutId;\n return function(...args) {\n targetWindow.clearTimeout(timeoutId);\n timeoutId = targetWindow.setTimeout(() => fn.apply(this, args), ms);\n };\n};\nexport {\n approxEqual,\n debounce,\n memo,\n notUndefined\n};\n//# sourceMappingURL=utils.js.map\n","import { debounce, memo, notUndefined, approxEqual } from \"./utils.js\";\nconst getRect = (element) => {\n const { offsetWidth, offsetHeight } = element;\n return { width: offsetWidth, height: offsetHeight };\n};\nconst defaultKeyExtractor = (index) => index;\nconst defaultRangeExtractor = (range) => {\n const start = Math.max(range.startIndex - range.overscan, 0);\n const end = Math.min(range.endIndex + range.overscan, range.count - 1);\n const arr = [];\n for (let i = start; i <= end; i++) {\n arr.push(i);\n }\n return arr;\n};\nconst observeElementRect = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const targetWindow = instance.targetWindow;\n if (!targetWindow) {\n return;\n }\n const handler = (rect) => {\n const { width, height } = rect;\n cb({ width: Math.round(width), height: Math.round(height) });\n };\n handler(getRect(element));\n if (!targetWindow.ResizeObserver) {\n return () => {\n };\n }\n const observer = new targetWindow.ResizeObserver((entries) => {\n const run = () => {\n const entry = entries[0];\n if (entry == null ? void 0 : entry.borderBoxSize) {\n const box = entry.borderBoxSize[0];\n if (box) {\n handler({ width: box.inlineSize, height: box.blockSize });\n return;\n }\n }\n handler(getRect(element));\n };\n instance.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();\n });\n observer.observe(element, { box: \"border-box\" });\n return () => {\n observer.unobserve(element);\n };\n};\nconst addEventListenerOptions = {\n passive: true\n};\nconst observeWindowRect = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const handler = () => {\n cb({ width: element.innerWidth, height: element.innerHeight });\n };\n handler();\n element.addEventListener(\"resize\", handler, addEventListenerOptions);\n return () => {\n element.removeEventListener(\"resize\", handler);\n };\n};\nconst supportsScrollend = typeof window == \"undefined\" ? true : \"onscrollend\" in window;\nconst observeElementOffset = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const targetWindow = instance.targetWindow;\n if (!targetWindow) {\n return;\n }\n let offset = 0;\n const fallback = instance.options.useScrollendEvent && supportsScrollend ? () => void 0 : debounce(\n targetWindow,\n () => {\n cb(offset, false);\n },\n instance.options.isScrollingResetDelay\n );\n const createHandler = (isScrolling) => () => {\n const { horizontal, isRtl } = instance.options;\n offset = horizontal ? element[\"scrollLeft\"] * (isRtl && -1 || 1) : element[\"scrollTop\"];\n fallback();\n cb(offset, isScrolling);\n };\n const handler = createHandler(true);\n const endHandler = createHandler(false);\n element.addEventListener(\"scroll\", handler, addEventListenerOptions);\n const registerScrollendEvent = instance.options.useScrollendEvent && supportsScrollend;\n if (registerScrollendEvent) {\n element.addEventListener(\"scrollend\", endHandler, addEventListenerOptions);\n }\n return () => {\n element.removeEventListener(\"scroll\", handler);\n if (registerScrollendEvent) {\n element.removeEventListener(\"scrollend\", endHandler);\n }\n };\n};\nconst observeWindowOffset = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const targetWindow = instance.targetWindow;\n if (!targetWindow) {\n return;\n }\n let offset = 0;\n const fallback = instance.options.useScrollendEvent && supportsScrollend ? () => void 0 : debounce(\n targetWindow,\n () => {\n cb(offset, false);\n },\n instance.options.isScrollingResetDelay\n );\n const createHandler = (isScrolling) => () => {\n offset = element[instance.options.horizontal ? \"scrollX\" : \"scrollY\"];\n fallback();\n cb(offset, isScrolling);\n };\n const handler = createHandler(true);\n const endHandler = createHandler(false);\n element.addEventListener(\"scroll\", handler, addEventListenerOptions);\n const registerScrollendEvent = instance.options.useScrollendEvent && supportsScrollend;\n if (registerScrollendEvent) {\n element.addEventListener(\"scrollend\", endHandler, addEventListenerOptions);\n }\n return () => {\n element.removeEventListener(\"scroll\", handler);\n if (registerScrollendEvent) {\n element.removeEventListener(\"scrollend\", endHandler);\n }\n };\n};\nconst measureElement = (element, entry, instance) => {\n if (entry == null ? void 0 : entry.borderBoxSize) {\n const box = entry.borderBoxSize[0];\n if (box) {\n const size = Math.round(\n box[instance.options.horizontal ? \"inlineSize\" : \"blockSize\"]\n );\n return size;\n }\n }\n return element[instance.options.horizontal ? \"offsetWidth\" : \"offsetHeight\"];\n};\nconst windowScroll = (offset, {\n adjustments = 0,\n behavior\n}, instance) => {\n var _a, _b;\n const toOffset = offset + adjustments;\n (_b = (_a = instance.scrollElement) == null ? void 0 : _a.scrollTo) == null ? void 0 : _b.call(_a, {\n [instance.options.horizontal ? \"left\" : \"top\"]: toOffset,\n behavior\n });\n};\nconst elementScroll = (offset, {\n adjustments = 0,\n behavior\n}, instance) => {\n var _a, _b;\n const toOffset = offset + adjustments;\n (_b = (_a = instance.scrollElement) == null ? void 0 : _a.scrollTo) == null ? void 0 : _b.call(_a, {\n [instance.options.horizontal ? \"left\" : \"top\"]: toOffset,\n behavior\n });\n};\nclass Virtualizer {\n constructor(opts) {\n this.unsubs = [];\n this.scrollElement = null;\n this.targetWindow = null;\n this.isScrolling = false;\n this.currentScrollToIndex = null;\n this.measurementsCache = [];\n this.itemSizeCache = /* @__PURE__ */ new Map();\n this.laneAssignments = /* @__PURE__ */ new Map();\n this.pendingMeasuredCacheIndexes = [];\n this.prevLanes = void 0;\n this.lanesChangedFlag = false;\n this.lanesSettling = false;\n this.scrollRect = null;\n this.scrollOffset = null;\n this.scrollDirection = null;\n this.scrollAdjustments = 0;\n this.elementsCache = /* @__PURE__ */ new Map();\n this.observer = /* @__PURE__ */ (() => {\n let _ro = null;\n const get = () => {\n if (_ro) {\n return _ro;\n }\n if (!this.targetWindow || !this.targetWindow.ResizeObserver) {\n return null;\n }\n return _ro = new this.targetWindow.ResizeObserver((entries) => {\n entries.forEach((entry) => {\n const run = () => {\n this._measureElement(entry.target, entry);\n };\n this.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();\n });\n });\n };\n return {\n disconnect: () => {\n var _a;\n (_a = get()) == null ? void 0 : _a.disconnect();\n _ro = null;\n },\n observe: (target) => {\n var _a;\n return (_a = get()) == null ? void 0 : _a.observe(target, { box: \"border-box\" });\n },\n unobserve: (target) => {\n var _a;\n return (_a = get()) == null ? void 0 : _a.unobserve(target);\n }\n };\n })();\n this.range = null;\n this.setOptions = (opts2) => {\n Object.entries(opts2).forEach(([key, value]) => {\n if (typeof value === \"undefined\") delete opts2[key];\n });\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n onChange: () => {\n },\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n gap: 0,\n indexAttribute: \"data-index\",\n initialMeasurementsCache: [],\n lanes: 1,\n isScrollingResetDelay: 150,\n enabled: true,\n isRtl: false,\n useScrollendEvent: false,\n useAnimationFrameWithResizeObserver: false,\n ...opts2\n };\n };\n this.notify = (sync) => {\n var _a, _b;\n (_b = (_a = this.options).onChange) == null ? void 0 : _b.call(_a, this, sync);\n };\n this.maybeNotify = memo(\n () => {\n this.calculateRange();\n return [\n this.isScrolling,\n this.range ? this.range.startIndex : null,\n this.range ? this.range.endIndex : null\n ];\n },\n (isScrolling) => {\n this.notify(isScrolling);\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"maybeNotify\",\n debug: () => this.options.debug,\n initialDeps: [\n this.isScrolling,\n this.range ? this.range.startIndex : null,\n this.range ? this.range.endIndex : null\n ]\n }\n );\n this.cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d());\n this.unsubs = [];\n this.observer.disconnect();\n this.scrollElement = null;\n this.targetWindow = null;\n };\n this._didMount = () => {\n return () => {\n this.cleanup();\n };\n };\n this._willUpdate = () => {\n var _a;\n const scrollElement = this.options.enabled ? this.options.getScrollElement() : null;\n if (this.scrollElement !== scrollElement) {\n this.cleanup();\n if (!scrollElement) {\n this.maybeNotify();\n return;\n }\n this.scrollElement = scrollElement;\n if (this.scrollElement && \"ownerDocument\" in this.scrollElement) {\n this.targetWindow = this.scrollElement.ownerDocument.defaultView;\n } else {\n this.targetWindow = ((_a = this.scrollElement) == null ? void 0 : _a.window) ?? null;\n }\n this.elementsCache.forEach((cached) => {\n this.observer.observe(cached);\n });\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect;\n this.maybeNotify();\n })\n );\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset, isScrolling) => {\n this.scrollAdjustments = 0;\n this.scrollDirection = isScrolling ? this.getScrollOffset() < offset ? \"forward\" : \"backward\" : null;\n this.scrollOffset = offset;\n this.isScrolling = isScrolling;\n this.maybeNotify();\n })\n );\n this._scrollToOffset(this.getScrollOffset(), {\n adjustments: void 0,\n behavior: void 0\n });\n }\n };\n this.getSize = () => {\n if (!this.options.enabled) {\n this.scrollRect = null;\n return 0;\n }\n this.scrollRect = this.scrollRect ?? this.options.initialRect;\n return this.scrollRect[this.options.horizontal ? \"width\" : \"height\"];\n };\n this.getScrollOffset = () => {\n if (!this.options.enabled) {\n this.scrollOffset = null;\n return 0;\n }\n this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset === \"function\" ? this.options.initialOffset() : this.options.initialOffset);\n return this.scrollOffset;\n };\n this.getFurthestMeasurement = (measurements, index) => {\n const furthestMeasurementsFound = /* @__PURE__ */ new Map();\n const furthestMeasurements = /* @__PURE__ */ new Map();\n for (let m = index - 1; m >= 0; m--) {\n const measurement = measurements[m];\n if (furthestMeasurementsFound.has(measurement.lane)) {\n continue;\n }\n const previousFurthestMeasurement = furthestMeasurements.get(\n measurement.lane\n );\n if (previousFurthestMeasurement == null || measurement.end > previousFurthestMeasurement.end) {\n furthestMeasurements.set(measurement.lane, measurement);\n } else if (measurement.end < previousFurthestMeasurement.end) {\n furthestMeasurementsFound.set(measurement.lane, true);\n }\n if (furthestMeasurementsFound.size === this.options.lanes) {\n break;\n }\n }\n return furthestMeasurements.size === this.options.lanes ? Array.from(furthestMeasurements.values()).sort((a, b) => {\n if (a.end === b.end) {\n return a.index - b.index;\n }\n return a.end - b.end;\n })[0] : void 0;\n };\n this.getMeasurementOptions = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.scrollMargin,\n this.options.getItemKey,\n this.options.enabled,\n this.options.lanes\n ],\n (count, paddingStart, scrollMargin, getItemKey, enabled, lanes) => {\n const lanesChanged = this.prevLanes !== void 0 && this.prevLanes !== lanes;\n if (lanesChanged) {\n this.lanesChangedFlag = true;\n }\n this.prevLanes = lanes;\n this.pendingMeasuredCacheIndexes = [];\n return {\n count,\n paddingStart,\n scrollMargin,\n getItemKey,\n enabled,\n lanes\n };\n },\n {\n key: false\n }\n );\n this.getMeasurements = memo(\n () => [this.getMeasurementOptions(), this.itemSizeCache],\n ({ count, paddingStart, scrollMargin, getItemKey, enabled, lanes }, itemSizeCache) => {\n if (!enabled) {\n this.measurementsCache = [];\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n return [];\n }\n if (this.laneAssignments.size > count) {\n for (const index of this.laneAssignments.keys()) {\n if (index >= count) {\n this.laneAssignments.delete(index);\n }\n }\n }\n if (this.lanesChangedFlag) {\n this.lanesChangedFlag = false;\n this.lanesSettling = true;\n this.measurementsCache = [];\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n this.pendingMeasuredCacheIndexes = [];\n }\n if (this.measurementsCache.length === 0 && !this.lanesSettling) {\n this.measurementsCache = this.options.initialMeasurementsCache;\n this.measurementsCache.forEach((item) => {\n this.itemSizeCache.set(item.key, item.size);\n });\n }\n const min = this.lanesSettling ? 0 : this.pendingMeasuredCacheIndexes.length > 0 ? Math.min(...this.pendingMeasuredCacheIndexes) : 0;\n this.pendingMeasuredCacheIndexes = [];\n if (this.lanesSettling && this.measurementsCache.length === count) {\n this.lanesSettling = false;\n }\n const measurements = this.measurementsCache.slice(0, min);\n const laneLastIndex = new Array(lanes).fill(\n void 0\n );\n for (let m = 0; m < min; m++) {\n const item = measurements[m];\n if (item) {\n laneLastIndex[item.lane] = m;\n }\n }\n for (let i = min; i < count; i++) {\n const key = getItemKey(i);\n const cachedLane = this.laneAssignments.get(i);\n let lane;\n let start;\n if (cachedLane !== void 0 && this.options.lanes > 1) {\n lane = cachedLane;\n const prevIndex = laneLastIndex[lane];\n const prevInLane = prevIndex !== void 0 ? measurements[prevIndex] : void 0;\n start = prevInLane ? prevInLane.end + this.options.gap : paddingStart + scrollMargin;\n } else {\n const furthestMeasurement = this.options.lanes === 1 ? measurements[i - 1] : this.getFurthestMeasurement(measurements, i);\n start = furthestMeasurement ? furthestMeasurement.end + this.options.gap : paddingStart + scrollMargin;\n lane = furthestMeasurement ? furthestMeasurement.lane : i % this.options.lanes;\n if (this.options.lanes > 1) {\n this.laneAssignments.set(i, lane);\n }\n }\n const measuredSize = itemSizeCache.get(key);\n const size = typeof measuredSize === \"number\" ? measuredSize : this.options.estimateSize(i);\n const end = start + size;\n measurements[i] = {\n index: i,\n start,\n size,\n end,\n key,\n lane\n };\n laneLastIndex[lane] = i;\n }\n this.measurementsCache = measurements;\n return measurements;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getMeasurements\",\n debug: () => this.options.debug\n }\n );\n this.calculateRange = memo(\n () => [\n this.getMeasurements(),\n this.getSize(),\n this.getScrollOffset(),\n this.options.lanes\n ],\n (measurements, outerSize, scrollOffset, lanes) => {\n return this.range = measurements.length > 0 && outerSize > 0 ? calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n lanes\n }) : null;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"calculateRange\",\n debug: () => this.options.debug\n }\n );\n this.getVirtualIndexes = memo(\n () => {\n let startIndex = null;\n let endIndex = null;\n const range = this.calculateRange();\n if (range) {\n startIndex = range.startIndex;\n endIndex = range.endIndex;\n }\n this.maybeNotify.updateDeps([this.isScrolling, startIndex, endIndex]);\n return [\n this.options.rangeExtractor,\n this.options.overscan,\n this.options.count,\n startIndex,\n endIndex\n ];\n },\n (rangeExtractor, overscan, count, startIndex, endIndex) => {\n return startIndex === null || endIndex === null ? [] : rangeExtractor({\n startIndex,\n endIndex,\n overscan,\n count\n });\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getVirtualIndexes\",\n debug: () => this.options.debug\n }\n );\n this.indexFromElement = (node) => {\n const attributeName = this.options.indexAttribute;\n const indexStr = node.getAttribute(attributeName);\n if (!indexStr) {\n console.warn(\n `Missing attribute name '${attributeName}={index}' on measured element.`\n );\n return -1;\n }\n return parseInt(indexStr, 10);\n };\n this._measureElement = (node, entry) => {\n const index = this.indexFromElement(node);\n const item = this.measurementsCache[index];\n if (!item) {\n return;\n }\n const key = item.key;\n const prevNode = this.elementsCache.get(key);\n if (prevNode !== node) {\n if (prevNode) {\n this.observer.unobserve(prevNode);\n }\n this.observer.observe(node);\n this.elementsCache.set(key, node);\n }\n if (node.isConnected) {\n this.resizeItem(index, this.options.measureElement(node, entry, this));\n }\n };\n this.resizeItem = (index, size) => {\n const item = this.measurementsCache[index];\n if (!item) {\n return;\n }\n const itemSize = this.itemSizeCache.get(item.key) ?? item.size;\n const delta = size - itemSize;\n if (delta !== 0) {\n if (this.shouldAdjustScrollPositionOnItemSizeChange !== void 0 ? this.shouldAdjustScrollPositionOnItemSizeChange(item, delta, this) : item.start < this.getScrollOffset() + this.scrollAdjustments) {\n if (process.env.NODE_ENV !== \"production\" && this.options.debug) {\n console.info(\"correction\", delta);\n }\n this._scrollToOffset(this.getScrollOffset(), {\n adjustments: this.scrollAdjustments += delta,\n behavior: void 0\n });\n }\n this.pendingMeasuredCacheIndexes.push(item.index);\n this.itemSizeCache = new Map(this.itemSizeCache.set(item.key, size));\n this.notify(false);\n }\n };\n this.measureElement = (node) => {\n if (!node) {\n this.elementsCache.forEach((cached, key) => {\n if (!cached.isConnected) {\n this.observer.unobserve(cached);\n this.elementsCache.delete(key);\n }\n });\n return;\n }\n this._measureElement(node, void 0);\n };\n this.getVirtualItems = memo(\n () => [this.getVirtualIndexes(), this.getMeasurements()],\n (indexes, measurements) => {\n const virtualItems = [];\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k];\n const measurement = measurements[i];\n virtualItems.push(measurement);\n }\n return virtualItems;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getVirtualItems\",\n debug: () => this.options.debug\n }\n );\n this.getVirtualItemForOffset = (offset) => {\n const measurements = this.getMeasurements();\n if (measurements.length === 0) {\n return void 0;\n }\n return notUndefined(\n measurements[findNearestBinarySearch(\n 0,\n measurements.length - 1,\n (index) => notUndefined(measurements[index]).start,\n offset\n )]\n );\n };\n this.getMaxScrollOffset = () => {\n if (!this.scrollElement) return 0;\n if (\"scrollHeight\" in this.scrollElement) {\n return this.options.horizontal ? this.scrollElement.scrollWidth - this.scrollElement.clientWidth : this.scrollElement.scrollHeight - this.scrollElement.clientHeight;\n } else {\n const doc = this.scrollElement.document.documentElement;\n return this.options.horizontal ? doc.scrollWidth - this.scrollElement.innerWidth : doc.scrollHeight - this.scrollElement.innerHeight;\n }\n };\n this.getOffsetForAlignment = (toOffset, align, itemSize = 0) => {\n if (!this.scrollElement) return 0;\n const size = this.getSize();\n const scrollOffset = this.getScrollOffset();\n if (align === \"auto\") {\n align = toOffset >= scrollOffset + size ? \"end\" : \"start\";\n }\n if (align === \"center\") {\n toOffset += (itemSize - size) / 2;\n } else if (align === \"end\") {\n toOffset -= size;\n }\n const maxOffset = this.getMaxScrollOffset();\n return Math.max(Math.min(maxOffset, toOffset), 0);\n };\n this.getOffsetForIndex = (index, align = \"auto\") => {\n index = Math.max(0, Math.min(index, this.options.count - 1));\n const item = this.measurementsCache[index];\n if (!item) {\n return void 0;\n }\n const size = this.getSize();\n const scrollOffset = this.getScrollOffset();\n if (align === \"auto\") {\n if (item.end >= scrollOffset + size - this.options.scrollPaddingEnd) {\n align = \"end\";\n } else if (item.start <= scrollOffset + this.options.scrollPaddingStart) {\n align = \"start\";\n } else {\n return [scrollOffset, align];\n }\n }\n if (align === \"end\" && index === this.options.count - 1) {\n return [this.getMaxScrollOffset(), align];\n }\n const toOffset = align === \"end\" ? item.end + this.options.scrollPaddingEnd : item.start - this.options.scrollPaddingStart;\n return [\n this.getOffsetForAlignment(toOffset, align, item.size),\n align\n ];\n };\n this.isDynamicMode = () => this.elementsCache.size > 0;\n this.scrollToOffset = (toOffset, { align = \"start\", behavior } = {}) => {\n if (behavior === \"smooth\" && this.isDynamicMode()) {\n console.warn(\n \"The `smooth` scroll behavior is not fully supported with dynamic size.\"\n );\n }\n this._scrollToOffset(this.getOffsetForAlignment(toOffset, align), {\n adjustments: void 0,\n behavior\n });\n };\n this.scrollToIndex = (index, { align: initialAlign = \"auto\", behavior } = {}) => {\n if (behavior === \"smooth\" && this.isDynamicMode()) {\n console.warn(\n \"The `smooth` scroll behavior is not fully supported with dynamic size.\"\n );\n }\n index = Math.max(0, Math.min(index, this.options.count - 1));\n this.currentScrollToIndex = index;\n let attempts = 0;\n const maxAttempts = 10;\n const tryScroll = (currentAlign) => {\n if (!this.targetWindow) return;\n const offsetInfo = this.getOffsetForIndex(index, currentAlign);\n if (!offsetInfo) {\n console.warn(\"Failed to get offset for index:\", index);\n return;\n }\n const [offset, align] = offsetInfo;\n this._scrollToOffset(offset, { adjustments: void 0, behavior });\n this.targetWindow.requestAnimationFrame(() => {\n if (!this.targetWindow) return;\n const verify = () => {\n if (this.currentScrollToIndex !== index) return;\n const currentOffset = this.getScrollOffset();\n const afterInfo = this.getOffsetForIndex(index, align);\n if (!afterInfo) {\n console.warn(\"Failed to get offset for index:\", index);\n return;\n }\n if (!approxEqual(afterInfo[0], currentOffset)) {\n scheduleRetry(align);\n }\n };\n if (this.isDynamicMode()) {\n this.targetWindow.requestAnimationFrame(verify);\n } else {\n verify();\n }\n });\n };\n const scheduleRetry = (align) => {\n if (!this.targetWindow) return;\n if (this.currentScrollToIndex !== index) return;\n attempts++;\n if (attempts < maxAttempts) {\n if (process.env.NODE_ENV !== \"production\" && this.options.debug) {\n console.info(\"Schedule retry\", attempts, maxAttempts);\n }\n this.targetWindow.requestAnimationFrame(() => tryScroll(align));\n } else {\n console.warn(\n `Failed to scroll to index ${index} after ${maxAttempts} attempts.`\n );\n }\n };\n tryScroll(initialAlign);\n };\n this.scrollBy = (delta, { behavior } = {}) => {\n if (behavior === \"smooth\" && this.isDynamicMode()) {\n console.warn(\n \"The `smooth` scroll behavior is not fully supported with dynamic size.\"\n );\n }\n this._scrollToOffset(this.getScrollOffset() + delta, {\n adjustments: void 0,\n behavior\n });\n };\n this.getTotalSize = () => {\n var _a;\n const measurements = this.getMeasurements();\n let end;\n if (measurements.length === 0) {\n end = this.options.paddingStart;\n } else if (this.options.lanes === 1) {\n end = ((_a = measurements[measurements.length - 1]) == null ? void 0 : _a.end) ?? 0;\n } else {\n const endByLane = Array(this.options.lanes).fill(null);\n let endIndex = measurements.length - 1;\n while (endIndex >= 0 && endByLane.some((val) => val === null)) {\n const item = measurements[endIndex];\n if (endByLane[item.lane] === null) {\n endByLane[item.lane] = item.end;\n }\n endIndex--;\n }\n end = Math.max(...endByLane.filter((val) => val !== null));\n }\n return Math.max(\n end - this.options.scrollMargin + this.options.paddingEnd,\n 0\n );\n };\n this._scrollToOffset = (offset, {\n adjustments,\n behavior\n }) => {\n this.options.scrollToFn(offset, { behavior, adjustments }, this);\n };\n this.measure = () => {\n this.itemSizeCache = /* @__PURE__ */ new Map();\n this.laneAssignments = /* @__PURE__ */ new Map();\n this.notify(false);\n };\n this.setOptions(opts);\n }\n}\nconst findNearestBinarySearch = (low, high, getCurrentValue, value) => {\n while (low <= high) {\n const middle = (low + high) / 2 | 0;\n const currentValue = getCurrentValue(middle);\n if (currentValue < value) {\n low = middle + 1;\n } else if (currentValue > value) {\n high = middle - 1;\n } else {\n return middle;\n }\n }\n if (low > 0) {\n return low - 1;\n } else {\n return 0;\n }\n};\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n lanes\n}) {\n const lastIndex = measurements.length - 1;\n const getOffset = (index) => measurements[index].start;\n if (measurements.length <= lanes) {\n return {\n startIndex: 0,\n endIndex: lastIndex\n };\n }\n let startIndex = findNearestBinarySearch(\n 0,\n lastIndex,\n getOffset,\n scrollOffset\n );\n let endIndex = startIndex;\n if (lanes === 1) {\n while (endIndex < lastIndex && measurements[endIndex].end < scrollOffset + outerSize) {\n endIndex++;\n }\n } else if (lanes > 1) {\n const endPerLane = Array(lanes).fill(0);\n while (endIndex < lastIndex && endPerLane.some((pos) => pos < scrollOffset + outerSize)) {\n const item = measurements[endIndex];\n endPerLane[item.lane] = item.end;\n endIndex++;\n }\n const startPerLane = Array(lanes).fill(scrollOffset + outerSize);\n while (startIndex >= 0 && startPerLane.some((pos) => pos >= scrollOffset)) {\n const item = measurements[startIndex];\n startPerLane[item.lane] = item.start;\n startIndex--;\n }\n startIndex = Math.max(0, startIndex - startIndex % lanes);\n endIndex = Math.min(lastIndex, endIndex + (lanes - 1 - endIndex % lanes));\n }\n return { startIndex, endIndex };\n}\nexport {\n Virtualizer,\n approxEqual,\n debounce,\n defaultKeyExtractor,\n defaultRangeExtractor,\n elementScroll,\n measureElement,\n memo,\n notUndefined,\n observeElementOffset,\n observeElementRect,\n observeWindowOffset,\n observeWindowRect,\n windowScroll\n};\n//# sourceMappingURL=index.js.map\n","import * as React from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { Virtualizer, elementScroll, observeElementOffset, observeElementRect, windowScroll, observeWindowOffset, observeWindowRect } from \"@tanstack/virtual-core\";\nexport * from \"@tanstack/virtual-core\";\nconst useIsomorphicLayoutEffect = typeof document !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\nfunction useVirtualizerBase({\n useFlushSync = true,\n ...options\n}) {\n const rerender = React.useReducer(() => ({}), {})[1];\n const resolvedOptions = {\n ...options,\n onChange: (instance2, sync) => {\n var _a;\n if (useFlushSync && sync) {\n flushSync(rerender);\n } else {\n rerender();\n }\n (_a = options.onChange) == null ? void 0 : _a.call(options, instance2, sync);\n }\n };\n const [instance] = React.useState(\n () => new Virtualizer(resolvedOptions)\n );\n instance.setOptions(resolvedOptions);\n useIsomorphicLayoutEffect(() => {\n return instance._didMount();\n }, []);\n useIsomorphicLayoutEffect(() => {\n return instance._willUpdate();\n });\n return instance;\n}\nfunction useVirtualizer(options) {\n return useVirtualizerBase({\n observeElementRect,\n observeElementOffset,\n scrollToFn: elementScroll,\n ...options\n });\n}\nfunction useWindowVirtualizer(options) {\n return useVirtualizerBase({\n getScrollElement: () => typeof document !== \"undefined\" ? window : null,\n observeElementRect: observeWindowRect,\n observeElementOffset: observeWindowOffset,\n scrollToFn: windowScroll,\n initialOffset: () => typeof document !== \"undefined\" ? window.scrollY : 0,\n ...options\n });\n}\nexport {\n useVirtualizer,\n useWindowVirtualizer\n};\n//# sourceMappingURL=index.js.map\n","import { i as ConnectTooltipProvider, r as ConnectTooltip } from \"./document-timeline-FWiQhfIq.js\";\nimport { C as DropdownMenuTrigger, b as DropdownMenuContent, c as SidebarFooter, d as Pagination, f as mergeClassNameProps, g as getDimensions, h as Icon, l as SidebarHeader, m as Modal, p as PackageAnimation, r as usePagination, s as Sidebar, t as cn, u as SidebarPanel, w as PowerhouseButton, x as DropdownMenuItem, y as DropdownMenu } from \"./src-8xf1ueaA.js\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./ui/components/popover/popover.js\";\nimport { SelectFieldRaw } from \"./ui/components/select-field/select-field.js\";\nimport { Input } from \"./ui/components/input/input.js\";\nimport { JsonViewer } from \"./ui/components/json-viewer/json-viewer.js\";\nimport { SearchAutocomplete } from \"./ui/components/search-autocomplete/search-autocomplete.js\";\nimport React, { Fragment, Suspense, createElement, forwardRef, lazy, memo, useCallback, useEffect, useLayoutEffect, useMemo, useReducer, useRef, useState } from \"react\";\nimport { twJoin, twMerge } from \"tailwind-merge\";\nimport { Fragment as Fragment$1, jsx, jsxs } from \"react/jsx-runtime\";\nimport { Controller, useForm } from \"react-hook-form\";\nimport { format } from \"date-fns\";\nimport { useCopyToClipboard, useDebounceValue, useEventListener, useOnClickOutside } from \"usehooks-ts\";\nimport { SyncOperationStatus, addFolder, exportDocument, getSyncStatusSync, setSelectedDrive, setSelectedNode, setSelectedTimelineItem, showDeleteNodeModal, showPHModal, showRevisionHistory, useDocumentById, useGetSwitchboardLink, useIsDragAndDropEnabled, useNodeActions, useNodeParentFolderById, useOnDropFile, useSelectedDocumentSafe, useSelectedDriveId, useSelectedDriveSafe, useSelectedNodePath, useUserPermissions } from \"@powerhousedao/reactor-browser\";\nimport Select, { components } from \"react-select\";\nimport { Content, List, Root, Trigger } from \"@radix-ui/react-tabs\";\nimport { garbageCollect, redo, sortOperations, undo } from \"@powerhousedao/shared/document-model\";\nimport { isValidName } from \"@powerhousedao/shared/document-drive\";\nimport { capitalCase } from \"change-case\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\n//#region src/connect/components/account-popover/account-popover.tsx\nconst AccountPopover = ({ children, content }) => {\n\treturn /* @__PURE__ */ jsxs(Popover, { children: [/* @__PURE__ */ jsx(PopoverTrigger, {\n\t\tasChild: true,\n\t\tchildren: /* @__PURE__ */ jsx(\"button\", {\n\t\t\ttype: \"button\",\n\t\t\t\"aria-label\": \"Open Account\",\n\t\t\tclassName: \"cursor-pointer\",\n\t\t\tchildren\n\t\t})\n\t}), /* @__PURE__ */ jsx(PopoverContent, {\n\t\tclassName: \"w-52 p-0\",\n\t\talign: \"start\",\n\t\tchildren: content\n\t})] });\n};\n//#endregion\n//#region assets/connect-loader.mp4\nvar connect_loader_default = \"data:video/mp4;base64,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\";\n//#endregion\n//#region src/connect/components/animated-loader/animated-loader.tsx\nfunction AnimatedLoader(props) {\n\tconst { style, size = 100, ...delegatedProps } = props;\n\tconst dimensions = getDimensions(size);\n\tconst _style = {\n\t\tobjectFit: \"contain\",\n\t\tpointerEvents: \"none\",\n\t\t...dimensions,\n\t\t...style\n\t};\n\tconst width = dimensions.width?.replace(\"px\", \"\");\n\tconst height = dimensions.height?.replace(\"px\", \"\");\n\treturn /* @__PURE__ */ jsx(\"video\", {\n\t\tautoPlay: true,\n\t\theight,\n\t\tloop: true,\n\t\tmuted: true,\n\t\tplaysInline: true,\n\t\twidth,\n\t\t...delegatedProps,\n\t\tstyle: _style,\n\t\tchildren: /* @__PURE__ */ jsx(\"source\", {\n\t\t\tsrc: connect_loader_default,\n\t\t\ttype: \"video/mp4\"\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/node-input/node-input.tsx\nfunction NodeInput(props) {\n\tconst { onSubmit, onCancel, defaultValue, className, minLength = 1, ...inputProps } = props;\n\tconst [value, setValue] = useState(defaultValue ?? \"\");\n\tconst ref = useRef(null);\n\tuseOnClickOutside(ref, handleSubmit);\n\tuseEventListener(\"keyup\", (e) => {\n\t\tif (e.key === \"Enter\") handleSubmit();\n\t\tif (e.key === \"Escape\") onCancel();\n\t});\n\tuseLayoutEffect(() => {\n\t\tsetTimeout(() => {\n\t\t\tref.current?.focus();\n\t\t\tref.current?.select();\n\t\t\tref.current?.scroll({ left: 9999 });\n\t\t}, 100);\n\t}, []);\n\tfunction handleSubmit() {\n\t\tif (value.length >= minLength) onSubmit(value);\n\t}\n\treturn /* @__PURE__ */ jsx(\"input\", {\n\t\t...inputProps,\n\t\tautoFocus: true,\n\t\tclassName: twMerge(\"bg-inherit text-inherit outline-none\", className),\n\t\tminLength,\n\t\tonChange: (e) => setValue(e.target.value),\n\t\tref,\n\t\trequired: true,\n\t\ttype: \"text\",\n\t\tvalue\n\t});\n}\n//#endregion\n//#region src/connect/components/breadcrumbs/breadcrumbs.tsx\nfunction Breadcrumbs() {\n\tconst { isAllowedToCreateDocuments } = useUserPermissions();\n\tconst [selectedDrive] = useSelectedDriveSafe();\n\tconst selectedDriveId = useSelectedDriveId();\n\tconst selectedNodePath = useSelectedNodePath();\n\tconst [isCreating, setIsCreating] = useState(false);\n\tfunction onAddNew() {\n\t\tsetIsCreating(true);\n\t}\n\tfunction onSubmit(name) {\n\t\tif (!isAllowedToCreateDocuments || !selectedDriveId) return;\n\t\taddFolder(selectedDriveId, name, selectedNodePath.at(-1)?.id).then((node) => {\n\t\t\tsetSelectedNode(node);\n\t\t}).catch((error) => {\n\t\t\tconsole.error(error);\n\t\t}).finally(() => {\n\t\t\tsetIsCreating(false);\n\t\t});\n\t}\n\tfunction onCancel() {\n\t\tsetIsCreating(false);\n\t}\n\tconst hasSelectedDrive = !!selectedDrive;\n\tconst hasNodePath = !!selectedNodePath.length;\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex h-9 flex-row items-center gap-2 p-6 text-gray-500\",\n\t\tchildren: [\n\t\t\thasSelectedDrive && /* @__PURE__ */ jsxs(Fragment$1, { children: [\n\t\t\t\t/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\"aria-label\": \"Back to home\",\n\t\t\t\t\ttitle: \"Back to home\",\n\t\t\t\t\tclassName: \"flex items-center justify-center rounded-md p-1 transition-colors hover:bg-gray-100 hover:text-gray-800\",\n\t\t\t\t\tonClick: () => setSelectedDrive(void 0),\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\tname: \"ArrowLeft\",\n\t\t\t\t\t\tsize: 14\n\t\t\t\t\t})\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsx(Breadcrumb, {\n\t\t\t\t\tname: selectedDrive.state.global.name,\n\t\t\t\t\tonClick: () => setSelectedDrive(selectedDrive)\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsx(\"span\", { children: \"/\" })\n\t\t\t] }),\n\t\t\thasNodePath && selectedNodePath.map((node) => /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Breadcrumb, {\n\t\t\t\tname: node.name,\n\t\t\t\tonClick: () => setSelectedNode(node)\n\t\t\t}), /* @__PURE__ */ jsx(\"span\", { children: \"/\" })] }, node.id)),\n\t\t\tisAllowedToCreateDocuments && (isCreating ? /* @__PURE__ */ jsx(NodeInput, {\n\t\t\t\tclassName: \"text-gray-800\",\n\t\t\t\tdefaultValue: \"New Folder\",\n\t\t\t\tonCancel,\n\t\t\t\tonSubmit,\n\t\t\t\tplaceholder: \"New Folder\"\n\t\t\t}) : /* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\ttype: \"button\",\n\t\t\t\tclassName: \"ml-1 flex items-center justify-center gap-2 rounded-md bg-gray-50 px-2 py-1.5 transition-colors hover:bg-gray-200 hover:text-gray-800\",\n\t\t\t\tonClick: onAddNew,\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tname: \"Plus\",\n\t\t\t\t\tsize: 14\n\t\t\t\t}), \"Add new\"]\n\t\t\t}))\n\t\t]\n\t});\n}\nfunction Breadcrumb(props) {\n\tconst { name, onClick } = props;\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName: \"transition-colors last-of-type:text-gray-800 hover:text-gray-800\",\n\t\tonClick,\n\t\trole: \"button\",\n\t\tchildren: name\n\t});\n}\n//#endregion\n//#region src/connect/components/combobox/combobox.tsx\nfunction DropdownIndicator(props) {\n\treturn /* @__PURE__ */ jsx(components.DropdownIndicator, {\n\t\t...props,\n\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\tname: \"ChevronDown\",\n\t\t\tsize: 16\n\t\t})\n\t});\n}\nfunction ClearIndicator(props) {\n\treturn /* @__PURE__ */ jsx(components.ClearIndicator, {\n\t\t...props,\n\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\tname: \"Xmark\",\n\t\t\tsize: 16\n\t\t})\n\t});\n}\nfunction MenuList(props) {\n\tconst { label, onClick, ...rest } = props;\n\tconst hasAddItemButton = !!label && !!onClick;\n\treturn /* @__PURE__ */ jsxs(components.MenuList, {\n\t\t...rest,\n\t\tchildren: [props.children, hasAddItemButton ? /* @__PURE__ */ jsx(\"button\", {\n\t\t\tclassName: \"w-full px-2 py-3 hover:bg-slate-50\",\n\t\t\tonClick,\n\t\t\tchildren: label\n\t\t}) : null]\n\t});\n}\nfunction Combobox(props) {\n\tconst invalid = props[\"aria-invalid\"] === \"true\";\n\tconst { addItemButtonProps, ...rest } = props;\n\treturn /* @__PURE__ */ jsx(Select, {\n\t\t...rest,\n\t\tcomponents: {\n\t\t\tDropdownIndicator,\n\t\t\tClearIndicator,\n\t\t\tMenuList: (menuListProps) => MenuList({\n\t\t\t\t...menuListProps,\n\t\t\t\t...addItemButtonProps\n\t\t\t})\n\t\t},\n\t\tstyles: {\n\t\t\tdropdownIndicator: () => {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: \"indicatorContainer\",\n\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\ttransition: \"color 150ms\",\n\t\t\t\t\tcolor: \"var(color-gray-900)\",\n\t\t\t\t\tpadding: 8,\n\t\t\t\t\tboxSizing: \"border-box\"\n\t\t\t\t};\n\t\t\t},\n\t\t\tclearIndicator: (baseStyles) => {\n\t\t\t\treturn {\n\t\t\t\t\t...baseStyles,\n\t\t\t\t\tcolor: \"var(color-gray-900)\"\n\t\t\t\t};\n\t\t\t},\n\t\t\tcontainer: (baseStyles) => {\n\t\t\t\treturn {\n\t\t\t\t\t...baseStyles,\n\t\t\t\t\tborderColor: \"var(color-gray-200)\",\n\t\t\t\t\tfontSize: 12\n\t\t\t\t};\n\t\t\t},\n\t\t\tplaceholder: (baseStyles) => {\n\t\t\t\treturn {\n\t\t\t\t\t...baseStyles,\n\t\t\t\t\tcolor: invalid ? \"var(color-red-800)\" : \"var(color-gray-500)\"\n\t\t\t\t};\n\t\t\t},\n\t\t\tcontrol: () => {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: \"control\",\n\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\tcursor: \"default\",\n\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\tflexWrap: \"wrap\",\n\t\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\t\tminHeight: 32,\n\t\t\t\t\toutline: \"0 !important\",\n\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\ttransition: \"all 100ms\",\n\t\t\t\t\tbackgroundColor: \"var(--color-white)\",\n\t\t\t\t\tborderColor: invalid ? \"var(--color-red-900)\" : \"var(--color-gray-200)\",\n\t\t\t\t\tborderStyle: \"solid\",\n\t\t\t\t\tborderWidth: 1,\n\t\t\t\t\tborderRadius: \"6px\",\n\t\t\t\t\tboxSizing: \"border-box\"\n\t\t\t\t};\n\t\t\t},\n\t\t\toption: (baseStyles, state) => {\n\t\t\t\treturn {\n\t\t\t\t\t...baseStyles,\n\t\t\t\t\tbackgroundColor: state.isSelected ? \"var(--color-slate-50)\" : \"var(--color-white)\",\n\t\t\t\t\tcolor: \"var(--color-gray-800)\",\n\t\t\t\t\t\":hover\": { backgroundColor: \"var(--color-slate-50)\" }\n\t\t\t\t};\n\t\t\t},\n\t\t\tmenuList: (baseStyles) => ({\n\t\t\t\t...baseStyles,\n\t\t\t\tpadding: 0,\n\t\t\t\tborderRadius: \"6px\"\n\t\t\t})\n\t\t},\n\t\ttheme: (theme) => ({\n\t\t\t...theme,\n\t\t\tcolors: {\n\t\t\t\t...theme.colors,\n\t\t\t\tprimary: \"var(--color-slate-100)\",\n\t\t\t\tprimary25: \"var(--color-slate-50)\",\n\t\t\t\tprimary50: \"var(--color-slate-100)\",\n\t\t\t\tprimary75: \"var(--color-slate-100)\",\n\t\t\t\tdanger: \"var(--color-red-900)\",\n\t\t\t\tdangerLight: \"var(--color-red-100)\",\n\t\t\t\tneutral0: \"var(--color-white)\",\n\t\t\t\tneutral5: \"var(--color-gray-50)\",\n\t\t\t\tneutral10: \"var(--color-gray-100)\",\n\t\t\t\tneutral20: \"var(--color-gray-200)\",\n\t\t\t\tneutral30: \"var(--color-gray-300)\",\n\t\t\t\tneutral40: \"var(--color-gray-400)\",\n\t\t\t\tneutral50: \"var(--color-gray-500)\",\n\t\t\t\tneutral60: \"var(--color-gray-600)\",\n\t\t\t\tneutral70: \"var(--color-gray-700)\",\n\t\t\t\tneutral80: \"var(--color-gray-800)\",\n\t\t\t\tneutral90: \"var(--color-gray-900)\"\n\t\t\t}\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/cookie-banner/cookie-banner.tsx\nconst CookieBanner = (props) => {\n\tconst { children, cookies, submitLabel, rejectLabel, onSubmit = () => {}, onReject = () => {}, ...divProps } = props;\n\tconst [cookiesValue, setCookiesValue] = useState(cookies);\n\tconst handleOnChange = (event) => {\n\t\tconst { id, checked } = event.target;\n\t\tsetCookiesValue((prevState) => prevState.map((cookie) => cookie.id === id ? {\n\t\t\t...cookie,\n\t\t\tvalue: checked\n\t\t} : cookie));\n\t};\n\tconst buttonStyles = \"min-w-64 h-8 text-base\";\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\t...mergeClassNameProps(divProps, \"flex flex-col items-center\"),\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"text-center\",\n\t\t\t\tchildren\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"my-8 flex gap-x-16 text-sm font-medium\",\n\t\t\t\tchildren: cookiesValue.map((cookie, i) => /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"cursor-pointer\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"input\", {\n\t\t\t\t\t\tchecked: cookie.value,\n\t\t\t\t\t\tclassName: \"mr-1 size-3 cursor-pointer rounded-sm border-2 border-gray-900 accent-gray-900 focus:outline-none\",\n\t\t\t\t\t\tid: cookie.id,\n\t\t\t\t\t\tonChange: handleOnChange,\n\t\t\t\t\t\ttype: \"checkbox\"\n\t\t\t\t\t}), /* @__PURE__ */ jsx(\"label\", {\n\t\t\t\t\t\tclassName: \"cursor-pointer select-none\",\n\t\t\t\t\t\thtmlFor: cookie.id,\n\t\t\t\t\t\tchildren: cookie.label\n\t\t\t\t\t})]\n\t\t\t\t}, i))\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex gap-x-8\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(PowerhouseButton, {\n\t\t\t\t\tclassName: buttonStyles,\n\t\t\t\t\tcolor: \"light\",\n\t\t\t\t\tonClick: () => onReject(),\n\t\t\t\t\tsize: \"small\",\n\t\t\t\t\tchildren: rejectLabel\n\t\t\t\t}, \"button-reject\"), /* @__PURE__ */ jsx(PowerhouseButton, {\n\t\t\t\t\tclassName: buttonStyles,\n\t\t\t\t\tonClick: () => onSubmit(cookiesValue),\n\t\t\t\t\tsize: \"small\",\n\t\t\t\t\tchildren: submitLabel\n\t\t\t\t}, \"button-submit\")]\n\t\t\t})\n\t\t]\n\t});\n};\n//#endregion\n//#region src/connect/components/modal/confirmation-modal.tsx\nconst buttonStyles$5 = \"min-h-[48px] min-w-[142px] text-base font-semibold py-3 px-6 rounded-xl outline-none active:opacity-75 hover:scale-105 transform transition-all\";\nfunction ConnectConfirmationModal(props) {\n\tconst { body, header, children, onCancel, onOpenChange, onContinue, cancelLabel, continueLabel, overlayProps, contentProps, bodyProps = {}, headerProps = {}, containerProps = {}, cancelButtonProps = {}, continueButtonProps = {}, buttonContainerProps = {}, ...restProps } = props;\n\treturn /* @__PURE__ */ jsx(Modal, {\n\t\tcontentProps: {\n\t\t\t...contentProps,\n\t\t\tclassName: twMerge(\"rounded-3xl\", contentProps?.className)\n\t\t},\n\t\tonOpenChange,\n\t\toverlayProps: {\n\t\t\t...overlayProps,\n\t\t\tclassName: overlayProps?.className\n\t\t},\n\t\t...restProps,\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t...mergeClassNameProps(containerProps, \"w-[400px] p-6 text-slate-300\"),\n\t\t\tchildren: [\n\t\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t...mergeClassNameProps(headerProps, \"border-b border-slate-50 pb-2 text-2xl font-bold text-gray-800\"),\n\t\t\t\t\tchildren: header\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t...mergeClassNameProps(bodyProps, \"my-6 rounded-md bg-slate-50 p-4 text-center\"),\n\t\t\t\t\tchildren: [body, children]\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t...mergeClassNameProps(buttonContainerProps, \"mt-8 flex justify-between gap-3\"),\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\tonClick: onCancel,\n\t\t\t\t\t\t...mergeClassNameProps(cancelButtonProps, twMerge(buttonStyles$5, \"flex-1 bg-slate-50 text-slate-800\")),\n\t\t\t\t\t\tchildren: cancelLabel\n\t\t\t\t\t}), /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\tonClick: onContinue,\n\t\t\t\t\t\t...mergeClassNameProps(continueButtonProps, twMerge(buttonStyles$5, \"flex-1 bg-gray-800 text-gray-50\")),\n\t\t\t\t\t\tchildren: continueLabel\n\t\t\t\t\t})]\n\t\t\t\t})\n\t\t\t]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/db-explorer/components/schema-tree-sidebar.tsx\nconst INDENT_PX = 16;\nfunction TreeItem({ label, depth, expanded, selected, hasChildren, icon, onToggle, onClick, children }) {\n\tconst handleChevronClick = (e) => {\n\t\te.stopPropagation();\n\t\tonToggle?.();\n\t};\n\treturn /* @__PURE__ */ jsxs(\"div\", { children: [/* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: twMerge(\"flex cursor-pointer items-center gap-1 py-1 pr-2 text-sm hover:bg-gray-100\", selected && \"bg-blue-50\"),\n\t\tstyle: { paddingLeft: depth * INDENT_PX + 4 },\n\t\tonClick,\n\t\tchildren: [\n\t\t\thasChildren ? /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\tclassName: \"flex h-4 w-4 shrink-0 items-center justify-center text-gray-500 hover:text-gray-700\",\n\t\t\t\tonClick: handleChevronClick,\n\t\t\t\ttype: \"button\",\n\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tclassName: twMerge(\"transition-transform\", expanded && \"rotate-90\"),\n\t\t\t\t\tname: \"CaretRight\",\n\t\t\t\t\tsize: 12\n\t\t\t\t})\n\t\t\t}) : /* @__PURE__ */ jsx(\"span\", { className: \"w-4 shrink-0\" }),\n\t\t\ticon && /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\tclassName: \"shrink-0 text-gray-500\",\n\t\t\t\tchildren: icon\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\tclassName: \"min-w-0 flex-1 truncate text-gray-700\",\n\t\t\t\tchildren: label\n\t\t\t}),\n\t\t\tselected && /* @__PURE__ */ jsx(\"span\", { className: \"ml-auto h-2 w-2 shrink-0 rounded-full bg-blue-500\" })\n\t\t]\n\t}), expanded && children] });\n}\nfunction ColumnItem({ column, depth }) {\n\tconst typeLabel = column.dataType.length > 10 ? column.dataType.slice(0, 10) + \"…\" : column.dataType;\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex items-center gap-1 py-0.5 pr-2 text-xs text-gray-500\",\n\t\tstyle: { paddingLeft: depth * INDENT_PX + 4 },\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(\"span\", { className: \"w-4 shrink-0\" }),\n\t\t\t/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\tclassName: \"truncate\",\n\t\t\t\tchildren: column.name\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(\"span\", {\n\t\t\t\tclassName: \"ml-auto shrink-0 text-gray-400\",\n\t\t\t\tchildren: [\n\t\t\t\t\t\"(\",\n\t\t\t\t\ttypeLabel,\n\t\t\t\t\t\")\"\n\t\t\t\t]\n\t\t\t})\n\t\t]\n\t});\n}\nfunction SchemaTreeSidebar({ schema, tables, selectedTable, onSelectTable, onRefresh, loading }) {\n\tconst [expandedNodes, setExpandedNodes] = useState({ [schema]: true });\n\tconst toggleNode = (nodeId) => {\n\t\tsetExpandedNodes((prev) => ({\n\t\t\t...prev,\n\t\t\t[nodeId]: !prev[nodeId]\n\t\t}));\n\t};\n\tconst handleTableClick = (tableName) => {\n\t\tonSelectTable(tableName);\n\t\tsetExpandedNodes((prev) => ({\n\t\t\t...prev,\n\t\t\t[tableName]: !prev[tableName]\n\t\t}));\n\t};\n\tconst isSchemaExpanded = expandedNodes[schema] ?? false;\n\tconst handleRefreshClick = (e) => {\n\t\te.stopPropagation();\n\t\tonRefresh?.();\n\t};\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName: \"flex flex-col overflow-auto pt-4 text-sm\",\n\t\tchildren: /* @__PURE__ */ jsx(TreeItem, {\n\t\t\tdepth: 0,\n\t\t\texpanded: isSchemaExpanded,\n\t\t\thasChildren: tables.length > 0,\n\t\t\ticon: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\tname: isSchemaExpanded ? \"FolderOpen\" : \"FolderClose\",\n\t\t\t\tsize: 16\n\t\t\t}),\n\t\t\tlabel: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex flex-1 items-center\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\tclassName: \"truncate\",\n\t\t\t\t\tchildren: schema\n\t\t\t\t}), onRefresh && /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\tclassName: \"ml-auto p-0.5 text-gray-400 hover:text-gray-600\",\n\t\t\t\t\tonClick: handleRefreshClick,\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tdisabled: loading,\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\tname: \"Reload\",\n\t\t\t\t\t\tsize: 14,\n\t\t\t\t\t\tclassName: loading ? \"animate-spin\" : void 0\n\t\t\t\t\t})\n\t\t\t\t})]\n\t\t\t}),\n\t\t\tonClick: () => toggleNode(schema),\n\t\t\tonToggle: () => toggleNode(schema),\n\t\t\tchildren: tables.map((table) => {\n\t\t\t\tconst isTableExpanded = expandedNodes[table.name] ?? false;\n\t\t\t\tconst isSelected = selectedTable === table.name;\n\t\t\t\treturn /* @__PURE__ */ jsx(TreeItem, {\n\t\t\t\t\tdepth: 1,\n\t\t\t\t\texpanded: isTableExpanded,\n\t\t\t\t\thasChildren: table.columns.length > 0,\n\t\t\t\t\ticon: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\tname: \"TreeViewSlash\",\n\t\t\t\t\t\tsize: 16\n\t\t\t\t\t}),\n\t\t\t\t\tlabel: table.name,\n\t\t\t\t\tselected: isSelected,\n\t\t\t\t\tonClick: () => handleTableClick(table.name),\n\t\t\t\t\tonToggle: () => toggleNode(table.name),\n\t\t\t\t\tchildren: table.columns.map((col) => /* @__PURE__ */ jsx(ColumnItem, {\n\t\t\t\t\t\tcolumn: col,\n\t\t\t\t\t\tdepth: 2\n\t\t\t\t\t}, col.name))\n\t\t\t\t}, table.name);\n\t\t\t})\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/select/select.tsx\nfunction fixedForwardRef(render) {\n\treturn /* @__PURE__ */ forwardRef(render);\n}\nconst ConnectSelect = /* @__PURE__ */ fixedForwardRef(function Select(props, ref) {\n\tconst { items, value, id, onChange, containerClassName, menuClassName, itemClassName, absolutePositionMenu = false, borderRadius = \"6px\" } = props;\n\tconst [showItems, setShowItems] = useState(false);\n\tconst selectedItem = getItemByValue(value) ?? items[0];\n\tfunction onItemClick(item) {\n\t\tif (item.disabled) return;\n\t\tonChange(item.value);\n\t\tsetShowItems(false);\n\t}\n\tfunction getItemByValue(value) {\n\t\treturn items.find((item) => item.value === value);\n\t}\n\tconst itemsToShow = items.filter((item) => item.value !== value);\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: twMerge(\"border border-gray-200 bg-gray-50 text-gray-800 transition-[border-radius]\", absolutePositionMenu && \"relative\", containerClassName),\n\t\t\"data-open\": showItems,\n\t\tref,\n\t\tstyle: { borderRadius },\n\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: twMerge(\"flex min-w-[360px] cursor-pointer items-center justify-between pr-3 text-gray-800 outline-none\", menuClassName),\n\t\t\tid,\n\t\t\tonClick: () => setShowItems(!showItems),\n\t\t\tchildren: [/* @__PURE__ */ jsx(ItemContainer, {\n\t\t\t\t...selectedItem,\n\t\t\t\tclassName: itemClassName\n\t\t\t}), /* @__PURE__ */ jsx(Icon, {\n\t\t\t\tclassName: twJoin(\"transition\", showItems ? \"\" : \"-rotate-90\"),\n\t\t\t\tname: \"ChevronDown\"\n\t\t\t})]\n\t\t}), /* @__PURE__ */ jsx(\"div\", {\n\t\t\tclassName: twMerge(\"max-h-0 w-full overflow-hidden bg-inherit transition-[max-height] ease-in-out\", showItems && \"max-h-screen\", absolutePositionMenu && \"absolute\"),\n\t\t\tstyle: { borderRadius: `0 0 ${borderRadius} ${borderRadius}` },\n\t\t\tchildren: itemsToShow.map((item) => /* @__PURE__ */ jsx(ItemContainer, {\n\t\t\t\t...item,\n\t\t\t\tclassName: itemClassName,\n\t\t\t\tonItemClick: () => onItemClick(item)\n\t\t\t}, item.value))\n\t\t})]\n\t});\n});\nfunction ItemContainer(props) {\n\tconst { className, disabled, onItemClick, icon, displayValue, value, description } = props;\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: twMerge(disabled ? \"cursor-not-allowed text-gray-500\" : \"text-gray-800\", \"flex size-full cursor-pointer items-center gap-2 bg-inherit py-3 pl-3 text-start outline-none\", className),\n\t\tonClick: onItemClick,\n\t\tchildren: [icon, /* @__PURE__ */ jsxs(\"div\", { children: [/* @__PURE__ */ jsx(\"p\", {\n\t\t\tclassName: \"capitalize text-inherit\",\n\t\t\tchildren: displayValue ?? value.toLowerCase()\n\t\t}), /* @__PURE__ */ jsx(\"p\", {\n\t\t\tclassName: \"text-xs text-gray-600\",\n\t\t\tchildren: description\n\t\t})] })]\n\t});\n}\n//#endregion\n//#region src/connect/components/db-explorer/components/filter-bar.tsx\nfunction getAvailableOperators(column) {\n\tconst baseOperators = [\n\t\t\"=\",\n\t\t\"!=\",\n\t\t\">\",\n\t\t\"<\",\n\t\t\">=\",\n\t\t\"<=\",\n\t\t\"IS NULL\",\n\t\t\"IS NOT NULL\"\n\t];\n\tconst dataType = column.dataType.toLowerCase();\n\tif (dataType.includes(\"varchar\") || dataType.includes(\"text\") || dataType.includes(\"char\")) return [\n\t\t...baseOperators,\n\t\t\"LIKE\",\n\t\t\"ILIKE\"\n\t];\n\tif (dataType.includes(\"int\") || dataType.includes(\"decimal\") || dataType.includes(\"numeric\") || dataType.includes(\"real\") || dataType.includes(\"double\") || dataType.includes(\"float\") || dataType.includes(\"bigint\") || dataType.includes(\"smallint\")) return baseOperators;\n\treturn baseOperators;\n}\nfunction getInputType(column, operator) {\n\tif (operator === \"IS NULL\" || operator === \"IS NOT NULL\") return \"text\";\n\tconst dataType = column.dataType.toLowerCase();\n\tif (dataType.includes(\"int\") || dataType.includes(\"decimal\") || dataType.includes(\"numeric\") || dataType.includes(\"real\") || dataType.includes(\"double\") || dataType.includes(\"float\") || dataType.includes(\"bigint\") || dataType.includes(\"smallint\")) return \"number\";\n\tif (dataType.includes(\"timestamp\") || dataType.includes(\"date\") || dataType.includes(\"time\")) return \"datetime-local\";\n\treturn \"text\";\n}\nfunction FilterClauseComponent({ clause, columns, onUpdate, onRemove, showConnector, connector, onConnectorChange }) {\n\tconst column = columns.find((c) => c.name === clause.column);\n\tconst availableOperators = column ? getAvailableOperators(column) : [\"=\", \"!=\"];\n\tconst inputType = column ? getInputType(column, clause.operator) : \"text\";\n\tconst showValueInput = clause.operator !== \"IS NULL\" && clause.operator !== \"IS NOT NULL\";\n\tconst columnItems = useMemo(() => columns.map((col) => ({\n\t\tvalue: col.name,\n\t\tdisplayValue: col.name\n\t})), [columns]);\n\tconst operatorItems = useMemo(() => availableOperators.map((op) => ({\n\t\tvalue: op,\n\t\tdisplayValue: op\n\t})), [availableOperators]);\n\tconst connectorItems = useMemo(() => [{\n\t\tvalue: \"AND\",\n\t\tdisplayValue: \"AND\"\n\t}, {\n\t\tvalue: \"OR\",\n\t\tdisplayValue: \"OR\"\n\t}], []);\n\tconst handleColumnChange = useCallback((columnName) => {\n\t\tconst newColumn = columns.find((c) => c.name === columnName);\n\t\tif (!newColumn) return;\n\t\tconst newAvailableOperators = getAvailableOperators(newColumn);\n\t\tconst newOperator = newAvailableOperators.includes(clause.operator) ? clause.operator : newAvailableOperators[0];\n\t\tonUpdate({\n\t\t\t...clause,\n\t\t\tcolumn: columnName,\n\t\t\toperator: newOperator,\n\t\t\tvalue: \"\"\n\t\t});\n\t}, [\n\t\tclause,\n\t\tcolumns,\n\t\tonUpdate\n\t]);\n\tconst handleOperatorChange = useCallback((operator) => {\n\t\tonUpdate({\n\t\t\t...clause,\n\t\t\toperator,\n\t\t\tvalue: operator === \"IS NULL\" || operator === \"IS NOT NULL\" ? \"\" : clause.value\n\t\t});\n\t}, [clause, onUpdate]);\n\tconst handleValueChange = useCallback((value) => {\n\t\tonUpdate({\n\t\t\t...clause,\n\t\t\tvalue\n\t\t});\n\t}, [clause, onUpdate]);\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex items-center gap-2\",\n\t\tchildren: [\n\t\t\tshowConnector && /* @__PURE__ */ jsx(ConnectSelect, {\n\t\t\t\tabsolutePositionMenu: true,\n\t\t\t\tborderRadius: \"4px\",\n\t\t\t\tcontainerClassName: \"min-w-[80px]\",\n\t\t\t\tid: `connector-${clause.id}`,\n\t\t\t\titems: connectorItems,\n\t\t\t\titemClassName: \"px-2 py-1 text-xs\",\n\t\t\t\tmenuClassName: \"px-2 py-1 text-xs min-w-[80px]\",\n\t\t\t\tvalue: connector,\n\t\t\t\tonChange: onConnectorChange\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(ConnectSelect, {\n\t\t\t\tabsolutePositionMenu: true,\n\t\t\t\tborderRadius: \"4px\",\n\t\t\t\tcontainerClassName: \"min-w-[150px]\",\n\t\t\t\tid: `column-${clause.id}`,\n\t\t\t\titems: columnItems,\n\t\t\t\titemClassName: \"px-2 py-1 text-xs\",\n\t\t\t\tmenuClassName: \"px-2 py-1 text-xs min-w-[150px]\",\n\t\t\t\tvalue: clause.column,\n\t\t\t\tonChange: handleColumnChange\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(ConnectSelect, {\n\t\t\t\tabsolutePositionMenu: true,\n\t\t\t\tborderRadius: \"4px\",\n\t\t\t\tcontainerClassName: \"min-w-[100px]\",\n\t\t\t\tid: `operator-${clause.id}`,\n\t\t\t\titems: operatorItems,\n\t\t\t\titemClassName: \"px-2 py-1 text-xs\",\n\t\t\t\tmenuClassName: \"px-2 py-1 text-xs min-w-[100px]\",\n\t\t\t\tvalue: clause.operator,\n\t\t\t\tonChange: handleOperatorChange\n\t\t\t}),\n\t\t\tshowValueInput && /* @__PURE__ */ jsx(\"input\", {\n\t\t\t\tclassName: \"min-w-[150px] rounded border border-gray-300 bg-white px-2 py-1 text-xs text-gray-900\",\n\t\t\t\ttype: inputType,\n\t\t\t\tvalue: clause.value,\n\t\t\t\tonChange: (e) => handleValueChange(e.target.value)\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\tclassName: \"flex items-center justify-center rounded p-1 text-gray-500 hover:bg-gray-200 hover:text-gray-700\",\n\t\t\t\tonClick: onRemove,\n\t\t\t\ttitle: \"Remove filter\",\n\t\t\t\ttype: \"button\",\n\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tname: \"Xmark\",\n\t\t\t\t\tsize: 14\n\t\t\t\t})\n\t\t\t})\n\t\t]\n\t});\n}\nfunction FilterBar({ columns, filters, onFiltersChange }) {\n\tconst [isExpanded, setIsExpanded] = useState(false);\n\tconst handleAddFilter = useCallback(() => {\n\t\tconst newClause = {\n\t\t\tid: `filter-${Date.now()}-${Math.random()}`,\n\t\t\tcolumn: columns[0]?.name ?? \"\",\n\t\t\toperator: \"=\",\n\t\t\tvalue: \"\"\n\t\t};\n\t\tif (!filters) onFiltersChange({\n\t\t\tclauses: [newClause],\n\t\t\tconnectors: []\n\t\t});\n\t\telse onFiltersChange({\n\t\t\tclauses: [...filters.clauses, newClause],\n\t\t\tconnectors: [...filters.connectors, filters.clauses.length > 0 ? \"AND\" : \"AND\"]\n\t\t});\n\t\tsetIsExpanded(true);\n\t}, [\n\t\tcolumns,\n\t\tfilters,\n\t\tonFiltersChange\n\t]);\n\tconst handleUpdateClause = useCallback((index, clause) => {\n\t\tif (!filters) return;\n\t\tconst newClauses = [...filters.clauses];\n\t\tnewClauses[index] = clause;\n\t\tonFiltersChange({\n\t\t\t...filters,\n\t\t\tclauses: newClauses\n\t\t});\n\t}, [filters, onFiltersChange]);\n\tconst handleRemoveClause = useCallback((index) => {\n\t\tif (!filters) return;\n\t\tconst newClauses = filters.clauses.filter((_, i) => i !== index);\n\t\tconst newConnectors = filters.connectors.filter((_, i) => i !== index - 1);\n\t\tif (newClauses.length === 0) onFiltersChange(void 0);\n\t\telse onFiltersChange({\n\t\t\tclauses: newClauses,\n\t\t\tconnectors: newConnectors\n\t\t});\n\t}, [filters, onFiltersChange]);\n\tconst handleConnectorChange = useCallback((index, connector) => {\n\t\tif (!filters) return;\n\t\tconst newConnectors = [...filters.connectors];\n\t\tnewConnectors[index] = connector;\n\t\tonFiltersChange({\n\t\t\t...filters,\n\t\t\tconnectors: newConnectors\n\t\t});\n\t}, [filters, onFiltersChange]);\n\tconst hasFilters = filters && filters.clauses.length > 0;\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex shrink-0 flex-col gap-2 rounded-lg border border-gray-300 bg-white p-2\",\n\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"flex items-center justify-between\",\n\t\t\tchildren: [/* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\tclassName: \"flex items-center gap-1 text-xs text-gray-700 hover:text-gray-900\",\n\t\t\t\tonClick: () => setIsExpanded(!isExpanded),\n\t\t\t\ttype: \"button\",\n\t\t\t\tchildren: [\n\t\t\t\t\t/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\tclassName: twMerge(\"transition-transform\", isExpanded && \"rotate-90\"),\n\t\t\t\t\t\tname: \"ChevronDown\",\n\t\t\t\t\t\tsize: 12\n\t\t\t\t\t}),\n\t\t\t\t\t/* @__PURE__ */ jsx(\"span\", { children: \"Filters\" }),\n\t\t\t\t\thasFilters && /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\tclassName: \"rounded bg-blue-100 px-1.5 py-0.5 text-xs text-blue-700\",\n\t\t\t\t\t\tchildren: filters.clauses.length\n\t\t\t\t\t})\n\t\t\t\t]\n\t\t\t}), /* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-gray-300 bg-white px-2 py-1 text-xs text-gray-700 hover:bg-gray-100\",\n\t\t\t\tonClick: handleAddFilter,\n\t\t\t\ttype: \"button\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tname: \"Plus\",\n\t\t\t\t\tsize: 12\n\t\t\t\t}), \"Add Filter\"]\n\t\t\t})]\n\t\t}), isExpanded && hasFilters && /* @__PURE__ */ jsx(\"div\", {\n\t\t\tclassName: \"flex flex-col gap-2\",\n\t\t\tchildren: filters.clauses.map((clause, index) => /* @__PURE__ */ jsx(FilterClauseComponent, {\n\t\t\t\tclause,\n\t\t\t\tcolumns,\n\t\t\t\tconnector: index > 0 ? filters.connectors[index - 1] ?? \"AND\" : \"AND\",\n\t\t\t\tonConnectorChange: (connector) => handleConnectorChange(index - 1, connector),\n\t\t\t\tonRemove: () => handleRemoveClause(index),\n\t\t\t\tonUpdate: (updatedClause) => handleUpdateClause(index, updatedClause),\n\t\t\t\tshowConnector: index > 0\n\t\t\t}, clause.id))\n\t\t})]\n\t});\n}\n//#endregion\n//#region src/connect/components/db-explorer/components/table-view.tsx\nfunction formatCellValue(value) {\n\tif (value === null) return \"NULL\";\n\tif (value === void 0) return \"\";\n\tif (typeof value === \"object\") return JSON.stringify(value);\n\tif (typeof value === \"function\") return \"[function]\";\n\tif (typeof value === \"symbol\") return value.toString();\n\treturn String(value);\n}\nfunction escapeCsvValue(value) {\n\tif (value.includes(\",\") || value.includes(\"\\n\") || value.includes(\"\\\"\")) return `\"${value.replace(/\"/g, \"\\\"\\\"\")}\"`;\n\treturn value;\n}\nfunction rowToCsv(row, columns) {\n\treturn columns.map((column) => {\n\t\treturn escapeCsvValue(formatCellValue(row[column.name]));\n\t}).join(\",\");\n}\nfunction rowsToCsv(rows, columns) {\n\treturn [columns.map((col) => escapeCsvValue(col.name)).join(\",\"), ...rows.map((row) => rowToCsv(row, columns))].join(\"\\n\");\n}\nasync function copyToClipboard(text) {\n\tawait navigator.clipboard.writeText(text);\n}\nfunction SortIcon$3({ direction, active }) {\n\tif (!active) return /* @__PURE__ */ jsx(Icon, {\n\t\tclassName: \"opacity-0 group-hover:opacity-50\",\n\t\tname: \"CaretSort\",\n\t\tsize: 12\n\t});\n\treturn /* @__PURE__ */ jsx(Icon, {\n\t\tclassName: direction === \"asc\" ? \"rotate-180\" : void 0,\n\t\tname: \"TriangleDown\",\n\t\tsize: 12\n\t});\n}\nfunction TableView({ columns, rows, pagination, onPageChange, onSort, currentSort, loading = false, filters, onFiltersChange, onCopyAll }) {\n\tconst { offset, limit, total } = pagination;\n\tconst currentPage = Math.floor(offset / limit);\n\tconst totalPages = total !== null ? Math.ceil(total / limit) : 0;\n\tconst startItem = total === 0 ? 0 : offset + 1;\n\tconst endItem = total !== null ? Math.min(offset + limit, total) : offset + rows.length;\n\tconst goToPage = (page) => {\n\t\tonPageChange(page * limit);\n\t};\n\tconst handleSort = (columnName) => {\n\t\tif (!onSort) return;\n\t\tonSort({\n\t\t\tcolumn: columnName,\n\t\t\tdirection: currentSort?.column === columnName && currentSort.direction === \"asc\" ? \"desc\" : \"asc\"\n\t\t});\n\t};\n\tconst getVisiblePages = () => {\n\t\tconst maxVisible = 3;\n\t\tif (totalPages <= maxVisible) return Array.from({ length: totalPages }, (_, i) => i);\n\t\tconst start = Math.max(0, Math.min(currentPage - 1, totalPages - maxVisible));\n\t\tconst end = Math.min(totalPages - 1, start + maxVisible - 1);\n\t\tconst pages = [];\n\t\tfor (let i = start; i <= end; i++) pages.push(i);\n\t\treturn pages;\n\t};\n\tconst visiblePages = getVisiblePages();\n\tconst [copying, setCopying] = useState(false);\n\tconst [copiedRowIndex, setCopiedRowIndex] = useState(null);\n\tconst handleCopyAll = async () => {\n\t\tif (rows.length === 0) return;\n\t\tsetCopying(true);\n\t\ttry {\n\t\t\tawait copyToClipboard(onCopyAll ? await onCopyAll() : rowsToCsv(rows, columns));\n\t\t\tsetTimeout(() => setCopying(false), 1e3);\n\t\t} catch (err) {\n\t\t\tconsole.error(\"Failed to copy to clipboard:\", err);\n\t\t\tsetCopying(false);\n\t\t}\n\t};\n\tconst handleCopyRow = async (rowIndex) => {\n\t\tif (rowIndex < 0 || rowIndex >= rows.length) return;\n\t\tsetCopiedRowIndex(rowIndex);\n\t\ttry {\n\t\t\tawait copyToClipboard(rowToCsv(rows[rowIndex], columns));\n\t\t\tsetTimeout(() => setCopiedRowIndex(null), 1e3);\n\t\t} catch (err) {\n\t\t\tconsole.error(\"Failed to copy to clipboard:\", err);\n\t\t\tsetCopiedRowIndex(null);\n\t\t}\n\t};\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex h-full flex-col gap-2\",\n\t\tchildren: [\n\t\t\tonFiltersChange && /* @__PURE__ */ jsx(FilterBar, {\n\t\t\t\tcolumns,\n\t\t\t\tfilters,\n\t\t\t\tonFiltersChange\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex shrink-0 items-center justify-between text-sm\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"flex items-center gap-2\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\tclassName: \"text-gray-600\",\n\t\t\t\t\t\tchildren: loading ? \"Loading...\" : total !== null ? `Showing ${startItem.toLocaleString()}-${endItem.toLocaleString()} of ${total.toLocaleString()}` : `Showing ${rows.length.toLocaleString()} rows`\n\t\t\t\t\t}), rows.length > 0 && /* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-gray-300 bg-white px-2 py-1 text-xs text-gray-700 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\t\t\tdisabled: loading || copying,\n\t\t\t\t\t\tonClick: handleCopyAll,\n\t\t\t\t\t\ttitle: \"Copy all rows as CSV\",\n\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\tname: copying ? \"Check\" : \"Copy\",\n\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t}), copying ? \"Copied!\" : \"Copy All\"]\n\t\t\t\t\t})]\n\t\t\t\t}), total !== null && total > limit && /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"flex gap-1\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\tclassName: \"rounded border border-gray-300 bg-white px-2 py-1 text-xs text-gray-700 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\t\t\t\tdisabled: currentPage === 0,\n\t\t\t\t\t\t\tonClick: () => goToPage(0),\n\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\tchildren: \"First\"\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\tclassName: \"rounded border border-gray-300 bg-white px-2 py-1 text-xs text-gray-700 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\t\t\t\tdisabled: currentPage === 0,\n\t\t\t\t\t\t\tonClick: () => goToPage(currentPage - 1),\n\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\t\tclassName: \"rotate-90\",\n\t\t\t\t\t\t\t\tname: \"ChevronDown\",\n\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tvisiblePages[0] > 0 && /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\tclassName: \"flex items-center px-1 text-xs text-gray-500\",\n\t\t\t\t\t\t\tchildren: \"...\"\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tvisiblePages.map((page) => /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\tclassName: twMerge(\"min-w-8 rounded border px-2 py-1 text-xs\", page === currentPage ? \"border-blue-500 bg-blue-50 text-blue-700\" : \"border-gray-300 bg-white text-gray-700 hover:bg-gray-100\"),\n\t\t\t\t\t\t\tonClick: () => goToPage(page),\n\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\tchildren: page + 1\n\t\t\t\t\t\t}, page)),\n\t\t\t\t\t\tvisiblePages[visiblePages.length - 1] < totalPages - 1 && /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\tclassName: \"flex items-center px-1 text-xs text-gray-500\",\n\t\t\t\t\t\t\tchildren: \"...\"\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\tclassName: \"rounded border border-gray-300 bg-white px-2 py-1 text-xs text-gray-700 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\t\t\t\tdisabled: currentPage >= totalPages - 1,\n\t\t\t\t\t\t\tonClick: () => goToPage(currentPage + 1),\n\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\t\tclassName: \"-rotate-90\",\n\t\t\t\t\t\t\t\tname: \"ChevronDown\",\n\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\tclassName: \"rounded border border-gray-300 bg-white px-2 py-1 text-xs text-gray-700 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\t\t\t\tdisabled: currentPage >= totalPages - 1,\n\t\t\t\t\t\t\tonClick: () => goToPage(totalPages - 1),\n\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\tchildren: \"Last\"\n\t\t\t\t\t\t})\n\t\t\t\t\t]\n\t\t\t\t})]\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: twMerge(\"max-h-full overflow-auto rounded-lg border border-gray-300 transition-opacity\", loading && \"pointer-events-none opacity-50\"),\n\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"table\", {\n\t\t\t\t\tclassName: \"w-full border-collapse\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"thead\", {\n\t\t\t\t\t\tclassName: \"sticky top-0 bg-gray-100\",\n\t\t\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"tr\", { children: [/* @__PURE__ */ jsx(\"th\", {\n\t\t\t\t\t\t\tclassName: \"w-12 px-2 py-2 text-center text-xs font-medium text-gray-600\",\n\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\tclassName: \"sr-only\",\n\t\t\t\t\t\t\t\tchildren: \"Copy\"\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}), columns.map((column, index) => {\n\t\t\t\t\t\t\tconst isActive = currentSort?.column === column.name;\n\t\t\t\t\t\t\tconst sortDirection = isActive ? currentSort.direction : \"asc\";\n\t\t\t\t\t\t\treturn /* @__PURE__ */ jsx(\"th\", {\n\t\t\t\t\t\t\t\tclassName: twMerge(\"group px-3 py-2 text-left text-xs font-medium text-gray-600\", index > 0 && \"border-l border-gray-300\", onSort && \"cursor-pointer hover:bg-gray-200 hover:text-gray-900\"),\n\t\t\t\t\t\t\t\tonClick: () => onSort && handleSort(column.name),\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1\",\n\t\t\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\t\tclassName: \"truncate\",\n\t\t\t\t\t\t\t\t\t\tchildren: column.name\n\t\t\t\t\t\t\t\t\t}), onSort && /* @__PURE__ */ jsx(SortIcon$3, {\n\t\t\t\t\t\t\t\t\t\tactive: isActive,\n\t\t\t\t\t\t\t\t\t\tdirection: sortDirection\n\t\t\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}, column.name);\n\t\t\t\t\t\t})] })\n\t\t\t\t\t}), /* @__PURE__ */ jsx(\"tbody\", { children: rows.length === 0 ? /* @__PURE__ */ jsx(\"tr\", { children: /* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\tclassName: \"px-3 py-8 text-center text-sm text-gray-500\",\n\t\t\t\t\t\tcolSpan: columns.length + 1,\n\t\t\t\t\t\tchildren: \"No data\"\n\t\t\t\t\t}) }) : rows.map((row, rowIndex) => /* @__PURE__ */ jsxs(\"tr\", {\n\t\t\t\t\t\tclassName: \"odd:bg-white even:bg-gray-50 hover:bg-blue-50\",\n\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\tclassName: \"px-2 py-2 text-center\",\n\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\tclassName: \"flex items-center justify-center rounded p-1 text-gray-500 hover:bg-gray-200 hover:text-gray-700\",\n\t\t\t\t\t\t\t\tonClick: () => void handleCopyRow(rowIndex),\n\t\t\t\t\t\t\t\ttitle: \"Copy row as CSV\",\n\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\t\t\tname: copiedRowIndex === rowIndex ? \"Check\" : \"Copy\",\n\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}), columns.map((column, colIndex) => /* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\tclassName: twMerge(\"px-3 py-2 text-xs text-gray-900\", colIndex > 0 && \"border-l border-gray-300\"),\n\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\tclassName: twMerge(\"block truncate\", row[column.name] === null && \"italic text-gray-400\"),\n\t\t\t\t\t\t\t\ttitle: formatCellValue(row[column.name]),\n\t\t\t\t\t\t\t\tchildren: formatCellValue(row[column.name])\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}, column.name))]\n\t\t\t\t\t}, rowIndex)) })]\n\t\t\t\t})\n\t\t\t})\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/db-explorer/db-explorer.tsx\n/** Props for the main DBExplorer component */\nconst DEFAULT_PAGE_SIZE = 50;\nfunction DBExplorer({ schema, getTables, getTableRows, getDefaultSort, pageSize = DEFAULT_PAGE_SIZE, onImportDb, onExportDb, pgVersionControl }) {\n\tconst fileInputRef = useRef(null);\n\tconst [tables, setTables] = useState([]);\n\tconst [tablesLoading, setTablesLoading] = useState(true);\n\tconst [selectedTable, setSelectedTable] = useState();\n\tconst [tableData, setTableData] = useState(null);\n\tconst [pagination, setPagination] = useState({\n\t\toffset: 0,\n\t\tlimit: pageSize,\n\t\ttotal: null\n\t});\n\tconst [sort, setSort] = useState();\n\tconst [filters, setFilters] = useState();\n\tconst [loading, setLoading] = useState(false);\n\tconst [pendingImport, setPendingImport] = useState(null);\n\tconst [pendingResetMajor, setPendingResetMajor] = useState(null);\n\tconst [resetting, setResetting] = useState(false);\n\tconst columns = tables.find((t) => t.name === selectedTable)?.columns ?? [];\n\tconst loadTableData = useCallback(async () => {\n\t\tif (!selectedTable) return;\n\t\tsetLoading(true);\n\t\tconst data = await getTableRows(selectedTable, {\n\t\t\tschema,\n\t\t\tlimit: pagination.limit,\n\t\t\toffset: pagination.offset,\n\t\t\tsort,\n\t\t\tfilters\n\t\t});\n\t\tsetTableData(data);\n\t\tsetPagination((prev) => ({\n\t\t\t...prev,\n\t\t\ttotal: data.total\n\t\t}));\n\t\tsetLoading(false);\n\t}, [\n\t\tselectedTable,\n\t\tschema,\n\t\tpagination.limit,\n\t\tpagination.offset,\n\t\tsort,\n\t\tfilters,\n\t\tgetTableRows\n\t]);\n\tconst handleCopyAll = useCallback(async () => {\n\t\tif (!selectedTable) return \"\";\n\t\treturn rowsToCsv((await getTableRows(selectedTable, {\n\t\t\tschema,\n\t\t\tlimit: pagination.total ?? 1e6,\n\t\t\toffset: 0,\n\t\t\tsort,\n\t\t\tfilters\n\t\t})).rows, columns);\n\t}, [\n\t\tselectedTable,\n\t\tschema,\n\t\tpagination.total,\n\t\tsort,\n\t\tfilters,\n\t\tgetTableRows,\n\t\tcolumns\n\t]);\n\tconst loadTables = useCallback(async () => {\n\t\tsetTablesLoading(true);\n\t\tconst data = await getTables();\n\t\tsetTables(data);\n\t\tsetTablesLoading(false);\n\t\treturn data;\n\t}, [getTables]);\n\tconst handleRefresh = useCallback(async () => {\n\t\tconst newTables = await loadTables();\n\t\tif (selectedTable && !newTables.some((t) => t.name === selectedTable)) {\n\t\t\tsetSelectedTable(void 0);\n\t\t\tsetTableData(null);\n\t\t\treturn;\n\t\t}\n\t\tif (selectedTable) await loadTableData();\n\t}, [\n\t\tloadTables,\n\t\tselectedTable,\n\t\tloadTableData\n\t]);\n\tuseEffect(() => {\n\t\tloadTables();\n\t}, [loadTables]);\n\tuseEffect(() => {\n\t\tif (selectedTable) loadTableData();\n\t}, [\n\t\tselectedTable,\n\t\tpagination.offset,\n\t\tsort,\n\t\tfilters,\n\t\tloadTableData\n\t]);\n\tconst handleSelectTable = (table) => {\n\t\tif (table === selectedTable) return;\n\t\tsetSelectedTable(table);\n\t\tsetPagination((prev) => ({\n\t\t\t...prev,\n\t\t\toffset: 0,\n\t\t\ttotal: null\n\t\t}));\n\t\tsetSort(getDefaultSort?.(table));\n\t\tsetFilters(void 0);\n\t\tsetTableData(null);\n\t};\n\tconst handlePageChange = (offset) => {\n\t\tsetPagination((prev) => ({\n\t\t\t...prev,\n\t\t\toffset\n\t\t}));\n\t};\n\tconst handleSort = (newSort) => {\n\t\tsetSort(newSort);\n\t\tsetPagination((prev) => ({\n\t\t\t...prev,\n\t\t\toffset: 0\n\t\t}));\n\t};\n\tconst handleImportClick = () => {\n\t\tfileInputRef.current?.click();\n\t};\n\tconst handleFileChange = (e) => {\n\t\tconst file = e.target.files?.[0];\n\t\tif (!file) return;\n\t\tfile.text().then((content) => {\n\t\t\tsetPendingImport(content);\n\t\t});\n\t\te.target.value = \"\";\n\t};\n\tconst handleImportConfirm = async () => {\n\t\tif (pendingImport) {\n\t\t\tsetSelectedTable(void 0);\n\t\t\tsetTableData(null);\n\t\t\tawait onImportDb?.(pendingImport);\n\t\t\tsetPendingImport(null);\n\t\t\tawait loadTables();\n\t\t}\n\t};\n\tconst handleImportCancel = () => {\n\t\tsetPendingImport(null);\n\t};\n\tconst handleExportClick = () => {\n\t\tonExportDb?.();\n\t};\n\tconst resetTargetMajor = pgVersionControl ? pgVersionControl.supportedPgVersions.find((m) => m !== pgVersionControl.currentPgVersion) ?? null : null;\n\tconst handleResetConfirm = async () => {\n\t\tif (pendingResetMajor === null || !pgVersionControl) return;\n\t\tsetResetting(true);\n\t\ttry {\n\t\t\tawait pgVersionControl.onResetToPgVersion(pendingResetMajor);\n\t\t} finally {\n\t\t\tsetResetting(false);\n\t\t\tsetPendingResetMajor(null);\n\t\t}\n\t};\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex h-full\",\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(\"input\", {\n\t\t\t\tref: fileInputRef,\n\t\t\t\ttype: \"file\",\n\t\t\t\taccept: \".sql,.txt,text/plain\",\n\t\t\t\tclassName: \"hidden\",\n\t\t\t\tonChange: handleFileChange\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(ConnectConfirmationModal, {\n\t\t\t\topen: !!pendingImport,\n\t\t\t\tonOpenChange: (open) => !open && setPendingImport(null),\n\t\t\t\theader: \"Replace Database?\",\n\t\t\t\tbody: \"This will delete all existing data and replace it with the imported file. This action cannot be undone.\",\n\t\t\t\tcancelLabel: \"Cancel\",\n\t\t\t\tcontinueLabel: \"Replace Data\",\n\t\t\t\tonCancel: handleImportCancel,\n\t\t\t\tonContinue: () => void handleImportConfirm(),\n\t\t\t\tcontinueButtonProps: { className: \"bg-red-900 text-white hover:bg-red-800\" }\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(ConnectConfirmationModal, {\n\t\t\t\topen: pendingResetMajor !== null,\n\t\t\t\tonOpenChange: (open) => !open && setPendingResetMajor(null),\n\t\t\t\theader: `Reset to Postgres ${pendingResetMajor ?? \"\"}?`,\n\t\t\t\tbody: `This will permanently delete all local reactor data and recreate an empty database under Postgres ${pendingResetMajor ?? \"\"}. The page will reload.`,\n\t\t\t\tcancelLabel: \"Cancel\",\n\t\t\t\tcontinueLabel: `Reset to PG${pendingResetMajor ?? \"\"}`,\n\t\t\t\tonCancel: () => setPendingResetMajor(null),\n\t\t\t\tonContinue: () => void handleResetConfirm(),\n\t\t\t\tcontinueButtonProps: { className: \"bg-red-900 text-white hover:bg-red-800\" }\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex w-64 shrink-0 flex-col border-r border-gray-200\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"flex-1 overflow-auto\",\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(SchemaTreeSidebar, {\n\t\t\t\t\t\tschema,\n\t\t\t\t\t\ttables,\n\t\t\t\t\t\tselectedTable,\n\t\t\t\t\t\tonSelectTable: handleSelectTable,\n\t\t\t\t\t\tonRefresh: handleRefresh,\n\t\t\t\t\t\tloading: tablesLoading || loading\n\t\t\t\t\t})\n\t\t\t\t}), (onImportDb || onExportDb || pgVersionControl) && /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"flex shrink-0 flex-col gap-2 border-t border-gray-200 p-2\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\tonImportDb && /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\tclassName: \"rounded border border-gray-300 bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100\",\n\t\t\t\t\t\t\tonClick: handleImportClick,\n\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\tchildren: \"Import DB\"\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tonExportDb && /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\tclassName: \"rounded border border-gray-300 bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100\",\n\t\t\t\t\t\t\tonClick: handleExportClick,\n\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\tchildren: \"Export DB\"\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tpgVersionControl && /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\tclassName: \"flex flex-col gap-1 border-t border-gray-200 pt-2\",\n\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\t\tclassName: \"flex items-center justify-between text-xs text-gray-600\",\n\t\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"span\", { children: \"Postgres version\" }), /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"font-semibold text-gray-900\",\n\t\t\t\t\t\t\t\t\tchildren: pgVersionControl.currentPgVersion === null ? \"—\" : `PG${pgVersionControl.currentPgVersion}`\n\t\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t\t}), resetTargetMajor !== null && /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\tclassName: \"rounded border border-red-300 bg-red-50 px-3 py-1.5 text-sm text-red-700 hover:bg-red-100 disabled:opacity-50\",\n\t\t\t\t\t\t\t\tonClick: () => setPendingResetMajor(resetTargetMajor),\n\t\t\t\t\t\t\t\tdisabled: resetting,\n\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\tchildren: resetting ? `Resetting to PG${resetTargetMajor}…` : `Reset to PG${resetTargetMajor}`\n\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t})\n\t\t\t\t\t]\n\t\t\t\t})]\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"flex-1 overflow-auto p-4\",\n\t\t\t\tchildren: !selectedTable ? /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"text-sm text-gray-500\",\n\t\t\t\t\tchildren: \"Select a table to view data\"\n\t\t\t\t}) : !tableData && loading ? /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"text-sm text-gray-500\",\n\t\t\t\t\tchildren: \"Loading...\"\n\t\t\t\t}) : tableData ? /* @__PURE__ */ jsx(TableView, {\n\t\t\t\t\tcolumns,\n\t\t\t\t\trows: tableData.rows,\n\t\t\t\t\tpagination,\n\t\t\t\t\tonPageChange: handlePageChange,\n\t\t\t\t\tonSort: handleSort,\n\t\t\t\t\tcurrentSort: sort,\n\t\t\t\t\tloading,\n\t\t\t\t\tfilters,\n\t\t\t\t\tonFiltersChange: (newFilters) => {\n\t\t\t\t\t\tsetFilters(newFilters);\n\t\t\t\t\t\tsetPagination((prev) => ({\n\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\toffset: 0\n\t\t\t\t\t\t}));\n\t\t\t\t\t},\n\t\t\t\t\tonCopyAll: handleCopyAll\n\t\t\t\t}) : null\n\t\t\t})\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/debug-inspector/debug-inspector.tsx\nfunction DebugInspector({ supportedPgVersions, currentPgVersion, onResetToPgVersion }) {\n\tconst [status, setStatus] = useState(\"idle\");\n\tconst [pendingMajor, setPendingMajor] = useState(null);\n\tconst [confirmMajor, setConfirmMajor] = useState(null);\n\tconst [error, setError] = useState(null);\n\tconst handleReset = async (major) => {\n\t\tsetError(null);\n\t\tsetConfirmMajor(null);\n\t\tsetPendingMajor(major);\n\t\tsetStatus(\"running\");\n\t\ttry {\n\t\t\tawait onResetToPgVersion(major);\n\t\t} catch (err) {\n\t\t\tsetError(err instanceof Error ? err.message : String(err));\n\t\t\tsetStatus(\"error\");\n\t\t\tsetPendingMajor(null);\n\t\t}\n\t};\n\tconst running = status === \"running\";\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex h-full flex-col gap-4 overflow-auto p-4\",\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsxs(\"div\", { children: [\n\t\t\t\t/* @__PURE__ */ jsx(\"h2\", {\n\t\t\t\t\tclassName: \"text-lg font-semibold text-gray-900\",\n\t\t\t\t\tchildren: \"PGlite data dir\"\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsx(\"p\", {\n\t\t\t\t\tclassName: \"mt-1 text-sm text-gray-600\",\n\t\t\t\t\tchildren: \"Kill the reactor, delete the local IndexedDB, initialize a fresh Postgres cluster at the chosen major version, then reload. Useful for testing version-detection and migration flows.\"\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"mt-2 inline-flex items-center gap-2 rounded bg-gray-100 px-3 py-1 text-sm\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\tclassName: \"text-gray-600\",\n\t\t\t\t\t\tchildren: \"Current version:\"\n\t\t\t\t\t}), /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\tclassName: \"font-semibold text-gray-900\",\n\t\t\t\t\t\tchildren: currentPgVersion === null ? \"None (no data dir)\" : `Postgres ${currentPgVersion}`\n\t\t\t\t\t})]\n\t\t\t\t})\n\t\t\t] }),\n\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"flex flex-wrap gap-2\",\n\t\t\t\tchildren: supportedPgVersions.map((major) => {\n\t\t\t\t\treturn /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\tdisabled: running,\n\t\t\t\t\t\tonClick: () => setConfirmMajor(major),\n\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-red-300 bg-red-50 px-3 py-1.5 text-sm text-red-700 hover:bg-red-100 disabled:opacity-50\",\n\t\t\t\t\t\tchildren: pendingMajor === major && running ? `Resetting to PG${major}…` : `Reset to PG${major}`\n\t\t\t\t\t}, major);\n\t\t\t\t})\n\t\t\t}),\n\t\t\tconfirmMajor !== null && /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex shrink-0 items-center gap-3 rounded border border-yellow-400 bg-yellow-50 px-3 py-2\",\n\t\t\t\tchildren: [\n\t\t\t\t\t/* @__PURE__ */ jsxs(\"span\", {\n\t\t\t\t\t\tclassName: \"text-sm text-yellow-900\",\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\"This will permanently delete all local reactor data and recreate an empty database under Postgres \",\n\t\t\t\t\t\t\tconfirmMajor,\n\t\t\t\t\t\t\t\". The page will reload.\"\n\t\t\t\t\t\t]\n\t\t\t\t\t}),\n\t\t\t\t\t/* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\tonClick: () => handleReset(confirmMajor),\n\t\t\t\t\t\tclassName: \"rounded bg-yellow-600 px-3 py-1 text-sm text-white hover:bg-yellow-700\",\n\t\t\t\t\t\tchildren: [\"Confirm reset to PG\", confirmMajor]\n\t\t\t\t\t}),\n\t\t\t\t\t/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\tonClick: () => setConfirmMajor(null),\n\t\t\t\t\t\tclassName: \"rounded border border-gray-300 bg-white px-3 py-1 text-sm text-gray-600 hover:bg-gray-50\",\n\t\t\t\t\t\tchildren: \"Cancel\"\n\t\t\t\t\t})\n\t\t\t\t]\n\t\t\t}),\n\t\t\terror && /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"rounded border border-red-300 bg-red-50 px-3 py-2 text-sm text-red-800\",\n\t\t\t\tchildren: error\n\t\t\t})\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/default-editor-loader/default-editor-loader.tsx\nfunction DefaultEditorLoader(props) {\n\tconst { message = \"Loading editor\", ...divProps } = props;\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName: \"grid h-full place-items-center\",\n\t\t...divProps,\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"-mt-20 grid place-items-center\",\n\t\t\tchildren: [/* @__PURE__ */ jsx(\"h3\", {\n\t\t\t\tclassName: \"mb-4 text-xl\",\n\t\t\t\tchildren: message\n\t\t\t}), /* @__PURE__ */ jsx(AnimatedLoader, {})]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/disclosure/disclosure.tsx\nfunction Disclosure(props) {\n\tconst { title, isOpen, onOpenChange, children, containerClassName, toggleClassName, contentClassName } = props;\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: twMerge(containerClassName),\n\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: twMerge(\"flex cursor-pointer justify-between text-gray-500\", toggleClassName),\n\t\t\tonClick: onOpenChange,\n\t\t\tchildren: [/* @__PURE__ */ jsx(\"h2\", {\n\t\t\t\tclassName: \"font-semibold text-inherit\",\n\t\t\t\tchildren: title\n\t\t\t}), /* @__PURE__ */ jsx(Icon, {\n\t\t\t\tclassName: twJoin(\"transition\", isOpen ? \"\" : \"-rotate-90\"),\n\t\t\t\tsize: 16,\n\t\t\t\tname: \"ChevronDown\"\n\t\t\t})]\n\t\t}), /* @__PURE__ */ jsx(\"div\", {\n\t\t\tclassName: twMerge(\"max-h-0 overflow-hidden transition-[max-height] duration-300 ease-in-out\", isOpen && \"max-h-screen\", contentClassName),\n\t\t\tchildren\n\t\t})]\n\t});\n}\n//#endregion\n//#region src/connect/components/divider/divider.tsx\nfunction Divider(props) {\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\t...props,\n\t\tclassName: twMerge(\"h-px bg-gray-200\", props.className)\n\t});\n}\n//#endregion\n//#region src/connect/components/tabs/tab-content.tsx\nfunction TabContent(props) {\n\tconst { label, children } = props;\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName: \"h-full\",\n\t\tchildren\n\t});\n}\n//#endregion\n//#region src/connect/components/tabs/tabs.tsx\nfunction Tabs({ children, defaultValue }) {\n\treturn /* @__PURE__ */ jsxs(Root, {\n\t\tdefaultValue,\n\t\tclassName: \"flex min-h-0 flex-1 flex-col gap-2\",\n\t\tchildren: [/* @__PURE__ */ jsx(\"div\", {\n\t\t\tclassName: \"flex w-full shrink-0 justify-between\",\n\t\t\tchildren: /* @__PURE__ */ jsx(List, {\n\t\t\t\tclassName: \"flex w-full gap-x-2 rounded-xl bg-slate-50 p-1 text-sm font-semibold text-gray-600 outline-none\",\n\t\t\t\tchildren: React.Children.map(children, (child, i) => {\n\t\t\t\t\tif (!/* @__PURE__ */ React.isValidElement(child)) return;\n\t\t\t\t\tconst { label, disabled } = child.props;\n\t\t\t\t\treturn /* @__PURE__ */ jsx(Trigger, {\n\t\t\t\t\t\tclassName: \"data-[state='active']:tab-shadow ata-disabled:cursor-not-allowed data-disabled:text-gray-400 flex h-7 flex-1 items-center justify-center rounded-lg transition duration-300 data-[state='active']:bg-gray-50 data-[state='active']:text-gray-900\",\n\t\t\t\t\t\tvalue: label,\n\t\t\t\t\t\tdisabled: disabled ?? false,\n\t\t\t\t\t\tchildren: label\n\t\t\t\t\t}, label);\n\t\t\t\t})\n\t\t\t})\n\t\t}), /* @__PURE__ */ jsx(\"div\", {\n\t\t\tclassName: \"mt-3 min-h-0 flex-1 rounded-md bg-white\",\n\t\t\tchildren: React.Children.map(children, (child, i) => {\n\t\t\t\tif (!/* @__PURE__ */ React.isValidElement(child)) return;\n\t\t\t\tconst { label } = child.props;\n\t\t\t\treturn /* @__PURE__ */ jsx(Content, {\n\t\t\t\t\tclassName: \"h-full\",\n\t\t\t\t\tvalue: label,\n\t\t\t\t\tchildren: child\n\t\t\t\t}, i);\n\t\t\t})\n\t\t})]\n\t});\n}\n//#endregion\n//#region src/connect/components/document-state-viewer/document-state-viewer.tsx\nfunction formatScopeLabel(text) {\n\tif (!text) return \"\";\n\treturn text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();\n}\nfunction DocumentStateViewer({ state, ignoredScopes = [\"auth\", \"document\"], defaultScope, className }) {\n\tconst scopes = useMemo(() => Object.keys(state).filter((scope) => !ignoredScopes.includes(scope)), [state, ignoredScopes]);\n\tconst initialScope = defaultScope || scopes.at(0) || \"global\";\n\tif (scopes.length === 0) return /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName: \"text-sm text-gray-500\",\n\t\tchildren: \"No state data\"\n\t});\n\treturn /* @__PURE__ */ jsx(Tabs, {\n\t\tdefaultValue: formatScopeLabel(initialScope),\n\t\tchildren: scopes.map((scope) => /* @__PURE__ */ jsx(TabContent, {\n\t\t\tlabel: formatScopeLabel(scope),\n\t\t\tdescription: scope,\n\t\t\tchildren: /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: twMerge(\"-mt-2 rounded-md border border-gray-300 bg-gray-50 p-3 font-mono text-sm\", className),\n\t\t\t\tchildren: /* @__PURE__ */ jsx(JsonViewer, { data: state[scope] })\n\t\t\t})\n\t\t}, scope))\n\t});\n}\n//#endregion\n//#region src/connect/components/document-toolbar/utils/use-document-undo-redo.ts\nfunction useDocumentUndoRedo(documentId) {\n\tconst [document, dispatch] = useDocumentById(documentId);\n\tconst globalRevisionNumber = document?.header.revision.global ?? 0;\n\tconst localRevisionNumber = document?.header.revision.local ?? 0;\n\tconst canUndo = globalRevisionNumber > 0 || localRevisionNumber > 0;\n\tconst canRedo = !!document?.clipboard.length;\n\tconst handleUndo = () => {\n\t\tdispatch(undo());\n\t};\n\tconst handleRedo = () => {\n\t\tdispatch(redo());\n\t};\n\treturn {\n\t\tundo: handleUndo,\n\t\tredo: handleRedo,\n\t\tcanUndo,\n\t\tcanRedo\n\t};\n}\n//#endregion\n//#region src/connect/components/document-toolbar/document-toolbar.tsx\nconst DocumentTimeline = /* @__PURE__ */ lazy(() => import(\"./document-timeline-FWiQhfIq.js\").then((n) => n.n).then((m) => ({ default: m.DocumentTimeline })));\nfunction useDocumentTimeline(documentId) {\n\treturn [];\n}\nconst DocumentToolbar = (props) => {\n\tconst { onClose, children, onExport, className, document: _document, onSwitchboardLinkClick, enabledControls = [\n\t\t\"undo\",\n\t\t\"redo\",\n\t\t\"export\",\n\t\t\"history\"\n\t], defaultTimelineVisible = true, disableRevisionHistory = false, initialTimelineVisible = false, ...containerProps } = props;\n\tconst [selectedDocument] = useSelectedDocumentSafe();\n\tconst document = _document ?? selectedDocument;\n\tconst { onRenameNode, onRenameDriveNodes } = useNodeActions();\n\tconst documentName = document?.header.name || void 0;\n\tconst [isEditingName, setIsEditingName] = useState(false);\n\tconst parentFolder = useNodeParentFolderById(document?.header.id);\n\tconst handleClose = onClose ?? (() => setSelectedNode(parentFolder));\n\tconst handleExport = async (doc) => {\n\t\tif (!doc) return;\n\t\tif (onExport) onExport(doc);\n\t\telse await exportDocument(doc);\n\t};\n\tconst documentUndoRedo = useDocumentUndoRedo(document?.header.id);\n\tconst isUndoDisabled = !documentUndoRedo.canUndo;\n\tconst isRedoDisabled = !documentUndoRedo.canRedo;\n\tconst timelineItemsData = useDocumentTimeline(document?.header.id);\n\tconst [showTimeline, setShowTimeline] = useState(initialTimelineVisible);\n\tconst getSwitchboardLink = useGetSwitchboardLink(document);\n\tconst handleDefaultSwitchboardClick = async () => {\n\t\tif (getSwitchboardLink) try {\n\t\t\tconst url = await getSwitchboardLink();\n\t\t\twindow.open(url, \"_blank\");\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error opening switchboard link:\", error);\n\t\t}\n\t};\n\tconst resolvedSwitchboardHandler = onSwitchboardLinkClick ?? (getSwitchboardLink ? handleDefaultSwitchboardClick : void 0);\n\tconst isExportDisabled = !document;\n\tconst isSwitchboardLinkDisabled = !resolvedSwitchboardHandler;\n\tconst isTimelineDisabled = timelineItemsData.length === 0;\n\tuseEffect(() => {\n\t\tif (typeof initialTimelineVisible === \"boolean\") setShowTimeline(initialTimelineVisible);\n\t}, [initialTimelineVisible]);\n\tconst handleTimelineToggle = () => {\n\t\tif (isTimelineDisabled) return;\n\t\tsetShowTimeline(!showTimeline);\n\t};\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex w-full flex-col\",\n\t\t...containerProps,\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: twMerge(\"flex h-12 w-full items-center justify-between rounded-xl border border-gray-200 bg-slate-50 px-4\", className),\n\t\t\t\tchildren: [\n\t\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\tclassName: \"flex items-center gap-x-2\",\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\tenabledControls.includes(\"undo\") && /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\tclassName: twMerge(\"grid size-8 place-items-center rounded-lg border border-gray-200 bg-white\", isUndoDisabled ? \"cursor-not-allowed\" : \"cursor-pointer active:opacity-70\"),\n\t\t\t\t\t\t\t\tonClick: documentUndoRedo.undo,\n\t\t\t\t\t\t\t\tdisabled: isUndoDisabled,\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\t\t\tname: \"ArrowCouterclockwise\",\n\t\t\t\t\t\t\t\t\tsize: 16,\n\t\t\t\t\t\t\t\t\tclassName: isUndoDisabled ? \"text-gray-500\" : \"text-gray-900\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tenabledControls.includes(\"redo\") && /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\tclassName: twMerge(\"grid size-8 place-items-center rounded-lg border border-gray-200 bg-white\", isRedoDisabled ? \"cursor-not-allowed\" : \"cursor-pointer active:opacity-70\"),\n\t\t\t\t\t\t\t\tonClick: documentUndoRedo.redo,\n\t\t\t\t\t\t\t\tdisabled: isRedoDisabled,\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\t\t\t\tclassName: \"-scale-x-100\",\n\t\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\t\t\t\tname: \"ArrowCouterclockwise\",\n\t\t\t\t\t\t\t\t\t\tsize: 16,\n\t\t\t\t\t\t\t\t\t\tclassName: isRedoDisabled ? \"text-gray-500\" : \"text-gray-900\"\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tenabledControls.includes(\"export\") && /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\tclassName: twMerge(\"flex h-8 items-center rounded-lg border border-gray-200 bg-white px-3 text-sm\", isExportDisabled ? \"cursor-not-allowed\" : \"cursor-pointer active:opacity-70\"),\n\t\t\t\t\t\t\t\tonClick: () => void handleExport(document),\n\t\t\t\t\t\t\t\tdisabled: isExportDisabled,\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: isExportDisabled ? \"text-gray-500\" : \"text-gray-900\",\n\t\t\t\t\t\t\t\t\tchildren: \"Export\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t]\n\t\t\t\t\t}),\n\t\t\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\tclassName: \"flex items-center\",\n\t\t\t\t\t\tchildren: isEditingName && document ? /* @__PURE__ */ jsx(NodeInput, {\n\t\t\t\t\t\t\tdefaultValue: documentName,\n\t\t\t\t\t\t\tclassName: \"text-center text-sm font-medium text-gray-500\",\n\t\t\t\t\t\t\t\"aria-label\": \"Document name\",\n\t\t\t\t\t\t\tonCancel: () => setIsEditingName(false),\n\t\t\t\t\t\t\tonSubmit: (newName) => {\n\t\t\t\t\t\t\t\tconst node = { id: document.header.id };\n\t\t\t\t\t\t\t\tPromise.all([onRenameNode(newName, node), onRenameDriveNodes(newName, document.header.id)]).then(() => setIsEditingName(false)).catch((error) => {\n\t\t\t\t\t\t\t\t\tconsole.error(\"Failed to rename document:\", error);\n\t\t\t\t\t\t\t\t\tsetIsEditingName(false);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}) : /* @__PURE__ */ jsx(\"h1\", {\n\t\t\t\t\t\t\tclassName: twMerge(\"text-sm font-medium text-gray-500\", document && \"cursor-pointer hover:text-gray-700\"),\n\t\t\t\t\t\t\tonDoubleClick: document ? () => setIsEditingName(true) : void 0,\n\t\t\t\t\t\t\ttitle: document ? \"Double-click to edit\" : void 0,\n\t\t\t\t\t\t\tchildren: documentName\n\t\t\t\t\t\t})\n\t\t\t\t\t}),\n\t\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\tclassName: \"flex items-center gap-x-2\",\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t!isSwitchboardLinkDisabled && /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\tclassName: twMerge(\"grid size-8 place-items-center rounded-lg border border-gray-200 bg-white\", \"cursor-pointer active:opacity-70\"),\n\t\t\t\t\t\t\t\tonClick: resolvedSwitchboardHandler,\n\t\t\t\t\t\t\t\tdisabled: isSwitchboardLinkDisabled,\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\t\t\tname: \"Drive\",\n\t\t\t\t\t\t\t\t\tsize: 16,\n\t\t\t\t\t\t\t\t\tclassName: \"text-gray-900\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tenabledControls.includes(\"history\") && /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\tclassName: twMerge(\"grid size-8 place-items-center rounded-lg border border-gray-200 bg-white\", disableRevisionHistory ? \"cursor-not-allowed\" : \"cursor-pointer active:opacity-70\"),\n\t\t\t\t\t\t\t\tonClick: showRevisionHistory,\n\t\t\t\t\t\t\t\tdisabled: disableRevisionHistory,\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\t\t\tname: \"History\",\n\t\t\t\t\t\t\t\t\tsize: 16,\n\t\t\t\t\t\t\t\t\tclassName: disableRevisionHistory ? \"text-gray-500\" : \"text-gray-900\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tenabledControls.includes(\"timeline\") && defaultTimelineVisible && /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\tclassName: twMerge(\"grid size-8 place-items-center rounded-lg border border-gray-200 bg-white\", isTimelineDisabled ? \"cursor-not-allowed\" : \"cursor-pointer active:opacity-70\"),\n\t\t\t\t\t\t\t\tonClick: handleTimelineToggle,\n\t\t\t\t\t\t\t\tdisabled: isTimelineDisabled,\n\t\t\t\t\t\t\t\t\"aria-pressed\": showTimeline,\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\t\t\tname: \"Timeline\",\n\t\t\t\t\t\t\t\t\tsize: 16,\n\t\t\t\t\t\t\t\t\tclassName: twMerge(\"text-gray-900\", isTimelineDisabled && \"opacity-50\", showTimeline && \"text-blue-600\")\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\tid: \"close-document-button\",\n\t\t\t\t\t\t\t\t\"aria-label\": \"Close document\",\n\t\t\t\t\t\t\t\tclassName: \"grid size-8 cursor-pointer place-items-center rounded-lg border border-gray-200 bg-white active:opacity-70\",\n\t\t\t\t\t\t\t\tonClick: handleClose,\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\t\t\tname: \"XmarkLight\",\n\t\t\t\t\t\t\t\t\tsize: 16,\n\t\t\t\t\t\t\t\t\tclassName: \"text-gray-900\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t]\n\t\t\t\t\t})\n\t\t\t\t]\n\t\t\t}),\n\t\t\tshowTimeline && /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"mt-2 w-full\",\n\t\t\t\tchildren: /* @__PURE__ */ jsx(Suspense, {\n\t\t\t\t\tfallback: null,\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(DocumentTimeline, {\n\t\t\t\t\t\ttimeline: timelineItemsData,\n\t\t\t\t\t\tonItemClick: setSelectedTimelineItem\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}),\n\t\t\tchildren\n\t\t]\n\t});\n};\n//#endregion\n//#region src/connect/hooks/use-drop.ts\nfunction useDrop(props) {\n\tconst { target, onAddFileOverride, trackNestedDrag = false, acceptedFileExtensions } = props ?? {};\n\tconst [isDropTarget, setIsDropTarget] = useState(false);\n\tconst dragDepthRef = useRef(0);\n\tconst { onMoveNode, onCopyNode, onAddFile: defaultOnAddFile } = useNodeActions();\n\tconst onAddFile = onAddFileOverride ?? defaultOnAddFile;\n\t/**\n\t* Check if the dragged content is valid based on accepted file extensions\n\t*/\n\tconst isValidDropContent = useCallback((dataTransfer) => {\n\t\tif (!acceptedFileExtensions || acceptedFileExtensions.length === 0) return true;\n\t\tif (dataTransfer.types.includes(\"UI_NODE\")) return true;\n\t\tif (dataTransfer.types.includes(\"Files\")) {\n\t\t\tconst items = Array.from(dataTransfer.items);\n\t\t\tif (items.length === 0) return true;\n\t\t\treturn items.some((item) => {\n\t\t\t\tif (item.kind === \"file\") {\n\t\t\t\t\tif (item.type === \"application/zip\" || item.type === \"application/x-zip-compressed\") return acceptedFileExtensions.includes(\".zip\");\n\t\t\t\t\tif (item.type === \"\" || item.type === \"application/octet-stream\") return true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\t\treturn false;\n\t}, [acceptedFileExtensions]);\n\tconst onDragOver = useCallback((event) => {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tif (isValidDropContent(event.dataTransfer)) setIsDropTarget(true);\n\t\telse event.dataTransfer.dropEffect = \"none\";\n\t}, [isValidDropContent]);\n\tconst onDragEnter = useCallback((event) => {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tif (isValidDropContent(event.dataTransfer)) {\n\t\t\tdragDepthRef.current += 1;\n\t\t\tsetIsDropTarget(true);\n\t\t}\n\t}, [isValidDropContent]);\n\tconst onDragLeaveDepth = useCallback((event) => {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tdragDepthRef.current = Math.max(0, dragDepthRef.current - 1);\n\t\tif (dragDepthRef.current === 0) setIsDropTarget(false);\n\t}, []);\n\tconst onDragLeaveSimple = useCallback(() => {\n\t\tsetIsDropTarget(false);\n\t}, []);\n\tconst onDrop = useCallback(async (event) => {\n\t\tevent.preventDefault();\n\t\tconst closestDropZone = event.target.closest(\"[data-drop-zone]\");\n\t\tconst dropZoneId = target?.id || \"root\";\n\t\tif ((closestDropZone?.getAttribute(\"data-drop-zone\") || \"root\") !== dropZoneId) {\n\t\t\tsetIsDropTarget(false);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tlet droppedFiles = getDroppedFiles(event.dataTransfer.items).filter(Boolean);\n\t\t\tif (acceptedFileExtensions && acceptedFileExtensions.length > 0) droppedFiles = droppedFiles.filter((file) => {\n\t\t\t\tif (!file) return false;\n\t\t\t\tconst fileName = file.name.toLowerCase();\n\t\t\t\treturn acceptedFileExtensions.some((ext) => fileName.endsWith(ext.toLowerCase()));\n\t\t\t});\n\t\t\tif (droppedFiles.length) {\n\t\t\t\tfor (const file of droppedFiles) if (file) await onAddFile(file, target);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst altOrOptionKeyPressed = event.getModifierState(\"Alt\");\n\t\t\tconst data = event.dataTransfer.getData(\"UI_NODE\");\n\t\t\tconst droppedNode = JSON.parse(data);\n\t\t\tif (altOrOptionKeyPressed) await onCopyNode(droppedNode, target);\n\t\t\telse await onMoveNode(droppedNode, target);\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t} finally {\n\t\t\tif (trackNestedDrag) dragDepthRef.current = 0;\n\t\t\tsetIsDropTarget(false);\n\t\t}\n\t}, [\n\t\tonAddFile,\n\t\tonCopyNode,\n\t\tonMoveNode,\n\t\ttarget,\n\t\ttrackNestedDrag\n\t]);\n\treturn useMemo(() => {\n\t\tconst baseProps = {\n\t\t\tonDragOver,\n\t\t\tonDrop,\n\t\t\t\"data-drop-zone\": target?.id || \"root\"\n\t\t};\n\t\tif (trackNestedDrag) {\n\t\t\tbaseProps.onDragEnter = onDragEnter;\n\t\t\tbaseProps.onDragLeave = onDragLeaveDepth;\n\t\t} else baseProps.onDragLeave = onDragLeaveSimple;\n\t\treturn {\n\t\t\tisDropTarget,\n\t\t\tdropProps: baseProps\n\t\t};\n\t}, [\n\t\tisDropTarget,\n\t\ttarget?.id,\n\t\tonDragEnter,\n\t\tonDragLeaveDepth,\n\t\tonDragLeaveSimple,\n\t\tonDragOver,\n\t\tonDrop,\n\t\ttrackNestedDrag\n\t]);\n}\nfunction getDroppedFiles(items) {\n\treturn Array.from(items).map((item) => item.kind === \"file\" ? item.getAsFile() : null).filter(Boolean);\n}\n//#endregion\n//#region src/connect/components/modal/replace-duplicate-modal.tsx\nconst buttonStyles$4 = \"min-h-[48px] min-w-[142px] text-base font-semibold py-3 px-6 rounded-xl outline-none active:opacity-75 hover:scale-105 transform transition-all\";\nfunction ConnectReplaceDuplicateModal(props) {\n\tconst { title = \"Document Already Exists\", fileName, message, children, onReplace, onOpenChange, onDuplicate, replaceLabel = \"Replace\", duplicateLabel = \"Create Copy\", overlayProps, contentProps, bodyProps = {}, headerProps = {}, containerProps = {}, replaceButtonProps = {}, duplicateButtonProps = {}, buttonContainerProps = {}, ...restProps } = props;\n\tconst defaultMessage = fileName ? `A document named \"${fileName}\" already exists in this location. Would you like to replace it or create a copy?` : \"A document with the same name already exists in this location. Would you like to replace it or create a copy?\";\n\treturn /* @__PURE__ */ jsx(Modal, {\n\t\tcontentProps: {\n\t\t\t...contentProps,\n\t\t\tclassName: twMerge(\"rounded-3xl\", contentProps?.className)\n\t\t},\n\t\tonOpenChange,\n\t\toverlayProps: {\n\t\t\t...overlayProps,\n\t\t\tclassName: overlayProps?.className\n\t\t},\n\t\t...restProps,\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t...mergeClassNameProps(containerProps, \"w-[450px] p-6 text-slate-300\"),\n\t\t\tchildren: [\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"flex items-center justify-between border-b border-slate-50 pb-2\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\t...mergeClassNameProps(headerProps, \"text-2xl font-bold text-gray-800\"),\n\t\t\t\t\t\tchildren: title\n\t\t\t\t\t}), /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\tclassName: \"flex size-6 items-center justify-center rounded-md outline-none hover:bg-slate-100\",\n\t\t\t\t\t\tonClick: () => onOpenChange?.(false),\n\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\tname: \"XmarkLight\",\n\t\t\t\t\t\t\tsize: 24\n\t\t\t\t\t\t})\n\t\t\t\t\t})]\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t...mergeClassNameProps(bodyProps, \"my-6 rounded-md bg-slate-50 p-4 text-center\"),\n\t\t\t\t\tchildren: [message || defaultMessage, children]\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t...mergeClassNameProps(buttonContainerProps, \"mt-8 flex justify-between gap-3\"),\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\tonClick: onReplace,\n\t\t\t\t\t\t...mergeClassNameProps(replaceButtonProps, twMerge(buttonStyles$4, \"flex-1 bg-slate-50 text-slate-800\")),\n\t\t\t\t\t\tchildren: replaceLabel\n\t\t\t\t\t}), /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\tonClick: onDuplicate,\n\t\t\t\t\t\t...mergeClassNameProps(duplicateButtonProps, twMerge(buttonStyles$4, \"flex-1 bg-gray-800 text-gray-50\")),\n\t\t\t\t\t\tchildren: duplicateLabel\n\t\t\t\t\t})]\n\t\t\t\t})\n\t\t\t]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/upload-file-item/components/error-details.tsx\nfunction UploadFileItemErrorDetails(props) {\n\tconst { status, errorDetails } = props;\n\tif (!((status === \"failed\" || status === \"unsupported-document-type\") && errorDetails)) return null;\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName: \"break-words text-xs leading-[18px] text-gray-500\",\n\t\tchildren: errorDetails\n\t});\n}\n//#endregion\n//#region src/connect/components/upload-file-item/components/header.tsx\nfunction getDocumentIcon(documentType) {\n\tswitch (documentType) {\n\t\tcase \"analytics-processor\": return \"AnalyticsProcessorModule\";\n\t\tcase \"relational-processor\": return \"RelationalProcessorModule\";\n\t\tcase \"codegen-processor\": return \"CodegenProcessorModule\";\n\t\tcase \"app\": return \"AppModule\";\n\t\tcase \"document-model\": return \"DocumentModelModule\";\n\t\tcase \"editor\": return \"EditorModule\";\n\t\tcase \"package\": return \"PackageModule\";\n\t\tcase \"subgraph\": return \"SubgraphModule\";\n\t\tdefault: return \"PowerhouseDocumentModule\";\n\t}\n}\nfunction UploadFileItemHeader(props) {\n\tconst { fileName, fileSize, documentType, onClose, ...delegatedProps } = props;\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex items-center gap-2\",\n\t\t...delegatedProps,\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"flex h-9 w-7 flex-shrink-0 items-center justify-center\",\n\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tname: getDocumentIcon(documentType),\n\t\t\t\t\tsize: 48,\n\t\t\t\t\tclassName: \"text-gray-600\"\n\t\t\t\t})\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex flex-1 flex-col gap-0.5\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"text-xs font-medium leading-[18px] text-gray-900\",\n\t\t\t\t\tchildren: fileName\n\t\t\t\t}), /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"text-xs font-medium leading-[18px] text-gray-500\",\n\t\t\t\t\tchildren: fileSize\n\t\t\t\t})]\n\t\t\t}),\n\t\t\tonClose && /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"flex h-9 w-[18px] flex-shrink-0 items-start justify-center\",\n\t\t\t\tchildren: /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tonClick: onClose,\n\t\t\t\t\tclassName: \"flex h-[18px] w-[18px] items-center justify-center text-gray-600 hover:text-gray-800\",\n\t\t\t\t\t\"aria-label\": \"Close\",\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\tname: \"XmarkLight\",\n\t\t\t\t\t\tsize: 18\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t})\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/upload-file-item/components/progress-bar.tsx\nfunction UploadFileItemProgressBar(props) {\n\tconst { status, progress = 0 } = props;\n\tif (status !== \"uploading\") return null;\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName: \"h-2 w-full overflow-hidden rounded-sm bg-gray-200\",\n\t\tchildren: /* @__PURE__ */ jsx(\"div\", {\n\t\t\tclassName: \"h-full bg-blue-900 transition-all duration-300 ease-out\",\n\t\t\tstyle: { width: `${Math.min(100, Math.max(0, progress))}%` }\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/upload-file-item/components/status-row.tsx\nfunction getStatusText(status) {\n\tswitch (status) {\n\t\tcase \"success\": return \"Upload successful\";\n\t\tcase \"failed\": return \"Upload failed\";\n\t\tcase \"unsupported-document-type\": return \"Document not supported by this drive\";\n\t\tcase \"pending\": return \"Pending resolution\";\n\t\tcase \"conflict\": return \"Pending Resolution\";\n\t\tcase \"uploading\": return \"Uploading...\";\n\t\tdefault: return \"\";\n\t}\n}\nfunction getStatusColor(status) {\n\tswitch (status) {\n\t\tcase \"success\": return \"text-green-700\";\n\t\tcase \"failed\":\n\t\tcase \"unsupported-document-type\":\n\t\tcase \"pending\":\n\t\tcase \"conflict\": return \"text-red-900\";\n\t\tcase \"uploading\": return \"text-gray-900\";\n\t\tdefault: return \"text-gray-900\";\n\t}\n}\nfunction shouldShowCTA(status, onOpenDocument, onFindResolution) {\n\treturn status === \"success\" && Boolean(onOpenDocument) || status === \"pending\" && Boolean(onFindResolution) || status === \"conflict\" && Boolean(onFindResolution);\n}\nfunction getCTAText(status) {\n\tif (status === \"success\") return \"Open Document\";\n\tif (status === \"pending\") return \"Find resolution\";\n\tif (status === \"conflict\") return \"Find resolution\";\n\treturn \"\";\n}\nfunction UploadFileItemStatusRow(props) {\n\tconst { status, progress = 0, onOpenDocument, onFindResolution } = props;\n\tconst handleCTAClick = () => {\n\t\tif (status === \"success\" && onOpenDocument) onOpenDocument();\n\t\telse if ((status === \"pending\" || status === \"conflict\") && onFindResolution) onFindResolution();\n\t};\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex items-center justify-between gap-2\",\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: twMerge(\"text-xs leading-[18px]\", getStatusColor(status)),\n\t\t\t\tchildren: getStatusText(status)\n\t\t\t}),\n\t\t\tstatus === \"uploading\" && /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"text-xs font-medium leading-[18px] text-gray-900\",\n\t\t\t\tchildren: [Math.round(progress), \"%\"]\n\t\t\t}),\n\t\t\tshouldShowCTA(status, onOpenDocument, onFindResolution) && /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\ttype: \"button\",\n\t\t\t\tonClick: handleCTAClick,\n\t\t\t\tclassName: \"text-xs leading-[18px] text-blue-900 hover:opacity-80\",\n\t\t\t\tchildren: getCTAText(status)\n\t\t\t})\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/upload-file-item/upload-file-item.tsx\nconst UploadFileItem = /* @__PURE__ */ forwardRef(function UploadFileItem(props, ref) {\n\tconst { fileName, fileSize, status, documentType, progress = 0, errorDetails, onClose, onOpenDocument, onFindResolution, className, ...delegatedProps } = props;\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tref,\n\t\tclassName: twMerge(\"flex w-full flex-col gap-0.5 rounded-md border border-gray-100 bg-white p-2 shadow-[0_2px_12px_rgba(37,42,52,0.1)]\", className),\n\t\t...delegatedProps,\n\t\tchildren: [/* @__PURE__ */ jsx(UploadFileItemHeader, {\n\t\t\tfileName,\n\t\t\tfileSize,\n\t\t\tdocumentType,\n\t\t\tonClose\n\t\t}), /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"flex flex-col gap-1\",\n\t\t\tchildren: [\n\t\t\t\t/* @__PURE__ */ jsx(UploadFileItemStatusRow, {\n\t\t\t\t\tstatus,\n\t\t\t\t\tprogress,\n\t\t\t\t\tonOpenDocument,\n\t\t\t\t\tonFindResolution\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsx(UploadFileItemProgressBar, {\n\t\t\t\t\tstatus,\n\t\t\t\t\tprogress\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsx(UploadFileItemErrorDetails, {\n\t\t\t\t\tstatus,\n\t\t\t\t\terrorDetails\n\t\t\t\t})\n\t\t\t]\n\t\t})]\n\t});\n});\n//#endregion\n//#region src/connect/components/upload-file-list/utils.ts\nfunction getUploadListTitle(count, explicitTitle) {\n\tif (explicitTitle) return explicitTitle;\n\treturn `Uploading ${count} document${count === 1 ? \"\" : \"s\"}`;\n}\n//#endregion\n//#region src/connect/components/upload-file-list/upload-file-list.tsx\nfunction UploadFileList(props) {\n\tconst { items, title, defaultCollapsed = false, onClose, className, ...delegatedProps } = props;\n\tconst [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n\tconst computedTitle = useMemo(() => getUploadListTitle(items.length, title), [items.length, title]);\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: twMerge(\"w-[358px] rounded-md border border-gray-100 bg-gray-50 p-4 shadow-[1px_4px_15px_rgba(74,88,115,0.25)]\", className),\n\t\t...delegatedProps,\n\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"flex items-center justify-between\",\n\t\t\tchildren: [/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\ttype: \"button\",\n\t\t\t\t\"aria-expanded\": !isCollapsed,\n\t\t\t\t\"aria-label\": isCollapsed ? \"Expand list\" : \"Collapse list\",\n\t\t\t\tonClick: () => setIsCollapsed((v) => !v),\n\t\t\t\tclassName: \"min-w-0 flex-1 text-left text-sm font-medium leading-4 text-gray-900 hover:opacity-80\",\n\t\t\t\tchildren: computedTitle\n\t\t\t}), /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex shrink-0 items-center gap-4\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\"aria-label\": isCollapsed ? \"Expand\" : \"Collapse\",\n\t\t\t\t\tonClick: () => setIsCollapsed((v) => !v),\n\t\t\t\t\tclassName: \"text-gray-900 hover:opacity-80\",\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\tclassName: twMerge(\"inline-block h-4 w-4 select-none transition-transform\", isCollapsed ? \"-rotate-90\" : \"rotate-0\"),\n\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\tname: \"CaretDown\",\n\t\t\t\t\t\t\tsize: 16,\n\t\t\t\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t}), onClose && /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\"aria-label\": \"Close\",\n\t\t\t\t\tonClick: onClose,\n\t\t\t\t\tclassName: \"text-gray-900 hover:opacity-80\",\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\tclassName: \"inline-block h-4 w-4 select-none\",\n\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\tname: \"XmarkLight\",\n\t\t\t\t\t\t\tsize: 16,\n\t\t\t\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t})]\n\t\t\t})]\n\t\t}), !isCollapsed && /* @__PURE__ */ jsx(\"div\", {\n\t\t\tclassName: \"mt-4 flex max-h-[404px] flex-col gap-4 overflow-y-auto overflow-x-visible px-2 py-2\",\n\t\t\tchildren: items.map((item, idx) => /* @__PURE__ */ jsx(UploadFileItem, { ...item }, `${item.fileName}-${idx}`))\n\t\t})]\n\t});\n}\n//#endregion\n//#region src/connect/components/drop-zone/utils.ts\nfunction generateId() {\n\treturn `upload_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\nfunction formatFileSize(bytes) {\n\tif (bytes === 0) return \"0 Bytes\";\n\tconst k = 1024;\n\tconst sizes = [\n\t\t\"Bytes\",\n\t\t\"KB\",\n\t\t\"MB\",\n\t\t\"GB\"\n\t];\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k));\n\treturn `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\nfunction mapProgressStageToStatus(stage) {\n\tswitch (stage) {\n\t\tcase \"loading\":\n\t\tcase \"initializing\": return \"pending\";\n\t\tcase \"uploading\": return \"uploading\";\n\t\tcase \"complete\": return \"success\";\n\t\tcase \"failed\": return \"failed\";\n\t\tcase \"conflict\": return \"conflict\";\n\t\tcase \"unsupported-document-type\": return \"unsupported-document-type\";\n\t\tdefault: return \"pending\";\n\t}\n}\nfunction mapUploadsToFileItems(uploadsArray, removeUpload, setSelectedNodeFn, onConflictResolution) {\n\treturn uploadsArray.filter((upload) => upload !== void 0).map((upload) => ({\n\t\tfileName: upload.fileName,\n\t\tfileSize: upload.fileSize,\n\t\tstatus: upload.status,\n\t\tprogress: upload.progress,\n\t\terrorDetails: upload.errorDetails,\n\t\tdocumentType: upload.documentType,\n\t\tonClose: () => {\n\t\t\tremoveUpload(upload.id);\n\t\t},\n\t\tonOpenDocument: upload.status === \"success\" ? () => {\n\t\t\tif (upload.fileNode && setSelectedNodeFn) setSelectedNodeFn(upload.fileNode);\n\t\t\telse console.error(\"Opening document for upload:\", upload.id, \"- fileNode not available or setSelectedNode not provided\");\n\t\t} : void 0,\n\t\tonFindResolution: upload.status === \"failed\" ? () => {\n\t\t\tconsole.log(\"Finding resolution for upload:\", upload.id);\n\t\t} : upload.status === \"conflict\" ? () => {\n\t\t\tconsole.log(\"Finding conflict resolution for upload:\", upload.id);\n\t\t\tonConflictResolution?.(upload.id);\n\t\t} : void 0\n\t}));\n}\n//#endregion\n//#region src/connect/components/drop-zone/upload-file-list-container.tsx\nfunction UploadFileListContainer(props) {\n\tconst { uploadsArray, uploadsCount, removeUpload, clearAllUploads, setSelectedNode, onClose, onConflictResolution, className, ...delegatedProps } = props;\n\tif (uploadsCount === 0) return null;\n\tconst items = mapUploadsToFileItems(uploadsArray, removeUpload, setSelectedNode, onConflictResolution);\n\tconst handleClose = onClose ?? clearAllUploads;\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName: twMerge(\"fixed bottom-4 right-4 z-[1001]\", className),\n\t\t...delegatedProps,\n\t\tchildren: /* @__PURE__ */ jsx(UploadFileList, {\n\t\t\titems,\n\t\t\tonClose: handleClose\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/drop-zone/use-upload-tracker.ts\nfunction uploadsReducer(state, action) {\n\tswitch (action.type) {\n\t\tcase \"ADD_UPLOAD\": return {\n\t\t\t...state,\n\t\t\t[action.payload.id]: {\n\t\t\t\tid: action.payload.id,\n\t\t\t\tfileName: action.payload.fileName,\n\t\t\t\tfileSize: action.payload.fileSize,\n\t\t\t\tstatus: \"pending\",\n\t\t\t\tprogress: 0,\n\t\t\t\tfileNode: void 0\n\t\t\t}\n\t\t};\n\t\tcase \"UPDATE_PROGRESS\": {\n\t\t\tconst currentUpload = state[action.payload.id];\n\t\t\tif (!currentUpload) return state;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[action.payload.id]: {\n\t\t\t\t\t...currentUpload,\n\t\t\t\t\tstatus: mapProgressStageToStatus(action.payload.progress.stage),\n\t\t\t\t\tprogress: action.payload.progress.progress,\n\t\t\t\t\terrorDetails: action.payload.progress.error,\n\t\t\t\t\t...action.payload.progress.documentType && { documentType: action.payload.progress.documentType },\n\t\t\t\t\t...action.payload.progress.duplicateType && { duplicateType: action.payload.progress.duplicateType },\n\t\t\t\t\t...action.payload.progress.fileNode && { fileNode: action.payload.progress.fileNode }\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tcase \"SET_FILE_NODE\": {\n\t\t\tconst uploadToUpdate = state[action.payload.id];\n\t\t\tif (!uploadToUpdate) return state;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[action.payload.id]: {\n\t\t\t\t\t...uploadToUpdate,\n\t\t\t\t\tfileNode: action.payload.fileNode\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tcase \"SET_ERROR\": {\n\t\t\tconst failedUpload = state[action.payload.id];\n\t\t\tif (!failedUpload) return state;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[action.payload.id]: {\n\t\t\t\t\t...failedUpload,\n\t\t\t\t\tstatus: failedUpload.status || \"failed\",\n\t\t\t\t\terrorDetails: action.payload.error\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tcase \"REMOVE_UPLOAD\": {\n\t\t\tconst { [action.payload.id]: removed, ...rest } = state;\n\t\t\treturn rest;\n\t\t}\n\t\tcase \"CLEAR_ALL_UPLOADS\": return {};\n\t\tcase \"SET_CONFLICT_DATA\": {\n\t\t\tconst conflictUpload = state[action.payload.id];\n\t\t\tif (!conflictUpload) return state;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[action.payload.id]: {\n\t\t\t\t\t...conflictUpload,\n\t\t\t\t\tfile: action.payload.file,\n\t\t\t\t\tparentNode: action.payload.parentNode\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tcase \"CLEAR_CONFLICTED_UPLOADS\": {\n\t\t\tconst filteredUploads = {};\n\t\t\tfor (const [id, upload] of Object.entries(state)) if (upload && upload.status !== \"conflict\") filteredUploads[id] = upload;\n\t\t\treturn filteredUploads;\n\t\t}\n\t\tdefault: return state;\n\t}\n}\nfunction useUploadTracker(useLocalStorage = false, driveId) {\n\tconst [uploads, dispatch] = useReducer(uploadsReducer, useCallback(() => {\n\t\tif (useLocalStorage && driveId) try {\n\t\t\tconst stored = localStorage.getItem(`uploadTracker_${driveId}`);\n\t\t\tif (stored) return JSON.parse(stored);\n\t\t\treturn {};\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to load upload tracker from localStorage:\", error);\n\t\t\treturn {};\n\t\t}\n\t\treturn {};\n\t}, [useLocalStorage, driveId])());\n\tuseEffect(() => {\n\t\tif (useLocalStorage && driveId) try {\n\t\t\tlocalStorage.setItem(`uploadTracker_${driveId}`, JSON.stringify(uploads));\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to save upload tracker to localStorage:\", error);\n\t\t}\n\t}, [\n\t\tuploads,\n\t\tuseLocalStorage,\n\t\tdriveId\n\t]);\n\tconst createUploadHandler = useCallback((onAddFile) => {\n\t\tif (!onAddFile) return void 0;\n\t\treturn async (file, parent) => {\n\t\t\tconst fileId = generateId();\n\t\t\tdispatch({\n\t\t\t\ttype: \"ADD_UPLOAD\",\n\t\t\t\tpayload: {\n\t\t\t\t\tid: fileId,\n\t\t\t\t\tfileName: file.name,\n\t\t\t\t\tfileSize: formatFileSize(file.size)\n\t\t\t\t}\n\t\t\t});\n\t\t\tconst progressCallback = (progress) => {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"UPDATE_PROGRESS\",\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tid: fileId,\n\t\t\t\t\t\tprogress\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (progress.stage === \"conflict\") dispatch({\n\t\t\t\t\ttype: \"SET_CONFLICT_DATA\",\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tid: fileId,\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tparentNode: parent\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"SET_FILE_NODE\",\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tid: fileId,\n\t\t\t\t\t\tfileNode: await onAddFile(file, parent, progressCallback) || void 0\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"SET_ERROR\",\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tid: fileId,\n\t\t\t\t\t\terror: error instanceof Error ? error.message : \"Unknown error\"\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t}, []);\n\tconst removeUpload = useCallback((uploadId) => {\n\t\tdispatch({\n\t\t\ttype: \"REMOVE_UPLOAD\",\n\t\t\tpayload: { id: uploadId }\n\t\t});\n\t}, []);\n\tconst clearAllUploads = useCallback(() => {\n\t\tdispatch({ type: \"CLEAR_ALL_UPLOADS\" });\n\t}, []);\n\tconst clearConflictedUploads = useCallback(() => {\n\t\tdispatch({ type: \"CLEAR_CONFLICTED_UPLOADS\" });\n\t}, []);\n\tconst getUploadsArray = useCallback(() => {\n\t\treturn Object.values(uploads);\n\t}, [uploads]);\n\tconst getUploadsCount = useCallback(() => {\n\t\treturn Object.keys(uploads).length;\n\t}, [uploads]);\n\tconst resolveConflict = useCallback((uploadId, resolution, onAddFile) => {\n\t\tconst upload = uploads[uploadId];\n\t\tif (!upload?.file || !onAddFile) {\n\t\t\tconsole.error(\"Cannot resolve conflict: missing upload data or onAddFile function\");\n\t\t\treturn;\n\t\t}\n\t\tconst progressCallback = (progress) => {\n\t\t\tdispatch({\n\t\t\t\ttype: \"UPDATE_PROGRESS\",\n\t\t\t\tpayload: {\n\t\t\t\t\tid: uploadId,\n\t\t\t\t\tprogress\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t\tconst result = onAddFile(upload.file, upload.parentNode, progressCallback, resolution);\n\t\tPromise.resolve(result).then((fileNode) => {\n\t\t\tif (fileNode) dispatch({\n\t\t\t\ttype: \"SET_FILE_NODE\",\n\t\t\t\tpayload: {\n\t\t\t\t\tid: uploadId,\n\t\t\t\t\tfileNode\n\t\t\t\t}\n\t\t\t});\n\t\t}).catch((error) => {\n\t\t\tdispatch({\n\t\t\t\ttype: \"SET_ERROR\",\n\t\t\t\tpayload: {\n\t\t\t\t\tid: uploadId,\n\t\t\t\t\terror: error instanceof Error ? error.message : \"Unknown error\"\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}, [uploads]);\n\treturn {\n\t\tuploads,\n\t\tuploadsArray: getUploadsArray(),\n\t\tuploadsCount: getUploadsCount(),\n\t\tcreateUploadHandler,\n\t\tremoveUpload,\n\t\tclearAllUploads,\n\t\tclearConflictedUploads,\n\t\tresolveConflict\n\t};\n}\n//#endregion\n//#region src/connect/components/drop-zone/drop-zone.tsx\nfunction DropZone(props) {\n\tconst { title = \"Drag your documents\", subtitle = \"to drop them in the currently selected folder.\", node, enable = true, children, onAddFile, useLocalStorage = false, driveId, acceptedFileExtensions = [\n\t\t\".zip\",\n\t\t\".phd\",\n\t\t\".phdm\"\n\t], className, ...delegatedProps } = props;\n\tconst [modalOpen, setModalOpen] = useState(false);\n\tconst [conflictUploadId, setConflictUploadId] = useState(null);\n\tconst { uploadsArray, uploadsCount, createUploadHandler, clearAllUploads, clearConflictedUploads, removeUpload, resolveConflict } = useUploadTracker(useLocalStorage, driveId);\n\tuseEffect(() => {\n\t\tclearConflictedUploads();\n\t}, []);\n\tconst handleAddFile = createUploadHandler(onAddFile) ?? (async () => {});\n\tconst handleConflictResolution = (uploadId) => {\n\t\tsetConflictUploadId(uploadId);\n\t\tsetModalOpen(true);\n\t};\n\tconst handleReplace = () => {\n\t\tif (conflictUploadId && onAddFile) resolveConflict(conflictUploadId, \"replace\", onAddFile);\n\t\tsetModalOpen(false);\n\t\tsetConflictUploadId(null);\n\t};\n\tconst handleDuplicate = () => {\n\t\tif (conflictUploadId && onAddFile) resolveConflict(conflictUploadId, \"duplicate\", onAddFile);\n\t\tsetModalOpen(false);\n\t\tsetConflictUploadId(null);\n\t};\n\tconst handleModalClose = () => {\n\t\tsetModalOpen(false);\n\t\tsetConflictUploadId(null);\n\t};\n\tconst { isDropTarget, dropProps } = useDrop({\n\t\ttarget: node,\n\t\tonAddFileOverride: handleAddFile,\n\t\ttrackNestedDrag: true,\n\t\tacceptedFileExtensions\n\t});\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: twMerge(\"relative\", className),\n\t\t...enable ? dropProps : {},\n\t\t...delegatedProps,\n\t\tchildren: [\n\t\t\tchildren,\n\t\t\tenable && isDropTarget && /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"fixed inset-0 z-[1000] flex min-h-screen w-screen items-center justify-center bg-black/50\",\n\t\t\t\tchildren: /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"rounded-[24px] bg-white p-6 shadow-[1px_4px_15px_rgba(74,88,115,0.25)]\",\n\t\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\tclassName: \"relative flex h-[130px] w-[400px] flex-col items-center justify-start overflow-visible rounded-lg border border-dashed border-black px-4 py-6\",\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\t\t\tclassName: \"text-center text-base leading-5 text-zinc-500\",\n\t\t\t\t\t\t\t\tchildren: title\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\t\t\tclassName: \"text-center text-base leading-5 text-zinc-500\",\n\t\t\t\t\t\t\t\tchildren: subtitle\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\tclassName: \"pointer-events-none absolute -bottom-16 left-1/2 z-10 -translate-x-1/2\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\t\t\tname: \"DocumentIcons\",\n\t\t\t\t\t\t\t\t\tsize: 144,\n\t\t\t\t\t\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t]\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(UploadFileListContainer, {\n\t\t\t\tuploadsArray,\n\t\t\t\tuploadsCount,\n\t\t\t\tremoveUpload,\n\t\t\t\tclearAllUploads,\n\t\t\t\tsetSelectedNode,\n\t\t\t\tonConflictResolution: handleConflictResolution\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(ConnectReplaceDuplicateModal, {\n\t\t\t\topen: modalOpen,\n\t\t\t\tonOpenChange: handleModalClose,\n\t\t\t\tfileName: conflictUploadId ? uploadsArray.find((u) => u?.id === conflictUploadId)?.fileName : void 0,\n\t\t\t\tonReplace: handleReplace,\n\t\t\t\tonDuplicate: handleDuplicate\n\t\t\t})\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/drop-zone/drop-zone-wrapper.tsx\nfunction DropZoneWrapper({ children, ...props }) {\n\tconst isDragAndDropEnabled = useIsDragAndDropEnabled();\n\tconst selectedDriveId = useSelectedDriveId();\n\tconst onDropFile = useOnDropFile();\n\tconst onAddFile = async (file, parent, onProgress, resolveConflict) => {\n\t\treturn await onDropFile(file, onProgress, resolveConflict);\n\t};\n\tif (!isDragAndDropEnabled || !selectedDriveId) return /* @__PURE__ */ jsx(Fragment$1, { children });\n\treturn /* @__PURE__ */ jsx(DropZone, {\n\t\tonAddFile,\n\t\tdriveId: selectedDriveId,\n\t\tuseLocalStorage: true,\n\t\t...props,\n\t\tchildren\n\t});\n}\n//#endregion\n//#region src/connect/components/dropdown-menu/dropdown-menu.tsx\nfunction ConnectDropdownMenu(props) {\n\tconst { children, items, open, onItemClick, onOpenChange, menuClassName } = props;\n\treturn /* @__PURE__ */ jsxs(DropdownMenu, {\n\t\tonOpenChange,\n\t\topen,\n\t\tchildren: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {\n\t\t\tasChild: true,\n\t\t\tclassName: \"outline-none\",\n\t\t\tchildren\n\t\t}), /* @__PURE__ */ jsx(DropdownMenuContent, {\n\t\t\tclassName: twMerge(\"cursor-pointer rounded-2xl border border-gray-200 bg-white text-sm font-medium text-slate-500 shadow-lg\", menuClassName),\n\t\t\tchildren: items.map(({ id, label, icon, className }) => /* @__PURE__ */ jsxs(DropdownMenuItem, {\n\t\t\t\tclassName: twMerge(\"flex items-center px-5 py-2 outline-none first-of-type:rounded-t-2xl first-of-type:pt-3 last-of-type:rounded-b-2xl last-of-type:pb-3 hover:bg-slate-50\", className),\n\t\t\t\tonClick: (e) => e.stopPropagation(),\n\t\t\t\tonSelect: () => onItemClick(id),\n\t\t\t\tchildren: [icon ? /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\tclassName: \"mr-2 inline-block\",\n\t\t\t\t\tchildren: icon\n\t\t\t\t}) : null, label]\n\t\t\t}, id))\n\t\t})]\n\t});\n}\n//#endregion\n//#region src/connect/components/editor-action-buttons/editor-action-buttons.tsx\nfunction EditorActionButtons(props) {\n\tconst { onSwitchboardLinkClick, onExport, onClose, onShowRevisionHistory, onShowTimeline } = props;\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex items-center gap-x-2\",\n\t\tchildren: [\n\t\t\tonSwitchboardLinkClick && /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\tclassName: \"grid size-8 place-items-center rounded-lg border border-gray-200 bg-white text-gray-900 disabled:cursor-not-allowed disabled:text-gray-500\",\n\t\t\t\tonClick: onSwitchboardLinkClick,\n\t\t\t\tdisabled: !onSwitchboardLinkClick,\n\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tname: \"Drive\",\n\t\t\t\t\tsize: 16\n\t\t\t\t})\n\t\t\t}),\n\t\t\tonShowRevisionHistory && /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\tclassName: \"grid size-8 place-items-center rounded-lg border border-gray-200 bg-white text-gray-900 disabled:cursor-not-allowed disabled:text-gray-500\",\n\t\t\t\tonClick: onShowRevisionHistory,\n\t\t\t\tdisabled: !onShowRevisionHistory,\n\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tname: \"History\",\n\t\t\t\t\tsize: 16\n\t\t\t\t})\n\t\t\t}),\n\t\t\tonShowTimeline && /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\tclassName: \"grid size-8 place-items-center rounded-lg border border-gray-200 bg-white text-gray-900 disabled:cursor-not-allowed disabled:text-gray-500\",\n\t\t\t\tonClick: onShowTimeline,\n\t\t\t\tdisabled: !onShowTimeline,\n\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tname: \"Timeline\",\n\t\t\t\t\tsize: 16\n\t\t\t\t})\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\tclassName: \"grid size-8 place-items-center rounded-lg border border-gray-200 bg-white text-gray-900\",\n\t\t\t\tonClick: onClose,\n\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tname: \"XmarkLight\",\n\t\t\t\t\tsize: 16\n\t\t\t\t})\n\t\t\t})\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/editor-undo-redo-buttons/editor-undo-redo-buttons.tsx\nfunction EditorUndoRedoButtons(props) {\n\tconst { canUndo, canRedo, undo, redo } = props;\n\tconst buttonStyles = \"w-8 h-8 rounded-lg flex justify-center items-center rounded border border-gray-200\";\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex gap-x-2 text-gray-500\",\n\t\tchildren: [/* @__PURE__ */ jsx(\"button\", {\n\t\t\tclassName: buttonStyles,\n\t\t\tdisabled: !canUndo,\n\t\t\tonClick: undo,\n\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\tclassName: twMerge(\"-scale-x-100\", canUndo ? \"text-gray-900 active:opacity-50\" : \"text-gray-500\"),\n\t\t\t\tname: \"RedoArrow\",\n\t\t\t\tsize: 18\n\t\t\t})\n\t\t}), /* @__PURE__ */ jsx(\"button\", {\n\t\t\tclassName: buttonStyles,\n\t\t\tdisabled: !canRedo,\n\t\t\tonClick: redo,\n\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\tclassName: twMerge(canRedo ? \"text-gray-900 active:opacity-50\" : \"text-gray-500\"),\n\t\t\t\tname: \"RedoArrow\",\n\t\t\t\tsize: 18\n\t\t\t})\n\t\t})]\n\t});\n}\n//#endregion\n//#region assets/powerhouse-rounded.png\nvar powerhouse_rounded_default = \"data:image/png;base64,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\";\n//#endregion\n//#region src/connect/components/ens-avatar/ens-avatar.tsx\nfunction ENSAvatar(props) {\n\tconst { avatarUrl = powerhouse_rounded_default, size = \"14px\" } = props;\n\treturn /* @__PURE__ */ jsx(\"img\", {\n\t\talt: \"ENS Avatar\",\n\t\tclassName: \"flex-none rounded-full object-contain\",\n\t\tsrc: avatarUrl,\n\t\tstyle: {\n\t\t\twidth: size,\n\t\t\theight: size\n\t\t}\n\t});\n}\n//#endregion\n//#region assets/icons/template.png\nvar template_default = \"data:image/png;base64,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\";\n//#endregion\n//#region src/connect/constants/options.tsx\nconst defaultDriveOptions = [\n\t\"NEW_FOLDER\",\n\t\"RENAME\",\n\t\"SETTINGS\"\n];\nconst defaultNodeOptions = [\n\t\"RENAME\",\n\t\"DELETE\",\n\t\"DUPLICATE\"\n];\nconst normalNodeOptions = [\n\t\"DUPLICATE\",\n\t\"RENAME\",\n\t\"DELETE\",\n\t\"SETTINGS\"\n];\nconst debugNodeOptions = [\n\t\"ADD_TRIGGER\",\n\t\"REMOVE_TRIGGER\",\n\t\"ADD_INVALID_TRIGGER\"\n];\nconst nodeOptions = [...normalNodeOptions, ...debugNodeOptions];\nconst sharingTypeOptions = [\n\t{\n\t\tvalue: \"LOCAL\",\n\t\ticon: /* @__PURE__ */ jsx(Icon, {\n\t\t\tname: \"Lock\",\n\t\t\tsize: 16\n\t\t}),\n\t\tdescription: \"Only available to you\"\n\t},\n\t{\n\t\tvalue: \"CLOUD\",\n\t\ticon: /* @__PURE__ */ jsx(Icon, {\n\t\t\tname: \"People\",\n\t\t\tsize: 16\n\t\t}),\n\t\tdescription: \"Only available to people in this drive\"\n\t},\n\t{\n\t\tvalue: \"PUBLIC\",\n\t\ticon: /* @__PURE__ */ jsx(Icon, {\n\t\t\tname: \"Globe\",\n\t\t\tsize: 16\n\t\t}),\n\t\tdescription: \"Available to everyone\",\n\t\tdisabled: true\n\t}\n];\nconst locationInfoByLocation = {\n\tCLOUD: {\n\t\ttitle: \"Secure cloud\",\n\t\tdescription: \"End to end encryption between members.\",\n\t\ticon: /* @__PURE__ */ jsx(Icon, {\n\t\t\tname: \"Lock\",\n\t\t\tsize: 16\n\t\t})\n\t},\n\tLOCAL: {\n\t\ttitle: \"Local\",\n\t\tdescription: \"Private and only available to you.\",\n\t\ticon: /* @__PURE__ */ jsx(Icon, {\n\t\t\tname: \"Hdd\",\n\t\t\tsize: 16\n\t\t})\n\t},\n\tSWITCHBOARD: {\n\t\ttitle: \"Switchboard\",\n\t\tdescription: \"Public and available to everyone.\",\n\t\ticon: /* @__PURE__ */ jsx(Icon, {\n\t\t\tname: \"Drive\",\n\t\t\tsize: 16\n\t\t})\n\t}\n};\nconst debugNodeOptionsMap = {\n\t[\"ADD_TRIGGER\"]: {\n\t\tlabel: \"Add Trigger\",\n\t\ticon: /* @__PURE__ */ jsx(Icon, {\n\t\t\tclassName: \"text-orange-900\",\n\t\t\tname: \"Plus\",\n\t\t\tsize: 16\n\t\t})\n\t},\n\t[\"REMOVE_TRIGGER\"]: {\n\t\tlabel: \"Remove Trigger\",\n\t\ticon: /* @__PURE__ */ jsx(Icon, {\n\t\t\tclassName: \"text-orange-900\",\n\t\t\tname: \"Xmark\",\n\t\t\tsize: 16\n\t\t})\n\t},\n\t[\"ADD_INVALID_TRIGGER\"]: {\n\t\tlabel: \"Add Trigger\",\n\t\ticon: /* @__PURE__ */ jsx(Icon, {\n\t\t\tclassName: \"text-orange-900\",\n\t\t\tname: \"Exclamation\",\n\t\t\tsize: 16\n\t\t})\n\t}\n};\nconst normalNodeOptionsMap = {\n\tDUPLICATE: {\n\t\tlabel: \"Duplicate\",\n\t\ticon: /* @__PURE__ */ jsx(Icon, {\n\t\t\tname: \"FilesEarmark\",\n\t\t\tsize: 16\n\t\t})\n\t},\n\tRENAME: {\n\t\tlabel: \"Rename\",\n\t\ticon: /* @__PURE__ */ jsx(Icon, {\n\t\t\tname: \"Pencil\",\n\t\t\tsize: 16\n\t\t})\n\t},\n\tDELETE: {\n\t\tlabel: \"Delete\",\n\t\ticon: /* @__PURE__ */ jsx(Icon, {\n\t\t\tname: \"Trash\",\n\t\t\tsize: 16\n\t\t}),\n\t\tclassName: \"text-red-900\"\n\t},\n\tSETTINGS: {\n\t\tlabel: \"Settings\",\n\t\ticon: /* @__PURE__ */ jsx(Icon, {\n\t\t\tname: \"Gear\",\n\t\t\tsize: 16\n\t\t})\n\t}\n};\nconst nodeOptionsMap = {\n\t...debugNodeOptionsMap,\n\t...normalNodeOptionsMap\n};\n//#endregion\n//#region src/connect/hooks/use-drag.ts\nfunction useDrag(props) {\n\tconst { node } = props;\n\tconst [isDragging, setIsDragging] = useState(false);\n\tconst onDragStart = useCallback((event) => {\n\t\tevent.dataTransfer.setData(\"UI_NODE\", JSON.stringify(node));\n\t}, [node]);\n\tconst onDragEnd = useCallback(() => {\n\t\tsetIsDragging(false);\n\t}, []);\n\treturn useMemo(() => {\n\t\treturn {\n\t\t\tisDragging,\n\t\t\tdragProps: {\n\t\t\t\tdraggable: true,\n\t\t\t\tonDragStart,\n\t\t\t\tonDragEnd\n\t\t\t}\n\t\t};\n\t}, [\n\t\tisDragging,\n\t\tonDragEnd,\n\t\tonDragStart\n\t]);\n}\n//#endregion\n//#region src/connect/constants/syncing.ts\nconst SYNCING = \"SYNCING\";\nconst SUCCESS = \"SUCCESS\";\nconst CONFLICT = \"CONFLICT\";\nconst MISSING = \"MISSING\";\nconst ERROR = \"ERROR\";\nconst INITIAL_SYNC = \"INITIAL_SYNC\";\nconst syncStatuses = [\n\tINITIAL_SYNC,\n\tSYNCING,\n\tSUCCESS,\n\tCONFLICT,\n\tMISSING,\n\tERROR\n];\n//#endregion\n//#region src/connect/components/status-icon/sync-status-icon.tsx\nconst syncIcons = {\n\tSYNCING: \"Syncing\",\n\tSUCCESS: \"Synced\",\n\tCONFLICT: \"Error\",\n\tMISSING: \"Circle\",\n\tERROR: \"Error\",\n\tINITIAL_SYNC: \"Syncing\"\n};\nfunction SyncStatusIcon(props) {\n\tconst { syncStatus, className, overrideSyncIcons = {}, ...iconProps } = props;\n\tconst icons = {\n\t\t...syncIcons,\n\t\t...overrideSyncIcons\n\t};\n\treturn {\n\t\t[INITIAL_SYNC]: /* @__PURE__ */ jsx(Icon, {\n\t\t\tsize: 16,\n\t\t\t...iconProps,\n\t\t\tclassName: twMerge(\"text-blue-900\", className),\n\t\t\tname: icons[INITIAL_SYNC]\n\t\t}),\n\t\t[SYNCING]: /* @__PURE__ */ jsx(Icon, {\n\t\t\tsize: 16,\n\t\t\t...iconProps,\n\t\t\tclassName: twMerge(\"text-blue-900\", className),\n\t\t\tname: icons[SYNCING]\n\t\t}),\n\t\t[SUCCESS]: /* @__PURE__ */ jsx(Icon, {\n\t\t\tsize: 16,\n\t\t\t...iconProps,\n\t\t\tclassName: twMerge(\"text-green-900\", className),\n\t\t\tname: icons[SUCCESS]\n\t\t}),\n\t\t[CONFLICT]: /* @__PURE__ */ jsx(Icon, {\n\t\t\tsize: 16,\n\t\t\t...iconProps,\n\t\t\tclassName: twMerge(\"text-orange-900\", className),\n\t\t\tname: icons[CONFLICT]\n\t\t}),\n\t\t[MISSING]: /* @__PURE__ */ jsx(Icon, {\n\t\t\tsize: 16,\n\t\t\t...iconProps,\n\t\t\tclassName: twMerge(\"text-red-900\", className),\n\t\t\tname: icons[MISSING]\n\t\t}),\n\t\t[ERROR]: /* @__PURE__ */ jsx(Icon, {\n\t\t\tsize: 16,\n\t\t\t...iconProps,\n\t\t\tclassName: twMerge(\"text-red-900\", className),\n\t\t\tname: icons[ERROR]\n\t\t})\n\t}[syncStatus];\n}\n//#endregion\n//#region src/connect/components/file-item/file-item.tsx\nfunction getDriveSharingType$1(drive) {\n\tif (typeof drive !== \"object\") return \"LOCAL\";\n\tconst { sharingType: _sharingType } = !(\"readContext\" in drive) ? drive.state.local : { sharingType: \"PUBLIC\" };\n\tconst __sharingType = _sharingType?.toUpperCase();\n\treturn !__sharingType || __sharingType === \"PRIVATE\" || ![\n\t\t\"LOCAL\",\n\t\t\"CLOUD\",\n\t\t\"PUBLIC\"\n\t].includes(__sharingType) ? \"LOCAL\" : __sharingType;\n}\nfunction FileItem(props) {\n\tconst { fileNode, className, customDocumentIconSrc } = props;\n\tconst [mode, setMode] = useState(\"READ\");\n\tconst [isDropdownMenuOpen, setIsDropdownMenuOpen] = useState(false);\n\tconst [selectedDrive] = useSelectedDriveSafe();\n\tconst sharingType = selectedDrive ? getDriveSharingType$1(selectedDrive) : \"LOCAL\";\n\tconst { dragProps } = useDrag({ node: fileNode });\n\tconst { isAllowedToCreateDocuments } = useUserPermissions();\n\tconst { onRenameNode, onRenameDriveNodes, onDuplicateNode } = useNodeActions();\n\tconst isReadMode = mode === \"READ\";\n\tconst syncStatus = getSyncStatusSync(fileNode.id, sharingType);\n\tconst dropdownMenuHandlers = {\n\t\tDUPLICATE: () => onDuplicateNode(fileNode),\n\t\tRENAME: () => setMode(\"WRITE\"),\n\t\tDELETE: () => showDeleteNodeModal(fileNode)\n\t};\n\tconst dropdownMenuOptions = Object.entries(nodeOptionsMap).map(([id, option]) => ({\n\t\t...option,\n\t\tid\n\t})).filter((option) => defaultNodeOptions.includes(option.id));\n\tfunction onSubmit(name) {\n\t\tPromise.all([onRenameNode(name, fileNode), onRenameDriveNodes(name, fileNode.id)]).catch((error) => {\n\t\t\tconsole.error(error);\n\t\t}).finally(() => {\n\t\t\tsetMode(\"READ\");\n\t\t});\n\t}\n\tfunction onCancel() {\n\t\tsetMode(\"READ\");\n\t}\n\tfunction onDropdownMenuOptionClick(itemId) {\n\t\tconst handler = dropdownMenuHandlers[itemId];\n\t\tif (!handler) {\n\t\t\tconsole.error(`No handler found for dropdown menu item: ${itemId}`);\n\t\t\treturn;\n\t\t}\n\t\thandler();\n\t\tsetIsDropdownMenuOpen(false);\n\t}\n\tconst iconNode = /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"relative\",\n\t\tchildren: [/* @__PURE__ */ jsx(\"img\", {\n\t\t\talt: \"file icon\",\n\t\t\tclassName: \"max-w-none\",\n\t\t\theight: 34,\n\t\t\tsrc: customDocumentIconSrc || template_default,\n\t\t\twidth: 32\n\t\t}), isReadMode && syncStatus && /* @__PURE__ */ jsx(\"div\", {\n\t\t\tclassName: \"absolute bottom-[-2px] right-0 size-3 rounded-full bg-white\",\n\t\t\tchildren: /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"absolute left-[-2px] top-[-2px]\",\n\t\t\t\tchildren: /* @__PURE__ */ jsx(SyncStatusIcon, {\n\t\t\t\t\toverrideSyncIcons: { SUCCESS: \"CheckCircleFill\" },\n\t\t\t\t\tsyncStatus\n\t\t\t\t})\n\t\t\t})\n\t\t})]\n\t});\n\tconst containerStyles = twMerge(\"group flex h-12 cursor-pointer select-none items-center rounded-lg bg-gray-200 px-2 text-gray-600 hover:text-gray-800\", className);\n\tconst content = isReadMode ? /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex w-52 items-center justify-between\",\n\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"mr-2 truncate group-hover:mr-0\",\n\t\t\tchildren: [/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"max-h-6 truncate text-sm font-medium group-hover:text-gray-800\",\n\t\t\t\tchildren: fileNode.name\n\t\t\t}), /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"max-h-6 truncate text-xs font-medium text-gray-600 group-hover:text-gray-800\",\n\t\t\t\tchildren: fileNode.documentType\n\t\t\t})]\n\t\t}), isAllowedToCreateDocuments ? /* @__PURE__ */ jsx(ConnectDropdownMenu, {\n\t\t\titems: dropdownMenuOptions,\n\t\t\tonItemClick: onDropdownMenuOptionClick,\n\t\t\tonOpenChange: setIsDropdownMenuOpen,\n\t\t\topen: isDropdownMenuOpen,\n\t\t\tchildren: /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\tclassName: twMerge(\"hidden group-hover:block\", isDropdownMenuOpen && \"block\"),\n\t\t\t\tonClick: (e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tsetIsDropdownMenuOpen(true);\n\t\t\t\t},\n\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tclassName: \"text-gray-600\",\n\t\t\t\t\tname: \"VerticalDots\"\n\t\t\t\t})\n\t\t\t})\n\t\t}) : null]\n\t}) : /* @__PURE__ */ jsx(NodeInput, {\n\t\tclassName: \"ml-3 flex-1 font-medium\",\n\t\tdefaultValue: fileNode.name,\n\t\tonCancel,\n\t\tonSubmit\n\t});\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName: \"relative w-64\",\n\t\tonClick: isReadMode ? () => setSelectedNode(fileNode) : void 0,\n\t\tchildren: /* @__PURE__ */ jsx(\"div\", {\n\t\t\t...dragProps,\n\t\t\tclassName: containerStyles,\n\t\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex items-center\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"mr-1.5\",\n\t\t\t\t\tchildren: iconNode\n\t\t\t\t}), content]\n\t\t\t})\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/folder-item/folder-item.tsx\nfunction FolderItem(props) {\n\tconst { folderNode, className } = props;\n\tconst { isAllowedToCreateDocuments } = useUserPermissions();\n\tconst [mode, setMode] = useState(\"READ\");\n\tconst [isDropdownMenuOpen, setIsDropdownMenuOpen] = useState(false);\n\tconst { dragProps } = useDrag({ node: folderNode });\n\tconst { onRenameNode, onRenameDriveNodes, onDuplicateNode } = useNodeActions();\n\tconst { isDropTarget, dropProps } = useDrop({ target: folderNode });\n\tconst isReadMode = mode === \"READ\";\n\tfunction onCancel() {\n\t\tsetMode(\"READ\");\n\t}\n\tfunction onSubmit(name) {\n\t\tPromise.all([onRenameNode(name, folderNode), onRenameDriveNodes(name, folderNode.id)]).catch((error) => {\n\t\t\tconsole.error(error);\n\t\t}).finally(() => {\n\t\t\tsetMode(\"READ\");\n\t\t});\n\t}\n\tconst dropdownMenuHandlers = {\n\t\tDUPLICATE: () => onDuplicateNode(folderNode),\n\t\tRENAME: () => setMode(\"WRITE\"),\n\t\tDELETE: () => showDeleteNodeModal(folderNode)\n\t};\n\tconst dropdownMenuOptions = Object.entries(nodeOptionsMap).map(([id, option]) => ({\n\t\t...option,\n\t\tid\n\t})).filter((option) => defaultNodeOptions.includes(option.id));\n\tfunction onDropdownMenuOptionClick(itemId) {\n\t\tconst handler = dropdownMenuHandlers[itemId];\n\t\tif (!handler) {\n\t\t\tconsole.error(`No handler found for dropdown menu item: ${itemId}`);\n\t\t\treturn;\n\t\t}\n\t\thandler();\n\t\tsetIsDropdownMenuOpen(false);\n\t}\n\tconst content = isReadMode || !isAllowedToCreateDocuments ? /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName: \"ml-3 max-h-6 truncate font-medium text-gray-600 group-hover:text-gray-800\",\n\t\tchildren: folderNode.name\n\t}) : /* @__PURE__ */ jsx(NodeInput, {\n\t\tclassName: \"ml-3 font-medium\",\n\t\tdefaultValue: folderNode.name,\n\t\tonCancel,\n\t\tonSubmit\n\t});\n\tconst containerStyles = twMerge(\"group flex h-12 cursor-pointer select-none items-center rounded-lg bg-gray-200 px-2\", className, isDropTarget && \"bg-blue-100\");\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName: \"relative w-64\",\n\t\tonClick: isReadMode ? () => setSelectedNode(folderNode) : void 0,\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t...dragProps,\n\t\t\t...dropProps,\n\t\t\tclassName: containerStyles,\n\t\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex items-center overflow-hidden\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"p-1\",\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\tclassName: \"relative\",\n\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\tname: \"FolderClose\",\n\t\t\t\t\t\t\tsize: 24\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t}), content]\n\t\t\t}), isReadMode && isAllowedToCreateDocuments ? /* @__PURE__ */ jsx(ConnectDropdownMenu, {\n\t\t\t\titems: dropdownMenuOptions,\n\t\t\t\tonItemClick: onDropdownMenuOptionClick,\n\t\t\t\tonOpenChange: setIsDropdownMenuOpen,\n\t\t\t\topen: isDropdownMenuOpen,\n\t\t\t\tchildren: /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\tclassName: twMerge(\"ml-auto hidden group-hover:block\", isDropdownMenuOpen && \"block\"),\n\t\t\t\t\tonClick: (e) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tsetIsDropdownMenuOpen(true);\n\t\t\t\t\t},\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\tclassName: \"text-gray-600\",\n\t\t\t\t\t\tname: \"VerticalDots\"\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}) : null]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/footer/footer-link.tsx\nfunction FooterLink(props) {\n\tconst { as: Component = \"a\", ...restProps } = props;\n\treturn /* @__PURE__ */ jsx(Component, { ...mergeClassNameProps(restProps, \"flex cursor-pointer items-center hover:underline\") });\n}\n//#endregion\n//#region src/connect/components/footer/footer.tsx\nconst Footer = ({ children, ...props }) => {\n\treturn /* @__PURE__ */ jsx(\"footer\", {\n\t\t...mergeClassNameProps(props, \"flex items-center gap-x-6 text-xs font-medium text-[#9DA6B9]\"),\n\t\tchildren\n\t});\n};\n//#endregion\n//#region src/connect/components/form-input/form-input.tsx\nconst FormInput = /* @__PURE__ */ forwardRef(function FormInput(props, ref) {\n\tconst { icon, errorMessage, isDirty, containerClassName, inputClassName, errorMessageClassName, hideErrors = false, ...delegatedProps } = props;\n\tconst type = props.type ?? \"text\";\n\tconst isError = !!errorMessage;\n\treturn /* @__PURE__ */ jsxs(\"div\", { children: [/* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: twMerge(\"mb-1 flex gap-2 rounded-md border border-gray-200 bg-gray-50 p-3 text-black placeholder:text-gray-50\", isError && \"border-red-900\", containerClassName),\n\t\tchildren: [icon && /* @__PURE__ */ jsx(\"span\", {\n\t\t\tclassName: twJoin((!isDirty || isError) && \"text-slate-200\"),\n\t\t\tchildren: icon\n\t\t}), /* @__PURE__ */ jsx(\"input\", {\n\t\t\t...delegatedProps,\n\t\t\tclassName: twMerge(\"w-full bg-transparent font-semibold outline-none\", inputClassName),\n\t\t\tref,\n\t\t\ttype\n\t\t})]\n\t}), /* @__PURE__ */ jsx(\"p\", {\n\t\tclassName: twMerge(\"hidden min-h-4 text-xs text-red-900\", isError && \"block\", hideErrors && \"hidden\", errorMessageClassName),\n\t\tchildren: errorMessage\n\t})] });\n});\n//#endregion\n//#region src/connect/components/form/inputs/app-form-input.tsx\nfunction appToInputOption(app) {\n\treturn {\n\t\tvalue: app.id,\n\t\tdisplayValue: app.name,\n\t\ticon: /* @__PURE__ */ jsx(Icon, { name: \"PowerhouseLogoSmall\" }),\n\t\tdescription: \"Built by Powerhouse\"\n\t};\n}\nfunction AppFormInput(props) {\n\tconst { control, appOptions, ...delegatedProps } = props;\n\tconst items = appOptions.map(appToInputOption);\n\treturn /* @__PURE__ */ jsx(Controller, {\n\t\tcontrol,\n\t\tname: \"id\",\n\t\trender: ({ field }) => /* @__PURE__ */ jsx(ConnectSelect, {\n\t\t\t...delegatedProps,\n\t\t\t...field,\n\t\t\tid: \"id\",\n\t\t\titems\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/toggle/toggle.tsx\nconst Toggle = /* @__PURE__ */ forwardRef(function Toggle(props, ref) {\n\treturn /* @__PURE__ */ jsxs(\"label\", {\n\t\tclassName: \"relative cursor-pointer items-center\",\n\t\thtmlFor: props.id,\n\t\tchildren: [/* @__PURE__ */ jsx(\"input\", {\n\t\t\tclassName: \"peer sr-only\",\n\t\t\tref,\n\t\t\ttype: \"checkbox\",\n\t\t\tvalue: \"\",\n\t\t\t...props\n\t\t}), /* @__PURE__ */ jsx(\"div\", { className: \"peer h-6 w-11 rounded-full bg-gray-500 after:absolute after:start-0.5 after:top-0.5 after:size-5 after:rounded-full after:border after:border-none after:bg-gray-50 after:transition-all peer-checked:bg-blue-900 peer-checked:after:translate-x-full peer-focus:outline-none\" })]\n\t});\n});\n//#endregion\n//#region src/connect/components/form/inputs/available-offline-toggle.tsx\nconst AvailableOfflineToggle = /* @__PURE__ */ forwardRef(function AvailableOfflineToggle(props, ref) {\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex items-center rounded-md border border-gray-200 bg-gray-50 p-3 text-gray-900\",\n\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"flex-1\",\n\t\t\tchildren: [/* @__PURE__ */ jsx(\"label\", {\n\t\t\t\tclassName: \"font-medium text-gray-900\",\n\t\t\t\thtmlFor: \"availableOffline\",\n\t\t\t\tchildren: \"Make available offline\"\n\t\t\t}), /* @__PURE__ */ jsxs(\"p\", {\n\t\t\t\tclassName: \"text-xs text-gray-600\",\n\t\t\t\tchildren: [\n\t\t\t\t\t\"Check this options if you keep a local backup\",\n\t\t\t\t\t/* @__PURE__ */ jsx(\"br\", {}),\n\t\t\t\t\t\"available at all times.\"\n\t\t\t\t]\n\t\t\t})]\n\t\t}), /* @__PURE__ */ jsx(Toggle, {\n\t\t\tid: \"availableOffline\",\n\t\t\tref,\n\t\t\t...props\n\t\t})]\n\t});\n});\n//#endregion\n//#region src/connect/components/form/inputs/label.tsx\nfunction Label(props) {\n\tconst { children, className, ...labelProps } = props;\n\treturn /* @__PURE__ */ jsx(\"label\", {\n\t\t...labelProps,\n\t\tclassName: twMerge(\"block font-semibold text-gray-500\", className),\n\t\tchildren\n\t});\n}\n//#endregion\n//#region src/connect/components/form/inputs/sharing-type-form-input.tsx\nfunction SharingTypeFormInput(props) {\n\tconst { control, ...delegatedProps } = props;\n\treturn /* @__PURE__ */ jsx(Controller, {\n\t\tcontrol,\n\t\tname: \"sharingType\",\n\t\trender: ({ field }) => /* @__PURE__ */ jsx(ConnectSelect, {\n\t\t\t...delegatedProps,\n\t\t\t...field,\n\t\t\tid: \"sharingType\",\n\t\t\titems: sharingTypeOptions\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/form/add-local-drive-form.tsx\nfunction AddLocalDriveForm(props) {\n\tconst { register, handleSubmit, control, formState: { errors } } = useForm({ defaultValues: {\n\t\tname: \"\",\n\t\tsharingType: \"LOCAL\",\n\t\tavailableOffline: false,\n\t\tid: props.appOptions[0].id\n\t} });\n\treturn /* @__PURE__ */ jsx(\"form\", {\n\t\tname: \"add-local-drive\",\n\t\tonSubmit: handleSubmit(props.onSubmit),\n\t\tclassName: \"flex flex-col gap-4\",\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"flex flex-col gap-4\",\n\t\t\tchildren: [\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", { children: [/* @__PURE__ */ jsx(Label, {\n\t\t\t\t\thtmlFor: \"name\",\n\t\t\t\t\tclassName: \"text-sm font-medium text-gray-800\",\n\t\t\t\t\tchildren: \"Drive Name\"\n\t\t\t\t}), /* @__PURE__ */ jsx(FormInput, {\n\t\t\t\t\t...register(\"name\", { required: \"Drive name is required\" }),\n\t\t\t\t\terrorMessage: errors.name?.message,\n\t\t\t\t\tplaceholder: \"Drive name\"\n\t\t\t\t})] }),\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", { children: [/* @__PURE__ */ jsx(Label, {\n\t\t\t\t\thtmlFor: \"driveApp\",\n\t\t\t\t\tclassName: \"text-sm font-medium text-gray-800\",\n\t\t\t\t\tchildren: \"Drive App\"\n\t\t\t\t}), /* @__PURE__ */ jsx(AppFormInput, {\n\t\t\t\t\tcontrol,\n\t\t\t\t\tappOptions: props.appOptions\n\t\t\t\t})] }),\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", { children: [/* @__PURE__ */ jsx(Label, {\n\t\t\t\t\thtmlFor: \"sharingType\",\n\t\t\t\t\tclassName: \"text-sm font-medium text-gray-800\",\n\t\t\t\t\tchildren: \"Location\"\n\t\t\t\t}), /* @__PURE__ */ jsx(SharingTypeFormInput, { control })] }),\n\t\t\t\t/* @__PURE__ */ jsx(\"div\", { children: /* @__PURE__ */ jsx(AvailableOfflineToggle, { ...register(\"availableOffline\") }) }),\n\t\t\t\t/* @__PURE__ */ jsx(PowerhouseButton, {\n\t\t\t\t\tclassName: \"mt-2 w-full\",\n\t\t\t\t\ttype: \"submit\",\n\t\t\t\t\tchildren: \"Create new drive\"\n\t\t\t\t})\n\t\t\t]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/form/inputs/drive-name.tsx\nfunction DriveName(props) {\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex gap-2 rounded-xl bg-gray-100 p-3 font-semibold text-gray-500\",\n\t\tchildren: [/* @__PURE__ */ jsx(Icon, {\n\t\t\tclassName: \"text-gray-600\",\n\t\t\tname: \"Drive\"\n\t\t}), props.driveName]\n\t});\n}\n//#endregion\n//#region src/connect/components/form/inputs/location-info.tsx\nfunction LocationInfo(props) {\n\tconst { location, className, ...divProps } = props;\n\tconst locationInfo = locationInfoByLocation[location];\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\t...divProps,\n\t\tclassName: twMerge(\"my-3 flex items-center gap-2 rounded-xl border border-gray-100 p-3 text-gray-800 shadow\", className),\n\t\tchildren: [locationInfo.icon, /* @__PURE__ */ jsxs(\"div\", { children: [/* @__PURE__ */ jsx(\"p\", { children: locationInfo.title }), /* @__PURE__ */ jsx(\"p\", {\n\t\t\tclassName: \"text-xs text-slate-200\",\n\t\t\tchildren: locationInfo.description\n\t\t})] })]\n\t});\n}\n//#endregion\n//#region src/connect/components/form/add-remote-drive-form.tsx\nfunction AddRemoteDriveForm(props) {\n\tconst { sharingType = \"PUBLIC\", requestPublicDrive } = props;\n\tconst [remoteDriveDetails, setPublicDriveDetails] = useState();\n\tconst [showLocationSettings, setShowLocationSettings] = useState(false);\n\tconst [isUrlValid, setIsUrlValid] = useState(true);\n\tconst [hasConfirmedUrl, setHasConfirmedUrl] = useState(false);\n\tconst [errorMessage, setErrorMessage] = useState(\"\");\n\tconst [url, setUrl] = useState(\"\");\n\tconst [debouncedUrl, setDebouncedUrl] = useDebounceValue(url, 500);\n\tconst { register, handleSubmit, setValue } = useForm({\n\t\tmode: \"onBlur\",\n\t\tdefaultValues: { availableOffline: remoteDriveDetails?.availableOffline ?? false }\n\t});\n\tuseEffect(() => {\n\t\tsetDebouncedUrl(url);\n\t}, [url]);\n\tuseEffect(() => {\n\t\tsetHasConfirmedUrl(false);\n\t\tif (debouncedUrl === \"\") return;\n\t\tfetchPublicDrive().catch(console.error);\n\t\tasync function fetchPublicDrive() {\n\t\t\ttry {\n\t\t\t\tconst { id, name } = await requestPublicDrive(debouncedUrl);\n\t\t\t\tsetPublicDriveDetails({\n\t\t\t\t\tid,\n\t\t\t\t\tname,\n\t\t\t\t\tsharingType,\n\t\t\t\t\tlocation: \"SWITCHBOARD\",\n\t\t\t\t\tavailableOffline: true\n\t\t\t\t});\n\t\t\t\tsetValue(\"availableOffline\", true);\n\t\t\t\tsetIsUrlValid(true);\n\t\t\t\tsetErrorMessage(\"\");\n\t\t\t} catch (error) {\n\t\t\t\tsetPublicDriveDetails(void 0);\n\t\t\t\tsetIsUrlValid(false);\n\t\t\t\tsetErrorMessage(error.message);\n\t\t\t}\n\t\t}\n\t}, [\n\t\tdebouncedUrl,\n\t\tsetValue,\n\t\tsharingType\n\t]);\n\tfunction onSubmit({ availableOffline }) {\n\t\tif (!remoteDriveDetails) return;\n\t\tprops.onSubmit({\n\t\t\t...remoteDriveDetails,\n\t\t\tavailableOffline,\n\t\t\turl: debouncedUrl\n\t\t});\n\t}\n\treturn /* @__PURE__ */ jsx(\"form\", {\n\t\tonSubmit: handleSubmit(onSubmit),\n\t\tchildren: hasConfirmedUrl ? /* @__PURE__ */ jsxs(Fragment$1, { children: [\n\t\t\t/* @__PURE__ */ jsx(DriveName, { driveName: remoteDriveDetails?.name ?? \"New drive\" }),\n\t\t\t/* @__PURE__ */ jsx(Divider, { className: \"my-3\" }),\n\t\t\t/* @__PURE__ */ jsxs(Disclosure, {\n\t\t\t\tisOpen: showLocationSettings,\n\t\t\t\tonOpenChange: () => setShowLocationSettings(!showLocationSettings),\n\t\t\t\ttitle: \"Location\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(LocationInfo, { location: \"SWITCHBOARD\" }), /* @__PURE__ */ jsx(AvailableOfflineToggle, { ...register(\"availableOffline\") })]\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(PowerhouseButton, {\n\t\t\t\tclassName: \"mt-4 w-full\",\n\t\t\t\tcolor: \"dark\",\n\t\t\t\ttype: \"submit\",\n\t\t\t\tchildren: \"Add new drive\"\n\t\t\t})\n\t\t] }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(FormInput, {\n\t\t\terrorMessage,\n\t\t\tonChange: (e) => setUrl(e.target.value),\n\t\t\tplaceholder: \"Drive URL\",\n\t\t\trequired: true,\n\t\t\ttype: \"url\",\n\t\t\tvalue: url\n\t\t}), /* @__PURE__ */ jsx(PowerhouseButton, {\n\t\t\tclassName: \"mt-4 w-full py-2 text-base\",\n\t\t\tcolor: \"dark\",\n\t\t\tsize: \"small\",\n\t\t\tdisabled: !isUrlValid || url === \"\",\n\t\t\tonClick: (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetHasConfirmedUrl(true);\n\t\t\t},\n\t\t\ttype: \"button\",\n\t\t\tchildren: \"Add drive\"\n\t\t})] })\n\t});\n}\n//#endregion\n//#region assets/home-bg.avif\nvar home_bg_default$1 = \"data:image/avif;base64,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\";\n//#endregion\n//#region assets/home-bg.png\nvar home_bg_default = \"data:image/png;base64,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\";\n//#endregion\n//#region src/connect/components/home-screen/home-background-image.tsx\nfunction HomeBackgroundImage() {\n\treturn /* @__PURE__ */ jsxs(\"picture\", {\n\t\tclassName: \"pointer-events-none absolute inset-8 z-0 size-[calc(100%-32px)] object-contain\",\n\t\tchildren: [/* @__PURE__ */ jsx(\"source\", {\n\t\t\tsrcSet: home_bg_default$1,\n\t\t\ttype: \"image/avif\"\n\t\t}), /* @__PURE__ */ jsx(\"img\", {\n\t\t\tsrc: home_bg_default,\n\t\t\talt: \"background\",\n\t\t\tclassName: \"object-contain\"\n\t\t})]\n\t});\n}\n//#endregion\n//#region src/connect/components/home-screen/home-screen-item.tsx\nconst HomeScreenItem = function HomeScreenItem(props) {\n\tconst { icon, title, description, containerClassName, shareable, onClick } = props;\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: twMerge(\"hover-bg-transparent relative flex h-24 w-40 cursor-pointer flex-col items-center justify-center overflow-hidden rounded-md p-2 text-center text-sm text-black\", containerClassName, onClick && \"cursor-pointer\"),\n\t\tonClick,\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"mx-auto pb-2\",\n\t\t\t\tchildren: icon || /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"size-8 items-center justify-center rounded-lg bg-black pt-1\",\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\tclassName: \"text-6 w-6 text-white\",\n\t\t\t\t\t\tchildren: title.slice(0, 1).toUpperCase()\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"w-full max-w-full\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"h3\", {\n\t\t\t\t\tclassName: \"w-full max-w-full truncate px-2\",\n\t\t\t\t\tchildren: title\n\t\t\t\t}), description && /* @__PURE__ */ jsx(\"p\", {\n\t\t\t\t\tclassName: \"text-gray-500\",\n\t\t\t\t\tchildren: description\n\t\t\t\t})]\n\t\t\t}),\n\t\t\tshareable && /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"absolute left-2 top-0 mb-2\",\n\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tname: \"PeopleFill\",\n\t\t\t\t\twidth: 12,\n\t\t\t\t\theight: 12\n\t\t\t\t})\n\t\t\t})\n\t\t]\n\t});\n};\n//#endregion\n//#region src/connect/components/home-screen/home-screen-add-drive-item.tsx\nconst HomeScreenAddDriveItem = function HomeScreenAddDriveItem(props) {\n\tconst { containerClassName } = props;\n\treturn /* @__PURE__ */ jsx(HomeScreenItem, {\n\t\ttitle: \"Create New Drive\",\n\t\ticon: /* @__PURE__ */ jsx(Icon, {\n\t\t\tname: \"PlusSquare\",\n\t\t\tsize: 32\n\t\t}),\n\t\tonClick: () => showPHModal({ type: \"addDrive\" }),\n\t\tcontainerClassName\n\t});\n};\n//#endregion\n//#region src/connect/components/home-screen/home-screen.tsx\nconst HomeScreen = function HomeScreen(props) {\n\tconst { children, containerClassName } = props;\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName: twMerge(\"container relative mx-auto flex h-full flex-col\", containerClassName),\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"m-8 flex flex-wrap justify-center gap-4 pt-12\",\n\t\t\tchildren: [/* @__PURE__ */ jsx(HomeBackgroundImage, {}), children]\n\t\t})\n\t});\n};\n//#endregion\n//#region src/connect/components/integrity-inspector/integrity-inspector.tsx\nfunction IntegrityInspector({ onValidate, onRebuildKeyframes, onRebuildSnapshots }) {\n\tconst [documentId, setDocumentId] = useState(\"\");\n\tconst [branch, setBranch] = useState(\"\");\n\tconst [status, setStatus] = useState(\"idle\");\n\tconst [validationResult, setValidationResult] = useState(null);\n\tconst [rebuildResult, setRebuildResult] = useState(null);\n\tconst [error, setError] = useState(null);\n\tconst [confirmAction, setConfirmAction] = useState(null);\n\tconst clearResults = useCallback(() => {\n\t\tsetValidationResult(null);\n\t\tsetRebuildResult(null);\n\t\tsetError(null);\n\t\tsetConfirmAction(null);\n\t}, []);\n\tconst handleValidate = useCallback(async () => {\n\t\tif (!documentId.trim()) return;\n\t\tclearResults();\n\t\tsetStatus(\"running\");\n\t\ttry {\n\t\t\tsetValidationResult(await onValidate(documentId.trim(), branch.trim() || void 0));\n\t\t\tsetStatus(\"done\");\n\t\t} catch (err) {\n\t\t\tsetError(err instanceof Error ? err.message : String(err));\n\t\t\tsetStatus(\"error\");\n\t\t}\n\t}, [\n\t\tdocumentId,\n\t\tbranch,\n\t\tonValidate,\n\t\tclearResults\n\t]);\n\tconst handleRebuildKeyframes = useCallback(async () => {\n\t\tif (!documentId.trim()) return;\n\t\tclearResults();\n\t\tsetStatus(\"running\");\n\t\ttry {\n\t\t\tsetRebuildResult(await onRebuildKeyframes(documentId.trim(), branch.trim() || void 0));\n\t\t\tsetStatus(\"done\");\n\t\t} catch (err) {\n\t\t\tsetError(err instanceof Error ? err.message : String(err));\n\t\t\tsetStatus(\"error\");\n\t\t}\n\t}, [\n\t\tdocumentId,\n\t\tbranch,\n\t\tonRebuildKeyframes,\n\t\tclearResults\n\t]);\n\tconst handleRebuildSnapshots = useCallback(async () => {\n\t\tif (!documentId.trim()) return;\n\t\tclearResults();\n\t\tsetStatus(\"running\");\n\t\ttry {\n\t\t\tsetRebuildResult(await onRebuildSnapshots(documentId.trim(), branch.trim() || void 0));\n\t\t\tsetStatus(\"done\");\n\t\t} catch (err) {\n\t\t\tsetError(err instanceof Error ? err.message : String(err));\n\t\t\tsetStatus(\"error\");\n\t\t}\n\t}, [\n\t\tdocumentId,\n\t\tbranch,\n\t\tonRebuildSnapshots,\n\t\tclearResults\n\t]);\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex h-full flex-col gap-3\",\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"flex shrink-0 items-center justify-between\",\n\t\t\t\tchildren: /* @__PURE__ */ jsx(\"h2\", {\n\t\t\t\t\tclassName: \"text-lg font-semibold text-gray-900\",\n\t\t\t\t\tchildren: \"Integrity Inspector\"\n\t\t\t\t})\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex shrink-0 items-end gap-3\",\n\t\t\t\tchildren: [\n\t\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\tclassName: \"flex flex-1 flex-col gap-1\",\n\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"label\", {\n\t\t\t\t\t\t\tclassName: \"text-xs font-medium text-gray-600\",\n\t\t\t\t\t\t\tchildren: \"Document ID\"\n\t\t\t\t\t\t}), /* @__PURE__ */ jsx(\"input\", {\n\t\t\t\t\t\t\tclassName: \"rounded border border-gray-300 px-3 py-1.5 text-sm outline-none focus:border-blue-400\",\n\t\t\t\t\t\t\tonChange: (e) => setDocumentId(e.target.value),\n\t\t\t\t\t\t\tplaceholder: \"Enter document ID\",\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\tvalue: documentId\n\t\t\t\t\t\t})]\n\t\t\t\t\t}),\n\t\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\tclassName: \"flex w-40 flex-col gap-1\",\n\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"label\", {\n\t\t\t\t\t\t\tclassName: \"text-xs font-medium text-gray-600\",\n\t\t\t\t\t\t\tchildren: \"Branch (optional)\"\n\t\t\t\t\t\t}), /* @__PURE__ */ jsx(\"input\", {\n\t\t\t\t\t\t\tclassName: \"rounded border border-gray-300 px-3 py-1.5 text-sm outline-none focus:border-blue-400\",\n\t\t\t\t\t\t\tonChange: (e) => setBranch(e.target.value),\n\t\t\t\t\t\t\tplaceholder: \"main\",\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\tvalue: branch\n\t\t\t\t\t\t})]\n\t\t\t\t\t}),\n\t\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\tclassName: \"flex gap-2\",\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t/* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-blue-300 bg-blue-50 px-3 py-1.5 text-sm text-blue-700 hover:bg-blue-100 disabled:opacity-50\",\n\t\t\t\t\t\t\t\tdisabled: !documentId.trim() || status === \"running\" || confirmAction !== null,\n\t\t\t\t\t\t\t\tonClick: () => void handleValidate(),\n\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\t\t\tname: \"Checkmark\",\n\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t}), \"Validate\"]\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-yellow-300 bg-yellow-50 px-3 py-1.5 text-sm text-yellow-700 hover:bg-yellow-100 disabled:opacity-50\",\n\t\t\t\t\t\t\t\tdisabled: !documentId.trim() || status === \"running\" || confirmAction !== null,\n\t\t\t\t\t\t\t\tonClick: () => setConfirmAction(\"keyframes\"),\n\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\t\t\tname: \"Reload\",\n\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t}), \"Rebuild Keyframes\"]\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-yellow-300 bg-yellow-50 px-3 py-1.5 text-sm text-yellow-700 hover:bg-yellow-100 disabled:opacity-50\",\n\t\t\t\t\t\t\t\tdisabled: !documentId.trim() || status === \"running\" || confirmAction !== null,\n\t\t\t\t\t\t\t\tonClick: () => setConfirmAction(\"snapshots\"),\n\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\t\t\tname: \"Reload\",\n\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t}), \"Rebuild Snapshots\"]\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t]\n\t\t\t\t\t})\n\t\t\t\t]\n\t\t\t}),\n\t\t\tconfirmAction && /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex shrink-0 items-center gap-3 rounded border border-yellow-400 bg-yellow-50 px-3 py-2\",\n\t\t\t\tchildren: [\n\t\t\t\t\t/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\tclassName: \"text-sm text-yellow-800\",\n\t\t\t\t\t\tchildren: confirmAction === \"keyframes\" ? \"This will delete all keyframes for this document. Continue?\" : \"This will invalidate all cached snapshots for this document. Continue?\"\n\t\t\t\t\t}),\n\t\t\t\t\t/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\tclassName: \"rounded bg-yellow-600 px-3 py-1 text-sm text-white hover:bg-yellow-700\",\n\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\tif (confirmAction === \"keyframes\") handleRebuildKeyframes();\n\t\t\t\t\t\t\telse handleRebuildSnapshots();\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\tchildren: \"Confirm\"\n\t\t\t\t\t}),\n\t\t\t\t\t/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\tclassName: \"rounded border border-gray-300 bg-white px-3 py-1 text-sm text-gray-600 hover:bg-gray-50\",\n\t\t\t\t\t\tonClick: () => setConfirmAction(null),\n\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\tchildren: \"Cancel\"\n\t\t\t\t\t})\n\t\t\t\t]\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"min-h-0 flex-1 overflow-auto rounded-lg border border-gray-300 p-4\",\n\t\t\t\tchildren: [\n\t\t\t\t\tstatus === \"idle\" && /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\tclassName: \"flex h-full items-center justify-center text-sm text-gray-400\",\n\t\t\t\t\t\tchildren: \"Enter a document ID and run an action\"\n\t\t\t\t\t}),\n\t\t\t\t\tstatus === \"running\" && /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\tclassName: \"flex h-full items-center justify-center text-sm text-gray-500\",\n\t\t\t\t\t\tchildren: \"Running...\"\n\t\t\t\t\t}),\n\t\t\t\t\tstatus === \"error\" && error && /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\tclassName: \"rounded bg-red-50 p-3 text-sm text-red-700\",\n\t\t\t\t\t\tchildren: error\n\t\t\t\t\t}),\n\t\t\t\t\tstatus === \"done\" && validationResult && /* @__PURE__ */ jsx(ValidationResultView, { result: validationResult }),\n\t\t\t\t\tstatus === \"done\" && rebuildResult && /* @__PURE__ */ jsx(RebuildResultView, { result: rebuildResult })\n\t\t\t\t]\n\t\t\t})\n\t\t]\n\t});\n}\nfunction ValidationResultView({ result }) {\n\tconst totalIssues = result.keyframeIssues.length + result.snapshotIssues.length;\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex flex-col gap-3\",\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex items-center gap-2\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"span\", { className: twMerge(\"size-3 rounded-full\", result.isConsistent ? \"bg-green-500\" : \"bg-red-500\") }), /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\tclassName: \"text-sm font-medium\",\n\t\t\t\t\tchildren: result.isConsistent ? \"Document is consistent\" : `Found ${totalIssues} issue(s)`\n\t\t\t\t})]\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"text-xs text-gray-500\",\n\t\t\t\tchildren: [\"Document: \", result.documentId]\n\t\t\t}),\n\t\t\tresult.keyframeIssues.length > 0 && /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex flex-col gap-1\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"h3\", {\n\t\t\t\t\tclassName: \"text-sm font-medium text-gray-700\",\n\t\t\t\t\tchildren: \"Keyframe Issues\"\n\t\t\t\t}), /* @__PURE__ */ jsxs(\"table\", {\n\t\t\t\t\tclassName: \"w-full border-collapse text-xs\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"thead\", { children: /* @__PURE__ */ jsxs(\"tr\", {\n\t\t\t\t\t\tclassName: \"bg-gray-100\",\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"th\", {\n\t\t\t\t\t\t\t\tclassName: \"px-2 py-1 text-left font-medium text-gray-600\",\n\t\t\t\t\t\t\t\tchildren: \"Scope\"\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"th\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-2 py-1 text-left font-medium text-gray-600\",\n\t\t\t\t\t\t\t\tchildren: \"Branch\"\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"th\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-2 py-1 text-left font-medium text-gray-600\",\n\t\t\t\t\t\t\t\tchildren: \"Revision\"\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"th\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-2 py-1 text-left font-medium text-gray-600\",\n\t\t\t\t\t\t\t\tchildren: \"Keyframe Hash\"\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"th\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-2 py-1 text-left font-medium text-gray-600\",\n\t\t\t\t\t\t\t\tchildren: \"Replayed Hash\"\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t]\n\t\t\t\t\t}) }), /* @__PURE__ */ jsx(\"tbody\", { children: result.keyframeIssues.map((issue, i) => /* @__PURE__ */ jsxs(\"tr\", {\n\t\t\t\t\t\tclassName: \"odd:bg-white even:bg-gray-50\",\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"px-2 py-1\",\n\t\t\t\t\t\t\t\tchildren: issue.scope\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-2 py-1\",\n\t\t\t\t\t\t\t\tchildren: issue.branch\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-2 py-1\",\n\t\t\t\t\t\t\t\tchildren: issue.revision\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-2 py-1 font-mono\",\n\t\t\t\t\t\t\t\tchildren: issue.keyframeHash\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-2 py-1 font-mono\",\n\t\t\t\t\t\t\t\tchildren: issue.replayedHash\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t]\n\t\t\t\t\t}, `kf-${i}`)) })]\n\t\t\t\t})]\n\t\t\t}),\n\t\t\tresult.snapshotIssues.length > 0 && /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex flex-col gap-1\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"h3\", {\n\t\t\t\t\tclassName: \"text-sm font-medium text-gray-700\",\n\t\t\t\t\tchildren: \"Snapshot Issues\"\n\t\t\t\t}), /* @__PURE__ */ jsxs(\"table\", {\n\t\t\t\t\tclassName: \"w-full border-collapse text-xs\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"thead\", { children: /* @__PURE__ */ jsxs(\"tr\", {\n\t\t\t\t\t\tclassName: \"bg-gray-100\",\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"th\", {\n\t\t\t\t\t\t\t\tclassName: \"px-2 py-1 text-left font-medium text-gray-600\",\n\t\t\t\t\t\t\t\tchildren: \"Scope\"\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"th\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-2 py-1 text-left font-medium text-gray-600\",\n\t\t\t\t\t\t\t\tchildren: \"Branch\"\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"th\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-2 py-1 text-left font-medium text-gray-600\",\n\t\t\t\t\t\t\t\tchildren: \"Snapshot Hash\"\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"th\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-2 py-1 text-left font-medium text-gray-600\",\n\t\t\t\t\t\t\t\tchildren: \"Replayed Hash\"\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t]\n\t\t\t\t\t}) }), /* @__PURE__ */ jsx(\"tbody\", { children: result.snapshotIssues.map((issue, i) => /* @__PURE__ */ jsxs(\"tr\", {\n\t\t\t\t\t\tclassName: \"odd:bg-white even:bg-gray-50\",\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"px-2 py-1\",\n\t\t\t\t\t\t\t\tchildren: issue.scope\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-2 py-1\",\n\t\t\t\t\t\t\t\tchildren: issue.branch\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-2 py-1 font-mono\",\n\t\t\t\t\t\t\t\tchildren: issue.snapshotHash\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-2 py-1 font-mono\",\n\t\t\t\t\t\t\t\tchildren: issue.replayedHash\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t]\n\t\t\t\t\t}, `snap-${i}`)) })]\n\t\t\t\t})]\n\t\t\t})\n\t\t]\n\t});\n}\nfunction RebuildResultView({ result }) {\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex flex-col gap-2\",\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex items-center gap-2\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"span\", { className: \"size-3 rounded-full bg-green-500\" }), /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\tclassName: \"text-sm font-medium\",\n\t\t\t\t\tchildren: \"Rebuild complete\"\n\t\t\t\t})]\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"text-xs text-gray-500\",\n\t\t\t\tchildren: [\"Document: \", result.documentId]\n\t\t\t}),\n\t\t\tresult.keyframesDeleted > 0 && /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"text-sm text-gray-700\",\n\t\t\t\tchildren: [\"Keyframes deleted: \", result.keyframesDeleted]\n\t\t\t}),\n\t\t\tresult.scopesInvalidated > 0 && /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"text-sm text-gray-700\",\n\t\t\t\tchildren: [\"Scopes invalidated: \", result.scopesInvalidated]\n\t\t\t})\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/loading-screen/loading-screen.tsx\nconst LoadingScreen = (props) => {\n\tconst { showLoadingScreen, loadingComponent, size, className } = props;\n\tif (loadingComponent && showLoadingScreen) return loadingComponent;\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName: twMerge(\"absolute inset-0 z-10 flex items-center justify-center bg-white\", !showLoadingScreen && \"hidden\", className),\n\t\tchildren: /* @__PURE__ */ jsx(AnimatedLoader, { size })\n\t});\n};\n//#endregion\n//#region src/connect/components/modal/add-drive-modal/add-drive-modal.tsx\nfunction AddDriveModal(props) {\n\tfunction handleCancel() {\n\t\tonOpenChange(false);\n\t}\n\tconst { open, onOpenChange, onAddRemoteDrive, onAddLocalDrive, requestPublicDrive, modalProps, containerProps } = props;\n\treturn /* @__PURE__ */ jsx(Modal, {\n\t\t...modalProps,\n\t\toverlayProps: { className: \"items-start pt-[15vh]\" },\n\t\tcontentProps: { className: \"rounded-2xl\" },\n\t\tonOpenChange,\n\t\topen,\n\t\tchildren: /* @__PURE__ */ jsx(\"div\", {\n\t\t\t...containerProps,\n\t\t\tclassName: twMerge(\"w-[408px] rounded-2xl p-6\", containerProps?.className),\n\t\t\tchildren: /* @__PURE__ */ jsxs(Tabs, {\n\t\t\t\tdefaultValue: \"Create Drive\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(TabContent, {\n\t\t\t\t\tlabel: \"Create Drive\",\n\t\t\t\t\tdescription: \"Create a new drive\",\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(AddLocalDriveForm, {\n\t\t\t\t\t\tonCancel: handleCancel,\n\t\t\t\t\t\tonSubmit: onAddLocalDrive,\n\t\t\t\t\t\tappOptions: props.appOptions\n\t\t\t\t\t})\n\t\t\t\t}), /* @__PURE__ */ jsx(TabContent, {\n\t\t\t\t\tlabel: \"Add Drive\",\n\t\t\t\t\tdescription: \"Add a drive\",\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(AddRemoteDriveForm, {\n\t\t\t\t\t\tsharingType: \"PUBLIC\",\n\t\t\t\t\t\tonSubmit: onAddRemoteDrive,\n\t\t\t\t\t\tonCancel: handleCancel,\n\t\t\t\t\t\trequestPublicDrive\n\t\t\t\t\t})\n\t\t\t\t})]\n\t\t\t})\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/modal/add-local-drive-modal.tsx\nfunction AddLocalDriveModal(props) {\n\tconst { open, onOpenChange, onSubmit, modalProps, containerProps, appOptions } = props;\n\tfunction handleCancel() {\n\t\tonOpenChange(false);\n\t}\n\treturn /* @__PURE__ */ jsx(Modal, {\n\t\t...modalProps,\n\t\tcontentProps: { className: \"rounded-2xl\" },\n\t\tonOpenChange,\n\t\topen,\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t...containerProps,\n\t\t\tclassName: twMerge(\"max-w-[408px] rounded-2xl p-6\", containerProps?.className),\n\t\t\tchildren: [\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"flex justify-between\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"h1\", {\n\t\t\t\t\t\tclassName: \"text-xl font-bold\",\n\t\t\t\t\t\tchildren: \"Create new drive \"\n\t\t\t\t\t}), /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\tclassName: \"flex size-8 items-center justify-center rounded-md bg-gray-100 text-gray-500 outline-none hover:text-gray-900\",\n\t\t\t\t\t\tonClick: handleCancel,\n\t\t\t\t\t\ttabIndex: -1,\n\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\tname: \"XmarkLight\",\n\t\t\t\t\t\t\tsize: 24\n\t\t\t\t\t\t})\n\t\t\t\t\t})]\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsx(Divider, { className: \"my-4\" }),\n\t\t\t\t/* @__PURE__ */ jsx(AddLocalDriveForm, {\n\t\t\t\t\tonCancel: handleCancel,\n\t\t\t\t\tonSubmit,\n\t\t\t\t\tappOptions\n\t\t\t\t})\n\t\t\t]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/modal/add-remote-drive-modal.tsx\nfunction AddRemoteDriveModal(props) {\n\tconst { open, onOpenChange, onSubmit, sharingType, modalProps, containerProps, requestPublicDrive } = props;\n\tfunction handleCancel() {\n\t\tonOpenChange(false);\n\t}\n\treturn /* @__PURE__ */ jsx(Modal, {\n\t\t...modalProps,\n\t\tcontentProps: { className: \"rounded-2xl\" },\n\t\tonOpenChange,\n\t\topen,\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t...containerProps,\n\t\t\tclassName: twMerge(\"min-w-[408px] max-w-[408px] rounded-2xl p-6\", containerProps?.className),\n\t\t\tchildren: [\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"flex justify-between\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"h1\", {\n\t\t\t\t\t\tclassName: \"text-xl font-bold\",\n\t\t\t\t\t\tchildren: \"Add drive\"\n\t\t\t\t\t}), /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\tclassName: \"flex size-8 items-center justify-center rounded-md bg-gray-100 text-gray-500 outline-none hover:text-gray-900\",\n\t\t\t\t\t\tonClick: handleCancel,\n\t\t\t\t\t\ttabIndex: -1,\n\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\tname: \"XmarkLight\",\n\t\t\t\t\t\t\tsize: 24\n\t\t\t\t\t\t})\n\t\t\t\t\t})]\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsx(Divider, { className: \"my-4\" }),\n\t\t\t\t/* @__PURE__ */ jsx(AddRemoteDriveForm, {\n\t\t\t\t\tonCancel: handleCancel,\n\t\t\t\t\tonSubmit,\n\t\t\t\t\trequestPublicDrive,\n\t\t\t\t\tsharingType\n\t\t\t\t})\n\t\t\t]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/modal/create-document-modal.tsx\nconst buttonStyles$3 = \"min-h-[48px] min-w-[142px] text-base font-semibold py-3 px-6 rounded-xl outline-none active:opacity-75 hover:scale-105 transform transition-all\";\nconst CLOSE_ANIMATION_DURATION = 300;\nfunction CreateDocumentModal(props) {\n\tconst { onOpenChange, onContinue, overlayProps, contentProps, ...restProps } = props;\n\tconst [nodeName, setNodeName] = useState(\"\");\n\tconst [isValid, setIsValid] = useState(false);\n\tconst handleCancel = () => {\n\t\tonOpenChange?.(false);\n\t\tsetTimeout(() => setNodeName(\"\"), CLOSE_ANIMATION_DURATION);\n\t};\n\tconst handleCreate = useCallback(() => {\n\t\tif (!isValid) return;\n\t\tonContinue(nodeName);\n\t\tsetTimeout(() => setNodeName(\"\"), CLOSE_ANIMATION_DURATION);\n\t}, [\n\t\tisValid,\n\t\tnodeName,\n\t\tonContinue\n\t]);\n\tconst handleSubmit = useCallback((e) => {\n\t\te.preventDefault();\n\t\thandleCreate();\n\t}, [handleCreate]);\n\treturn /* @__PURE__ */ jsx(Modal, {\n\t\tcontentProps: {\n\t\t\t...contentProps,\n\t\t\tclassName: twMerge(\"rounded-3xl\", contentProps?.className)\n\t\t},\n\t\tonOpenChange,\n\t\toverlayProps: {\n\t\t\t...overlayProps,\n\t\t\tclassName: overlayProps?.className\n\t\t},\n\t\t...restProps,\n\t\tchildren: /* @__PURE__ */ jsxs(\"form\", {\n\t\t\tname: \"create-document\",\n\t\t\tclassName: \"w-[400px] p-6 text-slate-300\",\n\t\t\tonSubmit: handleSubmit,\n\t\t\tchildren: [\n\t\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"border-b border-slate-50 pb-2 text-2xl font-bold text-gray-800\",\n\t\t\t\t\tchildren: \"Create a new document\"\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"my-6\",\n\t\t\t\t\tchildren: [!isValid && nodeName && /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\tclassName: \"mb-2 text-red-500\",\n\t\t\t\t\t\tchildren: \"Document name must be valid URL characters.\"\n\t\t\t\t\t}), /* @__PURE__ */ jsx(FormInput, {\n\t\t\t\t\t\ticon: /* @__PURE__ */ jsx(Icon, { name: \"BrickGlobe\" }),\n\t\t\t\t\t\tonChange: (e) => {\n\t\t\t\t\t\t\tconst name = e.target.value;\n\t\t\t\t\t\t\tsetNodeName(name);\n\t\t\t\t\t\t\tsetIsValid(isValidName(name));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tplaceholder: \"Document name\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\tvalue: nodeName\n\t\t\t\t\t})]\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"mt-8 flex justify-between gap-3\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\tclassName: twMerge(buttonStyles$3, \"flex-1 bg-slate-50 text-slate-800\"),\n\t\t\t\t\t\tonClick: handleCancel,\n\t\t\t\t\t\tchildren: \"Cancel\"\n\t\t\t\t\t}), /* @__PURE__ */ jsx(PowerhouseButton, {\n\t\t\t\t\t\ttype: \"submit\",\n\t\t\t\t\t\tclassName: twMerge(buttonStyles$3, \"flex-1 bg-gray-800 text-gray-50\"),\n\t\t\t\t\t\tdisabled: !isValid,\n\t\t\t\t\t\tchildren: \"Create\"\n\t\t\t\t\t})]\n\t\t\t\t})\n\t\t\t]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/modal/delete-drive-modal.tsx\nconst ConnectDeleteDriveModal = (props) => {\n\tconst { inputPlaceholder, body, driveName, ...confirmationModalProps } = props;\n\tconst [inputName, setInputName] = useState(\"\");\n\treturn /* @__PURE__ */ jsx(ConnectConfirmationModal, {\n\t\tbodyProps: { className: \"p-0 bg-white my-0\" },\n\t\tcontainerProps: { className: \"w-[450px]\" },\n\t\tcontinueButtonProps: {\n\t\t\tdisabled: inputName !== driveName,\n\t\t\tclassName: inputName !== driveName ? \"bg-red-600 hover:scale-100 cursor-not-allowed active:opacity-100\" : \"bg-red-900\"\n\t\t},\n\t\t...confirmationModalProps,\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", { children: [/* @__PURE__ */ jsx(\"div\", {\n\t\t\tclassName: \"my-6 rounded-md bg-slate-50 p-4 text-center\",\n\t\t\tchildren: body\n\t\t}), /* @__PURE__ */ jsx(\"div\", { children: /* @__PURE__ */ jsx(FormInput, {\n\t\t\thideErrors: true,\n\t\t\ticon: /* @__PURE__ */ jsx(Icon, { name: \"Lock\" }),\n\t\t\tonChange: (e) => setInputName(e.target.value),\n\t\t\tplaceholder: inputPlaceholder,\n\t\t\tvalue: inputName\n\t\t}) })] })\n\t});\n};\n//#endregion\n//#region src/connect/components/modal/delete-item-modal.tsx\nfunction ConnectDeleteItemModal(props) {\n\tconst { onDelete, deleteLabel, ...restProps } = props;\n\treturn /* @__PURE__ */ jsx(ConnectConfirmationModal, {\n\t\t...restProps,\n\t\tcontainerProps: { className: \"w-[450px]\" },\n\t\tcontinueButtonProps: { className: \"bg-red-900\" },\n\t\tcontinueLabel: deleteLabel,\n\t\tonContinue: onDelete\n\t});\n}\n//#endregion\n//#region src/connect/components/form/inputs/drive-name-input.tsx\nconst DriveNameInput = /* @__PURE__ */ forwardRef(function DriveNameInput(props, ref) {\n\treturn /* @__PURE__ */ jsx(FormInput, {\n\t\t...props,\n\t\ticon: props.icon ?? /* @__PURE__ */ jsx(Icon, { name: \"Drive\" }),\n\t\tid: \"driveName\",\n\t\tplaceholder: \"Drive name\",\n\t\tref\n\t});\n});\n//#endregion\n//#region src/connect/components/form/inputs/delete-drive.tsx\nfunction DeleteDrive(props) {\n\tconst { drive, handleDeleteDrive, onCancel } = props;\n\tconst [driveNameInput, setDriveNameInput] = useState(\"\");\n\tconst isAllowedToDelete = driveNameInput === drive.header.name;\n\tfunction deleteDrive() {\n\t\tif (isAllowedToDelete) handleDeleteDrive();\n\t}\n\treturn /* @__PURE__ */ jsxs(\"div\", { children: [\n\t\t/* @__PURE__ */ jsx(\"p\", {\n\t\t\tclassName: \"mb-2 rounded-md bg-slate-50 p-4 text-center text-slate-200\",\n\t\t\tchildren: \"Are you sure you want to delete this drive? All files and subfolders within it will be removed. Do you want to proceed?\"\n\t\t}),\n\t\t/* @__PURE__ */ jsx(DriveNameInput, {\n\t\t\ticon: /* @__PURE__ */ jsx(Icon, { name: \"Lock\" }),\n\t\t\tonChange: (event) => setDriveNameInput(event.target.value),\n\t\t\tplaceholder: \"Enter drive name...\",\n\t\t\tvalue: driveNameInput\n\t\t}),\n\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"flex gap-3\",\n\t\t\tchildren: [/* @__PURE__ */ jsx(PowerhouseButton, {\n\t\t\t\tclassName: \"w-full\",\n\t\t\t\tcolor: \"light\",\n\t\t\t\tonClick: onCancel,\n\t\t\t\tchildren: \"Cancel\"\n\t\t\t}), /* @__PURE__ */ jsx(PowerhouseButton, {\n\t\t\t\tclassName: \"w-full\",\n\t\t\t\tcolor: \"red\",\n\t\t\t\tdisabled: !isAllowedToDelete,\n\t\t\t\tonClick: deleteDrive,\n\t\t\t\tchildren: \"Delete\"\n\t\t\t})]\n\t\t})\n\t] });\n}\n//#endregion\n//#region src/connect/components/form/drive-settings-form.tsx\nfunction DriveSettingsForm(props) {\n\tconst { drive, sharingType, availableOffline, onSubmit, handleDeleteDrive } = props;\n\tconst name = drive.header.name;\n\tconst [showLocationSettings, setShowLocationSettings] = useState(false);\n\tconst [showDangerZone, setShowDangerZone] = useState(false);\n\tconst [showDeleteDrive, setShowDeleteDrive] = useState(false);\n\tconst { register, handleSubmit, control } = useForm({\n\t\tmode: \"onBlur\",\n\t\tdefaultValues: {\n\t\t\tname,\n\t\t\tsharingType,\n\t\t\tavailableOffline\n\t\t}\n\t});\n\tconst location = sharingType === \"PUBLIC\" ? \"SWITCHBOARD\" : sharingType;\n\treturn /* @__PURE__ */ jsxs(\"form\", {\n\t\tonSubmit: handleSubmit(onSubmit),\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(DriveNameInput, { ...register(\"name\") }),\n\t\t\t/* @__PURE__ */ jsx(Divider, { className: \"my-4\" }),\n\t\t\t/* @__PURE__ */ jsx(Label, {\n\t\t\t\thtmlFor: \"sharingType\",\n\t\t\t\tchildren: \"Sharing settings\"\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(SharingTypeFormInput, { control }),\n\t\t\t/* @__PURE__ */ jsx(Divider, { className: \"my-3\" }),\n\t\t\t/* @__PURE__ */ jsxs(Disclosure, {\n\t\t\t\tisOpen: showLocationSettings,\n\t\t\t\tonOpenChange: () => setShowLocationSettings(!showLocationSettings),\n\t\t\t\ttitle: \"Location\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(LocationInfo, { location }), /* @__PURE__ */ jsx(AvailableOfflineToggle, { ...register(\"availableOffline\") })]\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(Divider, { className: \"my-3\" }),\n\t\t\t/* @__PURE__ */ jsx(Disclosure, {\n\t\t\t\tisOpen: showDangerZone,\n\t\t\t\tonOpenChange: () => setShowDangerZone(!showDangerZone),\n\t\t\t\ttitle: \"Danger zone\",\n\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\tclassName: \"flex gap-2 py-3 font-semibold text-red-900 transition hover:brightness-125\",\n\t\t\t\t\tonClick: () => setShowDeleteDrive(true),\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(Icon, { name: \"Trash\" }), \"Delete drive\"]\n\t\t\t\t})\n\t\t\t}),\n\t\t\tshowDeleteDrive && showDangerZone ? /* @__PURE__ */ jsx(DeleteDrive, {\n\t\t\t\tdrive,\n\t\t\t\thandleDeleteDrive,\n\t\t\t\tonCancel: () => setShowDeleteDrive(false)\n\t\t\t}) : /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Divider, { className: \"my-3\" }), /* @__PURE__ */ jsx(PowerhouseButton, {\n\t\t\t\tclassName: \"mb-4 w-full\",\n\t\t\t\ttype: \"submit\",\n\t\t\t\tchildren: \"Confirm\"\n\t\t\t})] })\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/modal/drive-settings-modal.tsx\nfunction DriveSettingsModal(props) {\n\tconst { drive, open, sharingType, availableOffline, onOpenChange, onDeleteDrive, onRenameDrive, onChangeSharingType, onChangeAvailableOffline, modalProps, containerProps } = props;\n\tconst onSubmit = (data) => {\n\t\tif (data.name !== drive.header.name) onRenameDrive(drive, data.name);\n\t\tif (data.sharingType !== sharingType) onChangeSharingType(drive, data.sharingType);\n\t\tif (data.availableOffline !== availableOffline) onChangeAvailableOffline(drive, data.availableOffline);\n\t\tonOpenChange(false);\n\t};\n\tfunction handleDeleteDrive() {\n\t\tonDeleteDrive(drive);\n\t\tonOpenChange(false);\n\t}\n\tfunction handleCancel() {\n\t\tonOpenChange(false);\n\t}\n\treturn /* @__PURE__ */ jsx(Modal, {\n\t\t...modalProps,\n\t\tcontentProps: { className: \"rounded-2xl\" },\n\t\tonOpenChange,\n\t\topen,\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t...containerProps,\n\t\t\tclassName: twMerge(\"max-w-[408px] rounded-2xl p-6\", containerProps?.className),\n\t\t\tchildren: [\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"flex justify-between\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"h1\", {\n\t\t\t\t\t\tclassName: \"text-xl font-bold\",\n\t\t\t\t\t\tchildren: \"Drive settings\"\n\t\t\t\t\t}), /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\tclassName: \"flex size-8 items-center justify-center rounded-md bg-gray-100 text-gray-500 outline-none hover:text-gray-900\",\n\t\t\t\t\t\tonClick: handleCancel,\n\t\t\t\t\t\ttabIndex: -1,\n\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\tname: \"XmarkLight\",\n\t\t\t\t\t\t\tsize: 24\n\t\t\t\t\t\t})\n\t\t\t\t\t})]\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsx(Divider, { className: \"my-4\" }),\n\t\t\t\t/* @__PURE__ */ jsx(DriveSettingsForm, {\n\t\t\t\t\thandleCancel,\n\t\t\t\t\thandleDeleteDrive,\n\t\t\t\t\tonSubmit,\n\t\t\t\t\tdrive,\n\t\t\t\t\tsharingType,\n\t\t\t\t\tavailableOffline\n\t\t\t\t})\n\t\t\t]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/object-inspector-modal/object-inspector-modal.tsx\n/**\n* Converts an object to a JSON-serializable form by handling\n* non-serializable values like functions, symbols, and errors.\n*/\nfunction toSerializableObject$1(obj) {\n\treturn JSON.parse(JSON.stringify(obj, (_key, value) => {\n\t\tif (typeof value === \"function\") return \"[Function]\";\n\t\tif (typeof value === \"symbol\") return \"[Symbol]\";\n\t\tif (value instanceof Error) return {\n\t\t\tname: value.name,\n\t\t\tmessage: value.message\n\t\t};\n\t\treturn value;\n\t}));\n}\nfunction ObjectInspectorModal({ open, onOpenChange, title, object }) {\n\tconst serializableObject = object ? toSerializableObject$1(object) : null;\n\treturn /* @__PURE__ */ jsx(Modal, {\n\t\tcontentProps: {\n\t\t\tclassName: \"rounded-2xl\",\n\t\t\tstyle: {\n\t\t\t\theight: \"80vh\",\n\t\t\t\twidth: \"80vw\",\n\t\t\t\tmaxWidth: \"900px\"\n\t\t\t}\n\t\t},\n\t\tonOpenChange,\n\t\topen,\n\t\ttitle,\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"flex h-full w-full flex-col\",\n\t\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex shrink-0 items-center justify-between border-b border-gray-200 px-4 py-3\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"h2\", {\n\t\t\t\t\tclassName: \"text-lg font-semibold text-gray-900\",\n\t\t\t\t\tchildren: title\n\t\t\t\t}), /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\tclassName: \"flex size-6 cursor-pointer items-center justify-center rounded-md text-gray-500 outline-none hover:text-gray-900\",\n\t\t\t\t\tonClick: () => onOpenChange(false),\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\tname: \"XmarkLight\",\n\t\t\t\t\t\tsize: 24\n\t\t\t\t\t})\n\t\t\t\t})]\n\t\t\t}), /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"flex-1 overflow-auto p-4\",\n\t\t\t\tchildren: serializableObject ? /* @__PURE__ */ jsx(JsonViewer, { data: serializableObject }) : /* @__PURE__ */ jsx(\"p\", {\n\t\t\t\t\tclassName: \"text-gray-500\",\n\t\t\t\t\tchildren: \"No data to display\"\n\t\t\t\t})\n\t\t\t})]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/processors-inspector/processors-inspector.tsx\nconst COLUMNS$2 = [\n\t{\n\t\tkey: \"view\",\n\t\tlabel: \"\",\n\t\twidth: \"60px\"\n\t},\n\t{\n\t\tkey: \"status\",\n\t\tlabel: \"Status\",\n\t\twidth: \"90px\"\n\t},\n\t{\n\t\tkey: \"processorId\",\n\t\tlabel: \"Processor ID\",\n\t\twidth: \"150px\"\n\t},\n\t{\n\t\tkey: \"factoryId\",\n\t\tlabel: \"Factory ID\",\n\t\twidth: \"150px\"\n\t},\n\t{\n\t\tkey: \"driveId\",\n\t\tlabel: \"Drive ID\",\n\t\twidth: \"150px\"\n\t},\n\t{\n\t\tkey: \"processorIndex\",\n\t\tlabel: \"Index\",\n\t\twidth: \"70px\"\n\t},\n\t{\n\t\tkey: \"lastOrdinal\",\n\t\tlabel: \"Last Ordinal\",\n\t\twidth: \"100px\"\n\t},\n\t{\n\t\tkey: \"lastError\",\n\t\tlabel: \"Error\",\n\t\twidth: \"180px\"\n\t},\n\t{\n\t\tkey: \"lastErrorTimestamp\",\n\t\tlabel: \"Error At\",\n\t\twidth: \"160px\"\n\t},\n\t{\n\t\tkey: \"actions\",\n\t\tlabel: \"Actions\",\n\t\twidth: \"80px\"\n\t}\n];\nfunction truncateId$2(id, maxLength = 12) {\n\tif (id.length <= maxLength) return id;\n\treturn id.slice(0, maxLength) + \"...\";\n}\nfunction sortProcessors(processors, sort) {\n\tif (!sort) return processors;\n\treturn [...processors].sort((a, b) => {\n\t\tlet comparison = 0;\n\t\tswitch (sort.column) {\n\t\t\tcase \"status\":\n\t\t\t\tcomparison = a.status.localeCompare(b.status);\n\t\t\t\tbreak;\n\t\t\tcase \"processorId\":\n\t\t\t\tcomparison = a.processorId.localeCompare(b.processorId);\n\t\t\t\tbreak;\n\t\t\tcase \"factoryId\":\n\t\t\t\tcomparison = a.factoryId.localeCompare(b.factoryId);\n\t\t\t\tbreak;\n\t\t\tcase \"driveId\":\n\t\t\t\tcomparison = a.driveId.localeCompare(b.driveId);\n\t\t\t\tbreak;\n\t\t\tcase \"processorIndex\":\n\t\t\t\tcomparison = a.processorIndex - b.processorIndex;\n\t\t\t\tbreak;\n\t\t\tcase \"lastOrdinal\":\n\t\t\t\tcomparison = a.lastOrdinal - b.lastOrdinal;\n\t\t\t\tbreak;\n\t\t\tcase \"lastError\":\n\t\t\t\tcomparison = (a.lastError ?? \"\").localeCompare(b.lastError ?? \"\");\n\t\t\t\tbreak;\n\t\t\tcase \"lastErrorTimestamp\":\n\t\t\t\tcomparison = (a.lastErrorTimestamp?.getTime() ?? 0) - (b.lastErrorTimestamp?.getTime() ?? 0);\n\t\t\t\tbreak;\n\t\t\tdefault: return 0;\n\t\t}\n\t\treturn sort.direction === \"asc\" ? comparison : -comparison;\n\t});\n}\nfunction SortIcon$2({ direction, active }) {\n\tif (!active) return /* @__PURE__ */ jsx(Icon, {\n\t\tclassName: \"opacity-0 group-hover:opacity-50\",\n\t\tname: \"CaretSort\",\n\t\tsize: 12\n\t});\n\treturn /* @__PURE__ */ jsx(Icon, {\n\t\tclassName: direction === \"asc\" ? \"rotate-180\" : void 0,\n\t\tname: \"TriangleDown\",\n\t\tsize: 12\n\t});\n}\nfunction ProcessorsInspector({ getProcessors, onRetry }) {\n\tconst [processors, setProcessors] = useState([]);\n\tconst [loading, setLoading] = useState(true);\n\tconst [sort, setSort] = useState();\n\tconst [retryingId, setRetryingId] = useState(null);\n\tconst [selectedProcessor, setSelectedProcessor] = useState(null);\n\tconst [error, setError] = useState(null);\n\tconst loadProcessors = useCallback(async () => {\n\t\ttry {\n\t\t\tsetProcessors(await getProcessors());\n\t\t\tsetError(null);\n\t\t} catch (e) {\n\t\t\tsetError(e instanceof Error ? e.message : String(e));\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}, [getProcessors]);\n\tuseEffect(() => {\n\t\tloadProcessors();\n\t\tconst interval = setInterval(() => {\n\t\t\tloadProcessors();\n\t\t}, 2e3);\n\t\treturn () => clearInterval(interval);\n\t}, [loadProcessors]);\n\tconst handleRefresh = useCallback(async () => {\n\t\tsetLoading(true);\n\t\tawait loadProcessors();\n\t}, [loadProcessors]);\n\tconst handleRetry = useCallback(async (processorId) => {\n\t\tif (!onRetry) return;\n\t\tsetRetryingId(processorId);\n\t\ttry {\n\t\t\tawait onRetry(processorId);\n\t\t\tawait loadProcessors();\n\t\t} finally {\n\t\t\tsetRetryingId(null);\n\t\t}\n\t}, [onRetry, loadProcessors]);\n\tconst handleSort = (columnKey) => {\n\t\tsetSort({\n\t\t\tcolumn: columnKey,\n\t\t\tdirection: sort?.column === columnKey && sort.direction === \"asc\" ? \"desc\" : \"asc\"\n\t\t});\n\t};\n\tconst sortedProcessors = sortProcessors(processors, sort);\n\tconst activeCount = processors.filter((p) => p.status === \"active\").length;\n\tconst erroredCount = processors.filter((p) => p.status === \"errored\").length;\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex h-full flex-col gap-2\",\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex shrink-0 items-center justify-between\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"h2\", {\n\t\t\t\t\tclassName: \"text-lg font-semibold text-gray-900\",\n\t\t\t\t\tchildren: \"Processors Inspector\"\n\t\t\t\t}), /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"flex items-center gap-2\",\n\t\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-gray-300 bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100 disabled:opacity-50\",\n\t\t\t\t\t\tdisabled: loading,\n\t\t\t\t\t\tonClick: () => void handleRefresh(),\n\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\tname: \"Reload\",\n\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t}), \"Refresh\"]\n\t\t\t\t\t})\n\t\t\t\t})]\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex shrink-0 items-center gap-4 rounded-lg bg-gray-100 px-4 py-2 text-sm\",\n\t\t\t\tchildren: [\n\t\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\tclassName: \"text-gray-600\",\n\t\t\t\t\t\tchildren: [\"Total: \", /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\tclassName: \"font-medium\",\n\t\t\t\t\t\t\tchildren: processors.length\n\t\t\t\t\t\t})]\n\t\t\t\t\t}),\n\t\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\tclassName: \"flex items-center gap-2 text-gray-600\",\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"span\", { className: \"size-2 rounded-full bg-green-500\" }),\n\t\t\t\t\t\t\t\"Active: \",\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\tclassName: \"font-medium\",\n\t\t\t\t\t\t\t\tchildren: activeCount\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t]\n\t\t\t\t\t}),\n\t\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\tclassName: \"flex items-center gap-2 text-gray-600\",\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"span\", { className: \"size-2 rounded-full bg-red-500\" }),\n\t\t\t\t\t\t\t\"Errored: \",\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\tclassName: \"font-medium\",\n\t\t\t\t\t\t\t\tchildren: erroredCount\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t]\n\t\t\t\t\t})\n\t\t\t\t]\n\t\t\t}),\n\t\t\terror && /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"shrink-0 rounded-lg border border-red-300 bg-red-50 px-4 py-2 text-sm text-red-700\",\n\t\t\t\tchildren: [\"Failed to load processors: \", error]\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"max-h-full overflow-auto rounded-lg border border-gray-300\",\n\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"table\", {\n\t\t\t\t\tclassName: \"w-full border-collapse\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"thead\", {\n\t\t\t\t\t\tclassName: \"sticky top-0 bg-gray-100\",\n\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"tr\", { children: COLUMNS$2.map((column, index) => {\n\t\t\t\t\t\t\tconst isActive = sort?.column === column.key;\n\t\t\t\t\t\t\tconst sortDirection = isActive ? sort.direction : \"asc\";\n\t\t\t\t\t\t\treturn /* @__PURE__ */ jsx(\"th\", {\n\t\t\t\t\t\t\t\tclassName: twMerge(\"group cursor-pointer px-3 py-2 text-left text-xs font-medium text-gray-600 hover:bg-gray-200 hover:text-gray-900\", index > 0 && \"border-l border-gray-300\"),\n\t\t\t\t\t\t\t\tonClick: () => handleSort(column.key),\n\t\t\t\t\t\t\t\tstyle: { width: column.width },\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1\",\n\t\t\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\t\tclassName: \"truncate\",\n\t\t\t\t\t\t\t\t\t\tchildren: column.label\n\t\t\t\t\t\t\t\t\t}), /* @__PURE__ */ jsx(SortIcon$2, {\n\t\t\t\t\t\t\t\t\t\tactive: isActive,\n\t\t\t\t\t\t\t\t\t\tdirection: sortDirection\n\t\t\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}, column.key);\n\t\t\t\t\t\t}) })\n\t\t\t\t\t}), /* @__PURE__ */ jsx(\"tbody\", { children: loading && sortedProcessors.length === 0 ? /* @__PURE__ */ jsx(\"tr\", { children: /* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\tclassName: \"px-3 py-8 text-center text-sm text-gray-500\",\n\t\t\t\t\t\tcolSpan: COLUMNS$2.length,\n\t\t\t\t\t\tchildren: \"Loading...\"\n\t\t\t\t\t}) }) : sortedProcessors.length === 0 ? /* @__PURE__ */ jsx(\"tr\", { children: /* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\tclassName: \"px-3 py-8 text-center text-sm text-gray-500\",\n\t\t\t\t\t\tcolSpan: COLUMNS$2.length,\n\t\t\t\t\t\tchildren: \"No processors registered\"\n\t\t\t\t\t}) }) : sortedProcessors.map((processor) => /* @__PURE__ */ jsxs(\"tr\", {\n\t\t\t\t\t\tclassName: twMerge(\"hover:bg-blue-50\", processor.status === \"errored\" ? \"bg-red-50\" : \"odd:bg-white even:bg-gray-50\"),\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"px-3 py-2 text-xs\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded bg-blue-50 px-2 py-1 text-xs text-blue-700 hover:bg-blue-100\",\n\t\t\t\t\t\t\t\t\tonClick: () => setSelectedProcessor(processor),\n\t\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\t\tchildren: \"View\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: twMerge(\"inline-flex items-center gap-1 rounded px-1.5 py-0.5\", processor.status === \"active\" ? \"bg-green-100 text-green-700\" : \"bg-red-100 text-red-700\"),\n\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\tprocessor.status === \"active\" && /* @__PURE__ */ jsx(\"span\", { className: \"inline-block size-1.5 rounded-full bg-green-500\" }),\n\t\t\t\t\t\t\t\t\t\tprocessor.status === \"errored\" && /* @__PURE__ */ jsx(\"span\", { className: \"inline-block size-1.5 rounded-full bg-red-500\" }),\n\t\t\t\t\t\t\t\t\t\tprocessor.status\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"block truncate\",\n\t\t\t\t\t\t\t\t\ttitle: processor.processorId,\n\t\t\t\t\t\t\t\t\tchildren: truncateId$2(processor.processorId)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"block truncate\",\n\t\t\t\t\t\t\t\t\ttitle: processor.factoryId,\n\t\t\t\t\t\t\t\t\tchildren: truncateId$2(processor.factoryId)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"block truncate\",\n\t\t\t\t\t\t\t\t\ttitle: processor.driveId,\n\t\t\t\t\t\t\t\t\tchildren: truncateId$2(processor.driveId)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: processor.processorIndex\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: processor.lastOrdinal\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: processor.lastError ? /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"block truncate text-red-600\",\n\t\t\t\t\t\t\t\t\ttitle: processor.lastError,\n\t\t\t\t\t\t\t\t\tchildren: processor.lastError\n\t\t\t\t\t\t\t\t}) : /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"text-gray-400\",\n\t\t\t\t\t\t\t\t\tchildren: \"-\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: processor.lastErrorTimestamp ? /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"block truncate\",\n\t\t\t\t\t\t\t\t\ttitle: processor.lastErrorTimestamp.toISOString(),\n\t\t\t\t\t\t\t\t\tchildren: processor.lastErrorTimestamp.toLocaleString()\n\t\t\t\t\t\t\t\t}) : /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"text-gray-400\",\n\t\t\t\t\t\t\t\t\tchildren: \"-\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs\",\n\t\t\t\t\t\t\t\tchildren: processor.status === \"errored\" && onRetry && /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded bg-yellow-50 px-2 py-1 text-xs text-yellow-700 hover:bg-yellow-100 disabled:opacity-50\",\n\t\t\t\t\t\t\t\t\tdisabled: retryingId === processor.processorId,\n\t\t\t\t\t\t\t\t\tonClick: () => void handleRetry(processor.processorId),\n\t\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\t\tchildren: \"Retry\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t]\n\t\t\t\t\t}, processor.processorId)) })]\n\t\t\t\t})\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"shrink-0 text-sm text-gray-600\",\n\t\t\t\tchildren: [\n\t\t\t\t\t\"Showing \",\n\t\t\t\t\tsortedProcessors.length,\n\t\t\t\t\t\" processor(s)\"\n\t\t\t\t]\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(ObjectInspectorModal, {\n\t\t\t\tobject: selectedProcessor,\n\t\t\t\tonOpenChange: (open) => !open && setSelectedProcessor(null),\n\t\t\t\topen: selectedProcessor !== null,\n\t\t\t\ttitle: \"Processor\"\n\t\t\t})\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/queue-inspector/queue-inspector.tsx\nconst COLUMNS$1 = [\n\t{\n\t\tkey: \"view\",\n\t\tlabel: \"\",\n\t\twidth: \"60px\"\n\t},\n\t{\n\t\tkey: \"id\",\n\t\tlabel: \"ID\",\n\t\twidth: \"120px\"\n\t},\n\t{\n\t\tkey: \"kind\",\n\t\tlabel: \"Kind\",\n\t\twidth: \"80px\"\n\t},\n\t{\n\t\tkey: \"documentId\",\n\t\tlabel: \"Document ID\",\n\t\twidth: \"150px\"\n\t},\n\t{\n\t\tkey: \"scope\",\n\t\tlabel: \"Scope\",\n\t\twidth: \"100px\"\n\t},\n\t{\n\t\tkey: \"branch\",\n\t\tlabel: \"Branch\",\n\t\twidth: \"100px\"\n\t},\n\t{\n\t\tkey: \"createdAt\",\n\t\tlabel: \"Created At\",\n\t\twidth: \"160px\"\n\t},\n\t{\n\t\tkey: \"retryCount\",\n\t\tlabel: \"Retries\",\n\t\twidth: \"70px\"\n\t},\n\t{\n\t\tkey: \"status\",\n\t\tlabel: \"Status\",\n\t\twidth: \"100px\"\n\t}\n];\nfunction truncateId$1(id, maxLength = 12) {\n\tif (id.length <= maxLength) return id;\n\treturn id.slice(0, maxLength) + \"...\";\n}\nfunction formatDate(dateStr) {\n\treturn new Date(dateStr).toLocaleString();\n}\nfunction sortJobs(jobs, sort) {\n\tif (!sort) return jobs;\n\treturn [...jobs].sort((a, b) => {\n\t\tlet comparison = 0;\n\t\tswitch (sort.column) {\n\t\t\tcase \"id\":\n\t\t\t\tcomparison = a.id.localeCompare(b.id);\n\t\t\t\tbreak;\n\t\t\tcase \"kind\":\n\t\t\t\tcomparison = a.kind.localeCompare(b.kind);\n\t\t\t\tbreak;\n\t\t\tcase \"documentId\":\n\t\t\t\tcomparison = a.documentId.localeCompare(b.documentId);\n\t\t\t\tbreak;\n\t\t\tcase \"scope\":\n\t\t\t\tcomparison = a.scope.localeCompare(b.scope);\n\t\t\t\tbreak;\n\t\t\tcase \"branch\":\n\t\t\t\tcomparison = a.branch.localeCompare(b.branch);\n\t\t\t\tbreak;\n\t\t\tcase \"createdAt\":\n\t\t\t\tcomparison = a.createdAt.localeCompare(b.createdAt);\n\t\t\t\tbreak;\n\t\t\tcase \"retryCount\":\n\t\t\t\tcomparison = (a.retryCount ?? 0) - (b.retryCount ?? 0);\n\t\t\t\tbreak;\n\t\t\tcase \"status\":\n\t\t\t\tcomparison = a.status.localeCompare(b.status);\n\t\t\t\tbreak;\n\t\t\tdefault: return 0;\n\t\t}\n\t\treturn sort.direction === \"asc\" ? comparison : -comparison;\n\t});\n}\nfunction SortIcon$1({ direction, active }) {\n\tif (!active) return /* @__PURE__ */ jsx(Icon, {\n\t\tclassName: \"opacity-0 group-hover:opacity-50\",\n\t\tname: \"CaretSort\",\n\t\tsize: 12\n\t});\n\treturn /* @__PURE__ */ jsx(Icon, {\n\t\tclassName: direction === \"asc\" ? \"rotate-180\" : void 0,\n\t\tname: \"TriangleDown\",\n\t\tsize: 12\n\t});\n}\nfunction QueueInspector({ getQueueState, onPause, onResume }) {\n\tconst [state, setState] = useState({\n\t\tisPaused: false,\n\t\tpendingJobs: [],\n\t\texecutingJobs: [],\n\t\ttotalPending: 0,\n\t\ttotalExecuting: 0\n\t});\n\tconst [loading, setLoading] = useState(true);\n\tconst [sort, setSort] = useState();\n\tconst [actionInProgress, setActionInProgress] = useState(false);\n\tconst [selectedJob, setSelectedJob] = useState(null);\n\tconst loadState = useCallback(async () => {\n\t\tsetState(await getQueueState());\n\t\tsetLoading(false);\n\t}, [getQueueState]);\n\tuseEffect(() => {\n\t\tloadState();\n\t\tconst interval = setInterval(() => {\n\t\t\tloadState();\n\t\t}, 2e3);\n\t\treturn () => clearInterval(interval);\n\t}, [loadState]);\n\tconst handleRefresh = useCallback(async () => {\n\t\tsetLoading(true);\n\t\tawait loadState();\n\t}, [loadState]);\n\tconst handlePauseResume = useCallback(async () => {\n\t\tsetActionInProgress(true);\n\t\tif (state.isPaused) await onResume();\n\t\telse await onPause();\n\t\tawait loadState();\n\t\tsetActionInProgress(false);\n\t}, [\n\t\tstate.isPaused,\n\t\tonPause,\n\t\tonResume,\n\t\tloadState\n\t]);\n\tconst handleSort = (columnKey) => {\n\t\tsetSort({\n\t\t\tcolumn: columnKey,\n\t\t\tdirection: sort?.column === columnKey && sort.direction === \"asc\" ? \"desc\" : \"asc\"\n\t\t});\n\t};\n\tconst sortedJobs = sortJobs([...state.executingJobs.map((job) => ({\n\t\t...job,\n\t\tstatus: \"executing\"\n\t})), ...state.pendingJobs.map((job) => ({\n\t\t...job,\n\t\tstatus: \"pending\"\n\t}))], sort);\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex h-full flex-col gap-2\",\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex shrink-0 items-center justify-between\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"h2\", {\n\t\t\t\t\tclassName: \"text-lg font-semibold text-gray-900\",\n\t\t\t\t\tchildren: \"Queue Inspector\"\n\t\t\t\t}), /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"flex items-center gap-2\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\t\tclassName: twMerge(\"flex items-center gap-1 rounded border px-3 py-1.5 text-sm disabled:opacity-50\", state.isPaused ? \"border-green-300 bg-green-50 text-green-700 hover:bg-green-100\" : \"border-yellow-300 bg-yellow-50 text-yellow-700 hover:bg-yellow-100\"),\n\t\t\t\t\t\tdisabled: actionInProgress,\n\t\t\t\t\t\tonClick: () => void handlePauseResume(),\n\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\tname: state.isPaused ? \"ArrowFilledRight\" : \"Ellipsis\",\n\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t}), state.isPaused ? \"Resume\" : \"Pause\"]\n\t\t\t\t\t}), /* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-gray-300 bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100 disabled:opacity-50\",\n\t\t\t\t\t\tdisabled: loading,\n\t\t\t\t\t\tonClick: () => void handleRefresh(),\n\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\tname: \"Reload\",\n\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t}), \"Refresh\"]\n\t\t\t\t\t})]\n\t\t\t\t})]\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex shrink-0 items-center gap-4 rounded-lg bg-gray-100 px-4 py-2 text-sm\",\n\t\t\t\tchildren: [\n\t\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\tclassName: \"flex items-center gap-2\",\n\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"span\", { className: twMerge(\"size-2 rounded-full\", state.isPaused ? \"bg-yellow-500\" : \"bg-green-500\") }), /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\tclassName: \"font-medium text-gray-700\",\n\t\t\t\t\t\t\tchildren: state.isPaused ? \"Paused\" : \"Running\"\n\t\t\t\t\t\t})]\n\t\t\t\t\t}),\n\t\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\tclassName: \"text-gray-600\",\n\t\t\t\t\t\tchildren: [\"Pending: \", /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\tclassName: \"font-medium\",\n\t\t\t\t\t\t\tchildren: state.totalPending\n\t\t\t\t\t\t})]\n\t\t\t\t\t}),\n\t\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\tclassName: \"text-gray-600\",\n\t\t\t\t\t\tchildren: [\"Executing: \", /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\tclassName: \"font-medium\",\n\t\t\t\t\t\t\tchildren: state.totalExecuting\n\t\t\t\t\t\t})]\n\t\t\t\t\t})\n\t\t\t\t]\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"max-h-full overflow-auto rounded-lg border border-gray-300\",\n\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"table\", {\n\t\t\t\t\tclassName: \"w-full border-collapse\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"thead\", {\n\t\t\t\t\t\tclassName: \"sticky top-0 bg-gray-100\",\n\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"tr\", { children: COLUMNS$1.map((column, index) => {\n\t\t\t\t\t\t\tconst isActive = sort?.column === column.key;\n\t\t\t\t\t\t\tconst sortDirection = isActive ? sort.direction : \"asc\";\n\t\t\t\t\t\t\treturn /* @__PURE__ */ jsx(\"th\", {\n\t\t\t\t\t\t\t\tclassName: twMerge(\"group cursor-pointer px-3 py-2 text-left text-xs font-medium text-gray-600 hover:bg-gray-200 hover:text-gray-900\", index > 0 && \"border-l border-gray-300\"),\n\t\t\t\t\t\t\t\tonClick: () => handleSort(column.key),\n\t\t\t\t\t\t\t\tstyle: { width: column.width },\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1\",\n\t\t\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\t\tclassName: \"truncate\",\n\t\t\t\t\t\t\t\t\t\tchildren: column.label\n\t\t\t\t\t\t\t\t\t}), /* @__PURE__ */ jsx(SortIcon$1, {\n\t\t\t\t\t\t\t\t\t\tactive: isActive,\n\t\t\t\t\t\t\t\t\t\tdirection: sortDirection\n\t\t\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}, column.key);\n\t\t\t\t\t\t}) })\n\t\t\t\t\t}), /* @__PURE__ */ jsx(\"tbody\", { children: loading && sortedJobs.length === 0 ? /* @__PURE__ */ jsx(\"tr\", { children: /* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\tclassName: \"px-3 py-8 text-center text-sm text-gray-500\",\n\t\t\t\t\t\tcolSpan: COLUMNS$1.length,\n\t\t\t\t\t\tchildren: \"Loading...\"\n\t\t\t\t\t}) }) : sortedJobs.length === 0 ? /* @__PURE__ */ jsx(\"tr\", { children: /* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\tclassName: \"px-3 py-8 text-center text-sm text-gray-500\",\n\t\t\t\t\t\tcolSpan: COLUMNS$1.length,\n\t\t\t\t\t\tchildren: \"No jobs in queue\"\n\t\t\t\t\t}) }) : sortedJobs.map((job) => /* @__PURE__ */ jsxs(\"tr\", {\n\t\t\t\t\t\tclassName: \"odd:bg-white even:bg-gray-50 hover:bg-blue-50\",\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"px-3 py-2 text-xs\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded bg-blue-50 px-2 py-1 text-xs text-blue-700 hover:bg-blue-100\",\n\t\t\t\t\t\t\t\t\tonClick: () => setSelectedJob(job),\n\t\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\t\tchildren: \"View\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"block truncate\",\n\t\t\t\t\t\t\t\t\ttitle: job.id,\n\t\t\t\t\t\t\t\t\tchildren: truncateId$1(job.id)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: twMerge(\"inline-block rounded px-1.5 py-0.5\", job.kind === \"mutation\" ? \"bg-purple-100 text-purple-700\" : \"bg-blue-100 text-blue-700\"),\n\t\t\t\t\t\t\t\t\tchildren: job.kind\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"block truncate\",\n\t\t\t\t\t\t\t\t\ttitle: job.documentId,\n\t\t\t\t\t\t\t\t\tchildren: truncateId$1(job.documentId)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"block truncate\",\n\t\t\t\t\t\t\t\t\ttitle: job.scope,\n\t\t\t\t\t\t\t\t\tchildren: job.scope\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"block truncate\",\n\t\t\t\t\t\t\t\t\ttitle: job.branch,\n\t\t\t\t\t\t\t\t\tchildren: job.branch\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"block truncate\",\n\t\t\t\t\t\t\t\t\ttitle: job.createdAt,\n\t\t\t\t\t\t\t\t\tchildren: formatDate(job.createdAt)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: job.retryCount ?? 0\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: twMerge(\"inline-flex items-center gap-1 rounded px-1.5 py-0.5\", job.status === \"executing\" ? \"bg-green-100 text-green-700\" : \"bg-gray-100 text-gray-600\"),\n\t\t\t\t\t\t\t\t\tchildren: [job.status === \"executing\" && /* @__PURE__ */ jsx(\"span\", { className: \"inline-block size-1.5 animate-pulse rounded-full bg-green-500\" }), job.status]\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t]\n\t\t\t\t\t}, job.id)) })]\n\t\t\t\t})\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"shrink-0 text-sm text-gray-600\",\n\t\t\t\tchildren: [\n\t\t\t\t\t\"Showing \",\n\t\t\t\t\tsortedJobs.length,\n\t\t\t\t\t\" job(s)\"\n\t\t\t\t]\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(ObjectInspectorModal, {\n\t\t\t\tobject: selectedJob,\n\t\t\t\tonOpenChange: (open) => !open && setSelectedJob(null),\n\t\t\t\topen: selectedJob !== null,\n\t\t\t\ttitle: \"Job\"\n\t\t\t})\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/remotes-inspector/components/connection-state-badge.tsx\nconst stateStyles = {\n\tconnected: \"bg-green-100 text-green-800\",\n\tconnecting: \"bg-blue-100 text-blue-800\",\n\treconnecting: \"bg-yellow-100 text-yellow-800\",\n\terror: \"bg-red-100 text-red-800\",\n\tdisconnected: \"bg-gray-100 text-gray-600\"\n};\nfunction ConnectionStateBadge({ state, failureCount }) {\n\treturn /* @__PURE__ */ jsxs(\"span\", {\n\t\tclassName: twMerge(\"inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium\", stateStyles[state] ?? \"bg-gray-100 text-gray-600\"),\n\t\tchildren: [state, failureCount > 0 && /* @__PURE__ */ jsxs(\"span\", {\n\t\t\tclassName: \"text-[10px] opacity-75\",\n\t\t\tchildren: [\n\t\t\t\t\"(\",\n\t\t\t\tfailureCount,\n\t\t\t\t\")\"\n\t\t\t]\n\t\t})]\n\t});\n}\n//#endregion\n//#region src/connect/components/remotes-inspector/utils.ts\nfunction truncateId(id, maxLength = 12) {\n\tif (id.length <= maxLength) return id;\n\treturn id.slice(0, maxLength) + \"...\";\n}\n//#endregion\n//#region src/connect/components/remotes-inspector/components/sort-icon.tsx\nfunction SortIcon({ direction, active }) {\n\tif (!active) return /* @__PURE__ */ jsx(Icon, {\n\t\tclassName: \"opacity-0 group-hover:opacity-50\",\n\t\tname: \"CaretSort\",\n\t\tsize: 12\n\t});\n\treturn /* @__PURE__ */ jsx(Icon, {\n\t\tclassName: direction === \"asc\" ? \"rotate-180\" : void 0,\n\t\tname: \"TriangleDown\",\n\t\tsize: 12\n\t});\n}\n//#endregion\n//#region src/connect/components/remotes-inspector/components/mailbox-table.tsx\nconst VIEW_COLUMN = {\n\tkey: \"view\",\n\tlabel: \"\",\n\twidth: \"60px\"\n};\nconst COLUMNS = [\n\tVIEW_COLUMN,\n\t{\n\t\tkey: \"documentId\",\n\t\tlabel: \"Document ID\",\n\t\twidth: \"150px\"\n\t},\n\t{\n\t\tkey: \"branch\",\n\t\tlabel: \"Branch\",\n\t\twidth: \"100px\"\n\t},\n\t{\n\t\tkey: \"scopes\",\n\t\tlabel: \"Scopes\",\n\t\twidth: \"100px\"\n\t},\n\t{\n\t\tkey: \"status\",\n\t\tlabel: \"Status\",\n\t\twidth: \"150px\"\n\t},\n\t{\n\t\tkey: \"opsCount\",\n\t\tlabel: \"Ops Count\",\n\t\twidth: \"80px\"\n\t}\n];\nconst DEAD_LETTER_COLUMNS = [\n\tVIEW_COLUMN,\n\t{\n\t\tkey: \"documentId\",\n\t\tlabel: \"Document ID\",\n\t\twidth: \"150px\"\n\t},\n\t{\n\t\tkey: \"branch\",\n\t\tlabel: \"Branch\",\n\t\twidth: \"100px\"\n\t},\n\t{\n\t\tkey: \"scopes\",\n\t\tlabel: \"Scopes\",\n\t\twidth: \"100px\"\n\t},\n\t{\n\t\tkey: \"error\",\n\t\tlabel: \"Error\",\n\t\twidth: \"200px\"\n\t}\n];\nfunction toSerializableObject(obj) {\n\treturn JSON.parse(JSON.stringify(obj, (_key, value) => {\n\t\tif (typeof value === \"function\") return \"[Function]\";\n\t\tif (typeof value === \"symbol\") return \"[Symbol]\";\n\t\tif (value instanceof Error) return {\n\t\t\tname: value.name,\n\t\t\tmessage: value.message\n\t\t};\n\t\treturn value;\n\t}));\n}\nfunction getStatusLabel(status) {\n\tswitch (status) {\n\t\tcase SyncOperationStatus.Unknown: return \"Unknown\";\n\t\tcase SyncOperationStatus.TransportPending: return \"Transport Pending\";\n\t\tcase SyncOperationStatus.ExecutionPending: return \"Execution Pending\";\n\t\tcase SyncOperationStatus.Applied: return \"Applied\";\n\t\tcase SyncOperationStatus.Error: return \"Error\";\n\t\tdefault: return \"Unknown\";\n\t}\n}\nfunction getStatusIcon(status) {\n\tswitch (status) {\n\t\tcase SyncOperationStatus.TransportPending:\n\t\tcase SyncOperationStatus.ExecutionPending: return /* @__PURE__ */ jsx(\"span\", { children: \"⏳\" });\n\t\tcase SyncOperationStatus.Applied: return /* @__PURE__ */ jsx(\"span\", { children: \"✅\" });\n\t\tcase SyncOperationStatus.Error: return /* @__PURE__ */ jsx(\"span\", { children: \"❌\" });\n\t\tdefault: return /* @__PURE__ */ jsx(\"span\", { children: \"❓\" });\n\t}\n}\nfunction getErrorMessage(error) {\n\tif (!error) return \"\";\n\treturn error.error.message;\n}\nfunction sortOperations$1(operations, sort) {\n\tconst ops = [...operations];\n\tif (!sort) return ops;\n\treturn ops.sort((a, b) => {\n\t\tlet comparison = 0;\n\t\tswitch (sort.column) {\n\t\t\tcase \"documentId\":\n\t\t\t\tcomparison = a.documentId.localeCompare(b.documentId);\n\t\t\t\tbreak;\n\t\t\tcase \"branch\":\n\t\t\t\tcomparison = a.branch.localeCompare(b.branch);\n\t\t\t\tbreak;\n\t\t\tcase \"scopes\":\n\t\t\t\tcomparison = a.scopes.join(\",\").localeCompare(b.scopes.join(\",\"));\n\t\t\t\tbreak;\n\t\t\tcase \"status\":\n\t\t\t\tcomparison = a.status - b.status;\n\t\t\t\tbreak;\n\t\t\tcase \"opsCount\":\n\t\t\t\tcomparison = a.operations.length - b.operations.length;\n\t\t\t\tbreak;\n\t\t\tcase \"error\":\n\t\t\t\tcomparison = getErrorMessage(a.error).localeCompare(getErrorMessage(b.error));\n\t\t\t\tbreak;\n\t\t\tdefault: return 0;\n\t\t}\n\t\treturn sort.direction === \"asc\" ? comparison : -comparison;\n\t});\n}\nfunction MailboxTable({ title, mailboxType, operations, sort, onSort, collapsed, onToggleCollapse }) {\n\tconst [selectedOperation, setSelectedOperation] = useState(null);\n\tconst columns = mailboxType === \"deadLetter\" ? DEAD_LETTER_COLUMNS : COLUMNS;\n\tconst sortedOps = sortOperations$1(operations, sort);\n\tconst handleSort = (columnKey) => {\n\t\tonSort(mailboxType, columnKey);\n\t};\n\tconst handleCopyAll = async () => {\n\t\tconst serializable = toSerializableObject(operations);\n\t\tconst json = JSON.stringify(serializable, null, 2);\n\t\tawait navigator.clipboard.writeText(json);\n\t};\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex flex-col gap-2\",\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex items-center justify-between\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\tclassName: \"flex items-center gap-2 text-left text-sm font-medium text-gray-700 hover:text-gray-900\",\n\t\t\t\t\tonClick: onToggleCollapse,\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\tclassName: twMerge(\"transition-transform\", collapsed && \"-rotate-90\"),\n\t\t\t\t\t\t\tname: \"ChevronDown\",\n\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttitle,\n\t\t\t\t\t\t\" (\",\n\t\t\t\t\t\toperations.length,\n\t\t\t\t\t\t\" item\",\n\t\t\t\t\t\toperations.length !== 1 ? \"s\" : \"\",\n\t\t\t\t\t\t\")\"\n\t\t\t\t\t]\n\t\t\t\t}), operations.length > 0 && /* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\tclassName: \"flex items-center gap-1 rounded bg-gray-100 px-2 py-1 text-xs text-gray-700 hover:bg-gray-200\",\n\t\t\t\t\tonClick: () => void handleCopyAll(),\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\tname: \"Copy\",\n\t\t\t\t\t\tsize: 12\n\t\t\t\t\t}), \"Copy All\"]\n\t\t\t\t})]\n\t\t\t}),\n\t\t\t!collapsed && /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"overflow-hidden rounded-lg border border-gray-300\",\n\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"table\", {\n\t\t\t\t\tclassName: \"w-full border-collapse\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"thead\", {\n\t\t\t\t\t\tclassName: \"sticky top-0 bg-gray-100\",\n\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"tr\", { children: columns.map((column, index) => {\n\t\t\t\t\t\t\tconst isActive = sort?.column === column.key;\n\t\t\t\t\t\t\tconst sortDirection = isActive ? sort.direction : \"asc\";\n\t\t\t\t\t\t\treturn /* @__PURE__ */ jsx(\"th\", {\n\t\t\t\t\t\t\t\tclassName: twMerge(\"group cursor-pointer px-3 py-2 text-left text-xs font-medium text-gray-600 hover:bg-gray-200 hover:text-gray-900\", index > 0 && \"border-l border-gray-300\"),\n\t\t\t\t\t\t\t\tonClick: () => handleSort(column.key),\n\t\t\t\t\t\t\t\tstyle: { width: column.width },\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1\",\n\t\t\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\t\tclassName: \"truncate\",\n\t\t\t\t\t\t\t\t\t\tchildren: column.label\n\t\t\t\t\t\t\t\t\t}), /* @__PURE__ */ jsx(SortIcon, {\n\t\t\t\t\t\t\t\t\t\tactive: isActive,\n\t\t\t\t\t\t\t\t\t\tdirection: sortDirection\n\t\t\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}, column.key);\n\t\t\t\t\t\t}) })\n\t\t\t\t\t}), /* @__PURE__ */ jsx(\"tbody\", { children: sortedOps.length === 0 ? /* @__PURE__ */ jsx(\"tr\", { children: /* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\tclassName: \"px-3 py-4 text-center text-sm text-gray-500\",\n\t\t\t\t\t\tcolSpan: columns.length,\n\t\t\t\t\t\tchildren: \"No operations\"\n\t\t\t\t\t}) }) : sortedOps.map((op) => /* @__PURE__ */ jsxs(\"tr\", {\n\t\t\t\t\t\tclassName: \"odd:bg-white even:bg-gray-50 hover:bg-blue-50\",\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"px-3 py-2 text-xs\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded bg-blue-50 px-2 py-1 text-xs text-blue-700 hover:bg-blue-100\",\n\t\t\t\t\t\t\t\t\tonClick: () => setSelectedOperation(op),\n\t\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\t\tchildren: \"View\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"block truncate\",\n\t\t\t\t\t\t\t\t\ttitle: op.documentId,\n\t\t\t\t\t\t\t\t\tchildren: truncateId(op.documentId)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"block truncate\",\n\t\t\t\t\t\t\t\t\ttitle: op.branch,\n\t\t\t\t\t\t\t\t\tchildren: op.branch\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"block truncate\",\n\t\t\t\t\t\t\t\t\ttitle: op.scopes.join(\", \"),\n\t\t\t\t\t\t\t\t\tchildren: op.scopes.join(\", \")\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tmailboxType === \"deadLetter\" ? /* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"block truncate text-red-600\",\n\t\t\t\t\t\t\t\t\ttitle: getErrorMessage(op.error),\n\t\t\t\t\t\t\t\t\tchildren: getErrorMessage(op.error) || \"Unknown error\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}) : /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1\",\n\t\t\t\t\t\t\t\t\tchildren: [getStatusIcon(op.status), getStatusLabel(op.status)]\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}), /* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: op.operations.length\n\t\t\t\t\t\t\t})] })\n\t\t\t\t\t\t]\n\t\t\t\t\t}, op.id)) })]\n\t\t\t\t})\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(ObjectInspectorModal, {\n\t\t\t\tobject: selectedOperation,\n\t\t\t\tonOpenChange: (open) => !open && setSelectedOperation(null),\n\t\t\t\topen: selectedOperation !== null,\n\t\t\t\ttitle: \"Sync Operation\"\n\t\t\t})\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/remotes-inspector/components/channel-inspector.tsx\nfunction formatTimestamp(ms) {\n\tif (ms === 0) return \"-\";\n\treturn new Date(ms).toLocaleTimeString();\n}\nfunction ChannelInspector({ remoteName, channel, onBack, onRefresh, connectionState }) {\n\tconst [sorts, setSorts] = useState({\n\t\tinbox: void 0,\n\t\toutbox: void 0,\n\t\tdeadLetter: void 0\n\t});\n\tconst [collapsed, setCollapsed] = useState({\n\t\tinbox: false,\n\t\toutbox: false,\n\t\tdeadLetter: false\n\t});\n\tconst handleToggleCollapse = (mailbox) => {\n\t\tsetCollapsed((prev) => ({\n\t\t\t...prev,\n\t\t\t[mailbox]: !prev[mailbox]\n\t\t}));\n\t};\n\tconst handleSort = (mailbox, columnKey) => {\n\t\tsetSorts((prev) => {\n\t\t\tconst currentSort = prev[mailbox];\n\t\t\tconst newDirection = currentSort?.column === columnKey && currentSort.direction === \"asc\" ? \"desc\" : \"asc\";\n\t\t\treturn {\n\t\t\t\t...prev,\n\t\t\t\t[mailbox]: {\n\t\t\t\t\tcolumn: columnKey,\n\t\t\t\t\tdirection: newDirection\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t};\n\tconst pollerControls = useCallback(() => {\n\t\treturn \"poller\" in channel ? channel.poller : null;\n\t}, [channel])();\n\tconst [pollerState, setPollerState] = useState(() => ({\n\t\tisPaused: pollerControls?.isPaused() ?? false,\n\t\tisRunning: pollerControls?.isRunning() ?? false\n\t}));\n\tconst [intervalMs, setIntervalMs] = useState(() => pollerControls?.getIntervalMs() ?? 2e3);\n\tconst [mailboxStates, setMailboxStates] = useState(() => ({\n\t\tinbox: { isPaused: channel.inbox.isPaused() },\n\t\toutbox: { isPaused: channel.outbox.isPaused() }\n\t}));\n\tconst handlePause = useCallback(() => {\n\t\tif (pollerControls) {\n\t\t\tpollerControls.pause();\n\t\t\tsetPollerState({\n\t\t\t\tisPaused: pollerControls.isPaused(),\n\t\t\t\tisRunning: pollerControls.isRunning()\n\t\t\t});\n\t\t}\n\t}, [pollerControls]);\n\tconst handleResume = useCallback(() => {\n\t\tif (pollerControls) {\n\t\t\tpollerControls.resume();\n\t\t\tsetPollerState({\n\t\t\t\tisPaused: pollerControls.isPaused(),\n\t\t\t\tisRunning: pollerControls.isRunning()\n\t\t\t});\n\t\t}\n\t}, [pollerControls]);\n\tconst handlePollNow = useCallback(() => {\n\t\tif (pollerControls) pollerControls.triggerNow();\n\t}, [pollerControls]);\n\tconst handleApplyInterval = useCallback(() => {\n\t\tif (pollerControls) pollerControls.setIntervalMs(intervalMs);\n\t}, [pollerControls, intervalMs]);\n\tconst handleMailboxPause = useCallback((mailbox) => {\n\t\tconst mailboxInstance = mailbox === \"inbox\" ? channel.inbox : channel.outbox;\n\t\tmailboxInstance.pause();\n\t\tsetMailboxStates((prev) => ({\n\t\t\t...prev,\n\t\t\t[mailbox]: { isPaused: mailboxInstance.isPaused() }\n\t\t}));\n\t}, [channel]);\n\tconst handleMailboxResume = useCallback((mailbox) => {\n\t\tconst mailboxInstance = mailbox === \"inbox\" ? channel.inbox : channel.outbox;\n\t\tmailboxInstance.resume();\n\t\tsetMailboxStates((prev) => ({\n\t\t\t...prev,\n\t\t\t[mailbox]: { isPaused: mailboxInstance.isPaused() }\n\t\t}));\n\t}, [channel]);\n\tconst handleMailboxFlush = useCallback((mailbox) => {\n\t\t(mailbox === \"inbox\" ? channel.inbox : channel.outbox).flush();\n\t\tonRefresh?.();\n\t}, [channel, onRefresh]);\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex h-full flex-col gap-3 overflow-auto\",\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex items-center justify-between\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"flex items-center gap-2\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-gray-300 bg-white px-2 py-1 text-sm text-gray-700 hover:bg-gray-100\",\n\t\t\t\t\t\tonClick: onBack,\n\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\tclassName: \"rotate-90\",\n\t\t\t\t\t\t\tname: \"ChevronDown\",\n\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t}), \"Back\"]\n\t\t\t\t\t}), /* @__PURE__ */ jsxs(\"h2\", {\n\t\t\t\t\t\tclassName: \"text-lg font-semibold text-gray-900\",\n\t\t\t\t\t\tchildren: [\"Channel: \", remoteName]\n\t\t\t\t\t})]\n\t\t\t\t}), onRefresh && /* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-gray-300 bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100\",\n\t\t\t\t\tonClick: onRefresh,\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\tname: \"Reload\",\n\t\t\t\t\t\tsize: 14\n\t\t\t\t\t}), \"Refresh\"]\n\t\t\t\t})]\n\t\t\t}),\n\t\t\tconnectionState && /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"rounded border border-gray-200 bg-white p-4\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"h3\", {\n\t\t\t\t\tclassName: \"mb-3 text-sm font-semibold text-gray-900\",\n\t\t\t\t\tchildren: \"Connection State\"\n\t\t\t\t}), /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"flex flex-wrap items-center gap-4 text-sm text-gray-600\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\tclassName: \"flex items-center gap-2\",\n\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"span\", { children: \"State:\" }), /* @__PURE__ */ jsx(ConnectionStateBadge, {\n\t\t\t\t\t\t\t\tfailureCount: connectionState.failureCount,\n\t\t\t\t\t\t\t\tstate: connectionState.state\n\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t/* @__PURE__ */ jsxs(\"div\", { children: [\"Last success: \", formatTimestamp(connectionState.lastSuccessUtcMs)] }),\n\t\t\t\t\t\t/* @__PURE__ */ jsxs(\"div\", { children: [\"Last failure: \", formatTimestamp(connectionState.lastFailureUtcMs)] }),\n\t\t\t\t\t\t/* @__PURE__ */ jsxs(\"div\", { children: [\"Failures: \", connectionState.failureCount] }),\n\t\t\t\t\t\t/* @__PURE__ */ jsxs(\"div\", { children: [\n\t\t\t\t\t\t\t\"Push:\",\n\t\t\t\t\t\t\t\" \",\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\tclassName: connectionState.pushBlocked ? \"text-red-600\" : \"text-green-600\",\n\t\t\t\t\t\t\t\tchildren: connectionState.pushBlocked ? \"Blocked\" : \"OK\"\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tconnectionState.pushFailureCount > 0 && /* @__PURE__ */ jsxs(\"span\", {\n\t\t\t\t\t\t\t\tclassName: \"ml-1 text-red-600\",\n\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\"(\",\n\t\t\t\t\t\t\t\t\tconnectionState.pushFailureCount,\n\t\t\t\t\t\t\t\t\t\" failures)\"\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t] })\n\t\t\t\t\t]\n\t\t\t\t})]\n\t\t\t}),\n\t\t\tpollerControls && /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"rounded border border-gray-200 bg-white p-4\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"h3\", {\n\t\t\t\t\tclassName: \"mb-3 text-sm font-semibold text-gray-900\",\n\t\t\t\t\tchildren: \"Poller\"\n\t\t\t\t}), /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"flex items-center justify-between\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\tclassName: \"flex items-center gap-4\",\n\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\tclassName: \"text-sm text-gray-600\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\"Status:\",\n\t\t\t\t\t\t\t\t\" \",\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: pollerState.isPaused ? \"text-yellow-600\" : \"text-green-600\",\n\t\t\t\t\t\t\t\t\tchildren: pollerState.isPaused ? \"Paused\" : \"Running\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}), /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\tclassName: \"flex items-center gap-1\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"label\", {\n\t\t\t\t\t\t\t\t\tclassName: \"text-sm text-gray-600\",\n\t\t\t\t\t\t\t\t\thtmlFor: \"poll-interval\",\n\t\t\t\t\t\t\t\t\tchildren: \"Interval:\"\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"input\", {\n\t\t\t\t\t\t\t\t\tclassName: \"w-20 rounded border border-gray-300 px-2 py-1 text-sm\",\n\t\t\t\t\t\t\t\t\tid: \"poll-interval\",\n\t\t\t\t\t\t\t\t\tmin: 100,\n\t\t\t\t\t\t\t\t\tonChange: (e) => setIntervalMs(Number(e.target.value)),\n\t\t\t\t\t\t\t\t\tonKeyDown: (e) => {\n\t\t\t\t\t\t\t\t\t\tif (e.key === \"Enter\") handleApplyInterval();\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t\t\tvalue: intervalMs\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"text-sm text-gray-500\",\n\t\t\t\t\t\t\t\t\tchildren: \"ms\"\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\t\tclassName: \"ml-1 rounded border border-gray-300 bg-white px-2 py-1 text-sm text-gray-700 hover:bg-gray-100\",\n\t\t\t\t\t\t\t\t\tonClick: handleApplyInterval,\n\t\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\t\tchildren: \"Apply\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t})]\n\t\t\t\t\t}), /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\tclassName: \"flex gap-2\",\n\t\t\t\t\t\tchildren: [pollerState.isPaused ? /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-gray-300 bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100\",\n\t\t\t\t\t\t\tonClick: handleResume,\n\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\tchildren: \"Resume\"\n\t\t\t\t\t\t}) : /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-gray-300 bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100\",\n\t\t\t\t\t\t\tonClick: handlePause,\n\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\tchildren: \"Pause\"\n\t\t\t\t\t\t}), /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-gray-300 bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\t\t\t\tdisabled: !pollerState.isPaused,\n\t\t\t\t\t\t\tonClick: handlePollNow,\n\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\tchildren: \"Poll Now\"\n\t\t\t\t\t\t})]\n\t\t\t\t\t})]\n\t\t\t\t})]\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"rounded border border-gray-200 bg-white p-4\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"h3\", {\n\t\t\t\t\tclassName: \"mb-3 text-sm font-semibold text-gray-900\",\n\t\t\t\t\tchildren: \"Mailbox Processing\"\n\t\t\t\t}), /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"flex flex-col gap-3\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\tclassName: \"flex items-center justify-between\",\n\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\tclassName: \"flex items-center gap-3 text-sm text-gray-600\",\n\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsxs(\"span\", { children: [\n\t\t\t\t\t\t\t\t\"Inbox:\",\n\t\t\t\t\t\t\t\t\" \",\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: mailboxStates.inbox.isPaused ? \"text-yellow-600\" : \"text-green-600\",\n\t\t\t\t\t\t\t\t\tchildren: mailboxStates.inbox.isPaused ? \"Paused\" : \"Active\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t] }), /* @__PURE__ */ jsxs(\"span\", {\n\t\t\t\t\t\t\t\tclassName: \"font-mono text-sm text-gray-500\",\n\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\"We ack'd (theirs): \",\n\t\t\t\t\t\t\t\t\tchannel.inbox.ackOrdinal,\n\t\t\t\t\t\t\t\t\t\" | Received:\",\n\t\t\t\t\t\t\t\t\t\" \",\n\t\t\t\t\t\t\t\t\tchannel.inbox.latestOrdinal\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t}), /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\tclassName: \"flex gap-2\",\n\t\t\t\t\t\t\tchildren: [mailboxStates.inbox.isPaused ? /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-gray-300 bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100\",\n\t\t\t\t\t\t\t\tonClick: () => handleMailboxResume(\"inbox\"),\n\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\tchildren: \"Resume\"\n\t\t\t\t\t\t\t}) : /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-gray-300 bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100\",\n\t\t\t\t\t\t\t\tonClick: () => handleMailboxPause(\"inbox\"),\n\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\tchildren: \"Pause\"\n\t\t\t\t\t\t\t}), /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-gray-300 bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\t\t\t\t\tdisabled: !mailboxStates.inbox.isPaused,\n\t\t\t\t\t\t\t\tonClick: () => handleMailboxFlush(\"inbox\"),\n\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\tchildren: \"Flush\"\n\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t})]\n\t\t\t\t\t}), /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\tclassName: \"flex items-center justify-between\",\n\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\tclassName: \"flex items-center gap-3 text-sm text-gray-600\",\n\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsxs(\"span\", { children: [\n\t\t\t\t\t\t\t\t\"Outbox:\",\n\t\t\t\t\t\t\t\t\" \",\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: mailboxStates.outbox.isPaused ? \"text-yellow-600\" : \"text-green-600\",\n\t\t\t\t\t\t\t\t\tchildren: mailboxStates.outbox.isPaused ? \"Paused\" : \"Active\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t] }), /* @__PURE__ */ jsxs(\"span\", {\n\t\t\t\t\t\t\t\tclassName: \"font-mono text-sm text-gray-500\",\n\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\"They ack'd (ours): \",\n\t\t\t\t\t\t\t\t\tchannel.outbox.ackOrdinal,\n\t\t\t\t\t\t\t\t\t\" | Sent:\",\n\t\t\t\t\t\t\t\t\t\" \",\n\t\t\t\t\t\t\t\t\tchannel.outbox.latestOrdinal\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t}), /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\tclassName: \"flex gap-2\",\n\t\t\t\t\t\t\tchildren: [mailboxStates.outbox.isPaused ? /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-gray-300 bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100\",\n\t\t\t\t\t\t\t\tonClick: () => handleMailboxResume(\"outbox\"),\n\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\tchildren: \"Resume\"\n\t\t\t\t\t\t\t}) : /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-gray-300 bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100\",\n\t\t\t\t\t\t\t\tonClick: () => handleMailboxPause(\"outbox\"),\n\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\tchildren: \"Pause\"\n\t\t\t\t\t\t\t}), /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-gray-300 bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\t\t\t\t\tdisabled: !mailboxStates.outbox.isPaused,\n\t\t\t\t\t\t\t\tonClick: () => handleMailboxFlush(\"outbox\"),\n\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\tchildren: \"Flush\"\n\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t})]\n\t\t\t\t\t})]\n\t\t\t\t})]\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex flex-col gap-6\",\n\t\t\t\tchildren: [\n\t\t\t\t\t/* @__PURE__ */ jsx(MailboxTable, {\n\t\t\t\t\t\tcollapsed: collapsed.inbox,\n\t\t\t\t\t\tmailboxType: \"inbox\",\n\t\t\t\t\t\tonSort: handleSort,\n\t\t\t\t\t\tonToggleCollapse: () => handleToggleCollapse(\"inbox\"),\n\t\t\t\t\t\toperations: channel.inbox.items,\n\t\t\t\t\t\tsort: sorts.inbox,\n\t\t\t\t\t\ttitle: \"Inbox\"\n\t\t\t\t\t}),\n\t\t\t\t\t/* @__PURE__ */ jsx(MailboxTable, {\n\t\t\t\t\t\tcollapsed: collapsed.outbox,\n\t\t\t\t\t\tmailboxType: \"outbox\",\n\t\t\t\t\t\tonSort: handleSort,\n\t\t\t\t\t\tonToggleCollapse: () => handleToggleCollapse(\"outbox\"),\n\t\t\t\t\t\toperations: channel.outbox.items,\n\t\t\t\t\t\tsort: sorts.outbox,\n\t\t\t\t\t\ttitle: \"Outbox\"\n\t\t\t\t\t}),\n\t\t\t\t\t/* @__PURE__ */ jsx(MailboxTable, {\n\t\t\t\t\t\tcollapsed: collapsed.deadLetter,\n\t\t\t\t\t\tmailboxType: \"deadLetter\",\n\t\t\t\t\t\tonSort: handleSort,\n\t\t\t\t\t\tonToggleCollapse: () => handleToggleCollapse(\"deadLetter\"),\n\t\t\t\t\t\toperations: channel.deadLetter.items,\n\t\t\t\t\t\tsort: sorts.deadLetter,\n\t\t\t\t\t\ttitle: \"Dead Letter\"\n\t\t\t\t\t})\n\t\t\t\t]\n\t\t\t})\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/remotes-inspector/remotes-inspector.tsx\nconst BASE_COLUMNS = [\n\t{\n\t\tkey: \"id\",\n\t\tlabel: \"ID\",\n\t\twidth: \"120px\"\n\t},\n\t{\n\t\tkey: \"name\",\n\t\tlabel: \"Name\",\n\t\twidth: \"150px\"\n\t},\n\t{\n\t\tkey: \"status\",\n\t\tlabel: \"Status\",\n\t\twidth: \"120px\"\n\t},\n\t{\n\t\tkey: \"collectionId\",\n\t\tlabel: \"Collection ID\",\n\t\twidth: \"200px\"\n\t},\n\t{\n\t\tkey: \"filter\",\n\t\tlabel: \"Filter\",\n\t\twidth: \"200px\"\n\t},\n\t{\n\t\tkey: \"channel\",\n\t\tlabel: \"Channel\",\n\t\twidth: \"100px\"\n\t}\n];\nconst ACTIONS_COLUMN = {\n\tkey: \"actions\",\n\tlabel: \"Actions\",\n\twidth: \"100px\"\n};\nfunction formatFilter(filter) {\n\tconst parts = [];\n\tif (filter.branch) parts.push(`branch:${filter.branch}`);\n\tif (filter.documentId.length > 0) parts.push(`${filter.documentId.length} doc(s)`);\n\tif (filter.scope.length > 0) parts.push(`${filter.scope.length} scope(s)`);\n\treturn parts.length > 0 ? parts.join(\", \") : \"-\";\n}\nfunction sortRemotes(remotes, sort) {\n\tif (!sort) return remotes;\n\treturn [...remotes].sort((a, b) => {\n\t\tlet aValue;\n\t\tlet bValue;\n\t\tswitch (sort.column) {\n\t\t\tcase \"id\":\n\t\t\t\taValue = a.id;\n\t\t\t\tbValue = b.id;\n\t\t\t\tbreak;\n\t\t\tcase \"name\":\n\t\t\t\taValue = a.name;\n\t\t\t\tbValue = b.name;\n\t\t\t\tbreak;\n\t\t\tcase \"collectionId\":\n\t\t\t\taValue = a.collectionId;\n\t\t\t\tbValue = b.collectionId;\n\t\t\t\tbreak;\n\t\t\tcase \"filter\":\n\t\t\t\taValue = formatFilter(a.filter);\n\t\t\t\tbValue = formatFilter(b.filter);\n\t\t\t\tbreak;\n\t\t\tdefault: return 0;\n\t\t}\n\t\tconst comparison = aValue.localeCompare(bValue);\n\t\treturn sort.direction === \"asc\" ? comparison : -comparison;\n\t});\n}\nfunction RemotesInspector({ getRemotes, removeRemote, connectionStates }) {\n\tconst [remotes, setRemotes] = useState([]);\n\tconst [loading, setLoading] = useState(true);\n\tconst [sort, setSort] = useState();\n\tconst [selectedRemote, setSelectedRemote] = useState();\n\tconst columns = useMemo(() => removeRemote ? [...BASE_COLUMNS, ACTIONS_COLUMN] : BASE_COLUMNS, [removeRemote]);\n\tconst loadRemotes = useCallback(async () => {\n\t\tsetLoading(true);\n\t\tsetRemotes(await getRemotes());\n\t\tsetLoading(false);\n\t}, [getRemotes]);\n\tuseEffect(() => {\n\t\tloadRemotes();\n\t}, [loadRemotes]);\n\tconst handleRefresh = useCallback(async () => {\n\t\tawait loadRemotes();\n\t\tif (selectedRemote) setSelectedRemote(remotes.find((r) => r.id === selectedRemote.id));\n\t}, [\n\t\tloadRemotes,\n\t\tselectedRemote,\n\t\tremotes\n\t]);\n\tconst handleSort = (columnKey) => {\n\t\tif (columnKey === \"channel\" || columnKey === \"actions\" || columnKey === \"status\") return;\n\t\tsetSort({\n\t\t\tcolumn: columnKey,\n\t\t\tdirection: sort?.column === columnKey && sort.direction === \"asc\" ? \"desc\" : \"asc\"\n\t\t});\n\t};\n\tconst handleViewChannel = (remote) => {\n\t\tsetSelectedRemote(remote);\n\t};\n\tconst handleRemove = useCallback(async (remote) => {\n\t\tif (!removeRemote) return;\n\t\tawait removeRemote(remote.name);\n\t\tawait loadRemotes();\n\t\tif (selectedRemote?.id === remote.id) setSelectedRemote(void 0);\n\t}, [\n\t\tremoveRemote,\n\t\tloadRemotes,\n\t\tselectedRemote\n\t]);\n\tconst handleBack = () => {\n\t\tsetSelectedRemote(void 0);\n\t};\n\tif (selectedRemote) return /* @__PURE__ */ jsx(ChannelInspector, {\n\t\tchannel: selectedRemote.channel,\n\t\tconnectionState: connectionStates?.get(selectedRemote.name),\n\t\tonBack: handleBack,\n\t\tonRefresh: () => void handleRefresh(),\n\t\tremoteName: selectedRemote.name\n\t});\n\tconst sortedRemotes = sortRemotes(remotes, sort);\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex h-full flex-col gap-2\",\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex shrink-0 items-center justify-between\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"h2\", {\n\t\t\t\t\tclassName: \"text-lg font-semibold text-gray-900\",\n\t\t\t\t\tchildren: \"Remotes Inspector\"\n\t\t\t\t}), /* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\tclassName: \"flex items-center gap-1 rounded border border-gray-300 bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100 disabled:opacity-50\",\n\t\t\t\t\tdisabled: loading,\n\t\t\t\t\tonClick: () => void handleRefresh(),\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\tname: \"Reload\",\n\t\t\t\t\t\tsize: 14\n\t\t\t\t\t}), \"Refresh\"]\n\t\t\t\t})]\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"max-h-full overflow-auto rounded-lg border border-gray-300\",\n\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"table\", {\n\t\t\t\t\tclassName: \"w-full border-collapse\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"thead\", {\n\t\t\t\t\t\tclassName: \"sticky top-0 bg-gray-100\",\n\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"tr\", { children: columns.map((column, index) => {\n\t\t\t\t\t\t\tconst isActive = sort?.column === column.key;\n\t\t\t\t\t\t\tconst sortDirection = isActive ? sort.direction : \"asc\";\n\t\t\t\t\t\t\tconst isSortable = column.key !== \"channel\" && column.key !== \"actions\" && column.key !== \"status\";\n\t\t\t\t\t\t\treturn /* @__PURE__ */ jsx(\"th\", {\n\t\t\t\t\t\t\t\tclassName: twMerge(\"group px-3 py-2 text-left text-xs font-medium text-gray-600\", index > 0 && \"border-l border-gray-300\", isSortable && \"cursor-pointer hover:bg-gray-200 hover:text-gray-900\"),\n\t\t\t\t\t\t\t\tonClick: () => isSortable && handleSort(column.key),\n\t\t\t\t\t\t\t\tstyle: { width: column.width },\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1\",\n\t\t\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\t\tclassName: \"truncate\",\n\t\t\t\t\t\t\t\t\t\tchildren: column.label\n\t\t\t\t\t\t\t\t\t}), isSortable && /* @__PURE__ */ jsx(SortIcon, {\n\t\t\t\t\t\t\t\t\t\tactive: isActive,\n\t\t\t\t\t\t\t\t\t\tdirection: sortDirection\n\t\t\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}, column.key);\n\t\t\t\t\t\t}) })\n\t\t\t\t\t}), /* @__PURE__ */ jsx(\"tbody\", { children: loading && sortedRemotes.length === 0 ? /* @__PURE__ */ jsx(\"tr\", { children: /* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\tclassName: \"px-3 py-8 text-center text-sm text-gray-500\",\n\t\t\t\t\t\tcolSpan: columns.length,\n\t\t\t\t\t\tchildren: \"Loading...\"\n\t\t\t\t\t}) }) : sortedRemotes.length === 0 ? /* @__PURE__ */ jsx(\"tr\", { children: /* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\tclassName: \"px-3 py-8 text-center text-sm text-gray-500\",\n\t\t\t\t\t\tcolSpan: columns.length,\n\t\t\t\t\t\tchildren: \"No remotes configured\"\n\t\t\t\t\t}) }) : sortedRemotes.map((remote) => /* @__PURE__ */ jsxs(\"tr\", {\n\t\t\t\t\t\tclassName: \"odd:bg-white even:bg-gray-50 hover:bg-blue-50\",\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"block truncate\",\n\t\t\t\t\t\t\t\t\ttitle: remote.id,\n\t\t\t\t\t\t\t\t\tchildren: truncateId(remote.id)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"block truncate\",\n\t\t\t\t\t\t\t\t\ttitle: remote.name,\n\t\t\t\t\t\t\t\t\tchildren: remote.name\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2\",\n\t\t\t\t\t\t\t\tchildren: connectionStates?.get(remote.name) ? /* @__PURE__ */ jsx(ConnectionStateBadge, {\n\t\t\t\t\t\t\t\t\tfailureCount: connectionStates.get(remote.name).failureCount,\n\t\t\t\t\t\t\t\t\tstate: connectionStates.get(remote.name).state\n\t\t\t\t\t\t\t\t}) : /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"text-xs text-gray-400\",\n\t\t\t\t\t\t\t\t\tchildren: \"-\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"block truncate\",\n\t\t\t\t\t\t\t\t\ttitle: remote.collectionId,\n\t\t\t\t\t\t\t\t\tchildren: remote.collectionId\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2 text-xs text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"block truncate\",\n\t\t\t\t\t\t\t\t\ttitle: formatFilter(remote.filter),\n\t\t\t\t\t\t\t\t\tchildren: formatFilter(remote.filter)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\t\t\t\t\tclassName: \"flex items-center gap-1 rounded bg-blue-50 px-2 py-1 text-xs text-blue-700 hover:bg-blue-100\",\n\t\t\t\t\t\t\t\t\tonClick: () => handleViewChannel(remote),\n\t\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\t\tchildren: [\"View\", /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\t\t\t\tname: \"CaretRight\",\n\t\t\t\t\t\t\t\t\t\tsize: 12\n\t\t\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tremoveRemote && /* @__PURE__ */ jsx(\"td\", {\n\t\t\t\t\t\t\t\tclassName: \"border-l border-gray-300 px-3 py-2\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\t\tclassName: \"rounded bg-red-50 px-2 py-1 text-xs text-red-700 hover:bg-red-100\",\n\t\t\t\t\t\t\t\t\tonClick: () => void handleRemove(remote),\n\t\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\t\tchildren: \"Remove\"\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t]\n\t\t\t\t\t}, remote.id)) })]\n\t\t\t\t})\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"shrink-0 text-sm text-gray-600\",\n\t\t\t\tchildren: [\n\t\t\t\t\t\"Showing \",\n\t\t\t\t\tsortedRemotes.length,\n\t\t\t\t\t\" remote(s)\"\n\t\t\t\t]\n\t\t\t})\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/modal/inspector-modal/inspector-modal.tsx\nfunction InspectorModal({ open, onOpenChange, modalProps, containerProps, dbExplorerProps, remotesInspectorProps, queueInspectorProps, processorsInspectorProps, integrityInspectorProps, defaultTab = \"Database\" }) {\n\treturn /* @__PURE__ */ jsx(Modal, {\n\t\t...modalProps,\n\t\tcontentProps: {\n\t\t\tclassName: \"rounded-2xl\",\n\t\t\tstyle: {\n\t\t\t\theight: \"90vh\",\n\t\t\t\twidth: \"90vw\",\n\t\t\t\tmaxWidth: \"1400px\"\n\t\t\t}\n\t\t},\n\t\tonOpenChange,\n\t\topen,\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t...containerProps,\n\t\t\tclassName: twMerge(\"flex h-full w-full flex-col\", containerProps?.className),\n\t\t\tchildren: [/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"flex shrink-0 items-center justify-end px-3 pt-3\",\n\t\t\t\tchildren: /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\tclassName: \"flex size-6 cursor-pointer items-center justify-center rounded-md text-gray-500 outline-none hover:text-gray-900\",\n\t\t\t\t\tonClick: () => onOpenChange(false),\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\tname: \"XmarkLight\",\n\t\t\t\t\t\tsize: 24\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}), /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"flex min-h-0 flex-1 flex-col overflow-hidden px-3 pb-3\",\n\t\t\t\tchildren: /* @__PURE__ */ jsxs(Tabs, {\n\t\t\t\t\tdefaultValue: defaultTab,\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t/* @__PURE__ */ jsx(TabContent, {\n\t\t\t\t\t\t\tdescription: \"Database explorer\",\n\t\t\t\t\t\t\tlabel: \"Database\",\n\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\t\t\tclassName: \"h-full\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(DBExplorer, { ...dbExplorerProps })\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t/* @__PURE__ */ jsx(TabContent, {\n\t\t\t\t\t\t\tdescription: \"Remotes inspector\",\n\t\t\t\t\t\t\tlabel: \"Remotes\",\n\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\t\t\tclassName: \"h-full\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(RemotesInspector, { ...remotesInspectorProps })\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tqueueInspectorProps && /* @__PURE__ */ jsx(TabContent, {\n\t\t\t\t\t\t\tdescription: \"Queue inspector\",\n\t\t\t\t\t\t\tlabel: \"Queue\",\n\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\t\t\tclassName: \"h-full\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(QueueInspector, { ...queueInspectorProps })\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tprocessorsInspectorProps && /* @__PURE__ */ jsx(TabContent, {\n\t\t\t\t\t\t\tdescription: \"Processors inspector\",\n\t\t\t\t\t\t\tlabel: \"Processors\",\n\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\t\t\tclassName: \"h-full\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(ProcessorsInspector, { ...processorsInspectorProps })\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tintegrityInspectorProps && /* @__PURE__ */ jsx(TabContent, {\n\t\t\t\t\t\t\tdescription: \"Integrity inspector\",\n\t\t\t\t\t\t\tlabel: \"Integrity\",\n\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\t\t\tclassName: \"h-full\",\n\t\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(IntegrityInspector, { ...integrityInspectorProps })\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t})\n\t\t\t\t\t]\n\t\t\t\t})\n\t\t\t})]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/modal/missing-package-modal.tsx\nconst buttonStyles$2 = \"min-h-[36px] text-sm font-semibold py-2 px-4 rounded-xl outline-none active:opacity-75 hover:scale-105 transform transition-all\";\nfunction groupByPackage(installations) {\n\tconst groups = /* @__PURE__ */ new Map();\n\tfor (const item of installations) {\n\t\tconst existing = groups.get(item.packageName) ?? [];\n\t\texisting.push(item.documentType);\n\t\tgroups.set(item.packageName, existing);\n\t}\n\treturn Array.from(groups.entries()).map(([packageName, documentTypes]) => ({\n\t\tpackageName,\n\t\tdocumentTypes\n\t}));\n}\nfunction PackageInstallModal(props) {\n\tconst { pendingInstallations, onInstall, onDismiss, open, onOpenChange, overlayProps, contentProps, ...restProps } = props;\n\tconst [installingPackages, setInstallingPackages] = useState(() => /* @__PURE__ */ new Set());\n\tconst grouped = groupByPackage(pendingInstallations);\n\tasync function handleInstall(packageName) {\n\t\tsetInstallingPackages((prev) => new Set(prev).add(packageName));\n\t\ttry {\n\t\t\tawait onInstall(packageName);\n\t\t} finally {\n\t\t\tsetInstallingPackages((prev) => {\n\t\t\t\tconst next = new Set(prev);\n\t\t\t\tnext.delete(packageName);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t}\n\t}\n\tif (grouped.length === 0) return null;\n\treturn /* @__PURE__ */ jsx(Modal, {\n\t\topen: open ?? grouped.length > 0,\n\t\tonOpenChange: (isOpen) => {\n\t\t\tif (!isOpen) for (const { packageName } of grouped) onDismiss(packageName);\n\t\t\tonOpenChange?.(isOpen);\n\t\t},\n\t\tcontentProps: {\n\t\t\t...contentProps,\n\t\t\tclassName: twMerge(\"rounded-3xl\", contentProps?.className)\n\t\t},\n\t\toverlayProps: {\n\t\t\t...overlayProps,\n\t\t\tclassName: overlayProps?.className\n\t\t},\n\t\t...restProps,\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"w-[460px] p-6 text-slate-300\",\n\t\t\tchildren: [\n\t\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"border-b border-slate-50 pb-2 text-2xl font-bold text-gray-800\",\n\t\t\t\t\tchildren: grouped.length === 1 ? \"Package Required\" : \"Packages Required\"\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"my-4 text-sm text-gray-600\",\n\t\t\t\t\tchildren: grouped.length === 1 ? \"A document requires a package that is not installed.\" : \"Documents require packages that are not installed.\"\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"flex flex-col gap-3\",\n\t\t\t\t\tchildren: grouped.map(({ packageName, documentTypes }) => {\n\t\t\t\t\t\tconst installing = installingPackages.has(packageName);\n\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\tclassName: \"rounded-xl bg-slate-50 p-4\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\t\t\t\tclassName: \"mb-1 text-sm font-semibold text-gray-800\",\n\t\t\t\t\t\t\t\t\tchildren: packageName\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\t\t\tclassName: \"mb-3 text-xs text-gray-500\",\n\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\"Required for document type\",\n\t\t\t\t\t\t\t\t\t\tdocumentTypes.length > 1 ? \"s\" : \"\",\n\t\t\t\t\t\t\t\t\t\t\":\",\n\t\t\t\t\t\t\t\t\t\t\" \",\n\t\t\t\t\t\t\t\t\t\tdocumentTypes.join(\", \")\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\t\t\tclassName: \"flex justify-end gap-2\",\n\t\t\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\t\t\tonClick: () => onDismiss(packageName),\n\t\t\t\t\t\t\t\t\t\tdisabled: installing,\n\t\t\t\t\t\t\t\t\t\tclassName: twMerge(buttonStyles$2, \"border border-slate-200 bg-white text-slate-800\", installing && \"cursor-not-allowed opacity-50\"),\n\t\t\t\t\t\t\t\t\t\tchildren: \"Dismiss\"\n\t\t\t\t\t\t\t\t\t}), /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\t\t\tonClick: () => void handleInstall(packageName),\n\t\t\t\t\t\t\t\t\t\tdisabled: installing,\n\t\t\t\t\t\t\t\t\t\tclassName: twMerge(buttonStyles$2, \"bg-gray-800 text-gray-50\", installing && \"cursor-not-allowed opacity-50\"),\n\t\t\t\t\t\t\t\t\t\tchildren: installing ? \"Installing...\" : \"Install\"\n\t\t\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}, packageName);\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/modal/read-required-modal.tsx\nconst buttonStyles$1 = \"min-h-[48px] min-w-[142px] text-base font-semibold py-3 px-6 rounded-xl outline-none active:opacity-75 hover:scale-105 transform transition-all\";\nfunction ReadRequiredModal(props) {\n\tconst { body, header, children, onOpenChange, onContinue, closeLabel, overlayProps, contentProps, bodyProps = {}, headerProps = {}, containerProps = {}, continueButtonProps = {}, buttonContainerProps = {}, ...restProps } = props;\n\tconst [disableClose, setDisableClose] = useState(true);\n\tconst contentRef = useRef(null);\n\tuseEffect(() => {\n\t\tconst checkScroll = () => {\n\t\t\tconst element = contentRef.current;\n\t\t\tif (element) if (element.scrollHeight > element.clientHeight) {\n\t\t\t\tsetDisableClose(true);\n\t\t\t\telement.addEventListener(\"scroll\", handleScroll);\n\t\t\t} else setDisableClose(false);\n\t\t};\n\t\tconst handleScroll = () => {\n\t\t\tconst element = contentRef.current;\n\t\t\tif (element && element.scrollHeight - Math.ceil(element.scrollTop) === element.clientHeight) setDisableClose(false);\n\t\t};\n\t\trequestAnimationFrame(checkScroll);\n\t\treturn () => {\n\t\t\tconst element = contentRef.current;\n\t\t\tif (element) element.removeEventListener(\"scroll\", handleScroll);\n\t\t};\n\t}, []);\n\treturn /* @__PURE__ */ jsx(Modal, {\n\t\tcontentProps: {\n\t\t\t...contentProps,\n\t\t\tclassName: twMerge(\"rounded-3xl outline-none\", contentProps?.className)\n\t\t},\n\t\tonOpenChange,\n\t\toverlayProps: {\n\t\t\t...overlayProps,\n\t\t\tclassName: overlayProps?.className\n\t\t},\n\t\t...restProps,\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t...mergeClassNameProps(containerProps, \"w-[500px] p-6 text-slate-300\"),\n\t\t\tchildren: [\n\t\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t...mergeClassNameProps(headerProps, \"border-b border-slate-50 pb-2 text-2xl font-bold text-gray-800\"),\n\t\t\t\t\tchildren: header\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tref: contentRef,\n\t\t\t\t\t...mergeClassNameProps(bodyProps, \"my-6 max-h-[245px] overflow-scroll rounded-md bg-slate-50 p-4 text-center\"),\n\t\t\t\t\tchildren: [body, children]\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t...mergeClassNameProps(buttonContainerProps, \"mt-8 flex justify-between gap-3\"),\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\tdisabled: disableClose,\n\t\t\t\t\t\tonClick: onContinue,\n\t\t\t\t\t\t...mergeClassNameProps(continueButtonProps, twMerge(buttonStyles$1, \"flex-1 bg-gray-800 text-gray-50\", disableClose && \"cursor-not-allowed bg-gray-300 hover:scale-100\")),\n\t\t\t\t\t\tchildren: closeLabel\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/modal/settings-modal/dependency-versions/dependency-versions.tsx\nconst PH_DEPENDENCIES = [\n\t/^@powerhousedao\\/.+$/,\n\t\"document-drive\",\n\t\"document-model\"\n];\nfunction verifyPackageJsonFields(packageJson) {\n\ttry {\n\t\tconst parsed = packageJson;\n\t\treturn {\n\t\t\tversion: parsed.version || \"Missing version field in package.json\",\n\t\t\tdependencies: Object.fromEntries(Object.entries({\n\t\t\t\t...parsed.dependencies,\n\t\t\t\t...parsed.devDependencies,\n\t\t\t\t...parsed.peerDependencies\n\t\t\t}).filter(([key]) => PH_DEPENDENCIES.some((regexOrName) => typeof regexOrName === \"string\" ? regexOrName === key : regexOrName.test(key))))\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(error);\n\t\treturn false;\n\t}\n}\nfunction DependencyVersions(props) {\n\tconst [isOpen, setIsOpen] = useState(false);\n\tconst { packageJson, phCliVersion } = props;\n\tconst validatedData = verifyPackageJsonFields(packageJson);\n\tif (!validatedData) {\n\t\tconsole.error(\"Failed to validate package.json data\");\n\t\treturn null;\n\t}\n\treturn /* @__PURE__ */ jsx(Disclosure, {\n\t\tisOpen,\n\t\tonOpenChange: () => setIsOpen(!isOpen),\n\t\ttitle: `App version: ${validatedData.version}`,\n\t\ttoggleClassName: \"text-gray-900 text-sm\",\n\t\tchildren: /* @__PURE__ */ jsxs(\"ul\", {\n\t\t\tclassName: \"text-sm text-gray-600\",\n\t\t\tchildren: [Object.entries(validatedData.dependencies).map(([dep, version]) => /* @__PURE__ */ jsxs(\"li\", {\n\t\t\t\tclassName: \"my-1 flex justify-between pr-1\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsxs(\"span\", { children: [dep.replace(\"@powerhousedao/\", \"\"), \":\"] }), /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\tclassName: \"font-normal\",\n\t\t\t\t\tchildren: version\n\t\t\t\t})]\n\t\t\t}, dep)), phCliVersion && /* @__PURE__ */ jsxs(\"li\", {\n\t\t\t\tclassName: \"my-1 flex justify-between pr-1\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"span\", { children: \"@powerhousedao/ph-cli:\" }), /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\tclassName: \"font-normal\",\n\t\t\t\t\tchildren: phCliVersion\n\t\t\t\t})]\n\t\t\t}, \"ph-cli\")]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/modal/settings-modal-v2/about.tsx\nfunction About(props) {\n\tconst { packageJson, phCliVersion } = props;\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"bg-white p-3\",\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(\"h2\", {\n\t\t\t\tclassName: \"font-semibold\",\n\t\t\t\tchildren: \"About\"\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"p\", {\n\t\t\t\tclassName: \"text-sm font-normal text-gray-600\",\n\t\t\t\tchildren: \"Connect is the hub for your most important documents and processes translated into software. Easily capture data in a structured way with Connect.\"\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"my-4\",\n\t\t\t\tchildren: /* @__PURE__ */ jsx(DependencyVersions, {\n\t\t\t\t\tpackageJson,\n\t\t\t\t\tphCliVersion\n\t\t\t\t})\n\t\t\t})\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/modal/settings-modal-v2/danger-zone.tsx\nfunction getDriveSharingType(drive) {\n\tif (typeof drive !== \"object\") return \"LOCAL\";\n\tconst { sharingType: _sharingType } = !(\"readContext\" in drive) ? drive.state.local : { sharingType: \"PUBLIC\" };\n\tconst __sharingType = _sharingType?.toUpperCase();\n\treturn !__sharingType || __sharingType === \"PRIVATE\" || ![\n\t\t\"LOCAL\",\n\t\t\"CLOUD\",\n\t\t\"PUBLIC\"\n\t].includes(__sharingType) ? \"LOCAL\" : __sharingType;\n}\nfunction DangerZone(props) {\n\tconst { className, ...rest } = props;\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: cn(\"h-full rounded-lg bg-white p-3\", className),\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(\"h2\", {\n\t\t\t\tclassName: \"mb-4 font-semibold\",\n\t\t\t\tchildren: \"Modify Drives\"\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(ModifyDrives, { ...rest }),\n\t\t\t/* @__PURE__ */ jsx(\"h2\", {\n\t\t\t\tclassName: \"my-4 font-semibold\",\n\t\t\t\tchildren: \"Local Storage\"\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(LocalStorage, { ...rest })\n\t\t]\n\t});\n}\nfunction ModifyDrives(props) {\n\tconst { className, ...rest } = props;\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName,\n\t\tchildren: /* @__PURE__ */ jsx(DriveList, { ...rest })\n\t});\n}\nfunction DriveList(props) {\n\tconst { className, ...rest } = props;\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName,\n\t\tchildren: props.drives.map((drive) => /* @__PURE__ */ jsx(Drive, {\n\t\t\tdrive,\n\t\t\t...rest\n\t\t}, drive.header.id))\n\t});\n}\nfunction Drive(props) {\n\tconst { drive, className, onDeleteDrive } = props;\n\tconst [isDropdownMenuOpen, setIsDropdownMenuOpen] = useState(false);\n\tconst localDriveIcon = /* @__PURE__ */ jsx(Icon, {\n\t\tname: \"Hdd\",\n\t\tsize: 16,\n\t\tclassName: \"flex-none\"\n\t});\n\tconst cloudDriveIcon = /* @__PURE__ */ jsx(Icon, {\n\t\tname: \"Server\",\n\t\tsize: 16,\n\t\tclassName: \"flex-none\"\n\t});\n\tconst publicDriveIcon = drive.state.global.icon ? /* @__PURE__ */ jsx(\"img\", {\n\t\talt: \"drive icon\",\n\t\tclassName: \"size-4 flex-none object-contain\",\n\t\tsrc: drive.state.global.icon\n\t}) : /* @__PURE__ */ jsx(Icon, {\n\t\tname: \"Server\",\n\t\tsize: 16,\n\t\tclassName: \"flex-none\"\n\t});\n\tfunction getNodeIcon() {\n\t\tconst sharingType = getDriveSharingType(drive);\n\t\tif (sharingType === \"PUBLIC\") return publicDriveIcon;\n\t\tif (sharingType === \"CLOUD\") return cloudDriveIcon;\n\t\treturn localDriveIcon;\n\t}\n\tconst icon = getNodeIcon();\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: cn(\"mb-4 flex w-96 items-center gap-2 rounded-md border border-gray-200 bg-gray-50 px-3 py-2 shadow-sm last-of-type:mb-0\", className),\n\t\tchildren: [\n\t\t\ticon,\n\t\t\t/* @__PURE__ */ jsxs(\"div\", { children: [/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\tclassName: \"block text-sm font-medium leading-[18px]\",\n\t\t\t\tchildren: capitalCase(drive.header.name)\n\t\t\t}), /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex items-baseline gap-x-2 leading-[18px]\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsxs(\"span\", {\n\t\t\t\t\tclassName: \"text-sm text-gray-600\",\n\t\t\t\t\tchildren: [capitalCase(getDriveSharingType(drive)), \" App\"]\n\t\t\t\t}), /* @__PURE__ */ jsxs(\"a\", {\n\t\t\t\t\thref: \"https://www.powerhouse.inc/\",\n\t\t\t\t\ttarget: \"_blank\",\n\t\t\t\t\trel: \"noopener noreferrer\",\n\t\t\t\t\tclassName: \"group flex items-center gap-x-2 text-sm text-slate-500 transition-colors hover:text-[#9896FF]\",\n\t\t\t\t\tchildren: [\"By Powerhouse\", /* @__PURE__ */ jsx(\"svg\", {\n\t\t\t\t\t\txmlns: \"http://www.w3.org/2000/svg\",\n\t\t\t\t\t\tviewBox: \"0 0 12 12\",\n\t\t\t\t\t\tclassName: \"size-4 text-gray-400 transition-colors group-hover:text-inherit\",\n\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"path\", {\n\t\t\t\t\t\t\td: \"M7.99365 11.9939C9.46632 11.9939 10.6603 10.7999 10.6603 9.32722V7.32722C10.6603 6.95922 10.3617 6.66056 9.99365 6.66056C9.62565 6.66056 9.32699 6.95922 9.32699 7.32722V9.32722C9.32699 10.0639 8.73032 10.6606 7.99365 10.6606H2.66032C1.92365 10.6606 1.32699 10.0639 1.32699 9.32722V3.99389C1.32699 3.25723 1.92365 2.66056 2.66032 2.66056H4.66032C5.02832 2.66056 5.32699 2.36189 5.32699 1.99389C5.32699 1.6259 5.02832 1.32723 4.66032 1.32723H2.66032C1.18765 1.32723 -0.00634766 2.52123 -0.00634766 3.99389V9.32722C-0.00634766 10.7999 1.18765 11.9939 2.66032 11.9939H7.99365ZM5.32699 7.32722C5.49765 7.32722 5.67565 7.26989 5.80632 7.13989L10.1396 2.80656L11.9937 4.66056V-0.00610352H7.32699L9.18099 1.8479L4.84766 6.18123C4.58766 6.4419 4.58766 6.87922 4.84766 7.13989C4.97832 7.26989 5.15632 7.32722 5.32699 7.32722Z\",\n\t\t\t\t\t\t\tfill: \"currentColor\"\n\t\t\t\t\t\t})\n\t\t\t\t\t})]\n\t\t\t\t})]\n\t\t\t})] }),\n\t\t\t/* @__PURE__ */ jsx(ConnectDropdownMenu, {\n\t\t\t\titems: [{\n\t\t\t\t\tid: \"delete-drive\",\n\t\t\t\t\tlabel: \"Delete\",\n\t\t\t\t\ticon: /* @__PURE__ */ jsx(Icon, { name: \"Trash\" }),\n\t\t\t\t\tclassName: \"text-red-900\"\n\t\t\t\t}],\n\t\t\t\tonItemClick: (id) => {\n\t\t\t\t\tif (id === \"delete-drive\") onDeleteDrive(drive);\n\t\t\t\t},\n\t\t\t\tonOpenChange: setIsDropdownMenuOpen,\n\t\t\t\topen: isDropdownMenuOpen,\n\t\t\t\tchildren: /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\tclassName: \"group ml-auto flex-none\",\n\t\t\t\t\tonClick: (e) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tsetIsDropdownMenuOpen(true);\n\t\t\t\t\t},\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\tclassName: \"text-gray-600 group-hover:text-gray-900\",\n\t\t\t\t\t\tname: \"VerticalDots\",\n\t\t\t\t\t\tsize: 16\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t})\n\t\t]\n\t});\n}\nfunction LocalStorage(props) {\n\tconst { onClearStorage } = props;\n\treturn /* @__PURE__ */ jsx(\"div\", { children: /* @__PURE__ */ jsxs(\"button\", {\n\t\tclassName: \"flex items-center gap-x-2 rounded-md border border-gray-300 bg-transparent px-3 py-1 text-sm font-medium text-red-900 transition-colors hover:bg-gray-100\",\n\t\tonClick: onClearStorage,\n\t\tchildren: [\"Clear Storage \", /* @__PURE__ */ jsx(Icon, {\n\t\t\tname: \"Trash\",\n\t\t\tsize: 16\n\t\t})]\n\t}) });\n}\n//#endregion\n//#region src/connect/components/modal/settings-modal-v2/default-editor.tsx\nfunction DefaultEditor(props) {\n\tconst { className, ...rest } = props;\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName: twMerge(\"rounded-lg p-3\", className),\n\t\tchildren: /* @__PURE__ */ jsx(DefaultEditorSelect, { ...rest })\n\t});\n}\nfunction DefaultEditorSelect(props) {\n\tconst { documentModelEditor, setDocumentModelEditor, documentModelEditorOptions, className } = props;\n\treturn /* @__PURE__ */ jsxs(\"div\", { children: [/* @__PURE__ */ jsx(\"h3\", {\n\t\tclassName: \"mb-4 font-semibold text-gray-900\",\n\t\tchildren: \"Default Editor Selection\"\n\t}), /* @__PURE__ */ jsx(SelectFieldRaw, {\n\t\tclassName: twMerge(\"min-w-36 max-w-fit\", className),\n\t\tname: \"default-editor\",\n\t\trequired: true,\n\t\tvalue: documentModelEditor,\n\t\toptions: documentModelEditorOptions,\n\t\tmultiple: false,\n\t\tonChange: (value) => setDocumentModelEditor(value)\n\t})] });\n}\n//#endregion\n//#region src/connect/components/modal/settings-modal-v2/package-manager/parse-package-spec.ts\n/**\n* Parse a package specifier into a bare name and an optional tag/version.\n*\n* - Scoped names split on the LAST `@` (since the name itself starts with\n* `@scope/`): `@scope/pkg@dev` → `{ name: \"@scope/pkg\", tag: \"dev\" }`.\n* - Unscoped names split on the first `@`: `pkg@1.2.3` →\n* `{ name: \"pkg\", tag: \"1.2.3\" }`.\n* - A bare name (no separator) returns `{ name, tag: undefined }`.\n* - Trailing/leading whitespace is trimmed; an empty tag (e.g. \"pkg@\")\n* is treated as missing.\n*/\nfunction parsePackageSpec(spec) {\n\tconst trimmed = spec.trim();\n\tif (trimmed.length === 0) return {\n\t\tname: \"\",\n\t\ttag: void 0\n\t};\n\tconst splitAt = trimmed.startsWith(\"@\") ? trimmed.lastIndexOf(\"@\") : trimmed.indexOf(\"@\");\n\tif (splitAt > 0) {\n\t\tconst name = trimmed.slice(0, splitAt);\n\t\tconst tag = trimmed.slice(splitAt + 1);\n\t\treturn {\n\t\t\tname,\n\t\t\ttag: tag.length > 0 ? tag : void 0\n\t\t};\n\t}\n\treturn {\n\t\tname: trimmed,\n\t\ttag: void 0\n\t};\n}\n/**\n* Compose a spec string from a name and optional tag/version. Used by\n* callers that want to re-serialize what `parsePackageSpec` parsed.\n*/\nfunction buildPackageSpec(name, tag) {\n\treturn tag ? `${name}@${tag}` : name;\n}\n//#endregion\n//#region src/connect/components/modal/settings-modal-v2/package-manager/version-picker.tsx\nfunction resolveDefaultVersionSelection(options) {\n\tconst { distTags, versions, version, preferredTag } = options;\n\tif (preferredTag && distTags && preferredTag in distTags) return {\n\t\tkind: \"tag\",\n\t\tvalue: preferredTag\n\t};\n\tif (distTags?.latest) return {\n\t\tkind: \"tag\",\n\t\tvalue: \"latest\"\n\t};\n\tconst firstTag = distTags ? Object.keys(distTags)[0] : void 0;\n\tif (firstTag) return {\n\t\tkind: \"tag\",\n\t\tvalue: firstTag\n\t};\n\tif (versions && versions.length > 0) return {\n\t\tkind: \"version\",\n\t\tvalue: versions[versions.length - 1]\n\t};\n\treturn {\n\t\tkind: \"tag\",\n\t\tvalue: version ?? \"latest\"\n\t};\n}\nconst VersionPicker = (props) => {\n\tconst { distTags, versions, selected, onChange, disabled, className } = props;\n\tconst [open, setOpen] = useState(false);\n\tconst [query, setQuery] = useState(\"\");\n\tconst tagEntries = useMemo(() => distTags ? Object.entries(distTags) : [], [distTags]);\n\tconst filteredTags = useMemo(() => {\n\t\tconst needle = query.trim().toLowerCase();\n\t\tif (!needle) return tagEntries;\n\t\treturn tagEntries.filter(([tag, ver]) => tag.toLowerCase().includes(needle) || ver.toLowerCase().includes(needle));\n\t}, [tagEntries, query]);\n\tconst filteredVersions = useMemo(() => {\n\t\tconst all = versions ?? [];\n\t\tconst needle = query.trim().toLowerCase();\n\t\tif (!needle) return all.slice().reverse();\n\t\treturn all.filter((v) => v.toLowerCase().includes(needle)).reverse();\n\t}, [versions, query]);\n\tconst hasAnyPickable = tagEntries.length > 0 || (versions?.length ?? 0) > 0;\n\tconst triggerLabel = selected.value;\n\treturn /* @__PURE__ */ jsxs(Popover, {\n\t\topen: open && !disabled,\n\t\tonOpenChange: (next) => {\n\t\t\tsetOpen(next);\n\t\t\tif (!next) setQuery(\"\");\n\t\t},\n\t\tchildren: [/* @__PURE__ */ jsxs(PopoverTrigger, {\n\t\t\tdisabled: disabled || !hasAnyPickable,\n\t\t\tclassName: cn(\"flex items-center justify-between gap-2 rounded-md border border-gray-300 bg-white px-2.5 py-1 text-xs font-medium text-gray-800 transition-colors\", \"hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-gray-900/20\", \"disabled:cursor-not-allowed disabled:opacity-60\", className),\n\t\t\t\"data-version-picker-trigger\": true,\n\t\t\tchildren: [/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\tclassName: \"truncate\",\n\t\t\t\tchildren: triggerLabel\n\t\t\t}), /* @__PURE__ */ jsx(Icon, {\n\t\t\t\tname: \"ChevronDown\",\n\t\t\t\tsize: 12,\n\t\t\t\tclassName: \"shrink-0 text-gray-500\"\n\t\t\t})]\n\t\t}), /* @__PURE__ */ jsxs(PopoverContent, {\n\t\t\t\"data-version-picker\": true,\n\t\t\talign: \"start\",\n\t\t\tsideOffset: 4,\n\t\t\tclassName: \"w-56 p-0\",\n\t\t\tonOpenAutoFocus: (e) => e.preventDefault(),\n\t\t\tchildren: [/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"border-b border-gray-200 p-2\",\n\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"relative\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\tname: \"Search\",\n\t\t\t\t\t\tsize: 14,\n\t\t\t\t\t\tclassName: \"absolute left-2 top-1/2 -translate-y-1/2 text-gray-400\"\n\t\t\t\t\t}), /* @__PURE__ */ jsx(Input, {\n\t\t\t\t\t\tvalue: query,\n\t\t\t\t\t\tonChange: (e) => setQuery(e.target.value),\n\t\t\t\t\t\tplaceholder: \"Search versions...\",\n\t\t\t\t\t\tclassName: \"h-8 pl-7 text-xs\"\n\t\t\t\t\t})]\n\t\t\t\t})\n\t\t\t}), /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"max-h-60 overflow-y-auto py-1\",\n\t\t\t\tchildren: [\n\t\t\t\t\tfilteredTags.length === 0 && filteredVersions.length === 0 && /* @__PURE__ */ jsx(\"p\", {\n\t\t\t\t\t\tclassName: \"px-3 py-4 text-center text-xs text-gray-500\",\n\t\t\t\t\t\tchildren: \"No matches.\"\n\t\t\t\t\t}),\n\t\t\t\t\tfilteredTags.length > 0 && /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\tclassName: \"pb-1\",\n\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"p\", {\n\t\t\t\t\t\t\tclassName: \"px-3 py-1 text-[11px] font-semibold uppercase tracking-wide text-gray-500\",\n\t\t\t\t\t\t\tchildren: \"Tags\"\n\t\t\t\t\t\t}), filteredTags.map(([tag, ver]) => {\n\t\t\t\t\t\t\treturn /* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\tonChange({\n\t\t\t\t\t\t\t\t\t\tkind: \"tag\",\n\t\t\t\t\t\t\t\t\t\tvalue: tag\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\t\t\t\tsetQuery(\"\");\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tclassName: cn(\"flex w-full items-center justify-between gap-2 px-3 py-1.5 text-left text-xs transition-colors\", \"hover:bg-gray-100\", selected.kind === \"tag\" && selected.value === tag && \"bg-gray-100 font-semibold\"),\n\t\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"truncate text-gray-900\",\n\t\t\t\t\t\t\t\t\tchildren: tag\n\t\t\t\t\t\t\t\t}), /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"truncate text-gray-500\",\n\t\t\t\t\t\t\t\t\tchildren: ver\n\t\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t\t}, `tag:${tag}`);\n\t\t\t\t\t\t})]\n\t\t\t\t\t}),\n\t\t\t\t\tfilteredVersions.length > 0 && /* @__PURE__ */ jsxs(\"div\", { children: [/* @__PURE__ */ jsx(\"p\", {\n\t\t\t\t\t\tclassName: \"px-3 py-1 text-[11px] font-semibold uppercase tracking-wide text-gray-500\",\n\t\t\t\t\t\tchildren: \"Versions\"\n\t\t\t\t\t}), filteredVersions.map((ver) => {\n\t\t\t\t\t\treturn /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\tonChange({\n\t\t\t\t\t\t\t\t\tkind: \"version\",\n\t\t\t\t\t\t\t\t\tvalue: ver\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\t\t\tsetQuery(\"\");\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tclassName: cn(\"flex w-full items-center px-3 py-1.5 text-left text-xs transition-colors\", \"hover:bg-gray-100\", selected.kind === \"version\" && selected.value === ver && \"bg-gray-100 font-semibold\"),\n\t\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\tclassName: \"truncate text-gray-900\",\n\t\t\t\t\t\t\t\tchildren: ver\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}, `ver:${ver}`);\n\t\t\t\t\t})] })\n\t\t\t\t]\n\t\t\t})]\n\t\t})]\n\t});\n};\n//#endregion\n//#region src/connect/components/modal/settings-modal-v2/package-manager/package-manager-input.tsx\nconst NPM_NAME_RE = /^@[a-z0-9][a-z0-9._-]*\\/[a-z0-9][a-z0-9._-]*$|^[a-z0-9][a-z0-9._-]*$/i;\nfunction isPlausiblePackageName(name) {\n\treturn name.length >= 2 && NPM_NAME_RE.test(name);\n}\nfunction PackageResultCard(props) {\n\tconst { option, ctx, typedTag } = props;\n\tconst { selectingValue, selectLabel, selectingContent, handleSelect } = ctx;\n\tconst baseName = option.label.split(\" @ \")[0] ?? option.value;\n\tconst hasVersionMetadata = option.distTags && Object.keys(option.distTags).length > 0 || (option.versions?.length ?? 0) > 0;\n\tconst [selected, setSelected] = useState(() => resolveDefaultVersionSelection({\n\t\tdistTags: option.distTags,\n\t\tversions: option.versions,\n\t\tversion: option.version,\n\t\tpreferredTag: typedTag\n\t}));\n\tuseEffect(() => {\n\t\tif (!typedTag) return;\n\t\tif (option.distTags && typedTag in option.distTags) setSelected({\n\t\t\tkind: \"tag\",\n\t\t\tvalue: typedTag\n\t\t});\n\t\telse if (option.versions?.includes(typedTag)) setSelected({\n\t\t\tkind: \"version\",\n\t\t\tvalue: typedTag\n\t\t});\n\t}, [\n\t\ttypedTag,\n\t\toption.distTags,\n\t\toption.versions\n\t]);\n\tconst installSpec = hasVersionMetadata ? buildPackageSpec(baseName, selected.value) : option.value;\n\tconst isSelecting = selectingValue === installSpec;\n\tconst isDisabled = option.disabled === true;\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex items-start justify-between gap-3 rounded-md px-2 py-2 hover:bg-gray-50\",\n\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"min-w-0 flex-1\",\n\t\t\tchildren: [\n\t\t\t\t/* @__PURE__ */ jsx(\"p\", {\n\t\t\t\t\tclassName: \"truncate text-sm font-medium text-gray-900\",\n\t\t\t\t\tchildren: baseName\n\t\t\t\t}),\n\t\t\t\toption.description && /* @__PURE__ */ jsx(\"p\", {\n\t\t\t\t\tclassName: \"truncate text-xs text-gray-500\",\n\t\t\t\t\tchildren: option.description\n\t\t\t\t}),\n\t\t\t\toption.meta && /* @__PURE__ */ jsx(\"p\", {\n\t\t\t\t\tclassName: \"truncate text-xs text-gray-400\",\n\t\t\t\t\tchildren: option.meta\n\t\t\t\t}),\n\t\t\t\thasVersionMetadata && /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"mt-2\",\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(VersionPicker, {\n\t\t\t\t\t\tdistTags: option.distTags,\n\t\t\t\t\t\tversions: option.versions,\n\t\t\t\t\t\tselected,\n\t\t\t\t\t\tonChange: setSelected,\n\t\t\t\t\t\tdisabled: isDisabled\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t]\n\t\t}), /* @__PURE__ */ jsx(\"div\", {\n\t\t\tclassName: \"shrink-0 self-center\",\n\t\t\tchildren: isSelecting && selectingContent ? /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"flex items-center justify-center\",\n\t\t\t\tchildren: selectingContent\n\t\t\t}) : isDisabled ? /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\tclassName: \"rounded-md bg-gray-100 px-3 py-1 text-xs font-medium text-gray-500\",\n\t\t\t\tchildren: option.disabledLabel ?? \"Unavailable\"\n\t\t\t}) : /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\tonClick: () => handleSelect(installSpec),\n\t\t\t\tdisabled: isSelecting,\n\t\t\t\tclassName: \"rounded-md bg-gray-900 px-3 py-1 text-xs font-medium text-white transition-colors hover:bg-gray-800 disabled:opacity-50\",\n\t\t\t\tchildren: isSelecting ? \"...\" : selectLabel\n\t\t\t})\n\t\t})]\n\t});\n}\nconst PackageManagerInput = (props) => {\n\tconst { registryPackageList, onInstall, disabled, className } = props;\n\tconst [typedTag, setTypedTag] = useState(void 0);\n\tconst fetchOptions = async (query) => {\n\t\tconst { name: namePart, tag } = parsePackageSpec(query);\n\t\tsetTypedTag(tag);\n\t\tconst needle = namePart.toLowerCase();\n\t\tconst localOptions = registryPackageList.filter((pkg) => pkg.name.toLowerCase().includes(needle) || pkg.manifest?.description?.toLowerCase().includes(needle)).map((pkg) => {\n\t\t\tconst isInstalled = pkg.status === \"local-install\" || pkg.status === \"registry-install\";\n\t\t\treturn {\n\t\t\t\tvalue: pkg.name,\n\t\t\t\tlabel: pkg.name,\n\t\t\t\tversion: pkg.version,\n\t\t\t\tdescription: pkg.manifest?.description,\n\t\t\t\tmeta: pkg.manifest?.publisher?.name,\n\t\t\t\tdisabled: isInstalled,\n\t\t\t\tdisabledLabel: isInstalled ? \"Installed\" : void 0,\n\t\t\t\tdistTags: pkg.distTags,\n\t\t\t\tversions: pkg.versions\n\t\t\t};\n\t\t});\n\t\tif (!isPlausiblePackageName(namePart) || localOptions.length > 0) return Promise.resolve(localOptions);\n\t\tconst fallbackOption = {\n\t\t\tvalue: buildPackageSpec(namePart, tag),\n\t\t\tlabel: tag ? `${namePart} @ ${tag}` : namePart,\n\t\t\tversion: tag,\n\t\t\tdescription: \"Not published to this registry. Install via the npmjs.org uplink.\",\n\t\t\tmeta: \"npm fallback\"\n\t\t};\n\t\treturn Promise.resolve([fallbackOption]);\n\t};\n\tconst handleSelect = useCallback((value) => {\n\t\treturn onInstall(value);\n\t}, [onInstall]);\n\tconst renderRow = useCallback((option, ctx) => /* @__PURE__ */ jsx(PackageResultCard, {\n\t\toption,\n\t\tctx,\n\t\ttypedTag\n\t}), [typedTag]);\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName,\n\t\tchildren: [/* @__PURE__ */ jsx(\"h3\", {\n\t\t\tclassName: \"mb-4 font-semibold text-gray-900\",\n\t\t\tchildren: \"Install Package\"\n\t\t}), /* @__PURE__ */ jsx(SearchAutocomplete, {\n\t\t\tfetchOptions,\n\t\t\tonSelect: handleSelect,\n\t\t\tselectLabel: \"Install\",\n\t\t\tselectingContent: /* @__PURE__ */ jsx(PackageAnimation, {\n\t\t\t\tanimate: true,\n\t\t\t\tloop: true,\n\t\t\t\tcolor: \"#6b7280\",\n\t\t\t\tsize: 48\n\t\t\t}),\n\t\t\tplaceholder: \"Search packages (e.g. my-pkg, my-pkg@dev, my-pkg@1.2.3)...\",\n\t\t\tdisabled,\n\t\t\trenderRow,\n\t\t\tkeepOpenSelector: \"[data-version-picker],[data-version-picker-trigger]\"\n\t\t})]\n\t});\n};\n//#endregion\n//#region src/connect/components/modal/settings-modal-v2/package-manager/package-manager-list.tsx\nconst PackageDetail = ({ label, value }) => {\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex items-start gap-2 text-sm\",\n\t\tchildren: [/* @__PURE__ */ jsxs(\"p\", {\n\t\t\tclassName: \"text-gray-600\",\n\t\t\tchildren: [label, \":\"]\n\t\t}), /* @__PURE__ */ jsx(\"p\", {\n\t\t\tclassName: \"text-gray-600\",\n\t\t\tchildren: value\n\t\t})]\n\t});\n};\nconst PackageManagerListItem = (props) => {\n\tconst { registryPackage, onInstall, onUninstall, className } = props;\n\tconst [isDropdownMenuOpen, setIsDropdownMenuOpen] = useState(false);\n\tconst canPickVersion = registryPackage.status === \"available\" || registryPackage.status === \"dismissed\";\n\tconst hasVersionMetadata = registryPackage.distTags && Object.keys(registryPackage.distTags).length > 0 || (registryPackage.versions?.length ?? 0) > 0;\n\tconst [selected, setSelected] = useState(() => resolveDefaultVersionSelection({\n\t\tdistTags: registryPackage.distTags,\n\t\tversions: registryPackage.versions,\n\t\tversion: registryPackage.version\n\t}));\n\tconst installDropdownItem = {\n\t\tid: \"install\",\n\t\tlabel: \"Install\",\n\t\ticon: /* @__PURE__ */ jsx(Icon, { name: \"DownloadFile\" }),\n\t\tclassName: \"text-gray-800\"\n\t};\n\tconst uninstallDropdownItem = {\n\t\tid: \"uninstall\",\n\t\tlabel: \"Uninstall\",\n\t\ticon: /* @__PURE__ */ jsx(Icon, { name: \"Trash\" }),\n\t\tclassName: \"text-red-900\"\n\t};\n\tfunction getDropdownItems() {\n\t\treturn [canPickVersion ? installDropdownItem : void 0, registryPackage.status === \"registry-install\" ? uninstallDropdownItem : void 0].filter((item) => item !== void 0);\n\t}\n\tconst dropdownItems = getDropdownItems();\n\treturn /* @__PURE__ */ jsxs(\"li\", {\n\t\tclassName: twMerge(\"relative flex flex-col items-start rounded-md border border-gray-200 p-3 text-sm leading-5 shadow-sm\", className),\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"flex flex-wrap items-center gap-2 pr-8\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"h3\", {\n\t\t\t\t\tclassName: \"font-semibold text-gray-900\",\n\t\t\t\t\tchildren: registryPackage.name\n\t\t\t\t}), canPickVersion && hasVersionMetadata ? /* @__PURE__ */ jsx(VersionPicker, {\n\t\t\t\t\tdistTags: registryPackage.distTags,\n\t\t\t\t\tversions: registryPackage.versions,\n\t\t\t\t\tselected,\n\t\t\t\t\tonChange: setSelected\n\t\t\t\t}) : registryPackage.version ? /* @__PURE__ */ jsxs(\"span\", {\n\t\t\t\t\tclassName: \"text-xs font-normal text-gray-500\",\n\t\t\t\t\tchildren: [\"v\", registryPackage.version]\n\t\t\t\t}) : null]\n\t\t\t}),\n\t\t\tregistryPackage.manifest !== null && (() => {\n\t\t\t\tconst { description, category, publisher } = registryPackage.manifest;\n\t\t\t\tif (!(description != null || category != null || publisher?.name != null || publisher?.url != null)) return null;\n\t\t\t\treturn /* @__PURE__ */ jsxs(Fragment$1, { children: [\n\t\t\t\t\tdescription != null && /* @__PURE__ */ jsx(PackageDetail, {\n\t\t\t\t\t\tlabel: \"Description\",\n\t\t\t\t\t\tvalue: description\n\t\t\t\t\t}),\n\t\t\t\t\tcategory != null && /* @__PURE__ */ jsx(PackageDetail, {\n\t\t\t\t\t\tlabel: \"Category\",\n\t\t\t\t\t\tvalue: category\n\t\t\t\t\t}),\n\t\t\t\t\tpublisher?.name != null && /* @__PURE__ */ jsx(PackageDetail, {\n\t\t\t\t\t\tlabel: \"Publisher\",\n\t\t\t\t\t\tvalue: publisher.name\n\t\t\t\t\t}),\n\t\t\t\t\tpublisher?.url != null && /* @__PURE__ */ jsx(PackageDetail, {\n\t\t\t\t\t\tlabel: \"Publisher URL\",\n\t\t\t\t\t\tvalue: /* @__PURE__ */ jsx(\"a\", {\n\t\t\t\t\t\t\tclassName: \"underline\",\n\t\t\t\t\t\t\thref: publisher.url,\n\t\t\t\t\t\t\tchildren: publisher.url\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t] });\n\t\t\t})(),\n\t\t\t/* @__PURE__ */ jsx(ConnectDropdownMenu, {\n\t\t\t\titems: dropdownItems,\n\t\t\t\tonItemClick: (id) => {\n\t\t\t\t\tif (id === \"install\") {\n\t\t\t\t\t\tonInstall(canPickVersion && hasVersionMetadata ? buildPackageSpec(registryPackage.name, selected.value) : registryPackage.name).catch(console.error);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tonUninstall(registryPackage.name);\n\t\t\t\t},\n\t\t\t\tonOpenChange: setIsDropdownMenuOpen,\n\t\t\t\topen: isDropdownMenuOpen,\n\t\t\t\tchildren: /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\tclassName: \"group absolute right-3 top-3\",\n\t\t\t\t\tonClick: (e) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tsetIsDropdownMenuOpen(true);\n\t\t\t\t\t},\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\tclassName: \"text-gray-600 group-hover:text-gray-900\",\n\t\t\t\t\t\tname: \"VerticalDots\"\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t})\n\t\t]\n\t});\n};\nconst PackageManagerList = (props) => {\n\tconst { className, registryPackageList, onInstall, onUninstall } = props;\n\tconst [maxHeight, setMaxHeight] = useState();\n\tconst locallyInstalledPackages = registryPackageList.filter((p) => p.status === \"local-install\");\n\tconst registryInstalledPackages = registryPackageList.filter((p) => p.status === \"registry-install\");\n\tconst availablePackages = registryPackageList.filter((p) => p.status === \"available\");\n\tconst dismissedPackages = registryPackageList.filter((p) => p.status === \"dismissed\");\n\tuseLayoutEffect(() => {\n\t\tconst calculateMaxHeight = () => {\n\t\t\tconst availableHeight = window.innerHeight - 516;\n\t\t\tsetMaxHeight(Math.max(200, availableHeight));\n\t\t};\n\t\tcalculateMaxHeight();\n\t\twindow.addEventListener(\"resize\", calculateMaxHeight);\n\t\treturn () => window.removeEventListener(\"resize\", calculateMaxHeight);\n\t}, []);\n\tconst hasLocallyInstalled = locallyInstalledPackages.length > 0;\n\tconst hasRegistryInstalled = registryInstalledPackages.length > 0;\n\tconst hasAnyInstalled = hasLocallyInstalled || hasRegistryInstalled;\n\tconst hasAvailable = availablePackages.length > 0;\n\tconst hasDismissed = dismissedPackages.length > 0;\n\tconst installedCount = locallyInstalledPackages.length + registryInstalledPackages.length;\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName: twMerge(\"flex flex-col items-stretch overflow-hidden\", className),\n\t\tstyle: { maxHeight },\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"flex-1 overflow-y-auto pr-2\",\n\t\t\tchildren: [\n\t\t\t\t/* @__PURE__ */ jsxs(PackageSection, {\n\t\t\t\t\tsectionId: \"installed\",\n\t\t\t\t\ttitle: \"Installed Packages\",\n\t\t\t\t\tcount: installedCount,\n\t\t\t\t\tisEmpty: !hasAnyInstalled,\n\t\t\t\t\temptyText: \"No packages installed.\",\n\t\t\t\t\tchildren: [hasLocallyInstalled && /* @__PURE__ */ jsx(PackageSubSection, {\n\t\t\t\t\t\ttitle: \"Locally installed\",\n\t\t\t\t\t\tcount: locallyInstalledPackages.length,\n\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(PackageList, {\n\t\t\t\t\t\t\tpackages: locallyInstalledPackages,\n\t\t\t\t\t\t\tonInstall,\n\t\t\t\t\t\t\tonUninstall\n\t\t\t\t\t\t})\n\t\t\t\t\t}), hasRegistryInstalled && /* @__PURE__ */ jsx(PackageSubSection, {\n\t\t\t\t\t\ttitle: \"Installed from registry\",\n\t\t\t\t\t\tcount: registryInstalledPackages.length,\n\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(PackageList, {\n\t\t\t\t\t\t\tpackages: registryInstalledPackages,\n\t\t\t\t\t\t\tonInstall,\n\t\t\t\t\t\t\tonUninstall\n\t\t\t\t\t\t})\n\t\t\t\t\t})]\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsx(PackageSection, {\n\t\t\t\t\tsectionId: \"available\",\n\t\t\t\t\ttitle: \"Available Packages\",\n\t\t\t\t\tcount: availablePackages.length,\n\t\t\t\t\tisEmpty: !hasAvailable,\n\t\t\t\t\temptyText: \"No packages available to install.\",\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(PackageList, {\n\t\t\t\t\t\tpackages: availablePackages,\n\t\t\t\t\t\tonInstall,\n\t\t\t\t\t\tonUninstall\n\t\t\t\t\t})\n\t\t\t\t}),\n\t\t\t\thasDismissed && /* @__PURE__ */ jsx(PackageSection, {\n\t\t\t\t\tsectionId: \"dismissed\",\n\t\t\t\t\ttitle: \"Dismissed Packages\",\n\t\t\t\t\tcount: dismissedPackages.length,\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(PackageList, {\n\t\t\t\t\t\tpackages: dismissedPackages,\n\t\t\t\t\t\tonInstall,\n\t\t\t\t\t\tonUninstall\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t]\n\t\t})\n\t});\n};\nconst STORAGE_KEY = \"ph:package-manager:collapsed-sections\";\nfunction loadCollapsedSections() {\n\tif (typeof window === \"undefined\") return {};\n\ttry {\n\t\tconst raw = window.localStorage.getItem(STORAGE_KEY);\n\t\treturn raw ? JSON.parse(raw) : {};\n\t} catch {\n\t\treturn {};\n\t}\n}\nfunction useCollapsedSection(sectionId) {\n\tconst [collapsed, setCollapsed] = useState(() => loadCollapsedSections()[sectionId] ?? true);\n\tuseEffect(() => {\n\t\tif (typeof window === \"undefined\") return;\n\t\ttry {\n\t\t\tconst current = loadCollapsedSections();\n\t\t\tcurrent[sectionId] = collapsed;\n\t\t\twindow.localStorage.setItem(STORAGE_KEY, JSON.stringify(current));\n\t\t} catch {}\n\t}, [sectionId, collapsed]);\n\treturn [collapsed, useCallback(() => setCollapsed((prev) => !prev), [])];\n}\nconst PackageSection = ({ sectionId, title, count, isEmpty, emptyText, children }) => {\n\tconst [collapsed, toggle] = useCollapsedSection(sectionId);\n\tconst contentId = `package-section-${sectionId}`;\n\treturn /* @__PURE__ */ jsxs(\"section\", {\n\t\tclassName: \"mb-6\",\n\t\tchildren: [/* @__PURE__ */ jsx(\"h3\", {\n\t\t\tclassName: \"sticky top-0 z-10 mb-3 border-b border-gray-200 bg-white\",\n\t\t\tchildren: /* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\ttype: \"button\",\n\t\t\t\tonClick: toggle,\n\t\t\t\t\"aria-expanded\": !collapsed,\n\t\t\t\t\"aria-controls\": contentId,\n\t\t\t\tclassName: \"flex w-full items-center gap-2 pb-2 text-left text-base font-semibold text-gray-900 hover:text-gray-700\",\n\t\t\t\tchildren: [\n\t\t\t\t\t/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\tname: \"ChevronDown\",\n\t\t\t\t\t\tsize: 16,\n\t\t\t\t\t\tclassName: twMerge(\"shrink-0 text-gray-500 transition-transform\", collapsed && \"-rotate-90\")\n\t\t\t\t\t}),\n\t\t\t\t\t/* @__PURE__ */ jsx(\"span\", { children: title }),\n\t\t\t\t\t/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\tclassName: \"text-xs font-medium text-gray-500\",\n\t\t\t\t\t\tchildren: count\n\t\t\t\t\t})\n\t\t\t\t]\n\t\t\t})\n\t\t}), !collapsed && /* @__PURE__ */ jsx(\"div\", {\n\t\t\tid: contentId,\n\t\t\tchildren: isEmpty ? /* @__PURE__ */ jsx(\"p\", {\n\t\t\t\tclassName: \"text-sm text-gray-500\",\n\t\t\t\tchildren: emptyText\n\t\t\t}) : /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"flex flex-col gap-4\",\n\t\t\t\tchildren\n\t\t\t})\n\t\t})]\n\t});\n};\nconst PackageSubSection = ({ title, count, children }) => {\n\treturn /* @__PURE__ */ jsxs(\"div\", { children: [/* @__PURE__ */ jsxs(\"h4\", {\n\t\tclassName: \"mb-2 flex items-baseline gap-2 text-xs font-semibold uppercase tracking-wide text-gray-500\",\n\t\tchildren: [/* @__PURE__ */ jsx(\"span\", { children: title }), /* @__PURE__ */ jsxs(\"span\", {\n\t\t\tclassName: \"font-medium normal-case tracking-normal text-gray-400\",\n\t\t\tchildren: [\n\t\t\t\t\"(\",\n\t\t\t\tcount,\n\t\t\t\t\")\"\n\t\t\t]\n\t\t})]\n\t}), children] });\n};\nconst PackageList = ({ packages, onInstall, onUninstall }) => {\n\treturn /* @__PURE__ */ jsx(\"ul\", {\n\t\tclassName: \"flex flex-col items-stretch gap-4 pr-2\",\n\t\tchildren: packages.map((pkg) => /* @__PURE__ */ jsx(PackageManagerListItem, {\n\t\t\tregistryPackage: pkg,\n\t\t\tonInstall,\n\t\t\tonUninstall\n\t\t}, pkg.name))\n\t});\n};\n//#endregion\n//#region src/connect/components/modal/settings-modal-v2/package-manager/package-manager.tsx\nconst PackageManager = (props) => {\n\tconst { registryPackageList, onInstall, onUninstall, mutable, disabled, className } = props;\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: twMerge(\"flex h-full flex-1 flex-col rounded-lg p-3\", className),\n\t\tchildren: [mutable && /* @__PURE__ */ jsx(PackageManagerInput, {\n\t\t\tclassName: \"mb-4\",\n\t\t\tregistryPackageList,\n\t\t\tonInstall,\n\t\t\tdisabled\n\t\t}), /* @__PURE__ */ jsx(PackageManagerList, {\n\t\t\tregistryPackageList,\n\t\t\tonUninstall,\n\t\t\tonInstall\n\t\t})]\n\t});\n};\n//#endregion\n//#region src/connect/components/modal/settings-modal-v2/settings-modal.tsx\nfunction SettingsModal(props) {\n\tconst { title, overlayProps, contentProps, onOpenChange, tabs, defaultTab, ...restProps } = props;\n\tconst [selectedTab, setSelectedTab] = useState(defaultTab ?? tabs.at(0)?.id);\n\tconst tabsContent = tabs.map((tab) => /* @__PURE__ */ jsx(\"button\", {\n\t\ttype: \"button\",\n\t\tonClick: () => setSelectedTab(tab.id),\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: twMerge(\"flex h-9 w-48 cursor-pointer items-center gap-x-2 rounded-md pl-3 hover:bg-slate-50\", selectedTab === tab.id ? \"bg-slate-50\" : \"bg-transparent\"),\n\t\t\tchildren: [tab.icon, /* @__PURE__ */ jsx(\"span\", { children: tab.label })]\n\t\t})\n\t}, tab.id));\n\tconst SelectedTabComponent = tabs.find((tab) => tab.id === selectedTab)?.content;\n\treturn /* @__PURE__ */ jsxs(Modal, {\n\t\tcontentProps: {\n\t\t\t...contentProps,\n\t\t\tclassName: twMerge(\"min-h-full w-full max-w-4xl rounded-xl\", contentProps?.className),\n\t\t\tstyle: {\n\t\t\t\t...contentProps?.style,\n\t\t\t\tboxShadow: \"0px 0px 16px 4px rgba(0, 0, 0, 0.04), 0px 33px 32px -16px rgba(0, 0, 0, 0.10)\"\n\t\t\t}\n\t\t},\n\t\tonOpenChange,\n\t\toverlayProps: {\n\t\t\t...overlayProps,\n\t\t\tclassName: twMerge(\"py-28\", overlayProps?.className)\n\t\t},\n\t\t...restProps,\n\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"flex justify-between border-b border-slate-50 p-4\",\n\t\t\tchildren: [/* @__PURE__ */ jsx(\"h1\", {\n\t\t\t\tclassName: \"text-center text-xl font-semibold\",\n\t\t\t\tchildren: title\n\t\t\t}), /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\ttype: \"button\",\n\t\t\t\tclassName: \"flex size-6 items-center justify-center rounded-md outline-none\",\n\t\t\t\tonClick: () => onOpenChange?.(false),\n\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tname: \"XmarkLight\",\n\t\t\t\t\tsize: 24\n\t\t\t\t})\n\t\t\t})]\n\t\t}), /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"flex flex-1\",\n\t\t\tchildren: [/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"flex flex-col gap-y-1 p-3 pt-6\",\n\t\t\t\tchildren: tabsContent\n\t\t\t}), /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"m-6 flex h-full flex-1 flex-col overflow-hidden rounded-lg border border-slate-50\",\n\t\t\t\tchildren: typeof SelectedTabComponent === \"function\" ? /* @__PURE__ */ jsx(SelectedTabComponent, {}) : SelectedTabComponent\n\t\t\t})]\n\t\t})]\n\t});\n}\n//#endregion\n//#region src/connect/components/modal/settings-modal/row.tsx\nconst SettingsRow = (props) => {\n\tconst { title, children, description, ...restProps } = props;\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\t...restProps,\n\t\tchildren: [title ? /* @__PURE__ */ jsx(\"h2\", {\n\t\t\tclassName: \"font-semibold\",\n\t\t\tchildren: title\n\t\t}) : null, /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"flex items-center justify-between gap-x-12 text-sm font-medium\",\n\t\t\tchildren: [/* @__PURE__ */ jsx(\"p\", { children: description }), /* @__PURE__ */ jsx(\"div\", { children })]\n\t\t})]\n\t});\n};\n//#endregion\n//#region src/connect/components/modal/settings-modal/clear-storage-row.tsx\nconst ClearStorageSettingsRow = (props) => {\n\tconst { onClearStorage, buttonLabel, ...restProps } = props;\n\treturn /* @__PURE__ */ jsx(SettingsRow, {\n\t\t...restProps,\n\t\tchildren: /* @__PURE__ */ jsx(PowerhouseButton, {\n\t\t\tclassName: \"h-auto min-h-9 rounded border border-solid border-gray-300 bg-white px-3 py-0 text-sm text-red-800 hover:border-gray-500 hover:bg-white hover:text-red-900\",\n\t\t\ticon: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\tname: \"Trash\",\n\t\t\t\tsize: 18\n\t\t\t}),\n\t\t\ticonPosition: \"right\",\n\t\t\tonClick: onClearStorage,\n\t\t\tchildren: buttonLabel\n\t\t})\n\t});\n};\n//#endregion\n//#region src/connect/components/modal/settings-modal/settings-modal.tsx\nconst SettingsModalOld = (props) => {\n\tconst { body, title, onSave, children, saveLabel, cancelLabel, overlayProps, contentProps, onOpenChange, ...restProps } = props;\n\treturn /* @__PURE__ */ jsx(Modal, {\n\t\tcontentProps: {\n\t\t\t...contentProps,\n\t\t\tclassName: twMerge(\"rounded-2xl\", contentProps?.className)\n\t\t},\n\t\tonOpenChange,\n\t\toverlayProps: {\n\t\t\t...overlayProps,\n\t\t\tclassName: twMerge(\"top-10\", overlayProps?.className)\n\t\t},\n\t\t...restProps,\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"w-[432px] p-4 text-gray-900\",\n\t\t\tchildren: [\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"flex justify-between\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"h1\", {\n\t\t\t\t\t\tclassName: \"text-center text-xl font-bold\",\n\t\t\t\t\t\tchildren: title\n\t\t\t\t\t}), /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\tclassName: \"flex size-8 items-center justify-center rounded-md bg-gray-100 text-gray-500 outline-none hover:text-gray-900\",\n\t\t\t\t\t\tonClick: () => onOpenChange?.(false),\n\t\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\tname: \"XmarkLight\",\n\t\t\t\t\t\t\tsize: 24\n\t\t\t\t\t\t})\n\t\t\t\t\t})]\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"mt-8 flex min-h-[50px] items-center justify-center rounded-md bg-slate-50 p-3 text-xs font-medium text-gray-600\",\n\t\t\t\t\tchildren: body\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"mt-4 flex flex-col gap-y-4\",\n\t\t\t\t\tchildren\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"mt-4 flex justify-end gap-x-4\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(PowerhouseButton, {\n\t\t\t\t\t\tclassName: \"text-gray-900\",\n\t\t\t\t\t\tcolor: \"light\",\n\t\t\t\t\t\tonClick: () => onOpenChange?.(false),\n\t\t\t\t\t\tchildren: cancelLabel\n\t\t\t\t\t}), /* @__PURE__ */ jsx(PowerhouseButton, {\n\t\t\t\t\t\tonClick: onSave,\n\t\t\t\t\t\tchildren: saveLabel\n\t\t\t\t\t})]\n\t\t\t\t})\n\t\t\t]\n\t\t})\n\t});\n};\n//#endregion\n//#region src/connect/components/modal/upgrade-drive-modal.tsx\nconst buttonStyles = \"min-h-[48px] min-w-[142px] text-base font-semibold py-3 px-6 rounded-xl outline-none active:opacity-75 hover:scale-105 transform transition-all\";\nfunction ConnectUpgradeDriveModal(props) {\n\tconst { body, header, onOpenChange, onContinue, cancelLabel, continueLabel, overlayProps, contentProps, ...restProps } = props;\n\treturn /* @__PURE__ */ jsx(Modal, {\n\t\tcontentProps: {\n\t\t\t...contentProps,\n\t\t\tclassName: twMerge(\"rounded-3xl\", contentProps?.className)\n\t\t},\n\t\tonOpenChange,\n\t\toverlayProps: {\n\t\t\t...overlayProps,\n\t\t\tclassName: overlayProps?.className\n\t\t},\n\t\t...restProps,\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"w-[400px] p-6 text-slate-300\",\n\t\t\tchildren: [\n\t\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"border-b border-slate-50 pb-2 text-2xl font-bold text-gray-800\",\n\t\t\t\t\tchildren: header\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"my-6 rounded-md bg-slate-50 p-4 text-center\",\n\t\t\t\t\tchildren: body\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\tclassName: \"mt-8 flex justify-between gap-3\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\tclassName: twMerge(buttonStyles, \"flex-1 bg-slate-50 text-slate-800\"),\n\t\t\t\t\t\tonClick: () => onOpenChange?.(false),\n\t\t\t\t\t\tchildren: cancelLabel\n\t\t\t\t\t}), /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\t\tclassName: twMerge(buttonStyles, \"flex-1 bg-gray-800 text-gray-50\"),\n\t\t\t\t\t\tonClick: onContinue,\n\t\t\t\t\t\tchildren: continueLabel\n\t\t\t\t\t})]\n\t\t\t\t})\n\t\t\t]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/revision-history/header/branch.tsx\nfunction Branch(props) {\n\tconst { branch = \"main\" } = props;\n\treturn /* @__PURE__ */ jsxs(\"button\", {\n\t\tclassName: \"flex h-8 w-fit items-center gap-1 rounded-lg bg-slate-50 pl-1 pr-2 text-xs text-stone-300\",\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(Icon, { name: \"Branch\" }),\n\t\t\t/* @__PURE__ */ jsx(\"span\", { children: \"BRANCH\" }),\n\t\t\t/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\tclassName: \"text-gray-900\",\n\t\t\t\tchildren: branch\n\t\t\t})\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/revision-history/header/doc-id.tsx\nfunction DocId(props) {\n\tconst { docId, onCopy } = props;\n\tconst [, copy] = useCopyToClipboard();\n\tfunction handleCopy(text) {\n\t\treturn () => {\n\t\t\tcopy(text).then(() => {\n\t\t\t\tonCopy?.();\n\t\t\t}).catch((error) => {\n\t\t\t\tconsole.error(\"Failed to copy!\", error);\n\t\t\t});\n\t\t};\n\t}\n\treturn /* @__PURE__ */ jsxs(\"button\", {\n\t\tclassName: \"flex h-8 w-fit items-center gap-1 rounded-lg bg-slate-50 pl-1 pr-2 text-xs text-stone-300\",\n\t\tonClick: handleCopy(docId),\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(Icon, { name: \"Link\" }),\n\t\t\t\"DOC ID\",\n\t\t\t/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\tclassName: \"text-gray-900\",\n\t\t\t\tchildren: docId\n\t\t\t})\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/revision-history/header/document-state.tsx\nconst DocumentState = (props) => {\n\tconst { documentState, onCopyState } = props;\n\tconst [, copy] = useCopyToClipboard();\n\tfunction handleCopy() {\n\t\tcopy(JSON.stringify(documentState, null, 2)).then(() => {\n\t\t\tonCopyState?.();\n\t\t}).catch((error) => {\n\t\t\tconsole.error(\"Failed to copy document state!\", error);\n\t\t});\n\t}\n\treturn /* @__PURE__ */ jsx(\"button\", {\n\t\tclassName: \"rounded-lg bg-slate-50 p-1 text-stone-300\",\n\t\tonClick: handleCopy,\n\t\tchildren: /* @__PURE__ */ jsx(Icon, { name: \"CurlyBrackets\" })\n\t});\n};\n//#endregion\n//#region src/connect/components/revision-history/header/scope.tsx\nfunction Scope(props) {\n\tconst { value, onChange } = props;\n\treturn /* @__PURE__ */ jsx(ConnectSelect, {\n\t\tabsolutePositionMenu: true,\n\t\tcontainerClassName: \"bg-slate-50 text-gray-500 rounded-lg w-fit text-xs z-10\",\n\t\tid: \"scope select\",\n\t\titemClassName: \"py-2 text-gray-500 grid grid-cols-[auto,auto] gap-1\",\n\t\titems: [{\n\t\t\tdisplayValue: \"Global scope\",\n\t\t\tvalue: \"global\"\n\t\t}, {\n\t\t\tdisplayValue: \"Local scope\",\n\t\t\tvalue: \"local\"\n\t\t}],\n\t\tmenuClassName: \"min-w-0 text-gray-500\",\n\t\tonChange,\n\t\tvalue\n\t});\n}\n//#endregion\n//#region src/connect/components/revision-history/header/header.tsx\nfunction Header(props) {\n\tconst { title, docId, scope, onChangeScope, onClose, className, documentState, onCopyState, onCopyDocId, ...divProps } = props;\n\treturn /* @__PURE__ */ jsxs(\"header\", {\n\t\tclassName: twMerge(\"flex items-center justify-between bg-transparent\", className),\n\t\t...divProps,\n\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"flex items-center gap-3\",\n\t\t\tchildren: [/* @__PURE__ */ jsx(\"button\", {\n\t\t\t\tname: \"close-revision-history\",\n\t\t\t\tclassName: \"shadow-button rounded-lg bg-gray-50 p-1 text-stone-300\",\n\t\t\t\tonClick: onClose,\n\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, { name: \"VariantArrowLeft\" })\n\t\t\t}), /* @__PURE__ */ jsx(\"h1\", {\n\t\t\t\tclassName: \"text-xs\",\n\t\t\t\tchildren: title\n\t\t\t})]\n\t\t}), /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"flex items-center gap-2\",\n\t\t\tchildren: [\n\t\t\t\t/* @__PURE__ */ jsx(DocId, {\n\t\t\t\t\tdocId,\n\t\t\t\t\tonCopy: onCopyDocId\n\t\t\t\t}),\n\t\t\t\tdocumentState && /* @__PURE__ */ jsx(DocumentState, {\n\t\t\t\t\tdocumentState,\n\t\t\t\t\tonCopyState\n\t\t\t\t}),\n\t\t\t\t/* @__PURE__ */ jsx(Branch, {}),\n\t\t\t\t/* @__PURE__ */ jsx(Scope, {\n\t\t\t\t\tonChange: onChangeScope,\n\t\t\t\t\tvalue: scope\n\t\t\t\t})\n\t\t\t]\n\t\t})]\n\t});\n}\n//#endregion\n//#region src/connect/hooks/use-ens.ts\nconst ensCache = /* @__PURE__ */ new Map();\nfunction fetchEns(address) {\n\tconst cached = ensCache.get(address);\n\tif (cached) return cached;\n\tconst promise = fetch(`https://api.ensdata.net/${address}`).then((res) => {\n\t\tif (!res.ok) throw new Error(`ENS lookup failed: ${res.status}`);\n\t\treturn res.json();\n\t}).catch((err) => {\n\t\tensCache.delete(address);\n\t\tthrow err instanceof Error ? err : /* @__PURE__ */ new Error(\"ENS lookup failed\");\n\t});\n\tensCache.set(address, promise);\n\treturn promise;\n}\nfunction useEns(address) {\n\tconst [data, setData] = useState();\n\tconst [isLoading, setIsLoading] = useState(false);\n\tconst [error, setError] = useState();\n\tuseEffect(() => {\n\t\tif (!address) {\n\t\t\tsetData(void 0);\n\t\t\tsetError(void 0);\n\t\t\treturn;\n\t\t}\n\t\tlet cancelled = false;\n\t\tsetIsLoading(true);\n\t\tsetError(void 0);\n\t\tfetchEns(address).then((json) => {\n\t\t\tif (cancelled) return;\n\t\t\tsetData(json);\n\t\t}).catch((err) => {\n\t\t\tif (cancelled) return;\n\t\t\tsetError(err instanceof Error ? err : /* @__PURE__ */ new Error(\"ENS lookup failed\"));\n\t\t}).finally(() => {\n\t\t\tif (cancelled) return;\n\t\t\tsetIsLoading(false);\n\t\t});\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [address]);\n\treturn {\n\t\tdata,\n\t\tisLoading,\n\t\terror\n\t};\n}\n//#endregion\n//#region src/connect/utils/address.ts\nfunction formatEthAddress(address) {\n\treturn `${address.slice(0, 7)}...${address.slice(-5)}`;\n}\n//#endregion\n//#region src/connect/components/revision-history/revision/address.tsx\nfunction Address(props) {\n\tconst { address, chainId } = props;\n\tconst [, copy] = useCopyToClipboard();\n\tconst { data: ensData } = useEns(address);\n\tif (!address) return null;\n\tconst shortenedAddress = formatEthAddress(address);\n\tfunction handleCopy(text) {\n\t\treturn () => {\n\t\t\tcopy(text).catch((error) => {\n\t\t\t\tconsole.error(\"Failed to copy!\", error);\n\t\t\t});\n\t\t};\n\t}\n\treturn /* @__PURE__ */ jsx(ConnectTooltip, {\n\t\tcontent: /* @__PURE__ */ jsxs(\"button\", {\n\t\t\tclassName: \"flex items-center gap-1\",\n\t\t\tonClick: handleCopy(address),\n\t\t\tchildren: [address, /* @__PURE__ */ jsx(Icon, {\n\t\t\t\tclassName: \"inline-block text-gray-600\",\n\t\t\t\tname: \"FilesEarmark\",\n\t\t\t\tsize: 16\n\t\t\t})]\n\t\t}),\n\t\tchildren: /* @__PURE__ */ jsxs(\"span\", {\n\t\t\tclassName: \"flex w-fit cursor-pointer items-center gap-1 rounded-lg bg-gray-100 p-1 text-xs text-slate-100\",\n\t\t\tchildren: [/* @__PURE__ */ jsx(ENSAvatar, {\n\t\t\t\taddress,\n\t\t\t\tchainId,\n\t\t\t\tavatarUrl: ensData?.avatar_url ?? void 0\n\t\t\t}), shortenedAddress]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/revision-history/revision/errors.tsx\nfunction Errors(props) {\n\tconst { errors } = props;\n\tconst hasErrors = !!errors?.length;\n\tconst color = hasErrors ? \"text-red-800\" : \"text-green-700\";\n\tconst icon = hasErrors ? /* @__PURE__ */ jsx(Icon, {\n\t\tname: \"Exclamation\",\n\t\tsize: 16\n\t}) : /* @__PURE__ */ jsx(Icon, {\n\t\tname: \"Check\",\n\t\tsize: 16\n\t});\n\tconst text = hasErrors ? `Error: ${errors[0]}` : \"No errors\";\n\tconst content = /* @__PURE__ */ jsxs(\"span\", {\n\t\tclassName: twMerge(\"flex w-fit items-center rounded-lg border border-gray-200 px-2 py-1 text-xs\", color, hasErrors && \"cursor-pointer\"),\n\t\tchildren: [icon, /* @__PURE__ */ jsx(\"span\", {\n\t\t\tclassName: twMerge(\"inline-block max-w-36 truncate\"),\n\t\t\tchildren: text\n\t\t})]\n\t});\n\tconst tooltipContent = errors?.map((message, index) => /* @__PURE__ */ jsxs(\"p\", {\n\t\tclassName: \"text-red-800\",\n\t\tchildren: [\"Error: \", message]\n\t}, index));\n\tif (hasErrors) return /* @__PURE__ */ jsx(ConnectTooltip, {\n\t\tcontent: tooltipContent,\n\t\tchildren: content\n\t});\n\treturn content;\n}\n//#endregion\n//#region src/connect/components/revision-history/revision/operation.tsx\nfunction Operation$1(props) {\n\tconst { operationType, operationInput } = props;\n\tconst [copied, setCopied] = useState(false);\n\tconst serialized = JSON.stringify(operationInput, null, 2);\n\tconst handleCopy = async () => {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(serialized);\n\t\t\tsetCopied(true);\n\t\t\tsetTimeout(() => setCopied(false), 1500);\n\t\t} catch (err) {\n\t\t\tconsole.error(\"Failed to copy to clipboard:\", err);\n\t\t}\n\t};\n\treturn /* @__PURE__ */ jsx(ConnectTooltip, {\n\t\tcontent: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"flex w-max items-start gap-2\",\n\t\t\tchildren: [/* @__PURE__ */ jsx(\"pre\", {\n\t\t\t\tclassName: \"m-0 whitespace-pre font-mono text-xs\",\n\t\t\t\tchildren: serialized\n\t\t\t}), /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\"aria-label\": \"Copy to clipboard\",\n\t\t\t\tclassName: \"shrink-0 rounded p-1 text-gray-500 hover:bg-gray-100 hover:text-gray-900\",\n\t\t\t\tonClick: () => void handleCopy(),\n\t\t\t\tonPointerDown: (e) => e.stopPropagation(),\n\t\t\t\ttype: \"button\",\n\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tname: copied ? \"Checkmark\" : \"Copy\",\n\t\t\t\t\tsize: 14\n\t\t\t\t})\n\t\t\t})]\n\t\t}),\n\t\tchildren: /* @__PURE__ */ jsxs(\"span\", {\n\t\t\tclassName: \"flex cursor-pointer items-center gap-2 text-xs\",\n\t\t\tchildren: [operationType, /* @__PURE__ */ jsx(Icon, {\n\t\t\t\tclassName: \"text-gray-300\",\n\t\t\t\tname: \"Braces\",\n\t\t\t\tsize: 16\n\t\t\t})]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/revision-history/revision/revision-number.tsx\nfunction RevisionNumber(props) {\n\tconst { operationIndex, eventId, stateHash } = props;\n\tconst [, copy] = useCopyToClipboard();\n\tconst revisionNumber = operationIndex + 1;\n\tconst tooltipContent = /* @__PURE__ */ jsxs(\"button\", {\n\t\tclassName: \"flex items-center gap-1\",\n\t\tonClick: handleCopy(stateHash),\n\t\tchildren: [\n\t\t\t\"Revision \",\n\t\t\trevisionNumber,\n\t\t\t\" - Event ID: \",\n\t\t\teventId,\n\t\t\t\" - State Hash: \",\n\t\t\tstateHash,\n\t\t\t/* @__PURE__ */ jsx(Icon, {\n\t\t\t\tclassName: \"inline-block text-gray-600\",\n\t\t\t\tname: \"FilesEarmark\",\n\t\t\t\tsize: 16\n\t\t\t})\n\t\t]\n\t});\n\tfunction handleCopy(text) {\n\t\treturn () => {\n\t\t\tcopy(text).catch((error) => {\n\t\t\t\tconsole.error(\"Failed to copy!\", error);\n\t\t\t});\n\t\t};\n\t}\n\treturn /* @__PURE__ */ jsx(ConnectTooltip, {\n\t\tcontent: tooltipContent,\n\t\tchildren: /* @__PURE__ */ jsxs(\"span\", {\n\t\t\tclassName: \"flex cursor-pointer items-center gap-2 text-xs text-gray-600\",\n\t\t\tchildren: [\n\t\t\t\t\"Revision \",\n\t\t\t\trevisionNumber,\n\t\t\t\t\".\",\n\t\t\t\t/* @__PURE__ */ jsx(\"a\", { children: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tclassName: \"cursor-pointer text-slate-100\",\n\t\t\t\t\tname: \"Ellipsis\",\n\t\t\t\t\tsize: 14\n\t\t\t\t}) })\n\t\t\t]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/revision-history/revision/signature.tsx\nfunction Signature(props) {\n\tconst { signatures } = props;\n\tif (!signatures?.length) return null;\n\treturn /* @__PURE__ */ jsx(ConnectTooltip, {\n\t\tcontent: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"text-xs text-slate-300\",\n\t\t\tchildren: [/* @__PURE__ */ jsx(\"h3\", {\n\t\t\t\tclassName: \"mb-2\",\n\t\t\t\tchildren: \"Signature details:\"\n\t\t\t}), signatures.map((signature, index) => /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"mb-2 last:mb-0\",\n\t\t\t\tchildren: [/* @__PURE__ */ jsxs(\"h4\", { children: [\n\t\t\t\t\t\"Signature #\",\n\t\t\t\t\tindex + 1,\n\t\t\t\t\t\" -\",\n\t\t\t\t\t\" \",\n\t\t\t\t\tsignature.isVerified ? \"verified\" : \"unverified\"\n\t\t\t\t] }), /* @__PURE__ */ jsx(\"code\", { children: /* @__PURE__ */ jsx(\"pre\", { children: JSON.stringify(signature, null, 2) }) })]\n\t\t\t}, signature.hash))]\n\t\t}),\n\t\tchildren: /* @__PURE__ */ jsxs(\"span\", {\n\t\t\tclassName: \"flex w-fit cursor-pointer items-center gap-1 rounded-lg border border-gray-200 px-2 py-1\",\n\t\t\tchildren: [\n\t\t\t\t/* @__PURE__ */ jsx(VerificationStatus, { signatures }),\n\t\t\t\t\" \",\n\t\t\t\t/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tclassName: \"text-gray-300\",\n\t\t\t\t\tname: \"InfoSquare\",\n\t\t\t\t\tsize: 16\n\t\t\t\t})\n\t\t\t]\n\t\t})\n\t});\n}\nfunction VerificationStatus(props) {\n\tconst { signatures } = props;\n\tif (!signatures?.length) return null;\n\tconst signatureCount = signatures.length;\n\tconst verifiedSignaturesCount = signatures.filter((signature) => signature.isVerified).length;\n\tconst verificationStatusText = `${verifiedSignaturesCount}/${signatureCount} ${signatureCount === 1 ? \"signature\" : \"signatures\"} verified`;\n\treturn /* @__PURE__ */ jsx(\"span\", {\n\t\tclassName: `text-xs ${verifiedSignaturesCount === 0 ? \"text-red-800\" : verifiedSignaturesCount === signatureCount ? \"text-green-700\" : \"text-orange-700\"}`,\n\t\tchildren: verificationStatusText\n\t});\n}\n//#endregion\n//#region src/connect/components/revision-history/revision/timestamp.tsx\nfunction Timestamp(props) {\n\tconst { timestampUtcMs: timestamp } = props;\n\tconst timestampNumber = typeof timestamp === \"string\" && !timestamp.includes(\"-\") ? parseInt(timestamp) : timestamp;\n\tconst date = new Date(timestampNumber);\n\tconst shortDate = format(date, \"HH:mm 'UTC'\");\n\treturn /* @__PURE__ */ jsx(ConnectTooltip, {\n\t\tcontent: /* @__PURE__ */ jsx(\"div\", { children: format(date, \"eee, dd MMM yyyy HH:mm:ss 'UTC'\") }),\n\t\tchildren: /* @__PURE__ */ jsxs(\"span\", {\n\t\t\tclassName: \"cursor-pointer text-xs\",\n\t\t\tchildren: [\"committed at \", shortDate]\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/revision-history/revision/revision.tsx\nfunction _Revision(props) {\n\treturn /* @__PURE__ */ jsxs(\"article\", {\n\t\tclassName: \"flex items-center justify-between rounded-xl border border-gray-200 bg-white px-4 py-2\",\n\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"flex items-center gap-2\",\n\t\t\tchildren: [\n\t\t\t\t/* @__PURE__ */ jsx(RevisionNumber, { ...props }),\n\t\t\t\t/* @__PURE__ */ jsx(Operation$1, { ...props }),\n\t\t\t\t/* @__PURE__ */ jsx(Address, { ...props }),\n\t\t\t\t/* @__PURE__ */ jsx(Timestamp, { ...props })\n\t\t\t]\n\t\t}), /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: \"flex items-center gap-1\",\n\t\t\tchildren: [/* @__PURE__ */ jsx(Signature, { ...props }), /* @__PURE__ */ jsx(Errors, { ...props })]\n\t\t})]\n\t});\n}\nconst Revision = /* @__PURE__ */ memo(_Revision);\n//#endregion\n//#region src/connect/components/revision-history/skip/skip.tsx\nfunction Skip(props) {\n\tconst { operationIndex, skipCount } = props;\n\tconst revisionNumber = operationIndex;\n\tconst skippedRevisions = skipCount === 1 ? `${revisionNumber}` : `${revisionNumber} - ${revisionNumber + 1 - skipCount}`;\n\treturn /* @__PURE__ */ jsxs(\"article\", {\n\t\tclassName: \"grid grid-cols-[1fr,auto,1fr] items-center py-2\",\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(\"div\", { className: \"h-px rounded-full bg-slate-100\" }),\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"mx-3 text-xs text-slate-100\",\n\t\t\t\tchildren: [\n\t\t\t\t\t\"[Skipped Revision \",\n\t\t\t\t\tskippedRevisions,\n\t\t\t\t\t\"]\"\n\t\t\t\t]\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"div\", { className: \"h-px rounded-full bg-slate-100\" })\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/revision-history/utils.ts\nfunction makeRows(operations) {\n\tconst revisionsAndSkips = [];\n\tconst seenDays = /* @__PURE__ */ new Set();\n\tfor (const operation of operations) {\n\t\tif (!operation.timestampUtcMs) continue;\n\t\tconst day = operation.timestampUtcMs.split(\"T\")[0];\n\t\tif (!seenDays.has(day)) {\n\t\t\tseenDays.add(day);\n\t\t\trevisionsAndSkips.push({\n\t\t\t\ttype: \"day\",\n\t\t\t\theight: 32,\n\t\t\t\ttimestampUtcMs: day\n\t\t\t});\n\t\t}\n\t\trevisionsAndSkips.push({\n\t\t\ttype: \"revision\",\n\t\t\theight: 46,\n\t\t\toperationIndex: operation.index,\n\t\t\teventId: operation.id ?? \"EVENT_ID_NOT_FOUND\",\n\t\t\tstateHash: operation.hash,\n\t\t\toperationType: operation.action.type,\n\t\t\toperationInput: operation.action.input ?? {},\n\t\t\taddress: operation.action?.context?.signer?.user.address,\n\t\t\tchainId: operation.action?.context?.signer?.user.chainId,\n\t\t\ttimestampUtcMs: operation.timestampUtcMs,\n\t\t\tsignatures: makeSignatures(operation.action?.context?.signer?.signatures ?? []),\n\t\t\terrors: operation.error ? [operation.error] : void 0\n\t\t});\n\t\tif (operation.skip > 0) revisionsAndSkips.push({\n\t\t\ttype: \"skip\",\n\t\t\theight: 34,\n\t\t\toperationIndex: operation.index,\n\t\t\tskipCount: operation.skip,\n\t\t\ttimestampUtcMs: operation.timestampUtcMs\n\t\t});\n\t}\n\treturn revisionsAndSkips;\n}\nfunction makeSignatureFromSignatureArray(signatureArray) {\n\tconst [signerAddress, hash, prevStateHash, signatureBytes] = signatureArray;\n\treturn {\n\t\tsignerAddress,\n\t\thash,\n\t\tprevStateHash,\n\t\tsignatureBytes,\n\t\tisVerified: true\n\t};\n}\nfunction makeSignatures(signaturesArray) {\n\treturn signaturesArray?.map(makeSignatureFromSignatureArray);\n}\n//#endregion\n//#region src/connect/components/revision-history/timeline/day.tsx\nfunction Day(props) {\n\tconst { timestampUtcMs: timestamp } = props;\n\tconst formattedDate = format(timestamp, \"MMM dd, yyyy\");\n\treturn /* @__PURE__ */ jsxs(\"h2\", {\n\t\tclassName: \"-ml-6 flex items-center gap-1 bg-slate-50 py-2 text-xs text-slate-100\",\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(Icon, {\n\t\t\t\tname: \"Ring\",\n\t\t\t\tsize: 16\n\t\t\t}),\n\t\t\t\" Changes on \",\n\t\t\tformattedDate\n\t\t]\n\t});\n}\n//#endregion\n//#region src/connect/components/revision-history/timeline/timeline.tsx\nfunction Timeline(props) {\n\tconst { localOperations, globalOperations, scope } = props;\n\tconst operations = scope === \"local\" ? localOperations : globalOperations;\n\tconst initialNumRowsToShow = 100;\n\tconst allRows = useMemo(() => makeRows(operations), [operations]);\n\tconst [scrollAmount, setScrollAmount] = useState(0);\n\tconst [numRowsToShow, setNumRowsToShow] = useState(initialNumRowsToShow);\n\tconst [rows, setRows] = useState(() => allRows.slice(0, numRowsToShow));\n\tconst parentRef = useRef(null);\n\tconst hasNextPage = rows.length < allRows.length;\n\tconst rowVirtualizer = useVirtualizer({\n\t\tcount: rows.length,\n\t\tgetScrollElement: () => parentRef.current,\n\t\testimateSize: (i) => allRows[i].height,\n\t\tgap: 8\n\t});\n\tuseEffect(() => {\n\t\tif (!hasNextPage) return;\n\t\tconst newNumRevisions = initialNumRowsToShow + Math.floor(scrollAmount / 46);\n\t\tsetNumRowsToShow((prev) => newNumRevisions > prev ? newNumRevisions : prev);\n\t}, [scrollAmount, hasNextPage]);\n\tuseEffect(() => {\n\t\tsetRows(allRows.slice(0, numRowsToShow));\n\t}, [allRows, numRowsToShow]);\n\tconst handleScroll = (e) => {\n\t\tsetScrollAmount((prev) => {\n\t\t\tconst n = prev + e.deltaY;\n\t\t\tif (n < 0) return 0;\n\t\t\treturn n;\n\t\t});\n\t};\n\tuseEffect(() => {\n\t\twindow.addEventListener(\"wheel\", handleScroll);\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"wheel\", handleScroll);\n\t\t};\n\t}, []);\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName: \"border-l border-slate-100\",\n\t\tref: parentRef,\n\t\tstyle: {\n\t\t\theight: `${rowVirtualizer.getTotalSize()}px`,\n\t\t\twidth: \"100%\",\n\t\t\tposition: \"relative\"\n\t\t},\n\t\tchildren: rowVirtualizer.getVirtualItems().map((virtualRow) => {\n\t\t\tconst row = rows[virtualRow.index];\n\t\t\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tstyle: {\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: 16,\n\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\theight: `${virtualRow.size}px`,\n\t\t\t\t\ttransform: `translateY(${virtualRow.start}px)`\n\t\t\t\t},\n\t\t\t\tchildren: [\n\t\t\t\t\trow.type === \"revision\" && /* @__PURE__ */ createElement(Revision, {\n\t\t\t\t\t\t...row,\n\t\t\t\t\t\tkey: virtualRow.key\n\t\t\t\t\t}),\n\t\t\t\t\trow.type === \"skip\" && /* @__PURE__ */ jsx(Skip, { ...row }, virtualRow.key),\n\t\t\t\t\trow.type === \"day\" && /* @__PURE__ */ jsx(Day, { ...row }, virtualRow.key)\n\t\t\t\t]\n\t\t\t}, virtualRow.index);\n\t\t})\n\t});\n}\n//#endregion\n//#region src/connect/components/revision-history/revision-history.tsx\nfunction RevisionHistory(props) {\n\tconst { documentTitle, documentId, globalOperations, localOperations, onClose, itemsPerPage = 100, documentState, onCopyState, onCopyDocId } = props;\n\tconst [scope, setScope] = useState(\"global\");\n\tconst visibleOperations = useMemo(() => {\n\t\treturn garbageCollect(sortOperations(scope === \"global\" ? globalOperations : localOperations)).sort((a, b) => b.index - a.index);\n\t}, [\n\t\tglobalOperations,\n\t\tlocalOperations,\n\t\tscope\n\t]);\n\tconst { pageItems, pages, goToPage, goToNextPage, goToPreviousPage, goToFirstPage, goToLastPage, hiddenNextPages, isNextPageAvailable, isPreviousPageAvailable } = usePagination(visibleOperations, { itemsPerPage });\n\tfunction onChangeScope(scope) {\n\t\tgoToFirstPage();\n\t\tsetScope(scope);\n\t}\n\tconst PaginationComponent = visibleOperations.length > itemsPerPage ? /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName: \"mt-4 flex w-full justify-end\",\n\t\tchildren: /* @__PURE__ */ jsx(Pagination, {\n\t\t\tfirstPageLabel: \"First Page\",\n\t\t\tgoToFirstPage,\n\t\t\tgoToLastPage,\n\t\t\tgoToNextPage,\n\t\t\tgoToPage,\n\t\t\tgoToPreviousPage,\n\t\t\thiddenNextPages,\n\t\t\tisNextPageAvailable,\n\t\t\tisPreviousPageAvailable,\n\t\t\tlastPageLabel: \"Last Page\",\n\t\t\tnextPageLabel: \"Next\",\n\t\t\tpages,\n\t\t\tpreviousPageLabel: \"Previous\"\n\t\t})\n\t}) : /* @__PURE__ */ jsx(\"hr\", { className: \"h-12 border-none\" });\n\treturn /* @__PURE__ */ jsx(ConnectTooltipProvider, { children: /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"p-6\",\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(Header, {\n\t\t\t\tdocId: documentId,\n\t\t\t\tonChangeScope,\n\t\t\t\tonClose,\n\t\t\t\tscope,\n\t\t\t\ttitle: documentTitle,\n\t\t\t\tdocumentState,\n\t\t\t\tonCopyState,\n\t\t\t\tonCopyDocId\n\t\t\t}),\n\t\t\tPaginationComponent,\n\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"mt-4 flex justify-center rounded-md bg-slate-50 p-4\",\n\t\t\t\tchildren: visibleOperations.length > 0 ? /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"grid grid-cols-[minmax(min-content,1018px)]\",\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(Timeline, {\n\t\t\t\t\t\tglobalOperations: scope === \"global\" ? pageItems : [],\n\t\t\t\t\t\tlocalOperations: scope === \"local\" ? pageItems : [],\n\t\t\t\t\t\tscope\n\t\t\t\t\t})\n\t\t\t\t}) : /* @__PURE__ */ jsx(\"h3\", {\n\t\t\t\t\tclassName: \"my-40 text-gray-600\",\n\t\t\t\t\tchildren: \"This document has no recorded operations yet.\"\n\t\t\t\t})\n\t\t\t}),\n\t\t\tPaginationComponent\n\t\t]\n\t}) });\n}\n//#endregion\n//#region src/connect/components/search-bar/filter-item.tsx\nconst FilterItem = (props) => {\n\tconst { item, ...containerProps } = props;\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\t...mergeClassNameProps(containerProps, \"flex h-full flex-row items-center justify-between gap-x-4 px-2\"),\n\t\tchildren: [item.icon, /* @__PURE__ */ jsx(\"div\", {\n\t\t\tclassName: \"text-sm font-semibold text-slate-200\",\n\t\t\tchildren: item.label\n\t\t})]\n\t});\n};\n//#endregion\n//#region src/connect/components/search-bar/search-bar.tsx\nconst ConnectSearchBar = (props) => {\n\tconst { value, onChange, placeholder, filterLabel, filterItems, selectedFilter, onFilterSelect = () => {}, className } = props;\n\tconst items = useMemo(() => filterItems?.map((item) => ({\n\t\tid: item.id,\n\t\tcontent: /* @__PURE__ */ jsx(FilterItem, { item })\n\t})) ?? [], [filterItems]);\n\tconst selectedItemFilter = filterItems?.find((item) => item.id === selectedFilter);\n\tconst filterLabelContent = selectedItemFilter ? /* @__PURE__ */ jsx(FilterItem, {\n\t\tclassName: \"gap-x-1\",\n\t\titem: selectedItemFilter\n\t}) : filterLabel && /* @__PURE__ */ jsx(\"div\", {\n\t\tclassName: \"mr-2 text-sm font-semibold text-slate-200\",\n\t\tchildren: filterLabel\n\t});\n\tfunction handleChange(event) {\n\t\tonChange?.(event.target.value);\n\t}\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: cn(\"flex items-center\", className),\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(Icon, {\n\t\t\t\tclassName: \"mr-3\",\n\t\t\t\tname: \"Search\"\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"input\", {\n\t\t\t\tclassName: twMerge(\"flex h-[52px] min-w-0 flex-1 items-center rounded-xl border border-gray-200 bg-gray-50 px-4 text-sm text-slate-200 outline-none\"),\n\t\t\t\tonChange: handleChange,\n\t\t\t\tplaceholder,\n\t\t\t\tvalue\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsxs(DropdownMenuTrigger, {\n\t\t\t\tclassName: \"ml-3 flex h-full flex-row items-center outline-none\",\n\t\t\t\tchildren: [\n\t\t\t\t\tfilterLabelContent,\n\t\t\t\t\t\" \",\n\t\t\t\t\t/* @__PURE__ */ jsx(Icon, { name: \"ChevronDown\" })\n\t\t\t\t]\n\t\t\t}), /* @__PURE__ */ jsx(DropdownMenuContent, {\n\t\t\t\tclassName: \"rounded-xl border border-gray-100 bg-gray-50 p-2\",\n\t\t\t\tchildren: items.map((item) => /* @__PURE__ */ jsx(DropdownMenuItem, {\n\t\t\t\t\tclassName: \"h-10 cursor-pointer overflow-hidden rounded-lg hover:bg-gray-100\",\n\t\t\t\t\tid: item.id,\n\t\t\t\t\tonSelect: () => onFilterSelect(item.id),\n\t\t\t\t\tchildren: item.content\n\t\t\t\t}, item.id))\n\t\t\t})] })\n\t\t]\n\t});\n};\n//#endregion\n//#region src/connect/components/sidebar/sidebar-item.tsx\nconst SidebarItem = function SidebarItem(props) {\n\tconst { icon, title, description, containerClassName, active, onClick } = props;\n\treturn /* @__PURE__ */ jsx(ConnectTooltip, {\n\t\tcontent: title,\n\t\tside: \"right\",\n\t\tsideOffset: 12,\n\t\tclassName: \"border-none bg-gray-800 px-3 py-2 text-sm text-white\",\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: twMerge(\"group/sidebar-item relative flex cursor-pointer flex-col items-center justify-center text-center text-sm text-black\", containerClassName, active && \"bg-white\", onClick && \"cursor-pointer\"),\n\t\t\tonClick,\n\t\t\tchildren: [active ? /* @__PURE__ */ jsx(\"div\", { className: \"absolute left-0 top-1/2 h-10 w-1 -translate-y-1/2 rounded-r-sm bg-violet-400\" }) : /* @__PURE__ */ jsx(\"div\", { className: \"absolute left-0 top-1/2 h-6 w-1 -translate-y-1/2 rounded-r-sm bg-zinc-300 opacity-0 transition-opacity group-hover/sidebar-item:opacity-100\" }), /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"mx-auto py-4\",\n\t\t\t\tchildren: icon || /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"flex size-8 items-center justify-center rounded-lg bg-black\",\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\tclassName: \"text-sm font-medium text-white\",\n\t\t\t\t\t\tchildren: title.slice(0, 1).toUpperCase()\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t})]\n\t\t})\n\t});\n};\n//#endregion\n//#region src/connect/components/sidebar/sidebar-add-drive-item.tsx\nconst SidebarAddDriveItem = function SidebarAddDriveItem(props) {\n\tconst { containerClassName, onClick } = props;\n\treturn /* @__PURE__ */ jsx(SidebarItem, {\n\t\ttitle: \"Create New Drive\",\n\t\ticon: /* @__PURE__ */ jsx(Icon, {\n\t\t\tname: \"PlusSquare\",\n\t\t\tsize: 32\n\t\t}),\n\t\tonClick,\n\t\tcontainerClassName\n\t});\n};\n//#endregion\n//#region assets/renown-short-hover.png\nvar renown_short_hover_default = \"data:image/png;base64,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\";\n//#endregion\n//#region assets/renown-short.png\nvar renown_short_default = \"data:image/png;base64,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\";\n//#endregion\n//#region src/connect/components/account-popover/account-popover-login.tsx\nconst AccountPopoverLogin = ({ onLogin }) => {\n\tconst [loading, setLoading] = useState(false);\n\tconst allowLogin = !loading && !!onLogin;\n\tconst content = loading ? /* @__PURE__ */ jsx(Icon, {\n\t\tname: \"Reload\",\n\t\tsize: 14,\n\t\tclassName: \"animate-spin\"\n\t}) : /* @__PURE__ */ jsx(\"span\", { children: \"Connect\" });\n\tconst handleLogin = () => {\n\t\tif (onLogin) {\n\t\t\tsetLoading(true);\n\t\t\tonLogin();\n\t\t}\n\t};\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"p-4\",\n\t\tchildren: [/* @__PURE__ */ jsx(\"div\", {\n\t\t\tclassName: \"mb-4 flex justify-center\",\n\t\t\tchildren: /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"flex h-[22px] w-[83px] items-center justify-center overflow-hidden\",\n\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tname: \"RenownLight\",\n\t\t\t\t\tsize: 83\n\t\t\t\t})\n\t\t\t})\n\t\t}), /* @__PURE__ */ jsx(\"button\", {\n\t\t\tonClick: allowLogin ? handleLogin : void 0,\n\t\t\tclassName: twMerge(\"mt-4 flex h-7 w-full cursor-pointer items-center justify-center rounded-lg border border-gray-300 bg-transparent text-sm active:opacity-70\", allowLogin ? \"cursor-pointer\" : \"cursor-wait\"),\n\t\t\ttype: \"button\",\n\t\t\tchildren: content\n\t\t})]\n\t});\n};\n//#endregion\n//#region src/connect/components/sidebar/sidebar-login.tsx\nconst SidebarLogin = ({ onLogin }) => {\n\treturn /* @__PURE__ */ jsx(AccountPopover, {\n\t\tcontent: /* @__PURE__ */ jsx(AccountPopoverLogin, { onLogin }),\n\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\tclassName: twMerge(\"group/sidebar-footer flex w-full items-baseline justify-start text-sm font-semibold leading-10 text-gray-600\", onLogin ? \"cursor-pointer\" : \"cursor-wait\"),\n\t\t\tchildren: [/* @__PURE__ */ jsx(\"img\", {\n\t\t\t\twidth: 42,\n\t\t\t\theight: 42,\n\t\t\t\tloading: \"lazy\",\n\t\t\t\tclassName: \"group-hover/sidebar-footer:hidden\",\n\t\t\t\tsrc: renown_short_default,\n\t\t\t\talt: \"Renown Login\"\n\t\t\t}), /* @__PURE__ */ jsx(\"img\", {\n\t\t\t\twidth: 42,\n\t\t\t\theight: 42,\n\t\t\t\tloading: \"lazy\",\n\t\t\t\tclassName: \"hidden group-hover/sidebar-footer:block\",\n\t\t\t\tsrc: renown_short_hover_default,\n\t\t\t\talt: \"Renown Login Hover\"\n\t\t\t})]\n\t\t})\n\t});\n};\n//#endregion\n//#region src/connect/components/account-popover/account-popover-user.tsx\nconst shortAddress = (address) => `${address.slice(0, 7)}...${address.slice(-5)}`;\nconst AccountPopoverUser = ({ address, onDisconnect, etherscanUrl, username = \"\" }) => {\n\tconst [isCopied, setIsCopied] = useState(false);\n\tconst copyToClipboard = useCallback(async (text) => {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(text);\n\t\t\tsetIsCopied(true);\n\t\t\tsetTimeout(() => setIsCopied(false), 2e3);\n\t\t} catch (err) {\n\t\t\tconsole.error(\"Failed to copy address:\", err);\n\t\t}\n\t}, []);\n\treturn /* @__PURE__ */ jsxs(\"div\", {\n\t\tclassName: \"flex flex-col divide-y divide-gray-200 text-gray-900\",\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\tclassName: \"px-3 py-2\",\n\t\t\t\tchildren: [username && /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"text-sm font-medium\",\n\t\t\t\t\tchildren: username\n\t\t\t\t}), /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\tclassName: \"mt-1 flex items-center gap-2\",\n\t\t\t\t\tchildren: /* @__PURE__ */ jsx(PowerhouseButton, {\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tcolor: \"light\",\n\t\t\t\t\t\tonClick: copyToClipboard.bind(null, address),\n\t\t\t\t\t\tclassName: \"w-full cursor-pointer bg-transparent p-0 active:opacity-70\",\n\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\tclassName: \"relative flex w-full items-center gap-1\",\n\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsxs(\"div\", {\n\t\t\t\t\t\t\t\tclassName: `flex items-center gap-1 transition-opacity duration-150 ${isCopied ? \"opacity-0\" : \"opacity-100\"}`,\n\t\t\t\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\t\t\t\t\tclassName: \"text-xs\",\n\t\t\t\t\t\t\t\t\tchildren: shortAddress(address)\n\t\t\t\t\t\t\t\t}), /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\t\t\t\tname: \"FilesEarmark\",\n\t\t\t\t\t\t\t\t\tcolor: \"#9EA0A1\",\n\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t\t}), /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\t\t\t\t\tclassName: `absolute left-0 text-xs transition-opacity duration-150 ${isCopied ? \"opacity-100\" : \"opacity-0\"}`,\n\t\t\t\t\t\t\t\tchildren: \"Copied to clipboard!\"\n\t\t\t\t\t\t\t})]\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t})]\n\t\t\t}),\n\t\t\tetherscanUrl && /* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"px-3 py-2\",\n\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"a\", {\n\t\t\t\t\thref: etherscanUrl,\n\t\t\t\t\ttarget: \"_blank\",\n\t\t\t\t\trel: \"noopener noreferrer\",\n\t\t\t\t\tclassName: \"flex items-center gap-2 text-sm text-gray-900 hover:text-gray-600\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\tname: \"Ethscan\",\n\t\t\t\t\t\tsize: 14\n\t\t\t\t\t}), \"View on Etherscan\"]\n\t\t\t\t})\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: \"px-3 py-2\",\n\t\t\t\tchildren: /* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\tonClick: onDisconnect,\n\t\t\t\t\tclassName: twMerge(\"flex w-full items-center gap-2 text-sm text-red-900\", onDisconnect ? \"cursor-pointer hover:text-red-700\" : \"pointer-events-none cursor-wait\"),\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tchildren: [/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\t\tname: \"Disconnect\",\n\t\t\t\t\t\tsize: 14,\n\t\t\t\t\t\tcolor: \"#EA4335\"\n\t\t\t\t\t}), \"Disconnect\"]\n\t\t\t\t})\n\t\t\t})\n\t\t]\n\t});\n};\n//#endregion\n//#region src/connect/components/sidebar/sidebar-user.tsx\nconst SidebarUser = ({ address, ensName, avatarUrl, etherscanUrl, onDisconnect }) => {\n\treturn /* @__PURE__ */ jsx(AccountPopover, {\n\t\tcontent: /* @__PURE__ */ jsx(AccountPopoverUser, {\n\t\t\taddress,\n\t\t\tusername: ensName,\n\t\t\tonDisconnect,\n\t\t\tetherscanUrl\n\t\t}),\n\t\tchildren: /* @__PURE__ */ jsx(\"div\", {\n\t\t\tclassName: \"flex items-center justify-center rounded-sm\",\n\t\t\tchildren: /* @__PURE__ */ jsx(ENSAvatar, {\n\t\t\t\taddress,\n\t\t\t\tavatarUrl,\n\t\t\t\tsize: \"40px\"\n\t\t\t})\n\t\t})\n\t});\n};\n//#endregion\n//#region src/connect/components/sidebar/sidebar-footer.tsx\nconst ConnectSidebarFooter = ({ address, ensName, avatarUrl, className, onLogin, onClickSettings, onDisconnect, onHomeClick, showDebug, onDebugClick, etherscanUrl = \"\", ...props }) => {\n\treturn /* @__PURE__ */ jsxs(SidebarFooter, {\n\t\t...props,\n\t\tclassName: twMerge(\"flex flex-col gap-2 border-t border-gray-300 px-2 py-4\", className),\n\t\tchildren: [\n\t\t\tonHomeClick && /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\"aria-label\": \"Home\",\n\t\t\t\ttype: \"button\",\n\t\t\t\tclassName: \"flex w-full cursor-pointer items-center justify-center outline-none\",\n\t\t\t\tonClick: onHomeClick,\n\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tclassName: \"text-gray-600\",\n\t\t\t\t\tname: \"ConnectSmall\",\n\t\t\t\t\tsize: 24\n\t\t\t\t})\n\t\t\t}),\n\t\t\tshowDebug && onDebugClick && /* @__PURE__ */ jsx(\"button\", {\n\t\t\t\t\"aria-label\": \"Debug Settings\",\n\t\t\t\ttype: \"button\",\n\t\t\t\tid: \"connect-debug-button\",\n\t\t\t\tclassName: \"mt-3 flex w-full cursor-pointer items-center justify-center outline-none\",\n\t\t\t\tonClick: onDebugClick,\n\t\t\t\tchildren: /* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tclassName: \"text-gray-600\",\n\t\t\t\t\tname: \"Tube\"\n\t\t\t\t})\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(\"div\", {\n\t\t\t\tclassName: onHomeClick ? \"mt-3\" : \"\",\n\t\t\t\tchildren: address ? /* @__PURE__ */ jsx(SidebarUser, {\n\t\t\t\t\taddress,\n\t\t\t\t\tensName,\n\t\t\t\t\tavatarUrl,\n\t\t\t\t\tonDisconnect,\n\t\t\t\t\tetherscanUrl\n\t\t\t\t}) : /* @__PURE__ */ jsx(SidebarLogin, { onLogin })\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsxs(\"button\", {\n\t\t\t\t\"aria-label\": \"Settings\",\n\t\t\t\ttype: \"button\",\n\t\t\t\tclassName: twMerge(\"mt-3 flex w-full items-center justify-center outline-none\", onClickSettings ? \"cursor-pointer\" : \"cursor-wait\"),\n\t\t\t\tonClick: onClickSettings,\n\t\t\t\tchildren: [/* @__PURE__ */ jsx(Icon, {\n\t\t\t\t\tclassName: \"text-gray-600\",\n\t\t\t\t\tname: \"Settings\"\n\t\t\t\t}), /* @__PURE__ */ jsx(\"span\", {\n\t\t\t\t\tclassName: \"hidden text-sm font-semibold leading-6 text-gray-800\",\n\t\t\t\t\tchildren: \"Settings\"\n\t\t\t\t})]\n\t\t\t})\n\t\t]\n\t});\n};\n//#endregion\n//#region src/connect/components/sidebar/sidebar-header.tsx\nconst ConnectSidebarHeader = ({ className, children, ...props }) => {\n\tif (!children) return null;\n\treturn /* @__PURE__ */ jsx(SidebarHeader, {\n\t\t...props,\n\t\tclassName: twMerge(\"flex justify-center gap-4 border-b border-gray-300 py-4\", className),\n\t\tchildren\n\t});\n};\n//#endregion\n//#region src/connect/components/sidebar/sidebar.tsx\nconst ConnectSidebar = ({ onClick, address, ensName, avatarUrl, headerContent, onClickSettings, maxWidth = \"304px\", minWidth = \"58px\", onLogin, onDisconnect, etherscanUrl, showDebug, onDebugClick, ...props }) => {\n\treturn /* @__PURE__ */ jsxs(Sidebar, {\n\t\t...props,\n\t\tmaxWidth,\n\t\tminWidth,\n\t\tchildren: [/* @__PURE__ */ jsxs(SidebarPanel, { children: [/* @__PURE__ */ jsx(ConnectSidebarHeader, { children: headerContent }), /* @__PURE__ */ jsx(\"div\", {\n\t\t\tclassName: \"flex flex-col\",\n\t\t\tchildren: props.children\n\t\t})] }), /* @__PURE__ */ jsx(ConnectSidebarFooter, {\n\t\t\taddress,\n\t\t\tensName,\n\t\t\tavatarUrl,\n\t\t\tonClickSettings,\n\t\t\tonLogin,\n\t\t\tonDisconnect,\n\t\t\tetherscanUrl,\n\t\t\tonHomeClick: onClick,\n\t\t\tshowDebug,\n\t\t\tonDebugClick\n\t\t})]\n\t});\n};\n//#endregion\n//#region src/connect/utils/get-folder-status.ts\n/**\n* Retrieves the sync status of a folder based on its path and their children files.\n*\n* @param folderPath - The path of the folder.\n* @param sortedFiles - The sorted list of files.\n* @returns The sync status of the folder.\n*/\nconst getFolderStatus = (folderPath, sortedFiles) => {\n\tfor (const file of sortedFiles) if (file.path.startsWith(folderPath)) return file.status || \"SUCCESS\";\n\treturn \"SUCCESS\";\n};\n/**\n* Sorts an array of files by their status.\n* The order priority is:\n* - ERROR\n* - CONFLICT\n* - SYNCING\n* - MISSING\n* - SUCCESS\n*\n* @param files - The array of files to be sorted.\n* @returns The sorted array of files.\n*/\nconst sortFilesByStatus = (files) => {\n\treturn files.sort((a, b) => {\n\t\tconst statusOrder = [\n\t\t\t\"ERROR\",\n\t\t\t\"CONFLICT\",\n\t\t\t\"SYNCING\",\n\t\t\t\"MISSING\",\n\t\t\t\"SYNCING\",\n\t\t\t\"SUCCESS\"\n\t\t];\n\t\treturn statusOrder.indexOf(a.status || \"SUCCESS\") - statusOrder.indexOf(b.status || \"SUCCESS\");\n\t});\n};\n/**\n* Removes files with a status of 'SUCCESS' from the given array of FileStatus objects.\n* @param files - An array of FileStatus objects.\n* @returns A new array containing only the FileStatus objects with a status other than 'SUCCESS'.\n*/\nconst removeSuccessFiles = (files) => {\n\treturn files.filter((file) => file.status !== \"SUCCESS\");\n};\n//#endregion\nexport { AddLocalDriveForm as $, ReadRequiredModal as A, UploadFileListContainer as At, ConnectDeleteItemModal as B, Disclosure as Bt, PackageManagerInput as C, sharingTypeOptions as Ct, About as D, ConnectDropdownMenu as Dt, DangerZone as E, EditorActionButtons as Et, ConnectionStateBadge as F, DocumentToolbar as Ft, AddDriveModal as G, ConnectConfirmationModal as Gt, CreateDocumentModal as H, DebugInspector as Ht, QueueInspector as I, DocumentStateViewer as It, HomeScreen as J, Breadcrumb as Jt, LoadingScreen as K, CookieBanner as Kt, ProcessorsInspector as L, Tabs as Lt, InspectorModal as M, UploadFileItem as Mt, RemotesInspector as N, ConnectReplaceDuplicateModal as Nt, DependencyVersions as O, DropZoneWrapper as Ot, ChannelInspector as P, useDrop as Pt, AddRemoteDriveForm as Q, AccountPopover as Qt, ObjectInspectorModal as R, TabContent as Rt, PackageManagerListItem as S, normalNodeOptionsMap as St, DefaultEditorSelect as T, EditorUndoRedoButtons as Tt, AddRemoteDriveModal as U, DBExplorer as Ut, ConnectDeleteDriveModal as V, DefaultEditorLoader as Vt, AddLocalDriveModal as W, ConnectSelect as Wt, HomeScreenItem as X, NodeInput as Xt, HomeScreenAddDriveItem as Y, Breadcrumbs as Yt, HomeBackgroundImage as Z, AnimatedLoader as Zt, ClearStorageSettingsRow as _, defaultNodeOptions as _t, ConnectSidebarHeader as a, FileItem as at, PackageManager as b, nodeOptionsMap as bt, SidebarLogin as c, ERROR as ct, ConnectSearchBar as d, SUCCESS as dt, Toggle as et, RevisionHistory as f, SYNCING as ft, SettingsModalOld as g, defaultDriveOptions as gt, ConnectUpgradeDriveModal as h, debugNodeOptionsMap as ht, ConnectSidebar as i, FolderItem as it, PackageInstallModal as j, UploadFileList as jt, verifyPackageJsonFields as k, DropZone as kt, SidebarAddDriveItem as l, INITIAL_SYNC as lt, useEns as m, debugNodeOptions as mt, removeSuccessFiles as n, Footer as nt, ConnectSidebarFooter as o, SyncStatusIcon as ot, formatEthAddress as p, syncStatuses as pt, IntegrityInspector as q, Combobox as qt, sortFilesByStatus as r, FooterLink as rt, SidebarUser as s, CONFLICT as st, getFolderStatus as t, FormInput as tt, SidebarItem as u, MISSING as ut, SettingsRow as v, locationInfoByLocation as vt, DefaultEditor as w, ENSAvatar as wt, PackageManagerList as x, normalNodeOptions as xt, SettingsModal as y, nodeOptions as yt, DriveSettingsModal as z, Divider as zt };\n\n//# sourceMappingURL=connect-C_dcbzBz.js.map"],"x_google_ignoreList":[4,5,7,8,9,10,11,12],"mappings":"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H,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CAEH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CAEH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CAEH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CAEH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CAEH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CAEH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CAEH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CAEH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CAEH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CAEH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CAEH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CAEH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CAEH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CAEH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CAEH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CAEH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,IAAI;CACJ,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,IAAI;CACJ,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,IAAI;CACJ,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,IAAI;CACJ,IAAI;CACJ,GAAG;CACH,GAAG;CACH,IAAI;CACJ,IAAI;CAEJ,GAAG;CACH,GAAG;CAEH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CAC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"}
|