From ce411ec5c47eef7c60686dfeeb6e71f89897a41f Mon Sep 17 00:00:00 2001 From: Manoj K Date: Sat, 21 Dec 2024 10:07:08 +0530 Subject: [PATCH] feat: changes for agents --- .env | 2 +- .../packages/main/src/integrations-init.ts | 2 +- apps/server/package.json | 1 + apps/server/src/common/utils/tiptap.utils.ts | 46 +++++ .../conversation-history.service.ts | 19 +- .../integration-account.controller.ts | 4 +- .../integration-account.service.ts | 25 ++- .../integrations/integrations.process.ts | 48 ++--- .../src/modules/pages/pages.controller.ts | 2 +- .../src/modules/pages/pages.interface.ts | 13 ++ .../server/src/modules/pages/pages.service.ts | 115 +++++++++++- apps/web/next-env.d.ts | 5 + .../conversation-history.dto.ts | 4 +- packages/types/src/page/create-page.dto.ts | 4 + packages/types/src/page/update-page.dto.ts | 4 + pnpm-lock.yaml | 172 +++++++++++++++++- 16 files changed, 411 insertions(+), 55 deletions(-) create mode 100644 apps/server/src/common/utils/tiptap.utils.ts create mode 100644 apps/server/src/modules/pages/pages.interface.ts create mode 100644 apps/web/next-env.d.ts diff --git a/.env b/.env index 4caf93d..749beba 100644 --- a/.env +++ b/.env @@ -39,7 +39,7 @@ REPLICATION_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DB SUPERTOKEN_CONNECTION_URI=http://localhost:3567 -OAUTH_CALLBACK_URL=https://115d-106-215-173-196.ngrok-free.app/v1/oauth/callback +OAUTH_CALLBACK_URL=https://c4d0-2406-7400-63-557d-c47b-5ddf-65ff-52b8.ngrok-free.app/v1/oauth/callback ############# Frontend ############### # Sync server url used by the frontend to connect to the websocket NEXT_PUBLIC_BASE_HOST=${FRONTEND_HOST} diff --git a/apps/electron/packages/main/src/integrations-init.ts b/apps/electron/packages/main/src/integrations-init.ts index 31b4442..ea2a435 100644 --- a/apps/electron/packages/main/src/integrations-init.ts +++ b/apps/electron/packages/main/src/integrations-init.ts @@ -29,7 +29,7 @@ export const integrationsInit = async () => { Authorization: `Bearer ${accessToken}`, }, }); - + console.log(data); downloadContentToSystem(data); }; diff --git a/apps/server/package.json b/apps/server/package.json index 87ec9ca..ba3a7a2 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -63,6 +63,7 @@ "@prisma/instrumentation": "^5.21.0", "@qdrant/js-client-rest": "^1.12.0", "@sigma/types": "workspace:*", + "@tiptap/html": "^2.10.3", "@types/multer": "^1.4.11", "@types/turndown": "^5.0.5", "@xenova/transformers": "^2.16.1", diff --git a/apps/server/src/common/utils/tiptap.utils.ts b/apps/server/src/common/utils/tiptap.utils.ts new file mode 100644 index 0000000..f586cfe --- /dev/null +++ b/apps/server/src/common/utils/tiptap.utils.ts @@ -0,0 +1,46 @@ +import { Blockquote } from '@tiptap/extension-blockquote'; +import { BulletList } from '@tiptap/extension-bullet-list'; +import { CodeBlock } from '@tiptap/extension-code-block'; +import { Document } from '@tiptap/extension-document'; +import { HardBreak } from '@tiptap/extension-hard-break'; +import { Heading } from '@tiptap/extension-heading'; +import { HorizontalRule } from '@tiptap/extension-horizontal-rule'; +import { Image } from '@tiptap/extension-image'; +import { Link } from '@tiptap/extension-link'; +import { ListItem } from '@tiptap/extension-list-item'; +import { OrderedList } from '@tiptap/extension-ordered-list'; +import { Paragraph } from '@tiptap/extension-paragraph'; +import { TaskItem } from '@tiptap/extension-task-item'; +import { TaskList } from '@tiptap/extension-task-list'; +import { Text } from '@tiptap/extension-text'; +import { Underline } from '@tiptap/extension-underline'; +import { generateHTML, generateJSON } from '@tiptap/html'; + +export const tiptapExtensions = [ + Document, + Text, + Paragraph, + Heading, + Blockquote, + ListItem, + OrderedList, + BulletList, + TaskList, + TaskItem, + Image, + CodeBlock, + HardBreak, + HorizontalRule, + Link, + Underline, +]; + +export function convertHtmlToTiptapJson(html: string) { + const tiptapJson = generateJSON(html, tiptapExtensions); + return tiptapJson; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function convertTiptapJsonToHtml(tiptapJson: Record) { + return generateHTML(tiptapJson, tiptapExtensions); +} diff --git a/apps/server/src/modules/conversation-history/conversation-history.service.ts b/apps/server/src/modules/conversation-history/conversation-history.service.ts index 5e58bc6..88fe35c 100644 --- a/apps/server/src/modules/conversation-history/conversation-history.service.ts +++ b/apps/server/src/modules/conversation-history/conversation-history.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { Activity, ConversationContext, - ConversationContextIds, + ConversationContextData, ConversationHistory, CreateConversationHistoryDto, Page, @@ -90,10 +90,11 @@ export class ConversationHistoryService { return null; } const context = - (conversationHistory.context as ConversationContextIds) || {}; + (conversationHistory.context as ConversationContextData) || {}; + const { pages, activityIds, ...otherContextData } = context; // Get pages data if pageIds exist let page: Page[] = []; - if (context?.pages?.length) { + if (pages?.length) { page = await Promise.all( context.pages.map(async (pageContext) => { const page = await this.prisma.page.findUnique({ @@ -120,7 +121,7 @@ export class ConversationHistoryService { // Get activities data if activityIds exist // eslint-disable-next-line @typescript-eslint/no-explicit-any let activity: Activity[] = []; - if (context?.activityIds?.length) { + if (activityIds?.length) { activity = await this.prisma.activity.findMany({ where: { id: { @@ -133,7 +134,7 @@ export class ConversationHistoryService { // Get previous conversation history message and response let previousHistory = null; if (conversationHistory.conversationId) { - const previousMessages = await this.prisma.conversationHistory.findMany({ + previousHistory = await this.prisma.conversationHistory.findMany({ where: { conversationId: conversationHistory.conversationId, id: { @@ -142,20 +143,16 @@ export class ConversationHistoryService { deleted: null, }, orderBy: { - createdAt: 'desc', + createdAt: 'asc', }, - take: 1, }); - - if (previousMessages.length > 0) { - previousHistory = previousMessages.slice(0, 2); - } } return { page, activity, previousHistory, + ...otherContextData, }; } } diff --git a/apps/server/src/modules/integration-account/integration-account.controller.ts b/apps/server/src/modules/integration-account/integration-account.controller.ts index 2c71b69..a39818d 100644 --- a/apps/server/src/modules/integration-account/integration-account.controller.ts +++ b/apps/server/src/modules/integration-account/integration-account.controller.ts @@ -18,7 +18,7 @@ import { import { SessionContainer } from 'supertokens-node/recipe/session'; import { AuthGuard } from 'modules/auth/auth.guard'; -import { Session, Workspace } from 'modules/auth/session.decorator'; +import { Session, UserId, Workspace } from 'modules/auth/session.decorator'; import { IntegrationAccountService } from './integration-account.service'; @@ -57,10 +57,12 @@ export class IntegrationAccountController { async getIntegrationAccountsByName( @Query('integrations') integrations: string, @Workspace() workspaceId: string, + @UserId() userId: string, ) { return await this.integrationAccountService.getIntegrationAccountsByName( integrations, workspaceId, + userId, ); } diff --git a/apps/server/src/modules/integration-account/integration-account.service.ts b/apps/server/src/modules/integration-account/integration-account.service.ts index 0f1c1b1..fba9046 100644 --- a/apps/server/src/modules/integration-account/integration-account.service.ts +++ b/apps/server/src/modules/integration-account/integration-account.service.ts @@ -14,6 +14,8 @@ import { loadRemoteModule, } from 'common/remote-loader'; +import { UsersService } from 'modules/users/users.service'; + import { IntegrationAccountSelect, IntegrationAccountSelectByNames, @@ -21,7 +23,10 @@ import { @Injectable() export class IntegrationAccountService { - constructor(private prisma: PrismaService) {} + constructor( + private prisma: PrismaService, + private usersService: UsersService, + ) {} async createIntegrationAccount( createIntegrationAccountDto: CreateIntegrationAccountDto, @@ -184,6 +189,7 @@ export class IntegrationAccountService { async getIntegrationAccountsByName( integrations: string, workspaceId: string, + userId: string, ) { const accounts = await this.prisma.integrationAccount.findMany({ where: { @@ -198,7 +204,22 @@ export class IntegrationAccountService { select: IntegrationAccountSelectByNames, }); - return accounts.reduce( + const pat = await this.usersService.getOrCreatePat(userId, workspaceId); + const accountsWithTokens = await Promise.all( + accounts.map(async (account) => { + const accountWithToken = await this.getIntegrationAccountWithToken( + account.id, + account.workspaceId, + pat, + ); + return { + ...account, + integrationConfiguration: { access_token: accountWithToken.token }, + }; + }), + ); + + return accountsWithTokens.reduce( (acc, account) => { acc[account.integrationDefinition.slug] = account; return acc; diff --git a/apps/server/src/modules/integrations/integrations.process.ts b/apps/server/src/modules/integrations/integrations.process.ts index 25c18bb..58c45cf 100644 --- a/apps/server/src/modules/integrations/integrations.process.ts +++ b/apps/server/src/modules/integrations/integrations.process.ts @@ -45,30 +45,30 @@ export class IntegrationsProcessor extends WorkerHost { this.logger.log(`Processing integration account ${integrationAccountId}`); try { - // const integrationAccount = - // await this.prisma.integrationAccount.findUnique({ - // where: { id: integrationAccountId }, - // include: { integrationDefinition: true }, - // }); - - // const pat = await this.usersService.getOrCreatePat( - // integrationAccount.integratedById, - // integrationAccount.workspaceId, - // ); - - // const integrationFunction = await loadRemoteModule( - // getRequires(createAxiosInstance(pat)), - // ); - // const integration = await integrationFunction( - // `file:///Users/manoj/work/sigma-integrations/${integrationAccount.integrationDefinition.slug}/dist/backend/index.js`, - // ); - - // await integration.run({ - // event: IntegrationPayloadEventType.SCHEDULED_TASK, - // eventBody: { - // integrationAccount, - // }, - // }); + const integrationAccount = + await this.prisma.integrationAccount.findUnique({ + where: { id: integrationAccountId }, + include: { integrationDefinition: true }, + }); + + const pat = await this.usersService.getOrCreatePat( + integrationAccount.integratedById, + integrationAccount.workspaceId, + ); + + const integrationFunction = await loadRemoteModule( + getRequires(createAxiosInstance(pat)), + ); + const integration = await integrationFunction( + `${integrationAccount.integrationDefinition.url}/backend/index.js`, + ); + + await integration.run({ + event: IntegrationPayloadEventType.SCHEDULED_TASK, + eventBody: { + integrationAccount, + }, + }); this.logger.log(`Successfully completed task ${integrationAccountId}`); } catch (error) { diff --git a/apps/server/src/modules/pages/pages.controller.ts b/apps/server/src/modules/pages/pages.controller.ts index 1bd03b8..ec30d59 100644 --- a/apps/server/src/modules/pages/pages.controller.ts +++ b/apps/server/src/modules/pages/pages.controller.ts @@ -39,7 +39,7 @@ export class PagesController { @Workspace() workspaceId: string, @Query() getPageByTitleDto: GetPageByTitleDto, ): Promise { - return await this.pagesService.getPageByTitle( + return await this.pagesService.getOrCreatePageByTitle( workspaceId, getPageByTitleDto, ); diff --git a/apps/server/src/modules/pages/pages.interface.ts b/apps/server/src/modules/pages/pages.interface.ts new file mode 100644 index 0000000..e72f36f --- /dev/null +++ b/apps/server/src/modules/pages/pages.interface.ts @@ -0,0 +1,13 @@ +export const PageSelect = { + id: true, + title: true, + type: true, + description: true, + archived: true, + tags: true, + workspaceId: true, + parentId: true, + deleted: true, + createdAt: true, + updatedAt: true, +}; diff --git a/apps/server/src/modules/pages/pages.service.ts b/apps/server/src/modules/pages/pages.service.ts index f9847ee..cc91077 100644 --- a/apps/server/src/modules/pages/pages.service.ts +++ b/apps/server/src/modules/pages/pages.service.ts @@ -1,3 +1,4 @@ +import { TiptapTransformer } from '@hocuspocus/transformer'; import { Injectable } from '@nestjs/common'; import { CreatePageDto, @@ -6,6 +7,15 @@ import { UpdatePageDto, } from '@sigma/types'; import { PrismaService } from 'nestjs-prisma'; +import * as Y from 'yjs'; + +import { + convertHtmlToTiptapJson, + convertTiptapJsonToHtml, + tiptapExtensions, +} from 'common/utils/tiptap.utils'; + +import { PageSelect } from './pages.interface'; @Injectable() export class PagesService { @@ -15,32 +25,92 @@ export class PagesService { workspaceId: string, getPageByTitleDto: GetPageByTitleDto, ): Promise { - return this.prisma.page.findFirst({ + const page = await this.prisma.page.findFirst({ where: { title: getPageByTitleDto.title, type: getPageByTitleDto.type, workspaceId, deleted: null, }, + select: PageSelect, + }); + + if (page?.description) { + const descriptionJson = JSON.parse(page.description); + page.description = convertTiptapJsonToHtml(descriptionJson); + } + + return page; + } + + async getOrCreatePageByTitle( + workspaceId: string, + getPageByTitleDto: GetPageByTitleDto, + ): Promise { + // Try to find existing page + const existingPage = await this.prisma.page.findFirst({ + where: { + title: getPageByTitleDto.title, + type: getPageByTitleDto.type, + workspaceId, + deleted: null, + }, + select: PageSelect, + }); + + if (existingPage) { + if (existingPage.description) { + const descriptionJson = JSON.parse(existingPage.description); + existingPage.description = convertTiptapJsonToHtml(descriptionJson); + } + return existingPage; + } + + // Create new page if not found + return this.prisma.page.create({ + data: { + title: getPageByTitleDto.title, + type: getPageByTitleDto.type, + workspace: { connect: { id: workspaceId } }, + sortOrder: '', + tags: [], + }, + select: PageSelect, }); } async getPage(pageId: string): Promise { - return this.prisma.page.findUnique({ + const page = await this.prisma.page.findUnique({ where: { id: pageId, deleted: null, }, + select: PageSelect, }); + + if (page?.description) { + const descriptionJson = JSON.parse(page.description); + page.description = convertTiptapJsonToHtml(descriptionJson); + } + + return page; } async createPage( - { parentId, ...pageData }: CreatePageDto, + { parentId, description, htmlDescription, ...pageData }: CreatePageDto, workspaceId: string, ): Promise { + let finalDescription = description; + if (htmlDescription && !description) { + finalDescription = JSON.stringify( + await convertHtmlToTiptapJson(htmlDescription), + ); + } + return this.prisma.page.create({ data: { ...pageData, + description: finalDescription, workspace: { connect: { id: workspaceId } }, ...(parentId && { parent: { connect: { id: parentId } } }), }, @@ -48,17 +118,47 @@ export class PagesService { } async updatePage( - { parentId, ...pageData }: UpdatePageDto, + { parentId, description, htmlDescription, ...pageData }: UpdatePageDto, pageId: string, ): Promise { + let finalDescription = description; + if (htmlDescription && !description) { + finalDescription = JSON.stringify( + await convertHtmlToTiptapJson(htmlDescription), + ); + } + + // Initialize YDoc with existing state + const ydoc = new Y.Doc(); + + if (finalDescription) { + // Parse the JSON description if it's a string + const descriptionJson = + typeof finalDescription === 'string' + ? JSON.parse(finalDescription) + : finalDescription; + + // Convert Tiptap JSON to YDoc + const newYDoc = TiptapTransformer.toYdoc( + descriptionJson, + 'default', + tiptapExtensions, + ); + Y.applyUpdate(ydoc, Y.encodeStateAsUpdate(newYDoc)); + } + + // Get the binary state + const binaryState = Y.encodeStateAsUpdate(ydoc); + return this.prisma.page.update({ where: { id: pageId }, data: { ...pageData, - ...(parentId - ? { parent: { connect: { id: parentId } } } - : { parentId }), + description: finalDescription, + descriptionBinary: Buffer.from(binaryState), + ...(parentId && { parent: { connect: { id: parentId } } }), }, + select: PageSelect, }); } @@ -68,6 +168,7 @@ export class PagesService { data: { deleted: new Date(), }, + select: PageSelect, }); } } diff --git a/apps/web/next-env.d.ts b/apps/web/next-env.d.ts new file mode 100644 index 0000000..4f11a03 --- /dev/null +++ b/apps/web/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/packages/types/src/conversation-history/conversation-history.dto.ts b/packages/types/src/conversation-history/conversation-history.dto.ts index a697673..a867b36 100644 --- a/packages/types/src/conversation-history/conversation-history.dto.ts +++ b/packages/types/src/conversation-history/conversation-history.dto.ts @@ -12,9 +12,11 @@ export class pageContext { id: string; location: string[]; } -export class ConversationContextIds { +export class ConversationContextData { pages?: pageContext[]; activityIds?: string[]; + agents?: string[]; + repository?: string; } export class PreviousHistory { diff --git a/packages/types/src/page/create-page.dto.ts b/packages/types/src/page/create-page.dto.ts index f7b6624..2f9ac11 100644 --- a/packages/types/src/page/create-page.dto.ts +++ b/packages/types/src/page/create-page.dto.ts @@ -11,6 +11,10 @@ export class CreatePageDto { @IsString() description?: string; + @IsOptional() + @IsString() + htmlDescription?: string; + @IsOptional() @IsString() parentId?: string; diff --git a/packages/types/src/page/update-page.dto.ts b/packages/types/src/page/update-page.dto.ts index f3bdf3e..afa2d2b 100644 --- a/packages/types/src/page/update-page.dto.ts +++ b/packages/types/src/page/update-page.dto.ts @@ -9,6 +9,10 @@ export class UpdatePageDto { @IsString() description?: string; + @IsOptional() + @IsString() + htmlDescription?: string; + @IsOptional() @IsString() parentId?: string; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4f2822f..c737714 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -201,6 +201,9 @@ importers: '@sigma/types': specifier: workspace:* version: link:../../packages/types + '@tiptap/html': + specifier: ^2.10.3 + version: 2.10.3(@tiptap/core@2.8.0(@tiptap/pm@2.8.0))(@tiptap/pm@2.8.0) '@types/multer': specifier: ^1.4.11 version: 1.4.12 @@ -384,7 +387,7 @@ importers: version: 6.3.4 ts-jest: specifier: 29.1.2 - version: 29.1.2(@babel/core@7.23.3)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.3))(jest@29.7.0(@types/node@20.16.11)(ts-node@10.9.2(@swc/core@1.7.36(@swc/helpers@0.5.5))(@types/node@20.16.11)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.1.2(@babel/core@7.25.8)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(jest@29.7.0(@types/node@20.16.11)(ts-node@10.9.2(@swc/core@1.7.36(@swc/helpers@0.5.5))(@types/node@20.16.11)(typescript@5.6.2)))(typescript@5.6.2) ts-loader: specifier: 9.5.1 version: 9.5.1(typescript@5.6.2)(webpack@5.89.0(@swc/core@1.7.36(@swc/helpers@0.5.5))) @@ -4489,6 +4492,12 @@ packages: peerDependencies: '@tiptap/core': ^2.7.0 + '@tiptap/html@2.10.3': + resolution: {integrity: sha512-ERfehdfRN8TRfZCLOWHnZDaP3tTO3+wov791p/b7vuJOKCiPHlGZ1dX72Bysvfn4F98ZLJBHKtuVLqti7qRo5w==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + '@tiptap/pm@2.8.0': resolution: {integrity: sha512-eMGpRooUMvKz/vOpnKKppApMSoNM325HxTdAJvTlVAmuHp5bOY5kyY1kfUlePRiVx1t1UlFcXs3kecFwkkBD3Q==} @@ -6804,6 +6813,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@5.0.0: + resolution: {integrity: sha512-BeJFvFRJddxobhvEdm5GqHzRV/X+ACeuw0/BuuxsCh1EUZcAIz8+kYmBp/LrQuloy6K1f3a0M7+IhmZ7QnkISA==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -12780,6 +12793,10 @@ packages: yoga-wasm-web@0.3.3: resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} + zeed-dom@0.15.1: + resolution: {integrity: sha512-dtZ0aQSFyZmoJS0m06/xBN1SazUBPL5HpzlAcs/KcRW0rzadYw12deQBjeMhGKMMeGEp7bA9vmikMLaO4exBcg==} + engines: {node: '>=14.13.1'} + zip-stream@4.1.1: resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} engines: {node: '>= 10'} @@ -13661,36 +13678,78 @@ snapshots: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + optional: true + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.3)': dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + optional: true + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.3)': dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + optional: true + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.3)': dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + optional: true + '@babel/plugin-syntax-import-attributes@7.25.7(@babel/core@7.23.3)': dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-import-attributes@7.25.7(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + optional: true + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.3)': dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + optional: true + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.3)': dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + optional: true + '@babel/plugin-syntax-jsx@7.25.7(@babel/core@7.23.3)': dependencies: '@babel/core': 7.23.3 @@ -13701,41 +13760,89 @@ snapshots: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + optional: true + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.3)': dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + optional: true + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.3)': dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + optional: true + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.3)': dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + optional: true + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.3)': dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + optional: true + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.3)': dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + optional: true + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.3)': dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + optional: true + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.3)': dependencies: '@babel/core': 7.23.3 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.25.7 + optional: true + '@babel/plugin-syntax-typescript@7.25.7(@babel/core@7.23.3)': dependencies: '@babel/core': 7.23.3 @@ -17182,6 +17289,12 @@ snapshots: dependencies: '@tiptap/core': 2.8.0(@tiptap/pm@2.8.0) + '@tiptap/html@2.10.3(@tiptap/core@2.8.0(@tiptap/pm@2.8.0))(@tiptap/pm@2.8.0)': + dependencies: + '@tiptap/core': 2.8.0(@tiptap/pm@2.8.0) + '@tiptap/pm': 2.8.0 + zeed-dom: 0.15.1 + '@tiptap/pm@2.8.0': dependencies: prosemirror-changeset: 2.2.1 @@ -18748,6 +18861,20 @@ snapshots: transitivePeerDependencies: - supports-color + babel-jest@29.7.0(@babel/core@7.25.8): + dependencies: + '@babel/core': 7.25.8 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.25.8) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + optional: true + babel-plugin-istanbul@6.1.1: dependencies: '@babel/helper-plugin-utils': 7.25.7 @@ -18784,12 +18911,39 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.3) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.3) + babel-preset-current-node-syntax@1.1.0(@babel/core@7.25.8): + dependencies: + '@babel/core': 7.25.8 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.8) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.8) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.8) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.8) + '@babel/plugin-syntax-import-attributes': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.8) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.8) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.8) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.8) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.8) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.8) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.8) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.8) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.8) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.8) + optional: true + babel-preset-jest@29.6.3(@babel/core@7.23.3): dependencies: '@babel/core': 7.23.3 babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.1.0(@babel/core@7.23.3) + babel-preset-jest@29.6.3(@babel/core@7.25.8): + dependencies: + '@babel/core': 7.25.8 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.8) + optional: true + babel-walk@3.0.0-canary-5: dependencies: '@babel/types': 7.25.7 @@ -19627,8 +19781,7 @@ snapshots: mdn-data: 2.0.30 source-map-js: 1.2.1 - css-what@6.1.0: - optional: true + css-what@6.1.0: {} cssesc@3.0.0: {} @@ -20134,6 +20287,8 @@ snapshots: entities@4.5.0: {} + entities@5.0.0: {} + env-paths@2.2.1: {} env-paths@3.0.0: {} @@ -27028,7 +27183,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.1.2(@babel/core@7.23.3)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.3))(jest@29.7.0(@types/node@20.16.11)(ts-node@10.9.2(@swc/core@1.7.36(@swc/helpers@0.5.5))(@types/node@20.16.11)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.1.2(@babel/core@7.25.8)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(jest@29.7.0(@types/node@20.16.11)(ts-node@10.9.2(@swc/core@1.7.36(@swc/helpers@0.5.5))(@types/node@20.16.11)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -27041,9 +27196,9 @@ snapshots: typescript: 5.6.2 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.25.8 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.23.3) + babel-jest: 29.7.0(@babel/core@7.25.8) ts-key-enum@2.0.13: {} @@ -28026,6 +28181,11 @@ snapshots: yoga-wasm-web@0.3.3: {} + zeed-dom@0.15.1: + dependencies: + css-what: 6.1.0 + entities: 5.0.0 + zip-stream@4.1.1: dependencies: archiver-utils: 3.0.4