0 ? `${100 / childrenArray.length * 0.6}%` : '0'
+ }}
+ />
+
+ {childrenArray.map((child, index) => {
+ const isLast = index === childrenArray.length - 1;
+
+ return (
+
+ {!isLast && (
+
+ )}
+ {isLast && (
+
+ )}
+
+
{child}
+
+ )
+ })}
+
+ );
+};
+
+interface ToolHeaderProps {
+ isLoading: boolean;
+ isError: boolean;
+ isExpanded: boolean;
+ label: React.ReactNode;
+ Icon: React.ElementType;
+ onExpand: (isExpanded: boolean) => void;
+ className?: string;
+}
+
+export const ToolHeader = ({ isLoading, isError, isExpanded, label, Icon, onExpand, className }: ToolHeaderProps) => {
+ return (
+
{
+ onExpand(!isExpanded)
+ }}
+ onKeyDown={(e) => {
+ if (e.key !== "Enter") {
+ return;
+ }
+ onExpand(!isExpanded);
+ }}
+ >
+ {isLoading ? (
+
+ ) : (
+
+ )}
+
{label}
+ {!isLoading && (
+
+ {isExpanded ? (
+
+ ) : (
+
+ )}
+
+ )}
+
+ )
+}
\ No newline at end of file
diff --git a/packages/web/src/features/chat/constants.ts b/packages/web/src/features/chat/constants.ts
new file mode 100644
index 00000000..06ae94c9
--- /dev/null
+++ b/packages/web/src/features/chat/constants.ts
@@ -0,0 +1,12 @@
+
+export const FILE_REFERENCE_PREFIX = '@file:';
+export const FILE_REFERENCE_REGEX = new RegExp(`${FILE_REFERENCE_PREFIX}\\{([^:}]+)(?::(\\d+)(?:-(\\d+))?)?\\}`, 'g');
+
+export const ANSWER_TAG = '';
+
+export const toolNames = {
+ searchCode: 'searchCode',
+ readFiles: 'readFiles',
+ findSymbolReferences: 'findSymbolReferences',
+ findSymbolDefinitions: 'findSymbolDefinitions',
+} as const;
\ No newline at end of file
diff --git a/packages/web/src/features/chat/customSlateEditor.tsx b/packages/web/src/features/chat/customSlateEditor.tsx
new file mode 100644
index 00000000..4f52f11a
--- /dev/null
+++ b/packages/web/src/features/chat/customSlateEditor.tsx
@@ -0,0 +1,27 @@
+'use client';
+
+import { Slate } from "slate-react";
+import { useCustomSlateEditor } from "./useCustomSlateEditor";
+import { CustomElement } from "./types";
+
+interface CustomSlateEditorProps {
+ children: React.ReactNode;
+}
+
+const initialValue: CustomElement[] = [
+ {
+ type: 'paragraph',
+ children: [{ text: '' }],
+ },
+];
+
+export const CustomSlateEditor = ({ children }: CustomSlateEditorProps) => {
+ const editor = useCustomSlateEditor();
+
+ return
+ {children}
+ ;
+}
\ No newline at end of file
diff --git a/packages/web/src/features/chat/tools.ts b/packages/web/src/features/chat/tools.ts
new file mode 100644
index 00000000..a53d8259
--- /dev/null
+++ b/packages/web/src/features/chat/tools.ts
@@ -0,0 +1,165 @@
+import { z } from "zod"
+import { search } from "@/features/search/searchApi"
+import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
+import { InferToolInput, InferToolOutput, InferUITool, tool, ToolUIPart } from "ai";
+import { isServiceError } from "@/lib/utils";
+import { getFileSource } from "../search/fileSourceApi";
+import { findSearchBasedSymbolDefinitions, findSearchBasedSymbolReferences } from "../codeNav/actions";
+import { FileSourceResponse } from "../search/types";
+import { addLineNumbers } from "./utils";
+import { toolNames } from "./constants";
+
+export const findSymbolReferencesTool = tool({
+ description: `Finds references to a symbol in the codebase.`,
+ inputSchema: z.object({
+ symbol: z.string().describe("The symbol to find references to"),
+ language: z.string().describe("The programming language of the symbol"),
+ revision: z.string().describe("The revision to search for the symbol in"),
+ }),
+ execute: async ({ symbol, language, revision }) => {
+ const response = await findSearchBasedSymbolReferences({
+ symbolName: symbol,
+ language,
+ revisionName: revision,
+ // @todo(mt): handle multi-tenancy.
+ }, SINGLE_TENANT_ORG_DOMAIN);
+
+ if (isServiceError(response)) {
+ return response;
+ }
+
+ return response.files.map((file) => ({
+ fileName: file.fileName,
+ repository: file.repository,
+ language: file.language,
+ matches: file.matches.map(({ lineContent, range }) => {
+ return addLineNumbers(lineContent, range.start.lineNumber);
+ }),
+ revision,
+ }));
+ },
+});
+
+export type FindSymbolReferencesTool = InferUITool
;
+export type FindSymbolReferencesToolInput = InferToolInput;
+export type FindSymbolReferencesToolOutput = InferToolOutput;
+export type FindSymbolReferencesToolUIPart = ToolUIPart<{ [toolNames.findSymbolReferences]: FindSymbolReferencesTool }>
+
+export const findSymbolDefinitionsTool = tool({
+ description: `Finds definitions of a symbol in the codebase.`,
+ inputSchema: z.object({
+ symbol: z.string().describe("The symbol to find definitions of"),
+ language: z.string().describe("The programming language of the symbol"),
+ revision: z.string().describe("The revision to search for the symbol in"),
+ }),
+ execute: async ({ symbol, language, revision }) => {
+ const response = await findSearchBasedSymbolDefinitions({
+ symbolName: symbol,
+ language,
+ revisionName: revision,
+ // @todo(mt): handle multi-tenancy.
+ }, SINGLE_TENANT_ORG_DOMAIN);
+
+ if (isServiceError(response)) {
+ return response;
+ }
+
+ return response.files.map((file) => ({
+ fileName: file.fileName,
+ repository: file.repository,
+ language: file.language,
+ matches: file.matches.map(({ lineContent, range }) => {
+ return addLineNumbers(lineContent, range.start.lineNumber);
+ }),
+ revision,
+ }));
+ }
+});
+
+export type FindSymbolDefinitionsTool = InferUITool;
+export type FindSymbolDefinitionsToolInput = InferToolInput;
+export type FindSymbolDefinitionsToolOutput = InferToolOutput;
+export type FindSymbolDefinitionsToolUIPart = ToolUIPart<{ [toolNames.findSymbolDefinitions]: FindSymbolDefinitionsTool }>
+
+export const readFilesTool = tool({
+ description: `Reads the contents of multiple files at the given paths.`,
+ inputSchema: z.object({
+ paths: z.array(z.string()).describe("The paths to the files to read"),
+ repository: z.string().describe("The repository to read the files from"),
+ revision: z.string().describe("The revision to read the files from"),
+ }),
+ execute: async ({ paths, repository, revision }) => {
+ const responses = await Promise.all(paths.map(async (path) => {
+ return getFileSource({
+ fileName: path,
+ repository,
+ branch: revision,
+ // @todo(mt): handle multi-tenancy.
+ }, SINGLE_TENANT_ORG_DOMAIN);
+ }));
+
+ if (responses.some(isServiceError)) {
+ const firstError = responses.find(isServiceError);
+ return firstError!;
+ }
+
+ return (responses as FileSourceResponse[]).map((response) => ({
+ path: response.path,
+ repository: response.repository,
+ language: response.language,
+ source: addLineNumbers(response.source),
+ revision,
+ }));
+ }
+});
+
+export type ReadFilesTool = InferUITool;
+export type ReadFilesToolInput = InferToolInput;
+export type ReadFilesToolOutput = InferToolOutput;
+export type ReadFilesToolUIPart = ToolUIPart<{ [toolNames.readFiles]: ReadFilesTool }>
+
+export const createCodeSearchTool = (selectedRepos: string[]) => tool({
+ description: `Fetches code that matches the provided regex pattern in \`query\`. This is NOT a semantic search.
+ Results are returned as an array of matching files, with the file's URL, repository, and language.`,
+ inputSchema: z.object({
+ query: z.string().describe("The regex pattern to search for in the code"),
+ }),
+ execute: async ({ query: _query }) => {
+ let query = `${_query}`;
+ if (selectedRepos.length > 0) {
+ query += ` reposet:${selectedRepos.join(',')}`;
+ }
+
+ const response = await search({
+ query,
+ matches: 100,
+ // @todo: we can make this configurable.
+ contextLines: 3,
+ whole: false,
+ // @todo(mt): handle multi-tenancy.
+ }, SINGLE_TENANT_ORG_DOMAIN);
+
+ if (isServiceError(response)) {
+ return response;
+ }
+
+ return {
+ files: response.files.map((file) => ({
+ fileName: file.fileName.text,
+ repository: file.repository,
+ language: file.language,
+ matches: file.chunks.map(({ content, contentStart }) => {
+ return addLineNumbers(content, contentStart.lineNumber);
+ }),
+ // @todo: make revision configurable.
+ revision: 'HEAD',
+ })),
+ query,
+ }
+ },
+});
+
+export type SearchCodeTool = InferUITool>;
+export type SearchCodeToolInput = InferToolInput>;
+export type SearchCodeToolOutput = InferToolOutput>;
+export type SearchCodeToolUIPart = ToolUIPart<{ [toolNames.searchCode]: SearchCodeTool }>;
diff --git a/packages/web/src/features/chat/types.ts b/packages/web/src/features/chat/types.ts
new file mode 100644
index 00000000..cd1f078b
--- /dev/null
+++ b/packages/web/src/features/chat/types.ts
@@ -0,0 +1,159 @@
+import { CreateUIMessage, UIMessage, UIMessagePart } from "ai";
+import { BaseEditor, Descendant } from "slate";
+import { HistoryEditor } from "slate-history";
+import { ReactEditor, RenderElementProps } from "slate-react";
+import { z } from "zod";
+import { FindSymbolDefinitionsTool, FindSymbolReferencesTool, ReadFilesTool, SearchCodeTool } from "./tools";
+import { toolNames } from "./constants";
+import { LanguageModel } from "@sourcebot/schemas/v3/index.type";
+
+const fileSourceSchema = z.object({
+ type: z.literal('file'),
+ repo: z.string(),
+ path: z.string(),
+ name: z.string(),
+ language: z.string(),
+ revision: z.string(),
+});
+export type FileSource = z.infer;
+
+export const sourceSchema = z.discriminatedUnion('type', [
+ fileSourceSchema,
+]);
+export type Source = z.infer;
+
+const fileReferenceSchema = z.object({
+ type: z.literal('file'),
+ id: z.string(),
+ fileName: z.string(),
+ range: z.object({
+ startLine: z.number(),
+ endLine: z.number(),
+ }).optional(),
+});
+export type FileReference = z.infer;
+
+export const referenceSchema = z.discriminatedUnion('type', [
+ fileReferenceSchema,
+]);
+export type Reference = z.infer;
+
+export const sbChatMessageMetadataSchema = z.object({
+ modelName: z.string().optional(),
+ totalInputTokens: z.number().optional(),
+ totalOutputTokens: z.number().optional(),
+ totalTokens: z.number().optional(),
+ totalResponseTimeMs: z.number().optional(),
+ feedback: z.object({
+ type: z.enum(['like', 'dislike']),
+ timestamp: z.string(), // ISO date string
+ userId: z.string(),
+ }).optional(),
+ selectedRepos: z.array(z.string()).optional(),
+ traceId: z.string().optional(),
+});
+
+export type SBChatMessageMetadata = z.infer;
+
+export type SBChatMessageToolTypes = {
+ [toolNames.searchCode]: SearchCodeTool,
+ [toolNames.readFiles]: ReadFilesTool,
+ [toolNames.findSymbolReferences]: FindSymbolReferencesTool,
+ [toolNames.findSymbolDefinitions]: FindSymbolDefinitionsTool,
+}
+
+export type SBChatMessageDataParts = {
+ // The `source` data type allows us to know what sources the LLM saw
+ // during retrieval.
+ "source": Source,
+}
+
+export type SBChatMessage = UIMessage<
+ SBChatMessageMetadata,
+ SBChatMessageDataParts,
+ SBChatMessageToolTypes
+>;
+
+export type SBChatMessagePart = UIMessagePart<
+ SBChatMessageDataParts,
+ SBChatMessageToolTypes
+>;
+
+// Slate specific types //
+
+export type CustomText = { text: string; }
+
+export type ParagraphElement = {
+ type: 'paragraph'
+ align?: string
+ children: Descendant[];
+}
+
+export type FileMentionData = {
+ type: 'file';
+ repo: string;
+ path: string;
+ name: string;
+ language: string;
+ revision: string;
+}
+
+export type MentionData = FileMentionData;
+
+export type MentionElement = {
+ type: 'mention';
+ data: MentionData;
+ children: CustomText[];
+}
+
+export type CustomElement =
+ ParagraphElement |
+ MentionElement
+ ;
+
+
+export type CustomEditor =
+ BaseEditor &
+ ReactEditor &
+ HistoryEditor
+ ;
+
+export type RenderElementPropsFor = RenderElementProps & {
+ element: T
+}
+
+declare module 'slate' {
+ interface CustomTypes {
+ Editor: CustomEditor
+ Element: CustomElement
+ Text: CustomText
+ }
+}
+
+/////////////////////////
+
+// Misc //
+export const SET_CHAT_STATE_QUERY_PARAM = 'setChatState';
+
+export type SetChatStatePayload = {
+ inputMessage: CreateUIMessage;
+ selectedRepos: string[];
+}
+
+
+export type LanguageModelProvider = LanguageModel['provider'];
+
+// This is a subset of information about a configured
+// language model that we can safely send to the client.
+export type LanguageModelInfo = {
+ provider: LanguageModelProvider,
+ model: LanguageModel['model'],
+ displayName?: LanguageModel['displayName'],
+}
+
+// Additional request body data that we send along to the chat API.
+export const additionalChatRequestParamsSchema = z.object({
+ languageModelId: z.string(),
+ selectedRepos: z.array(z.string()),
+});
+export type AdditionalChatRequestParams = z.infer;
\ No newline at end of file
diff --git a/packages/web/src/features/chat/useCreateNewChatThread.ts b/packages/web/src/features/chat/useCreateNewChatThread.ts
new file mode 100644
index 00000000..155be337
--- /dev/null
+++ b/packages/web/src/features/chat/useCreateNewChatThread.ts
@@ -0,0 +1,51 @@
+'use client';
+
+import { useCallback, useState } from "react";
+import { Descendant } from "slate";
+import { createUIMessage, getAllMentionElements } from "./utils";
+import { slateContentToString } from "./utils";
+import { useDomain } from "@/hooks/useDomain";
+import { useToast } from "@/components/hooks/use-toast";
+import { useRouter } from "next/navigation";
+import { createChat } from "./actions";
+import { isServiceError } from "@/lib/utils";
+import { createPathWithQueryParams } from "@/lib/utils";
+import { SET_CHAT_STATE_QUERY_PARAM, SetChatStatePayload } from "./types";
+
+export const useCreateNewChatThread = () => {
+ const domain = useDomain();
+ const [isLoading, setIsLoading] = useState(false);
+ const { toast } = useToast();
+ const router = useRouter();
+
+ const createNewChatThread = useCallback(async (children: Descendant[], selectedRepos: string[]) => {
+ const text = slateContentToString(children);
+ const mentions = getAllMentionElements(children);
+ const inputMessage = createUIMessage(text, mentions.map((mention) => mention.data), selectedRepos);
+
+ setIsLoading(true);
+ const response = await createChat(domain);
+ if (isServiceError(response)) {
+ toast({
+ description: `❌ Failed to create chat. Reason: ${response.message}`
+ });
+ setIsLoading(false);
+ return;
+ }
+
+ const url = createPathWithQueryParams(`/${domain}/chat/${response.id}`,
+ [SET_CHAT_STATE_QUERY_PARAM, JSON.stringify({
+ inputMessage,
+ selectedRepos,
+ } satisfies SetChatStatePayload)],
+ );
+
+ router.push(url);
+ router.refresh();
+ }, [domain, router, toast]);
+
+ return {
+ createNewChatThread,
+ isLoading,
+ };
+}
\ No newline at end of file
diff --git a/packages/web/src/features/chat/useCustomSlateEditor.ts b/packages/web/src/features/chat/useCustomSlateEditor.ts
new file mode 100644
index 00000000..20c87147
--- /dev/null
+++ b/packages/web/src/features/chat/useCustomSlateEditor.ts
@@ -0,0 +1,37 @@
+'use client';
+
+import { createEditor } from "slate";
+import { useState } from "react";
+import { withReact } from "slate-react";
+import { withHistory } from "slate-history";
+import { CustomEditor } from "./types";
+import { Element } from "slate";
+
+export const useCustomSlateEditor = () => {
+ const [editor] = useState(() =>
+ withMentions(
+ withReact(
+ withHistory(createEditor())
+ )
+ )
+ );
+ return editor;
+}
+
+const withMentions = (editor: CustomEditor) => {
+ const { isInline, isVoid, markableVoid } = editor;
+
+ editor.isInline = (element: Element) => {
+ return element.type === 'mention' ? true : isInline(element)
+ }
+
+ editor.isVoid = (element: Element) => {
+ return element.type === 'mention' ? true : isVoid(element)
+ }
+
+ editor.markableVoid = (element: Element) => {
+ return element.type === 'mention' || markableVoid(element)
+ }
+
+ return editor
+}
diff --git a/packages/web/src/features/chat/useExtractReferences.test.ts b/packages/web/src/features/chat/useExtractReferences.test.ts
new file mode 100644
index 00000000..940129f4
--- /dev/null
+++ b/packages/web/src/features/chat/useExtractReferences.test.ts
@@ -0,0 +1,152 @@
+import { expect, test } from 'vitest'
+import { SBChatMessage } from './types';
+import { renderHook } from '@testing-library/react-hooks';
+import { useExtractReferences } from './useExtractReferences';
+import { getFileReferenceId } from './utils';
+
+test('useExtractReferences extracts file references from text content', () => {
+ const message: SBChatMessage = {
+ id: 'msg1',
+ role: 'assistant',
+ parts: [
+ {
+ type: 'text',
+ text: 'The auth flow is implemented in @file:{auth.ts} and uses sessions @file:{auth.ts:45-60}.'
+ }
+ ]
+ };
+
+ const { result } = renderHook(() => useExtractReferences(message));
+
+ expect(result.current).toHaveLength(2);
+ expect(result.current[0]).toMatchObject({
+ fileName: 'auth.ts',
+ id: getFileReferenceId({ fileName: 'auth.ts' }),
+ type: 'file',
+ });
+
+ expect(result.current[1]).toMatchObject({
+ fileName: 'auth.ts',
+ id: getFileReferenceId({
+ fileName: 'auth.ts',
+ range: {
+ startLine: 45,
+ endLine: 60,
+ }
+ }),
+ type: 'file',
+ range: {
+ startLine: 45,
+ endLine: 60,
+ }
+ });
+});
+
+test('useExtractReferences extracts file references from reasoning content', () => {
+ const message: SBChatMessage = {
+ id: 'msg1',
+ role: 'assistant',
+ parts: [
+ {
+ type: 'reasoning',
+ text: 'The auth flow is implemented in @file:{auth.ts} and uses sessions @file:{auth.ts:45-60}.'
+ }
+ ]
+ };
+
+ const { result } = renderHook(() => useExtractReferences(message));
+
+ expect(result.current).toHaveLength(2);
+ expect(result.current[0]).toMatchObject({
+ fileName: 'auth.ts',
+ id: getFileReferenceId({ fileName: 'auth.ts' }),
+ type: 'file',
+ });
+
+ expect(result.current[1]).toMatchObject({
+ fileName: 'auth.ts',
+ id: getFileReferenceId({
+ fileName: 'auth.ts',
+ range: {
+ startLine: 45,
+ endLine: 60,
+ }
+ }),
+ type: 'file',
+ range: {
+ startLine: 45,
+ endLine: 60,
+ }
+ });
+});
+
+test('useExtractReferences extracts file references from multi-part', () => {
+ const message: SBChatMessage = {
+ id: 'msg1',
+ role: 'assistant',
+ parts: [
+ {
+ type: 'text',
+ text: 'The auth flow is implemented in @file:{auth.ts}.'
+ },
+ {
+ type: 'reasoning',
+ text: 'We need to check the session handling in @file:{session.ts:10-20}.'
+ },
+ {
+ type: 'text',
+ text: 'The configuration is stored in @file:{config.json} and @file:{utils.ts:5}.'
+ }
+ ]
+ };
+
+ const { result } = renderHook(() => useExtractReferences(message));
+
+ expect(result.current).toHaveLength(4);
+
+ // From text part
+ expect(result.current[0]).toMatchObject({
+ fileName: 'auth.ts',
+ id: getFileReferenceId({ fileName: 'auth.ts' }),
+ type: 'file',
+ });
+
+ // From reasoning part
+ expect(result.current[1]).toMatchObject({
+ fileName: 'session.ts',
+ id: getFileReferenceId({
+ fileName: 'session.ts',
+ range: {
+ startLine: 10,
+ endLine: 20,
+ }
+ }),
+ type: 'file',
+ range: {
+ startLine: 10,
+ endLine: 20,
+ }
+ });
+
+ expect(result.current[2]).toMatchObject({
+ fileName: 'config.json',
+ id: getFileReferenceId({ fileName: 'config.json' }),
+ type: 'file',
+ });
+
+ expect(result.current[3]).toMatchObject({
+ fileName: 'utils.ts',
+ id: getFileReferenceId({
+ fileName: 'utils.ts',
+ range: {
+ startLine: 5,
+ endLine: 5,
+ }
+ }),
+ type: 'file',
+ range: {
+ startLine: 5,
+ endLine: 5,
+ }
+ });
+});
diff --git a/packages/web/src/features/chat/useExtractReferences.ts b/packages/web/src/features/chat/useExtractReferences.ts
new file mode 100644
index 00000000..4ab558c7
--- /dev/null
+++ b/packages/web/src/features/chat/useExtractReferences.ts
@@ -0,0 +1,38 @@
+'use client';
+
+import { useMemo } from "react";
+import { SBChatMessage, FileReference } from "./types";
+import { FILE_REFERENCE_REGEX } from "./constants";
+import { createFileReference } from "./utils";
+
+export const useExtractReferences = (message?: SBChatMessage) => {
+ return useMemo(() => {
+ const references: FileReference[] = [];
+
+ message?.parts.forEach((part) => {
+ switch (part.type) {
+ case 'text':
+ case 'reasoning': {
+ const content = part.text;
+ FILE_REFERENCE_REGEX.lastIndex = 0;
+
+ let match;
+ while ((match = FILE_REFERENCE_REGEX.exec(content ?? '')) !== null && match !== null) {
+ const [_, fileName, startLine, endLine] = match;
+
+ const fileReference = createFileReference({
+ fileName,
+ startLine,
+ endLine,
+ });
+
+ references.push(fileReference);
+ }
+ break;
+ }
+ }
+ });
+
+ return references;
+ }, [message]);
+};
diff --git a/packages/web/src/features/chat/useMessagePairs.test.ts b/packages/web/src/features/chat/useMessagePairs.test.ts
new file mode 100644
index 00000000..13c7cad1
--- /dev/null
+++ b/packages/web/src/features/chat/useMessagePairs.test.ts
@@ -0,0 +1,117 @@
+import { expect, test } from 'vitest'
+import { SBChatMessage } from './types';
+import { useMessagePairs } from './useMessagePairs';
+import { renderHook } from '@testing-library/react-hooks';
+
+test('useMessagePairs pairs user and assistant messages', () => {
+ const userMessage: SBChatMessage = {
+ role: 'user', parts: [],
+ id: '0'
+ }
+
+ const assistantMessage: SBChatMessage = {
+ role: 'assistant', parts: [],
+ id: '1'
+ }
+
+ const messages: SBChatMessage[] = [
+ userMessage,
+ assistantMessage,
+ ]
+
+ const pairs = renderHook(() => useMessagePairs(messages));
+
+ expect(pairs.result.current).toEqual([
+ [userMessage, assistantMessage],
+ ]);
+
+});
+
+test('pairMessages pairs orphaned user messages with undefined', () => {
+ const userMessage1: SBChatMessage = {
+ role: 'user', parts: [],
+ id: '0'
+ }
+
+ const userMessage2: SBChatMessage = {
+ role: 'user', parts: [],
+ id: '1'
+ }
+
+ const assistantMessage: SBChatMessage = {
+ role: 'assistant', parts: [],
+ id: '2'
+ }
+
+ const messages: SBChatMessage[] = [
+ userMessage1,
+ userMessage2,
+ assistantMessage,
+ ]
+
+ const pairs = renderHook(() => useMessagePairs(messages));
+
+ expect(pairs.result.current).toEqual([
+ [userMessage1, undefined],
+ [userMessage2, assistantMessage],
+ ]);
+});
+
+test('pairMessages ignores orphaned assistant messages', () => {
+ const userMessage: SBChatMessage = {
+ role: 'user', parts: [],
+ id: '0'
+ }
+
+ const assistantMessage1: SBChatMessage = {
+ role: 'assistant', parts: [],
+ id: '1'
+ }
+
+ const assistantMessage2: SBChatMessage = {
+ role: 'assistant', parts: [],
+ id: '2'
+ }
+
+ const messages: SBChatMessage[] = [
+ userMessage,
+ assistantMessage1,
+ assistantMessage2,
+ ]
+
+ const pairs = renderHook(() => useMessagePairs(messages));
+
+ expect(pairs.result.current).toEqual([
+ [userMessage, assistantMessage1],
+ ]);
+})
+
+test('pairMessages pairs the last message with undefined if it is a user message', () => {
+ const userMessage1: SBChatMessage = {
+ role: 'user', parts: [],
+ id: '0'
+ }
+
+ const assistantMessage: SBChatMessage = {
+ role: 'assistant', parts: [],
+ id: '2'
+ }
+
+ const userMessage2: SBChatMessage = {
+ role: 'user', parts: [],
+ id: '1'
+ }
+
+ const messages: SBChatMessage[] = [
+ userMessage1,
+ assistantMessage,
+ userMessage2,
+ ]
+
+ const pairs = renderHook(() => useMessagePairs(messages));
+
+ expect(pairs.result.current).toEqual([
+ [userMessage1, assistantMessage],
+ [userMessage2, undefined],
+ ]);
+})
\ No newline at end of file
diff --git a/packages/web/src/features/chat/useMessagePairs.ts b/packages/web/src/features/chat/useMessagePairs.ts
new file mode 100644
index 00000000..36ce7097
--- /dev/null
+++ b/packages/web/src/features/chat/useMessagePairs.ts
@@ -0,0 +1,43 @@
+'use client';
+
+import { useMemo } from "react";
+import { SBChatMessage } from "./types";
+
+// Pairs user messages with the assistant's response.
+export const useMessagePairs = (messages: SBChatMessage[]): [SBChatMessage, SBChatMessage | undefined][] => {
+ return useMemo(() => {
+ const result: [SBChatMessage, SBChatMessage | undefined][] = [];
+ let pendingUserMessage: SBChatMessage | null = null;
+
+ for (const message of messages) {
+ if (message.role === 'user') {
+ // case: we have a orphaned user message.
+ // Pair it with undefined.
+ if (pendingUserMessage) {
+ result.push([pendingUserMessage, undefined]);
+ }
+
+ pendingUserMessage = message;
+ } else if (message.role === 'assistant') {
+
+ // case: we have a user <> assistant message pair.
+ // Pair them.
+ if (pendingUserMessage) {
+ result.push([pendingUserMessage, message]);
+ pendingUserMessage = null;
+ }
+
+ // case: we have a orphaned assistant message.
+ // Ignore the orphaned assistant message.
+ }
+ }
+
+ // case: the last message is a user message.
+ // Pair it with undefined.
+ if (pendingUserMessage) {
+ result.push([pendingUserMessage, undefined]);
+ }
+
+ return result;
+ }, [messages]);
+};
\ No newline at end of file
diff --git a/packages/web/src/features/chat/useSelectedLanguageModel.ts b/packages/web/src/features/chat/useSelectedLanguageModel.ts
new file mode 100644
index 00000000..7cdc79e4
--- /dev/null
+++ b/packages/web/src/features/chat/useSelectedLanguageModel.ts
@@ -0,0 +1,25 @@
+'use client';
+
+import { useLocalStorage } from "usehooks-ts";
+import { LanguageModelInfo } from "./types";
+
+type Props = {
+ initialLanguageModel?: LanguageModelInfo;
+}
+
+export const useSelectedLanguageModel = ({
+ initialLanguageModel,
+}: Props = {}) => {
+ const [selectedLanguageModel, setSelectedLanguageModel] = useLocalStorage(
+ "selectedLanguageModel",
+ initialLanguageModel,
+ {
+ initializeWithValue: false,
+ }
+ );
+
+ return {
+ selectedLanguageModel,
+ setSelectedLanguageModel,
+ };
+}
\ No newline at end of file
diff --git a/packages/web/src/features/chat/useTOCItems.ts b/packages/web/src/features/chat/useTOCItems.ts
new file mode 100644
index 00000000..44ee62b8
--- /dev/null
+++ b/packages/web/src/features/chat/useTOCItems.ts
@@ -0,0 +1,100 @@
+'use client';
+
+import { useEffect, useRef, useState } from "react";
+
+interface Props {
+ target: HTMLElement | null;
+}
+
+export interface TocItem {
+ id: string;
+ text: string;
+ level: number;
+ element: HTMLElement;
+}
+
+
+export const useExtractTOCItems = ({ target }: Props) => {
+ const [tocItems, setTocItems] = useState([]);
+ const [activeId, setActiveId] = useState('');
+ const observerRef = useRef(null);
+
+ useEffect(() => {
+ const extractHeadings = () => {
+ if (!target) return;
+
+ const headings = target.querySelectorAll('h1, h2, h3, h4, h5, h6');
+ const items: TocItem[] = [];
+
+ headings.forEach((heading) => {
+ const element = heading as HTMLElement;
+ const level = parseInt(element.tagName.charAt(1));
+ const text = element.textContent?.trim() || '';
+
+ if (text && element.id) {
+ items.push({
+ id: element.id,
+ text,
+ level,
+ element
+ });
+ }
+ });
+
+ setTocItems(items);
+ };
+
+ // Initial extraction
+ extractHeadings();
+
+ // Set up MutationObserver to watch for DOM changes
+ if (target) {
+ const observer = new MutationObserver(() => {
+ extractHeadings();
+ });
+
+ observer.observe(target, {
+ childList: true,
+ subtree: true,
+ characterData: true
+ });
+
+ return () => observer.disconnect();
+ }
+ }, [target]);
+
+ // Set up intersection observer for active heading tracking
+ useEffect(() => {
+ if (tocItems.length === 0) return;
+
+ observerRef.current = new IntersectionObserver(
+ (entries) => {
+ entries.forEach((entry) => {
+ if (entry.isIntersecting) {
+ setActiveId(entry.target.id);
+ }
+ });
+ },
+ {
+ rootMargin: '-20px 0px -80% 0px'
+ }
+ );
+
+ tocItems.forEach((item) => {
+ if (observerRef.current) {
+ observerRef.current.observe(item.element);
+ }
+ });
+
+ return () => {
+ if (observerRef.current) {
+ observerRef.current.disconnect();
+ }
+ };
+ }, [tocItems]);
+
+ return {
+ tocItems,
+ activeId
+ }
+}
\ No newline at end of file
diff --git a/packages/web/src/features/chat/utils.test.ts b/packages/web/src/features/chat/utils.test.ts
new file mode 100644
index 00000000..cea6e79f
--- /dev/null
+++ b/packages/web/src/features/chat/utils.test.ts
@@ -0,0 +1,240 @@
+import { expect, test, vi } from 'vitest'
+import { fileReferenceToString, getAnswerPartFromAssistantMessage, groupMessageIntoSteps } from './utils'
+import { FILE_REFERENCE_REGEX, ANSWER_TAG } from './constants';
+import { SBChatMessage, SBChatMessagePart } from './types';
+
+// Mock the env module
+vi.mock('@/env.mjs', () => ({
+ env: {
+ SOURCEBOT_CHAT_FILE_MAX_CHARACTERS: 4000,
+ }
+}));
+
+
+test('fileReferenceToString formats file references correctly', () => {
+ expect(fileReferenceToString({
+ fileName: 'auth.ts'
+ })).toBe('@file:{auth.ts}');
+
+ expect(fileReferenceToString({
+ fileName: 'auth.ts',
+ range: {
+ startLine: 45,
+ endLine: 60,
+ }
+ })).toBe('@file:{auth.ts:45-60}');
+});
+
+test('fileReferenceToString matches FILE_REFERENCE_REGEX', () => {
+ expect(FILE_REFERENCE_REGEX.test(fileReferenceToString({
+ fileName: 'auth.ts'
+ }))).toBe(true);
+
+ FILE_REFERENCE_REGEX.lastIndex = 0;
+ expect(FILE_REFERENCE_REGEX.test(fileReferenceToString({
+ fileName: 'auth.ts',
+ range: {
+ startLine: 45,
+ endLine: 60,
+ }
+ }))).toBe(true);
+});
+
+test('groupMessageIntoSteps returns an empty array when there are no parts', () => {
+ const parts: SBChatMessagePart[] = []
+
+ const steps = groupMessageIntoSteps(parts);
+
+ expect(steps).toEqual([]);
+});
+
+test('groupMessageIntoSteps returns a single group when there is only one step-start part', () => {
+ const parts: SBChatMessagePart[] = [
+ {
+ type: 'step-start',
+ },
+ {
+ type: 'text',
+ text: 'Hello, world!',
+ }
+ ]
+
+ const steps = groupMessageIntoSteps(parts);
+
+ expect(steps).toEqual([
+ [
+ {
+ type: 'step-start',
+ },
+ {
+ type: 'text',
+ text: 'Hello, world!',
+ }
+ ]
+ ]);
+});
+
+test('groupMessageIntoSteps returns a multiple groups when there is multiple step-start parts', () => {
+ const parts: SBChatMessagePart[] = [
+ {
+ type: 'step-start',
+ },
+ {
+ type: 'text',
+ text: 'Hello, world!',
+ },
+ {
+ type: 'step-start',
+ },
+ {
+ type: 'text',
+ text: 'Ok lets go',
+ },
+ ]
+
+ const steps = groupMessageIntoSteps(parts);
+
+ expect(steps).toEqual([
+ [
+ {
+ type: 'step-start',
+ },
+ {
+ type: 'text',
+ text: 'Hello, world!',
+ }
+ ],
+ [
+ {
+ type: 'step-start',
+ },
+ {
+ type: 'text',
+ text: 'Ok lets go',
+ }
+ ]
+ ]);
+});
+
+test('groupMessageIntoSteps returns a single group when there is no step-start part', () => {
+ const parts: SBChatMessagePart[] = [
+ {
+ type: 'text',
+ text: 'Hello, world!',
+ },
+ {
+ type: 'text',
+ text: 'Ok lets go',
+ },
+ ]
+
+ const steps = groupMessageIntoSteps(parts);
+
+ expect(steps).toEqual([
+ [
+ {
+ type: 'text',
+ text: 'Hello, world!',
+ },
+ {
+ type: 'text',
+ text: 'Ok lets go',
+ }
+ ]
+ ]);
+});
+
+test('getAnswerPartFromAssistantMessage returns text part when it starts with ANSWER_TAG while not streaming', () => {
+ const message: SBChatMessage = {
+ role: 'assistant',
+ parts: [
+ {
+ type: 'text',
+ text: 'Some initial text'
+ },
+ {
+ type: 'text',
+ text: `${ANSWER_TAG}This is the answer to your question.`
+ }
+ ]
+ } as SBChatMessage;
+
+ const result = getAnswerPartFromAssistantMessage(message, false);
+
+ expect(result).toEqual({
+ type: 'text',
+ text: `${ANSWER_TAG}This is the answer to your question.`
+ });
+});
+
+test('getAnswerPartFromAssistantMessage returns text part when it starts with ANSWER_TAG while streaming', () => {
+ const message: SBChatMessage = {
+ role: 'assistant',
+ parts: [
+ {
+ type: 'text',
+ text: 'Some initial text'
+ },
+ {
+ type: 'text',
+ text: `${ANSWER_TAG}This is the answer to your question.`
+ }
+ ]
+ } as SBChatMessage;
+
+ const result = getAnswerPartFromAssistantMessage(message, true);
+
+ expect(result).toEqual({
+ type: 'text',
+ text: `${ANSWER_TAG}This is the answer to your question.`
+ });
+});
+
+test('getAnswerPartFromAssistantMessage returns last text part as fallback when not streaming and no ANSWER_TAG', () => {
+ const message: SBChatMessage = {
+ role: 'assistant',
+ parts: [
+ {
+ type: 'text',
+ text: 'First text part'
+ },
+ {
+ type: 'tool-call',
+ id: 'call-1',
+ name: 'search',
+ args: {}
+ },
+ {
+ type: 'text',
+ text: 'This is the last text part without answer tag'
+ }
+ ]
+ } as SBChatMessage;
+
+ const result = getAnswerPartFromAssistantMessage(message, false);
+
+ expect(result).toEqual({
+ type: 'text',
+ text: 'This is the last text part without answer tag'
+ });
+});
+
+test('getAnswerPartFromAssistantMessage returns undefined when streaming and no ANSWER_TAG', () => {
+ const message: SBChatMessage = {
+ role: 'assistant',
+ parts: [
+ {
+ type: 'text',
+ text: 'Some text without answer tag'
+ },
+ {
+ type: 'text',
+ text: 'Another text part'
+ }
+ ]
+ } as SBChatMessage;
+
+ const result = getAnswerPartFromAssistantMessage(message, true);
+
+ expect(result).toBeUndefined();
+});
diff --git a/packages/web/src/features/chat/utils.ts b/packages/web/src/features/chat/utils.ts
new file mode 100644
index 00000000..f2bb42ab
--- /dev/null
+++ b/packages/web/src/features/chat/utils.ts
@@ -0,0 +1,306 @@
+import { CreateUIMessage, TextUIPart, UIMessagePart } from "ai"
+import { Descendant, Editor, Point, Range, Transforms } from "slate"
+import { ANSWER_TAG, FILE_REFERENCE_PREFIX, FILE_REFERENCE_REGEX } from "./constants"
+import {
+ CustomEditor,
+ CustomText,
+ FileReference,
+ FileSource,
+ MentionData,
+ MentionElement,
+ ParagraphElement,
+ SBChatMessage,
+ SBChatMessagePart,
+ SBChatMessageToolTypes,
+ Source,
+} from "./types"
+
+export const insertMention = (editor: CustomEditor, data: MentionData, target?: Range | null) => {
+ const mention: MentionElement = {
+ type: 'mention',
+ data,
+ children: [{ text: '' }],
+ }
+
+ if (target) {
+ Transforms.select(editor, target)
+ }
+
+ Transforms.insertNodes(editor, mention)
+ Transforms.move(editor)
+}
+
+// @see: https://github.com/ianstormtaylor/slate/issues/4162#issuecomment-1127062098
+export function word(
+ editor: CustomEditor,
+ location: Range,
+ options: {
+ terminator?: string[]
+ include?: boolean
+ directions?: 'both' | 'left' | 'right'
+ } = {},
+): Range | undefined {
+ const { terminator = [' '], include = false, directions = 'both' } = options
+
+ const { selection } = editor
+ if (!selection) return
+
+ // Get start and end, modify it as we move along.
+ let [start, end] = Range.edges(location)
+
+ let point: Point = start
+
+ function move(direction: 'right' | 'left'): boolean {
+ const next =
+ direction === 'right'
+ ? Editor.after(editor, point, {
+ unit: 'character',
+ })
+ : Editor.before(editor, point, { unit: 'character' })
+
+ const wordNext =
+ next &&
+ Editor.string(
+ editor,
+ direction === 'right' ? { anchor: point, focus: next } : { anchor: next, focus: point },
+ )
+
+ const last = wordNext && wordNext[direction === 'right' ? 0 : wordNext.length - 1]
+ if (next && last && !terminator.includes(last)) {
+ point = next
+
+ if (point.offset === 0) {
+ // Means we've wrapped to beginning of another block
+ return false
+ }
+ } else {
+ return false
+ }
+
+ return true
+ }
+
+ // Move point and update start & end ranges
+
+ // Move forwards
+ if (directions !== 'left') {
+ point = end
+ while (move('right'));
+ end = point
+ }
+
+ // Move backwards
+ if (directions !== 'right') {
+ point = start
+ while (move('left'));
+ start = point
+ }
+
+ if (include) {
+ return {
+ anchor: Editor.before(editor, start, { unit: 'offset' }) ?? start,
+ focus: Editor.after(editor, end, { unit: 'offset' }) ?? end,
+ }
+ }
+
+ return { anchor: start, focus: end }
+}
+
+export const isMentionElement = (element: Descendant): element is MentionElement => {
+ return 'type' in element && element.type === 'mention';
+}
+
+export const isCustomTextElement = (element: Descendant): element is CustomText => {
+ return 'text' in element && typeof element.text === 'string';
+}
+
+export const isParagraphElement = (element: Descendant): element is ParagraphElement => {
+ return 'type' in element && element.type === 'paragraph';
+}
+
+export const slateContentToString = (children: Descendant[]): string => {
+ return children.map((child) => {
+ if (isCustomTextElement(child)) {
+ return child.text;
+ }
+
+ else if (isMentionElement(child)) {
+ const { type } = child.data;
+
+ switch (type) {
+ case 'file':
+ return `${fileReferenceToString({ fileName: child.data.name })} `;
+ }
+ }
+
+ else if (isParagraphElement(child)) {
+ return `${slateContentToString(child.children)}\n`;
+ }
+
+ else {
+ return "";
+ }
+ }).join("");
+}
+
+export const getAllMentionElements = (children: Descendant[]): MentionElement[] => {
+ return children.flatMap((child) => {
+ if (isCustomTextElement(child)) {
+ return [];
+ }
+
+ if (isMentionElement(child)) {
+ return [child];
+ }
+
+ return getAllMentionElements(child.children);
+ });
+}
+
+// @see: https://stackoverflow.com/a/74102147
+export const resetEditor = (editor: CustomEditor) => {
+ const point = { path: [0, 0], offset: 0 }
+ editor.selection = { anchor: point, focus: point };
+ editor.history = { redos: [], undos: [] };
+ editor.children = [{
+ type: "paragraph",
+ children: [{ text: "" }]
+ }];
+}
+
+export const addLineNumbers = (source: string, lineOffset = 1) => {
+ return source.split('\n').map((line, index) => `${index + lineOffset}:${line}`).join('\n');
+}
+
+export const createUIMessage = (text: string, mentions: MentionData[], selectedRepos: string[]): CreateUIMessage => {
+ // Converts applicable mentions into sources.
+ const sources: Source[] = mentions
+ .map((mention) => {
+ if (mention.type === 'file') {
+ const fileSource: FileSource = {
+ type: 'file',
+ path: mention.path,
+ repo: mention.repo,
+ name: mention.name,
+ language: mention.language,
+ revision: mention.revision,
+ }
+ return fileSource;
+ }
+
+ return undefined;
+ })
+ .filter((source) => source !== undefined);
+
+ return {
+ role: 'user',
+ parts: [
+ {
+ type: 'text',
+ text,
+ },
+ ...sources.map((data) => ({
+ type: 'data-source',
+ data,
+ })) as UIMessagePart<{ source: Source }, SBChatMessageToolTypes>[],
+ ],
+ metadata: {
+ selectedRepos,
+ },
+ }
+}
+
+export const getFileReferenceId = ({ fileName, range }: Omit) => {
+ return `file-reference-${fileName}${range ? `-${range.startLine}-${range.endLine}` : ''}`;
+}
+
+export const fileReferenceToString = ({ fileName, range }: Omit) => {
+ return `${FILE_REFERENCE_PREFIX}{${fileName}${range ? `:${range.startLine}-${range.endLine}` : ''}}`;
+}
+
+export const createFileReference = ({ fileName, startLine, endLine }: { fileName: string, startLine?: string, endLine?: string }): FileReference => {
+ const range = startLine && endLine ? {
+ startLine: parseInt(startLine),
+ endLine: parseInt(endLine),
+ } : startLine ? {
+ startLine: parseInt(startLine),
+ endLine: parseInt(startLine),
+ } : undefined;
+
+ return {
+ type: 'file',
+ id: getFileReferenceId({ fileName, range }),
+ fileName,
+ range,
+ }
+}
+
+/**
+ * Converts LLM text that includes references (e.g., @file:...) into a portable
+ * Markdown format. Practically, this means converting references into Markdown
+ * links.
+ */
+export const convertLLMOutputToPortableMarkdown = (text: string): string => {
+ return text.replace(FILE_REFERENCE_REGEX, (_, fileName, startLine, endLine) => {
+ const displayName = fileName.split('/').pop() || fileName;
+
+ let linkText = displayName;
+ if (startLine) {
+ if (endLine && startLine !== endLine) {
+ linkText += `:${startLine}-${endLine}`;
+ } else {
+ linkText += `:${startLine}`;
+ }
+ }
+
+ return `[${linkText}](${fileName})`;
+ });
+}
+
+// Groups message parts into groups based on step-start delimiters.
+export const groupMessageIntoSteps = (parts: SBChatMessagePart[]) => {
+ if (!parts || parts.length === 0) {
+ return [];
+ }
+
+ const steps: SBChatMessagePart[][] = [];
+ let currentStep: SBChatMessagePart[] = [];
+
+ for (let i = 0; i < parts.length; i++) {
+ const part = parts[i];
+
+ if (part.type === 'step-start') {
+ if (currentStep.length > 0) {
+ steps.push([...currentStep]);
+ }
+ currentStep = [part];
+ } else {
+ currentStep.push(part);
+ }
+ }
+
+ if (currentStep.length > 0) {
+ steps.push(currentStep);
+ }
+
+ return steps;
+}
+
+// Attempts to find the part of the assistant's message
+// that contains the answer.
+export const getAnswerPartFromAssistantMessage = (message: SBChatMessage, isStreaming: boolean): TextUIPart | undefined => {
+ const lastTextPart = message.parts
+ .findLast((part) => part.type === 'text')
+
+ if (lastTextPart?.text.startsWith(ANSWER_TAG)) {
+ return lastTextPart;
+ }
+
+ // If the agent did not include the answer tag, then fallback to using the last text part.
+ // Only do this when we are no longer streaming since the agent may still be thinking.
+ if (!isStreaming && lastTextPart) {
+ return lastTextPart;
+ }
+
+ return undefined;
+}
\ No newline at end of file
diff --git a/packages/web/src/features/fileTree/components/fileTreeItemIcon.tsx b/packages/web/src/features/fileTree/components/fileTreeItemIcon.tsx
index 1d481e3d..e685899a 100644
--- a/packages/web/src/features/fileTree/components/fileTreeItemIcon.tsx
+++ b/packages/web/src/features/fileTree/components/fileTreeItemIcon.tsx
@@ -2,9 +2,8 @@
import { FileTreeItem } from "../actions";
import { useMemo } from "react";
-import { getIconForFile, getIconForFolder } from "vscode-icons-js";
-import { Icon } from '@iconify/react';
-import { cn } from "@/lib/utils";
+import { VscodeFolderIcon } from "@/app/components/vscodeFolderIcon";
+import { VscodeFileIcon } from "@/app/components/vscodeFileIcon";
interface FileTreeItemIconProps {
item: FileTreeItem;
@@ -12,23 +11,13 @@ interface FileTreeItemIconProps {
}
export const FileTreeItemIcon = ({ item, className }: FileTreeItemIconProps) => {
- const iconName = useMemo(() => {
+ const ItemIcon = useMemo(() => {
if (item.type === 'tree') {
- const icon = getIconForFolder(item.name);
- if (icon) {
- const iconName = `vscode-icons:${icon.substring(0, icon.indexOf('.')).replaceAll('_', '-')}`;
- return iconName;
- }
- } else if (item.type === 'blob') {
- const icon = getIconForFile(item.name);
- if (icon) {
- const iconName = `vscode-icons:${icon.substring(0, icon.indexOf('.')).replaceAll('_', '-')}`;
- return iconName;
- }
+ return
+ } else {
+ return
}
+ }, [item.name, item.type, className]);
- return "vscode-icons:file-type-unknown";
- }, [item.name, item.type]);
-
- return ;
+ return ItemIcon;
}
\ No newline at end of file
diff --git a/packages/web/src/features/search/fileSourceApi.ts b/packages/web/src/features/search/fileSourceApi.ts
index e1fd756b..f34703e6 100644
--- a/packages/web/src/features/search/fileSourceApi.ts
+++ b/packages/web/src/features/search/fileSourceApi.ts
@@ -1,7 +1,7 @@
'use server';
import escapeStringRegexp from "escape-string-regexp";
-import { fileNotFound, ServiceError } from "../../lib/serviceError";
+import { fileNotFound, ServiceError, unexpectedError } from "../../lib/serviceError";
import { FileSourceRequest, FileSourceResponse } from "./types";
import { isServiceError } from "../../lib/utils";
import { search } from "./searchApi";
@@ -41,10 +41,21 @@ export const getFileSource = async ({ fileName, repository, branch }: FileSource
const file = files[0];
const source = file.content ?? '';
const language = file.language;
+
+ const repoInfo = searchResponse.repositoryInfo.find((repo) => repo.id === file.repositoryId);
+ if (!repoInfo) {
+ // This should never happen.
+ return unexpectedError("Repository info not found");
+ }
return {
source,
language,
+ path: fileName,
+ repository,
+ repositoryCodeHostType: repoInfo.codeHostType,
+ repositoryDisplayName: repoInfo.displayName,
+ branch,
webUrl: file.webUrl,
} satisfies FileSourceResponse;
diff --git a/packages/web/src/features/search/schemas.ts b/packages/web/src/features/search/schemas.ts
index 1c99d885..ecf198a6 100644
--- a/packages/web/src/features/search/schemas.ts
+++ b/packages/web/src/features/search/schemas.ts
@@ -114,5 +114,10 @@ export const fileSourceRequestSchema = z.object({
export const fileSourceResponseSchema = z.object({
source: z.string(),
language: z.string(),
+ path: z.string(),
+ repository: z.string(),
+ repositoryCodeHostType: z.string(),
+ repositoryDisplayName: z.string().optional(),
+ branch: z.string().optional(),
webUrl: z.string().optional(),
});
\ No newline at end of file
diff --git a/packages/web/src/features/search/searchApi.ts b/packages/web/src/features/search/searchApi.ts
index 05a913f2..6d006bbd 100644
--- a/packages/web/src/features/search/searchApi.ts
+++ b/packages/web/src/features/search/searchApi.ts
@@ -1,3 +1,5 @@
+'use server';
+
import { env } from "@/env.mjs";
import { invalidZoektResponse, ServiceError } from "../../lib/serviceError";
import { isServiceError } from "../../lib/utils";
diff --git a/packages/web/src/hooks/useFindLanguageDescription.ts b/packages/web/src/hooks/useFindLanguageDescription.ts
new file mode 100644
index 00000000..344f9387
--- /dev/null
+++ b/packages/web/src/hooks/useFindLanguageDescription.ts
@@ -0,0 +1,23 @@
+'use client';
+
+import { LanguageDescription } from "@codemirror/language";
+import { useMemo } from "react";
+import { languages as builtinLanguages } from '@codemirror/language-data'
+
+interface UseFindLanguageDescriptionProps {
+ languageName: string;
+ fuzzyMatch?: boolean;
+}
+
+export const useFindLanguageDescription = ({ languageName, fuzzyMatch = true }: UseFindLanguageDescriptionProps) => {
+ const languageDescription = useMemo(() => {
+ const description = LanguageDescription.matchLanguageName(
+ builtinLanguages,
+ languageName,
+ fuzzyMatch
+ );
+ return description;
+ }, [languageName, fuzzyMatch]);
+
+ return languageDescription;
+}
\ No newline at end of file
diff --git a/packages/web/src/instrumentation.ts b/packages/web/src/instrumentation.ts
index 0c87feb9..6e2ee936 100644
--- a/packages/web/src/instrumentation.ts
+++ b/packages/web/src/instrumentation.ts
@@ -1,6 +1,20 @@
import * as Sentry from '@sentry/nextjs';
+import { registerOTel } from '@vercel/otel';
+import { LangfuseExporter } from 'langfuse-vercel';
+import { env } from './env.mjs';
export async function register() {
+ if (env.LANGFUSE_SECRET_KEY && env.NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY) {
+ registerOTel({
+ serviceName: 'sourcebot',
+ traceExporter: new LangfuseExporter({
+ secretKey: env.LANGFUSE_SECRET_KEY,
+ publicKey: env.NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY,
+ baseUrl: env.NEXT_PUBLIC_LANGFUSE_BASE_URL,
+ }),
+ });
+ }
+
if (process.env.NEXT_RUNTIME === 'nodejs') {
await import('../sentry.server.config');
}
diff --git a/packages/web/src/lib/errorCodes.ts b/packages/web/src/lib/errorCodes.ts
index da2c0bd0..5e545200 100644
--- a/packages/web/src/lib/errorCodes.ts
+++ b/packages/web/src/lib/errorCodes.ts
@@ -33,4 +33,5 @@ export enum ErrorCode {
API_KEY_ALREADY_EXISTS = 'API_KEY_ALREADY_EXISTS',
API_KEY_NOT_FOUND = 'API_KEY_NOT_FOUND',
INVALID_API_KEY = 'INVALID_API_KEY',
+ CHAT_IS_READONLY = 'CHAT_IS_READONLY',
}
diff --git a/packages/web/src/lib/newsData.ts b/packages/web/src/lib/newsData.ts
index abd0b2b8..f6fcaff1 100644
--- a/packages/web/src/lib/newsData.ts
+++ b/packages/web/src/lib/newsData.ts
@@ -1,6 +1,12 @@
import { NewsItem } from "./types";
export const newsData: NewsItem[] = [
+ {
+ unique_id: "ask-sourcebot",
+ header: "Ask Sourcebot",
+ sub_header: "Ask Sourcebot to search, summarize, and explain code. Bring your own LLM.",
+ url: "https://docs.sourcebot.dev/docs/features/ask/overview"
+ },
{
unique_id: "anonymous-access",
header: "Anonymous Access",
diff --git a/packages/web/src/lib/posthogEvents.ts b/packages/web/src/lib/posthogEvents.ts
index f164384a..be5932ba 100644
--- a/packages/web/src/lib/posthogEvents.ts
+++ b/packages/web/src/lib/posthogEvents.ts
@@ -275,5 +275,11 @@ export type PosthogEventMap = {
wa_browse_goto_definition_pressed: {},
//////////////////////////////////////////////////////////////////
wa_explore_menu_reference_clicked: {},
+ //////////////////////////////////////////////////////////////////
+ wa_chat_feedback_submitted: {
+ feedback: 'like' | 'dislike',
+ chatId: string,
+ messageId: string,
+ },
}
export type PosthogEvent = keyof PosthogEventMap;
\ No newline at end of file
diff --git a/packages/web/src/lib/serviceError.ts b/packages/web/src/lib/serviceError.ts
index 051672e1..c942df07 100644
--- a/packages/web/src/lib/serviceError.ts
+++ b/packages/web/src/lib/serviceError.ts
@@ -142,4 +142,12 @@ export const stripeClientNotInitialized = (): ServiceError => {
errorCode: ErrorCode.STRIPE_CLIENT_NOT_INITIALIZED,
message: "Stripe client is not initialized.",
}
+}
+
+export const chatIsReadonly = (): ServiceError => {
+ return {
+ statusCode: StatusCodes.FORBIDDEN,
+ errorCode: ErrorCode.CHAT_IS_READONLY,
+ message: "This chat is read-only and cannot be modified.",
+ }
}
\ No newline at end of file
diff --git a/packages/web/src/lib/utils.ts b/packages/web/src/lib/utils.ts
index 1f0fae89..973a5b5d 100644
--- a/packages/web/src/lib/utils.ts
+++ b/packages/web/src/lib/utils.ts
@@ -269,7 +269,7 @@ export const getCodeHostInfoForRepo = (repo: {
}
}
-export const getCodeHostIcon = (codeHostType: CodeHostType): { src: string, className?: string } | null => {
+export const getCodeHostIcon = (codeHostType: string): { src: string, className?: string } | null => {
switch (codeHostType) {
case "github":
return {
@@ -458,4 +458,6 @@ export const getRepoImageSrc = (imageUrl: string | undefined, repoId: number, do
export const getOrgMetadata = (org: Org): OrgMetadata | null => {
const currentMetadata = orgMetadataSchema.safeParse(org.metadata);
return currentMetadata.success ? currentMetadata.data : null;
-}
\ No newline at end of file
+}
+
+export const IS_MAC = typeof navigator !== 'undefined' && /Mac OS X/.test(navigator.userAgent);
\ No newline at end of file
diff --git a/packages/web/src/middleware.ts b/packages/web/src/middleware.ts
index 5e4c5f1c..1b127f41 100644
--- a/packages/web/src/middleware.ts
+++ b/packages/web/src/middleware.ts
@@ -35,6 +35,6 @@ export async function middleware(request: NextRequest) {
export const config = {
// https://nextjs.org/docs/app/building-your-application/routing/middleware#matcher
matcher: [
- '/((?!api|_next/static|ingest|_next/image|favicon.ico|sitemap.xml|robots.txt|manifest.json|logo_192.png|logo_512.png|sb_logo_light_large.png|arrow.png|placeholder_avatar.png).*)',
+ '/((?!api|_next/static|ingest|_next/image|favicon.ico|sitemap.xml|robots.txt|manifest.json|logo_192.png|logo_512.png|sb_logo_light_large.png|arrow.png|placeholder_avatar.png|sb_logo_dark_small.png|sb_logo_light_small.png).*)',
],
}
diff --git a/packages/web/tailwind.config.ts b/packages/web/tailwind.config.ts
index d740177a..356064d5 100644
--- a/packages/web/tailwind.config.ts
+++ b/packages/web/tailwind.config.ts
@@ -10,143 +10,154 @@ const config = {
],
prefix: "",
theme: {
- container: {
- center: true,
- padding: '2rem',
- screens: {
- '2xl': '1400px'
- }
- },
- extend: {
- colors: {
- border: 'var(--border)',
- input: 'var(--input)',
- ring: 'var(--ring)',
- background: 'var(--background)',
- backgroundSecondary: 'var(--background-secondary)',
- foreground: 'var(--foreground)',
- primary: {
- DEFAULT: 'var(--primary)',
- foreground: 'var(--primary-foreground)'
- },
- secondary: {
- DEFAULT: 'var(--secondary)',
- foreground: 'var(--secondary-foreground)'
- },
- destructive: {
- DEFAULT: 'var(--destructive)',
- foreground: 'var(--destructive-foreground)'
- },
- muted: {
- DEFAULT: 'var(--muted)',
- foreground: 'var(--muted-foreground)'
- },
- accent: {
- DEFAULT: 'var(--accent)',
- foreground: 'var(--accent-foreground)'
- },
- popover: {
- DEFAULT: 'var(--popover)',
- foreground: 'var(--popover-foreground)'
- },
- card: {
- DEFAULT: 'var(--card)',
- foreground: 'var(--card-foreground)'
- },
- highlight: 'var(--highlight)',
- sidebar: {
- DEFAULT: 'var(--sidebar-background)',
- foreground: 'var(--sidebar-foreground)',
- primary: 'var(--sidebar-primary)',
- 'primary-foreground': 'var(--sidebar-primary-foreground)',
- accent: 'var(--sidebar-accent)',
- 'accent-foreground': 'var(--sidebar-accent-foreground)',
- border: 'var(--sidebar-border)',
- ring: 'var(--sidebar-ring)'
- },
- editor: {
- background: 'var(--editor-background)',
- foreground: 'var(--editor-foreground)',
- caret: 'var(--editor-caret)',
- selection: 'var(--editor-selection)',
- selectionMatch: 'var(--editor-selection-match)',
- gutterBackground: 'var(--editor-gutter-background)',
- gutterForeground: 'var(--editor-gutter-foreground)',
- gutterBorder: 'var(--editor-gutter-border)',
- gutterActiveForeground: 'var(--editor-gutter-active-foreground)',
- lineHighlight: 'var(--editor-line-highlight)',
-
- tag: {
- keyword: 'var(--editor-tag-keyword)',
- name: 'var(--editor-tag-name)',
- function: 'var(--editor-tag-function)',
- label: 'var(--editor-tag-label)',
- constant: 'var(--editor-tag-constant)',
- definition: 'var(--editor-tag-definition)',
- brace: 'var(--editor-tag-brace)',
- type: 'var(--editor-tag-type)',
- operator: 'var(--editor-tag-operator)',
- tag: 'var(--editor-tag-tag)',
- 'bracket-square': 'var(--editor-tag-bracket-square)',
- 'bracket-angle': 'var(--editor-tag-bracket-angle)',
- attribute: 'var(--editor-tag-attribute)',
- string: 'var(--editor-tag-string)',
- link: 'var(--editor-tag-link)',
- meta: 'var(--editor-tag-meta)',
- comment: 'var(--editor-tag-comment)',
- emphasis: 'var(--editor-tag-emphasis)',
- heading: 'var(--editor-tag-heading)',
- atom: 'var(--editor-tag-atom)',
- processing: 'var(--editor-tag-processing)',
- separator: 'var(--editor-tag-separator)',
- invalid: 'var(--editor-tag-invalid)',
- quote: 'var(--editor-tag-quote)',
- 'annotation-special': 'var(--editor-tag-annotation-special)',
- number: 'var(--editor-tag-number)',
- regexp: 'var(--editor-tag-regexp)',
- 'variable-local': 'var(--editor-tag-variable-local)',
- }
- },
- },
- fontSize: {
- editor: 'var(--editor-font-size)'
- },
- fontFamily: {
- editor: 'var(--editor-font-family)'
- },
- borderRadius: {
- lg: 'var(--radius)',
- md: 'calc(var(--radius) - 2px)',
- sm: 'calc(var(--radius) - 4px)'
- },
- keyframes: {
- 'accordion-down': {
- from: {
- height: '0'
- },
- to: {
- height: 'var(--radix-accordion-content-height)'
- }
- },
- 'accordion-up': {
- from: {
- height: 'var(--radix-accordion-content-height)'
- },
- to: {
- height: '0'
- }
+ container: {
+ center: true,
+ padding: '2rem',
+ screens: {
+ '2xl': '1400px'
+ }
+ },
+ extend: {
+ colors: {
+ border: 'var(--border)',
+ input: 'var(--input)',
+ ring: 'var(--ring)',
+ background: 'var(--background)',
+ backgroundSecondary: 'var(--background-secondary)',
+ foreground: 'var(--foreground)',
+ primary: {
+ DEFAULT: 'var(--primary)',
+ foreground: 'var(--primary-foreground)'
+ },
+ secondary: {
+ DEFAULT: 'var(--secondary)',
+ foreground: 'var(--secondary-foreground)'
+ },
+ destructive: {
+ DEFAULT: 'var(--destructive)',
+ foreground: 'var(--destructive-foreground)'
+ },
+ muted: {
+ DEFAULT: 'var(--muted)',
+ foreground: 'var(--muted-foreground)',
+ accent: 'var(--muted-accent)'
+ },
+ accent: {
+ DEFAULT: 'var(--accent)',
+ foreground: 'var(--accent-foreground)'
+ },
+ popover: {
+ DEFAULT: 'var(--popover)',
+ foreground: 'var(--popover-foreground)'
+ },
+ card: {
+ DEFAULT: 'var(--card)',
+ foreground: 'var(--card-foreground)'
+ },
+ highlight: 'var(--highlight)',
+ link: 'var(--link)',
+ sidebar: {
+ DEFAULT: 'var(--sidebar-background)',
+ foreground: 'var(--sidebar-foreground)',
+ primary: 'var(--sidebar-primary)',
+ 'primary-foreground': 'var(--sidebar-primary-foreground)',
+ accent: 'var(--sidebar-accent)',
+ 'accent-foreground': 'var(--sidebar-accent-foreground)',
+ border: 'var(--sidebar-border)',
+ ring: 'var(--sidebar-ring)'
+ },
+ warning: 'var(--warning)',
+ editor: {
+ background: 'var(--editor-background)',
+ foreground: 'var(--editor-foreground)',
+ caret: 'var(--editor-caret)',
+ selection: 'var(--editor-selection)',
+ selectionMatch: 'var(--editor-selection-match)',
+ gutterBackground: 'var(--editor-gutter-background)',
+ gutterForeground: 'var(--editor-gutter-foreground)',
+ gutterBorder: 'var(--editor-gutter-border)',
+ gutterActiveForeground: 'var(--editor-gutter-active-foreground)',
+ lineHighlight: 'var(--editor-line-highlight)',
+ tag: {
+ keyword: 'var(--editor-tag-keyword)',
+ name: 'var(--editor-tag-name)',
+ function: 'var(--editor-tag-function)',
+ label: 'var(--editor-tag-label)',
+ constant: 'var(--editor-tag-constant)',
+ definition: 'var(--editor-tag-definition)',
+ brace: 'var(--editor-tag-brace)',
+ type: 'var(--editor-tag-type)',
+ operator: 'var(--editor-tag-operator)',
+ tag: 'var(--editor-tag-tag)',
+ 'bracket-square': 'var(--editor-tag-bracket-square)',
+ 'bracket-angle': 'var(--editor-tag-bracket-angle)',
+ attribute: 'var(--editor-tag-attribute)',
+ string: 'var(--editor-tag-string)',
+ link: 'var(--editor-tag-link)',
+ meta: 'var(--editor-tag-meta)',
+ comment: 'var(--editor-tag-comment)',
+ emphasis: 'var(--editor-tag-emphasis)',
+ heading: 'var(--editor-tag-heading)',
+ atom: 'var(--editor-tag-atom)',
+ processing: 'var(--editor-tag-processing)',
+ separator: 'var(--editor-tag-separator)',
+ invalid: 'var(--editor-tag-invalid)',
+ quote: 'var(--editor-tag-quote)',
+ 'annotation-special': 'var(--editor-tag-annotation-special)',
+ number: 'var(--editor-tag-number)',
+ regexp: 'var(--editor-tag-regexp)',
+ 'variable-local': 'var(--editor-tag-variable-local)'
+ }
+ },
+ chat: {
+ reference: 'var(--chat-reference)',
+ 'reference-hover': 'var(--chat-reference-hover)',
+ 'reference-selected': 'var(--chat-reference-selected)',
+ 'reference-selected-border': 'var(--chat-reference-selected-border)'
}
- },
- animation: {
- 'accordion-down': 'accordion-down 0.2s ease-out',
- 'accordion-up': 'accordion-up 0.2s ease-out',
- 'spin-slow': 'spin 1.5s linear infinite'
- }
- }
- },
+ },
+ fontSize: {
+ editor: 'var(--editor-font-size)'
+ },
+ fontFamily: {
+ editor: 'var(--editor-font-family)'
+ },
+ borderRadius: {
+ lg: 'var(--radius)',
+ md: 'calc(var(--radius) - 2px)',
+ sm: 'calc(var(--radius) - 4px)'
+ },
+ keyframes: {
+ 'accordion-down': {
+ from: {
+ height: '0'
+ },
+ to: {
+ height: 'var(--radix-accordion-content-height)'
+ }
+ },
+ 'accordion-up': {
+ from: {
+ height: 'var(--radix-accordion-content-height)'
+ },
+ to: {
+ height: '0'
+ }
+ }
+ },
+ animation: {
+ 'accordion-down': 'accordion-down 0.2s ease-out',
+ 'accordion-up': 'accordion-up 0.2s ease-out',
+ 'spin-slow': 'spin 1.5s linear infinite',
+ 'bounce-slow': 'bounce 1.5s linear infinite'
+ }
+ }
+ },
plugins: [
// eslint-disable-next-line @typescript-eslint/no-require-imports
require("tailwindcss-animate"),
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
+ require('@tailwindcss/typography'),
],
} satisfies Config
diff --git a/schemas/v3/index.json b/schemas/v3/index.json
index 3f6b7f66..f0bf0f1a 100644
--- a/schemas/v3/index.json
+++ b/schemas/v3/index.json
@@ -101,6 +101,13 @@
}
},
"additionalProperties": false
+ },
+ "models": {
+ "type": "array",
+ "description": "Defines a collection of language models that are available to Sourcebot.",
+ "items": {
+ "$ref": "./languageModel.json"
+ }
}
},
"additionalProperties": false
diff --git a/schemas/v3/languageModel.json b/schemas/v3/languageModel.json
new file mode 100644
index 00000000..73192b0c
--- /dev/null
+++ b/schemas/v3/languageModel.json
@@ -0,0 +1,271 @@
+{
+ "type": "object",
+ "title": "LanguageModel",
+ "definitions": {
+ "OpenAILanguageModel": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "const": "openai",
+ "description": "OpenAI Configuration"
+ },
+ "model": {
+ "type": "string",
+ "description": "The name of the language model.",
+ "examples": [
+ "gpt-4.1",
+ "o4-mini",
+ "o3",
+ "o3-deep-research"
+ ]
+ },
+ "displayName": {
+ "type": "string",
+ "description": "Optional display name."
+ },
+ "token": {
+ "$ref": "./shared.json#/definitions/Token",
+ "description": "Optional API key to use with the model. Defaults to the `OPENAI_API_KEY` environment variable."
+ },
+ "baseUrl": {
+ "type": "string",
+ "format": "url",
+ "pattern": "^https?:\\/\\/[^\\s/$.?#].[^\\s]*$",
+ "description": "Optional base URL."
+ }
+ },
+ "required": [
+ "provider",
+ "model"
+ ],
+ "additionalProperties": false
+ },
+ "AmazonBedrockLanguageModel": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "const": "amazon-bedrock",
+ "description": "Amazon Bedrock Configuration"
+ },
+ "model": {
+ "type": "string",
+ "description": "The name of the language model."
+ },
+ "displayName": {
+ "type": "string",
+ "description": "Optional display name."
+ },
+ "accessKeyId": {
+ "$ref": "./shared.json#/definitions/Token",
+ "description": "Optional access key ID to use with the model. Defaults to the `AWS_ACCESS_KEY_ID` environment variable."
+ },
+ "accessKeySecret": {
+ "$ref": "./shared.json#/definitions/Token",
+ "description": "Optional secret access key to use with the model. Defaults to the `AWS_SECRET_ACCESS_KEY` environment variable."
+ },
+ "region": {
+ "type": "string",
+ "description": "The AWS region. Defaults to the `AWS_REGION` environment variable.",
+ "examples": [
+ "us-east-1",
+ "us-west-2",
+ "eu-west-1"
+ ]
+ },
+ "baseUrl": {
+ "type": "string",
+ "format": "url",
+ "pattern": "^https?:\\/\\/[^\\s/$.?#].[^\\s]*$",
+ "description": "Optional base URL."
+ }
+ },
+ "required": [
+ "provider",
+ "model"
+ ],
+ "additionalProperties": false
+ },
+ "AnthropicLanguageModel": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "const": "anthropic",
+ "description": "Anthropic Configuration"
+ },
+ "model": {
+ "type": "string",
+ "description": "The name of the language model."
+ },
+ "displayName": {
+ "type": "string",
+ "description": "Optional display name."
+ },
+ "token": {
+ "$ref": "./shared.json#/definitions/Token",
+ "description": "Optional API key to use with the model. Defaults to the `ANTHROPIC_API_KEY` environment variable."
+ },
+ "baseUrl": {
+ "type": "string",
+ "format": "url",
+ "pattern": "^https?:\\/\\/[^\\s/$.?#].[^\\s]*$",
+ "description": "Optional base URL."
+ }
+ },
+ "required": [
+ "provider",
+ "model"
+ ],
+ "additionalProperties": false
+ },
+ "GoogleGenerativeAILanguageModel": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "const": "google-generative-ai",
+ "description": "Google Generative AI Configuration"
+ },
+ "model": {
+ "type": "string",
+ "description": "The name of the language model."
+ },
+ "displayName": {
+ "type": "string",
+ "description": "Optional display name."
+ },
+ "token": {
+ "$ref": "./shared.json#/definitions/Token",
+ "description": "Optional API key to use with the model. Defaults to the `GOOGLE_GENERATIVE_AI_API_KEY` environment variable."
+ },
+ "baseUrl": {
+ "type": "string",
+ "format": "url",
+ "pattern": "^https?:\\/\\/[^\\s/$.?#].[^\\s]*$",
+ "description": "Optional base URL."
+ }
+ },
+ "required": [
+ "provider",
+ "model"
+ ],
+ "additionalProperties": false
+ },
+ "GoogleVertexLanguageModel": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "const": "google-vertex",
+ "description": "Google Vertex AI Configuration"
+ },
+ "model": {
+ "type": "string",
+ "description": "The name of the language model.",
+ "examples": [
+ "gemini-2.0-flash-exp",
+ "gemini-1.5-pro",
+ "gemini-1.5-flash"
+ ]
+ },
+ "displayName": {
+ "type": "string",
+ "description": "Optional display name."
+ },
+ "project": {
+ "type": "string",
+ "description": "The Google Cloud project ID. Defaults to the `GOOGLE_VERTEX_PROJECT` environment variable."
+ },
+ "region": {
+ "type": "string",
+ "description": "The Google Cloud region. Defaults to the `GOOGLE_VERTEX_REGION` environment variable.",
+ "examples": [
+ "us-central1",
+ "us-east1",
+ "europe-west1"
+ ]
+ },
+ "credentials": {
+ "$ref": "./shared.json#/definitions/Token",
+ "description": "Optional file path to service account credentials JSON. Defaults to the `GOOGLE_APPLICATION_CREDENTIALS` environment variable or application default credentials."
+ },
+ "baseUrl": {
+ "type": "string",
+ "format": "url",
+ "pattern": "^https?:\\/\\/[^\\s/$.?#].[^\\s]*$",
+ "description": "Optional base URL."
+ }
+ },
+ "required": [
+ "provider",
+ "model"
+ ],
+ "additionalProperties": false
+ },
+ "GoogleVertexAnthropicLanguageModel": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "const": "google-vertex-anthropic",
+ "description": "Google Vertex AI Anthropic Configuration"
+ },
+ "model": {
+ "type": "string",
+ "description": "The name of the Anthropic language model running on Google Vertex.",
+ "examples": [
+ "claude-sonnet-4"
+ ]
+ },
+ "displayName": {
+ "type": "string",
+ "description": "Optional display name."
+ },
+ "project": {
+ "type": "string",
+ "description": "The Google Cloud project ID. Defaults to the `GOOGLE_VERTEX_PROJECT` environment variable."
+ },
+ "region": {
+ "type": "string",
+ "description": "The Google Cloud region. Defaults to the `GOOGLE_VERTEX_REGION` environment variable.",
+ "examples": [
+ "us-central1",
+ "us-east1",
+ "europe-west1"
+ ]
+ },
+ "credentials": {
+ "$ref": "./shared.json#/definitions/Token",
+ "description": "Optional file path to service account credentials JSON. Defaults to the `GOOGLE_APPLICATION_CREDENTIALS` environment variable or application default credentials."
+ },
+ "baseUrl": {
+ "type": "string",
+ "format": "url",
+ "pattern": "^https?:\\/\\/[^\\s/$.?#].[^\\s]*$",
+ "description": "Optional base URL."
+ }
+ },
+ "required": [
+ "provider",
+ "model"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "oneOf": [
+ {
+ "$ref": "#/definitions/OpenAILanguageModel"
+ },
+ {
+ "$ref": "#/definitions/AmazonBedrockLanguageModel"
+ },
+ {
+ "$ref": "#/definitions/AnthropicLanguageModel"
+ },
+ {
+ "$ref": "#/definitions/GoogleGenerativeAILanguageModel"
+ },
+ {
+ "$ref": "#/definitions/GoogleVertexLanguageModel"
+ },
+ {
+ "$ref": "#/definitions/GoogleVertexAnthropicLanguageModel"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
index ecac7374..7a473a8c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5,6 +5,151 @@ __metadata:
version: 8
cacheKey: 10c0
+"@ai-sdk/amazon-bedrock@npm:3.0.0-beta.7":
+ version: 3.0.0-beta.7
+ resolution: "@ai-sdk/amazon-bedrock@npm:3.0.0-beta.7"
+ dependencies:
+ "@ai-sdk/provider": "npm:2.0.0-beta.1"
+ "@ai-sdk/provider-utils": "npm:3.0.0-beta.3"
+ "@smithy/eventstream-codec": "npm:^4.0.1"
+ "@smithy/util-utf8": "npm:^4.0.0"
+ aws4fetch: "npm:^1.0.20"
+ peerDependencies:
+ zod: ^3.25.49 || ^4
+ checksum: 10c0/0a4849857246964b9949ef9c75f0feb2d4a4b58b9384f73ccd729bdbd9d535207c57ab5f4e585edda772f183bdbcd570f16656879470242b2a2c0e03709429ad
+ languageName: node
+ linkType: hard
+
+"@ai-sdk/anthropic@npm:2.0.0-beta.8":
+ version: 2.0.0-beta.8
+ resolution: "@ai-sdk/anthropic@npm:2.0.0-beta.8"
+ dependencies:
+ "@ai-sdk/provider": "npm:2.0.0-beta.1"
+ "@ai-sdk/provider-utils": "npm:3.0.0-beta.5"
+ peerDependencies:
+ zod: ^3.25.76 || ^4
+ checksum: 10c0/60a026bf0aaff680d1397bc736e5fe051944146fceba1327aa7e92a45f20050f5c9612b8b90764314b022d9686125e5dc3a3494afe983e8864dbc06c4c6fa2ab
+ languageName: node
+ linkType: hard
+
+"@ai-sdk/gateway@npm:1.0.0-beta.8":
+ version: 1.0.0-beta.8
+ resolution: "@ai-sdk/gateway@npm:1.0.0-beta.8"
+ dependencies:
+ "@ai-sdk/provider": "npm:2.0.0-beta.1"
+ "@ai-sdk/provider-utils": "npm:3.0.0-beta.3"
+ peerDependencies:
+ zod: ^3.25.49 || ^4
+ checksum: 10c0/0affd947802a5af16024390418b382d2893dd60bd26d6c47e9f9eaf4044a79bdcb918180f038403c165a60ef161ec0608c7512412d35d169bac1324e73c55a89
+ languageName: node
+ linkType: hard
+
+"@ai-sdk/google-vertex@npm:3.0.0-beta.15":
+ version: 3.0.0-beta.15
+ resolution: "@ai-sdk/google-vertex@npm:3.0.0-beta.15"
+ dependencies:
+ "@ai-sdk/anthropic": "npm:2.0.0-beta.8"
+ "@ai-sdk/google": "npm:2.0.0-beta.13"
+ "@ai-sdk/provider": "npm:2.0.0-beta.1"
+ "@ai-sdk/provider-utils": "npm:3.0.0-beta.5"
+ google-auth-library: "npm:^9.15.0"
+ peerDependencies:
+ zod: ^3.25.76 || ^4
+ checksum: 10c0/b65e7279e24d19d543a2cf23900bd558d232f505755fe971168907629801e0c0465120a63b5258f9e8025cc4ef8f4d12c0034f3fa74b5690a56c1bfeb6030a06
+ languageName: node
+ linkType: hard
+
+"@ai-sdk/google@npm:2.0.0-beta.11":
+ version: 2.0.0-beta.11
+ resolution: "@ai-sdk/google@npm:2.0.0-beta.11"
+ dependencies:
+ "@ai-sdk/provider": "npm:2.0.0-beta.1"
+ "@ai-sdk/provider-utils": "npm:3.0.0-beta.3"
+ peerDependencies:
+ zod: ^3.25.49 || ^4
+ checksum: 10c0/7c889f314e2d3d07945a6ced65869a607c73bdf81b7651a309a88e5a18de99deefca50b9147649fcb6f48c80e829e346036b8a96a4d39ff9d071ee4e687efa33
+ languageName: node
+ linkType: hard
+
+"@ai-sdk/google@npm:2.0.0-beta.13":
+ version: 2.0.0-beta.13
+ resolution: "@ai-sdk/google@npm:2.0.0-beta.13"
+ dependencies:
+ "@ai-sdk/provider": "npm:2.0.0-beta.1"
+ "@ai-sdk/provider-utils": "npm:3.0.0-beta.5"
+ peerDependencies:
+ zod: ^3.25.76 || ^4
+ checksum: 10c0/a627cc26b30e8ca71d1855ef49782dc69ea228d880077f4981f9b26342bb1a75cf4b77bb8e87bb5caa113707e804bfef94bafefe466955a608a85045a1d9fa8a
+ languageName: node
+ linkType: hard
+
+"@ai-sdk/openai@npm:2.0.0-beta.9":
+ version: 2.0.0-beta.9
+ resolution: "@ai-sdk/openai@npm:2.0.0-beta.9"
+ dependencies:
+ "@ai-sdk/provider": "npm:2.0.0-beta.1"
+ "@ai-sdk/provider-utils": "npm:3.0.0-beta.3"
+ peerDependencies:
+ zod: ^3.25.49 || ^4
+ checksum: 10c0/67ba680f392c267f083685a6c762241c1df6d0a1c0483c4e37e299bba8146d98fa58aa379b00cff7f091910d74cdd8dd2d74ef3caa61d15ebcb8a7246c9eedc4
+ languageName: node
+ linkType: hard
+
+"@ai-sdk/provider-utils@npm:3.0.0-beta.3":
+ version: 3.0.0-beta.3
+ resolution: "@ai-sdk/provider-utils@npm:3.0.0-beta.3"
+ dependencies:
+ "@ai-sdk/provider": "npm:2.0.0-beta.1"
+ "@standard-schema/spec": "npm:^1.0.0"
+ eventsource-parser: "npm:^3.0.3"
+ zod-to-json-schema: "npm:^3.24.1"
+ peerDependencies:
+ zod: ^3.25.49 || ^4
+ checksum: 10c0/11f1628a48baff05ddd48bc8748f2babf06d35ba541c8dc92965697d63b85fc8db640c42bbe73d9cf5f0f07a5093806cd7659a6e82da3a8af70ea4da7e44a215
+ languageName: node
+ linkType: hard
+
+"@ai-sdk/provider-utils@npm:3.0.0-beta.5":
+ version: 3.0.0-beta.5
+ resolution: "@ai-sdk/provider-utils@npm:3.0.0-beta.5"
+ dependencies:
+ "@ai-sdk/provider": "npm:2.0.0-beta.1"
+ "@standard-schema/spec": "npm:^1.0.0"
+ eventsource-parser: "npm:^3.0.3"
+ zod-to-json-schema: "npm:^3.24.1"
+ peerDependencies:
+ zod: ^3.25.76 || ^4
+ checksum: 10c0/229a53672accc5d9d986da2e18f619dbcfaf64ab269c8cc9e955480c4428d2a87255330c587453d01eb66ac297bb6975f91c24a93f87dd4b84f6428cb60d4211
+ languageName: node
+ linkType: hard
+
+"@ai-sdk/provider@npm:2.0.0-beta.1":
+ version: 2.0.0-beta.1
+ resolution: "@ai-sdk/provider@npm:2.0.0-beta.1"
+ dependencies:
+ json-schema: "npm:^0.4.0"
+ checksum: 10c0/2d76518d2b3d5ac6a3838730032faea31e1bb5c5a526f40c6cb7e906c59a52a664b2b67e7420fe25611e9783e8a20f0241c8b922eee6f02bb49c1b4afd60f58b
+ languageName: node
+ linkType: hard
+
+"@ai-sdk/react@npm:2.0.0-beta.21":
+ version: 2.0.0-beta.21
+ resolution: "@ai-sdk/react@npm:2.0.0-beta.21"
+ dependencies:
+ "@ai-sdk/provider-utils": "npm:3.0.0-beta.3"
+ ai: "npm:5.0.0-beta.21"
+ swr: "npm:^2.2.5"
+ throttleit: "npm:2.1.0"
+ peerDependencies:
+ react: ^18 || ^19 || ^19.0.0-rc
+ zod: ^3.25.49 || ^4
+ peerDependenciesMeta:
+ zod:
+ optional: true
+ checksum: 10c0/2821912075555f81f2cfb0bcdb806e53afeba1293d2bc2195970fc270e3530347910ed75aac5c91fbae76a00724ee13f23bb71b911805b929d6f5e0f46c2f2e7
+ languageName: node
+ linkType: hard
+
"@alloc/quick-lru@npm:^5.2.0":
version: 5.2.0
resolution: "@alloc/quick-lru@npm:5.2.0"
@@ -107,6 +252,38 @@ __metadata:
languageName: node
linkType: hard
+"@aws-crypto/crc32@npm:5.2.0":
+ version: 5.2.0
+ resolution: "@aws-crypto/crc32@npm:5.2.0"
+ dependencies:
+ "@aws-crypto/util": "npm:^5.2.0"
+ "@aws-sdk/types": "npm:^3.222.0"
+ tslib: "npm:^2.6.2"
+ checksum: 10c0/eab9581d3363af5ea498ae0e72de792f54d8890360e14a9d8261b7b5c55ebe080279fb2556e07994d785341cdaa99ab0b1ccf137832b53b5904cd6928f2b094b
+ languageName: node
+ linkType: hard
+
+"@aws-crypto/util@npm:^5.2.0":
+ version: 5.2.0
+ resolution: "@aws-crypto/util@npm:5.2.0"
+ dependencies:
+ "@aws-sdk/types": "npm:^3.222.0"
+ "@smithy/util-utf8": "npm:^2.0.0"
+ tslib: "npm:^2.6.2"
+ checksum: 10c0/0362d4c197b1fd64b423966945130207d1fe23e1bb2878a18e361f7743c8d339dad3f8729895a29aa34fff6a86c65f281cf5167c4bf253f21627ae80b6dd2951
+ languageName: node
+ linkType: hard
+
+"@aws-sdk/types@npm:^3.222.0":
+ version: 3.821.0
+ resolution: "@aws-sdk/types@npm:3.821.0"
+ dependencies:
+ "@smithy/types": "npm:^4.3.1"
+ tslib: "npm:^2.6.2"
+ checksum: 10c0/6202b2c0db1dd5ee78e6dc45c51f8b19deff0ee400dd5a7a15d089cc5493a2db6a6e0553ff32742e8bc810d428b36599534e14c1b466695550aef1b1d87f043d
+ languageName: node
+ linkType: hard
+
"@babel/code-frame@npm:^7.24.2, @babel/code-frame@npm:^7.26.2":
version: 7.26.2
resolution: "@babel/code-frame@npm:7.26.2"
@@ -271,6 +448,13 @@ __metadata:
languageName: node
linkType: hard
+"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7":
+ version: 7.27.6
+ resolution: "@babel/runtime@npm:7.27.6"
+ checksum: 10c0/89726be83f356f511dcdb74d3ea4d873a5f0cf0017d4530cb53aa27380c01ca102d573eff8b8b77815e624b1f8c24e7f0311834ad4fb632c90a770fda00bd4c8
+ languageName: node
+ linkType: hard
+
"@babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.18.6":
version: 7.26.10
resolution: "@babel/runtime@npm:7.26.10"
@@ -280,13 +464,6 @@ __metadata:
languageName: node
linkType: hard
-"@babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7":
- version: 7.27.6
- resolution: "@babel/runtime@npm:7.27.6"
- checksum: 10c0/89726be83f356f511dcdb74d3ea4d873a5f0cf0017d4530cb53aa27380c01ca102d573eff8b8b77815e624b1f8c24e7f0311834ad4fb632c90a770fda00bd4c8
- languageName: node
- linkType: hard
-
"@babel/template@npm:^7.24.0, @babel/template@npm:^7.26.9":
version: 7.26.9
resolution: "@babel/template@npm:7.26.9"
@@ -1861,6 +2038,13 @@ __metadata:
languageName: node
linkType: hard
+"@juggle/resize-observer@npm:^3.4.0":
+ version: 3.4.0
+ resolution: "@juggle/resize-observer@npm:3.4.0"
+ checksum: 10c0/12930242357298c6f2ad5d4ec7cf631dfb344ca7c8c830ab7f64e6ac11eb1aae486901d8d880fd08fb1b257800c160a0da3aee1e7ed9adac0ccbb9b7c5d93347
+ languageName: node
+ linkType: hard
+
"@kwsites/file-exists@npm:^1.1.1":
version: 1.1.1
resolution: "@kwsites/file-exists@npm:1.1.1"
@@ -2811,6 +2995,15 @@ __metadata:
languageName: node
linkType: hard
+"@opentelemetry/api-logs@npm:0.203.0, @opentelemetry/api-logs@npm:^0.203.0":
+ version: 0.203.0
+ resolution: "@opentelemetry/api-logs@npm:0.203.0"
+ dependencies:
+ "@opentelemetry/api": "npm:^1.3.0"
+ checksum: 10c0/e7a0a0ff46aaeb62192a99f45ef4889222e4fea09be25cab6fea811afc2df95c02ea050b2c98dfc0fc5a6ec6a623d87096af2751fdf91ddbb3afcab61b5325da
+ languageName: node
+ linkType: hard
+
"@opentelemetry/api-logs@npm:0.57.2":
version: 0.57.2
resolution: "@opentelemetry/api-logs@npm:0.57.2"
@@ -2820,7 +3013,7 @@ __metadata:
languageName: node
linkType: hard
-"@opentelemetry/api@npm:^1.3.0, @opentelemetry/api@npm:^1.4.0, @opentelemetry/api@npm:^1.9.0":
+"@opentelemetry/api@npm:1.9.0, @opentelemetry/api@npm:^1.3.0, @opentelemetry/api@npm:^1.4.0, @opentelemetry/api@npm:^1.9.0":
version: 1.9.0
resolution: "@opentelemetry/api@npm:1.9.0"
checksum: 10c0/9aae2fe6e8a3a3eeb6c1fdef78e1939cf05a0f37f8a4fae4d6bf2e09eb1e06f966ece85805626e01ba5fab48072b94f19b835449e58b6d26720ee19a58298add
@@ -2847,6 +3040,17 @@ __metadata:
languageName: node
linkType: hard
+"@opentelemetry/core@npm:2.0.1":
+ version: 2.0.1
+ resolution: "@opentelemetry/core@npm:2.0.1"
+ dependencies:
+ "@opentelemetry/semantic-conventions": "npm:^1.29.0"
+ peerDependencies:
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ checksum: 10c0/d587b1289559757d80da98039f9f57612f84f72ec608cd665dc467c7c6c5ce3a987dfcc2c63b521c7c86ce984a2552b3ead15a0dc458de1cf6bde5cdfe4ca9d8
+ languageName: node
+ linkType: hard
+
"@opentelemetry/instrumentation-amqplib@npm:^0.46.1":
version: 0.46.1
resolution: "@opentelemetry/instrumentation-amqplib@npm:0.46.1"
@@ -3155,6 +3359,19 @@ __metadata:
languageName: node
linkType: hard
+"@opentelemetry/instrumentation@npm:^0.203.0":
+ version: 0.203.0
+ resolution: "@opentelemetry/instrumentation@npm:0.203.0"
+ dependencies:
+ "@opentelemetry/api-logs": "npm:0.203.0"
+ import-in-the-middle: "npm:^1.8.1"
+ require-in-the-middle: "npm:^7.1.1"
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 10c0/b9de27ea7b42c54b1d0dab15dac62d4fc71c781bb6a48e90fa4ce8ce97be1b78e1fa9f05f58c39f68ca0e4a5590b8538d04209482f6b0632958926f7e80a28c1
+ languageName: node
+ linkType: hard
+
"@opentelemetry/redis-common@npm:^0.36.2":
version: 0.36.2
resolution: "@opentelemetry/redis-common@npm:0.36.2"
@@ -3174,6 +3391,31 @@ __metadata:
languageName: node
linkType: hard
+"@opentelemetry/resources@npm:2.0.1":
+ version: 2.0.1
+ resolution: "@opentelemetry/resources@npm:2.0.1"
+ dependencies:
+ "@opentelemetry/core": "npm:2.0.1"
+ "@opentelemetry/semantic-conventions": "npm:^1.29.0"
+ peerDependencies:
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ checksum: 10c0/96532b7553b26607a7a892d72f6b03ad12bd542dc23c95135a8ae40362da9c883c21a4cff3d2296d9e0e9bd899a5977e325ed52d83142621a8ffe81d08d99341
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/sdk-logs@npm:^0.203.0":
+ version: 0.203.0
+ resolution: "@opentelemetry/sdk-logs@npm:0.203.0"
+ dependencies:
+ "@opentelemetry/api-logs": "npm:0.203.0"
+ "@opentelemetry/core": "npm:2.0.1"
+ "@opentelemetry/resources": "npm:2.0.1"
+ peerDependencies:
+ "@opentelemetry/api": ">=1.4.0 <1.10.0"
+ checksum: 10c0/02dd9d9969628f05f71ae1d149f1aa6d1fee2dad607923a68a1cfc923e94b046dcc0e18e85e865324e3bda0cee7a5a0ba9fa0d57e4e95fa672be103e2ce60270
+ languageName: node
+ linkType: hard
+
"@opentelemetry/sdk-trace-base@npm:^1.30.1":
version: 1.30.1
resolution: "@opentelemetry/sdk-trace-base@npm:1.30.1"
@@ -3201,6 +3443,13 @@ __metadata:
languageName: node
linkType: hard
+"@opentelemetry/semantic-conventions@npm:^1.29.0":
+ version: 1.36.0
+ resolution: "@opentelemetry/semantic-conventions@npm:1.36.0"
+ checksum: 10c0/edc8a6fe3ec4fc0c67ba3a92b86fb3dcc78fe1eb4f19838d8013c3232b9868540a034dd25cfe0afdd5eae752c5f0e9f42272ff46da144a2d5b35c644478e1c62
+ languageName: node
+ linkType: hard
+
"@opentelemetry/sql-common@npm:^0.40.1":
version: 0.40.1
resolution: "@opentelemetry/sql-common@npm:0.40.1"
@@ -3335,6 +3584,33 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-accordion@npm:^1.2.11":
+ version: 1.2.11
+ resolution: "@radix-ui/react-accordion@npm:1.2.11"
+ dependencies:
+ "@radix-ui/primitive": "npm:1.1.2"
+ "@radix-ui/react-collapsible": "npm:1.1.11"
+ "@radix-ui/react-collection": "npm:1.1.7"
+ "@radix-ui/react-compose-refs": "npm:1.1.2"
+ "@radix-ui/react-context": "npm:1.1.2"
+ "@radix-ui/react-direction": "npm:1.1.1"
+ "@radix-ui/react-id": "npm:1.1.1"
+ "@radix-ui/react-primitive": "npm:2.1.3"
+ "@radix-ui/react-use-controllable-state": "npm:1.2.2"
+ peerDependencies:
+ "@types/react": "*"
+ "@types/react-dom": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ "@types/react-dom":
+ optional: true
+ checksum: 10c0/40c5f09380c86e61d8c24ec596be4099cf4b26533f7de7c7f1da8c2e558dfaca93298011484e0697cb9b7fd9949b21c755d67dbc649accec877c02aac3b48a36
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-alert-dialog@npm:^1.1.5":
version: 1.1.6
resolution: "@radix-ui/react-alert-dialog@npm:1.1.6"
@@ -3426,6 +3702,32 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-collapsible@npm:1.1.11, @radix-ui/react-collapsible@npm:^1.1.11":
+ version: 1.1.11
+ resolution: "@radix-ui/react-collapsible@npm:1.1.11"
+ dependencies:
+ "@radix-ui/primitive": "npm:1.1.2"
+ "@radix-ui/react-compose-refs": "npm:1.1.2"
+ "@radix-ui/react-context": "npm:1.1.2"
+ "@radix-ui/react-id": "npm:1.1.1"
+ "@radix-ui/react-presence": "npm:1.1.4"
+ "@radix-ui/react-primitive": "npm:2.1.3"
+ "@radix-ui/react-use-controllable-state": "npm:1.2.2"
+ "@radix-ui/react-use-layout-effect": "npm:1.1.1"
+ peerDependencies:
+ "@types/react": "*"
+ "@types/react-dom": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ "@types/react-dom":
+ optional: true
+ checksum: 10c0/fa2de539ef06e2b2d18acebb12a34ce1534ca88bd484b7359aac05534d1e551fe83eaafbf60915c00161bb370f0dc9fc303903133510dea0a59fd018155b7db5
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-collection@npm:1.1.2":
version: 1.1.2
resolution: "@radix-ui/react-collection@npm:1.1.2"
@@ -3448,6 +3750,28 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-collection@npm:1.1.7":
+ version: 1.1.7
+ resolution: "@radix-ui/react-collection@npm:1.1.7"
+ dependencies:
+ "@radix-ui/react-compose-refs": "npm:1.1.2"
+ "@radix-ui/react-context": "npm:1.1.2"
+ "@radix-ui/react-primitive": "npm:2.1.3"
+ "@radix-ui/react-slot": "npm:1.2.3"
+ peerDependencies:
+ "@types/react": "*"
+ "@types/react-dom": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ "@types/react-dom":
+ optional: true
+ checksum: 10c0/fa321a7300095508491f75414f02b243f0c3f179dc0728cfd115e2ea9f6f48f1516532b59f526d9ac81bbab63cd98a052074b4703ec0b9428fac945ebabec5fd
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-compose-refs@npm:1.0.1":
version: 1.0.1
resolution: "@radix-ui/react-compose-refs@npm:1.0.1"
@@ -3608,6 +3932,19 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-direction@npm:1.1.1":
+ version: 1.1.1
+ resolution: "@radix-ui/react-direction@npm:1.1.1"
+ peerDependencies:
+ "@types/react": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ checksum: 10c0/7a89d9291f846a3105e45f4df98d6b7a08f8d7b30acdcd253005dc9db107ee83cbbebc9e47a9af1e400bcd47697f1511ceab23a399b0da854488fc7220482ac9
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-dismissable-layer@npm:1.0.5":
version: 1.0.5
resolution: "@radix-ui/react-dismissable-layer@npm:1.0.5"
@@ -3818,6 +4155,21 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-id@npm:1.1.1":
+ version: 1.1.1
+ resolution: "@radix-ui/react-id@npm:1.1.1"
+ dependencies:
+ "@radix-ui/react-use-layout-effect": "npm:1.1.1"
+ peerDependencies:
+ "@types/react": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ checksum: 10c0/7d12e76818763d592c331277ef62b197e2e64945307e650bd058f0090e5ae48bbd07691b23b7e9e977901ef4eadcb3e2d5eaeb17a13859083384be83fc1292c7
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-label@npm:^2.1.0":
version: 2.1.2
resolution: "@radix-ui/react-label@npm:2.1.2"
@@ -5835,6 +6187,94 @@ __metadata:
languageName: node
linkType: hard
+"@smithy/eventstream-codec@npm:^4.0.1":
+ version: 4.0.4
+ resolution: "@smithy/eventstream-codec@npm:4.0.4"
+ dependencies:
+ "@aws-crypto/crc32": "npm:5.2.0"
+ "@smithy/types": "npm:^4.3.1"
+ "@smithy/util-hex-encoding": "npm:^4.0.0"
+ tslib: "npm:^2.6.2"
+ checksum: 10c0/89b76826d4d3bf97317e3539ece105b9a03552144ad816a687b0b2cbca60e2b3513062c04b6cfacaffb270d616ffc8ac8bf549afc4aa676a6d7465df5a3215ba
+ languageName: node
+ linkType: hard
+
+"@smithy/is-array-buffer@npm:^2.2.0":
+ version: 2.2.0
+ resolution: "@smithy/is-array-buffer@npm:2.2.0"
+ dependencies:
+ tslib: "npm:^2.6.2"
+ checksum: 10c0/2f2523cd8cc4538131e408eb31664983fecb0c8724956788b015aaf3ab85a0c976b50f4f09b176f1ed7bbe79f3edf80743be7a80a11f22cd9ce1285d77161aaf
+ languageName: node
+ linkType: hard
+
+"@smithy/is-array-buffer@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "@smithy/is-array-buffer@npm:4.0.0"
+ dependencies:
+ tslib: "npm:^2.6.2"
+ checksum: 10c0/ae393fbd5944d710443cd5dd225d1178ef7fb5d6259c14f3e1316ec75e401bda6cf86f7eb98bfd38e5ed76e664b810426a5756b916702cbd418f0933e15e7a3b
+ languageName: node
+ linkType: hard
+
+"@smithy/types@npm:^4.3.1":
+ version: 4.3.1
+ resolution: "@smithy/types@npm:4.3.1"
+ dependencies:
+ tslib: "npm:^2.6.2"
+ checksum: 10c0/8b350562b9ed4ff97465025b4ae77a34bb07b9d47fb6f9781755aac9401b0355a63c2fef307393e2dae3fa0277149dd7d83f5bc2a63d4ad3519ea32fd56b5cda
+ languageName: node
+ linkType: hard
+
+"@smithy/util-buffer-from@npm:^2.2.0":
+ version: 2.2.0
+ resolution: "@smithy/util-buffer-from@npm:2.2.0"
+ dependencies:
+ "@smithy/is-array-buffer": "npm:^2.2.0"
+ tslib: "npm:^2.6.2"
+ checksum: 10c0/223d6a508b52ff236eea01cddc062b7652d859dd01d457a4e50365af3de1e24a05f756e19433f6ccf1538544076b4215469e21a4ea83dc1d58d829725b0dbc5a
+ languageName: node
+ linkType: hard
+
+"@smithy/util-buffer-from@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "@smithy/util-buffer-from@npm:4.0.0"
+ dependencies:
+ "@smithy/is-array-buffer": "npm:^4.0.0"
+ tslib: "npm:^2.6.2"
+ checksum: 10c0/be7cd33b6cb91503982b297716251e67cdca02819a15797632091cadab2dc0b4a147fff0709a0aa9bbc0b82a2644a7ed7c8afdd2194d5093cee2e9605b3a9f6f
+ languageName: node
+ linkType: hard
+
+"@smithy/util-hex-encoding@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "@smithy/util-hex-encoding@npm:4.0.0"
+ dependencies:
+ tslib: "npm:^2.6.2"
+ checksum: 10c0/70dbb3aa1a79aff3329d07a66411ff26398df338bdd8a6d077b438231afe3dc86d9a7022204baddecd8bc633f059d5c841fa916d81dd7447ea79b64148f386d2
+ languageName: node
+ linkType: hard
+
+"@smithy/util-utf8@npm:^2.0.0":
+ version: 2.3.0
+ resolution: "@smithy/util-utf8@npm:2.3.0"
+ dependencies:
+ "@smithy/util-buffer-from": "npm:^2.2.0"
+ tslib: "npm:^2.6.2"
+ checksum: 10c0/e18840c58cc507ca57fdd624302aefd13337ee982754c9aa688463ffcae598c08461e8620e9852a424d662ffa948fc64919e852508028d09e89ced459bd506ab
+ languageName: node
+ linkType: hard
+
+"@smithy/util-utf8@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "@smithy/util-utf8@npm:4.0.0"
+ dependencies:
+ "@smithy/util-buffer-from": "npm:^4.0.0"
+ tslib: "npm:^2.6.2"
+ checksum: 10c0/28a5a5372cbf0b3d2e32dd16f79b04c2aec6f704cf13789db922e9686fde38dde0171491cfa4c2c201595d54752a319faaeeed3c325329610887694431e28c98
+ languageName: node
+ linkType: hard
+
"@socket.io/component-emitter@npm:~3.1.0":
version: 3.1.2
resolution: "@socket.io/component-emitter@npm:3.1.2"
@@ -6010,6 +6450,12 @@ __metadata:
version: 0.0.0-use.local
resolution: "@sourcebot/web@workspace:packages/web"
dependencies:
+ "@ai-sdk/amazon-bedrock": "npm:3.0.0-beta.7"
+ "@ai-sdk/anthropic": "npm:2.0.0-beta.8"
+ "@ai-sdk/google": "npm:2.0.0-beta.11"
+ "@ai-sdk/google-vertex": "npm:3.0.0-beta.15"
+ "@ai-sdk/openai": "npm:2.0.0-beta.9"
+ "@ai-sdk/react": "npm:2.0.0-beta.21"
"@auth/prisma-adapter": "npm:^2.7.4"
"@codemirror/commands": "npm:^6.6.0"
"@codemirror/lang-cpp": "npm:^6.0.2"
@@ -6041,9 +6487,14 @@ __metadata:
"@hookform/resolvers": "npm:^3.9.0"
"@iconify/react": "npm:^5.1.0"
"@iizukak/codemirror-lang-wgsl": "npm:^0.3.0"
+ "@opentelemetry/api-logs": "npm:^0.203.0"
+ "@opentelemetry/instrumentation": "npm:^0.203.0"
+ "@opentelemetry/sdk-logs": "npm:^0.203.0"
+ "@radix-ui/react-accordion": "npm:^1.2.11"
"@radix-ui/react-alert-dialog": "npm:^1.1.5"
"@radix-ui/react-avatar": "npm:^1.1.2"
"@radix-ui/react-checkbox": "npm:^1.3.2"
+ "@radix-ui/react-collapsible": "npm:^1.1.11"
"@radix-ui/react-dialog": "npm:^1.1.4"
"@radix-ui/react-dropdown-menu": "npm:^2.1.1"
"@radix-ui/react-hover-card": "npm:^1.1.6"
@@ -6080,10 +6531,12 @@ __metadata:
"@stripe/react-stripe-js": "npm:^3.1.1"
"@stripe/stripe-js": "npm:^5.6.0"
"@t3-oss/env-nextjs": "npm:^0.12.0"
+ "@tailwindcss/typography": "npm:^0.5.16"
"@tanstack/eslint-plugin-query": "npm:^5.74.7"
"@tanstack/react-query": "npm:^5.53.3"
"@tanstack/react-table": "npm:^8.20.5"
"@tanstack/react-virtual": "npm:^3.10.8"
+ "@testing-library/react-hooks": "npm:^8.0.1"
"@types/micromatch": "npm:^4.0.9"
"@types/node": "npm:^20"
"@types/nodemailer": "npm:^6.4.17"
@@ -6095,8 +6548,10 @@ __metadata:
"@uidotdev/usehooks": "npm:^2.4.1"
"@uiw/codemirror-themes": "npm:^4.23.6"
"@uiw/react-codemirror": "npm:^4.23.0"
+ "@vercel/otel": "npm:^1.13.0"
"@viz-js/lang-dot": "npm:^1.0.4"
"@xiechao/codemirror-lang-handlebars": "npm:^1.0.4"
+ ai: "npm:5.0.0-beta.21"
ajv: "npm:^8.17.1"
bcryptjs: "npm:^3.0.2"
class-variance-authority: "npm:^0.7.0"
@@ -6129,15 +6584,18 @@ __metadata:
eslint-plugin-react: "npm:^7.35.0"
eslint-plugin-react-hooks: "npm:^4.6.2"
fuse.js: "npm:^7.0.0"
- google-auth-library: "npm:^9.15.1"
+ google-auth-library: "npm:^10.1.0"
graphql: "npm:^16.9.0"
http-status-codes: "npm:^2.3.0"
input-otp: "npm:^1.4.2"
jsdom: "npm:^25.0.1"
+ langfuse: "npm:^3.38.4"
+ langfuse-vercel: "npm:^3.38.4"
lucide-react: "npm:^0.517.0"
micromatch: "npm:^4.0.8"
next: "npm:14.2.26"
next-auth: "npm:^5.0.0-beta.25"
+ next-navigation-guard: "npm:^0.2.0"
next-themes: "npm:^0.3.0"
nodemailer: "npm:^6.10.0"
npm-run-all: "npm:^4.1.5"
@@ -6155,12 +6613,20 @@ __metadata:
react-hook-form: "npm:^7.53.0"
react-hotkeys-hook: "npm:^4.5.1"
react-icons: "npm:^5.3.0"
+ react-markdown: "npm:^10.1.0"
react-resizable-panels: "npm:^2.1.1"
recharts: "npm:^2.15.3"
+ rehype-raw: "npm:^7.0.0"
+ rehype-sanitize: "npm:^6.0.0"
+ remark-gfm: "npm:^4.0.1"
scroll-into-view-if-needed: "npm:^3.1.0"
server-only: "npm:^0.0.1"
sharp: "npm:^0.33.5"
simple-git: "npm:^3.27.0"
+ slate: "npm:^0.117.0"
+ slate-dom: "npm:^0.116.0"
+ slate-history: "npm:^0.113.1"
+ slate-react: "npm:^0.117.1"
strip-json-comments: "npm:^5.0.1"
stripe: "npm:^17.6.0"
tailwind-merge: "npm:^2.5.2"
@@ -6172,7 +6638,7 @@ __metadata:
vite-tsconfig-paths: "npm:^5.1.3"
vitest: "npm:^2.1.5"
vscode-icons-js: "npm:^11.6.1"
- zod: "npm:^3.24.3"
+ zod: "npm:^3.25.74"
zod-to-json-schema: "npm:^3.24.5"
languageName: unknown
linkType: soft
@@ -6188,6 +6654,13 @@ __metadata:
languageName: node
linkType: hard
+"@standard-schema/spec@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "@standard-schema/spec@npm:1.0.0"
+ checksum: 10c0/a1ab9a8bdc09b5b47aa8365d0e0ec40cc2df6437be02853696a0e377321653b0d3ac6f079a8c67d5ddbe9821025584b1fb71d9cc041a6666a96f1fadf2ece15f
+ languageName: node
+ linkType: hard
+
"@stripe/react-stripe-js@npm:^3.1.1":
version: 3.5.1
resolution: "@stripe/react-stripe-js@npm:3.5.1"
@@ -6282,6 +6755,20 @@ __metadata:
languageName: node
linkType: hard
+"@tailwindcss/typography@npm:^0.5.16":
+ version: 0.5.16
+ resolution: "@tailwindcss/typography@npm:0.5.16"
+ dependencies:
+ lodash.castarray: "npm:^4.4.0"
+ lodash.isplainobject: "npm:^4.0.6"
+ lodash.merge: "npm:^4.6.2"
+ postcss-selector-parser: "npm:6.0.10"
+ peerDependencies:
+ tailwindcss: "*"
+ checksum: 10c0/35a7387876810c23c270a23848b920517229b707c8ead6a63c8bb7d6720a62f23728c3117f0a93b422a66d1e5ee9c7ad8a6c3f0fbf5255b535c0e4971ffa0158
+ languageName: node
+ linkType: hard
+
"@tanstack/eslint-plugin-query@npm:^5.74.7":
version: 5.74.7
resolution: "@tanstack/eslint-plugin-query@npm:5.74.7"
@@ -6349,6 +6836,28 @@ __metadata:
languageName: node
linkType: hard
+"@testing-library/react-hooks@npm:^8.0.1":
+ version: 8.0.1
+ resolution: "@testing-library/react-hooks@npm:8.0.1"
+ dependencies:
+ "@babel/runtime": "npm:^7.12.5"
+ react-error-boundary: "npm:^3.1.0"
+ peerDependencies:
+ "@types/react": ^16.9.0 || ^17.0.0
+ react: ^16.9.0 || ^17.0.0
+ react-dom: ^16.9.0 || ^17.0.0
+ react-test-renderer: ^16.9.0 || ^17.0.0
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ react-dom:
+ optional: true
+ react-test-renderer:
+ optional: true
+ checksum: 10c0/83bef2d4c437b84143213b5275ef00ef14e5bcd344f9ded12b162d253dc3c799138ead4428026b9c725e5a38dbebf611f2898aa43f3e43432bcaccbd7bf413e5
+ languageName: node
+ linkType: hard
+
"@tybys/wasm-util@npm:^0.9.0":
version: 0.9.0
resolution: "@tybys/wasm-util@npm:0.9.0"
@@ -6483,6 +6992,24 @@ __metadata:
languageName: node
linkType: hard
+"@types/debug@npm:^4.0.0":
+ version: 4.1.12
+ resolution: "@types/debug@npm:4.1.12"
+ dependencies:
+ "@types/ms": "npm:*"
+ checksum: 10c0/5dcd465edbb5a7f226e9a5efd1f399c6172407ef5840686b73e3608ce135eeca54ae8037dcd9f16bdb2768ac74925b820a8b9ecc588a58ca09eca6acabe33e2f
+ languageName: node
+ linkType: hard
+
+"@types/estree-jsx@npm:^1.0.0":
+ version: 1.0.5
+ resolution: "@types/estree-jsx@npm:1.0.5"
+ dependencies:
+ "@types/estree": "npm:*"
+ checksum: 10c0/07b354331516428b27a3ab99ee397547d47eb223c34053b48f84872fafb841770834b90cc1a0068398e7c7ccb15ec51ab00ec64b31dc5e3dbefd624638a35c6d
+ languageName: node
+ linkType: hard
+
"@types/estree@npm:*, @types/estree@npm:1.0.6, @types/estree@npm:^1.0.0":
version: 1.0.6
resolution: "@types/estree@npm:1.0.6"
@@ -6582,6 +7109,13 @@ __metadata:
languageName: node
linkType: hard
+"@types/ms@npm:*":
+ version: 2.1.0
+ resolution: "@types/ms@npm:2.1.0"
+ checksum: 10c0/5ce692ffe1549e1b827d99ef8ff71187457e0eb44adbae38fdf7b9a74bae8d20642ee963c14516db1d35fa2652e65f47680fdf679dcbde52bbfadd021f497225
+ languageName: node
+ linkType: hard
+
"@types/mysql@npm:2.15.26":
version: 2.15.26
resolution: "@types/mysql@npm:2.15.26"
@@ -6796,6 +7330,13 @@ __metadata:
languageName: node
linkType: hard
+"@types/unist@npm:^2.0.0":
+ version: 2.0.11
+ resolution: "@types/unist@npm:2.0.11"
+ checksum: 10c0/24dcdf25a168f453bb70298145eb043cfdbb82472db0bc0b56d6d51cd2e484b9ed8271d4ac93000a80da568f2402e9339723db262d0869e2bf13bc58e081768d
+ languageName: node
+ linkType: hard
+
"@typescript-eslint/eslint-plugin@npm:^8.3.0":
version: 8.27.0
resolution: "@typescript-eslint/eslint-plugin@npm:8.27.0"
@@ -7188,6 +7729,21 @@ __metadata:
languageName: node
linkType: hard
+"@vercel/otel@npm:^1.13.0":
+ version: 1.13.0
+ resolution: "@vercel/otel@npm:1.13.0"
+ peerDependencies:
+ "@opentelemetry/api": ">=1.7.0 <2.0.0"
+ "@opentelemetry/api-logs": ">=0.46.0 <0.200.0"
+ "@opentelemetry/instrumentation": ">=0.46.0 <0.200.0"
+ "@opentelemetry/resources": ">=1.19.0 <2.0.0"
+ "@opentelemetry/sdk-logs": ">=0.46.0 <0.200.0"
+ "@opentelemetry/sdk-metrics": ">=1.19.0 <2.0.0"
+ "@opentelemetry/sdk-trace-base": ">=1.19.0 <2.0.0"
+ checksum: 10c0/720e1fd7efa3882fc147ec749d78e861d2d0644184838947c5754a8fa4e29d59e201ca54649dac4c4b75f4d932c8b62711e94f8fecd3176a96fc380eb7dd9437
+ languageName: node
+ linkType: hard
+
"@vitest/expect@npm:2.1.9":
version: 2.1.9
resolution: "@vitest/expect@npm:2.1.9"
@@ -7383,6 +7939,22 @@ __metadata:
languageName: node
linkType: hard
+"ai@npm:5.0.0-beta.21":
+ version: 5.0.0-beta.21
+ resolution: "ai@npm:5.0.0-beta.21"
+ dependencies:
+ "@ai-sdk/gateway": "npm:1.0.0-beta.8"
+ "@ai-sdk/provider": "npm:2.0.0-beta.1"
+ "@ai-sdk/provider-utils": "npm:3.0.0-beta.3"
+ "@opentelemetry/api": "npm:1.9.0"
+ peerDependencies:
+ zod: ^3.25.49 || ^4
+ bin:
+ ai: dist/bin/ai.min.js
+ checksum: 10c0/ecb7f042546535ce58f7dd9c58d358ae78ff813937833c0e0b99e37fb60c69b0a50853a5b11b70c9abb145dd3ae602991a024b7b45217d30fc735ab4fc3894d2
+ languageName: node
+ linkType: hard
+
"ajv@npm:^6.12.4":
version: 6.12.6
resolution: "ajv@npm:6.12.6"
@@ -7656,6 +8228,13 @@ __metadata:
languageName: node
linkType: hard
+"aws4fetch@npm:^1.0.20":
+ version: 1.0.20
+ resolution: "aws4fetch@npm:1.0.20"
+ checksum: 10c0/a4eac7bd0d1c3e611c17ed1ef41ac0b48c0a8e74a985ad968c071e74d94586d3572edc943b43fa5ca756c686ea73baa2f48e264d657bb8c2e95c8e0037d48a87
+ languageName: node
+ linkType: hard
+
"axe-core@npm:^4.10.0":
version: 4.10.3
resolution: "axe-core@npm:4.10.3"
@@ -7681,6 +8260,13 @@ __metadata:
languageName: node
linkType: hard
+"bail@npm:^2.0.0":
+ version: 2.0.2
+ resolution: "bail@npm:2.0.2"
+ checksum: 10c0/25cbea309ef6a1f56214187004e8f34014eb015713ea01fa5b9b7e9e776ca88d0fdffd64143ac42dc91966c915a4b7b683411b56e14929fad16153fc026ffb8b
+ languageName: node
+ linkType: hard
+
"balanced-match@npm:^1.0.0":
version: 1.0.2
resolution: "balanced-match@npm:1.0.2"
@@ -8036,6 +8622,20 @@ __metadata:
languageName: node
linkType: hard
+"character-entities@npm:^2.0.0":
+ version: 2.0.2
+ resolution: "character-entities@npm:2.0.2"
+ checksum: 10c0/b0c645a45bcc90ff24f0e0140f4875a8436b8ef13b6bcd31ec02cfb2ca502b680362aa95386f7815bdc04b6464d48cf191210b3840d7c04241a149ede591a308
+ languageName: node
+ linkType: hard
+
+"character-reference-invalid@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "character-reference-invalid@npm:2.0.1"
+ checksum: 10c0/2ae0dec770cd8659d7e8b0ce24392d83b4c2f0eb4a3395c955dce5528edd4cc030a794cfa06600fcdd700b3f2de2f9b8e40e309c0011c4180e3be64a0b42e6a1
+ languageName: node
+ linkType: hard
+
"check-error@npm:^2.1.1":
version: 2.1.1
resolution: "check-error@npm:2.1.1"
@@ -8779,6 +9379,13 @@ __metadata:
languageName: node
linkType: hard
+"data-uri-to-buffer@npm:^4.0.0":
+ version: 4.0.1
+ resolution: "data-uri-to-buffer@npm:4.0.1"
+ checksum: 10c0/20a6b93107597530d71d4cb285acee17f66bcdfc03fd81040921a81252f19db27588d87fc8fc69e1950c55cfb0bf8ae40d0e5e21d907230813eb5d5a7f9eb45b
+ languageName: node
+ linkType: hard
+
"data-urls@npm:^5.0.0":
version: 5.0.0
resolution: "data-urls@npm:5.0.0"
@@ -8873,6 +9480,18 @@ __metadata:
languageName: node
linkType: hard
+"debug@npm:^4.0.0":
+ version: 4.4.1
+ resolution: "debug@npm:4.4.1"
+ dependencies:
+ ms: "npm:^2.1.3"
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ checksum: 10c0/d2b44bc1afd912b49bb7ebb0d50a860dc93a4dd7d946e8de94abc957bb63726b7dd5aa48c18c2386c379ec024c46692e15ed3ed97d481729f929201e671fcd55
+ languageName: node
+ linkType: hard
+
"debug@npm:~4.3.1, debug@npm:~4.3.2, debug@npm:~4.3.4":
version: 4.3.7
resolution: "debug@npm:4.3.7"
@@ -8899,6 +9518,15 @@ __metadata:
languageName: node
linkType: hard
+"decode-named-character-reference@npm:^1.0.0":
+ version: 1.2.0
+ resolution: "decode-named-character-reference@npm:1.2.0"
+ dependencies:
+ character-entities: "npm:^2.0.0"
+ checksum: 10c0/761a89de6b0e0a2d4b21ae99074e4cc3344dd11eb29f112e23cc5909f2e9f33c5ed20cd6b146b27fb78170bce0f3f9b3362a84b75638676a05c938c24a60f5d7
+ languageName: node
+ linkType: hard
+
"deep-eql@npm:^5.0.1":
version: 5.0.2
resolution: "deep-eql@npm:5.0.2"
@@ -8972,7 +9600,7 @@ __metadata:
languageName: node
linkType: hard
-"dequal@npm:^2.0.0":
+"dequal@npm:^2.0.0, dequal@npm:^2.0.3":
version: 2.0.3
resolution: "dequal@npm:2.0.3"
checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888
@@ -9000,7 +9628,7 @@ __metadata:
languageName: node
linkType: hard
-"devlop@npm:^1.0.0":
+"devlop@npm:^1.0.0, devlop@npm:^1.1.0":
version: 1.1.0
resolution: "devlop@npm:1.1.0"
dependencies:
@@ -9025,6 +9653,15 @@ __metadata:
languageName: node
linkType: hard
+"direction@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "direction@npm:1.0.4"
+ bin:
+ direction: cli.js
+ checksum: 10c0/2257006edba01b3294322311a212a3f0e7c656d710ab164fd95123a2a9daaec536252c60da6a9df5be2bb89e9030684e9d1c7804fe82c9b3f510c2f737adeada
+ languageName: node
+ linkType: hard
+
"discontinuous-range@npm:1.0.0":
version: 1.0.0
resolution: "discontinuous-range@npm:1.0.0"
@@ -9309,6 +9946,13 @@ __metadata:
languageName: node
linkType: hard
+"entities@npm:^6.0.0":
+ version: 6.0.1
+ resolution: "entities@npm:6.0.1"
+ checksum: 10c0/ed836ddac5acb34341094eb495185d527bd70e8632b6c0d59548cbfa23defdbae70b96f9a405c82904efa421230b5b3fd2283752447d737beffd3f3e6ee74414
+ languageName: node
+ linkType: hard
+
"env-paths@npm:^2.2.0":
version: 2.2.1
resolution: "env-paths@npm:2.2.1"
@@ -10047,6 +10691,13 @@ __metadata:
languageName: node
linkType: hard
+"estree-util-is-identifier-name@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "estree-util-is-identifier-name@npm:3.0.0"
+ checksum: 10c0/d1881c6ed14bd588ebd508fc90bf2a541811dbb9ca04dec2f39d27dcaa635f85b5ed9bbbe7fc6fb1ddfca68744a5f7c70456b4b7108b6c4c52780631cc787c5b
+ languageName: node
+ linkType: hard
+
"estree-walker@npm:^2.0.2":
version: 2.0.2
resolution: "estree-walker@npm:2.0.2"
@@ -10113,6 +10764,13 @@ __metadata:
languageName: node
linkType: hard
+"eventsource-parser@npm:^3.0.3":
+ version: 3.0.3
+ resolution: "eventsource-parser@npm:3.0.3"
+ checksum: 10c0/2594011630efba56cafafc8ed6bd9a50db8f6d5dd62089b0950346e7961828c16efe07a588bdea3ba79e568fd9246c8163824a2ffaade767e1fdb2270c1fae0b
+ languageName: node
+ linkType: hard
+
"eventsource@npm:^3.0.2":
version: 3.0.6
resolution: "eventsource@npm:3.0.6"
@@ -10219,7 +10877,7 @@ __metadata:
languageName: node
linkType: hard
-"extend@npm:^3.0.2":
+"extend@npm:^3.0.0, extend@npm:^3.0.2":
version: 3.0.2
resolution: "extend@npm:3.0.2"
checksum: 10c0/73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9
@@ -10323,6 +10981,16 @@ __metadata:
languageName: node
linkType: hard
+"fetch-blob@npm:^3.1.2, fetch-blob@npm:^3.1.4":
+ version: 3.2.0
+ resolution: "fetch-blob@npm:3.2.0"
+ dependencies:
+ node-domexception: "npm:^1.0.0"
+ web-streams-polyfill: "npm:^3.0.3"
+ checksum: 10c0/60054bf47bfa10fb0ba6cb7742acec2f37c1f56344f79a70bb8b1c48d77675927c720ff3191fa546410a0442c998d27ab05e9144c32d530d8a52fbe68f843b69
+ languageName: node
+ linkType: hard
+
"fflate@npm:^0.4.8":
version: 0.4.8
resolution: "fflate@npm:0.4.8"
@@ -10470,6 +11138,15 @@ __metadata:
languageName: node
linkType: hard
+"formdata-polyfill@npm:^4.0.10":
+ version: 4.0.10
+ resolution: "formdata-polyfill@npm:4.0.10"
+ dependencies:
+ fetch-blob: "npm:^3.1.2"
+ checksum: 10c0/5392ec484f9ce0d5e0d52fb5a78e7486637d516179b0eb84d81389d7eccf9ca2f663079da56f761355c0a65792810e3b345dc24db9a8bbbcf24ef3c8c88570c6
+ languageName: node
+ linkType: hard
+
"forwarded-parse@npm:2.1.2":
version: 2.1.2
resolution: "forwarded-parse@npm:2.1.2"
@@ -10588,6 +11265,17 @@ __metadata:
languageName: node
linkType: hard
+"gaxios@npm:^7.0.0":
+ version: 7.1.1
+ resolution: "gaxios@npm:7.1.1"
+ dependencies:
+ extend: "npm:^3.0.2"
+ https-proxy-agent: "npm:^7.0.1"
+ node-fetch: "npm:^3.3.2"
+ checksum: 10c0/f58dea117f67a3d8b46391db955eb061a3e408464c9260d5d24a67a07a8da673ca0382a096c7c01ae0e7db4c74ce6453109933d8dbfa4c02b5bb93f7d79e726d
+ languageName: node
+ linkType: hard
+
"gcp-metadata@npm:^6.1.0":
version: 6.1.1
resolution: "gcp-metadata@npm:6.1.1"
@@ -10599,6 +11287,17 @@ __metadata:
languageName: node
linkType: hard
+"gcp-metadata@npm:^7.0.0":
+ version: 7.0.1
+ resolution: "gcp-metadata@npm:7.0.1"
+ dependencies:
+ gaxios: "npm:^7.0.0"
+ google-logging-utils: "npm:^1.0.0"
+ json-bigint: "npm:^1.0.0"
+ checksum: 10c0/2f7eedef08992c13aa068001df4f64c9d62ec9cb031d1c47d6fb5e38e1444be88a951030710eb09a31a17a395b6c1b48f5ad4cbfdc89a0c354c8d7355d86b467
+ languageName: node
+ linkType: hard
+
"gensync@npm:^1.0.0-beta.2":
version: 1.0.0-beta.2
resolution: "gensync@npm:1.0.0-beta.2"
@@ -10840,7 +11539,22 @@ __metadata:
languageName: node
linkType: hard
-"google-auth-library@npm:^9.15.1":
+"google-auth-library@npm:^10.1.0":
+ version: 10.1.0
+ resolution: "google-auth-library@npm:10.1.0"
+ dependencies:
+ base64-js: "npm:^1.3.0"
+ ecdsa-sig-formatter: "npm:^1.0.11"
+ gaxios: "npm:^7.0.0"
+ gcp-metadata: "npm:^7.0.0"
+ google-logging-utils: "npm:^1.0.0"
+ gtoken: "npm:^8.0.0"
+ jws: "npm:^4.0.0"
+ checksum: 10c0/5d769a1df775b2e1a7f5ddcd98da4b424db765b4404d050260628204b0cf25764aeec45f2227c50402ab10988954f09c4c86f537de1f30b1c5a476b62c4205f1
+ languageName: node
+ linkType: hard
+
+"google-auth-library@npm:^9.15.0":
version: 9.15.1
resolution: "google-auth-library@npm:9.15.1"
dependencies:
@@ -10861,6 +11575,13 @@ __metadata:
languageName: node
linkType: hard
+"google-logging-utils@npm:^1.0.0":
+ version: 1.1.1
+ resolution: "google-logging-utils@npm:1.1.1"
+ checksum: 10c0/a99ca790b39a4eb854310366f4583dab6d5842d2fa70b0f46de1ef23909a4baad8e6eedd8dcde0756f968131b053c5a4a6e8cb4825595f12ea6289a7ba6360df
+ languageName: node
+ linkType: hard
+
"gopd@npm:^1.0.1, gopd@npm:^1.2.0":
version: 1.2.0
resolution: "gopd@npm:1.2.0"
@@ -10914,6 +11635,16 @@ __metadata:
languageName: node
linkType: hard
+"gtoken@npm:^8.0.0":
+ version: 8.0.0
+ resolution: "gtoken@npm:8.0.0"
+ dependencies:
+ gaxios: "npm:^7.0.0"
+ jws: "npm:^4.0.0"
+ checksum: 10c0/058538e5bbe081d30ada5f1fd34d3a8194357c2e6ecbf7c8a98daeefbf13f7e06c15649c7dace6a1d4cc3bc6dc5483bd484d6d7adc5852021896d7c05c439f37
+ languageName: node
+ linkType: hard
+
"has-bigints@npm:^1.0.2":
version: 1.1.0
resolution: "has-bigints@npm:1.1.0"
@@ -10978,6 +11709,63 @@ __metadata:
languageName: node
linkType: hard
+"hast-util-from-parse5@npm:^8.0.0":
+ version: 8.0.3
+ resolution: "hast-util-from-parse5@npm:8.0.3"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@types/unist": "npm:^3.0.0"
+ devlop: "npm:^1.0.0"
+ hastscript: "npm:^9.0.0"
+ property-information: "npm:^7.0.0"
+ vfile: "npm:^6.0.0"
+ vfile-location: "npm:^5.0.0"
+ web-namespaces: "npm:^2.0.0"
+ checksum: 10c0/40ace6c0ad43c26f721c7499fe408e639cde917b2350c9299635e6326559855896dae3c3ebf7440df54766b96c4276a7823e8f376a2b6a28b37b591f03412545
+ languageName: node
+ linkType: hard
+
+"hast-util-parse-selector@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "hast-util-parse-selector@npm:4.0.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ checksum: 10c0/5e98168cb44470dc274aabf1a28317e4feb09b1eaf7a48bbaa8c1de1b43a89cd195cb1284e535698e658e3ec26ad91bc5e52c9563c36feb75abbc68aaf68fb9f
+ languageName: node
+ linkType: hard
+
+"hast-util-raw@npm:^9.0.0":
+ version: 9.1.0
+ resolution: "hast-util-raw@npm:9.1.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@types/unist": "npm:^3.0.0"
+ "@ungap/structured-clone": "npm:^1.0.0"
+ hast-util-from-parse5: "npm:^8.0.0"
+ hast-util-to-parse5: "npm:^8.0.0"
+ html-void-elements: "npm:^3.0.0"
+ mdast-util-to-hast: "npm:^13.0.0"
+ parse5: "npm:^7.0.0"
+ unist-util-position: "npm:^5.0.0"
+ unist-util-visit: "npm:^5.0.0"
+ vfile: "npm:^6.0.0"
+ web-namespaces: "npm:^2.0.0"
+ zwitch: "npm:^2.0.0"
+ checksum: 10c0/d0d909d2aedecef6a06f0005cfae410d6475e6e182d768bde30c3af9fcbbe4f9beb0522bdc21d0679cb3c243c0df40385797ed255148d68b3d3f12e82d12aacc
+ languageName: node
+ linkType: hard
+
+"hast-util-sanitize@npm:^5.0.0":
+ version: 5.0.2
+ resolution: "hast-util-sanitize@npm:5.0.2"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@ungap/structured-clone": "npm:^1.0.0"
+ unist-util-position: "npm:^5.0.0"
+ checksum: 10c0/20951652078a8c21341c1c9a84f90015b2ba01cc41fa16772f122c65cda26a7adb0501fdeba5c8e37e40e2632447e8fe455d0dd2dc27d39663baacca76f2ecb6
+ languageName: node
+ linkType: hard
+
"hast-util-to-html@npm:^9.0.4":
version: 9.0.5
resolution: "hast-util-to-html@npm:9.0.5"
@@ -10997,6 +11785,44 @@ __metadata:
languageName: node
linkType: hard
+"hast-util-to-jsx-runtime@npm:^2.0.0":
+ version: 2.3.6
+ resolution: "hast-util-to-jsx-runtime@npm:2.3.6"
+ dependencies:
+ "@types/estree": "npm:^1.0.0"
+ "@types/hast": "npm:^3.0.0"
+ "@types/unist": "npm:^3.0.0"
+ comma-separated-tokens: "npm:^2.0.0"
+ devlop: "npm:^1.0.0"
+ estree-util-is-identifier-name: "npm:^3.0.0"
+ hast-util-whitespace: "npm:^3.0.0"
+ mdast-util-mdx-expression: "npm:^2.0.0"
+ mdast-util-mdx-jsx: "npm:^3.0.0"
+ mdast-util-mdxjs-esm: "npm:^2.0.0"
+ property-information: "npm:^7.0.0"
+ space-separated-tokens: "npm:^2.0.0"
+ style-to-js: "npm:^1.0.0"
+ unist-util-position: "npm:^5.0.0"
+ vfile-message: "npm:^4.0.0"
+ checksum: 10c0/27297e02848fe37ef219be04a26ce708d17278a175a807689e94a821dcffc88aa506d62c3a85beed1f9a8544f7211bdcbcde0528b7b456a57c2e342c3fd11056
+ languageName: node
+ linkType: hard
+
+"hast-util-to-parse5@npm:^8.0.0":
+ version: 8.0.0
+ resolution: "hast-util-to-parse5@npm:8.0.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ comma-separated-tokens: "npm:^2.0.0"
+ devlop: "npm:^1.0.0"
+ property-information: "npm:^6.0.0"
+ space-separated-tokens: "npm:^2.0.0"
+ web-namespaces: "npm:^2.0.0"
+ zwitch: "npm:^2.0.0"
+ checksum: 10c0/3c0c7fba026e0c4be4675daf7277f9ff22ae6da801435f1b7104f7740de5422576f1c025023c7b3df1d0a161e13a04c6ab8f98ada96eb50adb287b537849a2bd
+ languageName: node
+ linkType: hard
+
"hast-util-whitespace@npm:^3.0.0":
version: 3.0.0
resolution: "hast-util-whitespace@npm:3.0.0"
@@ -11006,6 +11832,19 @@ __metadata:
languageName: node
linkType: hard
+"hastscript@npm:^9.0.0":
+ version: 9.0.1
+ resolution: "hastscript@npm:9.0.1"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ comma-separated-tokens: "npm:^2.0.0"
+ hast-util-parse-selector: "npm:^4.0.0"
+ property-information: "npm:^7.0.0"
+ space-separated-tokens: "npm:^2.0.0"
+ checksum: 10c0/18dc8064e5c3a7a2ae862978e626b97a254e1c8a67ee9d0c9f06d373bba155ed805fc5b5ce21b990fb7bc174624889e5e1ce1cade264f1b1d58b48f994bc85ce
+ languageName: node
+ linkType: hard
+
"hoist-non-react-statics@npm:^3.3.2":
version: 3.3.2
resolution: "hoist-non-react-statics@npm:3.3.2"
@@ -11044,6 +11883,13 @@ __metadata:
languageName: node
linkType: hard
+"html-url-attributes@npm:^3.0.0":
+ version: 3.0.1
+ resolution: "html-url-attributes@npm:3.0.1"
+ checksum: 10c0/496e4908aa8b77665f348b4b03521901794f648b8ac34a581022cd6f2c97934d5c910cd91bc6593bbf2994687549037bc2520fcdc769b31484f29ffdd402acd0
+ languageName: node
+ linkType: hard
+
"html-void-elements@npm:^3.0.0":
version: 3.0.0
resolution: "html-void-elements@npm:3.0.0"
@@ -11168,6 +12014,13 @@ __metadata:
languageName: node
linkType: hard
+"immer@npm:^10.0.3":
+ version: 10.1.1
+ resolution: "immer@npm:10.1.1"
+ checksum: 10c0/b749e10d137ccae91788f41bd57e9387f32ea6d6ea8fd7eb47b23fd7766681575efc7f86ceef7fe24c3bc9d61e38ff5d2f49c2663b2b0c056e280a4510923653
+ languageName: node
+ linkType: hard
+
"import-fresh@npm:^3.2.1":
version: 3.3.1
resolution: "import-fresh@npm:3.3.1"
@@ -11214,6 +12067,13 @@ __metadata:
languageName: node
linkType: hard
+"inline-style-parser@npm:0.2.4":
+ version: 0.2.4
+ resolution: "inline-style-parser@npm:0.2.4"
+ checksum: 10c0/ddc0b210eaa03e0f98d677b9836242c583c7c6051e84ce0e704ae4626e7871c5b78f8e30853480218b446355745775df318d4f82d33087ff7e393245efa9a881
+ languageName: node
+ linkType: hard
+
"input-otp@npm:^1.4.2":
version: 1.4.2
resolution: "input-otp@npm:1.4.2"
@@ -11276,6 +12136,23 @@ __metadata:
languageName: node
linkType: hard
+"is-alphabetical@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "is-alphabetical@npm:2.0.1"
+ checksum: 10c0/932367456f17237533fd1fc9fe179df77957271020b83ea31da50e5cc472d35ef6b5fb8147453274ffd251134472ce24eb6f8d8398d96dee98237cdb81a6c9a7
+ languageName: node
+ linkType: hard
+
+"is-alphanumerical@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "is-alphanumerical@npm:2.0.1"
+ dependencies:
+ is-alphabetical: "npm:^2.0.0"
+ is-decimal: "npm:^2.0.0"
+ checksum: 10c0/4b35c42b18e40d41378293f82a3ecd9de77049b476f748db5697c297f686e1e05b072a6aaae2d16f54d2a57f85b00cbbe755c75f6d583d1c77d6657bd0feb5a2
+ languageName: node
+ linkType: hard
+
"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5":
version: 3.0.5
resolution: "is-array-buffer@npm:3.0.5"
@@ -11388,6 +12265,13 @@ __metadata:
languageName: node
linkType: hard
+"is-decimal@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "is-decimal@npm:2.0.1"
+ checksum: 10c0/8085dd66f7d82f9de818fba48b9e9c0429cb4291824e6c5f2622e96b9680b54a07a624cfc663b24148b8e853c62a1c987cfe8b0b5a13f5156991afaf6736e334
+ languageName: node
+ linkType: hard
+
"is-extglob@npm:^2.1.1":
version: 2.1.1
resolution: "is-extglob@npm:2.1.1"
@@ -11432,6 +12316,20 @@ __metadata:
languageName: node
linkType: hard
+"is-hexadecimal@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "is-hexadecimal@npm:2.0.1"
+ checksum: 10c0/3eb60fe2f1e2bbc760b927dcad4d51eaa0c60138cf7fc671803f66353ad90c301605b502c7ea4c6bb0548e1c7e79dfd37b73b632652e3b76030bba603a7e9626
+ languageName: node
+ linkType: hard
+
+"is-hotkey@npm:^0.2.0":
+ version: 0.2.0
+ resolution: "is-hotkey@npm:0.2.0"
+ checksum: 10c0/d6589159b641014e26c0999ad261ca191e4cb7192e7db32dc849e69df416699b5ec78ad2a2192c169e7b3838847e48b0e1fc76f89f61946fad3036b23cfcd9b4
+ languageName: node
+ linkType: hard
+
"is-interactive@npm:^1.0.0":
version: 1.0.0
resolution: "is-interactive@npm:1.0.0"
@@ -11470,6 +12368,20 @@ __metadata:
languageName: node
linkType: hard
+"is-plain-obj@npm:^4.0.0":
+ version: 4.1.0
+ resolution: "is-plain-obj@npm:4.1.0"
+ checksum: 10c0/32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e
+ languageName: node
+ linkType: hard
+
+"is-plain-object@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "is-plain-object@npm:5.0.0"
+ checksum: 10c0/893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c
+ languageName: node
+ linkType: hard
+
"is-potential-custom-element-name@npm:^1.0.1":
version: 1.0.1
resolution: "is-potential-custom-element-name@npm:1.0.1"
@@ -11915,6 +12827,36 @@ __metadata:
languageName: node
linkType: hard
+"langfuse-core@npm:^3.38.4":
+ version: 3.38.4
+ resolution: "langfuse-core@npm:3.38.4"
+ dependencies:
+ mustache: "npm:^4.2.0"
+ checksum: 10c0/65290416c379d1d628842a372127ad016b360409de07b670a72ff0ff79aa82255166571b532142b871548d562ee326f65e5cfb4e919e58520cdad633ea148bc7
+ languageName: node
+ linkType: hard
+
+"langfuse-vercel@npm:^3.38.4":
+ version: 3.38.4
+ resolution: "langfuse-vercel@npm:3.38.4"
+ dependencies:
+ langfuse: "npm:^3.38.4"
+ langfuse-core: "npm:^3.38.4"
+ peerDependencies:
+ ai: ">=3.2.44"
+ checksum: 10c0/f1781353e37ccfbf1f452be6fe9aeae548ed735c00e6d2d77c513c36b2dabeda0607bd25635a43f0047e8fa199a726cc1af8fc3f2b88501c956f55cf8d94449b
+ languageName: node
+ linkType: hard
+
+"langfuse@npm:^3.38.4":
+ version: 3.38.4
+ resolution: "langfuse@npm:3.38.4"
+ dependencies:
+ langfuse-core: "npm:^3.38.4"
+ checksum: 10c0/9718701a4c9b0634d6365edb4ad8a06a7334d65b11ec20f209a322f3aaaef859c427ad8adf7ee1e63ffa3c3aaa49edcf8360f29bb95b6ce539ea66a65fde4217
+ languageName: node
+ linkType: hard
+
"language-subtag-registry@npm:^0.3.20":
version: 0.3.23
resolution: "language-subtag-registry@npm:0.3.23"
@@ -12021,6 +12963,13 @@ __metadata:
languageName: node
linkType: hard
+"lodash.castarray@npm:^4.4.0":
+ version: 4.4.0
+ resolution: "lodash.castarray@npm:4.4.0"
+ checksum: 10c0/0bf523ad1596a5bf17869ba047235b4453eee927005013ae152345e2b291b81a02e7f2b7c38f876a1d16f73c34aa3c3241e965193e5b31595035bc8f330c4358
+ languageName: node
+ linkType: hard
+
"lodash.debounce@npm:^4.0.8":
version: 4.0.8
resolution: "lodash.debounce@npm:4.0.8"
@@ -12042,6 +12991,13 @@ __metadata:
languageName: node
linkType: hard
+"lodash.isplainobject@npm:^4.0.6":
+ version: 4.0.6
+ resolution: "lodash.isplainobject@npm:4.0.6"
+ checksum: 10c0/afd70b5c450d1e09f32a737bed06ff85b873ecd3d3d3400458725283e3f2e0bb6bf48e67dbe7a309eb371a822b16a26cca4a63c8c52db3fc7dc9d5f9dd324cbb
+ languageName: node
+ linkType: hard
+
"lodash.merge@npm:^4.6.2":
version: 4.6.2
resolution: "lodash.merge@npm:4.6.2"
@@ -12087,6 +13043,13 @@ __metadata:
languageName: node
linkType: hard
+"longest-streak@npm:^3.0.0":
+ version: 3.1.0
+ resolution: "longest-streak@npm:3.1.0"
+ checksum: 10c0/7c2f02d0454b52834d1bcedef79c557bd295ee71fdabb02d041ff3aa9da48a90b5df7c0409156dedbc4df9b65da18742652aaea4759d6ece01f08971af6a7eaa
+ languageName: node
+ linkType: hard
+
"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0":
version: 1.4.0
resolution: "loose-envify@npm:1.4.0"
@@ -12213,6 +13176,13 @@ __metadata:
languageName: node
linkType: hard
+"markdown-table@npm:^3.0.0":
+ version: 3.0.4
+ resolution: "markdown-table@npm:3.0.4"
+ checksum: 10c0/1257b31827629a54c24a5030a3dac952256c559174c95ce3ef89bebd6bff0cb1444b1fd667b1a1bb53307f83278111505b3e26f0c4e7b731e0060d435d2d930b
+ languageName: node
+ linkType: hard
+
"marked@npm:7.0.4":
version: 7.0.4
resolution: "marked@npm:7.0.4"
@@ -12240,6 +13210,173 @@ __metadata:
languageName: node
linkType: hard
+"mdast-util-find-and-replace@npm:^3.0.0":
+ version: 3.0.2
+ resolution: "mdast-util-find-and-replace@npm:3.0.2"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ escape-string-regexp: "npm:^5.0.0"
+ unist-util-is: "npm:^6.0.0"
+ unist-util-visit-parents: "npm:^6.0.0"
+ checksum: 10c0/c8417a35605d567772ff5c1aa08363ff3010b0d60c8ea68c53cba09bf25492e3dd261560425c1756535f3b7107f62e7ff3857cdd8fb1e62d1b2cc2ea6e074ca2
+ languageName: node
+ linkType: hard
+
+"mdast-util-from-markdown@npm:^2.0.0":
+ version: 2.0.2
+ resolution: "mdast-util-from-markdown@npm:2.0.2"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ "@types/unist": "npm:^3.0.0"
+ decode-named-character-reference: "npm:^1.0.0"
+ devlop: "npm:^1.0.0"
+ mdast-util-to-string: "npm:^4.0.0"
+ micromark: "npm:^4.0.0"
+ micromark-util-decode-numeric-character-reference: "npm:^2.0.0"
+ micromark-util-decode-string: "npm:^2.0.0"
+ micromark-util-normalize-identifier: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ unist-util-stringify-position: "npm:^4.0.0"
+ checksum: 10c0/76eb2bd2c6f7a0318087c73376b8af6d7561c1e16654e7667e640f391341096c56142618fd0ff62f6d39e5ab4895898b9789c84cd7cec2874359a437a0e1ff15
+ languageName: node
+ linkType: hard
+
+"mdast-util-gfm-autolink-literal@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "mdast-util-gfm-autolink-literal@npm:2.0.1"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ ccount: "npm:^2.0.0"
+ devlop: "npm:^1.0.0"
+ mdast-util-find-and-replace: "npm:^3.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ checksum: 10c0/963cd22bd42aebdec7bdd0a527c9494d024d1ad0739c43dc040fee35bdfb5e29c22564330a7418a72b5eab51d47a6eff32bc0255ef3ccb5cebfe8970e91b81b6
+ languageName: node
+ linkType: hard
+
+"mdast-util-gfm-footnote@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "mdast-util-gfm-footnote@npm:2.1.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ devlop: "npm:^1.1.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ micromark-util-normalize-identifier: "npm:^2.0.0"
+ checksum: 10c0/8ab965ee6be3670d76ec0e95b2ba3101fc7444eec47564943ab483d96ac17d29da2a4e6146a2a288be30c21b48c4f3938a1e54b9a46fbdd321d49a5bc0077ed0
+ languageName: node
+ linkType: hard
+
+"mdast-util-gfm-strikethrough@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "mdast-util-gfm-strikethrough@npm:2.0.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ checksum: 10c0/b053e93d62c7545019bd914271ea9e5667ad3b3b57d16dbf68e56fea39a7e19b4a345e781312714eb3d43fdd069ff7ee22a3ca7f6149dfa774554f19ce3ac056
+ languageName: node
+ linkType: hard
+
+"mdast-util-gfm-table@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "mdast-util-gfm-table@npm:2.0.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ devlop: "npm:^1.0.0"
+ markdown-table: "npm:^3.0.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ checksum: 10c0/128af47c503a53bd1c79f20642561e54a510ad5e2db1e418d28fefaf1294ab839e6c838e341aef5d7e404f9170b9ca3d1d89605f234efafde93ee51174a6e31e
+ languageName: node
+ linkType: hard
+
+"mdast-util-gfm-task-list-item@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "mdast-util-gfm-task-list-item@npm:2.0.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ devlop: "npm:^1.0.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ checksum: 10c0/258d725288482b636c0a376c296431390c14b4f29588675297cb6580a8598ed311fc73ebc312acfca12cc8546f07a3a285a53a3b082712e2cbf5c190d677d834
+ languageName: node
+ linkType: hard
+
+"mdast-util-gfm@npm:^3.0.0":
+ version: 3.1.0
+ resolution: "mdast-util-gfm@npm:3.1.0"
+ dependencies:
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-gfm-autolink-literal: "npm:^2.0.0"
+ mdast-util-gfm-footnote: "npm:^2.0.0"
+ mdast-util-gfm-strikethrough: "npm:^2.0.0"
+ mdast-util-gfm-table: "npm:^2.0.0"
+ mdast-util-gfm-task-list-item: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ checksum: 10c0/4bedcfb6a20e39901c8772f0d2bb2d7a64ae87a54c13cbd92eec062cf470fbb68c2ad754e149af5b30794e2de61c978ab1de1ace03c0c40f443ca9b9b8044f81
+ languageName: node
+ linkType: hard
+
+"mdast-util-mdx-expression@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "mdast-util-mdx-expression@npm:2.0.1"
+ dependencies:
+ "@types/estree-jsx": "npm:^1.0.0"
+ "@types/hast": "npm:^3.0.0"
+ "@types/mdast": "npm:^4.0.0"
+ devlop: "npm:^1.0.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ checksum: 10c0/9a1e57940f66431f10312fa239096efa7627f375e7933b5d3162c0b5c1712a72ac87447aff2b6838d2bbd5c1311b188718cc90b33b67dc67a88550e0a6ef6183
+ languageName: node
+ linkType: hard
+
+"mdast-util-mdx-jsx@npm:^3.0.0":
+ version: 3.2.0
+ resolution: "mdast-util-mdx-jsx@npm:3.2.0"
+ dependencies:
+ "@types/estree-jsx": "npm:^1.0.0"
+ "@types/hast": "npm:^3.0.0"
+ "@types/mdast": "npm:^4.0.0"
+ "@types/unist": "npm:^3.0.0"
+ ccount: "npm:^2.0.0"
+ devlop: "npm:^1.1.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ parse-entities: "npm:^4.0.0"
+ stringify-entities: "npm:^4.0.0"
+ unist-util-stringify-position: "npm:^4.0.0"
+ vfile-message: "npm:^4.0.0"
+ checksum: 10c0/3acadaf3b962254f7ad2990fed4729961dc0217ca31fde9917986e880843f3ecf3392b1f22d569235cacd180d50894ad266db7af598aedca69d330d33c7ac613
+ languageName: node
+ linkType: hard
+
+"mdast-util-mdxjs-esm@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "mdast-util-mdxjs-esm@npm:2.0.1"
+ dependencies:
+ "@types/estree-jsx": "npm:^1.0.0"
+ "@types/hast": "npm:^3.0.0"
+ "@types/mdast": "npm:^4.0.0"
+ devlop: "npm:^1.0.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ checksum: 10c0/5bda92fc154141705af2b804a534d891f28dac6273186edf1a4c5e3f045d5b01dbcac7400d27aaf91b7e76e8dce007c7b2fdf136c11ea78206ad00bdf9db46bc
+ languageName: node
+ linkType: hard
+
+"mdast-util-phrasing@npm:^4.0.0":
+ version: 4.1.0
+ resolution: "mdast-util-phrasing@npm:4.1.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ unist-util-is: "npm:^6.0.0"
+ checksum: 10c0/bf6c31d51349aa3d74603d5e5a312f59f3f65662ed16c58017169a5fb0f84ca98578f626c5ee9e4aa3e0a81c996db8717096705521bddb4a0185f98c12c9b42f
+ languageName: node
+ linkType: hard
+
"mdast-util-to-hast@npm:^13.0.0":
version: 13.2.0
resolution: "mdast-util-to-hast@npm:13.2.0"
@@ -12257,6 +13394,32 @@ __metadata:
languageName: node
linkType: hard
+"mdast-util-to-markdown@npm:^2.0.0":
+ version: 2.1.2
+ resolution: "mdast-util-to-markdown@npm:2.1.2"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ "@types/unist": "npm:^3.0.0"
+ longest-streak: "npm:^3.0.0"
+ mdast-util-phrasing: "npm:^4.0.0"
+ mdast-util-to-string: "npm:^4.0.0"
+ micromark-util-classify-character: "npm:^2.0.0"
+ micromark-util-decode-string: "npm:^2.0.0"
+ unist-util-visit: "npm:^5.0.0"
+ zwitch: "npm:^2.0.0"
+ checksum: 10c0/4649722a6099f12e797bd8d6469b2b43b44e526b5182862d9c7766a3431caad2c0112929c538a972f214e63c015395e5d3f54bd81d9ac1b16e6d8baaf582f749
+ languageName: node
+ linkType: hard
+
+"mdast-util-to-string@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "mdast-util-to-string@npm:4.0.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ checksum: 10c0/2d3c1af29bf3fe9c20f552ee9685af308002488f3b04b12fa66652c9718f66f41a32f8362aa2d770c3ff464c034860b41715902ada2306bb0a055146cef064d7
+ languageName: node
+ linkType: hard
+
"mdurl@npm:^2.0.0":
version: 2.0.0
resolution: "mdurl@npm:2.0.0"
@@ -12313,6 +13476,180 @@ __metadata:
languageName: node
linkType: hard
+"micromark-core-commonmark@npm:^2.0.0":
+ version: 2.0.3
+ resolution: "micromark-core-commonmark@npm:2.0.3"
+ dependencies:
+ decode-named-character-reference: "npm:^1.0.0"
+ devlop: "npm:^1.0.0"
+ micromark-factory-destination: "npm:^2.0.0"
+ micromark-factory-label: "npm:^2.0.0"
+ micromark-factory-space: "npm:^2.0.0"
+ micromark-factory-title: "npm:^2.0.0"
+ micromark-factory-whitespace: "npm:^2.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-chunked: "npm:^2.0.0"
+ micromark-util-classify-character: "npm:^2.0.0"
+ micromark-util-html-tag-name: "npm:^2.0.0"
+ micromark-util-normalize-identifier: "npm:^2.0.0"
+ micromark-util-resolve-all: "npm:^2.0.0"
+ micromark-util-subtokenize: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/bd4a794fdc9e88dbdf59eaf1c507ddf26e5f7ddf4e52566c72239c0f1b66adbcd219ba2cd42350debbe24471434d5f5e50099d2b3f4e5762ca222ba8e5b549ee
+ languageName: node
+ linkType: hard
+
+"micromark-extension-gfm-autolink-literal@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "micromark-extension-gfm-autolink-literal@npm:2.1.0"
+ dependencies:
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-sanitize-uri: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/84e6fbb84ea7c161dfa179665dc90d51116de4c28f3e958260c0423e5a745372b7dcbc87d3cde98213b532e6812f847eef5ae561c9397d7f7da1e59872ef3efe
+ languageName: node
+ linkType: hard
+
+"micromark-extension-gfm-footnote@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "micromark-extension-gfm-footnote@npm:2.1.0"
+ dependencies:
+ devlop: "npm:^1.0.0"
+ micromark-core-commonmark: "npm:^2.0.0"
+ micromark-factory-space: "npm:^2.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-normalize-identifier: "npm:^2.0.0"
+ micromark-util-sanitize-uri: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/d172e4218968b7371b9321af5cde8c77423f73b233b2b0fcf3ff6fd6f61d2e0d52c49123a9b7910612478bf1f0d5e88c75a3990dd68f70f3933fe812b9f77edc
+ languageName: node
+ linkType: hard
+
+"micromark-extension-gfm-strikethrough@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "micromark-extension-gfm-strikethrough@npm:2.1.0"
+ dependencies:
+ devlop: "npm:^1.0.0"
+ micromark-util-chunked: "npm:^2.0.0"
+ micromark-util-classify-character: "npm:^2.0.0"
+ micromark-util-resolve-all: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/ef4f248b865bdda71303b494671b7487808a340b25552b11ca6814dff3fcfaab9be8d294643060bbdb50f79313e4a686ab18b99cbe4d3ee8a4170fcd134234fb
+ languageName: node
+ linkType: hard
+
+"micromark-extension-gfm-table@npm:^2.0.0":
+ version: 2.1.1
+ resolution: "micromark-extension-gfm-table@npm:2.1.1"
+ dependencies:
+ devlop: "npm:^1.0.0"
+ micromark-factory-space: "npm:^2.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/04bc00e19b435fa0add62cd029d8b7eb6137522f77832186b1d5ef34544a9bd030c9cf85e92ddfcc5c31f6f0a58a43d4b96dba4fc21316037c734630ee12c912
+ languageName: node
+ linkType: hard
+
+"micromark-extension-gfm-tagfilter@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "micromark-extension-gfm-tagfilter@npm:2.0.0"
+ dependencies:
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/995558843fff137ae4e46aecb878d8a4691cdf23527dcf1e2f0157d66786be9f7bea0109c52a8ef70e68e3f930af811828ba912239438e31a9cfb9981f44d34d
+ languageName: node
+ linkType: hard
+
+"micromark-extension-gfm-task-list-item@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "micromark-extension-gfm-task-list-item@npm:2.1.0"
+ dependencies:
+ devlop: "npm:^1.0.0"
+ micromark-factory-space: "npm:^2.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/78aa537d929e9309f076ba41e5edc99f78d6decd754b6734519ccbbfca8abd52e1c62df68d41a6ae64d2a3fc1646cea955893c79680b0b4385ced4c52296181f
+ languageName: node
+ linkType: hard
+
+"micromark-extension-gfm@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "micromark-extension-gfm@npm:3.0.0"
+ dependencies:
+ micromark-extension-gfm-autolink-literal: "npm:^2.0.0"
+ micromark-extension-gfm-footnote: "npm:^2.0.0"
+ micromark-extension-gfm-strikethrough: "npm:^2.0.0"
+ micromark-extension-gfm-table: "npm:^2.0.0"
+ micromark-extension-gfm-tagfilter: "npm:^2.0.0"
+ micromark-extension-gfm-task-list-item: "npm:^2.0.0"
+ micromark-util-combine-extensions: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/970e28df6ebdd7c7249f52a0dda56e0566fbfa9ae56c8eeeb2445d77b6b89d44096880cd57a1c01e7821b1f4e31009109fbaca4e89731bff7b83b8519690e5d9
+ languageName: node
+ linkType: hard
+
+"micromark-factory-destination@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-factory-destination@npm:2.0.1"
+ dependencies:
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/bbafcf869cee5bf511161354cb87d61c142592fbecea051000ff116068dc85216e6d48519d147890b9ea5d7e2864a6341c0c09d9948c203bff624a80a476023c
+ languageName: node
+ linkType: hard
+
+"micromark-factory-label@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-factory-label@npm:2.0.1"
+ dependencies:
+ devlop: "npm:^1.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/0137716b4ecb428114165505e94a2f18855c8bbea21b07a8b5ce514b32a595ed789d2b967125718fc44c4197ceaa48f6609d58807a68e778138d2e6b91b824e8
+ languageName: node
+ linkType: hard
+
+"micromark-factory-space@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-factory-space@npm:2.0.1"
+ dependencies:
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/f9ed43f1c0652d8d898de0ac2be3f77f776fffe7dd96bdbba1e02d7ce33d3853c6ff5daa52568fc4fa32cdf3a62d86b85ead9b9189f7211e1d69ff2163c450fb
+ languageName: node
+ linkType: hard
+
+"micromark-factory-title@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-factory-title@npm:2.0.1"
+ dependencies:
+ micromark-factory-space: "npm:^2.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/e72fad8d6e88823514916890099a5af20b6a9178ccf78e7e5e05f4de99bb8797acb756257d7a3a57a53854cb0086bf8aab15b1a9e9db8982500dd2c9ff5948b6
+ languageName: node
+ linkType: hard
+
+"micromark-factory-whitespace@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-factory-whitespace@npm:2.0.1"
+ dependencies:
+ micromark-factory-space: "npm:^2.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/20a1ec58698f24b766510a309b23a10175034fcf1551eaa9da3adcbed3e00cd53d1ebe5f030cf873f76a1cec3c34eb8c50cc227be3344caa9ed25d56cf611224
+ languageName: node
+ linkType: hard
+
"micromark-util-character@npm:^2.0.0":
version: 2.1.1
resolution: "micromark-util-character@npm:2.1.1"
@@ -12323,6 +13660,57 @@ __metadata:
languageName: node
linkType: hard
+"micromark-util-chunked@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-util-chunked@npm:2.0.1"
+ dependencies:
+ micromark-util-symbol: "npm:^2.0.0"
+ checksum: 10c0/b68c0c16fe8106949537bdcfe1be9cf36c0ccd3bc54c4007003cb0984c3750b6cdd0fd77d03f269a3382b85b0de58bde4f6eedbe7ecdf7244759112289b1ab56
+ languageName: node
+ linkType: hard
+
+"micromark-util-classify-character@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-util-classify-character@npm:2.0.1"
+ dependencies:
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/8a02e59304005c475c332f581697e92e8c585bcd45d5d225a66c1c1b14ab5a8062705188c2ccec33cc998d33502514121478b2091feddbc751887fc9c290ed08
+ languageName: node
+ linkType: hard
+
+"micromark-util-combine-extensions@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-util-combine-extensions@npm:2.0.1"
+ dependencies:
+ micromark-util-chunked: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/f15e282af24c8372cbb10b9b0b3e2c0aa681fea0ca323a44d6bc537dc1d9382c819c3689f14eaa000118f5a163245358ce6276b2cda9a84439cdb221f5d86ae7
+ languageName: node
+ linkType: hard
+
+"micromark-util-decode-numeric-character-reference@npm:^2.0.0":
+ version: 2.0.2
+ resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.2"
+ dependencies:
+ micromark-util-symbol: "npm:^2.0.0"
+ checksum: 10c0/9c8a9f2c790e5593ffe513901c3a110e9ec8882a08f466da014112a25e5059b51551ca0aeb7ff494657d86eceb2f02ee556c6558b8d66aadc61eae4a240da0df
+ languageName: node
+ linkType: hard
+
+"micromark-util-decode-string@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-util-decode-string@npm:2.0.1"
+ dependencies:
+ decode-named-character-reference: "npm:^1.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-decode-numeric-character-reference: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ checksum: 10c0/f24d75b2e5310be6e7b6dee532e0d17d3bf46996841d6295f2a9c87a2046fff4ab603c52ab9d7a7a6430a8b787b1574ae895849c603d262d1b22eef71736b5cb
+ languageName: node
+ linkType: hard
+
"micromark-util-encode@npm:^2.0.0":
version: 2.0.1
resolution: "micromark-util-encode@npm:2.0.1"
@@ -12330,6 +13718,31 @@ __metadata:
languageName: node
linkType: hard
+"micromark-util-html-tag-name@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-util-html-tag-name@npm:2.0.1"
+ checksum: 10c0/ae80444db786fde908e9295f19a27a4aa304171852c77414516418650097b8afb401961c9edb09d677b06e97e8370cfa65638dde8438ebd41d60c0a8678b85b9
+ languageName: node
+ linkType: hard
+
+"micromark-util-normalize-identifier@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-util-normalize-identifier@npm:2.0.1"
+ dependencies:
+ micromark-util-symbol: "npm:^2.0.0"
+ checksum: 10c0/5299265fa360769fc499a89f40142f10a9d4a5c3dd8e6eac8a8ef3c2e4a6570e4c009cf75ea46dce5ee31c01f25587bde2f4a5cc0a935584ae86dd857f2babbd
+ languageName: node
+ linkType: hard
+
+"micromark-util-resolve-all@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-util-resolve-all@npm:2.0.1"
+ dependencies:
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/bb6ca28764696bb479dc44a2d5b5fe003e7177aeae1d6b0d43f24cc223bab90234092d9c3ce4a4d2b8df095ccfd820537b10eb96bb7044d635f385d65a4c984a
+ languageName: node
+ linkType: hard
+
"micromark-util-sanitize-uri@npm:^2.0.0":
version: 2.0.1
resolution: "micromark-util-sanitize-uri@npm:2.0.1"
@@ -12341,6 +13754,18 @@ __metadata:
languageName: node
linkType: hard
+"micromark-util-subtokenize@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "micromark-util-subtokenize@npm:2.1.0"
+ dependencies:
+ devlop: "npm:^1.0.0"
+ micromark-util-chunked: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/bee69eece4393308e657c293ba80d92ebcb637e5f55e21dcf9c3fa732b91a8eda8ac248d76ff375e675175bfadeae4712e5158ef97eef1111789da1ce7ab5067
+ languageName: node
+ linkType: hard
+
"micromark-util-symbol@npm:^2.0.0":
version: 2.0.1
resolution: "micromark-util-symbol@npm:2.0.1"
@@ -12355,6 +13780,31 @@ __metadata:
languageName: node
linkType: hard
+"micromark@npm:^4.0.0":
+ version: 4.0.2
+ resolution: "micromark@npm:4.0.2"
+ dependencies:
+ "@types/debug": "npm:^4.0.0"
+ debug: "npm:^4.0.0"
+ decode-named-character-reference: "npm:^1.0.0"
+ devlop: "npm:^1.0.0"
+ micromark-core-commonmark: "npm:^2.0.0"
+ micromark-factory-space: "npm:^2.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-chunked: "npm:^2.0.0"
+ micromark-util-combine-extensions: "npm:^2.0.0"
+ micromark-util-decode-numeric-character-reference: "npm:^2.0.0"
+ micromark-util-encode: "npm:^2.0.0"
+ micromark-util-normalize-identifier: "npm:^2.0.0"
+ micromark-util-resolve-all: "npm:^2.0.0"
+ micromark-util-sanitize-uri: "npm:^2.0.0"
+ micromark-util-subtokenize: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/07462287254219d6eda6eac8a3cebaff2994e0575499e7088027b825105e096e4f51e466b14b2a81b71933a3b6c48ee069049d87bc2c2127eee50d9cc69e8af6
+ languageName: node
+ linkType: hard
+
"micromatch@npm:^4.0.8":
version: 4.0.8
resolution: "micromatch@npm:4.0.8"
@@ -12629,6 +14079,15 @@ __metadata:
languageName: node
linkType: hard
+"mustache@npm:^4.2.0":
+ version: 4.2.0
+ resolution: "mustache@npm:4.2.0"
+ bin:
+ mustache: bin/mustache
+ checksum: 10c0/1f8197e8a19e63645a786581d58c41df7853da26702dbc005193e2437c98ca49b255345c173d50c08fe4b4dbb363e53cb655ecc570791f8deb09887248dd34a2
+ languageName: node
+ linkType: hard
+
"mz@npm:^2.7.0":
version: 2.7.0
resolution: "mz@npm:2.7.0"
@@ -12709,6 +14168,16 @@ __metadata:
languageName: node
linkType: hard
+"next-navigation-guard@npm:^0.2.0":
+ version: 0.2.0
+ resolution: "next-navigation-guard@npm:0.2.0"
+ peerDependencies:
+ next: ^14 || ^15
+ react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ checksum: 10c0/b53ab6d7efc550076f931f8731648ccb5a771133b59a10b0163a2162f7fceb9e8f7b95b0e4698ae419870bc1c2bbb9dc7b96f81df92fcddf60d58612c247bd7d
+ languageName: node
+ linkType: hard
+
"next-themes@npm:^0.3.0":
version: 0.3.0
resolution: "next-themes@npm:0.3.0"
@@ -12865,7 +14334,7 @@ __metadata:
languageName: node
linkType: hard
-"node-domexception@npm:1.0.0":
+"node-domexception@npm:1.0.0, node-domexception@npm:^1.0.0":
version: 1.0.0
resolution: "node-domexception@npm:1.0.0"
checksum: 10c0/5e5d63cda29856402df9472335af4bb13875e1927ad3be861dc5ebde38917aecbf9ae337923777af52a48c426b70148815e890a5d72760f1b4d758cc671b1a2b
@@ -12886,6 +14355,17 @@ __metadata:
languageName: node
linkType: hard
+"node-fetch@npm:^3.3.2":
+ version: 3.3.2
+ resolution: "node-fetch@npm:3.3.2"
+ dependencies:
+ data-uri-to-buffer: "npm:^4.0.0"
+ fetch-blob: "npm:^3.1.4"
+ formdata-polyfill: "npm:^4.0.10"
+ checksum: 10c0/f3d5e56190562221398c9f5750198b34cf6113aa304e34ee97c94fd300ec578b25b2c2906edba922050fce983338fde0d5d34fcb0fc3336ade5bd0e429ad7538
+ languageName: node
+ linkType: hard
+
"node-gyp-build-optional-packages@npm:5.2.2":
version: 5.2.2
resolution: "node-gyp-build-optional-packages@npm:5.2.2"
@@ -13317,6 +14797,21 @@ __metadata:
languageName: node
linkType: hard
+"parse-entities@npm:^4.0.0":
+ version: 4.0.2
+ resolution: "parse-entities@npm:4.0.2"
+ dependencies:
+ "@types/unist": "npm:^2.0.0"
+ character-entities-legacy: "npm:^3.0.0"
+ character-reference-invalid: "npm:^2.0.0"
+ decode-named-character-reference: "npm:^1.0.0"
+ is-alphanumerical: "npm:^2.0.0"
+ is-decimal: "npm:^2.0.0"
+ is-hexadecimal: "npm:^2.0.0"
+ checksum: 10c0/a13906b1151750b78ed83d386294066daf5fb559e08c5af9591b2d98cc209123103016a01df776f65f8219ad26652d6d6b210d0974d452049cddfc53a8916c34
+ languageName: node
+ linkType: hard
+
"parse-json@npm:^4.0.0":
version: 4.0.0
resolution: "parse-json@npm:4.0.0"
@@ -13346,6 +14841,15 @@ __metadata:
languageName: node
linkType: hard
+"parse5@npm:^7.0.0":
+ version: 7.3.0
+ resolution: "parse5@npm:7.3.0"
+ dependencies:
+ entities: "npm:^6.0.0"
+ checksum: 10c0/7fd2e4e247e85241d6f2a464d0085eed599a26d7b0a5233790c49f53473232eb85350e8133344d9b3fd58b89339e7ad7270fe1f89d28abe50674ec97b87f80b5
+ languageName: node
+ linkType: hard
+
"parse5@npm:^7.1.2":
version: 7.2.1
resolution: "parse5@npm:7.2.1"
@@ -13661,6 +15165,16 @@ __metadata:
languageName: node
linkType: hard
+"postcss-selector-parser@npm:6.0.10":
+ version: 6.0.10
+ resolution: "postcss-selector-parser@npm:6.0.10"
+ dependencies:
+ cssesc: "npm:^3.0.0"
+ util-deprecate: "npm:^1.0.2"
+ checksum: 10c0/a0b27c5e3f7604c8dc7cd83f145fdd7b21448e0d86072da99e0d78e536ba27aa9db2d42024c50aa530408ee517c4bdc0260529e1afb56608f9a82e839c207e82
+ languageName: node
+ linkType: hard
+
"postcss-selector-parser@npm:^6.1.1, postcss-selector-parser@npm:^6.1.2":
version: 6.1.2
resolution: "postcss-selector-parser@npm:6.1.2"
@@ -13949,6 +15463,13 @@ __metadata:
languageName: node
linkType: hard
+"property-information@npm:^6.0.0":
+ version: 6.5.0
+ resolution: "property-information@npm:6.5.0"
+ checksum: 10c0/981e0f9cc2e5acdb414a6fd48a99dd0fd3a4079e7a91ab41cf97a8534cf43e0e0bc1ffada6602a1b3d047a33db8b5fc2ef46d863507eda712d5ceedac443f0ef
+ languageName: node
+ linkType: hard
+
"property-information@npm:^7.0.0":
version: 7.0.0
resolution: "property-information@npm:7.0.0"
@@ -14149,6 +15670,17 @@ __metadata:
languageName: node
linkType: hard
+"react-error-boundary@npm:^3.1.0":
+ version: 3.1.4
+ resolution: "react-error-boundary@npm:3.1.4"
+ dependencies:
+ "@babel/runtime": "npm:^7.12.5"
+ peerDependencies:
+ react: ">=16.13.1"
+ checksum: 10c0/f977ca61823e43de2381d53dd7aa8b4d79ff6a984c9afdc88dc44f9973b99de7fd382d2f0f91f2688e24bb987c0185bf45d0b004f22afaaab0f990a830253bfb
+ languageName: node
+ linkType: hard
+
"react-hook-form@npm:^7.53.0":
version: 7.54.2
resolution: "react-hook-form@npm:7.54.2"
@@ -14191,6 +15723,28 @@ __metadata:
languageName: node
linkType: hard
+"react-markdown@npm:^10.1.0":
+ version: 10.1.0
+ resolution: "react-markdown@npm:10.1.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@types/mdast": "npm:^4.0.0"
+ devlop: "npm:^1.0.0"
+ hast-util-to-jsx-runtime: "npm:^2.0.0"
+ html-url-attributes: "npm:^3.0.0"
+ mdast-util-to-hast: "npm:^13.0.0"
+ remark-parse: "npm:^11.0.0"
+ remark-rehype: "npm:^11.0.0"
+ unified: "npm:^11.0.0"
+ unist-util-visit: "npm:^5.0.0"
+ vfile: "npm:^6.0.0"
+ peerDependencies:
+ "@types/react": ">=18"
+ react: ">=18"
+ checksum: 10c0/4a5dc7d15ca6d05e9ee95318c1904f83b111a76f7588c44f50f1d54d4c97193b84e4f64c4b592057c989228238a2590306cedd0c4d398e75da49262b2b5ae1bf
+ languageName: node
+ linkType: hard
+
"react-promise-suspense@npm:0.3.4":
version: 0.3.4
resolution: "react-promise-suspense@npm:0.3.4"
@@ -14479,6 +16033,77 @@ __metadata:
languageName: node
linkType: hard
+"rehype-raw@npm:^7.0.0":
+ version: 7.0.0
+ resolution: "rehype-raw@npm:7.0.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ hast-util-raw: "npm:^9.0.0"
+ vfile: "npm:^6.0.0"
+ checksum: 10c0/1435b4b6640a5bc3abe3b2133885c4dbff5ef2190ef9cfe09d6a63f74dd7d7ffd0cede70603278560ccf1acbfb9da9faae4b68065a28bc5aa88ad18e40f32d52
+ languageName: node
+ linkType: hard
+
+"rehype-sanitize@npm:^6.0.0":
+ version: 6.0.0
+ resolution: "rehype-sanitize@npm:6.0.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ hast-util-sanitize: "npm:^5.0.0"
+ checksum: 10c0/43d6c056e63c994cf56e5ee0e157052d2030dc5ac160845ee494af9a26e5906bf5ec5af56c7d90c99f9c4dc0091e45a48a168618135fb6c64a76481ad3c449e9
+ languageName: node
+ linkType: hard
+
+"remark-gfm@npm:^4.0.1":
+ version: 4.0.1
+ resolution: "remark-gfm@npm:4.0.1"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ mdast-util-gfm: "npm:^3.0.0"
+ micromark-extension-gfm: "npm:^3.0.0"
+ remark-parse: "npm:^11.0.0"
+ remark-stringify: "npm:^11.0.0"
+ unified: "npm:^11.0.0"
+ checksum: 10c0/427ecc6af3e76222662061a5f670a3e4e33ec5fffe2cabf04034da6a3f9a1bda1fc023e838a636385ba314e66e2bebbf017ca61ebea357eb0f5200fe0625a4b7
+ languageName: node
+ linkType: hard
+
+"remark-parse@npm:^11.0.0":
+ version: 11.0.0
+ resolution: "remark-parse@npm:11.0.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ unified: "npm:^11.0.0"
+ checksum: 10c0/6eed15ddb8680eca93e04fcb2d1b8db65a743dcc0023f5007265dda558b09db595a087f622062ccad2630953cd5cddc1055ce491d25a81f3317c858348a8dd38
+ languageName: node
+ linkType: hard
+
+"remark-rehype@npm:^11.0.0":
+ version: 11.1.2
+ resolution: "remark-rehype@npm:11.1.2"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@types/mdast": "npm:^4.0.0"
+ mdast-util-to-hast: "npm:^13.0.0"
+ unified: "npm:^11.0.0"
+ vfile: "npm:^6.0.0"
+ checksum: 10c0/f9eccacfb596d9605581dc05bfad28635d6ded5dd0a18e88af5fd4df0d3fcf9612e1501d4513bc2164d833cfe9636dab20400080b09e53f155c6e1442a1231fb
+ languageName: node
+ linkType: hard
+
+"remark-stringify@npm:^11.0.0":
+ version: 11.0.0
+ resolution: "remark-stringify@npm:11.0.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ unified: "npm:^11.0.0"
+ checksum: 10c0/0cdb37ce1217578f6f847c7ec9f50cbab35df5b9e3903d543e74b405404e67c07defcb23cd260a567b41b769400f6de03c2c3d9cd6ae7a6707d5c8d89ead489f
+ languageName: node
+ linkType: hard
+
"require-from-string@npm:^2.0.2":
version: 2.0.2
resolution: "require-from-string@npm:2.0.2"
@@ -15355,6 +16980,63 @@ __metadata:
languageName: node
linkType: hard
+"slate-dom@npm:^0.116.0":
+ version: 0.116.0
+ resolution: "slate-dom@npm:0.116.0"
+ dependencies:
+ "@juggle/resize-observer": "npm:^3.4.0"
+ direction: "npm:^1.0.4"
+ is-hotkey: "npm:^0.2.0"
+ is-plain-object: "npm:^5.0.0"
+ lodash: "npm:^4.17.21"
+ scroll-into-view-if-needed: "npm:^3.1.0"
+ tiny-invariant: "npm:1.3.1"
+ peerDependencies:
+ slate: ">=0.99.0"
+ checksum: 10c0/ad256c1ac305a5304cd2b7d82ada470ec611a3786d2da836c380ebd1c4c62054a8ab889e3b7a11484bdffd41c2caaf9c07d5df8d70687771ac87820a98ecac22
+ languageName: node
+ linkType: hard
+
+"slate-history@npm:^0.113.1":
+ version: 0.113.1
+ resolution: "slate-history@npm:0.113.1"
+ dependencies:
+ is-plain-object: "npm:^5.0.0"
+ peerDependencies:
+ slate: ">=0.65.3"
+ checksum: 10c0/cb3de172d391db7bfa023a1844f778b39a323c1e4b3b32e2d6ca73a0edec2ae9afd147b766d555e2f8d742716d2ed140550b1ee38e3654eebecac24fc98cc05f
+ languageName: node
+ linkType: hard
+
+"slate-react@npm:^0.117.1":
+ version: 0.117.1
+ resolution: "slate-react@npm:0.117.1"
+ dependencies:
+ "@juggle/resize-observer": "npm:^3.4.0"
+ direction: "npm:^1.0.4"
+ is-hotkey: "npm:^0.2.0"
+ lodash: "npm:^4.17.21"
+ scroll-into-view-if-needed: "npm:^3.1.0"
+ tiny-invariant: "npm:1.3.1"
+ peerDependencies:
+ react: ">=18.2.0"
+ react-dom: ">=18.2.0"
+ slate: ">=0.114.0"
+ slate-dom: ">=0.116.0"
+ checksum: 10c0/7feed8bece3a9fb0e0d0b6c84d175c6b863bd4eaabc317173e1fa5534309416e85a12e456362644132f87416efad474ebcb6c5f4b3a52037e5a6324d5644be78
+ languageName: node
+ linkType: hard
+
+"slate@npm:^0.117.0":
+ version: 0.117.0
+ resolution: "slate@npm:0.117.0"
+ dependencies:
+ immer: "npm:^10.0.3"
+ tiny-warning: "npm:^1.0.3"
+ checksum: 10c0/7e1251bc814a7237a7b6d2f0c631a8f7ee5317d9fdb6ffa1b1d97178adc5648789d6b2059a3fb2590967799b3e6105832c4d160aa68723929ce85320a7c18701
+ languageName: node
+ linkType: hard
+
"smart-buffer@npm:^4.2.0":
version: 4.2.0
resolution: "smart-buffer@npm:4.2.0"
@@ -15770,6 +17452,24 @@ __metadata:
languageName: node
linkType: hard
+"style-to-js@npm:^1.0.0":
+ version: 1.1.17
+ resolution: "style-to-js@npm:1.1.17"
+ dependencies:
+ style-to-object: "npm:1.0.9"
+ checksum: 10c0/429b9d5593a238d73761324e2c12f75b238f6964e12e4ecf7ea02b44c0ec1940b45c1c1fa8fac9a58637b753aa3ce973a2413b2b6da679584117f27a79e33ba3
+ languageName: node
+ linkType: hard
+
+"style-to-object@npm:1.0.9":
+ version: 1.0.9
+ resolution: "style-to-object@npm:1.0.9"
+ dependencies:
+ inline-style-parser: "npm:0.2.4"
+ checksum: 10c0/acc89a291ac348a57fa1d00b8eb39973ea15a6c7d7fe4b11339ea0be3b84acea3670c98aa22e166be20ca3d67e12f68f83cf114dde9d43ebb692593e859a804f
+ languageName: node
+ linkType: hard
+
"styled-jsx@npm:5.1.1":
version: 5.1.1
resolution: "styled-jsx@npm:5.1.1"
@@ -15829,6 +17529,18 @@ __metadata:
languageName: node
linkType: hard
+"swr@npm:^2.2.5":
+ version: 2.3.4
+ resolution: "swr@npm:2.3.4"
+ dependencies:
+ dequal: "npm:^2.0.3"
+ use-sync-external-store: "npm:^1.4.0"
+ peerDependencies:
+ react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ checksum: 10c0/c5cf536c2652fc6b64d64d3ce232f8bbe25dcaffc688f852fb81cf06e28b59280ebebde752429d9801c3af8e7a956ee7242376a6386a599cedc0000b862a712d
+ languageName: node
+ linkType: hard
+
"symbol-tree@npm:^3.2.4":
version: 3.2.4
resolution: "symbol-tree@npm:3.2.4"
@@ -15947,6 +17659,13 @@ __metadata:
languageName: node
linkType: hard
+"throttleit@npm:2.1.0":
+ version: 2.1.0
+ resolution: "throttleit@npm:2.1.0"
+ checksum: 10c0/1696ae849522cea6ba4f4f3beac1f6655d335e51b42d99215e196a718adced0069e48deaaf77f7e89f526ab31de5b5c91016027da182438e6f9280be2f3d5265
+ languageName: node
+ linkType: hard
+
"through@npm:2, through@npm:~2.3, through@npm:~2.3.1":
version: 2.3.8
resolution: "through@npm:2.3.8"
@@ -15954,6 +17673,13 @@ __metadata:
languageName: node
linkType: hard
+"tiny-invariant@npm:1.3.1":
+ version: 1.3.1
+ resolution: "tiny-invariant@npm:1.3.1"
+ checksum: 10c0/5b87c1d52847d9452b60d0dcb77011b459044e0361ca8253bfe7b43d6288106e12af926adb709a6fc28900e3864349b91dad9a4ac93c39aa15f360b26c2ff4db
+ languageName: node
+ linkType: hard
+
"tiny-invariant@npm:^1.3.1":
version: 1.3.3
resolution: "tiny-invariant@npm:1.3.3"
@@ -15961,6 +17687,13 @@ __metadata:
languageName: node
linkType: hard
+"tiny-warning@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "tiny-warning@npm:1.0.3"
+ checksum: 10c0/ef8531f581b30342f29670cb41ca248001c6fd7975ce22122bd59b8d62b4fc84ad4207ee7faa95cde982fa3357cd8f4be650142abc22805538c3b1392d7084fa
+ languageName: node
+ linkType: hard
+
"tinybench@npm:^2.9.0":
version: 2.9.0
resolution: "tinybench@npm:2.9.0"
@@ -16095,6 +17828,13 @@ __metadata:
languageName: node
linkType: hard
+"trough@npm:^2.0.0":
+ version: 2.2.0
+ resolution: "trough@npm:2.2.0"
+ checksum: 10c0/58b671fc970e7867a48514168894396dd94e6d9d6456aca427cc299c004fe67f35ed7172a36449086b2edde10e78a71a284ec0076809add6834fb8f857ccb9b0
+ languageName: node
+ linkType: hard
+
"ts-api-utils@npm:^1.0.1":
version: 1.4.3
resolution: "ts-api-utils@npm:1.4.3"
@@ -16178,7 +17918,7 @@ __metadata:
languageName: node
linkType: hard
-"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.8.1":
+"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2, tslib@npm:^2.8.1":
version: 2.8.1
resolution: "tslib@npm:2.8.1"
checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62
@@ -16394,6 +18134,21 @@ __metadata:
languageName: node
linkType: hard
+"unified@npm:^11.0.0":
+ version: 11.0.5
+ resolution: "unified@npm:11.0.5"
+ dependencies:
+ "@types/unist": "npm:^3.0.0"
+ bail: "npm:^2.0.0"
+ devlop: "npm:^1.0.0"
+ extend: "npm:^3.0.0"
+ is-plain-obj: "npm:^4.0.0"
+ trough: "npm:^2.0.0"
+ vfile: "npm:^6.0.0"
+ checksum: 10c0/53c8e685f56d11d9d458a43e0e74328a4d6386af51c8ac37a3dcabec74ce5026da21250590d4aff6733ccd7dc203116aae2b0769abc18cdf9639a54ae528dfc9
+ languageName: node
+ linkType: hard
+
"unique-filename@npm:^4.0.0":
version: 4.0.0
resolution: "unique-filename@npm:4.0.0"
@@ -16547,6 +18302,15 @@ __metadata:
languageName: node
linkType: hard
+"use-sync-external-store@npm:^1.4.0":
+ version: 1.5.0
+ resolution: "use-sync-external-store@npm:1.5.0"
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ checksum: 10c0/1b8663515c0be34fa653feb724fdcce3984037c78dd4a18f68b2c8be55cc1a1084c578d5b75f158d41b5ddffc2bf5600766d1af3c19c8e329bb20af2ec6f52f4
+ languageName: node
+ linkType: hard
+
"usehooks-ts@npm:^3.1.0":
version: 3.1.1
resolution: "usehooks-ts@npm:3.1.1"
@@ -16605,6 +18369,16 @@ __metadata:
languageName: node
linkType: hard
+"vfile-location@npm:^5.0.0":
+ version: 5.0.3
+ resolution: "vfile-location@npm:5.0.3"
+ dependencies:
+ "@types/unist": "npm:^3.0.0"
+ vfile: "npm:^6.0.0"
+ checksum: 10c0/1711f67802a5bc175ea69750d59863343ed43d1b1bb25c0a9063e4c70595e673e53e2ed5cdbb6dcdc370059b31605144d95e8c061b9361bcc2b036b8f63a4966
+ languageName: node
+ linkType: hard
+
"vfile-message@npm:^4.0.0":
version: 4.0.2
resolution: "vfile-message@npm:4.0.2"
@@ -16812,6 +18586,13 @@ __metadata:
languageName: node
linkType: hard
+"web-namespaces@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "web-namespaces@npm:2.0.1"
+ checksum: 10c0/df245f466ad83bd5cd80bfffc1674c7f64b7b84d1de0e4d2c0934fb0782e0a599164e7197a4bce310ee3342fd61817b8047ff04f076a1ce12dd470584142a4bd
+ languageName: node
+ linkType: hard
+
"web-streams-polyfill@npm:4.0.0-beta.3":
version: 4.0.0-beta.3
resolution: "web-streams-polyfill@npm:4.0.0-beta.3"
@@ -16819,6 +18600,13 @@ __metadata:
languageName: node
linkType: hard
+"web-streams-polyfill@npm:^3.0.3":
+ version: 3.3.3
+ resolution: "web-streams-polyfill@npm:3.3.3"
+ checksum: 10c0/64e855c47f6c8330b5436147db1c75cb7e7474d924166800e8e2aab5eb6c76aac4981a84261dd2982b3e754490900b99791c80ae1407a9fa0dcff74f82ea3a7f
+ languageName: node
+ linkType: hard
+
"web-vitals@npm:^4.2.4":
version: 4.2.4
resolution: "web-vitals@npm:4.2.4"
@@ -17173,7 +18961,14 @@ __metadata:
languageName: node
linkType: hard
-"zwitch@npm:^2.0.4":
+"zod@npm:^3.25.74":
+ version: 3.25.74
+ resolution: "zod@npm:3.25.74"
+ checksum: 10c0/59e38b046ac333b5bd1ba325a83b6798721227cbfb1e69dfc7159bd7824b904241ab923026edb714fafefec3624265ae374a70aee9a5a45b365bd31781ffa105
+ languageName: node
+ linkType: hard
+
+"zwitch@npm:^2.0.0, zwitch@npm:^2.0.4":
version: 2.0.4
resolution: "zwitch@npm:2.0.4"
checksum: 10c0/3c7830cdd3378667e058ffdb4cf2bb78ac5711214e2725900873accb23f3dfe5f9e7e5a06dcdc5f29605da976fc45c26d9a13ca334d6eea2245a15e77b8fc06e