From e33a9e7b12fc156ce10855e428abfc618e0a55a4 Mon Sep 17 00:00:00 2001 From: 7HR4IZ3 Date: Wed, 11 Sep 2024 15:09:56 -0700 Subject: [PATCH 1/9] feat: nested multi-level trace objects and export support in threads --- packages/backend/src/api/v1/runs/export.ts | 103 +++++++++++++++++++-- packages/backend/src/api/v1/runs/index.ts | 13 ++- packages/frontend/pages/logs/index.tsx | 19 ++-- 3 files changed, 111 insertions(+), 24 deletions(-) diff --git a/packages/backend/src/api/v1/runs/export.ts b/packages/backend/src/api/v1/runs/export.ts index 5e2cc139d..75a714b90 100644 --- a/packages/backend/src/api/v1/runs/export.ts +++ b/packages/backend/src/api/v1/runs/export.ts @@ -1,6 +1,18 @@ import { isOpenAIMessage, unCamelObject } from "@/src/utils/misc" import { Parser } from "@json2csv/plainjs" import { Context } from "koa" +import { Run } from "shared" + +interface ExportType { + sql: any + ctx: Context + runs: Array + projectId: string +} + +interface TraceRun extends Run { + children: TraceRun[] +} function cleanOpenAiMessage(message: any) { // remove empty toolCalls if any empty @@ -31,13 +43,75 @@ function validateOpenAiMessages(messages: any[] | any): any[] { return messages } +async function getRelatedRuns(sql: any, runId: string, projectId: string) { + const related = await sql` + with recursive related_runs as ( + select + r1.* + from + run r1 + where + r1.id = ${runId} + and project_id = ${projectId} + + union all + + select + r2.* + from + run r2 + inner join related_runs rr on rr.id = r2.parent_run_id + ) + select + rr.created_at, + rr.tags, + rr.project_id, + rr.id, + rr.status, + rr.name, + rr.ended_at, + rr.error, + rr.input, + rr.output, + rr.params, + rr.type, + rr.parent_run_id, + rr.completion_tokens, + rr.prompt_tokens, + rr.feedback, + rr.metadata + from + related_runs rr; + ` + return related +} + +function getTraceChildren(run: Run, runs: Run[]): TraceRun { + // @ts-ignore + if (run.input === "__NOT_INGESTED__") { + run.status = "filtered"; + } + + const childRuns = runs + .filter((subRun) => subRun.parentRunId === run.id) + .sort( + (a, b) => + new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime(), + ); + + return { + ...run, + children: childRuns.map((subRun) => getTraceChildren(subRun, runs)) + } +} + export async function fileExport( - rows: Array, - exportType: "csv" | "ojsonl" | "jsonl", - ctx: Context, + { ctx, sql, runs, projectId }: ExportType, + exportFormat: "csv" | "ojsonl" | "jsonl", + exportType?: "trace" | "thread", ) { - if (exportType === "csv") { - const data = rows.length > 0 ? rows : [{}] + if (exportFormat === "csv") { + const data = runs.length > 0 ? runs : [{}] const parser = new Parser() const csv = parser.parse(data) const buffer = Buffer.from(csv, "utf-8") @@ -46,8 +120,8 @@ export async function fileExport( ctx.set("Content-Disposition", 'attachment; filename="export.csv"') ctx.body = buffer - } else if (exportType === "ojsonl") { - const jsonl = rows + } else if (exportFormat === "ojsonl") { + const jsonl = runs // make sure it's a valid row of OpenAI messages .filter((row) => { return ( @@ -75,9 +149,18 @@ export async function fileExport( ctx.set("Content-Disposition", 'attachment; filename="export.jsonl"') ctx.body = buffer - } else if (exportType === "jsonl") { - const jsonl = rows - .map((row) => JSON.stringify(row)) + } else if (exportFormat === "jsonl") { + const jsonl = ( + await Promise.all( + runs.map(async (row) => { + if (exportType === "trace") { + const related = await getRelatedRuns(sql, row.id, projectId) + row = getTraceChildren(row, related) + } + return JSON.stringify(row) + }), + ) + ) .filter((line) => line.length > 0) .join("\n") diff --git a/packages/backend/src/api/v1/runs/index.ts b/packages/backend/src/api/v1/runs/index.ts index b6c6600be..841b41f99 100644 --- a/packages/backend/src/api/v1/runs/index.ts +++ b/packages/backend/src/api/v1/runs/index.ts @@ -20,7 +20,8 @@ interface Query { models?: string[] tags?: string[] tokens?: string - exportType?: "csv" | "jsonl" + exportType?: "trace" | "thread" + exportFormat?: "csv" | "ojsonl" | "jsonl" minDuration?: string maxDuration?: string startTime?: string @@ -222,6 +223,7 @@ runs.get("/", async (ctx: Context) => { page = "0", parentRunId, exportType, + exportFormat, sortField, sortDirection, } = ctx.query as Query @@ -303,8 +305,11 @@ runs.get("/", async (ctx: Context) => { const runs = rows.map(formatRun) - if (exportType) { - return fileExport(runs, exportType, ctx) + if (exportFormat) { + return fileExport( + { ctx, sql, runs, projectId }, + exportFormat, exportType, + ) } const total = await sql` @@ -368,7 +373,7 @@ runs.get("/count", async (ctx: Context) => { with runs as ( select distinct on (r.id) r.*, - eu.id as user_id, + eu.id as user_id,2 eu.external_id as user_external_id, eu.created_at as user_created_at, eu.last_seen as user_last_seen, diff --git a/packages/frontend/pages/logs/index.tsx b/packages/frontend/pages/logs/index.tsx index bf6924d34..9f681f0ff 100644 --- a/packages/frontend/pages/logs/index.tsx +++ b/packages/frontend/pages/logs/index.tsx @@ -100,7 +100,7 @@ export const defaultColumns = { nameColumn("Agent"), durationColumn(), userColumn(), - feedbackColumn(true), + feedbackColumn(false), tagsColumn(), inputColumn("Input"), outputColumn(), @@ -110,7 +110,7 @@ export const defaultColumns = { userColumn(), inputColumn("Last Message"), tagsColumn(), - feedbackColumn(true), + feedbackColumn(false), ], } @@ -136,7 +136,7 @@ export const CHECKS_BY_TYPE = { "tags", "users", "status", - // "feedback", + "feedback", "duration", "metadata", ], @@ -144,7 +144,7 @@ export const CHECKS_BY_TYPE = { "date", "tags", "users", - // "feedback", + "feedback", "metadata", ], } @@ -434,9 +434,9 @@ export default function Logs() { } - {...exportButton(exportUrl + "&exportType=csv")} + {...exportButton(exportUrl + `&exportType=${type}&exportFormat=csv`)} > Export to CSV @@ -444,9 +444,8 @@ export default function Logs() { {type === "llm" && ( } - {...exportButton(exportUrl + "&exportType=ojsonl")} + {...exportButton(exportUrl + "&exportFormat=ojsonl")} > Export to OpenAI JSONL @@ -454,9 +453,9 @@ export default function Logs() { } - {...exportButton(exportUrl + "&exportType=jsonl")} + {...exportButton(exportUrl + `&exportType=${type}&exportFormat=jsonl`)} > Export to raw JSONL From 6f52f2c9ce4946cc4b8d1c097ace0c61becefd2d Mon Sep 17 00:00:00 2001 From: 7HR4IZ3 Date: Wed, 16 Oct 2024 19:24:03 -0700 Subject: [PATCH 2/9] refactor: code cleanup --- packages/backend/src/api/v1/runs/export.ts | 44 +++++++++++----------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/backend/src/api/v1/runs/export.ts b/packages/backend/src/api/v1/runs/export.ts index 5f05b65cb..920683064 100644 --- a/packages/backend/src/api/v1/runs/export.ts +++ b/packages/backend/src/api/v1/runs/export.ts @@ -1,17 +1,17 @@ -import { isOpenAIMessage, unCamelObject } from "@/src/utils/misc" -import { Parser } from "@json2csv/plainjs" -import { Context } from "koa" -import { Run } from "shared" +import { isOpenAIMessage, unCamelObject } from "@/src/utils/misc"; +import { Parser } from "@json2csv/plainjs"; +import { Context } from "koa"; +import { Run } from "shared"; interface ExportType { - sql: any - ctx: Context - runs: Array - projectId: string + sql: any; + ctx: Context; + runs: Array; + projectId: string; } interface TraceRun extends Run { - children: TraceRun[] + children: TraceRun[]; } function cleanOpenAiMessage(message: any) { @@ -82,8 +82,8 @@ async function getRelatedRuns(sql: any, runId: string, projectId: string) { rr.metadata from related_runs rr; - ` - return related + `; + return related; } function getTraceChildren(run: Run, runs: Run[]): TraceRun { @@ -101,8 +101,8 @@ function getTraceChildren(run: Run, runs: Run[]): TraceRun { return { ...run, - children: childRuns.map((subRun) => getTraceChildren(subRun, runs)) - } + children: childRuns.map((subRun) => getTraceChildren(subRun, runs)), + }; } export async function fileExport( @@ -111,15 +111,15 @@ export async function fileExport( exportType?: "trace" | "thread", ) { if (exportFormat === "csv") { - const data = runs.length > 0 ? runs : [{}] - const parser = new Parser() - const csv = parser.parse(data) - const buffer = Buffer.from(csv, "utf-8") + const data = runs.length > 0 ? runs : [{}]; + const parser = new Parser(); + const csv = parser.parse(data); + const buffer = Buffer.from(csv, "utf-8"); ctx.set("Content-Type", "text/csv"); ctx.set("Content-Disposition", 'attachment; filename="export.csv"'); - ctx.body = buffer + ctx.body = buffer; } else if (exportFormat === "ojsonl") { const jsonl = runs // make sure it's a valid row of OpenAI messages @@ -148,16 +148,16 @@ export async function fileExport( ctx.set("Content-Type", "application/jsonl"); ctx.set("Content-Disposition", 'attachment; filename="export.jsonl"'); - ctx.body = buffer + ctx.body = buffer; } else if (exportFormat === "jsonl") { const jsonl = ( await Promise.all( runs.map(async (row) => { if (exportType === "trace") { - const related = await getRelatedRuns(sql, row.id, projectId) - row = getTraceChildren(row, related) + const related = await getRelatedRuns(sql, row.id, projectId); + row = getTraceChildren(row, related); } - return JSON.stringify(row) + return JSON.stringify(row); }), ) ) From 42ff2ac4b1d72727f6e2a4d8c30060caa8a24840 Mon Sep 17 00:00:00 2001 From: 7HR4IZ3 Date: Wed, 16 Oct 2024 19:27:21 -0700 Subject: [PATCH 3/9] refactor: code cleanup --- packages/backend/src/api/v1/runs/index.ts | 39 +++++++++++------------ 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/packages/backend/src/api/v1/runs/index.ts b/packages/backend/src/api/v1/runs/index.ts index 2d6fcb2b1..960e69daa 100644 --- a/packages/backend/src/api/v1/runs/index.ts +++ b/packages/backend/src/api/v1/runs/index.ts @@ -108,23 +108,23 @@ const runs = new Router({ }); interface Query { - type?: "llm" | "trace" | "thread" - search?: string - models?: string[] - tags?: string[] - tokens?: string - exportType?: "trace" | "thread" - exportFormat?: "csv" | "ojsonl" | "jsonl" - minDuration?: string - maxDuration?: string - startTime?: string - endTime?: string - parentRunId?: string - limit?: string - page?: string - order?: string - sortField?: string - sortDirection?: string + type?: "llm" | "trace" | "thread"; + search?: string; + models?: string[]; + tags?: string[]; + tokens?: string; + exportType?: "trace" | "thread"; + exportFormat?: "csv" | "ojsonl" | "jsonl"; + minDuration?: string; + maxDuration?: string; + startTime?: string; + endTime?: string; + parentRunId?: string; + limit?: string; + page?: string; + order?: string; + sortField?: string; + sortDirection?: string; } function processInput(input: unknown) { @@ -550,10 +550,7 @@ runs.get("/", async (ctx: Context) => { const runs = rows.map(formatRun); if (exportFormat) { - return fileExport( - { ctx, sql, runs, projectId }, - exportFormat, exportType, - ) + return fileExport({ ctx, sql, runs, projectId }, exportFormat, exportType); } const total = await sql` From 58a1f54b79055600929dbf2e554b6692e2b7972a Mon Sep 17 00:00:00 2001 From: Hugues Chocart Date: Thu, 17 Oct 2024 10:47:28 +0800 Subject: [PATCH 4/9] typo Signed-off-by: Hugues Chocart --- packages/backend/src/api/v1/runs/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/api/v1/runs/index.ts b/packages/backend/src/api/v1/runs/index.ts index 960e69daa..a3d1659c8 100644 --- a/packages/backend/src/api/v1/runs/index.ts +++ b/packages/backend/src/api/v1/runs/index.ts @@ -613,7 +613,7 @@ runs.get("/count", async (ctx: Context) => { with runs as ( select distinct on (r.id) r.*, - eu.id as user_id,2 + eu.id as user_id, eu.external_id as user_external_id, eu.created_at as user_created_at, eu.last_seen as user_last_seen, From 62ba9c68b04945efce829b45fd2be6655c092f41 Mon Sep 17 00:00:00 2001 From: 7HR4IZ3 Date: Fri, 18 Oct 2024 05:26:16 -0700 Subject: [PATCH 5/9] feat: export streaming via cursor --- packages/backend/src/api/v1/runs/export.ts | 20 ++++++++++++++------ packages/backend/src/api/v1/runs/index.ts | 20 ++++++++++++-------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/packages/backend/src/api/v1/runs/export.ts b/packages/backend/src/api/v1/runs/export.ts index 920683064..20fe730da 100644 --- a/packages/backend/src/api/v1/runs/export.ts +++ b/packages/backend/src/api/v1/runs/export.ts @@ -3,11 +3,14 @@ import { Parser } from "@json2csv/plainjs"; import { Context } from "koa"; import { Run } from "shared"; +import { Writable, Readable } from "stream"; + interface ExportType { sql: any; ctx: Context; - runs: Array; projectId: string; + cursor?: any; + formatRun: (run: any) => any; } interface TraceRun extends Run { @@ -106,20 +109,25 @@ function getTraceChildren(run: Run, runs: Run[]): TraceRun { } export async function fileExport( - { ctx, sql, runs, projectId }: ExportType, + { ctx, sql, cursor, formatRun, projectId }: ExportType, exportFormat: "csv" | "ojsonl" | "jsonl", exportType?: "trace" | "thread", ) { if (exportFormat === "csv") { - const data = runs.length > 0 ? runs : [{}]; const parser = new Parser(); - const csv = parser.parse(data); - const buffer = Buffer.from(csv, "utf-8"); ctx.set("Content-Type", "text/csv"); ctx.set("Content-Disposition", 'attachment; filename="export.csv"'); - ctx.body = buffer; + const stream = Readable.from({ + async *[Symbol.asyncIterator]() { + for await (const [row] of cursor) { + yield parser.parse(formatRun(row)); + } + }, + }); + ctx.body = stream; + } else if (exportFormat === "ojsonl") { const jsonl = runs // make sure it's a valid row of OpenAI messages diff --git a/packages/backend/src/api/v1/runs/index.ts b/packages/backend/src/api/v1/runs/index.ts index a3d1659c8..ef74db311 100644 --- a/packages/backend/src/api/v1/runs/index.ts +++ b/packages/backend/src/api/v1/runs/index.ts @@ -461,7 +461,7 @@ runs.get("/", async (ctx: Context) => { deserializedChecks?.length && deserializedChecks.length > 1 // first is always ["AND"] ? convertChecksToSQL(deserializedChecks) : sql`r.type = 'llm'`; // default to type llm - + 1; const { limit = "50", page = "0", @@ -489,7 +489,7 @@ runs.get("/", async (ctx: Context) => { orderByClause = `${sortMapping[sortField]} ${direction} nulls last`; } - const rows = await sql` + const query = sql` with runs as ( select distinct r.*, @@ -532,8 +532,7 @@ runs.get("/", async (ctx: Context) => { 'updatedAt', er.updated_at ) ) filter (where er.run_id is not null), '{}') as evaluation_results - from - runs r + from runs r left join evaluation_result_v2 er on r.id = er.run_id left join evaluator e on er.evaluator_id = e.id group by r.id @@ -544,15 +543,20 @@ runs.get("/", async (ctx: Context) => { from runs r left join evaluation_results er on r.id = er.id - `; - const runs = rows.map(formatRun); - if (exportFormat) { - return fileExport({ ctx, sql, runs, projectId }, exportFormat, exportType); + const cursor = query.cursor(); + return fileExport( + { ctx, sql, cursor, formatRun, projectId }, + exportFormat, + exportType, + ); } + const rows = await query; + const runs = rows.map(formatRun); + const total = await sql` with runs as ( select distinct on (r.id) From 238c5255d72dbcc6673e89ba195b7e18bfbf135d Mon Sep 17 00:00:00 2001 From: 7HR4IZ3 Date: Fri, 18 Oct 2024 05:26:46 -0700 Subject: [PATCH 6/9] feat: export streaming via cursor --- packages/backend/src/api/v1/runs/export.ts | 81 ++++++++++------------ 1 file changed, 38 insertions(+), 43 deletions(-) diff --git a/packages/backend/src/api/v1/runs/export.ts b/packages/backend/src/api/v1/runs/export.ts index 20fe730da..352d2bbbf 100644 --- a/packages/backend/src/api/v1/runs/export.ts +++ b/packages/backend/src/api/v1/runs/export.ts @@ -127,57 +127,52 @@ export async function fileExport( }, }); ctx.body = stream; - } else if (exportFormat === "ojsonl") { - const jsonl = runs - // make sure it's a valid row of OpenAI messages - .filter((row) => { - return ( - validateOpenAiMessages(row.input).length && - validateOpenAiMessages(row.output).length - ); - }) - // convert to JSON string format { messages: [input, output]} - .map((row) => - unCamelObject({ - messages: [ - ...validateOpenAiMessages(row.input), - ...validateOpenAiMessages(row.output), - ].map(cleanOpenAiMessage), - }), - ) - - .map((row) => JSON.stringify(row)) - .filter((line) => line.length > 0) - .join("\n"); - - const buffer = Buffer.from(jsonl, "utf-8"); - ctx.set("Content-Type", "application/jsonl"); ctx.set("Content-Disposition", 'attachment; filename="export.jsonl"'); - ctx.body = buffer; - } else if (exportFormat === "jsonl") { - const jsonl = ( - await Promise.all( - runs.map(async (row) => { - if (exportType === "trace") { - const related = await getRelatedRuns(sql, row.id, projectId); - row = getTraceChildren(row, related); + const stream = Readable.from({ + async *[Symbol.asyncIterator]() { + for await (const [row] of cursor) { + // make sure it's a valid row of OpenAI messages + const input = validateOpenAiMessages(row.input); + const output = validateOpenAiMessages(row.output); + + if (input.length && output.length) { + // convert to JSON string format { messages: [input, output]} + const line = JSON.stringify(unCamelObject({ + messages: [...input, ...output] + .map(cleanOpenAiMessage), + })); + if (line.length > 0) { + yield line + "\n"; + } } - return JSON.stringify(row); - }), - ) - ) - .filter((line) => line.length > 0) - .join("\n"); - - const buffer = Buffer.from(jsonl, "utf-8"); - + } + }, + }); + ctx.body = stream; + } else if (exportFormat === "jsonl") { ctx.set("Content-Type", "application/jsonl"); ctx.set("Content-Disposition", 'attachment; filename="export.jsonl"'); - ctx.body = buffer; + const stream = Readable.from({ + async *[Symbol.asyncIterator]() { + for await (const [row] of cursor) { + let line; + if (exportType === "trace") { + const related = await getRelatedRuns(sql, row.id, projectId); + line = JSON.stringify(getTraceChildren(row, related)); + } else { + line = JSON.stringify(row); + } + if (line.length > 0) { + yield line + "\n"; + } + } + }, + }); + ctx.body = stream; } else { ctx.throw(400, "Invalid export type"); } From a5d0186c72ffea99c1f39903a6adbae6268cdac6 Mon Sep 17 00:00:00 2001 From: 7HR4IZ3 Date: Fri, 18 Oct 2024 05:30:46 -0700 Subject: [PATCH 7/9] refactor: code cleanup --- packages/backend/src/api/v1/runs/index.ts | 2 +- packages/frontend/pages/logs/index.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/backend/src/api/v1/runs/index.ts b/packages/backend/src/api/v1/runs/index.ts index ef74db311..7b4c73da4 100644 --- a/packages/backend/src/api/v1/runs/index.ts +++ b/packages/backend/src/api/v1/runs/index.ts @@ -461,7 +461,7 @@ runs.get("/", async (ctx: Context) => { deserializedChecks?.length && deserializedChecks.length > 1 // first is always ["AND"] ? convertChecksToSQL(deserializedChecks) : sql`r.type = 'llm'`; // default to type llm - 1; + const { limit = "50", page = "0", diff --git a/packages/frontend/pages/logs/index.tsx b/packages/frontend/pages/logs/index.tsx index 18e1143ca..b938ce9a5 100644 --- a/packages/frontend/pages/logs/index.tsx +++ b/packages/frontend/pages/logs/index.tsx @@ -105,7 +105,7 @@ export const defaultColumns = { nameColumn("Agent"), durationColumn(), userColumn(), - feedbackColumn(false), + feedbackColumn(true), tagsColumn(), inputColumn("Input"), outputColumn(), @@ -115,7 +115,7 @@ export const defaultColumns = { userColumn(), inputColumn("Last Message"), tagsColumn(), - feedbackColumn(false), + feedbackColumn(true), ], }; From 1dc2de1a3abd39b450463d4edc98fc6f6c0d1fa0 Mon Sep 17 00:00:00 2001 From: 7HR4IZ3 Date: Sun, 20 Oct 2024 08:52:53 -0700 Subject: [PATCH 8/9] feat: support for streaming export to filesystem --- package.json | 4 +++- packages/frontend/utils/fetcher.ts | 24 +++++++++++++++--------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 92f8332e2..0e29a6352 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,10 @@ "packages/*" ], "dependencies": { + "@types/streamsaver": "^2.0.5", "concurrently": "^8.2.2", - "patch-package": "^8.0.0" + "patch-package": "^8.0.0", + "streamsaver": "^2.0.6" }, "devDependencies": { "@playwright/test": "^1.47.0", diff --git a/packages/frontend/utils/fetcher.ts b/packages/frontend/utils/fetcher.ts index 5f9b1e75c..d70871c8d 100644 --- a/packages/frontend/utils/fetcher.ts +++ b/packages/frontend/utils/fetcher.ts @@ -45,21 +45,27 @@ async function getFile(path) { throw new Error(message); } + console.log(res.headers) + const contentType = res.headers.get("Content-Type") as string; const fileExtension = contentType.split("/")[1]; - const blob = await res.blob(); - const url = window.URL.createObjectURL(blob); + const { createWriteStream } = await import('streamsaver'); + const fileStream = createWriteStream(`export.${fileExtension}`); + await res.body?.pipeTo(fileStream); + + // const blob = await res.blob(); + // const url = window.URL.createObjectURL(blob); - const a = document.createElement("a"); - a.href = url; - a.download = `export.${fileExtension}`; + // const a = document.createElement("a"); + // a.href = url; + // a.download = `export.${fileExtension}`; - document.body.appendChild(a); - a.click(); - a.remove(); + // document.body.appendChild(a); + // a.click(); + // a.remove(); - window.URL.revokeObjectURL(url); + // window.URL.revokeObjectURL(url); } async function getStream(url, args, onChunk) { From c2f7956bb746af3bca8e3528c17a2a3aa16907f7 Mon Sep 17 00:00:00 2001 From: hughcrt Date: Mon, 21 Oct 2024 15:28:27 +0800 Subject: [PATCH 9/9] cleanup --- package-lock.json | 428 +++++++++++++---------------- package.json | 4 +- packages/backend/package.json | 1 + packages/frontend/package.json | 4 +- packages/frontend/utils/fetcher.ts | 18 +- 5 files changed, 194 insertions(+), 261 deletions(-) diff --git a/package-lock.json b/package-lock.json index bfe2f16a0..1726bc576 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,9 +41,9 @@ } }, "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { - "version": "18.19.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.55.tgz", - "integrity": "sha512-zzw5Vw52205Zr/nmErSEkN5FLqXPuKX/k5d1D7RKHATGqU7y6YfX9QxZraUzUrFGqH6XzOzG196BC35ltJC4Cw==", + "version": "18.19.57", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.57.tgz", + "integrity": "sha512-I2ioBd/IPrYDMv9UNR5NlPElOZ68QB7yY5V2EsLtSrTO0LM0PnCEFF9biLWHf5k+sIy4ohueCV9t4gk1AEdlVA==", "license": "MIT", "dependencies": { "undici-types": "~5.26.4" @@ -269,17 +269,17 @@ } }, "node_modules/@aws-sdk/client-comprehend": { - "version": "3.670.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-comprehend/-/client-comprehend-3.670.0.tgz", - "integrity": "sha512-YdJ5yPDLYPPDPP0kny/zRrO5xmJKjxcNxiI6lwaClDZ+IQQ22rtEDpd8t2c3GX63uGwT7BGhUkMWwAuGz+mVdw==", + "version": "3.675.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-comprehend/-/client-comprehend-3.675.0.tgz", + "integrity": "sha512-Ph4moQx+EpC3Cp5AxpTh952R98UzIfa53b5eJfLytuKUPcmZJSr0SRMwbJUVOfb1ayU5B/L69+nx3KjMJ7ANhg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.670.0", - "@aws-sdk/client-sts": "3.670.0", + "@aws-sdk/client-sso-oidc": "3.675.0", + "@aws-sdk/client-sts": "3.675.0", "@aws-sdk/core": "3.667.0", - "@aws-sdk/credential-provider-node": "3.670.0", + "@aws-sdk/credential-provider-node": "3.675.0", "@aws-sdk/middleware-host-header": "3.667.0", "@aws-sdk/middleware-logger": "3.667.0", "@aws-sdk/middleware-recursion-detection": "3.667.0", @@ -287,7 +287,7 @@ "@aws-sdk/region-config-resolver": "3.667.0", "@aws-sdk/types": "3.667.0", "@aws-sdk/util-endpoints": "3.667.0", - "@aws-sdk/util-user-agent-browser": "3.670.0", + "@aws-sdk/util-user-agent-browser": "3.675.0", "@aws-sdk/util-user-agent-node": "3.669.0", "@smithy/config-resolver": "^3.0.9", "@smithy/core": "^2.4.8", @@ -314,6 +314,7 @@ "@smithy/util-middleware": "^3.0.7", "@smithy/util-retry": "^3.0.7", "@smithy/util-utf8": "^3.0.0", + "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -322,9 +323,9 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.670.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.670.0.tgz", - "integrity": "sha512-J+oz6uSsDvk4pimMDnKJb1wsV216zTrejvMTIL4RhUD1QPIVVOpteTdUShcjZUIZnkcJZGI+cym/SFK0kuzTpg==", + "version": "3.675.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.675.0.tgz", + "integrity": "sha512-2goBCEr4acZJ1YJ69eWPTsIfZUbO7enog+lBA5kZShDiwovqzwYSHSlf6OGz4ETs2xT1n7n+QfKY0p+TluTfEw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -337,7 +338,7 @@ "@aws-sdk/region-config-resolver": "3.667.0", "@aws-sdk/types": "3.667.0", "@aws-sdk/util-endpoints": "3.667.0", - "@aws-sdk/util-user-agent-browser": "3.670.0", + "@aws-sdk/util-user-agent-browser": "3.675.0", "@aws-sdk/util-user-agent-node": "3.669.0", "@smithy/config-resolver": "^3.0.9", "@smithy/core": "^2.4.8", @@ -371,15 +372,15 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.670.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.670.0.tgz", - "integrity": "sha512-4qDK2L36Q4J1lfemaHHd9ZxqKRaos3STp44qPAHf/8QyX6Uk5sXgZNVO2yWM7SIEtVKwwBh/fZAsdBkGPBfZcw==", + "version": "3.675.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.675.0.tgz", + "integrity": "sha512-4kEcaa2P/BFz+xy5tagbtzM08gbjHXyYqW+n6SJuUFK7N6bZNnA4cu1hVgHcqOqk8Dbwv7fiseGT0x3Hhqjwqg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.667.0", - "@aws-sdk/credential-provider-node": "3.670.0", + "@aws-sdk/credential-provider-node": "3.675.0", "@aws-sdk/middleware-host-header": "3.667.0", "@aws-sdk/middleware-logger": "3.667.0", "@aws-sdk/middleware-recursion-detection": "3.667.0", @@ -387,7 +388,7 @@ "@aws-sdk/region-config-resolver": "3.667.0", "@aws-sdk/types": "3.667.0", "@aws-sdk/util-endpoints": "3.667.0", - "@aws-sdk/util-user-agent-browser": "3.670.0", + "@aws-sdk/util-user-agent-browser": "3.675.0", "@aws-sdk/util-user-agent-node": "3.669.0", "@smithy/config-resolver": "^3.0.9", "@smithy/core": "^2.4.8", @@ -420,20 +421,20 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.670.0" + "@aws-sdk/client-sts": "^3.675.0" } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.670.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.670.0.tgz", - "integrity": "sha512-bExrNo8ZVWorS3cjMZKQnA2HWqDmAzcZoSN/cPVoPFNkHwdl1lzPxvcLzmhpIr48JHgKfybBjrbluDZfIYeEog==", + "version": "3.675.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.675.0.tgz", + "integrity": "sha512-zgjyR4GyuONeDGJBKNt9lFJ8HfDX7rpxZZVR7LSXr9lUkjf6vUGgD2k/K4UAoOTWCKKCor6TA562ezGlA8su6Q==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.670.0", + "@aws-sdk/client-sso-oidc": "3.675.0", "@aws-sdk/core": "3.667.0", - "@aws-sdk/credential-provider-node": "3.670.0", + "@aws-sdk/credential-provider-node": "3.675.0", "@aws-sdk/middleware-host-header": "3.667.0", "@aws-sdk/middleware-logger": "3.667.0", "@aws-sdk/middleware-recursion-detection": "3.667.0", @@ -441,7 +442,7 @@ "@aws-sdk/region-config-resolver": "3.667.0", "@aws-sdk/types": "3.667.0", "@aws-sdk/util-endpoints": "3.667.0", - "@aws-sdk/util-user-agent-browser": "3.670.0", + "@aws-sdk/util-user-agent-browser": "3.675.0", "@aws-sdk/util-user-agent-node": "3.669.0", "@smithy/config-resolver": "^3.0.9", "@smithy/core": "^2.4.8", @@ -534,16 +535,16 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.670.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.670.0.tgz", - "integrity": "sha512-TB1gacUj75leaTt2JsCTzygDSIk4ksv9uZoR7VenlgFPRktyOeT+fapwIVBeB2Qg7b9uxAY2K5XkKstDZyBEEw==", + "version": "3.675.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.675.0.tgz", + "integrity": "sha512-kCBlC6grpbpCvgowk9T4JHZxJ88VfN0r77bDZClcadFRAKQ8UHyO02zhgFCfUdnU1lNv1mr3ngEcGN7XzJlYWA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.667.0", "@aws-sdk/credential-provider-env": "3.667.0", "@aws-sdk/credential-provider-http": "3.667.0", "@aws-sdk/credential-provider-process": "3.667.0", - "@aws-sdk/credential-provider-sso": "3.670.0", + "@aws-sdk/credential-provider-sso": "3.675.0", "@aws-sdk/credential-provider-web-identity": "3.667.0", "@aws-sdk/types": "3.667.0", "@smithy/credential-provider-imds": "^3.2.4", @@ -556,20 +557,20 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.670.0" + "@aws-sdk/client-sts": "^3.675.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.670.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.670.0.tgz", - "integrity": "sha512-zwNrRYzubk4CaZ7zebeDhxsm8QtNWkbGKopZPOaZSnd5uqUGRcmx4ccVRngWUK68XDP44aEUWC8iU5Pc7btpHQ==", + "version": "3.675.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.675.0.tgz", + "integrity": "sha512-VO1WVZCDmAYu4sY/6qIBzdm5vJTxLhWKJWvL5kVFfSe8WiNNoHlTqYYUK9vAm/JYpIgFLTefPbIc5W4MK7o6Pg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.667.0", "@aws-sdk/credential-provider-http": "3.667.0", - "@aws-sdk/credential-provider-ini": "3.670.0", + "@aws-sdk/credential-provider-ini": "3.675.0", "@aws-sdk/credential-provider-process": "3.667.0", - "@aws-sdk/credential-provider-sso": "3.670.0", + "@aws-sdk/credential-provider-sso": "3.675.0", "@aws-sdk/credential-provider-web-identity": "3.667.0", "@aws-sdk/types": "3.667.0", "@smithy/credential-provider-imds": "^3.2.4", @@ -600,12 +601,12 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.670.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.670.0.tgz", - "integrity": "sha512-5PkA8BOy4q57Vhe9AESoHKZ7vjRbElNPKjXA4qC01xY+DitClRFz4O3B9sMzFp0PHlz9nDVSXXKgq0yzF/nAag==", + "version": "3.675.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.675.0.tgz", + "integrity": "sha512-p/EE2c0ebSgRhg1Fe1OH2+xNl7j1P4DTc7kZy1mX1NJ72fkqnGgBuf1vk5J9RmiRpbauPNMlm+xohjkGS7iodA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.670.0", + "@aws-sdk/client-sso": "3.675.0", "@aws-sdk/core": "3.667.0", "@aws-sdk/token-providers": "3.667.0", "@aws-sdk/types": "3.667.0", @@ -776,9 +777,9 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.670.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.670.0.tgz", - "integrity": "sha512-iRynWWazqEcCKwGMcQcywKTDLdLvqts1Yx474U64I9OKQXXwhOwhXbF5CAPSRta86lkVNAVYJa/0Bsv45pNn1A==", + "version": "3.675.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.675.0.tgz", + "integrity": "sha512-HW4vGfRiX54RLcsYjLuAhcBBJ6lRVEZd7njfGpAwBB9s7BH8t48vrpYbyA5XbbqbTvXfYBnugQCUw9HWjEa1ww==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.667.0", @@ -1359,9 +1360,9 @@ } }, "node_modules/@floating-ui/react": { - "version": "0.26.24", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.24.tgz", - "integrity": "sha512-2ly0pCkZIGEQUq5H8bBK0XJmc1xIK/RM3tvVzY3GBER7IOD1UgmC2Y2tjj4AuS+TC+vTE1KJv2053290jua0Sw==", + "version": "0.26.25", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.25.tgz", + "integrity": "sha512-hZOmgN0NTOzOuZxI1oIrDu3Gcl8WViIkvPMpB4xdd4QD6xAMtwgwr3VPoiyH/bLtRcS1cDnhxLSD1NsMJmwh/A==", "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.1.2", @@ -1750,22 +1751,22 @@ "link": true }, "node_modules/@mantine/charts": { - "version": "7.13.2", - "resolved": "https://registry.npmjs.org/@mantine/charts/-/charts-7.13.2.tgz", - "integrity": "sha512-rfaf45F58Cx5k7X9qN5yV2ZhVFAIB8i+1S/DvNE3uUflGmrevHuuNbNDDbYtQOw8ObL959rtSWOyL1SmC11D0A==", + "version": "7.13.3", + "resolved": "https://registry.npmjs.org/@mantine/charts/-/charts-7.13.3.tgz", + "integrity": "sha512-m/5VuIxLykIozJe1Zi8+c4+I9ls94EOC+5w4Mg0tL0mIev6vZA+cPKUyZBQskA2xs2D8fnWgq/7B/ETCB1/EjA==", "license": "MIT", "peerDependencies": { - "@mantine/core": "7.13.2", - "@mantine/hooks": "7.13.2", + "@mantine/core": "7.13.3", + "@mantine/hooks": "7.13.3", "react": "^18.2.0", "react-dom": "^18.2.0", "recharts": "^2.10.3" } }, "node_modules/@mantine/core": { - "version": "7.13.2", - "resolved": "https://registry.npmjs.org/@mantine/core/-/core-7.13.2.tgz", - "integrity": "sha512-nD8oKIal+KdthqF074+ZG21035QBEAKso2zK9D6zWxRTLVCjLCNSc5JSXrXLrdBTnvPQGY26yunX4+MEPlmrHg==", + "version": "7.13.3", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-7.13.3.tgz", + "integrity": "sha512-IV8xSr6rFQefKr2iOEhYYkJ6rZTDEp71qNkAfn90toSNjgT/2bgnqOxXwxqZ3bwo9DyNOAbEDzs1EfdIzln5aA==", "license": "MIT", "dependencies": { "@floating-ui/react": "^0.26.9", @@ -1776,31 +1777,31 @@ "type-fest": "^4.12.0" }, "peerDependencies": { - "@mantine/hooks": "7.13.2", + "@mantine/hooks": "7.13.3", "react": "^18.2.0", "react-dom": "^18.2.0" } }, "node_modules/@mantine/dates": { - "version": "7.13.2", - "resolved": "https://registry.npmjs.org/@mantine/dates/-/dates-7.13.2.tgz", - "integrity": "sha512-FSLGTM5s47mmHnIudRxrMXjE1EO56Qp01nATa9OwqVgVYVxxJ5xvS1ys5yxSGSE1jQk+3kyYQXHyLFcqbFhIVA==", + "version": "7.13.3", + "resolved": "https://registry.npmjs.org/@mantine/dates/-/dates-7.13.3.tgz", + "integrity": "sha512-IjClxPcenDq2/iAxhaZyjrCpMhc9ybLfvh4YwEmjWg+pSfdIDtc9VkMSnXv2aYChLybUjNQmIcPibU7Vdu4Z8w==", "license": "MIT", "dependencies": { "clsx": "^2.1.1" }, "peerDependencies": { - "@mantine/core": "7.13.2", - "@mantine/hooks": "7.13.2", + "@mantine/core": "7.13.3", + "@mantine/hooks": "7.13.3", "dayjs": ">=1.0.0", "react": "^18.2.0", "react-dom": "^18.2.0" } }, "node_modules/@mantine/form": { - "version": "7.13.2", - "resolved": "https://registry.npmjs.org/@mantine/form/-/form-7.13.2.tgz", - "integrity": "sha512-jx7st64CzzzwdKwhRw/rHqQ/ReGa5tW9PnId5sdE5fhf9QJjjiNWfQjGUFnA7WSEGlOTbwrznKA45ro5lFY6CA==", + "version": "7.13.3", + "resolved": "https://registry.npmjs.org/@mantine/form/-/form-7.13.3.tgz", + "integrity": "sha512-9OsXlrKD8R2QadHt6ueIXxmot9xf9I9HBO0rynmuZlOj76N7l9PH1KYWLG8TQ9UU32lNnuYecyilF4Ce9fp0Fw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -1811,46 +1812,46 @@ } }, "node_modules/@mantine/hooks": { - "version": "7.13.2", - "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-7.13.2.tgz", - "integrity": "sha512-NKfGl2sKZw6zF//AfAFJrVDftjg7DKCn0h8rwJBIZCKi9axhwlV0Mvlqe2dep8QuM7O/uLLJSymSKIv1gaxIJg==", + "version": "7.13.3", + "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-7.13.3.tgz", + "integrity": "sha512-r2c+Z8CdvPKFeOwg6mSJmxOp9K/ave5ZFR7eJbgv4wQU8K1CAS5f5ven9K5uUX8Vf9B5dFnSaSgYp9UY3vOWTw==", "license": "MIT", "peerDependencies": { "react": "^18.2.0" } }, "node_modules/@mantine/modals": { - "version": "7.13.2", - "resolved": "https://registry.npmjs.org/@mantine/modals/-/modals-7.13.2.tgz", - "integrity": "sha512-rKkXss1ZYAbkSi9ZcUsBY/HyGjgKk+bT8TXzLoClBRgg6uyto+/2lT9M5e4Nao+2PsjsRnWI/ZgddNZKiSaNgQ==", + "version": "7.13.3", + "resolved": "https://registry.npmjs.org/@mantine/modals/-/modals-7.13.3.tgz", + "integrity": "sha512-XAx724ZLqQVnsaH72sCoZD7NKcx2haUgAv0G52hq0MbVWWig2rbzN5YBvqGw+kuKgwp20VH+6oLSVvvB+4SMzQ==", "license": "MIT", "peerDependencies": { - "@mantine/core": "7.13.2", - "@mantine/hooks": "7.13.2", + "@mantine/core": "7.13.3", + "@mantine/hooks": "7.13.3", "react": "^18.2.0", "react-dom": "^18.2.0" } }, "node_modules/@mantine/notifications": { - "version": "7.13.2", - "resolved": "https://registry.npmjs.org/@mantine/notifications/-/notifications-7.13.2.tgz", - "integrity": "sha512-14vFJtR0wjO8Won96UMLxIGmKetR0ocBxcghtuGh6+wnXt6r/ezfQKsdGkkNj6w91I+0Nl9jspcxEekE5q2tBQ==", + "version": "7.13.3", + "resolved": "https://registry.npmjs.org/@mantine/notifications/-/notifications-7.13.3.tgz", + "integrity": "sha512-G01Bf0g6zA+K6ZdBOIxhGIlpi3qITs6W5Z0fYTSQkzLcJSfECdR5KgRvNpzcx2ESTT8BfJJMsLySwh+WTzcoxw==", "license": "MIT", "dependencies": { - "@mantine/store": "7.13.2", + "@mantine/store": "7.13.3", "react-transition-group": "4.4.5" }, "peerDependencies": { - "@mantine/core": "7.13.2", - "@mantine/hooks": "7.13.2", + "@mantine/core": "7.13.3", + "@mantine/hooks": "7.13.3", "react": "^18.2.0", "react-dom": "^18.2.0" } }, "node_modules/@mantine/store": { - "version": "7.13.2", - "resolved": "https://registry.npmjs.org/@mantine/store/-/store-7.13.2.tgz", - "integrity": "sha512-JcBGOqRynYiRWzw1rYdmViB/lfeYSec2EXVdSt4eJv+RPICsjjuqrIc3sNzfqJEGxcN4hGSlaeBriSh05K+vNQ==", + "version": "7.13.3", + "resolved": "https://registry.npmjs.org/@mantine/store/-/store-7.13.3.tgz", + "integrity": "sha512-95nAgH6APhak1OwP2W3ogdWBiWkIDhDSbQEm2G9LTJLIJxzWSm1mLe5uDWluVEPZW2XFx137McuJb58i1A+QhQ==", "license": "MIT", "peerDependencies": { "react": "^18.2.0" @@ -2133,17 +2134,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@phc/format": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz", @@ -2164,13 +2154,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.0.tgz", - "integrity": "sha512-W5lhqPUVPqhtc/ySvZI5Q8X2ztBOUgZ8LbAFy0JQgrXZs2xaILrUcNO3rQjwbLPfGK13+rZsDa1FpG+tqYkT5w==", + "version": "1.48.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.1.tgz", + "integrity": "sha512-s9RtWoxkOLmRJdw3oFvhFbs9OJS0BzrLUc8Hf6l2UdCNd1rqeEyD4BhCJkvzeEoD1FsK4mirsWwGerhVmYKtZg==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.48.0" + "playwright": "1.48.1" }, "bin": { "playwright": "cli.js" @@ -2481,7 +2471,7 @@ "node": ">=8" } }, - "node_modules/@sentry-internal/tracing/node_modules/@sentry/core": { + "node_modules/@sentry/core": { "version": "7.119.2", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.119.2.tgz", "integrity": "sha512-hQr3d2yWq/2lMvoyBPOwXw1IHqTrCjOsU1vYKhAa6w9vGbJZFGhKGGE2KEi/92c3gqGn+gW/PC7cV6waCTDuVA==", @@ -2494,27 +2484,6 @@ "node": ">=8" } }, - "node_modules/@sentry-internal/tracing/node_modules/@sentry/types": { - "version": "7.119.2", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.119.2.tgz", - "integrity": "sha512-ydq1tWsdG7QW+yFaTp0gFaowMLNVikIqM70wxWNK+u98QzKnVY/3XTixxNLsUtnAB4Y+isAzFhrc6Vb5GFdFeg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry-internal/tracing/node_modules/@sentry/utils": { - "version": "7.119.2", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.119.2.tgz", - "integrity": "sha512-TLdUCvcNgzKP0r9YD7tgCL1PEUp42TObISridsPJ5rhpVGQJvpr+Six0zIkfDUxerLYWZoK8QMm9KgFlPLNQzA==", - "license": "MIT", - "dependencies": { - "@sentry/types": "7.119.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@sentry/integrations": { "version": "7.119.2", "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.119.2.tgz", @@ -2530,20 +2499,7 @@ "node": ">=8" } }, - "node_modules/@sentry/integrations/node_modules/@sentry/core": { - "version": "7.119.2", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.119.2.tgz", - "integrity": "sha512-hQr3d2yWq/2lMvoyBPOwXw1IHqTrCjOsU1vYKhAa6w9vGbJZFGhKGGE2KEi/92c3gqGn+gW/PC7cV6waCTDuVA==", - "license": "MIT", - "dependencies": { - "@sentry/types": "7.119.2", - "@sentry/utils": "7.119.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/integrations/node_modules/@sentry/types": { + "node_modules/@sentry/types": { "version": "7.119.2", "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.119.2.tgz", "integrity": "sha512-ydq1tWsdG7QW+yFaTp0gFaowMLNVikIqM70wxWNK+u98QzKnVY/3XTixxNLsUtnAB4Y+isAzFhrc6Vb5GFdFeg==", @@ -2552,7 +2508,7 @@ "node": ">=8" } }, - "node_modules/@sentry/integrations/node_modules/@sentry/utils": { + "node_modules/@sentry/utils": { "version": "7.119.2", "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.119.2.tgz", "integrity": "sha512-TLdUCvcNgzKP0r9YD7tgCL1PEUp42TObISridsPJ5rhpVGQJvpr+Six0zIkfDUxerLYWZoK8QMm9KgFlPLNQzA==", @@ -3564,9 +3520,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "version": "22.7.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.7.tgz", + "integrity": "sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q==", "license": "MIT", "dependencies": { "undici-types": "~6.19.2" @@ -3706,6 +3662,13 @@ "@types/send": "*" } }, + "node_modules/@types/streamsaver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/streamsaver/-/streamsaver-2.0.5.tgz", + "integrity": "sha512-93o0zjV8swEhR2YI57h/2ytbJF8bJh7sI9GNB02TLJHdM4fWDxZuChwfWhyD8vt2ub4kw4rsfZ0C0yAUX+3gcg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/swagger-jsdoc": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/@types/swagger-jsdoc/-/swagger-jsdoc-6.0.4.tgz", @@ -3719,6 +3682,12 @@ "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "license": "MIT" }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "license": "MIT" + }, "node_modules/@types/yargs": { "version": "15.0.19", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", @@ -3797,9 +3766,9 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", + "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -4026,13 +3995,12 @@ } }, "node_modules/bare-stream": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.0.tgz", - "integrity": "sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.1.tgz", + "integrity": "sha512-Vm8kAeOcfzHPTH8sq0tHBnUqYrkXdroaBVVylqFT4cF5wnMfKEIxxy2jIGu2zKVNl9P8MAP9XBWwXJ9N2+jfEw==", "license": "Apache-2.0", "optional": true, "dependencies": { - "b4a": "^1.6.6", "streamx": "^2.20.0" } }, @@ -4375,9 +4343,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001668", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz", - "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==", + "version": "1.0.30001669", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", + "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", "funding": [ { "type": "opencollective", @@ -4765,6 +4733,17 @@ "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==", "license": "MIT" }, + "node_modules/core-js": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", + "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", @@ -6541,9 +6520,9 @@ } }, "node_modules/jose": { - "version": "5.9.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.9.4.tgz", - "integrity": "sha512-WBBl6au1qg6OHj67yCffCgFR3BADJBXN8MdRvCgJDuMv3driV2nHr7jdGvaKX9IolosAsn+M0XRArqLXUhyJHQ==", + "version": "5.9.6", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.9.6.tgz", + "integrity": "sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -7039,9 +7018,9 @@ "license": "ISC" }, "node_modules/lunary": { - "version": "0.7.12", - "resolved": "https://registry.npmjs.org/lunary/-/lunary-0.7.12.tgz", - "integrity": "sha512-ruEJaV2Jjw50l34RAgYG+9YYzsIZk3mmUklAp0Zpuk0trxbjOKAPEnovMGQJesEokf9+qdloq+Z0pG+cwFbAtw==", + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/lunary/-/lunary-0.7.13.tgz", + "integrity": "sha512-JKatIR7bpRu/08HhqBC2aa9lRo4gKwSkHOvNe2Vemp/+5jczTFGqOiDX6p9amLLma15r2z9wj/v7BVQQ2aIrQA==", "license": "Apache-2.0", "dependencies": { "unctx": "^2.3.1" @@ -7560,9 +7539,9 @@ } }, "node_modules/node-abi": { - "version": "3.68.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.68.0.tgz", - "integrity": "sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==", + "version": "3.71.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", + "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", "license": "MIT", "dependencies": { "semver": "^7.3.5" @@ -8065,9 +8044,9 @@ } }, "node_modules/openai": { - "version": "4.67.3", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.67.3.tgz", - "integrity": "sha512-HT2tZgjLgRqbLQNKmYtjdF/4TQuiBvg1oGvTDhwpSEQzxo6/oM1us8VQ53vBK2BiKvCxFuq6gKGG70qfwrNhKg==", + "version": "4.68.1", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.68.1.tgz", + "integrity": "sha512-C9XmYRHgra1U1G4GGFNqRHQEjxhoOWbQYR85IibfJ0jpHUhOm4/lARiKaC/h3zThvikwH9Dx/XOKWPNVygIS3g==", "license": "Apache-2.0", "dependencies": { "@types/node": "^18.11.18", @@ -8091,9 +8070,9 @@ } }, "node_modules/openai/node_modules/@types/node": { - "version": "18.19.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.55.tgz", - "integrity": "sha512-zzw5Vw52205Zr/nmErSEkN5FLqXPuKX/k5d1D7RKHATGqU7y6YfX9QxZraUzUrFGqH6XzOzG196BC35ltJC4Cw==", + "version": "18.19.57", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.57.tgz", + "integrity": "sha512-I2ioBd/IPrYDMv9UNR5NlPElOZ68QB7yY5V2EsLtSrTO0LM0PnCEFF9biLWHf5k+sIy4ohueCV9t4gk1AEdlVA==", "license": "MIT", "dependencies": { "undici-types": "~5.26.4" @@ -8194,9 +8173,9 @@ } }, "node_modules/p-timeout": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", - "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.3.tgz", + "integrity": "sha512-UJUyfKbwvr/uZSV6btANfb+0t/mOhKV/KXcCUTp8FcQI+v/0d+wXqH4htrW0E4rR6WiEO/EPvUFiV9D5OI4vlw==", "license": "MIT", "engines": { "node": ">=14.16" @@ -8378,9 +8357,9 @@ } }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { @@ -8412,13 +8391,13 @@ "license": "MIT" }, "node_modules/playwright": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.0.tgz", - "integrity": "sha512-qPqFaMEHuY/ug8o0uteYJSRfMGFikhUysk8ZvAtfKmUK3kc/6oNl/y3EczF8OFGYIi/Ex2HspMfzYArk6+XQSA==", + "version": "1.48.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.1.tgz", + "integrity": "sha512-j8CiHW/V6HxmbntOfyB4+T/uk08tBy6ph0MpBXwuoofkSnLmlfdYNNkFTYD6ofzzlSqLA1fwH4vwvVFvJgLN0w==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.48.0" + "playwright-core": "1.48.1" }, "bin": { "playwright": "cli.js" @@ -8431,9 +8410,9 @@ } }, "node_modules/playwright-core": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.0.tgz", - "integrity": "sha512-RBvzjM9rdpP7UUFrQzRwR8L/xR4HyC1QXMzGYTbf1vjw25/ya9NRAVnXi/0fvFopjebvyPzsmoK58xxeEOaVvA==", + "version": "1.48.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.1.tgz", + "integrity": "sha512-Yw/t4VAFX/bBr1OzwCuOMZkY1Cnb4z/doAFSwf4huqAGWmf9eMNjmK7NiOljCdLmxeRYcGPPmcDgU0zOlzP0YA==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -8643,20 +8622,21 @@ } }, "node_modules/posthog-js": { - "version": "1.167.0", - "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.167.0.tgz", - "integrity": "sha512-/zXQ6tuJgiF1d4mgg3UsAi/uoyg7UnfFNQtikuALmaE53xFExpcAKbMfHPG/f54QgTvLxSHyGL1kFl/1uspkGg==", + "version": "1.174.2", + "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.174.2.tgz", + "integrity": "sha512-UgS7eRcDVvVz2XSJ09NMX8zBcdpFnPayfiWDNF3xEbJTsIu1GipkkYNrVlsWlq8U1PIrviNm6i0Dyq8daaxssw==", "license": "MIT", "dependencies": { + "core-js": "^3.38.1", "fflate": "^0.4.8", "preact": "^10.19.3", - "web-vitals": "^4.0.1" + "web-vitals": "^4.2.0" } }, "node_modules/preact": { - "version": "10.24.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.2.tgz", - "integrity": "sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==", + "version": "10.24.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz", + "integrity": "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==", "license": "MIT", "funding": { "type": "opencollective", @@ -9832,6 +9812,18 @@ "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", "license": "MIT" }, + "node_modules/streamsaver": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/streamsaver/-/streamsaver-2.0.6.tgz", + "integrity": "sha512-LK4e7TfCV8HzuM0PKXuVUfKyCB1FtT9L0EGxsFk5Up8njj0bXK8pJM9+Wq2Nya7/jslmCQwRK39LFm55h7NBTw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + } + ], + "license": "MIT" + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -10288,13 +10280,10 @@ } }, "node_modules/text-decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.0.tgz", - "integrity": "sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz", + "integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==", + "license": "Apache-2.0" }, "node_modules/thenify": { "version": "3.3.1", @@ -10346,9 +10335,9 @@ } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.0.tgz", - "integrity": "sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -10447,9 +10436,9 @@ "license": "Apache-2.0" }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", "license": "0BSD" }, "node_modules/tsscmp": { @@ -11029,9 +11018,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", - "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", + "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -11125,6 +11114,7 @@ "@google-cloud/datastream": "^3.2.0", "@json2csv/plainjs": "^7.0.6", "@koa/cors": "^5.0.0", + "@sentry-internal/tracing": "^7.119.2", "@sentry/node": "7.119.2", "@sentry/profiling-node": "1.3.5", "@sentry/utils": "7.99.0", @@ -11171,35 +11161,8 @@ "openapi": "^1.0.1" } }, - "packages/backend/node_modules/@sentry/core": { - "version": "7.119.2", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.119.2.tgz", - "integrity": "sha512-hQr3d2yWq/2lMvoyBPOwXw1IHqTrCjOsU1vYKhAa6w9vGbJZFGhKGGE2KEi/92c3gqGn+gW/PC7cV6waCTDuVA==", - "license": "MIT", - "dependencies": { - "@sentry/types": "7.119.2", - "@sentry/utils": "7.119.2" - }, - "engines": { - "node": ">=8" - } - }, - "packages/backend/node_modules/@sentry/core/node_modules/@sentry/utils": { - "version": "7.119.2", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.119.2.tgz", - "integrity": "sha512-TLdUCvcNgzKP0r9YD7tgCL1PEUp42TObISridsPJ5rhpVGQJvpr+Six0zIkfDUxerLYWZoK8QMm9KgFlPLNQzA==", - "license": "MIT", - "dependencies": { - "@sentry/types": "7.119.2" - }, - "engines": { - "node": ">=8" - } - }, "packages/backend/node_modules/@sentry/node": { "version": "7.119.2", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.119.2.tgz", - "integrity": "sha512-TPNnqxh+Myooe4jTyRiXrzrM2SH08R4+nrmBls4T7lKp2E5R/3mDSe/YTn5rRcUt1k1hPx1NgO/taG0DoS5cXA==", "license": "MIT", "dependencies": { "@sentry-internal/tracing": "7.119.2", @@ -11214,8 +11177,6 @@ }, "packages/backend/node_modules/@sentry/node/node_modules/@sentry/utils": { "version": "7.119.2", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.119.2.tgz", - "integrity": "sha512-TLdUCvcNgzKP0r9YD7tgCL1PEUp42TObISridsPJ5rhpVGQJvpr+Six0zIkfDUxerLYWZoK8QMm9KgFlPLNQzA==", "license": "MIT", "dependencies": { "@sentry/types": "7.119.2" @@ -11226,8 +11187,6 @@ }, "packages/backend/node_modules/@sentry/profiling-node": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@sentry/profiling-node/-/profiling-node-1.3.5.tgz", - "integrity": "sha512-n2bfEbtLW3WuIMQGyxKJKzBNZOb1JYfMeJQ2WQn/42F++69m+u7T0S3EDGRN0Y//fbt5+r0any+4r3kChRXZkQ==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -11244,19 +11203,8 @@ "@sentry/node": "^7.44.1" } }, - "packages/backend/node_modules/@sentry/types": { - "version": "7.119.2", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.119.2.tgz", - "integrity": "sha512-ydq1tWsdG7QW+yFaTp0gFaowMLNVikIqM70wxWNK+u98QzKnVY/3XTixxNLsUtnAB4Y+isAzFhrc6Vb5GFdFeg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "packages/backend/node_modules/@sentry/utils": { "version": "7.99.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.99.0.tgz", - "integrity": "sha512-cYZy5WNTkWs5GgggGnjfGqC44CWir0pAv4GVVSx0fsup4D4pMKBJPrtub15f9uC+QkUf3vVkqwpBqeFxtmJQTQ==", "license": "MIT", "dependencies": { "@sentry/types": "7.99.0" @@ -11267,8 +11215,6 @@ }, "packages/backend/node_modules/@sentry/utils/node_modules/@sentry/types": { "version": "7.99.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.99.0.tgz", - "integrity": "sha512-94qwOw4w40sAs5mCmzcGyj8ZUu/KhnWnuMZARRq96k+SjRW/tHFAOlIdnFSrt3BLPvSOK7R3bVAskZQ0N4FTmA==", "license": "MIT", "engines": { "node": ">=8" @@ -11306,6 +11252,7 @@ "react-json-view-lite": "^1.5.0", "recharts": "^2.12.7", "shared": "*", + "streamsaver": "^2.0.6", "swr": "^2.2.4", "zod": "^3.23.8" }, @@ -11313,6 +11260,7 @@ "@types/node": "20.10.5", "@types/react": "18.2.45", "@types/react-dom": "^18.2.18", + "@types/streamsaver": "^2.0.5", "postcss": "^8.4.33", "postcss-preset-mantine": "^1.12.3", "postcss-simple-vars": "^7.0.1", diff --git a/package.json b/package.json index 0e29a6352..92f8332e2 100644 --- a/package.json +++ b/package.json @@ -21,10 +21,8 @@ "packages/*" ], "dependencies": { - "@types/streamsaver": "^2.0.5", "concurrently": "^8.2.2", - "patch-package": "^8.0.0", - "streamsaver": "^2.0.6" + "patch-package": "^8.0.0" }, "devDependencies": { "@playwright/test": "^1.47.0", diff --git a/packages/backend/package.json b/packages/backend/package.json index 1f5cc87b8..7be4bcece 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -18,6 +18,7 @@ "@google-cloud/datastream": "^3.2.0", "@json2csv/plainjs": "^7.0.6", "@koa/cors": "^5.0.0", + "@sentry-internal/tracing": "^7.119.2", "@sentry/node": "7.119.2", "@sentry/profiling-node": "1.3.5", "@sentry/utils": "7.99.0", diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 29686df58..451842aa7 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -38,9 +38,11 @@ "recharts": "^2.12.7", "shared": "*", "swr": "^2.2.4", - "zod": "^3.23.8" + "zod": "^3.23.8", + "streamsaver": "^2.0.6" }, "devDependencies": { + "@types/streamsaver": "^2.0.5", "@types/node": "20.10.5", "@types/react": "18.2.45", "@types/react-dom": "^18.2.18", diff --git a/packages/frontend/utils/fetcher.ts b/packages/frontend/utils/fetcher.ts index d70871c8d..2d4e1d450 100644 --- a/packages/frontend/utils/fetcher.ts +++ b/packages/frontend/utils/fetcher.ts @@ -1,7 +1,6 @@ import Router from "next/router"; import { signOut } from "./auth"; import { showErrorNotification } from "./errors"; -import { showNotification } from "@mantine/notifications"; const BASE_URL = process.env.NEXT_PUBLIC_API_URL as string; @@ -45,27 +44,12 @@ async function getFile(path) { throw new Error(message); } - console.log(res.headers) - + const { createWriteStream } = await import("streamsaver"); const contentType = res.headers.get("Content-Type") as string; const fileExtension = contentType.split("/")[1]; - const { createWriteStream } = await import('streamsaver'); const fileStream = createWriteStream(`export.${fileExtension}`); await res.body?.pipeTo(fileStream); - - // const blob = await res.blob(); - // const url = window.URL.createObjectURL(blob); - - // const a = document.createElement("a"); - // a.href = url; - // a.download = `export.${fileExtension}`; - - // document.body.appendChild(a); - // a.click(); - // a.remove(); - - // window.URL.revokeObjectURL(url); } async function getStream(url, args, onChunk) {