diff --git a/dev/docker/hocuspocus/.dockerignore b/dev/docker/hocuspocus/.dockerignore new file mode 100644 index 0000000000..8a0d4bc7ba --- /dev/null +++ b/dev/docker/hocuspocus/.dockerignore @@ -0,0 +1,4 @@ +node_modules +npm-debug.log +.DS_Store +*.log \ No newline at end of file diff --git a/dev/docker/hocuspocus/Dockerfile b/dev/docker/hocuspocus/Dockerfile new file mode 100644 index 0000000000..1860056b68 --- /dev/null +++ b/dev/docker/hocuspocus/Dockerfile @@ -0,0 +1,12 @@ +FROM node:22-alpine AS deps +WORKDIR /app +COPY package.json ./ +RUN npm install --omit=optional --no-audit --no-fund + +FROM node:22-alpine +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY package.json tsconfig.json server.ts ./ +ENV NODE_ENV=production +EXPOSE 9400 +CMD ["npx", "tsx", "server.ts"] \ No newline at end of file diff --git a/dev/docker/hocuspocus/IMPLEMENTATION_NOTES.md b/dev/docker/hocuspocus/IMPLEMENTATION_NOTES.md new file mode 100644 index 0000000000..d872c16fe2 --- /dev/null +++ b/dev/docker/hocuspocus/IMPLEMENTATION_NOTES.md @@ -0,0 +1,125 @@ +eplain why we need the selected part +⎿  ⧉ Selected 53 lines from dev/docker/hocuspocus/server.ts in WebStorm + +⏺ That block exists because tiptap is a browser library, and we're running it inside flushRoom / onLoadDocument to convert markdown ↔ Y.Doc on the server. The order matters: every line in that block has to run before any tiptap or prosemirror import, because those modules touch DOM globals at module-load time, not +lazily on first use. + +What each piece is for: + +const dom = new JSDOM(...) — Spins up a fake browser environment. We never render anything, but tiptap's Editor (via prosemirror's EditorView) builds a live ProseMirror view internally as soon as you new Editor({...}). The view attaches event listeners, measures the viewport, etc., and needs the DOM API surface +to do so. + +pretendToBeVisual: true — Makes jsdom expose requestAnimationFrame etc. as real functions instead of throwing. ProseMirror's view scheduler uses them. + +definePolyfill(key, value) — Only assigns to globalThis[key] if (a) it isn't already there and (b) the global is writable. The try/catch swallows the case where Node 22 ships a read-only getter for things like navigator — we don't want a "Cannot set property" crash at boot when there's nothing to do. + +pickFromWindow(key) — When you copy a method like addEventListener off dom.window onto globalThis, the implicit this is wrong (it points at globalThis, not at the window jsdom expects). bind(w) fixes that so calls like a bare addEventListener(...) route back to the window where the listener registry lives. + +The for loop — Each entry is something a piece of tiptap / prosemirror / collaboration extensions actually reaches for at runtime: +- document, DOMParser, Node, Element, HTMLElement — ProseMirror's HTML parser used by setContent(htmlString). +- addEventListener / removeEventListener — EditorView listens for keystrokes, IME, selection events. +- requestAnimationFrame / cancelAnimationFrame — ProseMirror's view scheduler. +- innerWidth, innerHeight, pageXOffset, pageYOffset, scrollX, scrollY, devicePixelRatio, visualViewport — ProseMirror's measurement code reads these during view construction. +- Range, Selection, CSS, getComputedStyle — selection/decoration handling and layout queries. + +Why we landed on jsdom (vs. linkedom) — linkedom is lighter, but only provides a DOM tree, not a real window with event APIs, animation frames, selection, etc. We hit the polyfill ceiling fast and had to switch. jsdom gives us a complete enough window that ProseMirror's new EditorView(...) works without further +patching. + +This is the price of reusing the client's tiptap stack on the server to guarantee the prosemirror schema matches byte-for-byte (so Y.Doc conversions don't corrupt). An alternative would be to drop tiptap on the server and convert markdown ↔ Y.Doc with prosemirror-markdown + prosemirror-model directly — no DOM +needed — but then we'd have to keep the two schemas in lockstep manually. + +✻ Cooked for 24s + +❯ Tell me more about that This is the price of reusing the client's tiptap stack on the server to guarantee the prosemirror schema matches byte-for-byte (so Y.Doc conversions don't corrupt). An alternative would be to drop tiptap on the server and convert markdown ↔ Y.Doc with prosemirror-markdown + +prosemirror-model directly — no DOM +needed — but then we'd have to keep the two schemas in lockstep manually. +⎿  ⧉ Selected 1 lines from dev/docker/hocuspocus/server.ts in WebStorm + +⏺ The core issue is that y-prosemirror's prosemirrorJSONToYDoc(schema, json, 'default') and yDocToProsemirrorJSON(doc, 'default') are schema-bound. They serialize ProseMirror nodes into a Y.XmlFragment whose XML element names, attribute keys, and mark names come straight from the schema's node/mark definitions. So +if the client's editor has, say, a node spec named paragraph with an attribute lineHeight, that exact spelling is encoded into the Y.Doc. + +When a Y.Doc update flows from client A through the server back to client B, both ends decode the Y.XmlFragment using their own schema. If A's paragraph allows lineHeight and B's doesn't, B's ProseMirror parser will either drop the attribute, throw a validation error, or worst case construct an invalid document +tree. Run that for a few minutes of edits and you get content drift, dropped marks, missing list items, or hard "invalid content" crashes in the editor view. The data isn't deleted on disk, but the live collaborative state diverges from what the schema expects. + +Today's approach is "schema parity by construction". The server imports the same tiptap extension packages at the same versions as the client (@tiptap/extension-link@^3.20.4 on both, @tiptap/extension-table@^3.20.4 on both, etc.) and instantiates a real new Editor({extensions}) for the conversion. Since both ends +materialize the schema from the same code, they're literally identical. The price: tiptap's Editor constructor builds a live ProseMirror EditorView, which assumes a browser → hence jsdom + the polyfill block. We never render anything, but we pay the cost of pretending we could. + +The "no-DOM" alternative is to skip tiptap on the server and build a Schema from prosemirror-model directly, then use prosemirror-markdown's MarkdownParser / MarkdownSerializer. The conversion becomes a few hundred bytes of pure data manipulation, no jsdom, container is ~200 MB smaller, startup is ~200 ms faster, +and there's no risk of a future tiptap version pulling in some new DOM dependency. + +What it costs: + +1. Two schemas to maintain. The client gets its schema from tiptap extensions (each extension contributes node/mark specs declaratively). The server would describe the same schema by hand in Schema constructor form: every node spec (content, group, attrs, parseDOM/toDOM), every mark spec, every + defining/isolating/atom flag, every default attribute. A few hundred lines of code that has to mirror what the tiptap extensions do — and stay in sync as they evolve. +2. prosemirror-markdown is a smaller, opinionated subset. It ships parser/serializer rules for headings, paragraphs, lists, blockquote, code blocks, inline marks, links, images. Tables, task lists, task items, footnotes, etc. are not there — you'd write the tokenizer extension and the serializer node rules + yourself. Tiptap's @tiptap/markdown already bundles markdown-it plugins and renderers for the extensions we use, so we get table support, task-list checkboxes, etc. for free. +3. Round-trip semantics may diverge. Tiptap's markdown package and prosemirror-markdown have different rules for things like soft line breaks, list item indentation, table alignment, escape characters. Even if the schema is "the same", the wire format on disk would subtly differ from what the client saves + locally. Confusing for users hot-switching between collab and non-collab. +4. Schema drift = silent Y.Doc corruption. This is the worst failure mode. If someone bumps @tiptap/extension-table on the client to a major that adds a new attribute, and the server's hand-rolled schema lacks it, Y.Doc updates carrying that attribute either get rejected or partially applied. Today, that's a + "bump both package.jsons" mistake; in the alternative, it's a "bump tiptap and remember to also patch the server schema" mistake — much easier to miss in CI. + +When the swap makes sense: when (a) the editor's schema stabilizes (rare changes, locked majors), (b) bundle size or cold-start time becomes a real operational concern (current setup is fine for the concept dev stack), or (c) tiptap pulls in a future browser-only dependency that even jsdom can't fake. None of +those apply right now, which is why I left the jsdom approach in place. + +The middle ground worth considering, if/when this graduates from concept to feature: have the client export its schema as a serialized JSON spec at build time (write a tiny vite plugin that imports the strategies and calls editor.schema.toJSON() or hand-rolls a node-spec dump), commit that artifact, and the +server Schema.fromJSONs it. That gives "no DOM" + "no manual sync" but you pay a slightly weird build step. Probably overkill for the current scope. + +## Comparison with the OpenProject approach + +Their architecture in one sentence + +A Hocuspocus 3.x server with a single Extension that authenticates a per-document encrypted token, loads/stores the Y.Doc as a base64 blob through OpenProject's REST API, and uses BlockNote's ServerBlockNoteEditor (a headless helper that ships with @blocknote/server-util) to derive a markdown rendering for the +API's description field on every save. + +Where they're clearly better than us + +1. No DOM polyfills. BlockNote ships a first-class server runtime — ServerBlockNoteEditor.create({schema}) is designed to run in Node without a window. Tiptap doesn't have an equivalent; using its Editor on the server inevitably constructs a ProseMirror EditorView, which is the entire reason for our jsdom block. + If we adopted a similar split (an editor whose server-side helper is officially supported), the polyfill block disappears. + +2. Schema parity by construction, in a shared package. They factor the project-specific blocks into a separate npm package op-blocknote-extensions that both the client and hocuspocus consume. No "make sure the two package.jsons have the same pinned tiptap majors" liability. The + BlockNoteSchema.create().extend({...}) pattern lets them share the schema definition itself, not just the dependency versions. + +3. Persistence is the CRDT, not the rendered text. This is the biggest model difference. They store two things on every save: the raw Y.Doc as Buffer.from(Y.encodeStateAsUpdate(doc)).toString('base64') and a lossy-markdown render as description. The Y.Doc blob is canonical for collab; the markdown is a derived + artifact for human/API consumers. On load they just Y.applyUpdate(data.document, update) — no parsing, no schema round-trip, no information loss. Heading attributes, custom block specs, fine-grained marks all round-trip perfectly because they're never serialized through markdown. + + We're stuck doing tiptap-markdown-render on every save because the on-disk file is the markdown. Their model is only available to us if OpenCloud grows a side-channel for opaque binary state — an xattr, a sidecar file like foo.md.yjs, an OCS endpoint, etc. + +4. Resource identity = URL. Their documentName is the resource URL itself, which doubles as the API endpoint for load/store. Our __ parsing exists only because we shoved a content-type hint into the room name to dispatch on the server. With CRDT-as-canonical storage there's no per-content-type + dispatch, the room name is just the URL, and the server fetches whatever the URL points to. Much cleaner. + +Where they made interesting different choices + +5. Token model is encrypted-blob + shared secret, not direct OIDC validation. OpenProject mints a token by AES-256-GCM-encrypting {resource_url, oauth_token, expires_at, readonly} with a shared SECRET. Hocuspocus decrypts, then validates the resource binding and uses the unwrapped OAuth token to test access via a + real REST call. Pros: +- Hocuspocus needs zero knowledge of the IdP (no JWKS discovery, no issuer config). +- The token is bound to a specific resource at issuance time — cross-room replay is structurally impossible. +- readonly is encoded in the token; no permission lookup needed on the server. + + Cons: requires OpenProject ↔ Hocuspocus to coordinate on the symmetric key (rotation is a two-place change), and OpenProject has to do the actual OAuth validation. We picked the more standard "Hocuspocus directly validates JWTs against the IdP" path, which is more independent but more setup. + +6. Per-message token expiry + onTokenSync refresh. They check tokenExpiresAt on every incoming message (beforeHandleMessage) and force-close the connection with WebSocket code 4401 when expired. The client is expected to refresh proactively via provider.sendToken(newEncryptedToken), which triggers their + onTokenSync to re-validate and swap connection.context.token in place — no reconnect. That's stricter and more secure than our "the WebSocket lives as long as the connection lives, next reconnect re-auths" model. It also requires us to be on Hocuspocus 3.x (we're on 2.15.2; onTokenSync and beforeHandleMessage are + 3.x additions). + +7. Stateless event is a plain string. Their connection.sendStateless("storeEvent") is fired after every successful save, no payload structure — the client just reacts to the event ("a save happened"). We chose structured JSON {type, fromEtag, toEtag} because we currently only emit on conflict and want to convey + the reason. Both are valid; theirs is simpler, ours is more informative. + +Where their context makes the comparison apples-to-oranges + +8. No 412 / external-write story. Their canonical store is the Y.Doc blob behind OpenProject's REST API, which only Hocuspocus ever writes. There's no curl-PUT scenario, no If-Match, no version-history sidestep. They simply don't have to solve the conflict problem we have, because their data isn't reachable by + other writers. If we adopted CRDT-as-canonical storage in OpenCloud, the markdown sidecar would still be writable by anyone, but the collab state would be safe — we'd only need conflict handling on the markdown derivative, not the live document. + +9. They have an "OpenProject document" abstraction. Their _links.update presence is what tells them whether the user can edit (readonly). OpenCloud's WebDAV PROPFIND has a different permission model. Not better/worse, just different. + +My takeaway for our concept + +The two changes that would most reduce our complexity, in order of bang-per-buck: + +- Migrate to @tiptap/server-util-style headless (if/when tiptap ships one) or store the Y.Doc blob as a sidecar. Either eliminates the entire DOM polyfill block + the markdown round-trip risk + the schema-parity dance. The "sidecar" version doesn't require a new tiptap library — it requires an OpenCloud-side + convention (e.g. write foo.md and .opencloud/collab/foo.md.yjs) and accepting that markdown-only consumers see "snapshots" rather than live collaboration state. This is the single change that would clean up the most of our current server code. +- Upgrade to Hocuspocus 3.x and use onTokenSync. Hocuspocus 3.x's Extension class API is cleaner, onTokenSync lets us swap tokens without reconnects, and beforeHandleMessage gives us per-message authorization decisions we currently don't have. Cost: minor API surface changes in our server.ts. Not urgent. + +Things I'd not copy verbatim: + +- The encrypted-token-with-shared-secret model. It's slick for OpenProject's case because they already proxy auth at the application layer, but for us it would mean OpenCloud growing a hocuspocus-aware token-mint endpoint. Standard JWT/JWKS is more boring but more decoupled. +- Per-message token expiry enforcement. We can borrow the beforeHandleMessage hook for a softer version (e.g., warn but don't close) once we move to 3.x, but force-closing every connection mid-edit when a token rolls over would be a worse UX than our current "let the open socket live, re-auth on reconnect". diff --git a/dev/docker/hocuspocus/README.md b/dev/docker/hocuspocus/README.md new file mode 100644 index 0000000000..6b1df0c01e --- /dev/null +++ b/dev/docker/hocuspocus/README.md @@ -0,0 +1,38 @@ +# Hocuspocus dev server + +Dev-only Y.js / Hocuspocus backend for collaborative editing in the OpenCloud Web +tiptap editor. Brokers Y.Doc state between connected clients and persists each +document to OpenCloud via WebDAV. + +This service is part of the docker-compose dev stack only. It is **not** meant +to run in production. + +## What it does + +- Verifies the client's OpenCloud access token (OIDC JWT) against the IdP JWKS. +- On the first connect to a room, fetches the file from OpenCloud via WebDAV and + seeds a Y.Doc from the content. +- On change, debounces (`SAVE_DEBOUNCE_MS`, default 2 s) and writes the file back + via WebDAV with `If-Match` for optimistic concurrency. +- On the last disconnect, flushes immediately. + +## Scope + +Markdown (`.md`) and plain-text files only for the first cut. Other content +types fall back to the editor's existing single-user flow. + +## Schema parity warning + +The tiptap extension versions in `package.json` must match the versions used +by `packages/web-pkg`. A mismatch can silently corrupt the Y.Doc state because +the ProseMirror node specs diverge. + +## Env + +| Var | Default | Notes | +| ------------------------------ | ----------------------------------- | ---------------------------------- | +| `PORT` | `9400` | Hocuspocus WebSocket port | +| `OC_URL` | `https://host.docker.internal:9200` | OpenCloud base URL (WebDAV target) | +| `IDP_ISSUER` | same as `OC_URL` | OIDC issuer for JWT verification | +| `SAVE_DEBOUNCE_MS` | `2000` | WebDAV write-back debounce | +| `NODE_TLS_REJECT_UNAUTHORIZED` | `0` (set by compose) | **Dev only** — accept self-signed | diff --git a/dev/docker/hocuspocus/package.json b/dev/docker/hocuspocus/package.json new file mode 100644 index 0000000000..bd4dcbf469 --- /dev/null +++ b/dev/docker/hocuspocus/package.json @@ -0,0 +1,38 @@ +{ + "name": "@opencloud-eu/dev-hocuspocus", + "version": "0.0.0", + "private": true, + "type": "module", + "description": "Dev-only Hocuspocus server for the OpenCloud Web tiptap editor. Bridges Y.Doc state to OpenCloud via WebDAV.", + "scripts": { + "start": "tsx server.ts", + "dev": "tsx watch server.ts" + }, + "dependencies": { + "@hocuspocus/extension-logger": "^2.15.2", + "@hocuspocus/server": "^2.15.2", + "@tiptap/core": "^3.23.5", + "@tiptap/extension-document": "^3.20.4", + "@tiptap/extension-hard-break": "^3.20.4", + "@tiptap/extension-image": "^3.20.4", + "@tiptap/extension-link": "^3.20.4", + "@tiptap/extension-paragraph": "^3.20.4", + "@tiptap/extension-table": "^3.20.4", + "@tiptap/extension-task-item": "^3.20.4", + "@tiptap/extension-task-list": "^3.20.4", + "@tiptap/extension-text": "^3.20.4", + "@tiptap/markdown": "^3.20.4", + "@tiptap/pm": "^3.20.4", + "@tiptap/starter-kit": "^3.20.4", + "jose": "^5.9.6", + "jsdom": "^25.0.1", + "undici": "^6.20.1", + "y-prosemirror": "^1.2.13", + "yjs": "^13.6.20" + }, + "devDependencies": { + "@types/node": "^22.9.0", + "tsx": "^4.19.2", + "typescript": "^6.0.3" + } +} diff --git a/dev/docker/hocuspocus/server.ts b/dev/docker/hocuspocus/server.ts new file mode 100644 index 0000000000..3419f95d01 --- /dev/null +++ b/dev/docker/hocuspocus/server.ts @@ -0,0 +1,387 @@ +// DOM globals must be installed before any tiptap / prosemirror import. +// jsdom gives us a real window, document, addEventListener, requestAnimationFrame +// etc. — what ProseMirror's EditorView expects. +import { JSDOM } from 'jsdom' +const dom = new JSDOM('', { + url: 'http://localhost/', + pretendToBeVisual: true +}) +function definePolyfill(key: string, value: unknown): void { + const g = globalThis as unknown as Record + if (g[key] !== undefined) { + return + } + try { + g[key] = value + } catch { + // Some Node versions expose certain globals (e.g. `navigator`) as read-only + // getters; ignore — the parts we actually need are all writable. + } +} +const w = dom.window as unknown as Record +function pickFromWindow(key: string): unknown { + const value = w[key] + // Methods need their `this` bound back to the window when accessed as free + // globals (e.g. `addEventListener(...)` without `window.` prefix). + return typeof value === 'function' ? (value as (...args: unknown[]) => unknown).bind(w) : value +} +definePolyfill('window', dom.window) +for (const key of [ + 'document', + 'DOMParser', + 'Node', + 'Element', + 'HTMLElement', + 'getComputedStyle', + 'addEventListener', + 'removeEventListener', + 'requestAnimationFrame', + 'cancelAnimationFrame', + 'innerWidth', + 'innerHeight', + 'pageXOffset', + 'pageYOffset', + 'scrollX', + 'scrollY', + 'devicePixelRatio', + 'visualViewport', + 'Range', + 'Selection', + 'CSS' +]) { + definePolyfill(key, pickFromWindow(key)) +} + +import { Server, type Document } from '@hocuspocus/server' +import { Logger } from '@hocuspocus/extension-logger' +import { Editor, type Extensions } from '@tiptap/core' +import StarterKit from '@tiptap/starter-kit' +import { Markdown } from '@tiptap/markdown' +import Link from '@tiptap/extension-link' +import Image from '@tiptap/extension-image' +import { Table, TableRow, TableCell, TableHeader } from '@tiptap/extension-table' +import TaskList from '@tiptap/extension-task-list' +import TaskItem from '@tiptap/extension-task-item' +import TDocument from '@tiptap/extension-document' +import Paragraph from '@tiptap/extension-paragraph' +import Text from '@tiptap/extension-text' +import HardBreak from '@tiptap/extension-hard-break' +import * as Y from 'yjs' +import { prosemirrorJSONToYDoc, yDocToProsemirrorJSON } from 'y-prosemirror' +import { createRemoteJWKSet, jwtVerify, type JWTPayload } from 'jose' +import { fetch } from 'undici' + +type ContentType = 'markdown' | 'plain-text' + +interface RoomState { + fileId: string + ct: ContentType + etag: string | null + latestToken: string | null +} + +const PORT = Number(process.env.PORT ?? 9400) +const OC_URL = (process.env.OC_URL ?? 'https://host.docker.internal:9200').replace(/\/$/, '') +const IDP_ISSUER = (process.env.IDP_ISSUER ?? OC_URL).replace(/\/$/, '') +const SAVE_DEBOUNCE_MS = Number(process.env.SAVE_DEBOUNCE_MS ?? 2000) + +const rooms = new Map() + +let jwksGetter: ReturnType | null = null +let oidcIssuer: string | null = null + +async function loadJwks() { + const discoveryUrl = `${IDP_ISSUER}/.well-known/openid-configuration` + // OpenCloud usually finishes booting after our compose `depends_on` thinks it + // has — keep retrying so a fresh stack doesn't crashloop hocuspocus. + const maxAttempts = 60 + let attempt = 0 + for (;;) { + attempt++ + try { + const res = await fetch(discoveryUrl) + if (!res.ok) { + throw new Error(`OIDC discovery failed (${res.status}) at ${discoveryUrl}`) + } + const doc = (await res.json()) as { issuer: string; jwks_uri: string } + oidcIssuer = doc.issuer + jwksGetter = createRemoteJWKSet(new URL(doc.jwks_uri)) + console.log(`[hocuspocus] OIDC issuer=${oidcIssuer} jwks=${doc.jwks_uri}`) + return + } catch (err) { + if (attempt >= maxAttempts) { + throw err + } + const wait = Math.min(5000, 500 * attempt) + console.warn( + `[hocuspocus] OIDC discovery attempt ${attempt}/${maxAttempts} failed (${(err as Error).message}); retrying in ${wait}ms` + ) + await new Promise((resolve) => setTimeout(resolve, wait)) + } + } +} + +// Room name shape: "__". OpenCloud fileIds are of the form +// "$!", so the separator must not be `!`, `$`, or `/`. +const ROOM_SEPARATOR = '__' + +function parseRoom(name: string): { fileId: string; ct: ContentType } { + const idx = name.lastIndexOf(ROOM_SEPARATOR) + if (idx === -1) { + throw new Error(`invalid room name "${name}": expected "${ROOM_SEPARATOR}"`) + } + const fileId = name.slice(0, idx) + const ctHint = name.slice(idx + ROOM_SEPARATOR.length) + const ct: ContentType = ctHint === 'md' ? 'markdown' : 'plain-text' + return { fileId, ct } +} + +function buildExtensions(ct: ContentType): Extensions { + if (ct === 'markdown') { + return [ + StarterKit.configure({ link: false, undoRedo: false }), + Markdown, + Link.configure({ + openOnClick: false, + autolink: true, + linkOnPaste: true + }), + Table.configure({ resizable: false }), + TableRow, + TableCell, + TableHeader, + TaskList, + TaskItem.configure({ nested: true }), + Image.configure({ inline: false }) + ] + } + return [TDocument, Paragraph, Text, HardBreak] +} + +function buildHeadlessEditor(ct: ContentType): Editor { + const editorOptions: Record = { extensions: buildExtensions(ct) } + if (ct === 'markdown') { + editorOptions.contentType = 'markdown' + } + return new Editor(editorOptions as ConstructorParameters[0]) +} + +function plainTextToJson(text: string) { + if (!text) { + return { type: 'doc', content: [{ type: 'paragraph' }] } + } + const lines = text.split('\n') + return { + type: 'doc', + content: lines.map((line) => + line ? { type: 'paragraph', content: [{ type: 'text', text: line }] } : { type: 'paragraph' } + ) + } +} + +function textToYDoc(body: string, ct: ContentType): Y.Doc { + const editor = buildHeadlessEditor(ct) + try { + if (ct === 'markdown') { + editor.commands.setContent(body, { contentType: 'markdown', emitUpdate: false } as never) + } else { + editor.commands.setContent(plainTextToJson(body), { emitUpdate: false }) + } + return prosemirrorJSONToYDoc(editor.schema, editor.getJSON(), 'default') + } finally { + editor.destroy() + } +} + +function yDocToText(doc: Y.Doc, ct: ContentType): string { + const editor = buildHeadlessEditor(ct) + try { + const json = yDocToProsemirrorJSON(doc, 'default') + editor.commands.setContent(json, { emitUpdate: false }) + if (ct === 'markdown') { + // `getMarkdown()` is added to the Editor prototype by the `@tiptap/markdown` + // extension when registered. Without it, output would be the plain text fallback. + const getMarkdown = (editor as unknown as { getMarkdown?: () => string }).getMarkdown + if (typeof getMarkdown !== 'function') { + throw new Error( + 'tiptap/markdown extension did not register getMarkdown() — schema/extension mismatch' + ) + } + return getMarkdown.call(editor) + } + return editor.getText() + } finally { + editor.destroy() + } +} + +function webdavUrl(fileId: string): string { + // OpenCloud's `$`, `!` are allowed in URL path segments (RFC 3986 sub-delims), + // and OpenCloud's WebDAV expects the OC-FileId verbatim. + return `${OC_URL}/remote.php/dav/spaces/${fileId}` +} + +async function webdavGet( + token: string, + fileId: string +): Promise<{ body: string; etag: string | null }> { + const res = await fetch(webdavUrl(fileId), { + headers: { Authorization: `Bearer ${token}` } + }) + if (!res.ok) { + throw new Error(`webdav GET failed (${res.status}) for ${fileId}`) + } + const body = await res.text() + const etag = res.headers.get('oc-etag') ?? res.headers.get('etag') + return { body, etag } +} + +async function webdavPut( + token: string, + fileId: string, + body: string, + ifMatch: string | null +): Promise<{ etag: string | null; status: number }> { + const headers: Record = { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/octet-stream' + } + if (ifMatch) { + headers['If-Match'] = ifMatch + } + const res = await fetch(webdavUrl(fileId), { + method: 'PUT', + headers, + body + }) + const etag = res.headers.get('oc-etag') ?? res.headers.get('etag') + return { etag, status: res.status } +} + +async function flushRoom(roomName: string, doc: Document): Promise { + const state = rooms.get(roomName) + if (!state) { + return + } + if (!state.latestToken) { + console.warn(`[hocuspocus] flush skipped for ${roomName}: no token in room state`) + return + } + const body = yDocToText(doc, state.ct) + const { etag, status } = await webdavPut(state.latestToken, state.fileId, body, state.etag) + if (status === 412) { + // The file changed on the server (or in a parallel session) since we last + // read it. OpenCloud keeps every PUT as a version, so we can safely + // overwrite without losing data — the superseded content remains + // recoverable from version history. We avoid Y.Doc merge, which would + // corrupt the live document by unioning two unrelated histories. + try { + const fresh = await webdavGet(state.latestToken, state.fileId) + console.warn( + `[hocuspocus] webdav PUT 412 for ${roomName}: external change detected ` + + `(was etag=${state.etag}, server etag=${fresh.etag}). Forcing overwrite; ` + + `previous server state is preserved in OpenCloud version history.` + ) + const retry = await webdavPut(state.latestToken, state.fileId, body, null) + if (retry.status < 200 || retry.status >= 300) { + // Keep the old etag so the next flush will retry optimistic concurrency. + console.error( + `[hocuspocus] webdav PUT retry ${retry.status} for ${roomName}; ` + + `keeping previous etag for next flush` + ) + return + } + state.etag = retry.etag + console.log(`[hocuspocus] flushed ${roomName} after 412 retry (etag=${retry.etag})`) + // Notify connected clients so they can surface a toast — the previous + // server content is recoverable from OpenCloud's version history. + try { + doc.broadcastStateless( + JSON.stringify({ + type: 'externalOverwrite', + fromEtag: fresh.etag, + toEtag: retry.etag + }) + ) + } catch (err) { + console.warn(`[hocuspocus] broadcastStateless failed for ${roomName}:`, err) + } + } catch (err) { + console.error(`[hocuspocus] 412 recovery failed for ${roomName}; keeping previous etag:`, err) + } + return + } + if (status < 200 || status >= 300) { + // Keep state.etag so the next attempt still goes through optimistic + // concurrency — don't mark this write as confirmed. + console.error(`[hocuspocus] webdav PUT ${status} for ${roomName}`) + return + } + state.etag = etag + console.log(`[hocuspocus] flushed ${roomName} (etag=${etag})`) +} + +async function bootstrap() { + await loadJwks() + + const server = Server.configure({ + port: PORT, + debounce: SAVE_DEBOUNCE_MS, + extensions: [new Logger()], + async onAuthenticate({ token, documentName }) { + if (!jwksGetter) { + throw new Error('JWKS not loaded') + } + const { payload } = await jwtVerify(token, jwksGetter, { + issuer: oidcIssuer ?? undefined + }) + // Stash the freshest token for this room so disconnect-time flushes can + // still authenticate against WebDAV. + const existing = rooms.get(documentName) + if (existing) { + existing.latestToken = token + } + return { token, user: payload } satisfies { token: string; user: JWTPayload } + }, + async onLoadDocument({ documentName, context }) { + const ctx = context as { token: string } + const parsed = parseRoom(documentName) + const { body, etag } = await webdavGet(ctx.token, parsed.fileId) + rooms.set(documentName, { + fileId: parsed.fileId, + ct: parsed.ct, + etag, + latestToken: ctx.token + }) + console.log( + `[hocuspocus] loaded ${documentName} (ct=${parsed.ct}, etag=${etag}, bytes=${body.length})` + ) + return textToYDoc(body, parsed.ct) + }, + async onStoreDocument({ documentName, document }) { + try { + await flushRoom(documentName, document) + } catch (err) { + console.error(`[hocuspocus] store failed for ${documentName}:`, err) + } + }, + async onDisconnect({ documentName, document, clientsCount }) { + if (clientsCount === 0) { + try { + await flushRoom(documentName, document) + } catch (err) { + console.error(`[hocuspocus] final flush failed for ${documentName}:`, err) + } + rooms.delete(documentName) + } + } + }) + + await server.listen() + console.log(`[hocuspocus] listening on :${PORT}`) +} + +bootstrap().catch((err) => { + console.error('[hocuspocus] fatal:', err) + process.exit(1) +}) diff --git a/dev/docker/hocuspocus/tsconfig.json b/dev/docker/hocuspocus/tsconfig.json new file mode 100644 index 0000000000..ca3037e0ec --- /dev/null +++ b/dev/docker/hocuspocus/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "esModuleInterop": true, + "strict": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "noEmit": true + }, + "include": ["server.ts"] +} diff --git a/dev/docker/opencloud.web.config.json b/dev/docker/opencloud.web.config.json index 3838f4896d..f0c70b6beb 100644 --- a/dev/docker/opencloud.web.config.json +++ b/dev/docker/opencloud.web.config.json @@ -2,7 +2,12 @@ "server": "https://host.docker.internal:9200", "theme": "https://host.docker.internal:9200/themes/opencloud/theme.json", "options": { - "contextHelpersReadMore": true + "contextHelpersReadMore": true, + "editor": { + "collaboration": { + "wsUrl": "wss://host.docker.internal:9400" + } + } }, "apps": [ "files", diff --git a/docker-compose.yml b/docker-compose.yml index 6783484e2a..5f37b441cc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,5 @@ x-opencloud-server: &opencloud-service - image: ${OC_IMAGE:-opencloudeu/opencloud-rolling:daily} + image: ${OC_IMAGE:-opencloudeu/opencloud-rolling:6.1.0} entrypoint: /bin/sh command: ['-c', 'opencloud init || true && opencloud server'] environment: &opencloud-environment @@ -190,6 +190,33 @@ services: driver: ${LOG_DRIVER:-local} restart: unless-stopped + hocuspocus: + build: + context: ./dev/docker/hocuspocus + container_name: web_hocuspocus + depends_on: + opencloud: + condition: service_started + environment: + PORT: '9400' + OC_URL: ${OC_URL:-https://host.docker.internal:9200} + IDP_ISSUER: ${HOCUSPOCUS_IDP_ISSUER:-${OC_URL:-https://host.docker.internal:9200}} + SAVE_DEBOUNCE_MS: '${HOCUSPOCUS_SAVE_DEBOUNCE_MS:-2000}' + # Dev only — accept the self-signed OpenCloud cert. + NODE_TLS_REJECT_UNAUTHORIZED: '0' + extra_hosts: + - host.docker.internal:${DOCKER_HOST:-host-gateway} + labels: + traefik.enable: true + traefik.docker.network: traefik + traefik.http.routers.hocuspocus.tls: true + traefik.http.routers.hocuspocus.rule: PathPrefix(`/`) + traefik.http.routers.hocuspocus.entrypoints: hocuspocus + traefik.http.services.hocuspocus.loadbalancer.server.port: 9400 + networks: + - traefik + restart: unless-stopped + collabora: image: collabora/code:25.04.9.4.1 entrypoint: ['/bin/bash', '-c'] @@ -248,6 +275,7 @@ services: - '--entrypoints.wopi.address=:8880' - '--entrypoints.collaboration.address=:9300' - '--entrypoints.collaboration-oo.address=:9302' + - '--entrypoints.hocuspocus.address=:9400' - '--entrypoints.stalwart-tls.address=:443' - '--entrypoints.stalwart-tls.http.middlewares=https_config@docker' - '--entrypoints.stalwart-tls.http.tls.options=default' @@ -273,6 +301,7 @@ services: - '9200:9200' - '9300:9300' - '9302:9302' + - '9400:9400' - '10200:10200' - '9980:9980' - '8880:8880' diff --git a/package.json b/package.json index faf3232266..b609aa3aee 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "engines": { "node": ">=22" }, - "packageManager": "pnpm@10.33.4", + "packageManager": "pnpm@11.1.3", "volta": { "node": "24.15.0" }, diff --git a/packages/web-app-text-editor/src/App.vue b/packages/web-app-text-editor/src/App.vue index e448bfd293..768336c0fa 100644 --- a/packages/web-app-text-editor/src/App.vue +++ b/packages/web-app-text-editor/src/App.vue @@ -1,23 +1,27 @@ diff --git a/packages/web-app-text-editor/src/TextEditor.vue b/packages/web-app-text-editor/src/TextEditor.vue new file mode 100644 index 0000000000..f595b269f8 --- /dev/null +++ b/packages/web-app-text-editor/src/TextEditor.vue @@ -0,0 +1,44 @@ + + + diff --git a/packages/web-pkg/package.json b/packages/web-pkg/package.json index 2c4a51ce11..07cc1a2efd 100644 --- a/packages/web-pkg/package.json +++ b/packages/web-pkg/package.json @@ -49,11 +49,14 @@ "dependencies": { "@casl/ability": "^6.8.0", "@casl/vue": "^2.2.6", + "@hocuspocus/provider": "^2.15.2", "@microsoft/fetch-event-source": "^2.0.1", "@opencloud-eu/design-system": "workspace:^", "@opencloud-eu/web-client": "workspace:^", "@sentry/vue": "^10.46.0", "@tiptap/core": "^3.20.4", + "@tiptap/extension-collaboration": "^3.20.4", + "@tiptap/extension-collaboration-caret": "^3.20.4", "@tiptap/extension-document": "^3.20.4", "@tiptap/extension-hard-break": "^3.20.4", "@tiptap/extension-image": "^3.20.4", @@ -95,6 +98,7 @@ "vue-concurrency": "^5.0.3", "vue-router": "^5.0.4", "vue3-gettext": "4.0.0-beta.1", + "yjs": "^13.6.20", "zod": "^4.3.6" }, "devDependencies": { diff --git a/packages/web-pkg/src/composables/piniaStores/config/types.ts b/packages/web-pkg/src/composables/piniaStores/config/types.ts index 90c06f3d4d..fb6b5232ab 100644 --- a/packages/web-pkg/src/composables/piniaStores/config/types.ts +++ b/packages/web-pkg/src/composables/piniaStores/config/types.ts @@ -72,7 +72,12 @@ const OptionsConfigSchema = z.object({ .object({ autosaveEnabled: z.boolean().optional(), autosaveInterval: z.number().optional(), - openAsPreview: z.union([z.boolean(), z.array(z.string())]).optional() + openAsPreview: z.union([z.boolean(), z.array(z.string())]).optional(), + collaboration: z + .object({ + wsUrl: z.string() + }) + .optional() }) .optional(), embed: z diff --git a/packages/web-pkg/src/editor/composables/strategies/markdown.ts b/packages/web-pkg/src/editor/composables/strategies/markdown.ts index 325632e342..46eaa3ea2a 100644 --- a/packages/web-pkg/src/editor/composables/strategies/markdown.ts +++ b/packages/web-pkg/src/editor/composables/strategies/markdown.ts @@ -1,5 +1,5 @@ import { EditorActionGroup, useEditorActions } from '../useEditorActions' -import { ContentTypeStrategy } from './types' +import { ContentTypeStrategy, StrategyExtensionsOptions } from './types' import type { Extension } from '@tiptap/core' import StarterKit from '@tiptap/starter-kit' import { Markdown } from '@tiptap/markdown' @@ -27,9 +27,9 @@ export const useStrategyMarkdown = (editorState: TextEditorState): ContentTypeSt return content } - const extensions = (): Extension[] => { + const extensions = (opts?: StrategyExtensionsOptions): Extension[] => { return [ - StarterKit.configure({ link: false }), + StarterKit.configure({ link: false, undoRedo: opts?.collaboration ? false : undefined }), Markdown, Link.configure({ openOnClick: true, diff --git a/packages/web-pkg/src/editor/composables/strategies/types.ts b/packages/web-pkg/src/editor/composables/strategies/types.ts index e09cf32ec2..830fb6d8cd 100644 --- a/packages/web-pkg/src/editor/composables/strategies/types.ts +++ b/packages/web-pkg/src/editor/composables/strategies/types.ts @@ -2,10 +2,14 @@ import type { Extension } from '@tiptap/core' import type { EditorActionGroup } from '../useEditorActions' import type { Editor } from '@tiptap/vue-3' +export interface StrategyExtensionsOptions { + collaboration?: boolean +} + export interface ContentTypeStrategy { editorContentType?(): string serialize(editor: Editor): string deserialize(content: string): Record | string - extensions(): Extension[] + extensions(opts?: StrategyExtensionsOptions): Extension[] editorActionGroups(): EditorActionGroup[] } diff --git a/packages/web-pkg/src/editor/composables/useTextEditor.ts b/packages/web-pkg/src/editor/composables/useTextEditor.ts index 4286dbd5c6..6278661e8a 100644 --- a/packages/web-pkg/src/editor/composables/useTextEditor.ts +++ b/packages/web-pkg/src/editor/composables/useTextEditor.ts @@ -3,6 +3,9 @@ import { useEditor } from '@tiptap/vue-3' import { Placeholder } from '@tiptap/extension-placeholder' import type { ShallowRef } from 'vue' import type { Editor } from '@tiptap/vue-3' +import { HocuspocusProvider } from '@hocuspocus/provider' +import Collaboration from '@tiptap/extension-collaboration' +import CollaborationCaret from '@tiptap/extension-collaboration-caret' import type { TextEditorOptions, TextEditorInstance, TextEditorState } from '../types' import { SlashCommands } from '../extensions' import { useContentStrategy } from './useContentStrategy' @@ -16,10 +19,37 @@ export function useTextEditor(options: TextEditorOptions): TextEditorInstance { const contentType = ref(options.contentType) const readonly = ref(options.readonly ?? false) const strategy = resolveStrategy(options.contentType, state) + const collaboration = options.collaboration let debounceTimer: ReturnType | null = null - const extensions = strategy.extensions() + // Set when Hocuspocus rejects the token. Once true the editor stops + // suppressing AppWrapper's autosave path so the user's edits still get + // persisted via the single-user WebDAV PUT route as a safety net. + const collabFailed = ref(false) + + const provider = collaboration + ? new HocuspocusProvider({ + url: collaboration.wsUrl, + name: collaboration.room, + token: collaboration.token, + onAuthenticationFailed: ({ reason }) => { + console.error( + '[useTextEditor] hocuspocus authentication failed; falling back to single-user autosave', + reason + ) + collabFailed.value = true + // Immediately push the current editor state to AppWrapper so the + // dirty state engages now — don't wait for the next keystroke. + if (options.onUpdate && editor.value) { + options.onUpdate(strategy.serialize(editor.value)) + } + }, + onStateless: ({ payload }) => collaboration.onStateless?.(payload) + }) + : null + + const extensions = strategy.extensions({ collaboration: !!collaboration }) if (options.slashCommands !== false) { const resolvedGroups = strategy.editorActionGroups() if (resolvedGroups.length > 0) { @@ -28,6 +58,18 @@ export function useTextEditor(options: TextEditorOptions): TextEditorInstance { ) } } + if (provider && collaboration) { + extensions.push( + Collaboration.configure({ + document: provider.document, + field: 'default' + }) as (typeof extensions)[number], + CollaborationCaret.configure({ + provider, + user: collaboration.user + }) as (typeof extensions)[number] + ) + } if (options.placeholder) { extensions.push( @@ -39,16 +81,24 @@ export function useTextEditor(options: TextEditorOptions): TextEditorInstance { // to satisfy TextEditorInstance. The destroy() method sets it to null explicitly. const editorOptions: Record = { extensions, - content: unref(options.modelValue) ? strategy.deserialize(unref(options.modelValue)) : '', + // In collaboration mode the Y.Doc is the source of truth; seeding here would + // duplicate the document body for every joining client. + content: collaboration + ? null + : unref(options.modelValue) + ? strategy.deserialize(unref(options.modelValue)) + : '', editable: !readonly.value } - watch(options.modelValue, (content) => { - if (!unref(editor) || unref(editor)?.isFocused) { - return - } - setContent(content) - }) + if (!collaboration) { + watch(options.modelValue, (content) => { + if (!unref(editor) || unref(editor)?.isFocused) { + return + } + setContent(content) + }) + } if (strategy.editorContentType) { editorOptions.contentType = strategy.editorContentType() @@ -66,7 +116,11 @@ export function useTextEditor(options: TextEditorOptions): TextEditorInstance { const editor = useEditor({ ...editorOptions, onUpdate({ editor: e }) { - if (!options.onUpdate) { + // In collaboration mode the hocuspocus server is the writer of record, + // so we suppress the AppWrapper autosave path — UNLESS authentication + // failed, in which case we re-engage it as a safety net against + // dataloss. + if (!options.onUpdate || (collaboration && !collabFailed.value)) { return } if (debounceTimer) { @@ -115,13 +169,14 @@ export function useTextEditor(options: TextEditorOptions): TextEditorInstance { const destroy = (): void => { if (debounceTimer) { clearTimeout(debounceTimer) - if (options.onUpdate && editor.value) { + if (options.onUpdate && editor.value && (!collaboration || collabFailed.value)) { options.onUpdate(strategy.serialize(editor.value)) } debounceTimer = null } editor.value?.destroy() editor.value = null + provider?.destroy() } const triggerEditorUpdate = () => triggerRef(editor) diff --git a/packages/web-pkg/src/editor/composables/userColor.ts b/packages/web-pkg/src/editor/composables/userColor.ts new file mode 100644 index 0000000000..60f2cd65dc --- /dev/null +++ b/packages/web-pkg/src/editor/composables/userColor.ts @@ -0,0 +1,21 @@ +function hslToHex(h: number, s: number, l: number): string { + const a = (s / 100) * Math.min(l / 100, 1 - l / 100) + const channel = (n: number) => { + const k = (n + h / 30) % 12 + const value = l / 100 - a * Math.max(-1, Math.min(k - 3, 9 - k, 1)) + return Math.round(value * 255) + .toString(16) + .padStart(2, '0') + } + return `#${channel(0)}${channel(8)}${channel(4)}` +} + +export function hslColorFromString(seed: string): string { + let hash = 0x811c9dc5 + for (let i = 0; i < seed.length; i++) { + hash ^= seed.charCodeAt(i) + hash = Math.imul(hash, 0x01000193) + } + const hue = Math.abs(hash) % 360 + return hslToHex(hue, 70, 50) +} diff --git a/packages/web-pkg/src/editor/index.ts b/packages/web-pkg/src/editor/index.ts index 2aa1782b42..27ec3c8301 100644 --- a/packages/web-pkg/src/editor/index.ts +++ b/packages/web-pkg/src/editor/index.ts @@ -1,5 +1,12 @@ -export type { ContentType, TextEditorOptions, TextEditorInstance } from './types' +export type { + ContentType, + TextEditorOptions, + TextEditorInstance, + TextEditorCollaborationOptions, + TextEditorCollaborationUser +} from './types' export { useTextEditor } from './composables/useTextEditor' +export { hslColorFromString } from './composables/userColor' export { default as TextEditorProvider } from './components/TextEditorProvider.vue' export { default as TextEditorContent } from './components/TextEditorContent.vue' export { default as TextEditorToolbar } from './components/TextEditorToolbar.vue' diff --git a/packages/web-pkg/src/editor/styles/collaboration-carets.css b/packages/web-pkg/src/editor/styles/collaboration-carets.css new file mode 100644 index 0000000000..22b8e9c4ce --- /dev/null +++ b/packages/web-pkg/src/editor/styles/collaboration-carets.css @@ -0,0 +1,25 @@ +.collaboration-carets__caret { + border-left: 1px solid #0d0d0d; + border-right: 1px solid #0d0d0d; + margin-left: -1px; + margin-right: -1px; + pointer-events: none; + position: relative; + word-break: normal; +} + +.collaboration-carets__label { + border-radius: 3px 3px 3px 0; + background-color: inherit; + color: #0d0d0d; + font-size: 12px; + font-style: normal; + font-weight: 600; + left: -1px; + line-height: normal; + padding: 0.1rem 0.3rem; + position: absolute; + top: -1.4em; + user-select: none; + white-space: nowrap; +} diff --git a/packages/web-pkg/src/editor/styles/content.css b/packages/web-pkg/src/editor/styles/content.css index 5aef3e34ed..70c2e1b455 100644 --- a/packages/web-pkg/src/editor/styles/content.css +++ b/packages/web-pkg/src/editor/styles/content.css @@ -1,2 +1,3 @@ @import './text-editor.css'; @import './markdown-source-mode.css'; +@import './collaboration-carets.css'; diff --git a/packages/web-pkg/src/editor/types.ts b/packages/web-pkg/src/editor/types.ts index 38c341d354..30f142035b 100644 --- a/packages/web-pkg/src/editor/types.ts +++ b/packages/web-pkg/src/editor/types.ts @@ -4,6 +4,28 @@ import { EditorActionGroup } from './composables' export type ContentType = 'plain-text' | 'markdown' | 'html' | 'tiptap-json' +export interface TextEditorCollaborationUser { + id: string + name: string + color: string +} + +export interface TextEditorCollaborationOptions { + wsUrl: string + room: string + // Token getter — Hocuspocus calls this on every (re)connect attempt. The + // OpenCloud web client maintains a current OIDC access token in its auth + // store via a refresh worker, so a synchronous read of that store is the + // canonical source; we don't need our own waiting/refresh logic. + token: () => string + user: TextEditorCollaborationUser + // Optional handler for server-broadcasted stateless messages. The server + // uses this to inform connected clients about out-of-band events such as + // external file overwrites. Payload is whatever the server sends (a JSON + // string in our wire format). + onStateless?: (payload: string) => void +} + export interface TextEditorOptions { contentType: ContentType modelValue?: Ref @@ -13,6 +35,7 @@ export interface TextEditorOptions { onUpdate?: (content: string) => void onRequestLinkUrl?: (currentUrl?: string) => Promise onRequestImageUrl?: () => Promise + collaboration?: TextEditorCollaborationOptions } export interface TextEditorState { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a21712cf8c..c60a568630 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,17 +4,6 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - epubjs>@xmldom/xmldom: ^0.9.10 - -patchedDependencies: - caf@15.0.1: - hash: b09bdde8a1f7e834af8677123b32ceb4f485966fdb476facf5b6c64157c9fc14 - path: patches/caf@15.0.1.patch - vue-inline-svg@4.0.1: - hash: 29bc386a6e932912ee46485a87911f6ff5409dca9ed70ba0ff32c52d6f56986b - path: patches/vue-inline-svg@4.0.1.patch - importers: .: @@ -36,7 +25,7 @@ importers: version: 2.4.0(node-fetch@3.3.2) '@module-federation/vite': specifier: 1.15.5 - version: 1.15.5(node-fetch@3.3.2)(typescript@6.0.3)(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))(vue-tsc@3.3.0(typescript@6.0.3)) + version: 1.15.5(node-fetch@3.3.2)(typescript@6.0.3)(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))(vue-tsc@3.3.0(typescript@6.0.3)) '@noble/hashes': specifier: 2.2.0 version: 2.2.0 @@ -54,7 +43,7 @@ importers: version: 1.60.0 '@tailwindcss/vite': specifier: ^4.2.2 - version: 4.3.0(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) + version: 4.3.0(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) '@types/lodash-es': specifier: ^4.17.12 version: 4.17.12 @@ -69,7 +58,7 @@ importers: version: 6.15.1 '@vitejs/plugin-vue': specifier: 6.0.7 - version: 6.0.7(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))(vue@3.5.34(typescript@6.0.3)) + version: 6.0.7(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))(vue@3.5.34(typescript@6.0.3)) '@vitest/coverage-v8': specifier: ^4.1.2 version: 4.1.6(vitest@4.1.6) @@ -87,10 +76,10 @@ importers: version: 2.4.10(@vue/compiler-dom@3.5.34)(@vue/server-renderer@3.5.34(vue@3.5.34(typescript@6.0.3)))(vue@3.5.34(typescript@6.0.3)) browserslist-to-esbuild: specifier: ^2.1.1 - version: 2.1.1(browserslist@4.28.1) + version: 2.1.1(browserslist@4.28.2) browserslist-useragent-regexp: specifier: ^4.1.3 - version: 4.1.4(browserslist@4.28.1) + version: 4.1.4(browserslist@4.28.2) eslint: specifier: 10.4.0 version: 10.4.0(jiti@2.7.0) @@ -129,16 +118,16 @@ importers: version: 6.0.3 vite: specifier: ^8.0.3 - version: 8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) + version: 8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) vite-plugin-node-polyfills: specifier: 0.28.0 - version: 0.28.0(rollup@4.60.0)(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) + version: 0.28.0(rollup@4.60.4)(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) vite-plugin-static-copy: specifier: ^4.0.0 - version: 4.1.0(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) + version: 4.1.0(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) vitest: specifier: ^4.1.2 - version: 4.1.6(@types/node@25.9.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.9.0)(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) + version: 4.1.6(@types/node@25.9.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.9.0)(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) vitest-mock-extended: specifier: 4.0.0 version: 4.0.0(typescript@6.0.3)(vitest@4.1.6) @@ -186,7 +175,7 @@ importers: version: 3.0.4(typescript@6.0.3)(vue@3.5.34(typescript@6.0.3)) vue-inline-svg: specifier: ^4.0.1 - version: 4.0.1(patch_hash=29bc386a6e932912ee46485a87911f6ff5409dca9ed70ba0ff32c52d6f56986b)(vue@3.5.34(typescript@6.0.3)) + version: 4.0.1(vue@3.5.34(typescript@6.0.3)) vue-router: specifier: ^5.0.4 version: 5.0.7(@vue/compiler-sfc@3.5.34)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.34(typescript@6.0.3)))(vue@3.5.34(typescript@6.0.3)) @@ -202,16 +191,16 @@ importers: version: link:../web-test-helpers '@tailwindcss/vite': specifier: ^4.2.2 - version: 4.3.0(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) + version: 4.3.0(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) '@vitejs/plugin-vue': specifier: 6.0.7 - version: 6.0.7(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))(vue@3.5.34(typescript@6.0.3)) + version: 6.0.7(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))(vue@3.5.34(typescript@6.0.3)) markdown-it-container: specifier: ^4.0.0 version: 4.0.0 postcss: specifier: ^8.5.8 - version: 8.5.15 + version: 8.5.14 process: specifier: ^0.11.10 version: 0.11.10 @@ -226,19 +215,19 @@ importers: version: 0.11.4 vite: specifier: ^8.0.3 - version: 8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) + version: 8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) vite-plugin-node-polyfills: specifier: ^0.28.0 - version: 0.28.0(rollup@4.60.0)(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) + version: 0.28.0(rollup@4.60.4)(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) vitepress: specifier: ^1.6.4 - version: 1.6.4(@algolia/client-search@5.50.0)(@types/node@25.9.0)(axios@1.16.1)(fuse.js@7.3.0)(jwt-decode@4.0.0)(lightningcss@1.32.0)(postcss@8.5.15)(sass@1.99.0)(search-insights@2.17.3)(typescript@6.0.3) + version: 1.6.4(@algolia/client-search@5.52.1)(@types/node@25.9.0)(axios@1.16.1)(fuse.js@7.3.0)(jwt-decode@4.0.0)(lightningcss@1.32.0)(postcss@8.5.14)(sass@1.99.0)(search-insights@2.17.3)(typescript@6.0.3) packages/eslint-config: dependencies: '@typescript-eslint/parser': specifier: ^8.57.2 - version: 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + version: 8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) eslint: specifier: ^9.0.0 || ^10.0.0 version: 10.4.0(jiti@2.7.0) @@ -247,47 +236,47 @@ importers: version: 10.1.8(eslint@10.4.0(jiti@2.7.0)) eslint-plugin-unused-imports: specifier: ^4.4.1 - version: 4.4.1(@typescript-eslint/eslint-plugin@8.59.4(@typescript-eslint/parser@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0)) + version: 4.4.1(@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0)) eslint-plugin-vue: specifier: ^10.8.0 - version: 10.9.1(@typescript-eslint/parser@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0))(vue-eslint-parser@10.4.0(eslint@10.4.0(jiti@2.7.0))) + version: 10.9.1(@typescript-eslint/parser@8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0))(vue-eslint-parser@10.4.0(eslint@10.4.0(jiti@2.7.0))) typescript: specifier: ^6.0.0 version: 6.0.3 typescript-eslint: specifier: ^8.57.2 - version: 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + version: 8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) packages/extension-sdk: dependencies: '@module-federation/vite': specifier: 1.15.4 - version: 1.15.4(node-fetch@3.3.2)(typescript@6.0.3)(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))(vue-tsc@3.3.0(typescript@6.0.3)) + version: 1.15.4(node-fetch@3.3.2)(typescript@6.0.3)(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))(vue-tsc@3.3.0(typescript@6.0.3)) '@tailwindcss/vite': specifier: ^4.2.2 - version: 4.3.0(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) + version: 4.3.0(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) '@vitejs/plugin-basic-ssl': specifier: ^2.3.0 - version: 2.3.0(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) + version: 2.3.0(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) '@vitejs/plugin-vue': specifier: ^6.0.5 - version: 6.0.7(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))(vue@3.5.34(typescript@6.0.3)) + version: 6.0.7(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))(vue@3.5.34(typescript@6.0.3)) vite: specifier: ^7.2.0 || ^8.0.0 - version: 8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) + version: 8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) vitest: specifier: ^4.0.0 - version: 4.1.6(@types/node@25.9.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.9.0)(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) + version: 4.1.6(@types/node@25.9.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.9.0)(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) devDependencies: vite-plugin-static-copy: specifier: ^4.0.0 - version: 4.1.0(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) + version: 4.1.0(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) packages/prettier-config: dependencies: prettier: specifier: ^3.0.0 - version: 3.8.1 + version: 3.8.3 packages/tsconfig: {} @@ -803,7 +792,7 @@ importers: version: 14.0.0 webdav: specifier: ^5.9.0 - version: 5.9.0 + version: 5.10.0 zod: specifier: ^4.3.6 version: 4.4.3 @@ -816,10 +805,10 @@ importers: version: 25.9.0 vite: specifier: ^8.0.3 - version: 8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) + version: 8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) vite-plugin-node-polyfills: specifier: 0.28.0 - version: 0.28.0(rollup@4.60.0)(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) + version: 0.28.0(rollup@4.60.4)(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) packages/web-pkg: dependencies: @@ -829,6 +818,9 @@ importers: '@casl/vue': specifier: ^2.2.6 version: 2.2.6(@casl/ability@6.8.1)(vue@3.5.34(typescript@6.0.3)) + '@hocuspocus/provider': + specifier: ^2.15.2 + version: 2.15.3(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30) '@microsoft/fetch-event-source': specifier: ^2.0.1 version: 2.0.1 @@ -844,6 +836,12 @@ importers: '@tiptap/core': specifier: ^3.20.4 version: 3.23.4(@tiptap/pm@3.23.4) + '@tiptap/extension-collaboration': + specifier: ^3.20.4 + version: 3.23.4(@tiptap/core@3.23.4(@tiptap/pm@3.23.4))(@tiptap/pm@3.23.4)(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.7)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(yjs@13.6.30) + '@tiptap/extension-collaboration-caret': + specifier: ^3.20.4 + version: 3.23.4(@tiptap/core@3.23.4(@tiptap/pm@3.23.4))(@tiptap/pm@3.23.4)(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.7)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30)) '@tiptap/extension-document': specifier: ^3.20.4 version: 3.23.4(@tiptap/core@3.23.4(@tiptap/pm@3.23.4)) @@ -861,7 +859,7 @@ importers: version: 3.23.4(@tiptap/core@3.23.4(@tiptap/pm@3.23.4)) '@tiptap/extension-placeholder': specifier: ^3.20.4 - version: 3.23.5(@tiptap/extensions@3.23.5(@tiptap/core@3.23.4(@tiptap/pm@3.23.4))(@tiptap/pm@3.23.4)) + version: 3.23.4(@tiptap/extensions@3.23.4(@tiptap/core@3.23.4(@tiptap/pm@3.23.4))(@tiptap/pm@3.23.4)) '@tiptap/extension-table': specifier: ^3.20.4 version: 3.23.4(@tiptap/core@3.23.4(@tiptap/pm@3.23.4))(@tiptap/pm@3.23.4) @@ -967,6 +965,9 @@ importers: vue3-gettext: specifier: 4.0.0-beta.1 version: 4.0.0-beta.1(@vue/compiler-sfc@3.5.34)(vue@3.5.34(typescript@6.0.3)) + yjs: + specifier: ^13.6.20 + version: 13.6.30 zod: specifier: ^4.3.6 version: 4.4.3 @@ -985,7 +986,7 @@ importers: version: 4.1.6(vitest@4.1.6) vite-plugin-node-polyfills: specifier: 0.28.0 - version: 0.28.0(rollup@4.60.0)(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) + version: 0.28.0(rollup@4.60.4)(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) packages/web-runtime: dependencies: @@ -1128,10 +1129,10 @@ importers: version: 25.9.0 '@vitejs/plugin-vue': specifier: 6.0.7 - version: 6.0.7(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))(vue@3.5.34(typescript@6.0.3)) + version: 6.0.7(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))(vue@3.5.34(typescript@6.0.3)) vite: specifier: ^8.0.3 - version: 8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) + version: 8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) tests/e2e: devDependencies: @@ -1156,8 +1157,8 @@ packages: '@ai-zen/node-fetch-event-source@2.1.4': resolution: {integrity: sha512-OHFwPJecr+qwlyX5CGmTvKAKPZAdZaxvx/XDqS1lx4I2ZAk9riU0XnEaRGOOAEFrdcLZ98O5yWqubwjaQc0umg==} - '@algolia/abtesting@1.16.0': - resolution: {integrity: sha512-alHFZ68/i9qLC/muEB07VQ9r7cB8AvCcGX6dVQi2PNHhc/ZQRmmFAv8KK1ay4UiseGSFr7f0nXBKsZ/jRg7e4g==} + '@algolia/abtesting@1.18.1': + resolution: {integrity: sha512-aehCadlWOGvrT91KUIZpC0MbB8KBW9yUuvTJFd2xesR7le/IsT4nJUnjCCZ4ZqZCeTcPHPV5mo//fZ5oxcSVYw==} engines: {node: '>= 14.0.0'} '@algolia/autocomplete-core@1.17.7': @@ -1180,56 +1181,56 @@ packages: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/client-abtesting@5.50.0': - resolution: {integrity: sha512-mfgUdLQNxOAvCZUGzPQxjahEWEPuQkKlV0ZtGmePOa9ZxIQZlk31vRBNbM6ScU8jTH41SCYE77G/lCifDr1SVw==} + '@algolia/client-abtesting@5.52.1': + resolution: {integrity: sha512-HmXOGBOAOJPounpBzBpuY0zDYeiCpxgHnQmuA7JO6ScukcBdGp3/XM9zJk5pJx/xNGD68mbPGXWpDxGtl6BwDQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.50.0': - resolution: {integrity: sha512-5mjokeKYyPaP3Q8IYJEnutI+O4dW/Ixxx5IgsSxT04pCfGqPXxTOH311hTQxyNpcGGEOGrMv8n8Z+UMTPamioQ==} + '@algolia/client-analytics@5.52.1': + resolution: {integrity: sha512-5oo4+I8iixie9vXhCyNFCzeIr8pqA3FQ//VsLHTDvZAV4ttYOPGvYHGQq5NSalrLx5Jc3dRro/5uDOlnUMcBJg==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.50.0': - resolution: {integrity: sha512-emtOvR6dl3rX3sBJXXbofMNHU1qMQqQSWu319RMrNL5BWoBqyiq7y0Zn6cjJm7aGHV/Qbf+KCCYeWNKEMPI3BQ==} + '@algolia/client-common@5.52.1': + resolution: {integrity: sha512-qCDoZfx5MpX7XQzvQ3bC4tSEMkQWQMaF/ABtLuoze03Y/flR563CCSws02qIJ23oX7lxl92LsilZjINVyTdtLw==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.50.0': - resolution: {integrity: sha512-IerGH2/hcj/6bwkpQg/HHRqmlGN1XwygQWythAk0gZFBrghs9danJaYuSS3ShzLSVoIVth4jY5GDPX9Lbw5cgg==} + '@algolia/client-insights@5.52.1': + resolution: {integrity: sha512-hnGs0/lsFJ2PWDxNBz7pxreXo/Xz7gxYRcfePBUjsH26ad0kU/sgnVZd9LwWBpsQv65z2jlb5dkyaB9WE9M9FQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.50.0': - resolution: {integrity: sha512-3idPJeXn5L0MmgP9jk9JJqblrQ/SguN93dNK9z9gfgyupBhHnJMOEjrRYcVgTIfvG13Y04wO+Q0FxE2Ut8PVbA==} + '@algolia/client-personalization@5.52.1': + resolution: {integrity: sha512-2VxxNc/uBysyKvGeBdSM5n9eIDKH8kWD7wd9/yqbJAiVwU4Yv6tU1LSJusHKrXV/aCu1KW7t9Gug9QyeEmtn/Q==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.50.0': - resolution: {integrity: sha512-q7qRoWrQK1a8m5EFQEmPlo7+pg9mVQ8X5jsChtChERre0uS2pdYEDixBBl0ydBSGkdGbLUDufcACIhH/077E4g==} + '@algolia/client-query-suggestions@5.52.1': + resolution: {integrity: sha512-O6mPtsw3xEfNOe6gWFpYLeAZAIljNa4Hgna3bq15PwyN7nbjTY0wXJFRbzs/0YVf75Br+SbOQUmjKxXYjDiSiQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.50.0': - resolution: {integrity: sha512-Jc360x4yqb3eEg4OY4KEIdGePBxZogivKI+OGIU8aLXgAYPTECvzeOBc90312yHA1hr3AeRlAFl0rIc8lQaIrQ==} + '@algolia/client-search@5.52.1': + resolution: {integrity: sha512-gA8oJOV1LnQQkDf91iebNnFInHuW0gRPEgLSOQ7EfipCEjYTHm5swm1DlH9H5RaRw4RrHuzHBegnlzc0MAstcg==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.50.0': - resolution: {integrity: sha512-OS3/Viao+NPpyBbEY3tf6hLewppG+UclD+9i0ju56mq2DrdMJFCkEky6Sk9S5VPcbLzxzg3BqBX6u9Q35w19aQ==} + '@algolia/ingestion@1.52.1': + resolution: {integrity: sha512-U9zZfc5xIu9wRxZkt+HceJUAD4VKHKbAyLSloJdEyMRmphXeibfrY9cxqIXBcmPeZzGhn3Imb35Dq8l19PkJhw==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.50.0': - resolution: {integrity: sha512-/znwgSiGufpbJVIoDmeQaHtTq+OMdDawFRbMSJVv+12n79hW+qdQXS8/Uu3BD3yn0BzgVFJEvrsHrCsInZKdhw==} + '@algolia/monitoring@1.52.1': + resolution: {integrity: sha512-a3SGNceHmkQfq77iG8Ka+w1pvwfZa/0lzEIgse30fL0kD+yKnd/dg0dQvSfFPAEt2f21DMcGkDSSeJlO3KdQjQ==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.50.0': - resolution: {integrity: sha512-dHjUfu4jfjdQiKDpCpAnM7LP5yfG0oNShtfpF5rMCel6/4HIoqJ4DC4h5GKDzgrvJYtgAhblo0AYBmOM00T+lQ==} + '@algolia/recommend@5.52.1': + resolution: {integrity: sha512-z98QEguCFDpxb4S/PyrUK1igqF8tPsdbqOUUO6ON91vJ58w+Gwa6ncrI0oNXSFcrkxA5EqPKPQ2A1PBCn08TYQ==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.50.0': - resolution: {integrity: sha512-bffIbUljAWnh/Ctu5uScORajuUavqmZ0ACYd1fQQeSSYA9NNN83ynO26pSc2dZRXpSK0fkc1//qSSFXMKGu+aw==} + '@algolia/requester-browser-xhr@5.52.1': + resolution: {integrity: sha512-CI7+/0I11QeZM59Uc8whd2or0kqzFVjpaPn9Qpwll/krHcBAxk24WkAQ6WX+IwDVMfpont4YGbKwAmCre3vE8Q==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.50.0': - resolution: {integrity: sha512-y0EwNvPGvkM+yTAqqO6Gpt9wVGm3CLDtpLvNEiB3VGvN3WzfkjZGtLUsG/ru2kVJIIU7QcV0puuYgEpBeFxcJg==} + '@algolia/requester-fetch@5.52.1': + resolution: {integrity: sha512-S6bDuw9byfOvm3T71cgdoZgrgnZq6hpdMLkx52Louh57nUAmvGQESz2aojOynQHjbTiV55smvAFbgn0qT4tJrg==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.50.0': - resolution: {integrity: sha512-xpwefe4fCOWnZgXCbkGpqQY6jgBSCf2hmgnySbyzZIccrv3SoashHKGPE4x6vVG+gdHrGciMTAcDo9HOZwH22Q==} + '@algolia/requester-node-http@5.52.1': + resolution: {integrity: sha512-tqZXM+54rWo4mk5jL5Z/flE11nPmNEdXwFBM5py9DkOmbjeCNemfVd45FyM97XdzfZ0dl9uOJC6PYn1FpkeyQg==} engines: {node: '>= 14.0.0'} '@axe-core/playwright@4.11.3': @@ -1440,294 +1441,138 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.27.2': - resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.27.2': - resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - '@esbuild/android-arm@0.27.2': - resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - '@esbuild/android-x64@0.27.2': - resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.27.2': - resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.27.2': - resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.27.2': - resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.2': - resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.27.2': - resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.27.2': - resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.27.2': - resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.2': - resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.27.2': - resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.2': - resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.27.2': - resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.2': - resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.27.2': - resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.27.2': - resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.2': - resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.27.2': - resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.2': - resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.27.2': - resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.2': - resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.27.2': - resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.27.2': - resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.2': - resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1767,12 +1612,25 @@ packages: '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + '@hocuspocus/common@2.15.3': + resolution: {integrity: sha512-Rzh1HF0a2o/tf90A3w2XNdXd9Ym3aQzMDfD3lAUONCX9B9QOdqdyiORrj6M25QEaJrEIbXFy8LtAFcL0wRdWzA==} + + '@hocuspocus/provider@2.15.3': + resolution: {integrity: sha512-oadN05m+KL4ylNKVo5YspNG4MXkT2Y+FUFzrgigpQeTjQibkPUwCNmUnkUxMgrGRgxb+O0lJCfirFIJMxedctA==} + peerDependencies: + y-protocols: ^1.0.6 + yjs: ^13.6.8 + + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': @@ -1783,8 +1641,8 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@iconify-json/simple-icons@1.2.75': - resolution: {integrity: sha512-KvcCUbvcBWb0sbqLIxHoY8z5/piXY08wcY9gfMhF+ph3AfzGMaSmZFkUY71HSXAljQngXkgs4bdKdekO0HQWvg==} + '@iconify-json/simple-icons@1.2.82': + resolution: {integrity: sha512-4p978qHx8eD/QBOhgBzp/p7uS3OO2KCnVpFPJTUvuhuDXv1Hr4RcxcZ5MWc6ptkf/3Dlb1xb23068OtPyx10mA==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -1816,6 +1674,9 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@lifeomic/attempt@3.1.0': + resolution: {integrity: sha512-QZqem4QuAnAyzfz+Gj5/+SLxqwCAw2qmt7732ZXodr6VDWGeYLG6w1i/vYLa55JQM9wRuBKLmXmiZ2P0LtE5rw==} + '@microsoft/fetch-event-source@2.0.1': resolution: {integrity: sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA==} @@ -2108,141 +1969,141 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.60.0': - resolution: {integrity: sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A==} + '@rollup/rollup-android-arm-eabi@4.60.4': + resolution: {integrity: sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.60.0': - resolution: {integrity: sha512-u6JHLll5QKRvjciE78bQXDmqRqNs5M/3GVqZeMwvmjaNODJih/WIrJlFVEihvV0MiYFmd+ZyPr9wxOVbPAG2Iw==} + '@rollup/rollup-android-arm64@4.60.4': + resolution: {integrity: sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.60.0': - resolution: {integrity: sha512-qEF7CsKKzSRc20Ciu2Zw1wRrBz4g56F7r/vRwY430UPp/nt1x21Q/fpJ9N5l47WWvJlkNCPJz3QRVw008fi7yA==} + '@rollup/rollup-darwin-arm64@4.60.4': + resolution: {integrity: sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.60.0': - resolution: {integrity: sha512-WADYozJ4QCnXCH4wPB+3FuGmDPoFseVCUrANmA5LWwGmC6FL14BWC7pcq+FstOZv3baGX65tZ378uT6WG8ynTw==} + '@rollup/rollup-darwin-x64@4.60.4': + resolution: {integrity: sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.60.0': - resolution: {integrity: sha512-6b8wGHJlDrGeSE3aH5mGNHBjA0TTkxdoNHik5EkvPHCt351XnigA4pS7Wsj/Eo9Y8RBU6f35cjN9SYmCFBtzxw==} + '@rollup/rollup-freebsd-arm64@4.60.4': + resolution: {integrity: sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.60.0': - resolution: {integrity: sha512-h25Ga0t4jaylMB8M/JKAyrvvfxGRjnPQIR8lnCayyzEjEOx2EJIlIiMbhpWxDRKGKF8jbNH01NnN663dH638mA==} + '@rollup/rollup-freebsd-x64@4.60.4': + resolution: {integrity: sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.60.0': - resolution: {integrity: sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g==} + '@rollup/rollup-linux-arm-gnueabihf@4.60.4': + resolution: {integrity: sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.60.0': - resolution: {integrity: sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ==} + '@rollup/rollup-linux-arm-musleabihf@4.60.4': + resolution: {integrity: sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.60.0': - resolution: {integrity: sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A==} + '@rollup/rollup-linux-arm64-gnu@4.60.4': + resolution: {integrity: sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.60.0': - resolution: {integrity: sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ==} + '@rollup/rollup-linux-arm64-musl@4.60.4': + resolution: {integrity: sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.60.0': - resolution: {integrity: sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw==} + '@rollup/rollup-linux-loong64-gnu@4.60.4': + resolution: {integrity: sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.60.0': - resolution: {integrity: sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog==} + '@rollup/rollup-linux-loong64-musl@4.60.4': + resolution: {integrity: sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.60.0': - resolution: {integrity: sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ==} + '@rollup/rollup-linux-ppc64-gnu@4.60.4': + resolution: {integrity: sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.60.0': - resolution: {integrity: sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg==} + '@rollup/rollup-linux-ppc64-musl@4.60.4': + resolution: {integrity: sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.60.0': - resolution: {integrity: sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA==} + '@rollup/rollup-linux-riscv64-gnu@4.60.4': + resolution: {integrity: sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.60.0': - resolution: {integrity: sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ==} + '@rollup/rollup-linux-riscv64-musl@4.60.4': + resolution: {integrity: sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.60.0': - resolution: {integrity: sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ==} + '@rollup/rollup-linux-s390x-gnu@4.60.4': + resolution: {integrity: sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.60.0': - resolution: {integrity: sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg==} + '@rollup/rollup-linux-x64-gnu@4.60.4': + resolution: {integrity: sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.60.0': - resolution: {integrity: sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw==} + '@rollup/rollup-linux-x64-musl@4.60.4': + resolution: {integrity: sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.60.0': - resolution: {integrity: sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw==} + '@rollup/rollup-openbsd-x64@4.60.4': + resolution: {integrity: sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.60.0': - resolution: {integrity: sha512-pESDkos/PDzYwtyzB5p/UoNU/8fJo68vcXM9ZW2V0kjYayj1KaaUfi1NmTUTUpMn4UhU4gTuK8gIaFO4UGuMbA==} + '@rollup/rollup-openharmony-arm64@4.60.4': + resolution: {integrity: sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.60.0': - resolution: {integrity: sha512-hj1wFStD7B1YBeYmvY+lWXZ7ey73YGPcViMShYikqKT1GtstIKQAtfUI6yrzPjAy/O7pO0VLXGmUVWXQMaYgTQ==} + '@rollup/rollup-win32-arm64-msvc@4.60.4': + resolution: {integrity: sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.60.0': - resolution: {integrity: sha512-SyaIPFoxmUPlNDq5EHkTbiKzmSEmq/gOYFI/3HHJ8iS/v1mbugVa7dXUzcJGQfoytp9DJFLhHH4U3/eTy2Bq4w==} + '@rollup/rollup-win32-ia32-msvc@4.60.4': + resolution: {integrity: sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.60.0': - resolution: {integrity: sha512-RdcryEfzZr+lAr5kRm2ucN9aVlCCa2QNq4hXelZxb8GG0NJSazq44Z3PCCc8wISRuCVnGs0lQJVX5Vp6fKA+IA==} + '@rollup/rollup-win32-x64-gnu@4.60.4': + resolution: {integrity: sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.60.0': - resolution: {integrity: sha512-PrsWNQ8BuE00O3Xsx3ALh2Df8fAj9+cvvX9AIA6o4KpATR98c9mud4XtDWVvsEuyia5U4tVSTKygawyJkjm60w==} + '@rollup/rollup-win32-x64-msvc@4.60.4': + resolution: {integrity: sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==} cpu: [x64] os: [win32] @@ -2445,6 +2306,21 @@ packages: peerDependencies: '@tiptap/core': 3.23.4 + '@tiptap/extension-collaboration-caret@3.23.4': + resolution: {integrity: sha512-1e3PsTlvsfX0Fqz9ENDxE0ikOO0u3pk3YKvjinrfWwVfX8tDIJ4MYYHBUh554MXyKd3oM6cR3bD/BZL0IlZErw==} + peerDependencies: + '@tiptap/core': 3.23.4 + '@tiptap/pm': 3.23.4 + '@tiptap/y-tiptap': ^3.0.2 + + '@tiptap/extension-collaboration@3.23.4': + resolution: {integrity: sha512-28TJFayxCk7J9TmHBG4+8lVAz6YgyjN0RqzZueVeimWxSEgnTDGlkfHx6Ho5tOuyLwDa6SMBhN/6Q0iUMdnwMQ==} + peerDependencies: + '@tiptap/core': 3.23.4 + '@tiptap/pm': 3.23.4 + '@tiptap/y-tiptap': ^3.0.2 + yjs: ^13 + '@tiptap/extension-document@3.23.4': resolution: {integrity: sha512-YC4G6VkxT629rlqUTwD6XvOpxjvghn7fxrK4RbyKVJY2C6E1vgmX0won1Ast6v+qTE6iONOMS6f6VyPxSGjg4w==} peerDependencies: @@ -2525,10 +2401,10 @@ packages: peerDependencies: '@tiptap/core': 3.23.4 - '@tiptap/extension-placeholder@3.23.5': - resolution: {integrity: sha512-B2snUujc6fb/16p8jSQCN4+mto7RlHKLm8quBTUWXksY8D82u/cxjUdmRQ7ueq7vsbRsA+WoJTrKEjJ8RQOpjw==} + '@tiptap/extension-placeholder@3.23.4': + resolution: {integrity: sha512-yHtAZkFR9M2AQmCi555w4ns1BBCqwRyYDYMtd10DBvqPX7T3TmGerPdUfI6sLr74GxnZ5zHOnOYdwAbeG5JzNw==} peerDependencies: - '@tiptap/extensions': 3.23.5 + '@tiptap/extensions': 3.23.4 '@tiptap/extension-strike@3.23.4': resolution: {integrity: sha512-Vnq5vW801zPbu1LtKeA5k4R241jY+hRjXeijYwIPxy15KzIiipY12518HiCf6/8kkRbMxgOfdYg9X4BRV3HV3g==} @@ -2572,12 +2448,6 @@ packages: '@tiptap/core': 3.23.4 '@tiptap/pm': 3.23.4 - '@tiptap/extensions@3.23.5': - resolution: {integrity: sha512-ROcdNPV+buzldEFKvD3o29P7H7zpAf2lnLfndO2LHSToWyHw4hlzVPCeAU8uAvhl/jyfeUoFLrBwxphMX/KG6A==} - peerDependencies: - '@tiptap/core': 3.23.5 - '@tiptap/pm': 3.23.5 - '@tiptap/markdown@3.23.4': resolution: {integrity: sha512-jRh/oa7WyhnXo+vaiaiZ42a5h/m1vvsrEWJHy12vD1qMivRKfNmRJN+lZmYpBV+6h+5vhQpg7EMMIH82xvVWRQ==} peerDependencies: @@ -2604,6 +2474,16 @@ packages: '@tiptap/pm': 3.23.4 vue: ^3.0.0 + '@tiptap/y-tiptap@3.0.3': + resolution: {integrity: sha512-8UvuV4lTisCE9cMTc/X8kRyTn9edUO7Kball0I6wb17VwZSjNDfh/YKtP4O5vcPawEzFHQIvZGq/k1h37kAf0w==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + prosemirror-model: ^1.7.1 + prosemirror-state: ^1.2.3 + prosemirror-view: ^1.9.10 + y-protocols: ^1.0.1 + yjs: ^13.5.38 + '@transloadit/prettier-bytes@0.3.5': resolution: {integrity: sha512-xF4A3d/ZyX2LJWeQZREZQw+qFX4TGQ8bGVP97OLRt6sPO6T0TNHBFTuRHOJh7RNmYOBmQ9MHxpolD9bXihpuVA==} @@ -2634,6 +2514,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -2701,63 +2584,63 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@8.59.4': - resolution: {integrity: sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A==} + '@typescript-eslint/eslint-plugin@8.59.3': + resolution: {integrity: sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.59.4 + '@typescript-eslint/parser': ^8.59.3 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.59.4': - resolution: {integrity: sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==} + '@typescript-eslint/parser@8.59.3': + resolution: {integrity: sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.59.4': - resolution: {integrity: sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==} + '@typescript-eslint/project-service@8.59.3': + resolution: {integrity: sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.59.4': - resolution: {integrity: sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==} + '@typescript-eslint/scope-manager@8.59.3': + resolution: {integrity: sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.59.4': - resolution: {integrity: sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==} + '@typescript-eslint/tsconfig-utils@8.59.3': + resolution: {integrity: sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.59.4': - resolution: {integrity: sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==} + '@typescript-eslint/type-utils@8.59.3': + resolution: {integrity: sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.59.4': - resolution: {integrity: sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==} + '@typescript-eslint/types@8.59.3': + resolution: {integrity: sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.59.4': - resolution: {integrity: sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==} + '@typescript-eslint/typescript-estree@8.59.3': + resolution: {integrity: sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.59.4': - resolution: {integrity: sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==} + '@typescript-eslint/utils@8.59.3': + resolution: {integrity: sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.59.4': - resolution: {integrity: sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==} + '@typescript-eslint/visitor-keys@8.59.3': + resolution: {integrity: sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ucast/core@1.10.2': @@ -2772,9 +2655,8 @@ packages: '@ucast/mongo@2.4.3': resolution: {integrity: sha512-XcI8LclrHWP83H+7H2anGCEeDq0n+12FU2mXCTz6/Tva9/9ddK/iacvvhCyW6cijAAOILmt0tWplRyRhVyZLsA==} - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - deprecated: Potential CWE-502 - Update to 1.3.1 or higher + '@ungap/structured-clone@1.3.1': + resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} '@uppy/companion-client@5.1.1': resolution: {integrity: sha512-DzrOWTbIZHvtgAFXBMYHk2wD27NjpBSVhY2tEiEIUhPd2CxbFRZjHM/N3HOt3VwZEAP471QWFLlJRWPcIY3A2Q==} @@ -3004,9 +2886,10 @@ packages: peerDependencies: vue: ^3.5.0 - '@xmldom/xmldom@0.9.10': - resolution: {integrity: sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==} - engines: {node: '>=14.6'} + '@xmldom/xmldom@0.7.13': + resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} + engines: {node: '>=10.0.0'} + deprecated: this version has critical issues, please update to the latest version abbrev@2.0.0: resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} @@ -3034,11 +2917,11 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - algoliasearch@5.50.0: - resolution: {integrity: sha512-yE5I83Q2s8euVou8Y3feXK08wyZInJWLYXgWO6Xti9jBUEZAGUahyeQ7wSZWkifLWVnQVKEz5RAmBlXG5nqxog==} + algoliasearch@5.52.1: + resolution: {integrity: sha512-fHA8+kXTbjagw3jkLiaS7KKrH8qe2DyOsiUhGlN4cdT77PEsfqXZl7ewDk1hsg+pJnPlnE50XtLxjR91iJOpmg==} engines: {node: '>= 14.0.0'} alien-signals@3.2.1: @@ -3149,8 +3032,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.31: - resolution: {integrity: sha512-MujYO3eP72uvmSE0i4wltsodRfIpZATP3jvzRNRGGxgzId7aVocVJJV3nf01qnzzKFGxQVC9bpWxl5cjxTr/7Q==} + baseline-browser-mapping@2.10.30: + resolution: {integrity: sha512-xjOFN16Ha1+Rz4nFYKqHU/LSB+gx/Vi3yQLX7r7sAW+Wa+8hhF2h4pvqTrTMc8+WcDBEunnUurr46Jvv0jk3Vg==} engines: {node: '>=6.0.0'} hasBin: true @@ -3170,11 +3053,11 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@2.1.0: + resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} braces@3.0.3: @@ -3221,8 +3104,8 @@ packages: peerDependencies: browserslist: '>=4.0.0' - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -3248,8 +3131,8 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} engines: {node: '>= 0.4'} call-bound@1.0.4: @@ -3521,8 +3404,8 @@ packages: engines: {node: '>=14'} hasBin: true - electron-to-chromium@1.5.359: - resolution: {integrity: sha512-8lPELWuYZIWk7NDvCNthtmMw/7Q5Wu25NpM4djFMHBmk8DubPAtL4YTOp7ou0e7HyJtwkVlWv8XMLURnrtgJQw==} + electron-to-chromium@1.5.358: + resolution: {integrity: sha512-EO7tKm3QxRqTs1lSuPXzl6yRAwznehp0AH9OoMOIC+4mQzTFday8FJCO5KU6J/TFSQXEOahNq4vTKpz1jmCVOA==} elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} @@ -3599,11 +3482,6 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.27.2: - resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} - engines: {node: '>=18'} - hasBin: true - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -3724,8 +3602,8 @@ packages: ext@1.7.0: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - fast-copy@4.0.2: - resolution: {integrity: sha512-ybA6PDXIXOXivLJK/z9e+Otk7ve13I4ckBvGO5I2RRmBU1gMHLVDJYEuJYhGwez7YNlYji2M2DvVU+a9mSFDlw==} + fast-copy@4.0.3: + resolution: {integrity: sha512-58apWr0GUiDFM8+3afrO6eYwJBn9ZAhDOzG3L+/9llab/haCARS2UIfffmOurYLwbgDRs8n0rfr6qAAPEAuAQw==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -3976,8 +3854,8 @@ packages: resolution: {integrity: sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hosted-git-info@9.0.2: - resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} + hosted-git-info@9.0.3: + resolution: {integrity: sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==} engines: {node: ^20.17.0 || >=22.9.0} hot-patcher@2.0.1: @@ -4053,8 +3931,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} is-extglob@2.1.1: @@ -4081,8 +3959,8 @@ packages: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} - is-network-error@1.3.1: - resolution: {integrity: sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==} + is-network-error@1.3.2: + resolution: {integrity: sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==} engines: {node: '>=16'} is-number@7.0.0: @@ -4131,6 +4009,9 @@ packages: peerDependencies: ws: '*' + isomorphic.js@0.2.5: + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -4166,9 +4047,9 @@ packages: engines: {node: '>=14'} hasBin: true - js-cookie@3.0.5: - resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} - engines: {node: '>=14'} + js-cookie@3.0.7: + resolution: {integrity: sha512-z/wZZgDrkNV1eA0ULjM/F9/50Ya8fbzgKneSpoPsXSGd0KnpdtHfOZWK+GcwLk+EZbS4F9RBhU+K2RgzuDaItw==} + engines: {node: '>=20'} js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} @@ -4219,6 +4100,11 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lib0@0.2.117: + resolution: {integrity: sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw==} + engines: {node: '>=16'} + hasBin: true + license-checker-rseidelsohn@4.4.2: resolution: {integrity: sha512-Sf8WaJhd2vELvCne+frS9AXqnY/vv591s2/nZcJDwTnoNgltG4mAmoenffVb8L2YPRYbxARLyrHJBC38AVfpuA==} engines: {node: '>=18', npm: '>=8'} @@ -4376,8 +4262,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.7: - resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} + lru-cache@11.4.0: + resolution: {integrity: sha512-W+R+kFL4HgVxONq2bhXPi3bGpzGe/yEhVOp233qw9wCRtgncJ15P3bC+e4zZMu4Cq7d+WAJjXGW0uUkifhcatA==} engines: {node: 20 || >=22} lru-cache@7.18.3: @@ -4531,8 +4417,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.1.7: - resolution: {integrity: sha512-ua3NDgISf6jdwezAheMOk4mbE1LXjm1DfMUDMuJf4AqxLFK3ccGpgWizwa5YV7Yz9EpXwEaWoRXSb/BnV0t5dQ==} + nanoid@5.1.11: + resolution: {integrity: sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg==} engines: {node: ^18 || >=20} hasBin: true @@ -4810,19 +4696,19 @@ packages: resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} - postcss@8.5.15: - resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} engines: {node: ^10 || ^12 || >=14} - preact@10.29.0: - resolution: {integrity: sha512-wSAGyk2bYR1c7t3SZ3jHcM6xy0lcBcDel6lODcs9ME6Th++Dx2KU+6D3HD8wMMKGA8Wpw7OMd3/4RGzYRpzwRg==} + preact@10.29.2: + resolution: {integrity: sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ==} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.8.1: - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} engines: {node: '>=14'} hasBin: true @@ -4867,8 +4753,8 @@ packages: prosemirror-keymap@1.2.3: resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} - prosemirror-model@1.25.6: - resolution: {integrity: sha512-RIm+e9BiqAaJ1mRECv3vR3C+VG8ELoTTI+47tVudGi82yLnFOx3G/p/iSPK1HmHQdKhkkrJ68NJqxh7S+FBVmQ==} + prosemirror-model@1.25.7: + resolution: {integrity: sha512-A79aN8QEFUwI6cax8Yq4Rpcx1TJZ3Kagn+ii7qLo4/V8H3mMiHrhFyhTyHHvpSnOgMPpWiDGSwM3etwrxE50ug==} prosemirror-schema-list@1.5.1: resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} @@ -4968,6 +4854,9 @@ packages: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} + real-require@1.0.0: + resolution: {integrity: sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==} + reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} @@ -4998,8 +4887,8 @@ packages: resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} engines: {node: '>=0.10.0'} - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} engines: {node: '>= 0.4'} hasBin: true @@ -5027,8 +4916,8 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rollup@4.60.0: - resolution: {integrity: sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ==} + rollup@4.60.4: + resolution: {integrity: sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -5265,8 +5154,8 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thread-stream@4.0.0: - resolution: {integrity: sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==} + thread-stream@4.2.0: + resolution: {integrity: sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==} engines: {node: '>=20'} timers-browserify@2.0.12: @@ -5325,8 +5214,8 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} - ts-essentials@10.1.1: - resolution: {integrity: sha512-4aTB7KLHKmUvkjNj8V+EdnmuVTiECzn3K+zIbRthumvHu+j44x3w63xpfs0JL3NGIzGXqoQ7AV591xHO+XrOTw==} + ts-essentials@10.2.0: + resolution: {integrity: sha512-z9FlLywg0XEV46Ws1FwYN4NZDMr9qAe38lTTtgVBqzhhyEgwrnCUkFe4MEqnvar1kY1kFEnlkp56bxn2g0V+UA==} peerDependencies: typescript: '>=4.5.0' peerDependenciesMeta: @@ -5369,8 +5258,8 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - type-fest@5.5.0: - resolution: {integrity: sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==} + type-fest@5.6.0: + resolution: {integrity: sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==} engines: {node: '>=20'} type@2.7.3: @@ -5380,8 +5269,8 @@ packages: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typescript-eslint@8.59.4: - resolution: {integrity: sha512-Rw6+44QNFaXtgHSjPy+Kw8hrJniMYzR85E9yLmOLcfZ91/rz+JXQbDTCmc6ccxMPY6K6PgAq26f0JCBfR7LIPQ==} + typescript-eslint@8.59.3: + resolution: {integrity: sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -5635,8 +5524,8 @@ packages: vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - vue-component-type-helpers@3.2.7: - resolution: {integrity: sha512-+gPp5YGmhfsj1IN+xUo7y0fb4clfnOiiUA39y07yW1VzCRjzVgwLbtmdWlghh7mXrPsEaYc7rrIir/HT6C8vYQ==} + vue-component-type-helpers@3.3.0: + resolution: {integrity: sha512-vwR8DDsBysI9NWXa0okPFpCcW+BUC3sPTuLBNo1faMzw4QWMFd+3/lFYFu29ZN0q+8UReXWJHEYesC9dcXYCLg==} vue-concurrency@5.0.3: resolution: {integrity: sha512-z8K4acfOUOLufGysY21xqI+KI8a81XcGUNLXhPOxYevqcfX052VP9KLUNvrdJrbI7rKbDGjIrlRhXwJsFb1Ukw==} @@ -5706,8 +5595,8 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} - webdav@5.9.0: - resolution: {integrity: sha512-OMJ6wtK1WvCO++aOLoQgE96S8KT4e5aaClWHmHXfFU369r4eyELN569B7EqT4OOUb99mmO58GkyuiCv/Ag6J0Q==} + webdav@5.10.0: + resolution: {integrity: sha512-fVPuRLtcduVGvSO7Tn/6TQCzIvI/g6BO/+xPRctCvi/GytYpjn4czxWbh4HsArsdom9qz9BI63k9/v2HBUui1A==} engines: {node: '>=14'} webidl-conversions@3.0.1: @@ -5771,8 +5660,8 @@ packages: utf-8-validate: optional: true - ws@8.20.0: - resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} + ws@8.20.1: + resolution: {integrity: sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -5799,11 +5688,21 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + y-protocols@1.0.7: + resolution: {integrity: sha512-YSVsLoXxO67J6eE/nV4AtFtT3QEotZf5sK5BHxFBXso7VDUT3Tx07IfA6hsu5Q5OmBdMkQVmFZ9QOA7fikWvnw==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + yjs: ^13.0.0 + yaml@2.9.0: resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} hasBin: true + yjs@13.6.30: + resolution: {integrity: sha512-vv/9h42eCMC81ZHDFswuu/MKzkl/vyq1BhaNGfHyOonwlG4CJbQF4oiBBJPvfdeCt/PlVDWh7Nov9D34YY09uQ==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -5829,117 +5728,117 @@ snapshots: transitivePeerDependencies: - encoding - '@algolia/abtesting@1.16.0': + '@algolia/abtesting@1.18.1': dependencies: - '@algolia/client-common': 5.50.0 - '@algolia/requester-browser-xhr': 5.50.0 - '@algolia/requester-fetch': 5.50.0 - '@algolia/requester-node-http': 5.50.0 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.50.0)(algoliasearch@5.50.0)(search-insights@2.17.3)': + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.50.0)(algoliasearch@5.50.0)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.50.0)(algoliasearch@5.50.0) + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.50.0)(algoliasearch@5.50.0)(search-insights@2.17.3)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.50.0)(algoliasearch@5.50.0) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1) search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.50.0)(algoliasearch@5.50.0)': + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.50.0)(algoliasearch@5.50.0) - '@algolia/client-search': 5.50.0 - algoliasearch: 5.50.0 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1) + '@algolia/client-search': 5.52.1 + algoliasearch: 5.52.1 - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.50.0)(algoliasearch@5.50.0)': + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1)': dependencies: - '@algolia/client-search': 5.50.0 - algoliasearch: 5.50.0 + '@algolia/client-search': 5.52.1 + algoliasearch: 5.52.1 - '@algolia/client-abtesting@5.50.0': + '@algolia/client-abtesting@5.52.1': dependencies: - '@algolia/client-common': 5.50.0 - '@algolia/requester-browser-xhr': 5.50.0 - '@algolia/requester-fetch': 5.50.0 - '@algolia/requester-node-http': 5.50.0 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/client-analytics@5.50.0': + '@algolia/client-analytics@5.52.1': dependencies: - '@algolia/client-common': 5.50.0 - '@algolia/requester-browser-xhr': 5.50.0 - '@algolia/requester-fetch': 5.50.0 - '@algolia/requester-node-http': 5.50.0 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/client-common@5.50.0': {} + '@algolia/client-common@5.52.1': {} - '@algolia/client-insights@5.50.0': + '@algolia/client-insights@5.52.1': dependencies: - '@algolia/client-common': 5.50.0 - '@algolia/requester-browser-xhr': 5.50.0 - '@algolia/requester-fetch': 5.50.0 - '@algolia/requester-node-http': 5.50.0 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/client-personalization@5.50.0': + '@algolia/client-personalization@5.52.1': dependencies: - '@algolia/client-common': 5.50.0 - '@algolia/requester-browser-xhr': 5.50.0 - '@algolia/requester-fetch': 5.50.0 - '@algolia/requester-node-http': 5.50.0 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/client-query-suggestions@5.50.0': + '@algolia/client-query-suggestions@5.52.1': dependencies: - '@algolia/client-common': 5.50.0 - '@algolia/requester-browser-xhr': 5.50.0 - '@algolia/requester-fetch': 5.50.0 - '@algolia/requester-node-http': 5.50.0 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/client-search@5.50.0': + '@algolia/client-search@5.52.1': dependencies: - '@algolia/client-common': 5.50.0 - '@algolia/requester-browser-xhr': 5.50.0 - '@algolia/requester-fetch': 5.50.0 - '@algolia/requester-node-http': 5.50.0 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/ingestion@1.50.0': + '@algolia/ingestion@1.52.1': dependencies: - '@algolia/client-common': 5.50.0 - '@algolia/requester-browser-xhr': 5.50.0 - '@algolia/requester-fetch': 5.50.0 - '@algolia/requester-node-http': 5.50.0 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/monitoring@1.50.0': + '@algolia/monitoring@1.52.1': dependencies: - '@algolia/client-common': 5.50.0 - '@algolia/requester-browser-xhr': 5.50.0 - '@algolia/requester-fetch': 5.50.0 - '@algolia/requester-node-http': 5.50.0 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/recommend@5.50.0': + '@algolia/recommend@5.52.1': dependencies: - '@algolia/client-common': 5.50.0 - '@algolia/requester-browser-xhr': 5.50.0 - '@algolia/requester-fetch': 5.50.0 - '@algolia/requester-node-http': 5.50.0 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/requester-browser-xhr@5.50.0': + '@algolia/requester-browser-xhr@5.52.1': dependencies: - '@algolia/client-common': 5.50.0 + '@algolia/client-common': 5.52.1 - '@algolia/requester-fetch@5.50.0': + '@algolia/requester-fetch@5.52.1': dependencies: - '@algolia/client-common': 5.50.0 + '@algolia/client-common': 5.52.1 - '@algolia/requester-node-http@5.50.0': + '@algolia/requester-node-http@5.52.1': dependencies: - '@algolia/client-common': 5.50.0 + '@algolia/client-common': 5.52.1 '@axe-core/playwright@4.11.3(playwright-core@1.60.0)': dependencies: @@ -6190,10 +6089,10 @@ snapshots: '@docsearch/css@3.8.2': {} - '@docsearch/js@3.8.2(@algolia/client-search@5.50.0)(search-insights@2.17.3)': + '@docsearch/js@3.8.2(@algolia/client-search@5.52.1)(search-insights@2.17.3)': dependencies: - '@docsearch/react': 3.8.2(@algolia/client-search@5.50.0)(search-insights@2.17.3) - preact: 10.29.0 + '@docsearch/react': 3.8.2(@algolia/client-search@5.52.1)(search-insights@2.17.3) + preact: 10.29.2 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -6201,12 +6100,12 @@ snapshots: - react-dom - search-insights - '@docsearch/react@3.8.2(@algolia/client-search@5.50.0)(search-insights@2.17.3)': + '@docsearch/react@3.8.2(@algolia/client-search@5.52.1)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.50.0)(algoliasearch@5.50.0)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.50.0)(algoliasearch@5.50.0) + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1) '@docsearch/css': 3.8.2 - algoliasearch: 5.50.0 + algoliasearch: 5.52.1 optionalDependencies: search-insights: 2.17.3 transitivePeerDependencies: @@ -6233,150 +6132,72 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.27.2': - optional: true - '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.27.2': - optional: true - '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.27.2': - optional: true - '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.27.2': - optional: true - '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.27.2': - optional: true - '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.27.2': - optional: true - '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.27.2': - optional: true - '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.27.2': - optional: true - '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.27.2': - optional: true - '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.27.2': - optional: true - '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.27.2': - optional: true - '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.27.2': - optional: true - '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.27.2': - optional: true - '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.27.2': - optional: true - '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.27.2': - optional: true - '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.27.2': - optional: true - '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.27.2': - optional: true - - '@esbuild/netbsd-arm64@0.27.2': - optional: true - '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.27.2': - optional: true - - '@esbuild/openbsd-arm64@0.27.2': - optional: true - '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.27.2': - optional: true - - '@esbuild/openharmony-arm64@0.27.2': - optional: true - '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.27.2': - optional: true - '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.27.2': - optional: true - '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.27.2': - optional: true - '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.27.2': - optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.4.0(jiti@2.7.0))': dependencies: eslint: 10.4.0(jiti@2.7.0) @@ -6418,18 +6239,39 @@ snapshots: '@floating-ui/utils@0.2.11': {} - '@humanfs/core@0.19.1': {} + '@hocuspocus/common@2.15.3': + dependencies: + lib0: 0.2.117 - '@humanfs/node@0.16.7': + '@hocuspocus/provider@2.15.3(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30)': dependencies: - '@humanfs/core': 0.19.1 + '@hocuspocus/common': 2.15.3 + '@lifeomic/attempt': 3.1.0 + lib0: 0.2.117 + ws: 8.20.1 + y-protocols: 1.0.7(yjs@13.6.30) + yjs: 13.6.30 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 '@humanwhocodes/retry': 0.4.3 + '@humanfs/types@0.15.0': {} + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.4.3': {} - '@iconify-json/simple-icons@1.2.75': + '@iconify-json/simple-icons@1.2.82': dependencies: '@iconify/types': 2.0.0 @@ -6470,6 +6312,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@lifeomic/attempt@3.1.0': {} + '@microsoft/fetch-event-source@2.0.1': {} '@module-federation/dts-plugin@2.4.0(node-fetch@3.3.2)(typescript@6.0.3)(vue-tsc@3.3.0(typescript@6.0.3))': @@ -6525,7 +6369,7 @@ snapshots: find-pkg: 2.0.0 resolve: 1.22.8 - '@module-federation/vite@1.15.4(node-fetch@3.3.2)(typescript@6.0.3)(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))(vue-tsc@3.3.0(typescript@6.0.3))': + '@module-federation/vite@1.15.4(node-fetch@3.3.2)(typescript@6.0.3)(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))(vue-tsc@3.3.0(typescript@6.0.3))': dependencies: '@module-federation/dts-plugin': 2.4.0(node-fetch@3.3.2)(typescript@6.0.3)(vue-tsc@3.3.0(typescript@6.0.3)) '@module-federation/runtime': 2.4.0(node-fetch@3.3.2) @@ -6533,7 +6377,7 @@ snapshots: es-module-lexer: 2.1.0 estree-walker: 3.0.3 pathe: 2.0.3 - vite: 8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) + vite: 8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) transitivePeerDependencies: - bufferutil - node-fetch @@ -6541,7 +6385,7 @@ snapshots: - utf-8-validate - vue-tsc - '@module-federation/vite@1.15.5(node-fetch@3.3.2)(typescript@6.0.3)(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))(vue-tsc@3.3.0(typescript@6.0.3))': + '@module-federation/vite@1.15.5(node-fetch@3.3.2)(typescript@6.0.3)(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))(vue-tsc@3.3.0(typescript@6.0.3))': dependencies: '@module-federation/dts-plugin': 2.4.0(node-fetch@3.3.2)(typescript@6.0.3)(vue-tsc@3.3.0(typescript@6.0.3)) '@module-federation/runtime': 2.4.0(node-fetch@3.3.2) @@ -6549,7 +6393,7 @@ snapshots: es-module-lexer: 2.1.0 estree-walker: 3.0.3 pathe: 2.0.3 - vite: 8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) + vite: 8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) transitivePeerDependencies: - bufferutil - node-fetch @@ -6703,95 +6547,95 @@ snapshots: '@rolldown/pluginutils@1.0.1': {} - '@rollup/plugin-inject@5.0.5(rollup@4.60.0)': + '@rollup/plugin-inject@5.0.5(rollup@4.60.4)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.0) + '@rollup/pluginutils': 5.3.0(rollup@4.60.4) estree-walker: 2.0.2 magic-string: 0.30.21 optionalDependencies: - rollup: 4.60.0 + rollup: 4.60.4 - '@rollup/pluginutils@5.3.0(rollup@4.60.0)': + '@rollup/pluginutils@5.3.0(rollup@4.60.4)': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-walker: 2.0.2 picomatch: 4.0.4 optionalDependencies: - rollup: 4.60.0 + rollup: 4.60.4 - '@rollup/rollup-android-arm-eabi@4.60.0': + '@rollup/rollup-android-arm-eabi@4.60.4': optional: true - '@rollup/rollup-android-arm64@4.60.0': + '@rollup/rollup-android-arm64@4.60.4': optional: true - '@rollup/rollup-darwin-arm64@4.60.0': + '@rollup/rollup-darwin-arm64@4.60.4': optional: true - '@rollup/rollup-darwin-x64@4.60.0': + '@rollup/rollup-darwin-x64@4.60.4': optional: true - '@rollup/rollup-freebsd-arm64@4.60.0': + '@rollup/rollup-freebsd-arm64@4.60.4': optional: true - '@rollup/rollup-freebsd-x64@4.60.0': + '@rollup/rollup-freebsd-x64@4.60.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.0': + '@rollup/rollup-linux-arm-gnueabihf@4.60.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.0': + '@rollup/rollup-linux-arm-musleabihf@4.60.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.0': + '@rollup/rollup-linux-arm64-gnu@4.60.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.0': + '@rollup/rollup-linux-arm64-musl@4.60.4': optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.0': + '@rollup/rollup-linux-loong64-gnu@4.60.4': optional: true - '@rollup/rollup-linux-loong64-musl@4.60.0': + '@rollup/rollup-linux-loong64-musl@4.60.4': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.0': + '@rollup/rollup-linux-ppc64-gnu@4.60.4': optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.0': + '@rollup/rollup-linux-ppc64-musl@4.60.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.0': + '@rollup/rollup-linux-riscv64-gnu@4.60.4': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.0': + '@rollup/rollup-linux-riscv64-musl@4.60.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.0': + '@rollup/rollup-linux-s390x-gnu@4.60.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.0': + '@rollup/rollup-linux-x64-gnu@4.60.4': optional: true - '@rollup/rollup-linux-x64-musl@4.60.0': + '@rollup/rollup-linux-x64-musl@4.60.4': optional: true - '@rollup/rollup-openbsd-x64@4.60.0': + '@rollup/rollup-openbsd-x64@4.60.4': optional: true - '@rollup/rollup-openharmony-arm64@4.60.0': + '@rollup/rollup-openharmony-arm64@4.60.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.0': + '@rollup/rollup-win32-arm64-msvc@4.60.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.60.0': + '@rollup/rollup-win32-ia32-msvc@4.60.4': optional: true - '@rollup/rollup-win32-x64-gnu@4.60.0': + '@rollup/rollup-win32-x64-gnu@4.60.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.60.0': + '@rollup/rollup-win32-x64-msvc@4.60.4': optional: true '@sentry-internal/browser-utils@10.53.1': @@ -6933,12 +6777,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 - '@tailwindcss/vite@4.3.0(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))': + '@tailwindcss/vite@4.3.0(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.3.0 '@tailwindcss/oxide': 4.3.0 tailwindcss: 4.3.0 - vite: 8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) + vite: 8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) '@teppeis/multimaps@3.0.0': {} @@ -6974,6 +6818,19 @@ snapshots: dependencies: '@tiptap/core': 3.23.4(@tiptap/pm@3.23.4) + '@tiptap/extension-collaboration-caret@3.23.4(@tiptap/core@3.23.4(@tiptap/pm@3.23.4))(@tiptap/pm@3.23.4)(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.7)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))': + dependencies: + '@tiptap/core': 3.23.4(@tiptap/pm@3.23.4) + '@tiptap/pm': 3.23.4 + '@tiptap/y-tiptap': 3.0.3(prosemirror-model@1.25.7)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30) + + '@tiptap/extension-collaboration@3.23.4(@tiptap/core@3.23.4(@tiptap/pm@3.23.4))(@tiptap/pm@3.23.4)(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.7)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(yjs@13.6.30)': + dependencies: + '@tiptap/core': 3.23.4(@tiptap/pm@3.23.4) + '@tiptap/pm': 3.23.4 + '@tiptap/y-tiptap': 3.0.3(prosemirror-model@1.25.7)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30) + yjs: 13.6.30 + '@tiptap/extension-document@3.23.4(@tiptap/core@3.23.4(@tiptap/pm@3.23.4))': dependencies: '@tiptap/core': 3.23.4(@tiptap/pm@3.23.4) @@ -7041,9 +6898,9 @@ snapshots: dependencies: '@tiptap/core': 3.23.4(@tiptap/pm@3.23.4) - '@tiptap/extension-placeholder@3.23.5(@tiptap/extensions@3.23.5(@tiptap/core@3.23.4(@tiptap/pm@3.23.4))(@tiptap/pm@3.23.4))': + '@tiptap/extension-placeholder@3.23.4(@tiptap/extensions@3.23.4(@tiptap/core@3.23.4(@tiptap/pm@3.23.4))(@tiptap/pm@3.23.4))': dependencies: - '@tiptap/extensions': 3.23.5(@tiptap/core@3.23.4(@tiptap/pm@3.23.4))(@tiptap/pm@3.23.4) + '@tiptap/extensions': 3.23.4(@tiptap/core@3.23.4(@tiptap/pm@3.23.4))(@tiptap/pm@3.23.4) '@tiptap/extension-strike@3.23.4(@tiptap/core@3.23.4(@tiptap/pm@3.23.4))': dependencies: @@ -7079,11 +6936,6 @@ snapshots: '@tiptap/core': 3.23.4(@tiptap/pm@3.23.4) '@tiptap/pm': 3.23.4 - '@tiptap/extensions@3.23.5(@tiptap/core@3.23.4(@tiptap/pm@3.23.4))(@tiptap/pm@3.23.4)': - dependencies: - '@tiptap/core': 3.23.4(@tiptap/pm@3.23.4) - '@tiptap/pm': 3.23.4 - '@tiptap/markdown@3.23.4(@tiptap/core@3.23.4(@tiptap/pm@3.23.4))(@tiptap/pm@3.23.4)': dependencies: '@tiptap/core': 3.23.4(@tiptap/pm@3.23.4) @@ -7098,7 +6950,7 @@ snapshots: prosemirror-gapcursor: 1.4.1 prosemirror-history: 1.5.0 prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.6 + prosemirror-model: 1.25.7 prosemirror-schema-list: 1.5.1 prosemirror-state: 1.4.4 prosemirror-tables: 1.8.5 @@ -7147,6 +6999,15 @@ snapshots: '@tiptap/extension-bubble-menu': 3.23.4(@tiptap/core@3.23.4(@tiptap/pm@3.23.4))(@tiptap/pm@3.23.4) '@tiptap/extension-floating-menu': 3.23.4(@floating-ui/dom@1.7.6)(@tiptap/core@3.23.4(@tiptap/pm@3.23.4))(@tiptap/pm@3.23.4) + '@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.7)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30)': + dependencies: + lib0: 0.2.117 + prosemirror-model: 1.25.7 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.8 + y-protocols: 1.0.7(yjs@13.6.30) + yjs: 13.6.30 + '@transloadit/prettier-bytes@0.3.5': {} '@tsconfig/node10@1.0.12': {} @@ -7173,6 +7034,8 @@ snapshots: '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -7235,14 +7098,14 @@ snapshots: dependencies: '@types/node': 25.9.0 - '@typescript-eslint/eslint-plugin@8.59.4(@typescript-eslint/parser@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/type-utils': 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/parser': 8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.3 + '@typescript-eslint/type-utils': 8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.3 eslint: 10.4.0(jiti@2.7.0) ignore: 7.0.5 natural-compare: 1.4.0 @@ -7251,41 +7114,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/parser@8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/typescript-estree': 8.59.4(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/scope-manager': 8.59.3 + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.3 debug: 4.4.3(supports-color@8.1.1) eslint: 10.4.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.59.4(typescript@6.0.3)': + '@typescript-eslint/project-service@8.59.3(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@6.0.3) - '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/tsconfig-utils': 8.59.3(typescript@6.0.3) + '@typescript-eslint/types': 8.59.3 debug: 4.4.3(supports-color@8.1.1) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.59.4': + '@typescript-eslint/scope-manager@8.59.3': dependencies: - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/visitor-keys': 8.59.3 - '@typescript-eslint/tsconfig-utils@8.59.4(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.59.3(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/typescript-estree': 8.59.4(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) debug: 4.4.3(supports-color@8.1.1) eslint: 10.4.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@6.0.3) @@ -7293,14 +7156,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.59.4': {} + '@typescript-eslint/types@8.59.3': {} - '@typescript-eslint/typescript-estree@8.59.4(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.59.3(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.59.4(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@6.0.3) - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/project-service': 8.59.3(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.3(typescript@6.0.3) + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/visitor-keys': 8.59.3 debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 semver: 7.8.0 @@ -7310,20 +7173,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/utils@8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.0(jiti@2.7.0)) - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/typescript-estree': 8.59.4(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.3 + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) eslint: 10.4.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.59.4': + '@typescript-eslint/visitor-keys@8.59.3': dependencies: - '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/types': 8.59.3 eslint-visitor-keys: 5.0.1 '@ucast/core@1.10.2': {} @@ -7342,7 +7205,7 @@ snapshots: dependencies: '@ucast/core': 1.10.2 - '@ungap/structured-clone@1.3.0': {} + '@ungap/structured-clone@1.3.1': {} '@uppy/companion-client@5.1.1(@uppy/core@5.2.0)': dependencies: @@ -7359,8 +7222,8 @@ snapshots: lodash: 4.18.1 mime-match: 1.0.2 namespace-emitter: 2.0.1 - nanoid: 5.1.7 - preact: 10.29.0 + nanoid: 5.1.11 + preact: 10.29.2 '@uppy/store-default@5.0.0': {} @@ -7374,7 +7237,7 @@ snapshots: '@uppy/utils@7.2.0': dependencies: lodash: 4.18.1 - preact: 10.29.0 + preact: 10.29.2 '@uppy/xhr-upload@5.2.0(@uppy/core@5.2.0)': dependencies: @@ -7382,19 +7245,19 @@ snapshots: '@uppy/core': 5.2.0 '@uppy/utils': 7.2.0 - '@vitejs/plugin-basic-ssl@2.3.0(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))': + '@vitejs/plugin-basic-ssl@2.3.0(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))': dependencies: - vite: 8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) + vite: 8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@25.9.0)(lightningcss@1.32.0)(sass@1.99.0))(vue@3.5.34(typescript@6.0.3))': dependencies: vite: 5.4.21(@types/node@25.9.0)(lightningcss@1.32.0)(sass@1.99.0) vue: 3.5.34(typescript@6.0.3) - '@vitejs/plugin-vue@6.0.7(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))(vue@3.5.34(typescript@6.0.3))': + '@vitejs/plugin-vue@6.0.7(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))(vue@3.5.34(typescript@6.0.3))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) + vite: 8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) vue: 3.5.34(typescript@6.0.3) '@vitest/coverage-v8@4.1.6(vitest@4.1.6)': @@ -7409,7 +7272,7 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.6(@types/node@25.9.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.9.0)(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) + vitest: 4.1.6(@types/node@25.9.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.9.0)(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) '@vitest/expect@4.1.6': dependencies: @@ -7420,13 +7283,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.6(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.6(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.6 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) + vite: 8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) '@vitest/pretty-format@4.1.6': dependencies: @@ -7455,7 +7318,7 @@ snapshots: '@vitest/web-worker@4.1.6(vitest@4.1.6)': dependencies: obug: 2.1.1 - vitest: 4.1.6(@types/node@25.9.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.9.0)(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) + vitest: 4.1.6(@types/node@25.9.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.9.0)(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) '@volar/language-core@2.4.28': dependencies: @@ -7501,7 +7364,7 @@ snapshots: '@vue/shared': 3.5.34 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.15 + postcss: 8.5.14 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.34': @@ -7579,7 +7442,7 @@ snapshots: '@vue/compiler-dom': 3.5.34 js-beautify: 1.15.4 vue: 3.5.34(typescript@6.0.3) - vue-component-type-helpers: 3.2.7 + vue-component-type-helpers: 3.3.0 optionalDependencies: '@vue/server-renderer': 3.5.34(vue@3.5.34(typescript@6.0.3)) @@ -7626,7 +7489,7 @@ snapshots: dependencies: vue: 3.5.34(typescript@6.0.3) - '@xmldom/xmldom@0.9.10': {} + '@xmldom/xmldom@0.7.13': {} abbrev@2.0.0: {} @@ -7648,29 +7511,29 @@ snapshots: transitivePeerDependencies: - supports-color - ajv@6.14.0: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - algoliasearch@5.50.0: - dependencies: - '@algolia/abtesting': 1.16.0 - '@algolia/client-abtesting': 5.50.0 - '@algolia/client-analytics': 5.50.0 - '@algolia/client-common': 5.50.0 - '@algolia/client-insights': 5.50.0 - '@algolia/client-personalization': 5.50.0 - '@algolia/client-query-suggestions': 5.50.0 - '@algolia/client-search': 5.50.0 - '@algolia/ingestion': 1.50.0 - '@algolia/monitoring': 1.50.0 - '@algolia/recommend': 5.50.0 - '@algolia/requester-browser-xhr': 5.50.0 - '@algolia/requester-fetch': 5.50.0 - '@algolia/requester-node-http': 5.50.0 + algoliasearch@5.52.1: + dependencies: + '@algolia/abtesting': 1.18.1 + '@algolia/client-abtesting': 5.52.1 + '@algolia/client-analytics': 5.52.1 + '@algolia/client-common': 5.52.1 + '@algolia/client-insights': 5.52.1 + '@algolia/client-personalization': 5.52.1 + '@algolia/client-query-suggestions': 5.52.1 + '@algolia/client-search': 5.52.1 + '@algolia/ingestion': 1.52.1 + '@algolia/monitoring': 1.52.1 + '@algolia/recommend': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 alien-signals@3.2.1: {} @@ -7713,7 +7576,7 @@ snapshots: assert@2.1.0: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 is-nan: 1.3.2 object-is: 1.1.6 object.assign: 4.1.7 @@ -7771,7 +7634,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.10.31: {} + baseline-browser-mapping@2.10.30: {} binary-extensions@2.3.0: {} @@ -7783,11 +7646,11 @@ snapshots: boolbase@1.0.0: {} - brace-expansion@2.0.2: + brace-expansion@2.1.0: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.5: + brace-expansion@5.0.6: dependencies: balanced-match: 4.0.4 @@ -7799,7 +7662,7 @@ snapshots: browser-resolve@2.0.0: dependencies: - resolve: 1.22.11 + resolve: 1.22.12 browserify-aes@1.2.0: dependencies: @@ -7845,27 +7708,27 @@ snapshots: dependencies: pako: 1.0.11 - browserslist-to-esbuild@2.1.1(browserslist@4.28.1): + browserslist-to-esbuild@2.1.1(browserslist@4.28.2): dependencies: - browserslist: 4.28.1 + browserslist: 4.28.2 meow: 13.2.0 - browserslist-useragent-regexp@4.1.4(browserslist@4.28.1): + browserslist-useragent-regexp@4.1.4(browserslist@4.28.2): dependencies: argue-cli: 2.1.0 - browserslist: 4.28.1 + browserslist: 4.28.2 easy-table: 1.2.0 picocolors: 1.1.1 regexp-tree: 0.1.27 ua-regexes-lite: 1.2.1 - browserslist@4.28.1: + browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.31 + baseline-browser-mapping: 2.10.30 caniuse-lite: 1.0.30001793 - electron-to-chromium: 1.5.359 + electron-to-chromium: 1.5.358 node-releases: 2.0.44 - update-browserslist-db: 1.2.3(browserslist@4.28.1) + update-browserslist-db: 1.2.3(browserslist@4.28.2) buffer-from@1.1.2: {} @@ -7880,14 +7743,14 @@ snapshots: byte-length@1.0.2: {} - caf@15.0.1(patch_hash=b09bdde8a1f7e834af8677123b32ceb4f485966fdb476facf5b6c64157c9fc14): {} + caf@15.0.1: {} call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.8: + call-bind@1.0.9: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 @@ -8176,7 +8039,7 @@ snapshots: minimatch: 9.0.9 semver: 7.8.0 - electron-to-chromium@1.5.359: {} + electron-to-chromium@1.5.358: {} elliptic@6.6.1: dependencies: @@ -8214,7 +8077,7 @@ snapshots: epubjs@0.3.93: dependencies: '@types/localforage': 0.0.34 - '@xmldom/xmldom': 0.9.10 + '@xmldom/xmldom': 0.7.13 core-js: 3.49.0 event-emitter: 0.3.5 jszip: 3.10.1 @@ -8288,36 +8151,6 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.27.2: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.2 - '@esbuild/android-arm': 0.27.2 - '@esbuild/android-arm64': 0.27.2 - '@esbuild/android-x64': 0.27.2 - '@esbuild/darwin-arm64': 0.27.2 - '@esbuild/darwin-x64': 0.27.2 - '@esbuild/freebsd-arm64': 0.27.2 - '@esbuild/freebsd-x64': 0.27.2 - '@esbuild/linux-arm': 0.27.2 - '@esbuild/linux-arm64': 0.27.2 - '@esbuild/linux-ia32': 0.27.2 - '@esbuild/linux-loong64': 0.27.2 - '@esbuild/linux-mips64el': 0.27.2 - '@esbuild/linux-ppc64': 0.27.2 - '@esbuild/linux-riscv64': 0.27.2 - '@esbuild/linux-s390x': 0.27.2 - '@esbuild/linux-x64': 0.27.2 - '@esbuild/netbsd-arm64': 0.27.2 - '@esbuild/netbsd-x64': 0.27.2 - '@esbuild/openbsd-arm64': 0.27.2 - '@esbuild/openbsd-x64': 0.27.2 - '@esbuild/openharmony-arm64': 0.27.2 - '@esbuild/sunos-x64': 0.27.2 - '@esbuild/win32-arm64': 0.27.2 - '@esbuild/win32-ia32': 0.27.2 - '@esbuild/win32-x64': 0.27.2 - optional: true - escalade@3.2.0: {} escape-string-regexp@1.0.5: {} @@ -8328,13 +8161,13 @@ snapshots: dependencies: eslint: 10.4.0(jiti@2.7.0) - eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.59.4(@typescript-eslint/parser@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0)): + eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0)): dependencies: eslint: 10.4.0(jiti@2.7.0) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.59.4(@typescript-eslint/parser@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.59.3(@typescript-eslint/parser@8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) - eslint-plugin-vue@10.9.1(@typescript-eslint/parser@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0))(vue-eslint-parser@10.4.0(eslint@10.4.0(jiti@2.7.0))): + eslint-plugin-vue@10.9.1(@typescript-eslint/parser@8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0))(vue-eslint-parser@10.4.0(eslint@10.4.0(jiti@2.7.0))): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.0(jiti@2.7.0)) eslint: 10.4.0(jiti@2.7.0) @@ -8345,12 +8178,12 @@ snapshots: vue-eslint-parser: 10.4.0(eslint@10.4.0(jiti@2.7.0)) xml-name-validator: 4.0.0 optionalDependencies: - '@typescript-eslint/parser': 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) eslint-scope@9.1.2: dependencies: '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -8366,11 +8199,11 @@ snapshots: '@eslint/config-helpers': 0.6.0 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.1 - '@humanfs/node': 0.16.7 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - ajv: 6.14.0 + '@types/estree': 1.0.9 + ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 @@ -8422,7 +8255,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esutils@2.0.3: {} @@ -8452,7 +8285,7 @@ snapshots: dependencies: type: 2.7.3 - fast-copy@4.0.2: {} + fast-copy@4.0.3: {} fast-deep-equal@3.1.3: {} @@ -8649,7 +8482,7 @@ snapshots: '@types/ws': 8.18.1 entities: 7.0.1 whatwg-mimetype: 3.0.0 - ws: 8.20.0 + ws: 8.20.1 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -8727,9 +8560,9 @@ snapshots: dependencies: lru-cache: 7.18.3 - hosted-git-info@9.0.2: + hosted-git-info@9.0.3: dependencies: - lru-cache: 11.2.7 + lru-cache: 11.4.0 hot-patcher@2.0.1: {} @@ -8783,7 +8616,7 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.16.1: + is-core-module@2.16.2: dependencies: hasown: 2.0.3 @@ -8810,10 +8643,10 @@ snapshots: is-nan@1.3.2: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - is-network-error@1.3.1: {} + is-network-error@1.3.2: {} is-number@7.0.0: {} @@ -8848,6 +8681,8 @@ snapshots: dependencies: ws: 8.18.0 + isomorphic.js@0.2.5: {} + istanbul-lib-coverage@3.2.2: {} istanbul-lib-report@3.0.1: @@ -8882,10 +8717,10 @@ snapshots: config-chain: 1.1.13 editorconfig: 1.0.7 glob: 10.5.0 - js-cookie: 3.0.5 + js-cookie: 3.0.7 nopt: 7.2.1 - js-cookie@3.0.5: {} + js-cookie@3.0.7: {} js-tokens@10.0.0: {} @@ -8927,6 +8762,10 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lib0@0.2.117: + dependencies: + isomorphic.js: 0.2.5 + license-checker-rseidelsohn@4.4.2: dependencies: chalk: 4.1.2 @@ -9066,7 +8905,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.7: {} + lru-cache@11.4.0: {} lru-cache@7.18.3: {} @@ -9104,7 +8943,7 @@ snapshots: md5.js@1.3.5: dependencies: - hash-base: 3.1.2 + hash-base: 3.0.5 inherits: 2.0.4 safe-buffer: 5.2.1 @@ -9118,7 +8957,7 @@ snapshots: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.0 + '@ungap/structured-clone': 1.3.1 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 @@ -9168,11 +9007,11 @@ snapshots: minimatch@10.2.5: dependencies: - brace-expansion: 5.0.5 + brace-expansion: 5.0.6 minimatch@9.0.9: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.1.0 minimist@1.2.8: {} @@ -9209,7 +9048,7 @@ snapshots: nanoid@3.3.12: {} - nanoid@5.1.7: {} + nanoid@5.1.11: {} natural-compare@1.4.0: {} @@ -9282,14 +9121,14 @@ snapshots: normalize-package-data@5.0.0: dependencies: hosted-git-info: 6.1.3 - is-core-module: 2.16.1 + is-core-module: 2.16.2 semver: 7.8.0 validate-npm-package-license: 3.0.4 normalize-package-data@8.0.0: dependencies: - hosted-git-info: 9.0.2 - semver: 7.8.0 + hosted-git-info: 9.0.3 + semver: 7.7.4 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -9306,14 +9145,14 @@ snapshots: object-is@1.1.6: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 object-keys@1.1.1: {} object.assign@4.1.7: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -9369,7 +9208,7 @@ snapshots: p-retry@6.2.1: dependencies: '@types/retry': 0.12.2 - is-network-error: 1.3.1 + is-network-error: 1.3.2 retry: 0.13.1 p-timeout@7.0.1: {} @@ -9419,7 +9258,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.2.7 + lru-cache: 11.4.0 minipass: 7.1.3 path-webpack@0.0.3: {} @@ -9460,7 +9299,7 @@ snapshots: dependencies: colorette: 2.0.20 dateformat: 4.6.3 - fast-copy: 4.0.2 + fast-copy: 4.0.3 fast-safe-stringify: 2.1.1 help-me: 5.0.0 joycon: 3.1.1 @@ -9486,7 +9325,7 @@ snapshots: real-require: 0.2.0 safe-stable-stringify: 2.5.0 sonic-boom: 4.2.1 - thread-stream: 4.0.0 + thread-stream: 4.2.0 pkg-dir@5.0.0: dependencies: @@ -9521,17 +9360,17 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.5.15: + postcss@8.5.14: dependencies: nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.29.0: {} + preact@10.29.2: {} prelude-ls@1.2.1: {} - prettier@3.8.1: {} + prettier@3.8.3: {} process-nextick-args@2.0.1: {} @@ -9557,7 +9396,7 @@ snapshots: prosemirror-commands@1.7.1: dependencies: - prosemirror-model: 1.25.6 + prosemirror-model: 1.25.7 prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 @@ -9570,7 +9409,7 @@ snapshots: prosemirror-gapcursor@1.4.1: dependencies: prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.6 + prosemirror-model: 1.25.7 prosemirror-state: 1.4.4 prosemirror-view: 1.41.8 @@ -9586,37 +9425,37 @@ snapshots: prosemirror-state: 1.4.4 w3c-keyname: 2.2.8 - prosemirror-model@1.25.6: + prosemirror-model@1.25.7: dependencies: orderedmap: 2.1.1 prosemirror-schema-list@1.5.1: dependencies: - prosemirror-model: 1.25.6 + prosemirror-model: 1.25.7 prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 prosemirror-state@1.4.4: dependencies: - prosemirror-model: 1.25.6 + prosemirror-model: 1.25.7 prosemirror-transform: 1.12.0 prosemirror-view: 1.41.8 prosemirror-tables@1.8.5: dependencies: prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.6 + prosemirror-model: 1.25.7 prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 prosemirror-view: 1.41.8 prosemirror-transform@1.12.0: dependencies: - prosemirror-model: 1.25.6 + prosemirror-model: 1.25.7 prosemirror-view@1.41.8: dependencies: - prosemirror-model: 1.25.6 + prosemirror-model: 1.25.7 prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 @@ -9686,14 +9525,14 @@ snapshots: dependencies: find-up-simple: 1.0.1 read-pkg: 10.1.0 - type-fest: 5.5.0 + type-fest: 5.6.0 read-pkg@10.1.0: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 8.0.0 parse-json: 8.3.0 - type-fest: 5.5.0 + type-fest: 5.6.0 unicorn-magic: 0.4.0 readable-stream@2.3.8: @@ -9722,6 +9561,8 @@ snapshots: real-require@0.2.0: {} + real-require@1.0.0: {} + reflect-metadata@0.2.2: {} regex-recursion@6.0.2: @@ -9749,15 +9590,16 @@ snapshots: expand-tilde: 2.0.2 global-modules: 1.0.0 - resolve@1.22.11: + resolve@1.22.12: dependencies: - is-core-module: 2.16.1 + es-errors: 1.3.0 + is-core-module: 2.16.2 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 resolve@1.22.8: dependencies: - is-core-module: 2.16.1 + is-core-module: 2.16.2 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -9793,35 +9635,35 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.1 '@rolldown/binding-win32-x64-msvc': 1.0.1 - rollup@4.60.0: + rollup@4.60.4: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.60.0 - '@rollup/rollup-android-arm64': 4.60.0 - '@rollup/rollup-darwin-arm64': 4.60.0 - '@rollup/rollup-darwin-x64': 4.60.0 - '@rollup/rollup-freebsd-arm64': 4.60.0 - '@rollup/rollup-freebsd-x64': 4.60.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.60.0 - '@rollup/rollup-linux-arm-musleabihf': 4.60.0 - '@rollup/rollup-linux-arm64-gnu': 4.60.0 - '@rollup/rollup-linux-arm64-musl': 4.60.0 - '@rollup/rollup-linux-loong64-gnu': 4.60.0 - '@rollup/rollup-linux-loong64-musl': 4.60.0 - '@rollup/rollup-linux-ppc64-gnu': 4.60.0 - '@rollup/rollup-linux-ppc64-musl': 4.60.0 - '@rollup/rollup-linux-riscv64-gnu': 4.60.0 - '@rollup/rollup-linux-riscv64-musl': 4.60.0 - '@rollup/rollup-linux-s390x-gnu': 4.60.0 - '@rollup/rollup-linux-x64-gnu': 4.60.0 - '@rollup/rollup-linux-x64-musl': 4.60.0 - '@rollup/rollup-openbsd-x64': 4.60.0 - '@rollup/rollup-openharmony-arm64': 4.60.0 - '@rollup/rollup-win32-arm64-msvc': 4.60.0 - '@rollup/rollup-win32-ia32-msvc': 4.60.0 - '@rollup/rollup-win32-x64-gnu': 4.60.0 - '@rollup/rollup-win32-x64-msvc': 4.60.0 + '@rollup/rollup-android-arm-eabi': 4.60.4 + '@rollup/rollup-android-arm64': 4.60.4 + '@rollup/rollup-darwin-arm64': 4.60.4 + '@rollup/rollup-darwin-x64': 4.60.4 + '@rollup/rollup-freebsd-arm64': 4.60.4 + '@rollup/rollup-freebsd-x64': 4.60.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.4 + '@rollup/rollup-linux-arm-musleabihf': 4.60.4 + '@rollup/rollup-linux-arm64-gnu': 4.60.4 + '@rollup/rollup-linux-arm64-musl': 4.60.4 + '@rollup/rollup-linux-loong64-gnu': 4.60.4 + '@rollup/rollup-linux-loong64-musl': 4.60.4 + '@rollup/rollup-linux-ppc64-gnu': 4.60.4 + '@rollup/rollup-linux-ppc64-musl': 4.60.4 + '@rollup/rollup-linux-riscv64-gnu': 4.60.4 + '@rollup/rollup-linux-riscv64-musl': 4.60.4 + '@rollup/rollup-linux-s390x-gnu': 4.60.4 + '@rollup/rollup-linux-x64-gnu': 4.60.4 + '@rollup/rollup-linux-x64-musl': 4.60.4 + '@rollup/rollup-openbsd-x64': 4.60.4 + '@rollup/rollup-openharmony-arm64': 4.60.4 + '@rollup/rollup-win32-arm64-msvc': 4.60.4 + '@rollup/rollup-win32-ia32-msvc': 4.60.4 + '@rollup/rollup-win32-x64-gnu': 4.60.4 + '@rollup/rollup-win32-x64-msvc': 4.60.4 fsevents: 2.3.3 rope-sequence@1.3.4: {} @@ -10064,9 +9906,9 @@ snapshots: dependencies: any-promise: 1.3.0 - thread-stream@4.0.0: + thread-stream@4.2.0: dependencies: - real-require: 0.2.0 + real-require: 1.0.0 timers-browserify@2.0.12: dependencies: @@ -10114,7 +9956,7 @@ snapshots: ts-dedent@2.2.0: {} - ts-essentials@10.1.1(typescript@6.0.3): + ts-essentials@10.2.0(typescript@6.0.3): optionalDependencies: typescript: 6.0.3 @@ -10158,7 +10000,7 @@ snapshots: type-fest@4.41.0: {} - type-fest@5.5.0: + type-fest@5.6.0: dependencies: tagged-tag: 1.0.0 @@ -10170,12 +10012,12 @@ snapshots: es-errors: 1.3.0 is-typed-array: 1.1.15 - typescript-eslint@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3): + typescript-eslint@8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.59.4(@typescript-eslint/parser@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/parser': 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.59.4(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.59.3(@typescript-eslint/parser@8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.3(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) eslint: 10.4.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: @@ -10229,9 +10071,9 @@ snapshots: picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 - update-browserslist-db@1.2.3(browserslist@4.28.1): + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: - browserslist: 4.28.1 + browserslist: 4.28.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -10286,53 +10128,52 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-plugin-node-polyfills@0.28.0(rollup@4.60.0)(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)): + vite-plugin-node-polyfills@0.28.0(rollup@4.60.4)(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.60.0) + '@rollup/plugin-inject': 5.0.5(rollup@4.60.4) node-stdlib-browser: 1.3.1 - vite: 8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) + vite: 8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) transitivePeerDependencies: - rollup - vite-plugin-static-copy@4.1.0(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)): + vite-plugin-static-copy@4.1.0(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)): dependencies: chokidar: 3.6.0 p-map: 7.0.4 picocolors: 1.1.1 tinyglobby: 0.2.16 - vite: 8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) + vite: 8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) vite@5.4.21(@types/node@25.9.0)(lightningcss@1.32.0)(sass@1.99.0): dependencies: esbuild: 0.21.5 - postcss: 8.5.15 - rollup: 4.60.0 + postcss: 8.5.14 + rollup: 4.60.4 optionalDependencies: '@types/node': 25.9.0 fsevents: 2.3.3 lightningcss: 1.32.0 sass: 1.99.0 - vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0): + vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 - postcss: 8.5.15 + postcss: 8.5.14 rolldown: 1.0.1 tinyglobby: 0.2.16 optionalDependencies: '@types/node': 25.9.0 - esbuild: 0.27.2 fsevents: 2.3.3 jiti: 2.7.0 sass: 1.99.0 yaml: 2.9.0 - vitepress@1.6.4(@algolia/client-search@5.50.0)(@types/node@25.9.0)(axios@1.16.1)(fuse.js@7.3.0)(jwt-decode@4.0.0)(lightningcss@1.32.0)(postcss@8.5.15)(sass@1.99.0)(search-insights@2.17.3)(typescript@6.0.3): + vitepress@1.6.4(@algolia/client-search@5.52.1)(@types/node@25.9.0)(axios@1.16.1)(fuse.js@7.3.0)(jwt-decode@4.0.0)(lightningcss@1.32.0)(postcss@8.5.14)(sass@1.99.0)(search-insights@2.17.3)(typescript@6.0.3): dependencies: '@docsearch/css': 3.8.2 - '@docsearch/js': 3.8.2(@algolia/client-search@5.50.0)(search-insights@2.17.3) - '@iconify-json/simple-icons': 1.2.75 + '@docsearch/js': 3.8.2(@algolia/client-search@5.52.1)(search-insights@2.17.3) + '@iconify-json/simple-icons': 1.2.82 '@shikijs/core': 2.5.0 '@shikijs/transformers': 2.5.0 '@shikijs/types': 2.5.0 @@ -10349,7 +10190,7 @@ snapshots: vite: 5.4.21(@types/node@25.9.0)(lightningcss@1.32.0)(sass@1.99.0) vue: 3.5.34(typescript@6.0.3) optionalDependencies: - postcss: 8.5.15 + postcss: 8.5.14 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -10379,14 +10220,14 @@ snapshots: vitest-mock-extended@4.0.0(typescript@6.0.3)(vitest@4.1.6): dependencies: - ts-essentials: 10.1.1(typescript@6.0.3) + ts-essentials: 10.2.0(typescript@6.0.3) typescript: 6.0.3 - vitest: 4.1.6(@types/node@25.9.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.9.0)(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) + vitest: 4.1.6(@types/node@25.9.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.9.0)(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) - vitest@4.1.6(@types/node@25.9.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.9.0)(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)): + vitest@4.1.6(@types/node@25.9.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.9.0)(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.6 - '@vitest/mocker': 4.1.6(vite@8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) + '@vitest/mocker': 4.1.6(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.6 '@vitest/runner': 4.1.6 '@vitest/snapshot': 4.1.6 @@ -10403,7 +10244,7 @@ snapshots: tinyexec: 1.1.2 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 8.0.13(@types/node@25.9.0)(esbuild@0.27.2)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) + vite: 8.0.13(@types/node@25.9.0)(jiti@2.7.0)(sass@1.99.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.9.0 @@ -10416,11 +10257,11 @@ snapshots: vscode-uri@3.1.0: {} - vue-component-type-helpers@3.2.7: {} + vue-component-type-helpers@3.3.0: {} vue-concurrency@5.0.3(vue@3.5.34(typescript@6.0.3)): dependencies: - caf: 15.0.1(patch_hash=b09bdde8a1f7e834af8677123b32ceb4f485966fdb476facf5b6c64157c9fc14) + caf: 15.0.1 vue: 3.5.34(typescript@6.0.3) vue-eslint-parser@10.4.0(eslint@10.4.0(jiti@2.7.0)): @@ -10435,7 +10276,7 @@ snapshots: transitivePeerDependencies: - supports-color - vue-inline-svg@4.0.1(patch_hash=29bc386a6e932912ee46485a87911f6ff5409dca9ed70ba0ff32c52d6f56986b)(vue@3.5.34(typescript@6.0.3)): + vue-inline-svg@4.0.1(vue@3.5.34(typescript@6.0.3)): dependencies: vue: 3.5.34(typescript@6.0.3) @@ -10504,7 +10345,7 @@ snapshots: web-streams-polyfill@3.3.3: {} - webdav@5.9.0: + webdav@5.10.0: dependencies: '@buttercup/fetch': 0.2.1 base-64: 1.0.0 @@ -10535,7 +10376,7 @@ snapshots: which-typed-array@1.1.20: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 for-each: 0.3.5 get-proto: 1.0.1 @@ -10575,7 +10416,7 @@ snapshots: ws@8.18.0: {} - ws@8.20.0: {} + ws@8.20.1: {} xml-name-validator@4.0.0: {} @@ -10585,8 +10426,17 @@ snapshots: xtend@4.0.2: {} + y-protocols@1.0.7(yjs@13.6.30): + dependencies: + lib0: 0.2.117 + yjs: 13.6.30 + yaml@2.9.0: {} + yjs@13.6.30: + dependencies: + lib0: 0.2.117 + yn@3.1.1: {} yocto-queue@0.1.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 85b744ceba..37205c4149 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -9,3 +9,9 @@ supportedArchitectures: - current - glibc - musl + +allowBuilds: + '@parcel/watcher': set this to true or false + core-js: set this to true or false + es5-ext: set this to true or false + esbuild: set this to true or false diff --git a/tsconfig.json b/tsconfig.json index 264b86cd8f..572a95cc69 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,3 +1,4 @@ { - "extends": "@opencloud-eu/tsconfig" + "extends": "@opencloud-eu/tsconfig", + "exclude": ["node_modules", "dev/docker/hocuspocus"] }