diff options
| author | Dhravya Shah <[email protected]> | 2024-08-06 11:20:29 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-08-06 11:20:29 -0700 |
| commit | 7fc39cd770e4b2f55c6fdae1fa02fe0a66a93f6d (patch) | |
| tree | 82e6a03099b50441c2fe9a9bf8e8ddf7afa293e5 | |
| parent | Merge pull request #219 from Deepakchowdavarapu/readme-issue (diff) | |
| parent | updated kv and queues (diff) | |
| download | supermemory-7fc39cd770e4b2f55c6fdae1fa02fe0a66a93f6d.tar.xz supermemory-7fc39cd770e4b2f55c6fdae1fa02fe0a66a93f6d.zip | |
Merge pull request #193 from supermemoryai/kush/be-queue
Kush/be queue
55 files changed, 2295 insertions, 792 deletions
diff --git a/apps/cf-ai-backend/bun.lockb b/apps/cf-ai-backend/bun.lockb Binary files differnew file mode 100755 index 00000000..601774bc --- /dev/null +++ b/apps/cf-ai-backend/bun.lockb diff --git a/apps/cf-ai-backend/package.json b/apps/cf-ai-backend/package.json index 2b83cc93..3fcf71e0 100644 --- a/apps/cf-ai-backend/package.json +++ b/apps/cf-ai-backend/package.json @@ -13,9 +13,11 @@ "license": "MIT", "dependencies": { "@hono/zod-validator": "^0.2.1", - "hono": "^4.5.1" + "hono": "^4.5.1", + "honox": "^0.1.23", + "vite": "^5.3.5" }, - "devDependencies": { - "@cloudflare/workers-types": "^4.20240614.0" - } + "devDependencies": { + "@cloudflare/workers-types": "^4.20240614.0" + } } diff --git a/apps/cf-ai-backend/src/db/index.ts b/apps/cf-ai-backend/src/db/index.ts new file mode 100644 index 00000000..b7a05fa5 --- /dev/null +++ b/apps/cf-ai-backend/src/db/index.ts @@ -0,0 +1,7 @@ +import { drizzle } from "drizzle-orm/d1"; +import { Env } from "../types"; + +import * as schema from "@repo/db/schema"; + +export const database = (env: Env) => + drizzle(env.DATABASE, { schema, logger: true }); diff --git a/apps/cf-ai-backend/src/errors/baseError.ts b/apps/cf-ai-backend/src/errors/baseError.ts new file mode 100644 index 00000000..0dcc2203 --- /dev/null +++ b/apps/cf-ai-backend/src/errors/baseError.ts @@ -0,0 +1,46 @@ +export class BaseHttpError extends Error { + public status: number; + public message: string; + + constructor(status: number, message: string) { + super(message); + this.status = status; + this.message = message; + Object.setPrototypeOf(this, new.target.prototype); // Restore prototype chain + } + } + + + export class BaseError extends Error { + type: string; + message: string; + source: string; + ignoreLog: boolean; + + constructor( + type: string, + message?: string, + source?: string, + ignoreLog = false + ) { + super(); + + Object.setPrototypeOf(this, new.target.prototype); + + this.type = type; + this.message = + message ?? + "An unknown error occurred. If this persists, please contact us."; + this.source = source ?? "unspecified"; + this.ignoreLog = ignoreLog; + } + + toJSON(): Record<PropertyKey, string> { + return { + type: this.type, + message: this.message, + source: this.source, + }; + } + } +
\ No newline at end of file diff --git a/apps/cf-ai-backend/src/errors/results.ts b/apps/cf-ai-backend/src/errors/results.ts new file mode 100644 index 00000000..ccce1396 --- /dev/null +++ b/apps/cf-ai-backend/src/errors/results.ts @@ -0,0 +1,31 @@ +import { BaseError } from "./baseError"; + +export type Result<T, E extends Error> = + | { ok: true; value: T } + | { ok: false; error: E }; + +export const Ok = <T>(data: T): Result<T, never> => { + return { ok: true, value: data }; +}; + +export const Err = <E extends BaseError>(error: E): Result<never, E> => { + return { ok: false, error }; +}; + +export async function wrap<T, E extends BaseError>( + p: Promise<T>, + errorFactory: (err: Error, source: string) => E, + source: string = "unspecified" + ): Promise<Result<T, E>> { + try { + return Ok(await p); + } catch (e) { + return Err(errorFactory(e as Error, source)); + } + } + +export function isErr<T, E extends Error>( + result: Result<T, E>, +): result is { ok: false; error: E } { + return !result.ok; +} diff --git a/apps/cf-ai-backend/src/helper.ts b/apps/cf-ai-backend/src/helper.ts index 54848442..70efaecd 100644 --- a/apps/cf-ai-backend/src/helper.ts +++ b/apps/cf-ai-backend/src/helper.ts @@ -9,17 +9,14 @@ import { z } from "zod"; import { seededRandom } from "./utils/seededRandom"; import { bulkInsertKv } from "./utils/kvBulkInsert"; -export async function initQuery( - c: Context<{ Bindings: Env }>, - model: string = "gpt-4o", -) { +export async function initQuery(env: Env, model: string = "gpt-4o") { const embeddings = new OpenAIEmbeddings({ - apiKey: c.env.OPENAI_API_KEY, + apiKey: env.OPENAI_API_KEY, modelName: "text-embedding-3-small", }); const store = new CloudflareVectorizeStore(embeddings, { - index: c.env.VECTORIZE_INDEX, + index: env.VECTORIZE_INDEX, }); let selectedModel: @@ -30,7 +27,7 @@ export async function initQuery( switch (model) { case "claude-3-opus": const anthropic = createAnthropic({ - apiKey: c.env.ANTHROPIC_API_KEY, + apiKey: env.ANTHROPIC_API_KEY, baseURL: "https://gateway.ai.cloudflare.com/v1/47c2b4d598af9d423c06fc9f936226d5/supermemory/anthropic", }); @@ -39,7 +36,7 @@ export async function initQuery( break; case "gemini-1.5-pro": const googleai = createGoogleGenerativeAI({ - apiKey: c.env.GOOGLE_AI_API_KEY, + apiKey: env.GOOGLE_AI_API_KEY, baseURL: "https://gateway.ai.cloudflare.com/v1/47c2b4d598af9d423c06fc9f936226d5/supermemory/google-vertex-ai", }); @@ -49,7 +46,7 @@ export async function initQuery( case "gpt-4o": default: const openai = createOpenAI({ - apiKey: c.env.OPENAI_API_KEY, + apiKey: env.OPENAI_API_KEY, baseURL: "https://gateway.ai.cloudflare.com/v1/47c2b4d598af9d423c06fc9f936226d5/supermemory/openai", compatibility: "strict", @@ -132,24 +129,25 @@ export async function batchCreateChunksAndEmbeddings({ store, body, chunks, - context, + env: env, }: { store: CloudflareVectorizeStore; body: z.infer<typeof vectorObj>; chunks: Chunks; - context: Context<{ Bindings: Env }>; + env: Env; }) { //! NOTE that we use #supermemory-web to ensure that //! If a user saves it through the extension, we don't want other users to be able to see it. // Requests from the extension should ALWAYS have a unique ID with the USERiD in it. // I cannot stress this enough, important for security. + const ourID = `${body.url}#supermemory-web`; const random = seededRandom(ourID); const uuid = random().toString(36).substring(2, 15) + random().toString(36).substring(2, 15); - const allIds = await context.env.KV.list({ prefix: uuid }); + const allIds = await env.KV.list({ prefix: uuid }); // If some chunks for that content already exist, we'll just update the metadata to include // the user. @@ -159,7 +157,7 @@ export async function batchCreateChunksAndEmbeddings({ //Search in a batch of 20 for (let i = 0; i < savedVectorIds.length; i += 20) { const batch = savedVectorIds.slice(i, i + 20); - const batchVectors = await context.env.VECTORIZE_INDEX.getByIds(batch); + const batchVectors = await env.VECTORIZE_INDEX.getByIds(batch); vectors.push(...batchVectors); } console.log( @@ -193,7 +191,7 @@ export async function batchCreateChunksAndEmbeddings({ await Promise.all( results.map((result) => { - return context.env.VECTORIZE_INDEX.upsert(result); + return env.VECTORIZE_INDEX.upsert(result); }), ); return; @@ -205,7 +203,7 @@ export async function batchCreateChunksAndEmbeddings({ const commonMetaData = { type: body.type ?? "tweet", title: body.title?.slice(0, 50) ?? "", - description: body.description ?? "", + description: body.description?.slice(0, 50) ?? "", url: body.url, [sanitizeKey(`user-${body.user}`)]: 1, }; @@ -244,8 +242,7 @@ export async function batchCreateChunksAndEmbeddings({ }); console.log("these are the doucment ids", ids); console.log("Docs added:", docs); - const { CF_KV_AUTH_TOKEN, CF_ACCOUNT_ID, KV_NAMESPACE_ID } = - context.env; + const { CF_KV_AUTH_TOKEN, CF_ACCOUNT_ID, KV_NAMESPACE_ID } = env; await bulkInsertKv( { CF_KV_AUTH_TOKEN, CF_ACCOUNT_ID, KV_NAMESPACE_ID }, { chunkIds: ids, urlid: ourID }, @@ -257,7 +254,7 @@ export async function batchCreateChunksAndEmbeddings({ const commonMetaData = { type: body.type ?? "page", title: body.title?.slice(0, 50) ?? "", - description: body.description ?? "", + description: body.description?.slice(0, 50) ?? "", url: body.url, [sanitizeKey(`user-${body.user}`)]: 1, }; @@ -267,23 +264,31 @@ export async function batchCreateChunksAndEmbeddings({ }, {}); const ids = []; - const preparedDocuments = chunks.chunks.map((chunk, i) => { + console.log("Page hit moving on to the for loop"); + for (let i = 0; i < chunks.chunks.length; i++) { + const chunk = chunks.chunks[i]; const id = `${uuid}-${i}`; ids.push(id); - return { + const document = { pageContent: chunk, metadata: { - content: chunk, ...commonMetaData, ...spaceMetadata, }, }; - }); - - const docs = await store.addDocuments(preparedDocuments, { ids: ids }); - console.log("Docs added:", docs); - const { CF_KV_AUTH_TOKEN, CF_ACCOUNT_ID, KV_NAMESPACE_ID } = - context.env; + const docs = await store.addDocuments([document], { ids: [id] }); + console.log("Docs added:", docs); + // Wait for a second after every 20 documents for open ai rate limit + console.log( + "This is the 20th thing in the list?", + (i + 1) % 20 === 0, + ); + if ((i + 1) % 20 === 0) { + await new Promise((resolve) => setTimeout(resolve, 1000)); + } + } + + const { CF_KV_AUTH_TOKEN, CF_ACCOUNT_ID, KV_NAMESPACE_ID } = env; await bulkInsertKv( { CF_KV_AUTH_TOKEN, CF_ACCOUNT_ID, KV_NAMESPACE_ID }, { chunkIds: ids, urlid: ourID }, @@ -295,7 +300,7 @@ export async function batchCreateChunksAndEmbeddings({ const commonMetaData = { title: body.title?.slice(0, 50) ?? "", type: body.type ?? "page", - description: body.description ?? "", + description: body.description?.slice(0, 50) ?? "", url: body.url, [sanitizeKey(`user-${body.user}`)]: 1, }; @@ -305,23 +310,30 @@ export async function batchCreateChunksAndEmbeddings({ }, {}); const ids = []; - const preparedDocuments = chunks.chunks.map((chunk, i) => { + for (let i = 0; i < chunks.chunks.length; i++) { + const chunk = chunks.chunks[i]; const id = `${uuid}-${i}`; ids.push(id); - return { + const document = { pageContent: chunk, metadata: { - content: chunk, ...commonMetaData, ...spaceMetadata, }, }; - }); - - const docs = await store.addDocuments(preparedDocuments, { ids: ids }); - console.log("Docs added:", docs); - const { CF_KV_AUTH_TOKEN, CF_ACCOUNT_ID, KV_NAMESPACE_ID } = - context.env; + const docs = await store.addDocuments([document], { ids: [id] }); + console.log("Docs added:", docs); + // Wait for a second after every 20 documents for open ai rate limit + console.log( + "This is the 20th thing in the list?", + (i + 1) % 20 === 0, + ); + if ((i + 1) % 20 === 0) { + await new Promise((resolve) => setTimeout(resolve, 1000)); + } + } + + const { CF_KV_AUTH_TOKEN, CF_ACCOUNT_ID, KV_NAMESPACE_ID } = env; await bulkInsertKv( { CF_KV_AUTH_TOKEN, CF_ACCOUNT_ID, KV_NAMESPACE_ID }, { chunkIds: ids, urlid: ourID }, @@ -332,7 +344,7 @@ export async function batchCreateChunksAndEmbeddings({ const commonMetaData = { type: body.type ?? "image", title: body.title, - description: body.description ?? "", + description: body.description?.slice(0, 50) ?? "", url: body.url, [sanitizeKey(`user-${body.user}`)]: 1, }; @@ -342,26 +354,34 @@ export async function batchCreateChunksAndEmbeddings({ }, {}); const ids = []; - const preparedDocuments = chunks.chunks.map((chunk, i) => { + for (let i = 0; i < chunks.chunks.length; i++) { + const chunk = chunks.chunks[i]; const id = `${uuid}-${i}`; ids.push(id); - return { + const document = { pageContent: chunk, metadata: { ...commonMetaData, ...spaceMetadata, }, }; - }); + const docs = await store.addDocuments([document], { ids: [id] }); + console.log("Docs added:", docs); + // Wait for a second after every 20 documents for open ai rate limit + console.log("This is the 20th thing in the list?", (i + 1) % 20 === 0); + if ((i + 1) % 20 === 0) { + console.log("-----------waiting atm"); + await new Promise((resolve) => setTimeout(resolve, 1000)); + } + } - const docs = await store.addDocuments(preparedDocuments, { ids: ids }); - console.log("Docs added:", docs); - const { CF_KV_AUTH_TOKEN, CF_ACCOUNT_ID, KV_NAMESPACE_ID } = context.env; + const { CF_KV_AUTH_TOKEN, CF_ACCOUNT_ID, KV_NAMESPACE_ID } = env; await bulkInsertKv( { CF_KV_AUTH_TOKEN, CF_ACCOUNT_ID, KV_NAMESPACE_ID }, { chunkIds: ids, urlid: ourID }, ); } } + return; } diff --git a/apps/cf-ai-backend/src/index.ts b/apps/cf-ai-backend/src/index.ts index 70d282d9..1f391359 100644 --- a/apps/cf-ai-backend/src/index.ts +++ b/apps/cf-ai-backend/src/index.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { boolean, z } from "zod"; import { Hono } from "hono"; import { CoreMessage, generateText, streamText, tool } from "ai"; import { @@ -9,6 +9,7 @@ import { PageOrNoteChunks, TweetChunks, vectorObj, + vectorBody, } from "./types"; import { batchCreateChunksAndEmbeddings, @@ -20,21 +21,24 @@ import { logger } from "hono/logger"; import { poweredBy } from "hono/powered-by"; import { bearerAuth } from "hono/bearer-auth"; import { zValidator } from "@hono/zod-validator"; -import chunkText from "./utils/chonker"; +import chunkText from "./queueConsumer/chunkers/chonker"; import { systemPrompt, template } from "./prompts/prompt1"; import { swaggerUI } from "@hono/swagger-ui"; -import { chunkThread } from "./utils/chunkTweet"; -import { chunkNote, chunkPage } from "./utils/chunkPageOrNotes"; +import { database } from "./db"; +import { storedContent } from "@repo/db/schema"; +import { sql, and, eq } from "drizzle-orm"; +import { LIMITS } from "@repo/shared-types"; +import { typeDecider } from "./queueConsumer/utils/typeDecider"; +// import { chunkThread } from "./utils/chunkTweet"; +import { + chunkNote, + chunkPage, +} from "./queueConsumer/chunkers/chunkPageOrNotes"; +import { queue } from "./queueConsumer"; +import { isErr } from "./errors/results"; const app = new Hono<{ Bindings: Env }>(); -app.get( - "/ui", - swaggerUI({ - url: "/doc", - }), -); - // ------- MIDDLEWARES ------- app.use("*", poweredBy()); app.use("*", timing()); @@ -68,40 +72,78 @@ app.get("/api/health", (c) => { return c.json({ status: "ok" }); }); -app.post("/api/add", zValidator("json", vectorObj), async (c) => { +app.post("/api/add", zValidator("json", vectorBody), async (c) => { try { const body = c.req.valid("json"); + //This is something I don't like + // console.log("api/add hit!!!!"); + //Have to do limit on this also duplicate check here + const db = database(c.env); + const typeResult = typeDecider(body.url); + + const saveToDbUrl = + (body.url.split("#supermemory-user-")[0] ?? body.url) + // Why does this have to be a split from #supermemory-user? + "#supermemory-user-" + + body.user; + + console.log( + "---------------------------------------------------------------------------------------------------------------------------------------------", + saveToDbUrl, + ); + const alreadyExist = await db + .select() + .from(storedContent) + .where(eq(storedContent.baseUrl, saveToDbUrl)); + console.log( + "------------------------------------------------", + JSON.stringify(alreadyExist), + ); - const { store } = await initQuery(c); + if (alreadyExist.length > 0) { + console.log( + "------------------------------------------------------------------------------------------------I exist------------------------", + ); + return c.json({ status: "error", message: "the content already exists" }); + } - console.log(body.spaces); - let chunks: TweetChunks | PageOrNoteChunks; - // remove everything in <raw> tags - // const newPageContent = body.pageContent?.replace(/<raw>.*?<\/raw>/g, ""); + if (isErr(typeResult)) { + throw typeResult.error; + } + // limiting in the backend + const type = typeResult.value; + const countResult = await db + .select({ + count: sql<number>`count(*)`.mapWith(Number), + }) + .from(storedContent) + .where( + and(eq(storedContent.userId, body.user), eq(storedContent.type, type)), + ); - switch (body.type) { - case "tweet": - chunks = chunkThread(body.pageContent); - break; + const currentCount = countResult[0]?.count || 0; + const totalLimit = LIMITS[type as keyof typeof LIMITS]; + const remainingLimit = totalLimit - currentCount; + const items = 1; + const isWithinLimit = items <= remainingLimit; - case "page": - chunks = chunkPage(body.pageContent); - break; + // unique contraint check - case "note": - chunks = chunkNote(body.pageContent); - break; + if (isWithinLimit) { + const spaceNumbers = body.spaces.map((s: string) => Number(s)); + await c.env.EMBEDCHUNKS_QUEUE.send({ + content: body.url, + user: body.user, + space: spaceNumbers, + type: type, + }); + } else { + return c.json({ + status: "error", + message: + "You have exceed the current limit for this type of document, please try removing something form memories ", + }); } - console.log("Chunks are here:", chunks); - - await batchCreateChunksAndEmbeddings({ - store, - body, - chunks: chunks, - context: c, - }); - return c.json({ status: "ok" }); } catch (error) { console.error("Error processing request:", error); @@ -134,7 +176,7 @@ app.post( async (c) => { const body = c.req.valid("form"); - const { store } = await initQuery(c); + const { store } = await initQuery(c.env); if (!(body.images || body["images[]"])) { return c.json({ status: "error", message: "No images found" }, 400); @@ -182,7 +224,7 @@ app.post( title: "Image content from the web", }, chunks: chunks, - context: c, + env: c.env, }); return c.json({ status: "ok" }); @@ -200,7 +242,7 @@ app.get( async (c) => { const query = c.req.valid("query"); - const { model } = await initQuery(c); + const { model } = await initQuery(c.env); const response = await streamText({ model, prompt: query.query }); const r = response.toTextStreamResponse(); @@ -218,7 +260,7 @@ app.get( [`user-${user}`]: 1, }; - const { store } = await initQuery(c); + const { store } = await initQuery(c.env); const queryAsVector = await store.embeddings.embedQuery(query); const resp = await c.env.VECTORIZE_INDEX.query(queryAsVector, { @@ -270,7 +312,7 @@ app.post( const { query, user } = c.req.valid("query"); const { chatHistory } = c.req.valid("json"); - const { store, model } = await initQuery(c); + const { store, model } = await initQuery(c.env); let task: "add" | "chat" = "chat"; let thingToAdd: "page" | "image" | "text" | undefined = undefined; @@ -332,7 +374,7 @@ app.post( title: `${addString.slice(0, 30)}... (Added from chatbot)`, }, chunks: vectorContent, - context: c, + env: c.env, }); return c.json({ @@ -445,7 +487,7 @@ app.post( const spaces = query.spaces?.split(",") ?? [undefined]; // Get the AI model maker and vector store - const { model, store } = await initQuery(c, query.model); + const { model, store } = await initQuery(c.env, query.model); if (!body.sources) { const filter: VectorizeVectorMetadataFilter = { @@ -588,6 +630,8 @@ app.post( } } + //Serach mem0 + const preparedContext = body.sources.normalizedData.map( ({ metadata, score, normalizedScore }) => ({ context: `Website title: ${metadata!.title}\nDescription: ${metadata!.description}\nURL: ${metadata!.url}\nContent: ${metadata!.text}`, @@ -598,7 +642,7 @@ app.post( const initialMessages: CoreMessage[] = [ { role: "user", content: systemPrompt }, - { role: "assistant", content: "Hello, how can I help?" }, + { role: "assistant", content: "Hello, how can I help?" }, // prase and add memory json here ]; const prompt = template({ @@ -634,7 +678,7 @@ app.delete( async (c) => { const { websiteUrl, user } = c.req.valid("query"); - const { store } = await initQuery(c); + const { store } = await initQuery(c.env); await deleteDocument({ url: websiteUrl, user, c, store }); @@ -654,7 +698,7 @@ app.get( ), async (c) => { const { context, request } = c.req.valid("query"); - const { model } = await initQuery(c); + const { model } = await initQuery(c.env); const response = await streamText({ model, @@ -707,4 +751,7 @@ app.get("/howFuckedAreWe", async (c) => { return c.json({ fuckedPercent }); }); -export default app; +export default { + fetch: app.fetch, + queue, +}; diff --git a/apps/cf-ai-backend/src/utils/chonker.ts b/apps/cf-ai-backend/src/queueConsumer/chunkers/chonker.ts index 18788dab..18788dab 100644 --- a/apps/cf-ai-backend/src/utils/chonker.ts +++ b/apps/cf-ai-backend/src/queueConsumer/chunkers/chonker.ts diff --git a/apps/cf-ai-backend/src/utils/chunkPageOrNotes.ts b/apps/cf-ai-backend/src/queueConsumer/chunkers/chunkPageOrNotes.ts index f04ed0c5..0da01c3f 100644 --- a/apps/cf-ai-backend/src/utils/chunkPageOrNotes.ts +++ b/apps/cf-ai-backend/src/queueConsumer/chunkers/chunkPageOrNotes.ts @@ -1,5 +1,5 @@ import chunkText from "./chonker"; -import { PageOrNoteChunks } from "../types"; +import { PageOrNoteChunks } from "../../types"; export function chunkPage(pageContent: string): PageOrNoteChunks { const chunks = chunkText(pageContent, 1536); diff --git a/apps/cf-ai-backend/src/queueConsumer/chunkers/chunkTweet.ts b/apps/cf-ai-backend/src/queueConsumer/chunkers/chunkTweet.ts index ae1b18c6..46a56410 100644 --- a/apps/cf-ai-backend/src/queueConsumer/chunkers/chunkTweet.ts +++ b/apps/cf-ai-backend/src/queueConsumer/chunkers/chunkTweet.ts @@ -22,10 +22,18 @@ export interface ThreadTweetData { } export function chunkThread(threadText: string): TweetChunks { - const thread = JSON.parse(threadText); - if (typeof thread == "string") { - console.log("DA WORKER FAILED DO SOMEHTING FIX DA WROKER"); + let thread = threadText; + + try { + thread = JSON.parse(threadText); + } catch (e) { + console.log("error: thread is not json.", e); + } + + if (typeof threadText == "string") { + console.log("DA WORKER FAILED DO SOMEHTING FIX DA WROKER", thread); const rawTweet = getRawTweet(thread); + console.log(rawTweet); const parsedTweet: any = JSON.parse(rawTweet); const chunkedTweet = chunkText(parsedTweet.text, 1536); @@ -48,8 +56,8 @@ export function chunkThread(threadText: string): TweetChunks { return { type: "tweet", chunks }; } else { - console.log(JSON.stringify(thread)); - const chunkedTweets = thread.map((tweet: Tweet) => { + console.log("thread in else statement", JSON.stringify(thread)); + const chunkedTweets = (thread as any).map((tweet: Tweet) => { const chunkedTweet = chunkText(tweet.text, 1536); const metadata = { diff --git a/apps/cf-ai-backend/src/queueConsumer/helpers/processNotes.ts b/apps/cf-ai-backend/src/queueConsumer/helpers/processNotes.ts new file mode 100644 index 00000000..466690cc --- /dev/null +++ b/apps/cf-ai-backend/src/queueConsumer/helpers/processNotes.ts @@ -0,0 +1,36 @@ +import { Result, Ok, Err } from "../../errors/results"; +import { BaseError } from "../../errors/baseError"; +import { Metadata } from "../utils/get-metadata"; + +class ProcessNotesError extends BaseError { + constructor(message?: string, source?: string) { + super("[Note Processing Error]", message, source); + } +} + +type ProcessNoteResult = { + noteContent: { noteId: number; noteContent: string }; + metadata: Metadata; +}; + +export function processNote( + content: string, +): Result<ProcessNoteResult, ProcessNotesError> { + try { + const pageContent = content; + const noteId = new Date().getTime(); + + const metadata = { + baseUrl: `https://supermemory.ai/note/${noteId}`, + description: `Note created at ${new Date().toLocaleString()}`, + image: "https://supermemory.ai/logo.png", + title: `${pageContent.slice(0, 20)} ${pageContent.length > 20 ? "..." : ""}`, + }; + + const noteContent = { noteId: noteId, noteContent: pageContent }; + return Ok({ noteContent, metadata }); + } catch (e) { + console.error("[Note Processing Error]", e); + return Err(new ProcessNotesError((e as Error).message, "processNote")); + } +} diff --git a/apps/cf-ai-backend/src/queueConsumer/helpers/processPage.ts b/apps/cf-ai-backend/src/queueConsumer/helpers/processPage.ts new file mode 100644 index 00000000..9a50d701 --- /dev/null +++ b/apps/cf-ai-backend/src/queueConsumer/helpers/processPage.ts @@ -0,0 +1,43 @@ +import { Result, Ok, Err, isErr } from "../../errors/results"; +import { BaseError } from "../../errors/baseError"; +import { getMetaData, Metadata } from "../utils/get-metadata"; + +class ProcessPageError extends BaseError { + constructor(message?: string, source?: string) { + super("[Page Proceessing Error]", message, source); + } +} + +type PageProcessResult = { pageContent: string; metadata: Metadata }; + +export async function processPage(input: { + url: string; + securityKey: string; +}): Promise<Result<PageProcessResult, ProcessPageError>> { + try { + const response = await fetch("https://md.dhr.wtf/?url=" + input.url, { + headers: { + Authorization: "Bearer " + input.securityKey, + }, + }); + const pageContent = await response.text(); + if (!pageContent) { + return Err( + new ProcessPageError( + "Failed to get response form markdowner", + "processPage", + ), + ); + } + const metadataResult = await getMetaData(input.url); + if (isErr(metadataResult)) { + throw metadataResult.error; + } + const metadata = metadataResult.value; + console.log("[this is the metadata]", metadata); + return Ok({ pageContent, metadata }); + } catch (e) { + console.error("[Page Processing Error]", e); + return Err(new ProcessPageError((e as Error).message, "processPage")); + } +} diff --git a/apps/cf-ai-backend/src/queueConsumer/helpers/processTweet.ts b/apps/cf-ai-backend/src/queueConsumer/helpers/processTweet.ts new file mode 100644 index 00000000..8d83f2dc --- /dev/null +++ b/apps/cf-ai-backend/src/queueConsumer/helpers/processTweet.ts @@ -0,0 +1,88 @@ +import { Tweet } from "react-tweet/api"; +import { Result, Ok, Err, isErr } from "../../errors/results"; +import { BaseError } from "../../errors/baseError"; +import { getMetaData, Metadata } from "../utils/get-metadata"; +import { tweetToMd } from "@repo/shared-types/utils"; // can I do this? +import { Env } from "../../types"; + +class ProcessTweetError extends BaseError { + constructor(message?: string, source?: string) { + super("[Tweet Proceessing Error]", message, source); + } +} + +type GetTweetResult = Tweet; + +export const getTweetData = async ( + tweetID: string, +): Promise<Result<GetTweetResult, ProcessTweetError>> => { + try { + console.log("is fetch defined here?"); + const url = `https://cdn.syndication.twimg.com/tweet-result?id=${tweetID}&lang=en&features=tfw_timeline_list%3A%3Btfw_follower_count_sunset%3Atrue%3Btfw_tweet_edit_backend%3Aon%3Btfw_refsrc_session%3Aon%3Btfw_fosnr_soft_interventions_enabled%3Aon%3Btfw_show_birdwatch_pivots_enabled%3Aon%3Btfw_show_business_verified_badge%3Aon%3Btfw_duplicate_scribes_to_settings%3Aon%3Btfw_use_profile_image_shape_enabled%3Aon%3Btfw_show_blue_verified_badge%3Aon%3Btfw_legacy_timeline_sunset%3Atrue%3Btfw_show_gov_verified_badge%3Aon%3Btfw_show_business_affiliate_badge%3Aon%3Btfw_tweet_edit_frontend%3Aon&token=4c2mmul6mnh`; + + const resp = await fetch(url, { + headers: { + "User-Agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + Accept: "application/json", + "Accept-Language": "en-US,en;q=0.5", + "Accept-Encoding": "gzip, deflate, br", + Connection: "keep-alive", + "Upgrade-Insecure-Requests": "1", + "Cache-Control": "max-age=0", + TE: "Trailers", + }, + }); + console.log(resp.status); + + const data = (await resp.json()) as Tweet; + + return Ok(data); + } catch (e) { + console.error("[Tweet Proceessing Error]", e); + return Err(new ProcessTweetError(e, "getTweetData")); + } +}; + +export const getThreadData = async (input: { + tweetUrl: string; + env: Env; +}): Promise<Result<any, ProcessTweetError>> => { + try { + // const threadRequest = await fetch(input.cf_thread_endpoint, { + // method: "POST", + // headers: { + // "Content-Type": "application/json", + // Authorization: input.authKey, + // }, + // body: JSON.stringify({ url: input.tweetUrl }), + // }); + // if (threadRequest.status !== 200) { + // console.log(await threadRequest.text()); + // console.log(input.tweetUrl); + // return Err( + // new ProcessTweetError( + // `Failed to fetch the thread: ${input.tweetUrl}, Reason: ${threadRequest.statusText}`, + // "getThreadData", + // ), + // ); + // } + //@ts-ignore + const thread = await input.env.THREAD.processTweets(input.tweetUrl); + console.log("[thread response]", thread); + + if (!thread.length) { + console.log("Thread is an empty array"); + return Err( + new ProcessTweetError( + "[THREAD FETCHING SERVICE] Got no content form thread worker", + "getThreadData", + ), + ); + } + return Ok(thread); + } catch (e) { + console.error("[Thread Processing Error]", e); + return Err(new ProcessTweetError((e as Error).message, "getThreadData")); + } +}; diff --git a/apps/cf-ai-backend/src/queueConsumer/index.ts b/apps/cf-ai-backend/src/queueConsumer/index.ts new file mode 100644 index 00000000..393f1fbf --- /dev/null +++ b/apps/cf-ai-backend/src/queueConsumer/index.ts @@ -0,0 +1,372 @@ +import { Env, PageOrNoteChunks, TweetChunks, vectorObj } from "../types"; +import { typeDecider } from "./utils/typeDecider"; +import { isErr, wrap } from "../errors/results"; +import { processNote } from "./helpers/processNotes"; +import { processPage } from "./helpers/processPage"; +import { getThreadData, getTweetData } from "./helpers/processTweet"; +import { tweetToMd } from "@repo/shared-types/utils"; +import { chunkNote, chunkPage } from "./chunkers/chunkPageOrNotes"; +import { chunkThread } from "./chunkers/chunkTweet"; +import { batchCreateChunksAndEmbeddings, initQuery } from "../helper"; +import { z } from "zod"; +import { Metadata } from "./utils/get-metadata"; +import { BaseError } from "../errors/baseError"; +import { database } from "../db"; +import { + storedContent, + space, + contentToSpace, + users, + jobs, + Job, +} from "@repo/db/schema"; +import { and, eq, inArray, sql } from "drizzle-orm"; + +class VectorInsertError extends BaseError { + constructor(message?: string, source?: string) { + super("[Vector Insert Error]", message, source); + } +} +const vectorErrorFactory = (err: Error) => new VectorInsertError(err.message); + +class D1InsertError extends BaseError { + constructor(message?: string, source?: string) { + super("[D1 Insert Error]", message, source); + } +} + +const d1ErrorFactory = (err: Error, source: string) => + new D1InsertError(err.message, source); + +const calculateExponentialBackoff = ( + attempts: number, + baseDelaySeconds: number, +) => { + return baseDelaySeconds ** attempts; +}; + +const BASE_DELAY_SECONDS = 5; +export async function queue( + batch: MessageBatch<{ + content: string; + space: Array<number>; + user: string; + type: string; + }>, + env: Env, +): Promise<void> { + const db = database(env); + console.log(env.CF_ACCOUNT_ID, env.CF_KV_AUTH_TOKEN); + for (let message of batch.messages) { + console.log(env.CF_ACCOUNT_ID, env.CF_KV_AUTH_TOKEN); + console.log("is thie even running?", message.body); + const body = message.body; + + const type = body.type; + const userExists = await wrap( + db.select().from(users).where(eq(users.id, body.user)).limit(1), + d1ErrorFactory, + "Error when trying to verify user", + ); + + if (isErr(userExists)) { + throw userExists.error; + } + + //check if this is a retry job.. by checking if the combination of the userId and the url already exists on the queue + let jobId; + const existingJob = await wrap( + db + .select() + .from(jobs) + .where( + and( + eq(jobs.userId, userExists.value[0].id), + eq(jobs.url, body.content), + ), + ) + .limit(1), + d1ErrorFactory, + "Error when checking for existing job", + ); + + if (isErr(existingJob)) { + throw existingJob.error; + } + + if (existingJob.value.length > 0) { + jobId = existingJob.value[0].id; + await wrap( + db + .update(jobs) + .set({ + attempts: existingJob.value[0].attempts + 1, + updatedAt: new Date(), + status: "Processing", + }) + .where(eq(jobs.id, jobId)), + d1ErrorFactory, + "Error when updating job attempts", + ); + } else { + const job = await wrap( + db + .insert(jobs) + .values({ + userId: userExists.value[0].id as string, + url: body.content, + status: "Processing", + attempts: 1, + createdAt: new Date(), + updatedAt: new Date(), + }) + .returning({ jobId: jobs.id }), + d1ErrorFactory, + "Error When inserting into jobs table", + ); + if (isErr(job)) { + throw job.error; + } + jobId = job.value[0].jobId; + } + + let pageContent: string; + let vectorData: string; + let metadata: Metadata; + let storeToSpaces = body.space; + let chunks: TweetChunks | PageOrNoteChunks; + let noteId = 0; + switch (type) { + case "note": { + console.log("note hit"); + const note = processNote(body.content); + if (isErr(note)) { + throw note.error; + } + pageContent = note.value.noteContent.noteContent; + noteId = note.value.noteContent.noteId; + metadata = note.value.metadata; + vectorData = pageContent; + chunks = chunkNote(pageContent); + break; + } + case "page": { + console.log("page hit"); + const page = await processPage({ + url: body.content, + securityKey: env.MD_SEC_KEY, + }); + if (isErr(page)) { + console.log("there is a page error here"); + throw page.error; + } + pageContent = page.value.pageContent; + metadata = page.value.metadata; + vectorData = pageContent; + chunks = chunkPage(pageContent); + break; + } + + case "tweet": { + console.log("tweet hit"); + const tweet = await getTweetData(body.content.split("/").pop()); + console.log(env.THREAD_CF_WORKER, env.THREAD_CF_AUTH); + const thread = await getThreadData({ + tweetUrl: body.content, + env: env, + }); + console.log("[This is the thread]", thread); + if (isErr(tweet)) { + throw tweet.error; + } + pageContent = tweetToMd(tweet.value); + console.log(pageContent); + metadata = { + baseUrl: body.content, + description: tweet.value.text.slice(0, 200), + image: tweet.value.user.profile_image_url_https, + title: `Tweet by ${tweet.value.user.name}`, + }; + if (isErr(thread)) { + console.log("Thread worker is down!"); + vectorData = JSON.stringify(pageContent); + console.error(thread.error); + } else { + console.log("thread worker is fine"); + vectorData = thread.value; + } + chunks = chunkThread(vectorData); + break; + } + } + + //add to mem0, abstract + + // const mem0Response = fetch('https://api.mem0.ai/v1/memories/', { + // method: 'POST', + // headers: { + // 'Content-Type': 'application/json', + // Authorization: `Token ${process.env.MEM0_API_KEY}`, + // }, + // body: JSON.stringify({ + // messages: [ + // { + // role: 'user', + // content: query, + // }, + // ], + // user_id: user?.user?.email, + // }), + // }); + + // see what's up with the storedToSpaces in this block + const { store } = await initQuery(env); + + type body = z.infer<typeof vectorObj>; + + const Chunkbody: body = { + pageContent: pageContent, + spaces: storeToSpaces.map((spaceId) => spaceId.toString()), + user: body.user, + type: type, + url: metadata.baseUrl, + description: metadata.description, + title: metadata.description, + }; + + try { + const vectorResult = await wrap( + batchCreateChunksAndEmbeddings({ + store: store, + body: Chunkbody, + chunks: chunks, + env: env, + }), + vectorErrorFactory, + "Error when Inserting into vector database", + ); + + if (isErr(vectorResult)) { + await db + .update(jobs) + .set({ error: vectorResult.error.message, status: "error" }) + .where(eq(jobs.id, jobId)); + message.retry({ + delaySeconds: calculateExponentialBackoff( + message.attempts, + BASE_DELAY_SECONDS, + ), + }); + throw vectorResult.error; + } + + const saveToDbUrl = + (metadata.baseUrl.split("#supermemory-user-")[0] ?? metadata.baseUrl) + + "#supermemory-user-" + + body.user; + let contentId: number; + + const insertResponse = await wrap( + db + .insert(storedContent) + .values({ + content: pageContent as string, + title: metadata.title, + description: metadata.description, + url: saveToDbUrl, + baseUrl: saveToDbUrl, + image: metadata.image, + savedAt: new Date(), + userId: body.user, + type: type, + noteId: noteId, + }) + .returning({ id: storedContent.id }), + d1ErrorFactory, + "Error when inserting into storedContent", + ); + + if (isErr(insertResponse)) { + await db + .update(jobs) + .set({ error: insertResponse.error.message, status: "error" }) + .where(eq(jobs.id, jobId)); + message.retry({ + delaySeconds: calculateExponentialBackoff( + message.attempts, + BASE_DELAY_SECONDS, + ), + }); + throw insertResponse.error; + } + console.log(JSON.stringify(insertResponse)); + contentId = insertResponse[0]?.id; + console.log("this is the content Id", contentId); + if (storeToSpaces.length > 0) { + // Adding the many-to-many relationship between content and spaces + const spaceData = await wrap( + db + .select() + .from(space) + .where( + and(inArray(space.id, storeToSpaces), eq(space.user, body.user)), + ) + .all(), + d1ErrorFactory, + "Error when getting data from spaces", + ); + + if (isErr(spaceData)) { + throw spaceData.error; + } + try { + await Promise.all( + spaceData.value.map(async (s) => { + try { + await db + .insert(contentToSpace) + .values({ contentId: contentId, spaceId: s.id }); + + await db.update(space).set({ numItems: s.numItems + 1 }); + } catch (e) { + console.error(`Error updating space ${s.id}:`, e); + throw e; + } + }), + ); + } catch (e) { + console.error("Error in updateSpacesWithContent:", e); + throw new Error(`Failed to update spaces: ${e.message}`); + } + } + } catch (e) { + console.error("Error in simulated transaction", e.message); + + message.retry({ + delaySeconds: calculateExponentialBackoff( + message.attempts, + BASE_DELAY_SECONDS, + ), + }); + throw new D1InsertError( + "Error when inserting into d1", + "D1 stuff after the vectorize", + ); + } + + // After the d1 and vectories suceeds then finally update the jobs table to indicate that the job has completed + + await db + .update(jobs) + .set({ status: "Processed" }) + .where(eq(jobs.id, jobId)); + + return; + } +} + +/* +To do: +Figure out rate limits!! + +*/ diff --git a/apps/cf-ai-backend/src/queueConsumer/utils/get-metadata.ts b/apps/cf-ai-backend/src/queueConsumer/utils/get-metadata.ts new file mode 100644 index 00000000..95916506 --- /dev/null +++ b/apps/cf-ai-backend/src/queueConsumer/utils/get-metadata.ts @@ -0,0 +1,57 @@ +import * as cheerio from "cheerio"; +import { Result, Ok, Err } from "../../errors/results"; +import { BaseError } from "../../errors/baseError"; + +class GetMetadataError extends BaseError { + constructor(message?: string, source?: string) { + super("[Fetch Metadata Error]", message, source); + } +} +export type Metadata = { + title: string; + description: string; + image: string; + baseUrl: string; +}; +// TODO: THIS SHOULD PROBABLY ALSO FETCH THE OG-IMAGE +export async function getMetaData( + url: string, +): Promise<Result<Metadata, GetMetadataError>> { + try { + const response = await fetch(url); + const html = await response.text(); + + const $ = cheerio.load(html); + + // Extract the base URL + const baseUrl = url; + + // Extract title + const title = $("title").text().trim(); + + const description = $("meta[name=description]").attr("content") ?? ""; + + const _favicon = + $("link[rel=icon]").attr("href") ?? "https://supermemory.dhr.wtf/web.svg"; + + let favicon = + _favicon.trim().length > 0 + ? _favicon.trim() + : "https://supermemory.dhr.wtf/web.svg"; + if (favicon.startsWith("/")) { + favicon = baseUrl + favicon; + } else if (favicon.startsWith("./")) { + favicon = baseUrl + favicon.slice(1); + } + + return Ok({ + title, + description, + image: favicon, + baseUrl, + }); + } catch (e) { + console.error("[Metadata Fetch Error]", e); + return Err(new GetMetadataError((e as Error).message, "getMetaData")); + } +} diff --git a/apps/cf-ai-backend/src/queueConsumer/utils/typeDecider.ts b/apps/cf-ai-backend/src/queueConsumer/utils/typeDecider.ts new file mode 100644 index 00000000..037ab40c --- /dev/null +++ b/apps/cf-ai-backend/src/queueConsumer/utils/typeDecider.ts @@ -0,0 +1,34 @@ +import { Result, Ok, Err } from "../../errors/results"; +import { BaseError } from "../../errors/baseError"; + +export type contentType = "page" | "tweet" | "note"; + +class GetTypeError extends BaseError { + constructor(message?: string, source?: string) { + super("[Decide Type Error]", message, source); + } +} +export const typeDecider = ( + content: string, +): Result<contentType, GetTypeError> => { + try { + // if the content is a URL, then it's a page. if its a URL with https://x.com/user/status/123, then it's a tweet. else, it's a note. + // do strict checking with regex + if ( + content.match(/https?:\/\/(x\.com|twitter\.com)\/[\w]+\/[\w]+\/[\d]+/) + ) { + return Ok("tweet"); + } else if ( + content.match( + /^(https?:\/\/)?(www\.)?[a-z0-9]+([-.]{1}[a-z0-9]+)*\.[a-z]{2,5}(\/.*)?$/i, + ) + ) { + return Ok("page"); + } else { + return Ok("note"); + } + } catch (e) { + console.error("[Decide Type Error]", e); + return Err(new GetTypeError((e as Error).message, "typeDecider")); + } +}; diff --git a/apps/cf-ai-backend/src/types.ts b/apps/cf-ai-backend/src/types.ts index 5ef81f20..e4f13f1b 100644 --- a/apps/cf-ai-backend/src/types.ts +++ b/apps/cf-ai-backend/src/types.ts @@ -1,6 +1,6 @@ import { sourcesZod } from "@repo/shared-types"; import { z } from "zod"; -import { ThreadTweetData } from "./utils/chunkTweet"; +import { ThreadTweetData } from "./queueConsumer/chunkers/chunkTweet"; export type Env = { VECTORIZE_INDEX: VectorizeIndex; @@ -11,13 +11,26 @@ export type Env = { CF_KV_AUTH_TOKEN: string; KV_NAMESPACE_ID: string; CF_ACCOUNT_ID: string; + DATABASE: D1Database; MY_QUEUE: Queue<TweetData[]>; KV: KVNamespace; + EMBEDCHUNKS_QUEUE: Queue<JobData>; MYBROWSER: unknown; ANTHROPIC_API_KEY: string; + THREAD_CF_AUTH: string; + THREAD: { processTweets: () => Promise<Array<any>> }; + THREAD_CF_WORKER: string; NODE_ENV: string; + MD_SEC_KEY: string; }; +export interface JobData { + content: string; + space: Array<number>; + user: string; + type: string +} + export interface TweetData { tweetText: string; postUrl: string; @@ -80,3 +93,8 @@ export const vectorObj = z.object({ user: z.string(), type: z.string().optional().default("page"), }); +export const vectorBody = z.object({ + spaces: z.array(z.string()).optional(), + url: z.string(), + user: z.string(), +}); diff --git a/apps/cf-ai-backend/src/utils/chunkTweet.ts b/apps/cf-ai-backend/src/utils/chunkTweet.ts deleted file mode 100644 index 0d0bc896..00000000 --- a/apps/cf-ai-backend/src/utils/chunkTweet.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { TweetChunks } from "../types"; -import chunkText from "./chonker"; -import { getRawTweet } from "@repo/shared-types/utils"; - -interface Tweet { - id: string; - text: string; - links: Array<string>; - images: Array<string>; - videos: Array<string>; -} -interface Metadata { - tweetId: string; - tweetLinks: any[]; - tweetVids: any[]; - tweetImages: any[]; -} - -export interface ThreadTweetData { - chunkedTweet: string[]; - metadata: Metadata; -} - -export function chunkThread(threadText: string): TweetChunks { - let thread = threadText; - - try { - thread = JSON.parse(threadText); - } catch (e) { - console.log("error: thread is not json.", e); - } - - if (typeof threadText == "string") { - console.log("DA WORKER FAILED DO SOMEHTING FIX DA WROKER", thread); - const rawTweet = getRawTweet(thread); - console.log(rawTweet); - const parsedTweet: any = JSON.parse(rawTweet); - - const chunkedTweet = chunkText(parsedTweet.text, 1536); - const metadata: Metadata = { - tweetId: parsedTweet.id_str, - tweetLinks: parsedTweet.entities?.urls.map( - (url: any) => url.expanded_url, - ), - tweetVids: - parsedTweet.extended_entities?.media - .filter((media: any) => media.type === "video") - .map((media: any) => media.video_info!.variants[0].url) || [], - tweetImages: - parsedTweet.extended_entities?.media - .filter((media: any) => media.type === "photo") - .map((media: any) => media.media_url_https!) || [], - }; - - const chunks = [{ chunkedTweet: chunkedTweet, metadata }]; - - return { type: "tweet", chunks }; - } else { - console.log("thread in else statement", JSON.stringify(thread)); - const chunkedTweets = (thread as any).map((tweet: Tweet) => { - const chunkedTweet = chunkText(tweet.text, 1536); - - const metadata = { - tweetId: tweet.id, - tweetLinks: tweet.links, - tweetVids: tweet.videos, - tweetImages: tweet.images, - }; - - return { chunkedTweet, metadata }; - }); - - return { type: "tweet", chunks: chunkedTweets }; - } -} diff --git a/apps/cf-ai-backend/wrangler.toml b/apps/cf-ai-backend/wrangler.toml index ea93fd63..0d7ede62 100644 --- a/apps/cf-ai-backend/wrangler.toml +++ b/apps/cf-ai-backend/wrangler.toml @@ -3,6 +3,13 @@ main = "src/index.ts" compatibility_date = "2024-02-23" node_compat = true +# tail_consumers = [{service = "new-cf-ai-backend-tail"}] + +[[services]] +binding = "THREAD" +service = "tweet-thread" +entrypoint = "ThreadWorker" + # [env.preview] [[vectorize]] binding = "VECTORIZE_INDEX" @@ -29,3 +36,19 @@ preview_id = "c58b6202814f4224acea97627d0c18aa" [placement] mode = "smart" + +[[queues.producers]] + queue = "prod-embedchunks-queue" + binding ="EMBEDCHUNKS_QUEUE" + +[[queues.consumers]] + queue = "prod-embedchunks-queue" + max_batch_size = 100 + max_retries = 3 + dead_letter_queue = "prod-embedchunks-dlq" + + +[[d1_databases]] +binding = "DATABASE" +database_name = "prod-d1-supermemory" +database_id = "f527a727-c472-41d4-8eaf-3d7ba0f2f395"
\ No newline at end of file diff --git a/apps/extension/content/content.tsx b/apps/extension/content/content.tsx index e97c06e6..1a80774c 100644 --- a/apps/extension/content/content.tsx +++ b/apps/extension/content/content.tsx @@ -4,9 +4,6 @@ import("./base.css"); setTimeout(initial, 1000); -const TAILWIND_URL = - "https://cdn.jsdelivr.net/npm/tailwindcss@^2.0/dist/tailwind.min.css"; - const appendTailwindStyleData = (shadowRoot: ShadowRoot) => { const styleSheet = document.createElement("style"); @@ -20,14 +17,6 @@ const appendTailwindStyleData = (shadowRoot: ShadowRoot) => { }); }; -const appendTailwindStyleLink = (shadowRoot: ShadowRoot) => { - // Import Tailwind CSS and inject it into the shadow DOM - const styleSheet = document.createElement("link"); - styleSheet.rel = "stylesheet"; - styleSheet.href = TAILWIND_URL; - shadowRoot.appendChild(styleSheet); -}; - function initial() { // Create a new div element to host the shadow root. // Styles for this div is in `content/content.css` diff --git a/apps/web/app/(auth)/onboarding/page.tsx b/apps/web/app/(auth)/onboarding/page.tsx index 93e07e73..9a6ac481 100644 --- a/apps/web/app/(auth)/onboarding/page.tsx +++ b/apps/web/app/(auth)/onboarding/page.tsx @@ -294,7 +294,7 @@ function StepThree({ currStep }: { currStep: number }) { }); if (cont.success) { - toast.success("Memory created", { + toast.success("Memory queued", { richColors: true, }); } else { diff --git a/apps/web/app/(dash)/(memories)/content.tsx b/apps/web/app/(dash)/(memories)/content.tsx index 179b4ef2..6e2659cb 100644 --- a/apps/web/app/(dash)/(memories)/content.tsx +++ b/apps/web/app/(dash)/(memories)/content.tsx @@ -1,6 +1,6 @@ "use client"; -import { Content, StoredSpace } from "@/server/db/schema"; +import { Content, StoredSpace } from "@repo/db/schema"; import { MemoriesIcon, NextIcon, SearchIcon, UrlIcon } from "@repo/ui/icons"; import { ArrowLeftIcon, diff --git a/apps/web/app/(dash)/(memories)/space/[spaceid]/page.tsx b/apps/web/app/(dash)/(memories)/space/[spaceid]/page.tsx index ed1ea1cc..8ad9d9cc 100644 --- a/apps/web/app/(dash)/(memories)/space/[spaceid]/page.tsx +++ b/apps/web/app/(dash)/(memories)/space/[spaceid]/page.tsx @@ -3,7 +3,7 @@ import { redirect } from "next/navigation"; import MemoriesPage from "../../content"; import { db } from "@/server/db"; import { and, eq } from "drizzle-orm"; -import { spacesAccess } from "@/server/db/schema"; +import { spacesAccess } from "@repo/db/schema"; import { auth } from "@/server/auth"; async function Page({ params: { spaceid } }: { params: { spaceid: number } }) { diff --git a/apps/web/app/(dash)/dialogContentContainer.tsx b/apps/web/app/(dash)/dialogContentContainer.tsx index 4e8d81ef..1a11ac6d 100644 --- a/apps/web/app/(dash)/dialogContentContainer.tsx +++ b/apps/web/app/(dash)/dialogContentContainer.tsx @@ -1,4 +1,4 @@ -import { StoredSpace } from "@/server/db/schema"; +import { StoredSpace } from "@repo/db/schema"; import { useEffect, useMemo, useState } from "react"; import { createMemory, createSpace } from "../actions/doers"; import ComboboxWithCreate from "@repo/ui/shadcn/combobox"; @@ -76,7 +76,7 @@ export function DialogContentContainer({ setSelectedSpaces([]); if (cont.success) { - toast.success("Memory created", { + toast.success("Memory queued", { richColors: true, }); } else { diff --git a/apps/web/app/(dash)/menu.tsx b/apps/web/app/(dash)/menu.tsx index 7eac5a56..1c0ce1ee 100644 --- a/apps/web/app/(dash)/menu.tsx +++ b/apps/web/app/(dash)/menu.tsx @@ -28,7 +28,7 @@ import { getSpaces } from "../actions/fetchers"; import { HomeIcon } from "@heroicons/react/24/solid"; import { createMemory, createSpace } from "../actions/doers"; import ComboboxWithCreate from "@repo/ui/shadcn/combobox"; -import { StoredSpace } from "@/server/db/schema"; +import { StoredSpace } from "@repo/db/schema"; import useMeasure from "react-use-measure"; import { useKeyPress } from "@/lib/useKeyPress"; @@ -121,9 +121,14 @@ function Menu() { setContent(""); setSelectedSpaces([]); if (cont.success) { + toast.success("Memory queued", { + richColors: true, + }); + } else { + toast.error(`Memory creation failed: ${cont.error}`); + throw new Error(`Memory creation failed: ${cont.error}`); return cont; } - throw new Error(`Memory creation failed: ${cont.error}`); }; return ( @@ -275,10 +280,7 @@ function Menu() { ]); setSelectedSpaces((prev) => [...prev, creationTask.data!]); } else { - toast.error( - "Space creation failed: " + creationTask.error ?? - "Unknown error", - ); + toast.error("Space creation failed: " + creationTask.error); } }} placeholder="Select or create a new space." diff --git a/apps/web/app/actions/doers.ts b/apps/web/app/actions/doers.ts index 9750a705..c11d5f0a 100644 --- a/apps/web/app/actions/doers.ts +++ b/apps/web/app/actions/doers.ts @@ -11,13 +11,13 @@ import { spacesAccess, storedContent, users, -} from "../../server/db/schema"; +} from "@repo/db/schema"; import { ServerActionReturnType } from "./types"; import { auth } from "../../server/auth"; import { Tweet } from "react-tweet/api"; -import { getMetaData } from "@/lib/get-metadata"; +// import { getMetaData } from "@/lib/get-metadata"; import { and, eq, inArray, sql } from "drizzle-orm"; -import { LIMITS } from "@/lib/constants"; +import { LIMITS } from "@repo/shared-types"; import { ChatHistory } from "@repo/shared-types"; import { decipher } from "@/server/encrypt"; import { redirect } from "next/navigation"; @@ -104,25 +104,6 @@ const typeDecider = (content: string): "page" | "tweet" | "note" => { } }; -export const limit = async ( - userId: string, - type = "page", - items: number = 1, -) => { - const countResult = await db - .select({ - count: sql<number>`count(*)`.mapWith(Number), - }) - .from(storedContent) - .where(and(eq(storedContent.userId, userId), eq(storedContent.type, type))); - - const currentCount = countResult[0]?.count || 0; - const totalLimit = LIMITS[type as keyof typeof LIMITS]; - const remainingLimit = totalLimit - currentCount; - - return items <= remainingLimit; -}; - export const addUserToSpace = async (userEmail: string, spaceId: number) => { const data = await auth(); @@ -208,122 +189,15 @@ export const createMemory = async (input: { return { error: "Not authenticated", success: false }; } - const type = typeDecider(input.content); - - let pageContent = input.content; - let metadata: Awaited<ReturnType<typeof getMetaData>>; - let vectorData: string; - - if (!(await limit(data.user.id, type))) { - return { - success: false, - data: 0, - error: `You have exceeded the limit of ${LIMITS[type as keyof typeof LIMITS]} ${type}s.`, - }; - } - - let noteId = 0; - - if (type === "page") { - const response = await fetch("https://md.dhr.wtf/?url=" + input.content, { - headers: { - Authorization: "Bearer " + process.env.BACKEND_SECURITY_KEY, - }, - }); - pageContent = await response.text(); - vectorData = pageContent; - try { - metadata = await getMetaData(input.content); - } catch (e) { - return { - success: false, - error: "Failed to fetch metadata for the page. Please try again later.", - }; - } - } else if (type === "tweet") { - //Request the worker for the entire thread - - let thread: string; - let errorOccurred: boolean = false; - - try { - const cf_thread_endpoint = process.env.THREAD_CF_WORKER; - const authKey = process.env.THREAD_CF_AUTH; - const threadRequest = await fetch(cf_thread_endpoint, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: authKey, - }, - body: JSON.stringify({ url: input.content }), - }); - - if (threadRequest.status !== 200) { - throw new Error( - `Failed to fetch the thread: ${input.content}, Reason: ${threadRequest.statusText}`, - ); - } - - thread = await threadRequest.text(); - if (thread.trim().length === 2) { - console.log("Thread is an empty array"); - throw new Error( - "[THREAD FETCHING SERVICE] Got no content form thread worker", - ); - } - } catch (e) { - console.log("[THREAD FETCHING SERVICE] Failed to fetch the thread", e); - errorOccurred = true; - } - - const tweet = await getTweetData(input.content.split("/").pop() as string); - - pageContent = tweetToMd(tweet); - console.log("THis ishte page content!!", pageContent); - //@ts-ignore - vectorData = errorOccurred ? JSON.stringify(pageContent) : thread; - metadata = { - baseUrl: input.content, - description: tweet.text.slice(0, 200), - image: tweet.user.profile_image_url_https, - title: `Tweet by ${tweet.user.name}`, - }; - } else if (type === "note") { - pageContent = input.content; - vectorData = pageContent; - noteId = new Date().getTime(); - metadata = { - baseUrl: `https://supermemory.ai/note/${noteId}`, - description: `Note created at ${new Date().toLocaleString()}`, - image: "https://supermemory.ai/logo.png", - title: `${pageContent.slice(0, 20)} ${pageContent.length > 20 ? "..." : ""}`, - }; - } else { - return { - success: false, - data: 0, - error: "Invalid type", - }; - } - - let storeToSpaces = input.spaces; - - if (!storeToSpaces) { - storeToSpaces = []; - } - - const vectorSaveResponse = await fetch( + // make the backend reqeust for the queue here + const vectorSaveResponses = await fetch( `${process.env.BACKEND_BASE_URL}/api/add`, { method: "POST", body: JSON.stringify({ - pageContent: vectorData, - title: metadata.title, - description: metadata.description, - url: metadata.baseUrl, - spaces: storeToSpaces.map((spaceId) => spaceId.toString()), + url: input.content, + spaces: input.spaces, user: data.user.id, - type, }), headers: { "Content-Type": "application/json", @@ -331,126 +205,262 @@ export const createMemory = async (input: { }, }, ); - - if (!vectorSaveResponse.ok) { - const errorData = await vectorSaveResponse.text(); - console.error(errorData); - return { - success: false, - data: 0, - error: `Failed to save to vector store. Backend returned error: ${errorData}`, - }; - } - - let contentId: number; - - const response = (await vectorSaveResponse.json()) as { + const response = (await vectorSaveResponses.json()) as { status: string; - chunkedInput: string; message?: string; }; - try { - if (response.status !== "ok") { - if (response.status === "error") { - return { - success: false, - data: 0, - error: response.message, - }; - } else { - return { - success: false, - data: 0, - error: `Failed to save to vector store. Backend returned error: ${response.message}`, - }; - } - } - } catch (e) { + if (response.status !== "ok") { return { success: false, data: 0, - error: `Failed to save to vector store. Backend returned error: ${e}`, + error: response.message, }; } - const saveToDbUrl = - (metadata.baseUrl.split("#supermemory-user-")[0] ?? metadata.baseUrl) + - "#supermemory-user-" + - data.user.id; - - // Insert into database - try { - const insertResponse = await db - .insert(storedContent) - .values({ - content: pageContent, - title: metadata.title, - description: metadata.description, - url: saveToDbUrl, - baseUrl: saveToDbUrl, - image: metadata.image, - savedAt: new Date(), - userId: data.user.id, - type, - noteId, - }) - .returning({ id: storedContent.id }); - revalidatePath("/memories"); - revalidatePath("/home"); - - if (!insertResponse[0]?.id) { - return { - success: false, - data: 0, - error: "Something went wrong while saving the document to the database", - }; - } - - contentId = insertResponse[0]?.id; - } catch (e) { - const error = e as Error; - console.log("Error: ", error.message); - - if ( - error.message.includes( - "D1_ERROR: UNIQUE constraint failed: storedContent.baseUrl", - ) - ) { - return { - success: false, - data: 0, - error: "Content already exists", - }; - } - - return { - success: false, - data: 0, - error: "Failed to save to database with error: " + error.message, - }; - } - - if (storeToSpaces.length > 0) { - // Adding the many-to-many relationship between content and spaces - const spaceData = await db - .select() - .from(space) - .where( - and(inArray(space.id, storeToSpaces), eq(space.user, data.user.id)), - ) - .all(); - - await Promise.all( - spaceData.map(async (s) => { - await db - .insert(contentToSpace) - .values({ contentId: contentId, spaceId: s.id }); - - await db.update(space).set({ numItems: s.numItems + 1 }); - }), - ); - } + // const type = typeDecider(input.content); + + // let pageContent = input.content; + // let metadata: Awaited<ReturnType<typeof getMetaData>>; + // let vectorData: string; + + // if (!(await limit(data.user.id, type))) { + // return { + // success: false, + // data: 0, + // error: `You have exceeded the limit of ${LIMITS[type as keyof typeof LIMITS]} ${type}s.`, + // }; + // } --> How would this fit in the backend??? + + // let noteId = 0; + + // if (type === "page") { + // const response = await fetch("https://md.dhr.wtf/?url=" + input.content, { + // headers: { + // Authorization: "Bearer " + process.env.BACKEND_SECURITY_KEY, + // }, + // }); + // pageContent = await response.text(); + // vectorData = pageContent; + // try { + // metadata = await getMetaData(input.content); + // } catch (e) { + // return { + // success: false, + // error: "Failed to fetch metadata for the page. Please try again later.", + // }; + // } + // } else if (type === "tweet") { + // //Request the worker for the entire thread + + // let thread: string; + // let errorOccurred: boolean = false; + + // try { + // const cf_thread_endpoint = process.env.THREAD_CF_WORKER; + // const authKey = process.env.THREAD_CF_AUTH; + // const threadRequest = await fetch(cf_thread_endpoint, { + // method: "POST", + // headers: { + // "Content-Type": "application/json", + // Authorization: authKey, + // }, + // body: JSON.stringify({ url: input.content }), + // }); + + // if (threadRequest.status !== 200) { + // throw new Error( + // `Failed to fetch the thread: ${input.content}, Reason: ${threadRequest.statusText}`, + // ); + // } + + // thread = await threadRequest.text(); + // if (thread.trim().length === 2) { + // console.log("Thread is an empty array"); + // throw new Error( + // "[THREAD FETCHING SERVICE] Got no content form thread worker", + // ); + // } + // } catch (e) { + // console.log("[THREAD FETCHING SERVICE] Failed to fetch the thread", e); + // errorOccurred = true; + // } + + // const tweet = await getTweetData(input.content.split("/").pop() as string); + + // pageContent = tweetToMd(tweet); + // console.log("THis ishte page content!!", pageContent); + // //@ts-ignore + // vectorData = errorOccurred ? JSON.stringify(pageContent) : thread; + // metadata = { + // baseUrl: input.content, + // description: tweet.text.slice(0, 200), + // image: tweet.user.profile_image_url_https, + // title: `Tweet by ${tweet.user.name}`, + // }; + // } else if (type === "note") { + // pageContent = input.content; + // vectorData = pageContent; + // noteId = new Date().getTime(); + // metadata = { + // baseUrl: `https://supermemory.ai/note/${noteId}`, + // description: `Note created at ${new Date().toLocaleString()}`, + // image: "https://supermemory.ai/logo.png", + // title: `${pageContent.slice(0, 20)} ${pageContent.length > 20 ? "..." : ""}`, + // }; + // } else { + // return { + // success: false, + // data: 0, + // error: "Invalid type", + // }; + // } + + // let storeToSpaces = input.spaces; + + // if (!storeToSpaces) { + // storeToSpaces = []; + // } + + // const vectorSaveResponse = await fetch( + // `${process.env.BACKEND_BASE_URL}/api/add`, + // { + // method: "POST", + // body: JSON.stringify({ + // pageContent: vectorData, + // title: metadata.title, + // description: metadata.description, + // url: metadata.baseUrl, + // spaces: storeToSpaces.map((spaceId) => spaceId.toString()), + // user: data.user.id, + // type, + // }), + // headers: { + // "Content-Type": "application/json", + // Authorization: "Bearer " + process.env.BACKEND_SECURITY_KEY, + // }, + // }, + // ); + + // if (!vectorSaveResponse.ok) { + // const errorData = await vectorSaveResponse.text(); + // console.error(errorData); + // return { + // success: false, + // data: 0, + // error: `Failed to save to vector store. Backend returned error: ${errorData}`, + // }; + // } + + // let contentId: number; + + // const response = (await vectorSaveResponse.json()) as { + // status: string; + // chunkedInput: string; + // message?: string; + // }; + + // try { + // if (response.status !== "ok") { + // if (response.status === "error") { + // return { + // success: false, + // data: 0, + // error: response.message, + // }; + // } else { + // return { + // success: false, + // data: 0, + // error: `Failed to save to vector store. Backend returned error: ${response.message}`, + // }; + // } + // } + // } catch (e) { + // return { + // success: false, + // data: 0, + // error: `Failed to save to vector store. Backend returned error: ${e}`, + // }; + // } + + // const saveToDbUrl = + // (metadata.baseUrl.split("#supermemory-user-")[0] ?? metadata.baseUrl) + + // "#supermemory-user-" + + // data.user.id; + + // // Insert into database + // try { + // const insertResponse = await db + // .insert(storedContent) + // .values({ + // content: pageContent, + // title: metadata.title, + // description: metadata.description, + // url: saveToDbUrl, + // baseUrl: saveToDbUrl, + // image: metadata.image, + // savedAt: new Date(), + // userId: data.user.id, + // type, + // noteId, + // }) + // .returning({ id: storedContent.id }); + // revalidatePath("/memories"); + // revalidatePath("/home"); + + // if (!insertResponse[0]?.id) { + // return { + // success: false, + // data: 0, + // error: "Something went wrong while saving the document to the database", + // }; + // } + + // contentId = insertResponse[0]?.id; + // } catch (e) { + // const error = e as Error; + // console.log("Error: ", error.message); + + // if ( + // error.message.includes( + // "D1_ERROR: UNIQUE constraint failed: storedContent.baseUrl", + // ) + // ) { + // return { + // success: false, + // data: 0, + // error: "Content already exists", + // }; + // } + + // return { + // success: false, + // data: 0, + // error: "Failed to save to database with error: " + error.message, + // }; + // } + + // if (storeToSpaces.length > 0) { + // // Adding the many-to-many relationship between content and spaces + // const spaceData = await db + // .select() + // .from(space) + // .where( + // and(inArray(space.id, storeToSpaces), eq(space.user, data.user.id)), + // ) + // .all(); + + // await Promise.all( + // spaceData.map(async (s) => { + // await db + // .insert(contentToSpace) + // .values({ contentId: contentId, spaceId: s.id }); + + // await db.update(space).set({ numItems: s.numItems + 1 }); + // }), + // ); + // } return { success: true, @@ -828,9 +838,9 @@ export async function getQuerySuggestions() { }; } - const fullQuery = content - .map((c) => `${c.title} \n\n${c.content}`) - .join(" "); + const fullQuery = ( + content?.map((c) => `${c.title} \n\n${c.content}`) ?? [] + ).join(" "); const suggestionsCall = (await env.AI.run( // @ts-ignore diff --git a/apps/web/app/actions/fetchers.ts b/apps/web/app/actions/fetchers.ts index 5f72089a..f00feb3c 100644 --- a/apps/web/app/actions/fetchers.ts +++ b/apps/web/app/actions/fetchers.ts @@ -15,7 +15,7 @@ import { StoredSpace, User, users, -} from "../../server/db/schema"; +} from "@repo/db/schema"; import { ServerActionReturnType } from "./types"; import { auth } from "../../server/auth"; import { ChatHistory, SourceZod } from "@repo/shared-types"; diff --git a/apps/web/app/api/chat/history/route.ts b/apps/web/app/api/chat/history/route.ts index 98b66064..197b8ee6 100644 --- a/apps/web/app/api/chat/history/route.ts +++ b/apps/web/app/api/chat/history/route.ts @@ -2,7 +2,7 @@ import { NextRequest } from "next/server"; import { ensureAuth } from "../../ensureAuth"; import { db } from "@/server/db"; import { eq } from "drizzle-orm"; -import { chatThreads } from "@/server/db/schema"; +import { chatThreads } from "@repo/db/schema"; export const runtime = "edge"; diff --git a/apps/web/app/api/chat/route.ts b/apps/web/app/api/chat/route.ts index a14c96df..78878e40 100644 --- a/apps/web/app/api/chat/route.ts +++ b/apps/web/app/api/chat/route.ts @@ -8,7 +8,7 @@ import { import { ensureAuth } from "../ensureAuth"; import { z } from "zod"; import { db } from "@/server/db"; -import { chatHistory as chatHistoryDb, chatThreads } from "@/server/db/schema"; +import { chatHistory as chatHistoryDb, chatThreads } from "@repo/db/schema"; import { and, eq, gt, sql } from "drizzle-orm"; import { join } from "path"; diff --git a/apps/web/app/api/ensureAuth.ts b/apps/web/app/api/ensureAuth.ts index 1fcd2914..92a5e3e8 100644 --- a/apps/web/app/api/ensureAuth.ts +++ b/apps/web/app/api/ensureAuth.ts @@ -1,6 +1,6 @@ import { NextRequest } from "next/server"; import { db } from "../../server/db"; -import { accounts, sessions, users } from "../../server/db/schema"; +import { accounts, sessions, users } from "@repo/db/schema"; import { eq } from "drizzle-orm"; export async function ensureAuth(req: NextRequest) { diff --git a/apps/web/app/api/getCount/route.ts b/apps/web/app/api/getCount/route.ts index f91b7b94..4fd77efd 100644 --- a/apps/web/app/api/getCount/route.ts +++ b/apps/web/app/api/getCount/route.ts @@ -1,6 +1,6 @@ import { db } from "@/server/db"; import { and, eq, ne, sql } from "drizzle-orm"; -import { sessions, storedContent, users } from "@/server/db/schema"; +import { sessions, storedContent, users } from "@repo/db/schema"; import { type NextRequest, NextResponse } from "next/server"; import { ensureAuth } from "../ensureAuth"; diff --git a/apps/web/app/api/me/route.ts b/apps/web/app/api/me/route.ts index ab408f3e..25aa27bc 100644 --- a/apps/web/app/api/me/route.ts +++ b/apps/web/app/api/me/route.ts @@ -1,6 +1,6 @@ import { db } from "@/server/db"; import { eq } from "drizzle-orm"; -import { sessions, users } from "@/server/db/schema"; +import { sessions, users } from "@repo/db/schema"; import { type NextRequest, NextResponse } from "next/server"; export const runtime = "edge"; diff --git a/apps/web/app/api/memories/route.ts b/apps/web/app/api/memories/route.ts index acb43b5d..0084524e 100644 --- a/apps/web/app/api/memories/route.ts +++ b/apps/web/app/api/memories/route.ts @@ -6,7 +6,7 @@ import { contentToSpace, storedContent, users, -} from "@/server/db/schema"; +} from "@repo/db/schema"; import { ensureAuth } from "../ensureAuth"; export const runtime = "edge"; diff --git a/apps/web/app/api/spaces/route.ts b/apps/web/app/api/spaces/route.ts index e85e07ed..27ff0dfb 100644 --- a/apps/web/app/api/spaces/route.ts +++ b/apps/web/app/api/spaces/route.ts @@ -1,5 +1,5 @@ import { db } from "@/server/db"; -import { space } from "@/server/db/schema"; +import { space } from "@repo/db/schema"; import { eq } from "drizzle-orm"; import { NextRequest, NextResponse } from "next/server"; import { ensureAuth } from "../ensureAuth"; diff --git a/apps/web/app/api/store/friend/route.ts b/apps/web/app/api/store/friend/route.ts deleted file mode 100644 index 554b1cee..00000000 --- a/apps/web/app/api/store/friend/route.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { type NextRequest } from "next/server"; -import { createMemoryFromAPI } from "../helper"; - -type FriendData = { - id: string; - created_at: string; - transcript: string; - structured: { - title: string; - overview: string; - action_items: [ - { - description: string; - }, - ]; - }; -}; - -export async function POST(req: NextRequest) { - const body: FriendData = await req.json(); - - const userId = new URL(req.url).searchParams.get("uid"); - - if (!userId) { - return new Response( - JSON.stringify({ status: 400, body: "Missing user ID" }), - ); - } - - await createMemoryFromAPI({ - data: { - title: "Friend: " + body.structured.title, - description: body.structured.overview, - pageContent: - body.transcript + "\n\n" + JSON.stringify(body.structured.action_items), - spaces: [], - type: "note", - url: "https://basedhardware.com", - }, - userId: userId, - }); - - return new Response(JSON.stringify({ status: 200, body: "success" })); -} diff --git a/apps/web/app/api/store/helper.ts b/apps/web/app/api/store/helper.ts index a2c04dc1..db13ca91 100644 --- a/apps/web/app/api/store/helper.ts +++ b/apps/web/app/api/store/helper.ts @@ -1,22 +1,22 @@ import { z } from "zod"; import { db } from "@/server/db"; -import { contentToSpace, space, storedContent } from "@/server/db/schema"; +import { contentToSpace, space, storedContent } from "@repo/db/schema"; import { and, eq, inArray } from "drizzle-orm"; -import { LIMITS } from "@/lib/constants"; -import { limit } from "@/app/actions/doers"; +// import { LIMITS } from "@repo/shared-types"; +// import { limit } from "@/app/actions/doers"; import { type AddFromAPIType } from "@repo/shared-types"; export const createMemoryFromAPI = async (input: { data: AddFromAPIType; userId: string; }) => { - if (!(await limit(input.userId, input.data.type))) { - return { - success: false, - data: 0, - error: `You have exceeded the limit of ${LIMITS[input.data.type as keyof typeof LIMITS]} ${input.data.type}s.`, - }; - } + // if (!(await limit(input.userId, input.data.type))) { + // return { + // success: false, + // data: 0, + // error: `You have exceeded the limit of ${LIMITS[input.data.type as keyof typeof LIMITS]} ${input.data.type}s.`, + // }; + // } const vectorSaveResponse = await fetch( `${process.env.BACKEND_BASE_URL}/api/add`, diff --git a/apps/web/app/api/telegram/route.ts b/apps/web/app/api/telegram/route.ts index 06499c7d..c629e409 100644 --- a/apps/web/app/api/telegram/route.ts +++ b/apps/web/app/api/telegram/route.ts @@ -1,5 +1,5 @@ import { db } from "@/server/db"; -import { storedContent, users } from "@/server/db/schema"; +import { storedContent, users } from "@repo/db/schema"; import { cipher } from "@/server/encrypt"; import { eq } from "drizzle-orm"; import { Bot, webhookCallback } from "grammy"; diff --git a/apps/web/drizzle.config.ts b/apps/web/drizzle.config.ts index 58116123..5df2ca29 100644 --- a/apps/web/drizzle.config.ts +++ b/apps/web/drizzle.config.ts @@ -1,7 +1,7 @@ import { type Config } from "drizzle-kit"; export default { - schema: "./server/db/schema.ts", + schema: "../../packages/db/schema.ts", dialect: "sqlite", driver: "d1", dbCredentials: { diff --git a/apps/web/lib/constants.ts b/apps/web/lib/constants.ts index 241a6a1d..73f9a83d 100644 --- a/apps/web/lib/constants.ts +++ b/apps/web/lib/constants.ts @@ -1,9 +1,3 @@ -export const LIMITS = { - page: 100, - tweet: 1000, - note: 1000, -}; - export const codeLanguageSubset = [ "python", "javascript", diff --git a/apps/web/lib/get-metadata.ts b/apps/web/lib/get-metadata.ts deleted file mode 100644 index c81397ff..00000000 --- a/apps/web/lib/get-metadata.ts +++ /dev/null @@ -1,40 +0,0 @@ -"use server"; -import * as cheerio from "cheerio"; - -// TODO: THIS SHOULD PROBABLY ALSO FETCH THE OG-IMAGE -export async function getMetaData(url: string) { - const response = await fetch(url); - const html = await response.text(); - - const $ = cheerio.load(html); - - // Extract the base URL - const baseUrl = url; - - // Extract title - const title = $("title").text().trim(); - - const description = $("meta[name=description]").attr("content") ?? ""; - - const _favicon = - $("link[rel=icon]").attr("href") ?? "https://supermemory.dhr.wtf/web.svg"; - - let favicon = - _favicon.trim().length > 0 - ? _favicon.trim() - : "https://supermemory.dhr.wtf/web.svg"; - if (favicon.startsWith("/")) { - favicon = baseUrl + favicon; - } else if (favicon.startsWith("./")) { - favicon = baseUrl + favicon.slice(1); - } - - // Prepare the metadata object - const metadata = { - title, - description, - image: favicon, - baseUrl, - }; - return metadata; -} diff --git a/apps/web/migrations/0000_steep_moira_mactaggert.sql b/apps/web/migrations/0000_fixed_pandemic.sql index 5813639d..09b5431a 100644 --- a/apps/web/migrations/0000_steep_moira_mactaggert.sql +++ b/apps/web/migrations/0000_fixed_pandemic.sql @@ -43,7 +43,7 @@ CREATE TABLE `chatHistory` ( `answerParts` text, `answerSources` text, `answerJustification` text, - `createdAt` integer DEFAULT '"2024-07-25T22:31:50.848Z"' NOT NULL, + `createdAt` integer DEFAULT '"2024-07-31T07:35:53.819Z"' NOT NULL, FOREIGN KEY (`threadId`) REFERENCES `chatThread`(`id`) ON UPDATE no action ON DELETE cascade ); --> statement-breakpoint @@ -62,6 +62,19 @@ CREATE TABLE `contentToSpace` ( FOREIGN KEY (`spaceId`) REFERENCES `space`(`id`) ON UPDATE no action ON DELETE cascade ); --> statement-breakpoint +CREATE TABLE `jobs` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `userId` text NOT NULL, + `url` text NOT NULL, + `status` text NOT NULL, + `attempts` integer DEFAULT 0 NOT NULL, + `lastAttemptAt` integer, + `error` blob, + `createdAt` integer NOT NULL, + `updatedAt` integer NOT NULL, + FOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade +); +--> statement-breakpoint CREATE TABLE `session` ( `sessionToken` text PRIMARY KEY NOT NULL, `userId` text NOT NULL, @@ -122,6 +135,10 @@ CREATE UNIQUE INDEX `authenticator_credentialID_unique` ON `authenticator` (`cre CREATE INDEX `canvas_user_userId` ON `canvas` (`userId`);--> statement-breakpoint CREATE INDEX `chatHistory_thread_idx` ON `chatHistory` (`threadId`);--> statement-breakpoint CREATE INDEX `chatThread_user_idx` ON `chatThread` (`userId`);--> statement-breakpoint +CREATE INDEX `jobs_userId_idx` ON `jobs` (`userId`);--> statement-breakpoint +CREATE INDEX `jobs_status_idx` ON `jobs` (`status`);--> statement-breakpoint +CREATE INDEX `jobs_createdAt_idx` ON `jobs` (`createdAt`);--> statement-breakpoint +CREATE INDEX `jobs_url_idx` ON `jobs` (`url`);--> statement-breakpoint CREATE UNIQUE INDEX `space_name_unique` ON `space` (`name`);--> statement-breakpoint CREATE INDEX `spaces_name_idx` ON `space` (`name`);--> statement-breakpoint CREATE INDEX `spaces_user_idx` ON `space` (`user`);--> statement-breakpoint diff --git a/apps/web/migrations/0001_Adding_jobs_table.sql b/apps/web/migrations/0001_Adding_jobs_table.sql new file mode 100644 index 00000000..7a687f72 --- /dev/null +++ b/apps/web/migrations/0001_Adding_jobs_table.sql @@ -0,0 +1,19 @@ +-- Migration number: 0001 2024-08-05T18:05:16.793Z +CREATE TABLE `jobs` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `userId` text NOT NULL, + `url` text NOT NULL, + `status` text NOT NULL, + `attempts` integer DEFAULT 0 NOT NULL, + `lastAttemptAt` integer, + `error` blob, + `createdAt` integer NOT NULL, + `updatedAt` integer NOT NULL, + FOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade +); + + +CREATE INDEX `jobs_userId_idx` ON `jobs` (`userId`);--> statement-breakpoint +CREATE INDEX `jobs_status_idx` ON `jobs` (`status`);--> statement-breakpoint +CREATE INDEX `jobs_createdAt_idx` ON `jobs` (`createdAt`);--> statement-breakpoint +CREATE INDEX `jobs_url_idx` ON `jobs` (`url`);--> statement-breakpoint
\ No newline at end of file diff --git a/apps/web/migrations/meta/0000_snapshot.json b/apps/web/migrations/meta/0000_snapshot.json index a7689010..3bb8617f 100644 --- a/apps/web/migrations/meta/0000_snapshot.json +++ b/apps/web/migrations/meta/0000_snapshot.json @@ -1,7 +1,7 @@ { "version": "6", "dialect": "sqlite", - "id": "8705302a-eae7-4fbf-9ce8-8ae23df228a2", + "id": "3fbdb153-2764-4b09-ac22-05c3a131ec35", "prevId": "00000000-0000-0000-0000-000000000000", "tables": { "account": { @@ -305,7 +305,7 @@ "primaryKey": false, "notNull": true, "autoincrement": false, - "default": "'\"2024-07-25T22:31:50.848Z\"'" + "default": "'\"2024-07-31T07:35:53.819Z\"'" } }, "indexes": { @@ -422,6 +422,110 @@ }, "uniqueConstraints": {} }, + "jobs": { + "name": "jobs", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "attempts": { + "name": "attempts", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "lastAttemptAt": { + "name": "lastAttemptAt", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "error": { + "name": "error", + "type": "blob", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updatedAt": { + "name": "updatedAt", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "jobs_userId_idx": { + "name": "jobs_userId_idx", + "columns": ["userId"], + "isUnique": false + }, + "jobs_status_idx": { + "name": "jobs_status_idx", + "columns": ["status"], + "isUnique": false + }, + "jobs_createdAt_idx": { + "name": "jobs_createdAt_idx", + "columns": ["createdAt"], + "isUnique": false + }, + "jobs_url_idx": { + "name": "jobs_url_idx", + "columns": ["url"], + "isUnique": false + } + }, + "foreignKeys": { + "jobs_userId_user_id_fk": { + "name": "jobs_userId_user_id_fk", + "tableFrom": "jobs", + "tableTo": "user", + "columnsFrom": ["userId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, "session": { "name": "session", "columns": { diff --git a/apps/web/migrations/meta/_journal.json b/apps/web/migrations/meta/_journal.json index d79e2607..59ab4ea6 100644 --- a/apps/web/migrations/meta/_journal.json +++ b/apps/web/migrations/meta/_journal.json @@ -5,8 +5,8 @@ { "idx": 0, "version": "6", - "when": 1721946710900, - "tag": "0000_steep_moira_mactaggert", + "when": 1722411353835, + "tag": "0000_fixed_pandemic", "breakpoints": true } ] diff --git a/apps/web/next.config.mjs b/apps/web/next.config.mjs index c0001fa5..307d5bdc 100644 --- a/apps/web/next.config.mjs +++ b/apps/web/next.config.mjs @@ -1,6 +1,5 @@ import MillionLint from "@million/lint"; import { setupDevPlatform } from "@cloudflare/next-on-pages/next-dev"; -import { withSentryConfig } from "@sentry/nextjs"; /** @type {import('next').NextConfig} */ const baseNextConfig = { @@ -9,6 +8,9 @@ const baseNextConfig = { env: { TELEGRAM_BOT_TOKEN: process.env.TELEGRAM_BOT_TOKEN, }, + eslint: { + disableDuringBuilds: true, + }, }; let selectedCofig = baseNextConfig; @@ -21,41 +23,6 @@ if (process.env.NODE_ENV === "development") { export default selectedCofig; -//! Disabled sentry for now because of unreasonably large bundle size -// export default withSentryConfig(selectedCofig, { -// // For all available options, see: -// // https://github.com/getsentry/sentry-webpack-plugin#options - -// org: "none-h00", -// project: "javascript-nextjs", -// // Only print logs for uploading source maps in CI -// silent: !process.env.CI, - -// // For all available options, see: -// // https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/ - -// // Upload a larger set of source maps for prettier stack traces (increases build time) -// widenClientFileUpload: true, - -// // Route browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers. -// // This can increase your server load as well as your hosting bill. -// // Note: Check that the configured route will not match with your Next.js middleware, otherwise reporting of client- -// // side errors will fail. -// tunnelRoute: "/monitoring", - -// // Hides source maps from generated client bundles -// hideSourceMaps: true, - -// // Automatically tree-shake Sentry logger statements to reduce bundle size -// disableLogger: true, - -// // Enables automatic instrumentation of Vercel Cron Monitors. (Does not yet work with App Router route handlers.) -// // See the following for more information: -// // https://docs.sentry.io/product/crons/ -// // https://vercel.com/docs/cron-jobs -// automaticVercelMonitors: true, -// }); - // we only need to use the utility during development so we can check NODE_ENV // (note: this check is recommended but completely optional) if (process.env.NODE_ENV === "development") { diff --git a/apps/web/package.json b/apps/web/package.json index 5773fe39..d3bf1f48 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -46,7 +46,6 @@ "@types/node": "^20.11.24", "@types/react": "^18.2.61", "@types/react-dom": "^18.2.19", - "drizzle-kit": "0.21.2", "eslint": "^8.57.0", "postcss": "^8.4.38", "typescript": "^5.3.3", diff --git a/apps/web/server/auth.ts b/apps/web/server/auth.ts index 20e42e9a..645989fa 100644 --- a/apps/web/server/auth.ts +++ b/apps/web/server/auth.ts @@ -2,7 +2,7 @@ import NextAuth, { NextAuthResult } from "next-auth"; import Google from "next-auth/providers/google"; import { DrizzleAdapter } from "@auth/drizzle-adapter"; import { db } from "./db"; -import { accounts, sessions, users, verificationTokens } from "./db/schema"; +import { accounts, sessions, users, verificationTokens } from "@repo/db/schema"; export const { handlers: { GET, POST }, diff --git a/apps/web/server/db/index.ts b/apps/web/server/db/index.ts index a9ec9106..52f3e350 100644 --- a/apps/web/server/db/index.ts +++ b/apps/web/server/db/index.ts @@ -1,6 +1,6 @@ import { drizzle } from "drizzle-orm/d1"; -import * as schema from "./schema"; +import * as schema from "@repo/db/schema"; export const db = drizzle(process.env.DATABASE, { schema, diff --git a/apps/web/wrangler.toml b/apps/web/wrangler.toml index 7f3fa047..a6232450 100644 --- a/apps/web/wrangler.toml +++ b/apps/web/wrangler.toml @@ -29,7 +29,6 @@ binding = "DATABASE" database_name = "dev-d1-anycontext" database_id = "fc562605-157a-4f60-b439-2a24ffed5b4c" - [[env.production.d1_databases]] binding = "DATABASE" database_name = "prod-d1-supermemory" diff --git a/package.json b/package.json index 4e5a1060..21900aa3 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@repo/tailwind-config": "*", "@repo/typescript-config": "*", "@repo/ui": "*", + "@repo/db": "*", "lint-staged": "^15.2.5", "prettier": "^3.3.3", "rxjs": "^7.8.1", @@ -99,7 +100,9 @@ "turndown": "^7.2.0", "uploadthing": "^6.10.4", "vaul": "^0.9.1", - "zod": "^3.23.8" + "zod": "^3.23.8", + "drizzle-kit": "0.21.2", + "drizzle-orm": "0.30.0" }, "trustedDependencies": [ "core-js-pure", diff --git a/packages/db/package.json b/packages/db/package.json new file mode 100644 index 00000000..0413f11d --- /dev/null +++ b/packages/db/package.json @@ -0,0 +1,13 @@ +{ + "name": "@repo/db", + "version": "0.0.0", + "type": "module", + "compilerOptions": { + "plugins": [{ "name": "next" }], + "module": "ESNext", + "moduleResolution": "Bundler", + "allowJs": true, + "jsx": "preserve", + "noEmit": true + } +}
\ No newline at end of file diff --git a/apps/web/server/db/schema.ts b/packages/db/schema.ts index 32b80719..70860066 100644 --- a/apps/web/server/db/schema.ts +++ b/packages/db/schema.ts @@ -7,6 +7,7 @@ import { sqliteTableCreator, text, integer, + blob, } from "drizzle-orm/sqlite-core"; import type { AdapterAccountType } from "next-auth/adapters"; @@ -242,3 +243,34 @@ export const canvas = createTable( export type ChatThread = typeof chatThreads.$inferSelect; export type ChatHistory = typeof chatHistory.$inferSelect; + +export const jobs = createTable( + "jobs", + { + id: integer("id").notNull().primaryKey({ autoIncrement: true }), + userId: text("userId") + .notNull() + .references(() => users.id, { onDelete: "cascade" }), + url: text("url").notNull(), + status: text("status").notNull(), + attempts: integer("attempts").notNull().default(0), + lastAttemptAt: integer("lastAttemptAt"), + error: blob("error"), + createdAt: int("createdAt", { mode: "timestamp" }) + .notNull() + .notNull() + .default(new Date()), + updatedAt: int("updatedAt", { mode: "timestamp" }) + .notNull() + .notNull() + .default(new Date()), + }, + (job) => ({ + userIdx: index("jobs_userId_idx").on(job.userId), + statusIdx: index("jobs_status_idx").on(job.status), + createdAtIdx: index("jobs_createdAt_idx").on(job.createdAt), + urlIdx: index("jobs_url_idx").on(job.url), + }), +); + +export type Job = typeof jobs.$inferSelect; diff --git a/packages/db/tsconfig.json b/packages/db/tsconfig.json new file mode 100644 index 00000000..c8380c91 --- /dev/null +++ b/packages/db/tsconfig.json @@ -0,0 +1,7 @@ +{ +"extends": "@repo/typescript-config/react-library.json", +"compilerOptions": { + "outDir": "dist" +}, +"exclude": ["node_modules", "dist"], +} diff --git a/packages/shared-types/index.ts b/packages/shared-types/index.ts index a9933b84..e49cf8e0 100644 --- a/packages/shared-types/index.ts +++ b/packages/shared-types/index.ts @@ -1,5 +1,14 @@ import { z } from "zod"; + +export const LIMITS = { + page: 100, + tweet: 1000, + note: 1000, +}; + + + export const SourceZod = z.object({ type: z.string(), source: z.string(), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 60c2ad03..8c5d1ad4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -125,6 +125,12 @@ importers: crypto-browserify: specifier: ^3.12.0 version: 3.12.0 + drizzle-kit: + specifier: 0.21.2 + version: 0.21.2 + drizzle-orm: + specifier: 0.30.0 eslint-config-turbo: specifier: ^2.0.6 version: 2.0.9([email protected]) @@ -231,6 +237,9 @@ importers: '@clack/prompts': specifier: ^0.7.0 version: 0.7.0 + '@repo/db': + specifier: '*' + version: link:packages/db '@repo/eslint-config': specifier: '*' version: link:packages/eslint-config @@ -285,6 +294,12 @@ importers: hono: specifier: ^4.5.1 version: 4.5.2 + honox: + specifier: ^0.1.23 + version: 0.1.23([email protected]) + vite: + specifier: ^5.3.5 + version: 5.3.5 devDependencies: '@cloudflare/workers-types': specifier: ^4.20240614.0 @@ -334,7 +349,7 @@ importers: extension: specifier: latest + version: 1.8.0([email protected])([email protected])([email protected])([email protected])([email protected]) react: specifier: ^18.1.0 version: 18.3.1 @@ -367,7 +382,7 @@ importers: version: 8.20.0(@opentelemetry/[email protected])(@opentelemetry/[email protected])(@opentelemetry/[email protected])(@opentelemetry/[email protected])([email protected])([email protected])([email protected]) ai: specifier: ^3.3.0 clsx: specifier: ^2.1.1 version: 2.1.1 @@ -435,9 +450,6 @@ importers: '@types/react-dom': specifier: ^18.2.19 version: 18.3.0 - drizzle-kit: - specifier: 0.21.2 - version: 0.21.2 eslint: specifier: ^8.57.0 version: 8.57.0 @@ -451,6 +463,8 @@ importers: specifier: ^3.66.0 version: 3.67.1(@cloudflare/[email protected]) + packages/db: {} + packages/eslint-config: devDependencies: '@typescript-eslint/eslint-plugin': @@ -637,6 +651,22 @@ packages: zod: 3.23.8 dev: false + /@ai-sdk/[email protected]([email protected]): + resolution: {integrity: sha512-xIDpinTnuInH16wBgKAVdN6pmrpjlJF+5f+f/8ahYMQlYzpe4Vj1qw8OL+rUGdCePcRSrFmjk8G/wdX5+J8dIw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + dependencies: + '@ai-sdk/provider': 0.0.15 + eventsource-parser: 1.1.2 + nanoid: 3.3.6 + secure-json-parse: 2.7.0 + zod: 3.23.8 + dev: false + /@ai-sdk/[email protected]: resolution: {integrity: sha512-gaQ5Y033nro9iX1YUjEDFDRhmMcEiCk56LJdIUbX5ozEiCNCfpiBpEqrjSp/Gp5RzBS2W0BVxfG7UGW6Ezcrzg==} engines: {node: '>=18'} @@ -644,6 +674,13 @@ packages: json-schema: 0.4.0 dev: false + /@ai-sdk/[email protected]: + resolution: {integrity: sha512-phX/YdwKd8q8/uZ7MsUytcHuN5KvT+wgM+y78eu6E+VyFE3GRwelctBFnaaA96uRL6xnKNmb0e7e+2fDOYuBoA==} + engines: {node: '>=18'} + dependencies: + json-schema: 0.4.0 + dev: false + /@ai-sdk/[email protected]: resolution: {integrity: sha512-kiPqIsSnUimckaUn87WepxfjPNdy8SXlPP7P6yWuG3e1NmyFHcyuH6EBBZxXLmu0oZtkb+QEeP3UDWGSc+wwKQ==} engines: {node: '>=18'} @@ -670,8 +707,8 @@ packages: zod: 3.23.8 dev: false - resolution: {integrity: sha512-LAxFLtHKN1BajTNP8YzyVIwXn45LSunmvm2Svrfq5oPOyJ2gUEjtaONnbme4mwRXJ1kk6b63SLrgOIXbz6XF/g==} + resolution: {integrity: sha512-TH8uubORsHBNfZQvHnvivOgKR/xWnMl0SZiGEj+MYgDGu6xpPW+gHlwYXZM8Fey6V/lvqhe1rNfV7D7E6xJn8A==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 @@ -682,8 +719,8 @@ packages: zod: optional: true dependencies: - '@ai-sdk/provider-utils': 1.0.5([email protected]) - '@ai-sdk/ui-utils': 0.0.24([email protected]) + '@ai-sdk/provider-utils': 1.0.7([email protected]) + '@ai-sdk/ui-utils': 0.0.26([email protected]) react: 18.3.1 swr: 2.2.5([email protected]) zod: 3.23.8 @@ -704,8 +741,8 @@ packages: - zod dev: false - /@ai-sdk/[email protected]([email protected]): - resolution: {integrity: sha512-uEvlT7MBkRRZxk7teDgtrGe7G3U9tspgSJUvupdOE2d0a4vLlHrMqHb07ao97/Xo1aVHh7oBF9XIgRzKnFtbIQ==} + /@ai-sdk/[email protected]([email protected]): + resolution: {integrity: sha512-usf7yZPdx5HcTdLrs4rI2cfAqz4V0H61uTJ6SrFmbjObUF8wCGZVMNvUB3zXxrIrlVeHJKEueGd1QNPSG06qBA==} engines: {node: '>=18'} peerDependencies: solid-js: ^1.7.7 @@ -713,8 +750,8 @@ packages: solid-js: optional: true dependencies: - '@ai-sdk/provider-utils': 1.0.5([email protected]) - '@ai-sdk/ui-utils': 0.0.24([email protected]) + '@ai-sdk/provider-utils': 1.0.7([email protected]) + '@ai-sdk/ui-utils': 0.0.26([email protected]) transitivePeerDependencies: - zod dev: false @@ -736,8 +773,8 @@ packages: - zod dev: false - resolution: {integrity: sha512-7vrh61wXPVfy19nS4CqyAC3UWjsOgj/b94PCccVTGFoqbmVSa0VptXPYoFfgPTP/W71v7TjXqeq1ygLc4noTZw==} + resolution: {integrity: sha512-hXPc+g0NgxEHGtGCa3OSC8I4mGw41Bi2jYmkzHpoUiHciUv29LPB08r0s2e139nMUDIDf8iYg4faxxdrTcKs7g==} engines: {node: '>=18'} peerDependencies: svelte: ^3.0.0 || ^4.0.0 @@ -745,8 +782,8 @@ packages: svelte: optional: true dependencies: - '@ai-sdk/provider-utils': 1.0.5([email protected]) - '@ai-sdk/ui-utils': 0.0.24([email protected]) + '@ai-sdk/provider-utils': 1.0.7([email protected]) + '@ai-sdk/ui-utils': 0.0.26([email protected]) sswr: 2.1.0([email protected]) svelte: 4.2.18 transitivePeerDependencies: @@ -767,8 +804,8 @@ packages: zod: 3.23.8 dev: false - /@ai-sdk/[email protected]([email protected]): - resolution: {integrity: sha512-NBhhICWJ5vAkN4BJnP/MyT+fOB6rTlGlsKGQwvjlhNxdrY1/jXqe2ikNkCbCSEz20IDk82bmg2JJBM96g1O3Ig==} + /@ai-sdk/[email protected]([email protected]): + resolution: {integrity: sha512-d+16/dcKJM4m4KFgaz8AtJFvJhUNEdqGVFczY6jtFyyBqXz42pQtAASRATtgOatdSuOeEzOSkTzBAr49/qN3Wg==} engines: {node: '>=18'} peerDependencies: zod: ^3.0.0 @@ -776,8 +813,8 @@ packages: zod: optional: true dependencies: - '@ai-sdk/provider': 0.0.14 - '@ai-sdk/provider-utils': 1.0.5([email protected]) + '@ai-sdk/provider': 0.0.15 + '@ai-sdk/provider-utils': 1.0.7([email protected]) secure-json-parse: 2.7.0 zod: 3.23.8 dev: false @@ -799,8 +836,8 @@ packages: - zod dev: false - resolution: {integrity: sha512-ZnDjkkUH/9xoXqJEmyrG9Z8z7DKBnp2uyCd9ZVI8QSqKOaP0jOwhv8THUXlIqDEF+ULLGMWm0XeY/L7i3CMYTA==} + resolution: {integrity: sha512-FC0/5CpMkYS0RTlTs5E6xw0nM0kNvFWkB2FqxkWvx0R7AKJBjZlXXTtq8aEAXlOg/ce+XSTAG/aTswmjWy6C4A==} engines: {node: '>=18'} peerDependencies: vue: ^3.3.4 @@ -808,8 +845,8 @@ packages: vue: optional: true dependencies: - '@ai-sdk/provider-utils': 1.0.5([email protected]) - '@ai-sdk/ui-utils': 0.0.24([email protected]) + '@ai-sdk/provider-utils': 1.0.7([email protected]) + '@ai-sdk/ui-utils': 0.0.26([email protected]) swrv: 1.0.4([email protected]) vue: 3.4.34([email protected]) transitivePeerDependencies: @@ -3126,7 +3163,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true /@cloudflare/[email protected]: @@ -3135,7 +3171,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true /@cloudflare/[email protected]: @@ -3144,7 +3179,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /@cloudflare/[email protected]: @@ -3153,7 +3187,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /@cloudflare/[email protected]: @@ -3162,7 +3195,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /@cloudflare/[email protected]: @@ -3179,7 +3211,6 @@ packages: engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 - dev: true resolution: {integrity: sha512-MX0yLTwtZzr82sQ0zOjqimpZbzjMaK/h2pmlrLK7DCzlmiZLYFpoO94WmN1akRVo6ll/TdpHb53vihHLUMyvng==} @@ -3627,6 +3658,14 @@ packages: resolution: {integrity: sha512-ALK12C6SQNNHw1enXK+UO8bdyQ+jaWNQ1Af7Z3FNxeAwjYhQT7do+TRE4RASAJ3ObaS2+TJ7TXR3oz2Gzbw0PQ==} dev: false + /@dependents/[email protected]: + resolution: {integrity: sha512-D/9dozteKcutI5OdxJd8rU+fL6XgaaRg60sPPJWkT33OCiRfkCu5wO5B/yXTaaL2e6EB0lcCBGe5E0XscZCvvQ==} + engines: {node: '>=18'} + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.0 + dev: false + /@discoveryjs/[email protected]: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} @@ -3695,14 +3734,14 @@ packages: dependencies: esbuild: 0.18.20 source-map-support: 0.5.21 - dev: true + dev: false /@esbuild-kit/[email protected]: resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} dependencies: '@esbuild-kit/core-utils': 3.3.2 get-tsconfig: 4.7.6 - dev: true + dev: false /@esbuild-plugins/[email protected]([email protected]): resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} @@ -3728,7 +3767,6 @@ packages: cpu: [ppc64] os: [aix] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -3740,6 +3778,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -3754,7 +3801,7 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -3763,7 +3810,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -3775,6 +3821,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} engines: {node: '>=12'} @@ -3798,7 +3853,7 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -3807,7 +3862,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -3819,6 +3873,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -3833,7 +3896,7 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -3842,7 +3905,6 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -3854,6 +3916,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -3868,7 +3939,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -3877,7 +3948,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -3889,6 +3959,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -3903,7 +3982,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -3912,7 +3991,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -3924,6 +4002,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -3938,7 +4025,7 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -3947,7 +4034,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -3959,6 +4045,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -3973,7 +4068,7 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -3982,7 +4077,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -3994,6 +4088,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -4008,7 +4111,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -4017,7 +4120,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -4029,6 +4131,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -4043,7 +4154,7 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -4052,7 +4163,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -4064,6 +4174,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -4078,7 +4197,7 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -4087,7 +4206,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -4099,6 +4217,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} engines: {node: '>=12'} @@ -4122,7 +4249,7 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -4131,7 +4258,6 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -4143,6 +4269,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -4157,7 +4292,7 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -4166,7 +4301,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -4178,6 +4312,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -4192,7 +4335,7 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -4201,7 +4344,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -4213,6 +4355,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -4227,7 +4378,7 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -4236,7 +4387,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -4248,6 +4398,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -4262,7 +4421,7 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -4271,7 +4430,6 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -4283,6 +4441,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -4297,7 +4464,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -4306,7 +4473,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -4318,6 +4484,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -4332,7 +4507,7 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -4341,7 +4516,6 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -4353,6 +4527,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -4367,7 +4550,7 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -4376,7 +4559,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -4388,6 +4570,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -4402,7 +4593,7 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -4411,7 +4602,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -4423,6 +4613,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -4437,7 +4636,7 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -4446,7 +4645,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -4458,6 +4656,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -4472,7 +4679,7 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -4481,7 +4688,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -4493,6 +4699,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -4507,7 +4722,7 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/[email protected]: @@ -4516,7 +4731,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/[email protected]: @@ -4528,6 +4742,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@eslint-community/[email protected]([email protected]): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4570,7 +4793,7 @@ packages: prefers-yarn: 1.0.1 dev: true - /@extension-create/[email protected]([email protected])([email protected])([email protected])([email protected]): + /@extension-create/[email protected]([email protected])([email protected])([email protected])([email protected])([email protected]): resolution: {integrity: sha512-MUFz1XQZNMaWynEdLVBxqUZxjbWtAr7ltFiQmbBekF1QYokQxK6rhq1VrdXsrrZ5avfNwE/ybaYy5u0XDtwVCg==} engines: {node: '>=18'} dependencies: @@ -4614,7 +4837,7 @@ packages: ts-loader: 9.5.1([email protected])([email protected]) webextension-polyfill: 0.10.0 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) webpack-browser-extension-common-errors: 1.1.2([email protected]) webpack-browser-extension-html: 1.1.1([email protected]) webpack-browser-extension-icons: 1.0.4([email protected]) @@ -4656,7 +4879,6 @@ packages: /@fastify/[email protected]: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - dev: true /@floating-ui/[email protected]: resolution: {integrity: sha512-8GrTWmoFhm5BsMZOTHeGD2/0FLKLQQHvO/ZmQga4tKempYRLz8aqJGqXVuQgisnMObq2YZ2SgkwctN1LOOxcqA==} @@ -4743,6 +4965,22 @@ packages: hono: 4.5.2 dev: false + /@hono/[email protected]([email protected]): + resolution: {integrity: sha512-aq09IUi/+Ut/EXR8t1lCjsV/OEnSQoO4F6RmV7Ufvy3x0tE2TIYLs6YL0kZ7+gLIbmVg6V2MppHGQaLMNs7G8Q==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: '*' + dependencies: + '@hono/node-server': 1.12.0 + hono: 4.5.2 + miniflare: 3.20240718.1 + minimatch: 9.0.5 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + resolution: {integrity: sha512-dSDxaPV70Py8wuIU2QNpoVEIOSzSXZ/6/B/h4xA7eOMz7+AarKTSGV8E6QwrdcCbBLkpqfJ4Q2TmBO0eP1tCBQ==} peerDependencies: @@ -4854,7 +5092,6 @@ packages: dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - dev: true /@jsonjoy.com/[email protected]([email protected]): resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} @@ -5836,7 +6073,7 @@ packages: react-refresh: 0.14.2 schema-utils: 4.2.0 source-map: 0.7.4 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) webpack-dev-server: 5.0.4([email protected])([email protected]) dev: true @@ -7639,6 +7876,134 @@ packages: rollup: 3.29.4 dev: false + /@rollup/[email protected]: + resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@rrweb/[email protected]: resolution: {integrity: sha512-E6cACNVsm+NUhn7dzocQoKyXI7BHrHRRm5Ab23yrAzEQ2caWocCEYJhqDlc4KRVJBkQfXZfyWm8+2d0uggFuZg==} dependencies: @@ -9604,6 +9969,11 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true + /@typescript-eslint/[email protected]: + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + dev: false + /@typescript-eslint/[email protected]([email protected]): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -9647,6 +10017,28 @@ packages: - supports-color dev: true + /@typescript-eslint/[email protected]([email protected]): + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.6 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0([email protected]) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: false + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -9702,6 +10094,14 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@typescript-eslint/[email protected]: + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + dev: false + /@ungap/[email protected]: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -10124,7 +10524,7 @@ packages: webpack: 5.x.x webpack-cli: 5.x.x dependencies: - webpack: 5.93.0([email protected]) + webpack: 5.93.0([email protected])([email protected]) webpack-cli: 5.1.4(@webpack-cli/[email protected])([email protected]) dev: true @@ -10140,7 +10540,7 @@ packages: optional: true dependencies: prettier: 3.3.3 - webpack: 5.93.0([email protected]) + webpack: 5.93.0([email protected])([email protected]) webpack-cli: 5.1.4(@webpack-cli/[email protected])([email protected]) yeoman-environment: 3.19.3 yeoman-generator: 5.10.0([email protected]) @@ -10158,7 +10558,7 @@ packages: webpack: 5.x.x webpack-cli: 5.x.x dependencies: - webpack: 5.93.0([email protected]) + webpack: 5.93.0([email protected])([email protected]) webpack-cli: 5.1.4(@webpack-cli/[email protected])([email protected]) dev: true @@ -10173,7 +10573,7 @@ packages: webpack-dev-server: optional: true dependencies: - webpack: 5.93.0([email protected]) + webpack: 5.93.0([email protected])([email protected]) webpack-cli: 5.1.4(@webpack-cli/[email protected])([email protected]) dev: true @@ -10234,7 +10634,6 @@ packages: engines: {node: '>=0.4.0'} dependencies: acorn: 8.12.1 - dev: true resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} @@ -10320,8 +10719,8 @@ packages: - vue dev: false - resolution: {integrity: sha512-ndW4G9jw8ImIsTWK2iderOWMVn4H3B6u+KHlZ7hJEvFBdBYTFQ62qTw10AmHsQefjwHRC/2evr9qf79EkSwo9Q==} + resolution: {integrity: sha512-oQF9L75J8kyfYKFNOCFrzmJOeZyj2kWED3x2hl+ZnR93TD1mhtA5XBvukTXK8UjthutRPinSBZaFH2GFn3qAWQ==} engines: {node: '>=18'} peerDependencies: openai: ^4.42.0 @@ -10341,13 +10740,13 @@ packages: zod: optional: true dependencies: - '@ai-sdk/provider': 0.0.14 - '@ai-sdk/provider-utils': 1.0.5([email protected]) - '@ai-sdk/react': 0.0.36([email protected])([email protected]) - '@ai-sdk/solid': 0.0.27([email protected]) - '@ai-sdk/svelte': 0.0.29([email protected])([email protected]) - '@ai-sdk/ui-utils': 0.0.24([email protected]) - '@ai-sdk/vue': 0.0.28([email protected])([email protected]) + '@ai-sdk/provider': 0.0.15 + '@ai-sdk/provider-utils': 1.0.7([email protected]) + '@ai-sdk/react': 0.0.38([email protected])([email protected]) + '@ai-sdk/solid': 0.0.29([email protected]) + '@ai-sdk/svelte': 0.0.31([email protected])([email protected]) + '@ai-sdk/ui-utils': 0.0.26([email protected]) + '@ai-sdk/vue': 0.0.30([email protected])([email protected]) '@opentelemetry/api': 1.9.0 eventsource-parser: 1.1.2 json-schema: 0.4.0 @@ -10580,7 +10979,6 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - dev: true resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} @@ -10660,7 +11058,6 @@ packages: resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} dependencies: printable-characters: 1.0.42 - dev: true resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -10674,6 +11071,11 @@ packages: minimalistic-assert: 1.0.1 dev: false + resolution: {integrity: sha512-LFRg7178Fw5R4FAEwZxVqiRI8IxSM+Ay2UBrHoCerXNme+kMMMfz7T3xDGV/c2fer87hcrtgJGsnSOfUrPK6ng==} + engines: {node: '>=18'} + dev: false + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} dev: true @@ -10795,7 +11197,7 @@ packages: '@babel/core': 7.24.9 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true /[email protected](@babel/[email protected]): @@ -11273,7 +11675,6 @@ packages: tslib: 2.6.3 transitivePeerDependencies: - supports-color - dev: true resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} @@ -11497,7 +11898,7 @@ packages: es6-iterator: 2.0.3 memoizee: 0.4.17 timers-ext: 0.1.8 - dev: true + dev: false resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} @@ -11714,7 +12115,6 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} - dev: true resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -11743,7 +12143,7 @@ packages: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} - dev: true + dev: false resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} @@ -11881,7 +12281,6 @@ packages: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - dev: true resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} @@ -12055,7 +12454,7 @@ packages: postcss-modules-values: 4.0.0([email protected]) postcss-value-parser: 4.2.0 semver: 7.6.3 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -12127,7 +12526,7 @@ packages: dependencies: es5-ext: 0.10.64 type: 2.7.3 - dev: true + dev: false resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -12140,7 +12539,6 @@ packages: resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} - dev: true resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} @@ -12433,6 +12831,95 @@ packages: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dev: true + resolution: {integrity: sha512-NTqfYfwNsW7AQltKSEaWR66hGkTeD52Kz3eRQ+nfkA9ZFZt3iifRCWh+yZ/m6t3H42JFwVFTrml/D64R2PAIOA==} + engines: {node: '>=18'} + hasBin: true + dependencies: + ast-module-types: 6.0.0 + escodegen: 2.1.0 + get-amd-module-type: 6.0.0 + node-source-walk: 7.0.0 + dev: false + + resolution: {integrity: sha512-R55jTS6Kkmy6ukdrbzY4x+I7KkXiuDPpFzUViFV/tm2PBGtTCjkh9ZmTuJc1SaziMHJOe636dtiZLEuzBL9drg==} + engines: {node: '>=18'} + dependencies: + ast-module-types: 6.0.0 + node-source-walk: 7.0.0 + dev: false + + resolution: {integrity: sha512-NGTnzjvgeMW1khUSEXCzPDoraLenWbUjCFjwxReH+Ir+P6LGjYtaBbAvITWn2H0VSC+eM7/9LFOTAkrta6hNYg==} + engines: {node: '>=18'} + dependencies: + node-source-walk: 7.0.0 + dev: false + + resolution: {integrity: sha512-pSXA6dyqmBPBuERpoOKKTUUjQCZwZPLRbd1VdsTbt6W+m/+6ROl4BbE87yQBUtLoK7yX8pvXHdKyM/xNIW9F7A==} + engines: {node: ^14.0.0 || >=16.0.0} + peerDependencies: + postcss: ^8.4.38 + dependencies: + is-url: 1.2.4 + postcss: 8.4.40 + postcss-values-parser: 6.0.2([email protected]) + dev: false + + resolution: {integrity: sha512-h5GCfFMkPm4ZUUfGHVPKNHKT8jV7cSmgK+s4dgQH4/dIUNh9/huR1fjEQrblOQNDalSU7k7g+tiW9LJ+nVEUhg==} + engines: {node: '>=18'} + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.0 + dev: false + + resolution: {integrity: sha512-Y64HyMqntdsCh1qAH7ci95dk0nnpA29g319w/5d/oYcHolcGUVJbIhOirOFjfN1KnMAXAFm5FIkZ4l2EKFGgxg==} + engines: {node: '>=18'} + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.0 + dev: false + + resolution: {integrity: sha512-KMHOsPY6aq3196WteVhkY5FF+6Nnc/r7q741E+Gq+Ax9mhE2iwj8Hlw8pl+749hPDRDBHZ2WlgOjP+twIG61vQ==} + engines: {node: '>=18'} + dev: false + + resolution: {integrity: sha512-tcMYfiFWoUejSbvSblw90NDt76/4mNftYCX0SMnVRYzSXv8Fvo06hi4JOPdNvVNxRtCAKg3MJ3cBJh+ygEMH+A==} + engines: {node: ^14.14.0 || >=16.0.0} + peerDependencies: + typescript: ^5.4.4 + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0([email protected]) + ast-module-types: 6.0.0 + node-source-walk: 7.0.0 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: false + + resolution: {integrity: sha512-AgWdSfVnft8uPGnUkdvE1EDadEENDCzoSRMt2xZfpxsjqVO617zGWXbB8TGIxHaqHz/nHa6lOSgAB8/dt0yEug==} + engines: {node: '>=18'} + peerDependencies: + typescript: ^5.4.4 + dependencies: + '@vue/compiler-sfc': 3.4.34 + detective-es6: 5.0.0 + detective-sass: 6.0.0 + detective-scss: 5.0.0 + detective-stylus: 5.0.0 + detective-typescript: 13.0.0([email protected]) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: false + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} dependencies: @@ -12478,14 +12965,13 @@ packages: resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} dependencies: heap: 0.2.7 - dev: true + dev: false resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 - dev: true resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -12563,7 +13049,7 @@ packages: webpack: ^4 || ^5 dependencies: dotenv-defaults: 2.0.2 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -12585,7 +13071,7 @@ packages: engines: {node: '>=0.4.0'} dependencies: wordwrap: 1.0.0 - dev: true + dev: false resolution: {integrity: sha512-U87IhZyCt/9d0ZT/Na3KFJVY31tSxtTx/n9UMcWFpW/5c2Ede39xiCG5efNV/0iimsv97UIRtDI0ldLBW5lbcg==} @@ -12602,7 +13088,7 @@ packages: zod: 3.23.8 transitivePeerDependencies: - supports-color - dev: true + dev: false resolution: {integrity: sha512-SupNouCdvosjzQpLinqnyIu7bBfsUKiaWXfUZ0IyDtwK8rWa2zQ4AOWCda86VJVxgb8xZ1l8vKvlLHyTBalB/g==} @@ -12832,7 +13318,7 @@ packages: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + dev: false resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} @@ -13017,7 +13503,7 @@ packages: es6-symbol: 3.1.4 esniff: 2.0.1 next-tick: 1.1.0 - dev: true + dev: false resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} @@ -13025,7 +13511,7 @@ packages: d: 1.0.2 es5-ext: 0.10.64 es6-symbol: 3.1.4 - dev: true + dev: false resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} @@ -13033,7 +13519,7 @@ packages: dependencies: d: 1.0.2 ext: 1.7.0 - dev: true + dev: false resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} @@ -13042,7 +13528,7 @@ packages: es5-ext: 0.10.64 es6-iterator: 2.0.3 es6-symbol: 3.1.4 - dev: true + dev: false resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} @@ -13341,7 +13827,7 @@ packages: esbuild: 0.19.12 transitivePeerDependencies: - supports-color - dev: true + dev: false resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} @@ -13530,7 +14016,7 @@ packages: '@esbuild/win32-arm64': 0.18.20 '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - dev: true + dev: false resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} @@ -13561,7 +14047,6 @@ packages: '@esbuild/win32-arm64': 0.19.12 '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - dev: true resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} @@ -13594,6 +14079,37 @@ packages: '@esbuild/win32-x64': 0.20.2 dev: false + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + dev: false + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -13630,7 +14146,6 @@ packages: esutils: 2.0.3 optionalDependencies: source-map: 0.6.1 - dev: true resolution: {integrity: sha512-zogs9zlOiZ7ka+wgUnmcM0KBEDjo4Jis7kxN1jvC0N4wynQ2MIx/KBkg4mVF63J5EK4W0QMCn7xO3vNisjaAoA==} @@ -14051,7 +14566,7 @@ packages: es5-ext: 0.10.64 event-emitter: 0.3.5 type: 2.7.3 - dev: true + dev: false resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} @@ -14065,7 +14580,6 @@ packages: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - dev: true resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} @@ -14118,7 +14632,7 @@ packages: dependencies: d: 1.0.2 es5-ext: 0.10.64 - dev: true + dev: false resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} @@ -14200,7 +14714,6 @@ packages: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} - dev: true resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} @@ -14249,20 +14762,20 @@ packages: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} dependencies: type: 2.7.3 - dev: true + dev: false resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: false + /[email protected]([email protected])([email protected])([email protected])([email protected])([email protected]): resolution: {integrity: sha512-ZvdnVRzzRUnPAwUFhDi3+WZ+uQn2IBE2yw2eIWB1QWFpIbuVslG2XnfYYPG6ZE7ft48zilYDm739T3fAn3F38Q==} engines: {node: '>=18'} hasBin: true dependencies: '@colors/colors': 1.6.0 '@extension-create/create': 1.8.0 - '@extension-create/develop': 1.8.0([email protected])([email protected])([email protected])([email protected]) + '@extension-create/develop': 1.8.0([email protected])([email protected])([email protected])([email protected])([email protected]) commander: 11.1.0 semver: 7.6.3 update-check: 1.5.4 @@ -14552,7 +15065,7 @@ packages: semver: 7.6.3 tapable: 2.2.1 typescript: 5.3.3 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -14799,6 +15312,14 @@ packages: '@scena/event-emitter': 1.0.5 dev: false + resolution: {integrity: sha512-hFM7oivtlgJ3d6XWD6G47l8Wyh/C6vFw5G24Kk1Tbq85yh5gcM8Fne5/lFhiuxB+RT6+SI7I1ThB9lG4FBh3jw==} + engines: {node: '>=18'} + dependencies: + ast-module-types: 6.0.0 + node-source-walk: 7.0.0 + dev: false + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -14829,7 +15350,6 @@ packages: dependencies: data-uri-to-buffer: 2.0.2 source-map: 0.6.1 - dev: true resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} @@ -14866,7 +15386,6 @@ packages: resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} dependencies: resolve-pkg-maps: 1.0.0 - dev: true resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} @@ -14952,7 +15471,6 @@ packages: inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 - dev: true resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} @@ -15029,7 +15547,6 @@ packages: ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 - dev: true resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} @@ -15056,6 +15573,14 @@ packages: shelljs: 0.8.5 dev: true + resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} + engines: {node: '>=0.6.0'} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: false + resolution: {integrity: sha512-epX3ww/mNnhl6tL45EQ/oixsY8JLEgUFoT4A5E/5iAR4esld9Kqv6IJGk7EmGuOgDvaarwF95hU2+v7Irql9lw==} engines: {node: '>=14'} @@ -15154,7 +15679,7 @@ packages: dependencies: lodash.throttle: 4.1.1 sisteransi: 1.0.5 - dev: true + dev: false resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} @@ -15343,7 +15868,7 @@ packages: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - dev: true + dev: false resolution: {integrity: sha512-ayfESdfG0wZM32uGw0CMfcW6pW6RM8htLXZI56A4rr7hIOjmKw+wd3+71wUc1uQfn90ZyY1NMCbQeMnunrIidg==} @@ -15379,6 +15904,28 @@ packages: engines: {node: '>=16.0.0'} dev: false + resolution: {integrity: sha512-Qb68f/Cb2FJQ/2foceCRFw/yNOzbDYHmKxV682+q0DqurkssdFKylGZBZd6zWIzBzQqk8Ol02BCOIusdy8u1dg==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: '>=4.*' + dependencies: + '@babel/generator': 7.25.0 + '@babel/parser': 7.25.0 + '@babel/traverse': 7.25.0 + '@babel/types': 7.25.0 + '@hono/vite-dev-server': 0.12.2([email protected]) + hono: 4.5.2 + jsonc-parser: 3.3.1 + precinct: 12.1.2 + optionalDependencies: + '@rollup/rollup-linux-x64-gnu': 4.20.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true @@ -16097,7 +16644,7 @@ packages: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - dev: true + dev: false resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} @@ -16187,6 +16734,15 @@ packages: upper-case: 1.1.3 dev: true + resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==} + engines: {node: '>=10'} + dev: false + + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + dev: false + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} dev: true @@ -16421,7 +16977,7 @@ packages: cli-color: 2.0.4 difflib: 0.2.4 dreamopt: 0.8.0 - dev: true + dev: false resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -16468,6 +17024,10 @@ packages: engines: {node: '>=6'} hasBin: true + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + dev: false + resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -16654,7 +17214,7 @@ packages: optional: true dependencies: less: 4.2.0 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -16834,6 +17394,7 @@ packages: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: false resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} @@ -16925,7 +17486,7 @@ packages: resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} dependencies: es5-ext: 0.10.64 - dev: true + dev: false resolution: {integrity: sha512-u6EPU8juLUk9ytRcyapkWI18epAv3RU+6+TC23ivjR0e+glWKBobFeSgRwOIJihzktILQuy6E0E80P2jVTDR5g==} @@ -17415,7 +17976,7 @@ packages: lru-queue: 0.1.0 next-tick: 1.1.0 timers-ext: 0.1.8 - dev: true + dev: false resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} @@ -17967,7 +18528,7 @@ packages: dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -17991,7 +18552,6 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -18010,7 +18570,6 @@ packages: engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 - dev: true resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} @@ -18209,6 +18768,15 @@ packages: num-sort: 2.1.0 dev: false + resolution: {integrity: sha512-sEGP5nKEXU7fGSZUML/coJbrO+yQtxcppDAYWRE9ovWsTbFoUHB2qDUx564WUzDaBHXsD46JBbIK5WVTwCyu3w==} + engines: {node: '>=18'} + hasBin: true + dependencies: + ast-module-types: 6.0.0 + node-source-walk: 7.0.0 + dev: false + resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} dev: false @@ -18356,7 +18924,7 @@ packages: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - dev: true + dev: false /[email protected](@babel/[email protected])(@opentelemetry/[email protected])([email protected])([email protected]): resolution: {integrity: sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==} @@ -18536,6 +19104,13 @@ packages: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + resolution: {integrity: sha512-1uiY543L+N7Og4yswvlm5NCKgPKDEXd9AUR9Jh3gen6oOeBsesr6LqhXom1er3eRzSUcVRWXzhv8tSNrIfGHKw==} + engines: {node: '>=18'} + dependencies: + '@babel/parser': 7.25.0 + dev: false + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} @@ -19407,7 +19982,6 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - dev: true resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} @@ -19770,7 +20344,7 @@ packages: jiti: 1.21.6 postcss: 8.4.40 semver: 7.6.3 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) transitivePeerDependencies: - typescript dev: true @@ -20040,6 +20614,18 @@ packages: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + resolution: {integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==} + engines: {node: '>=10'} + peerDependencies: + postcss: ^8.2.9 + dependencies: + color-name: 1.1.4 + is-url-superb: 4.0.0 + postcss: 8.4.40 + quote-unquote: 1.0.0 + dev: false + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} @@ -20092,6 +20678,30 @@ packages: resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} dev: false + resolution: {integrity: sha512-x2qVN3oSOp3D05ihCd8XdkIPuEQsyte7PSxzLqiRgktu79S5Dr1I75/S+zAup8/0cwjoiJTQztE9h0/sWp9bJQ==} + engines: {node: '>=18'} + hasBin: true + dependencies: + '@dependents/detective-less': 5.0.0 + commander: 12.1.0 + detective-amd: 6.0.0 + detective-cjs: 6.0.0 + detective-es6: 5.0.0 + detective-postcss: 7.0.0([email protected]) + detective-sass: 6.0.0 + detective-scss: 5.0.0 + detective-stylus: 5.0.0 + detective-typescript: 13.0.0([email protected]) + detective-vue2: 2.0.3([email protected]) + module-definition: 6.0.0 + node-source-walk: 7.0.0 + postcss: 8.4.40 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: false + resolution: {integrity: sha512-lEHd+yEm22jXdCphDrkvIJQU66EuLojPPtvZkpKIkiD+l0DMThF/niqZKJSoU8Vl7iuvtmzyMhir9LdVy5WMnA==} engines: {node: '>=10'} @@ -20155,7 +20765,6 @@ packages: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - dev: true resolution: {integrity: sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==} @@ -20455,6 +21064,10 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} + dev: false + resolution: {integrity: sha512-CRUyWmnzmZBA7RZSVGq0xMqmgCyPPxbiKNLFA5ud7KenojVX2s7Gv+V7eB52beKTPGxWRnVZ7D/tCIgYJJ8vNQ==} dev: false @@ -21154,7 +21767,6 @@ packages: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: true resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} @@ -21269,6 +21881,32 @@ packages: fsevents: 2.3.3 dev: false + resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.20.0 + '@rollup/rollup-android-arm64': 4.20.0 + '@rollup/rollup-darwin-arm64': 4.20.0 + '@rollup/rollup-darwin-x64': 4.20.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.20.0 + '@rollup/rollup-linux-arm-musleabihf': 4.20.0 + '@rollup/rollup-linux-arm64-gnu': 4.20.0 + '@rollup/rollup-linux-arm64-musl': 4.20.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0 + '@rollup/rollup-linux-riscv64-gnu': 4.20.0 + '@rollup/rollup-linux-s390x-gnu': 4.20.0 + '@rollup/rollup-linux-x64-gnu': 4.20.0 + '@rollup/rollup-linux-x64-musl': 4.20.0 + '@rollup/rollup-win32-arm64-msvc': 4.20.0 + '@rollup/rollup-win32-ia32-msvc': 4.20.0 + '@rollup/rollup-win32-x64-msvc': 4.20.0 + fsevents: 2.3.3 + dev: false + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} dev: false @@ -21398,7 +22036,7 @@ packages: dependencies: neo-async: 2.6.2 sass: 1.77.8 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -21695,7 +22333,6 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - dev: true resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} @@ -21989,7 +22626,6 @@ packages: dependencies: as-table: 1.0.55 get-source: 2.0.12 - dev: true resolution: {integrity: sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==} @@ -22019,7 +22655,6 @@ packages: resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} engines: {node: '>=4', npm: '>=6'} - dev: true resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} @@ -22226,7 +22861,7 @@ packages: peerDependencies: webpack: ^5.0.0 dependencies: - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -22338,7 +22973,7 @@ packages: normalize-path: 3.0.0 schema-utils: 4.2.0 stylelint: 16.7.0([email protected]) - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -22622,7 +23257,7 @@ packages: webpack: 5.93.0([email protected]) dev: false resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -22639,14 +23274,15 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.25 + esbuild: 0.19.12 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.31.3 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -22663,11 +23299,12 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.25 + esbuild: 0.19.12 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.31.3 - webpack: 5.93.0([email protected]) + webpack: 5.93.0([email protected])([email protected]) dev: true @@ -22729,7 +23366,7 @@ packages: dependencies: es5-ext: 0.10.64 next-tick: 1.1.0 - dev: true + dev: false resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} @@ -22867,7 +23504,6 @@ packages: typescript: '>=4.2.0' dependencies: typescript: 5.5.4 - dev: true resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -22885,7 +23521,7 @@ packages: semver: 7.6.3 source-map: 0.7.4 typescript: 5.3.3 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -23114,7 +23750,7 @@ packages: resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} - dev: true + dev: false resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} @@ -23224,7 +23860,6 @@ packages: engines: {node: '>=14.0'} dependencies: '@fastify/busboy': 2.1.1 - dev: true resolution: {integrity: sha512-i3uaEUwNdkRq2qtTRRJb13moW5HWqviu7Vl7oYRYz++uPtGHJj+x7TGjcEuwS5Mt2P4nA0U9dhIX3DdB6JGY0g==} @@ -23801,6 +24436,41 @@ packages: replace-ext: 1.0.1 dev: true + resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.21.5 + postcss: 8.4.40 + rollup: 4.20.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + resolution: {integrity: sha512-yTKOA4R/VN4jqjw4y5HrynFL8AK0Z3/Jt7eOJXEitsm0GMRHDBjCfCiuTiLP7OESvsZYo2pATCWhDqxC5ZrM6w==} peerDependencies: @@ -23818,7 +24488,7 @@ packages: hash-sum: 2.0.0 vue: 3.4.34([email protected]) watchpack: 2.4.1 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -23898,7 +24568,7 @@ packages: '@colors/colors': 1.6.0 browser-extension-manifest-fields: 1.0.6 content-security-policy-parser: 0.6.0 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -23912,7 +24582,7 @@ packages: parse5: 7.1.2 parse5-utils: 2.0.0 schema-utils: 4.2.0 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -23922,7 +24592,7 @@ packages: webpack: ~5.92.0 dependencies: browser-extension-manifest-fields: 1.0.6 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -23932,7 +24602,7 @@ packages: webpack: ~5.92.0 dependencies: browser-extension-manifest-fields: 1.0.6 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -23942,7 +24612,7 @@ packages: webpack: ~5.92.0 dependencies: browser-extension-manifest-fields: 1.0.6 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -23955,7 +24625,7 @@ packages: ajv: 8.17.1 browser-extension-manifest-fields: 1.0.6 chrome-extension-manifest-json-schema: 0.2.0 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -23967,7 +24637,7 @@ packages: ajv: 8.17.1 browser-extension-manifest-fields: 1.0.6 chrome-extension-manifest-json-schema: 0.2.0 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -23977,7 +24647,7 @@ packages: webpack: ^5.00.0 dependencies: webextension-polyfill: 0.10.0 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -23991,7 +24661,7 @@ packages: '@babel/traverse': 7.24.5 '@babel/types': 7.24.5 schema-utils: 4.2.0 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) transitivePeerDependencies: - supports-color dev: true @@ -24004,7 +24674,7 @@ packages: dependencies: browser-extension-manifest-fields: 1.0.6 csv-loader: 3.0.5 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -24016,7 +24686,7 @@ packages: browser-extension-manifest-fields: 1.0.6 loader-utils: 3.3.1 schema-utils: 4.2.0 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -24049,7 +24719,7 @@ packages: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.93.0([email protected]) + webpack: 5.93.0([email protected])([email protected]) webpack-merge: 5.10.0 dev: true @@ -24068,7 +24738,7 @@ packages: on-finished: 2.4.1 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -24112,7 +24782,7 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) webpack-cli: 5.1.4(@webpack-cli/[email protected])([email protected]) webpack-dev-middleware: 7.3.0([email protected]) ws: 8.18.0 @@ -24146,7 +24816,7 @@ packages: prefers-yarn: 1.0.1 progress: 2.0.3 schema-utils: 4.2.0 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) webpack-target-webextension: 1.1.2([email protected]) ws: 8.18.0 transitivePeerDependencies: @@ -24168,7 +24838,7 @@ packages: prefers-yarn: 1.0.1 progress: 2.0.3 schema-utils: 4.2.0 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) webpack-target-webextension: 1.1.2([email protected]) ws: 8.18.0 transitivePeerDependencies: @@ -24192,7 +24862,7 @@ packages: progress: 2.0.3 schema-utils: 4.2.0 webextension-polyfill-ts: 0.26.0 - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) webpack-target-webextension: 1.1.2([email protected]) ws: 8.17.1 transitivePeerDependencies: @@ -24210,7 +24880,7 @@ packages: peerDependencies: webpack: ^5.0.0 dependencies: - webpack: 5.92.1([email protected]) + webpack: 5.92.1([email protected])([email protected]) dev: true @@ -24221,7 +24891,7 @@ packages: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} dev: false resolution: {integrity: sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==} engines: {node: '>=10.13.0'} hasBin: true @@ -24252,7 +24922,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10([email protected]) + terser-webpack-plugin: 5.3.10([email protected])([email protected]) watchpack: 2.4.1 webpack-cli: 5.1.4(@webpack-cli/[email protected])([email protected]) webpack-sources: 3.2.3 @@ -24302,7 +24972,7 @@ packages: - uglify-js dev: false resolution: {integrity: sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==} engines: {node: '>=10.13.0'} hasBin: true @@ -24333,7 +25003,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10([email protected]) + terser-webpack-plugin: 5.3.10([email protected])([email protected]) watchpack: 2.4.1 webpack-cli: 5.1.4(@webpack-cli/[email protected])([email protected]) webpack-sources: 3.2.3 @@ -24484,7 +25154,6 @@ packages: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true resolution: {integrity: sha512-w7lOLRy0XecQTg/ujTLWBiJJuoQvzB3CdQ6/8Wgex3QxFhV9Pbnh3UbwIuUfMw3OCCPQc4o7y+1P+mISAgp6yg==} @@ -24497,7 +25166,6 @@ packages: '@cloudflare/workerd-linux-64': 1.20240718.0 '@cloudflare/workerd-linux-arm64': 1.20240718.0 '@cloudflare/workerd-windows-64': 1.20240718.0 - dev: true /[email protected](@cloudflare/[email protected]): resolution: {integrity: sha512-lLVJxq/OZMfntvZ79WQJNC1OKfxOCs6PLfogqDBuPFEQ3L/Mwqvd9IZ0bB8ahrwUN/K3lSdDPXynk9HfcGZxVw==} @@ -24620,7 +25288,6 @@ packages: optional: true utf-8-validate: optional: true - dev: true resolution: {integrity: sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==} @@ -24834,7 +25501,6 @@ packages: cookie: 0.5.0 mustache: 4.2.0 stacktracey: 2.1.8 - dev: true resolution: {integrity: sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==} |