aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDhravya Shah <[email protected]>2024-08-06 11:20:29 -0700
committerGitHub <[email protected]>2024-08-06 11:20:29 -0700
commit7fc39cd770e4b2f55c6fdae1fa02fe0a66a93f6d (patch)
tree82e6a03099b50441c2fe9a9bf8e8ddf7afa293e5
parentMerge pull request #219 from Deepakchowdavarapu/readme-issue (diff)
parentupdated kv and queues (diff)
downloadsupermemory-7fc39cd770e4b2f55c6fdae1fa02fe0a66a93f6d.tar.xz
supermemory-7fc39cd770e4b2f55c6fdae1fa02fe0a66a93f6d.zip
Merge pull request #193 from supermemoryai/kush/be-queue
Kush/be queue
-rwxr-xr-xapps/cf-ai-backend/bun.lockbbin0 -> 2390 bytes
-rw-r--r--apps/cf-ai-backend/package.json10
-rw-r--r--apps/cf-ai-backend/src/db/index.ts7
-rw-r--r--apps/cf-ai-backend/src/errors/baseError.ts46
-rw-r--r--apps/cf-ai-backend/src/errors/results.ts31
-rw-r--r--apps/cf-ai-backend/src/helper.ts108
-rw-r--r--apps/cf-ai-backend/src/index.ts141
-rw-r--r--apps/cf-ai-backend/src/queueConsumer/chunkers/chonker.ts (renamed from apps/cf-ai-backend/src/utils/chonker.ts)0
-rw-r--r--apps/cf-ai-backend/src/queueConsumer/chunkers/chunkPageOrNotes.ts (renamed from apps/cf-ai-backend/src/utils/chunkPageOrNotes.ts)2
-rw-r--r--apps/cf-ai-backend/src/queueConsumer/chunkers/chunkTweet.ts18
-rw-r--r--apps/cf-ai-backend/src/queueConsumer/helpers/processNotes.ts36
-rw-r--r--apps/cf-ai-backend/src/queueConsumer/helpers/processPage.ts43
-rw-r--r--apps/cf-ai-backend/src/queueConsumer/helpers/processTweet.ts88
-rw-r--r--apps/cf-ai-backend/src/queueConsumer/index.ts372
-rw-r--r--apps/cf-ai-backend/src/queueConsumer/utils/get-metadata.ts57
-rw-r--r--apps/cf-ai-backend/src/queueConsumer/utils/typeDecider.ts34
-rw-r--r--apps/cf-ai-backend/src/types.ts20
-rw-r--r--apps/cf-ai-backend/src/utils/chunkTweet.ts75
-rw-r--r--apps/cf-ai-backend/wrangler.toml23
-rw-r--r--apps/extension/content/content.tsx11
-rw-r--r--apps/web/app/(auth)/onboarding/page.tsx2
-rw-r--r--apps/web/app/(dash)/(memories)/content.tsx2
-rw-r--r--apps/web/app/(dash)/(memories)/space/[spaceid]/page.tsx2
-rw-r--r--apps/web/app/(dash)/dialogContentContainer.tsx4
-rw-r--r--apps/web/app/(dash)/menu.tsx14
-rw-r--r--apps/web/app/actions/doers.ts502
-rw-r--r--apps/web/app/actions/fetchers.ts2
-rw-r--r--apps/web/app/api/chat/history/route.ts2
-rw-r--r--apps/web/app/api/chat/route.ts2
-rw-r--r--apps/web/app/api/ensureAuth.ts2
-rw-r--r--apps/web/app/api/getCount/route.ts2
-rw-r--r--apps/web/app/api/me/route.ts2
-rw-r--r--apps/web/app/api/memories/route.ts2
-rw-r--r--apps/web/app/api/spaces/route.ts2
-rw-r--r--apps/web/app/api/store/friend/route.ts44
-rw-r--r--apps/web/app/api/store/helper.ts20
-rw-r--r--apps/web/app/api/telegram/route.ts2
-rw-r--r--apps/web/drizzle.config.ts2
-rw-r--r--apps/web/lib/constants.ts6
-rw-r--r--apps/web/lib/get-metadata.ts40
-rw-r--r--apps/web/migrations/0000_fixed_pandemic.sql (renamed from apps/web/migrations/0000_steep_moira_mactaggert.sql)19
-rw-r--r--apps/web/migrations/0001_Adding_jobs_table.sql19
-rw-r--r--apps/web/migrations/meta/0000_snapshot.json108
-rw-r--r--apps/web/migrations/meta/_journal.json4
-rw-r--r--apps/web/next.config.mjs39
-rw-r--r--apps/web/package.json1
-rw-r--r--apps/web/server/auth.ts2
-rw-r--r--apps/web/server/db/index.ts2
-rw-r--r--apps/web/wrangler.toml1
-rw-r--r--package.json5
-rw-r--r--packages/db/package.json13
-rw-r--r--packages/db/schema.ts (renamed from apps/web/server/db/schema.ts)32
-rw-r--r--packages/db/tsconfig.json7
-rw-r--r--packages/shared-types/index.ts9
-rw-r--r--pnpm-lock.yaml1048
55 files changed, 2295 insertions, 792 deletions
diff --git a/apps/cf-ai-backend/bun.lockb b/apps/cf-ai-backend/bun.lockb
new file mode 100755
index 00000000..601774bc
--- /dev/null
+++ b/apps/cf-ai-backend/bun.lockb
Binary files differ
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
+ version: 0.30.0(@opentelemetry/[email protected])(@types/[email protected])([email protected])
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
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
+ 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
+
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
+
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
- resolution: {integrity: sha512-uEvlT7MBkRRZxk7teDgtrGe7G3U9tspgSJUvupdOE2d0a4vLlHrMqHb07ao97/Xo1aVHh7oBF9XIgRzKnFtbIQ==}
+ 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
- resolution: {integrity: sha512-NBhhICWJ5vAkN4BJnP/MyT+fOB6rTlGlsKGQwvjlhNxdrY1/jXqe2ikNkCbCSEz20IDk82bmg2JJBM96g1O3Ig==}
+ 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
/@csstools/[email protected](@csstools/[email protected])(@csstools/[email protected]):
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
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
+
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
resolution: {integrity: sha512-MUFz1XQZNMaWynEdLVBxqUZxjbWtAr7ltFiQmbBekF1QYokQxK6rhq1VrdXsrrZ5avfNwE/ybaYy5u0XDtwVCg==}
engines: {node: '>=18'}
dependencies:
@@ -4614,7 +4837,7 @@ packages:
webextension-polyfill: 0.10.0
- webpack: 5.92.1([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
+ 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
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-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
+
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
+
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-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-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-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-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])
dev: true
@@ -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])
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])
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
resolution: {integrity: sha512-ZvdnVRzzRUnPAwUFhDi3+WZ+uQn2IBE2yw2eIWB1QWFpIbuVslG2XnfYYPG6ZE7ft48zilYDm739T3fAn3F38Q==}
engines: {node: '>=18'}
hasBin: true
dependencies:
'@colors/colors': 1.6.0
'@extension-create/create': 1.8.0
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])
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])
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])
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
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])
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])
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])
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])
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])
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])
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])
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])
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])
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])
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])
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])
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])
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])
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])
dev: true
@@ -23977,7 +24647,7 @@ packages:
webpack: ^5.00.0
dependencies:
webextension-polyfill: 0.10.0
- webpack: 5.92.1([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])
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])
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])
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-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])
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-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-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-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-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])
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
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==}