diff --git a/client/cody-slack/.eslintrc.js b/client/cody-slack/.eslintrc.js index 6817c7a07d0..8153dc5e6fc 100644 --- a/client/cody-slack/.eslintrc.js +++ b/client/cody-slack/.eslintrc.js @@ -9,6 +9,7 @@ module.exports = { }, overrides: baseConfig.overrides, rules: { + 'ban/ban': 'off', 'id-length': 'off', 'no-console': 'off', 'no-restricted-imports': [ diff --git a/client/cody-slack/BUILD.bazel b/client/cody-slack/BUILD.bazel index bedd5d1a15d..d29b4d2e2b6 100644 --- a/client/cody-slack/BUILD.bazel +++ b/client/cody-slack/BUILD.bazel @@ -26,6 +26,8 @@ ts_project( "src/constants.ts", "src/mention-handler.ts", "src/services/codebase-context.ts", + "src/services/github-client.ts", + "src/services/local-vector-store.ts", "src/services/openai-completions-client.ts", "src/services/sourcegraph-client.ts", "src/services/stream-completions.ts", @@ -39,10 +41,13 @@ ts_project( ":node_modules/@slack/bolt", ":node_modules/@slack/web-api", ":node_modules/@sourcegraph/cody-shared", + ":node_modules/langchain", ":node_modules/openai", + ":node_modules/slackify-markdown", "//:node_modules/@types/lodash", "//:node_modules/envalid", "//:node_modules/lodash", + "//:node_modules/octokit", ], ) diff --git a/client/cody-slack/package.json b/client/cody-slack/package.json index 6e0a6dff219..975c4b8d498 100644 --- a/client/cody-slack/package.json +++ b/client/cody-slack/package.json @@ -9,15 +9,21 @@ "start": "ts-node-transpile-only ./src/app.ts", "lint": "pnpm run lint:js", "lint:js": "eslint --cache '**/*.[tj]s?(x)'", - "build": "esbuild ./src/app.ts --bundle --outfile=dist/app.js --format=cjs --platform=node", + "build": "esbuild ./src/app.ts --bundle --outfile=dist/app.js --external:hnswlib-node --format=cjs --platform=node", "build-ts": "tsc -b --emitDeclarationOnly", - "release": "pnpm run build && cd dist && git add . && git commit -m wip && git push heroku master" + "release": "pnpm run build && cd dist && git add . && git commit -m wip && git push heroku master", + "build:gcp": "esbuild ./src/app.ts --bundle --outfile=package/app.js --external:hnswlib-node --format=cjs --platform=node", + "release:gcp": "pnpm run build && cd package && git add . && git commit -m wip && git push gcp main" }, "dependencies": { "@slack/bolt": "^3.12.2", "@slack/web-api": "^6.8.1", "@sourcegraph/cody-shared": "workspace:*", "@sourcegraph/common": "workspace:*", - "openai": "^3.2.1" + "axios": "^1.3.6", + "hnswlib-node": "^1.4.2", + "langchain": "^0.0.61", + "openai": "^3.2.1", + "slackify-markdown": "^4.3.1" } } diff --git a/client/cody-slack/package/package.json b/client/cody-slack/package/package.json new file mode 100644 index 00000000000..d5f357a48dd --- /dev/null +++ b/client/cody-slack/package/package.json @@ -0,0 +1,14 @@ +{ + "name": "@sourcegraph/cody-slack", + "private": true, + "displayName": "Sourcegraph Cody Slack", + "version": "0.0.1", + "license": "Apache-2.0", + "description": "Your programming sidekick powered by AI and Sourcegraph's code search and intelligence.", + "scripts": { + "start": "node ./app.js" + }, + "dependencies": { + "hnswlib-node": "^1.4.2" + } +} diff --git a/client/cody-slack/src/app.ts b/client/cody-slack/src/app.ts index 3af32eb0db2..af50dcf08bb 100644 --- a/client/cody-slack/src/app.ts +++ b/client/cody-slack/src/app.ts @@ -1,19 +1,31 @@ -import { ENVIRONMENT_CONFIG, DEFAULT_APP_SETTINGS } from './constants' +import { ENVIRONMENT_CONFIG, DEFAULT_CODEBASES, AppContext, DEFAULT_APP_SETTINGS } from './constants' import { handleHumanMessage } from './mention-handler' import { createCodebaseContext } from './services/codebase-context' +import { getVectorStore } from './services/local-vector-store' import { isBotEvent } from './slack/helpers' import { app } from './slack/init' const { PORT } = ENVIRONMENT_CONFIG +async function createAppContext() { + // Init codebase context clients for specified Slack channels. + const appContext = { codebaseContexts: {} } as AppContext + for (const codebase of DEFAULT_CODEBASES) { + appContext.codebaseContexts[codebase] = await createCodebaseContext( + codebase, + DEFAULT_APP_SETTINGS.contextType, + DEFAULT_APP_SETTINGS.serverEndpoint + ) + } + + appContext.vectorStore = await getVectorStore() + + return appContext +} + // Main function to start the bot async function startBot() { - // Create a context for the codebase using the default app settings - const codebaseContext = await createCodebaseContext( - DEFAULT_APP_SETTINGS.codebase, - DEFAULT_APP_SETTINGS.contextType, - DEFAULT_APP_SETTINGS.serverEndpoint - ) + const appContext = await createAppContext() // Listen for mentions in the Slack app app.event<'app_mention'>('app_mention', async ({ event }) => { @@ -22,9 +34,9 @@ async function startBot() { return } - console.log('APP_MENTION', event.text) + console.log('APP_MENTION:', event.text) // Process the mention event generated by a human user - await handleHumanMessage(event, codebaseContext) + await handleHumanMessage(event, appContext) }) // Start the Slack app on the specified port diff --git a/client/cody-slack/src/constants.ts b/client/cody-slack/src/constants.ts index ff504f43a94..93b2dc833fe 100644 --- a/client/cody-slack/src/constants.ts +++ b/client/cody-slack/src/constants.ts @@ -1,4 +1,7 @@ import { cleanEnv, str, num } from 'envalid' +import { HNSWLib } from 'langchain/vectorstores/hnswlib' + +import { CodebaseContext } from '@sourcegraph/cody-shared/src/codebase-context' export const ENVIRONMENT_CONFIG = cleanEnv(process.env, { PORT: num({ default: 3000 }), @@ -6,14 +9,27 @@ export const ENVIRONMENT_CONFIG = cleanEnv(process.env, { // OPENAI_API_KEY: str(), SOURCEGRAPH_ACCESS_TOKEN: str(), + GITHUB_TOKEN: str(), + SLACK_APP_TOKEN: str(), SLACK_BOT_TOKEN: str(), SLACK_SIGNING_SECRET: str(), }) export const DEFAULT_APP_SETTINGS = { - codebase: 'github.com/sourcegraph/sourcegraph', serverEndpoint: 'https://sourcegraph.sourcegraph.com', - contextType: 'blended', debug: 'development', + contextType: 'blended', } as const + +export const DEFAULT_CODEBASES = [ + 'github.com/sourcegraph/sourcegraph', + 'github.com/sourcegraph/handbook', + 'github.com/sourcegraph/about', +] as const + +export type CodebaseContexts = Record +export interface AppContext { + codebaseContexts: CodebaseContexts + vectorStore: HNSWLib +} diff --git a/client/cody-slack/src/mention-handler.ts b/client/cody-slack/src/mention-handler.ts index be24865996c..cb185ac4008 100644 --- a/client/cody-slack/src/mention-handler.ts +++ b/client/cody-slack/src/mention-handler.ts @@ -4,28 +4,41 @@ import { throttle } from 'lodash' import { Transcript } from '@sourcegraph/cody-shared/src/chat/transcript' import { reformatBotMessage } from '@sourcegraph/cody-shared/src/chat/viewHelpers' -import { CodebaseContext } from '@sourcegraph/cody-shared/src/codebase-context' import { Message as PromptMessage } from '@sourcegraph/cody-shared/src/sourcegraph-api' -import { intentDetector } from './services/sourcegraph-client' +import { AppContext } from './constants' import { streamCompletions } from './services/stream-completions' import * as slackHelpers from './slack/helpers' -import { interactionFromMessage } from './slack/message-interaction' +import { cleanupMessageForPrompt, getSlackInteraction } from './slack/message-interaction' import { SLACK_PREAMBLE } from './slack/preamble' const IN_PROGRESS_MESSAGE = '...✍️' +/** + * Used to test Slack channel context fetching. + * E.g., @cody-dev channel:ask-cody your prompt. + */ +function parseSlackChannelFilter(input: string): string | null { + const match = input.match(/channel:([\w-]+)/) + return match ? match[1] : null +} + /** * Handles human-generated messages in a Slack bot application. * Processes the messages, generates a prompt, and streams completions. */ -export async function handleHumanMessage(event: AppMentionEvent, codebaseContext: CodebaseContext): Promise { +export async function handleHumanMessage(event: AppMentionEvent, appContext: AppContext): Promise { const channel = event.channel const thread_ts = slackHelpers.getEventTs(event) + const slackChannelFilter = parseSlackChannelFilter(event.text) // Restore transcript from the Slack thread - const messages = await slackHelpers.getThreadMessages(channel, thread_ts) - const transcript = await restoreTranscriptFromSlackThread(codebaseContext, messages) + const [messages, channelName] = await Promise.all([ + slackHelpers.getThreadMessages(channel, thread_ts), + slackHelpers.getSlackChannelName(channel), + ]) + + const transcript = await restoreTranscriptFromSlackThread(slackChannelFilter || channelName!, appContext, messages) // Send an in-progress message const response = await slackHelpers.postMessage(IN_PROGRESS_MESSAGE, channel, thread_ts) @@ -33,31 +46,53 @@ export async function handleHumanMessage(event: AppMentionEvent, codebaseContext // Generate a prompt and start completion streaming const prompt = await transcript.toPrompt(SLACK_PREAMBLE) console.log('PROMPT', prompt) - startCompletionStreaming(prompt, channel, response?.ts) + startCompletionStreaming(prompt, channel, transcript, response?.ts) } /** * Restores a transcript from the given Slack thread messages. */ -async function restoreTranscriptFromSlackThread(codebaseContext: CodebaseContext, messages: SlackReplyMessage[]) { +async function restoreTranscriptFromSlackThread( + channelName: string, + appContext: AppContext, + messages: SlackReplyMessage[] +) { + const { codebaseContexts, vectorStore } = appContext const transcript = new Transcript() + const mergedMessages = mergeSequentialUserMessages(messages) + const newHumanMessage = mergedMessages.pop()! - for (const [index, message] of mergedMessages.entries()) { - const interaction = await interactionFromMessage( - message.human, - intentDetector, - // Fetch codebase context only for the last message - index === mergedMessages.length - 1 ? codebaseContext : null - ) + mergedMessages.forEach(message => { + const slackInteraction = getSlackInteraction(message.human.text, message.assistant?.text) - transcript.addInteraction(interaction) + transcript.addInteraction(slackInteraction.getTranscriptInteraction()) + }) - if (message.assistant?.text) { - transcript.addAssistantResponse(message.assistant?.text) - } + const newHumanSlackInteraction = getSlackInteraction(newHumanMessage?.human.text) + + if (channelName === 'ask-cody') { + await Promise.all([ + newHumanSlackInteraction.updateContextMessagesFromVectorStore(vectorStore, 3), + newHumanSlackInteraction.updateContextMessages(codebaseContexts, 'github.com/sourcegraph/sourcegraph', { + numCodeResults: 3, + numTextResults: 5, + }), + newHumanSlackInteraction.updateContextMessages(codebaseContexts, 'github.com/sourcegraph/handbook', { + numCodeResults: 0, + numTextResults: 4, + }), + ]) + } else { + await newHumanSlackInteraction.updateContextMessages(codebaseContexts, 'github.com/sourcegraph/sourcegraph', { + numCodeResults: 12, + numTextResults: 3, + }) } + const lastInteraction = newHumanSlackInteraction.getTranscriptInteraction() + transcript.addInteraction(lastInteraction) + return transcript } @@ -67,14 +102,30 @@ async function restoreTranscriptFromSlackThread(codebaseContext: CodebaseContext function startCompletionStreaming( promptMessages: PromptMessage[], channel: string, + transcript: Transcript, inProgressMessageTs?: string ): void { + const lastInteraction = transcript.getLastInteraction()! + + const { contextFiles = [] } = lastInteraction.toChat().pop()! + + // Build the markdown list of file links. + const contextFilesList = contextFiles + .map(file => `[${file.fileName.split('/').pop()}](${file.fileName})`) + .join(', ') + + const suffix = contextFiles.length > 0 ? '\n\n**Files used**:\n' + contextFilesList : '' + streamCompletions(promptMessages, { onChange: text => { - onBotMessageChange(reformatBotMessage(text, ''), channel, inProgressMessageTs)?.catch(console.error) + // console.log('Stream update: ', text) + lastInteraction.setAssistantMessage({ ...lastInteraction.getAssistantMessage(), text }) + onBotMessageChange(channel, inProgressMessageTs, reformatBotMessage(text, '') + suffix)?.catch( + console.error + ) }, onComplete: () => { - console.log('Streaming complete!') + console.log('Streaming complete!', lastInteraction.getAssistantMessage().text) }, onError: err => { console.error(err) @@ -86,7 +137,7 @@ function startCompletionStreaming( * Throttled function to update the bot message when there is a change. * Ensures message updates are throttled to avoid exceeding Slack API rate limits. */ -const onBotMessageChange = throttle(async (text: string, channel, inProgressMessageTs?: string) => { +const onBotMessageChange = throttle(async (channel, inProgressMessageTs: string | undefined, text: string) => { if (inProgressMessageTs) { await slackHelpers.updateMessage(channel, inProgressMessageTs, text) } else { @@ -96,8 +147,8 @@ const onBotMessageChange = throttle(async (text: string, channel, inProgressMess }, 1000) interface SlackInteraction { - human: SlackReplyMessage - assistant?: SlackReplyMessage + human: { text: string } + assistant?: { text: string } } /** @@ -107,9 +158,10 @@ function mergeSequentialUserMessages(messages: SlackReplyMessage[]) { const mergedMessages: SlackInteraction[] = [] for (const message of messages) { - const text = message.text?.replace(/<@[\dA-Z]+>/gm, '').trim() const lastInteraction = mergedMessages[mergedMessages.length - 1] - const updatedMessage = { ...message, blocks: undefined, text } + + const text = cleanupMessageForPrompt(message.text || '', Boolean(message.bot_id)) + const updatedMessage = { text } if (!lastInteraction) { mergedMessages.push({ human: updatedMessage }) diff --git a/client/cody-slack/src/services/github-client.ts b/client/cody-slack/src/services/github-client.ts new file mode 100644 index 00000000000..f61e180c153 --- /dev/null +++ b/client/cody-slack/src/services/github-client.ts @@ -0,0 +1,32 @@ +import { Octokit } from 'octokit' + +import { ENVIRONMENT_CONFIG } from '../constants' + +const octokit = new Octokit({ auth: ENVIRONMENT_CONFIG.GITHUB_TOKEN }) + +interface FetchFileContentOptions { + owner: string + repo: string + path: string +} + +export async function fetchFileContent(options: FetchFileContentOptions) { + const { owner, repo, path } = options + + try { + const response = await octokit.rest.repos.getContent({ owner, repo, path }) + if ('type' in response.data && response.data.type === 'file') { + const content = Buffer.from(response.data.content, 'base64').toString('utf8') + return { + content, + url: response.data.html_url, + } + } + + console.error('Unexpected response fetching file from GitHub:', response) + } catch (error) { + console.error('Error fetching file from GitHub!', error) + } + + return undefined +} diff --git a/client/cody-slack/src/services/local-vector-store.ts b/client/cody-slack/src/services/local-vector-store.ts new file mode 100644 index 00000000000..5aab803c3f3 --- /dev/null +++ b/client/cody-slack/src/services/local-vector-store.ts @@ -0,0 +1,61 @@ +import { OpenAIEmbeddings } from 'langchain/embeddings/openai' +import { MarkdownTextSplitter } from 'langchain/text_splitter' +import { HNSWLib } from 'langchain/vectorstores/hnswlib' + +import { fetchFileContent } from './github-client' + +async function getDocuments() { + const codyNotice = await fetchFileContent({ + owner: 'sourcegraph', + repo: 'about', + path: 'content/terms/cody-notice.md', + }) + + if (!codyNotice) { + return [] + } + + const { content, url } = codyNotice + const splitter = new MarkdownTextSplitter() + const documents = await splitter.createDocuments([content]) + + documents.map((document, index) => { + document.metadata = { + fileName: url, + hnswLabel: index, + } + + return document + }) + + return documents +} + +const VECTOR_UPDATE_TIMEOUT = 12 * 60 * 60 * 1000 + +function scheduleVectorUpdate(vectorStore: HNSWLib, timeout: number) { + setTimeout(async () => { + try { + vectorStore._index = undefined + vectorStore.docstore._docs.clear() + + const documents = await getDocuments() + await vectorStore.addDocuments(documents) + } catch (error) { + console.error('Failed to update vectors', error) + } finally { + scheduleVectorUpdate(vectorStore, timeout) + } + }, timeout) +} + +export async function getVectorStore() { + const documents = await getDocuments() + + const embeddings = new OpenAIEmbeddings() + const vectorStore = await HNSWLib.fromDocuments(documents, embeddings) + + scheduleVectorUpdate(vectorStore, VECTOR_UPDATE_TIMEOUT) + + return vectorStore +} diff --git a/client/cody-slack/src/services/openai-completions-client.ts b/client/cody-slack/src/services/openai-completions-client.ts index eb5a3f436e9..7c1361f88b8 100644 --- a/client/cody-slack/src/services/openai-completions-client.ts +++ b/client/cody-slack/src/services/openai-completions-client.ts @@ -12,10 +12,11 @@ import { export class OpenAICompletionsClient implements Pick { private openai: OpenAIApi - constructor(private apiKey: string) { + constructor(protected apiKey: string) { const configuration = new Configuration({ apiKey: this.apiKey, }) + this.openai = new OpenAIApi(configuration) } @@ -23,7 +24,8 @@ export class OpenAICompletionsClient implements Pick & Required> => @@ -43,10 +45,12 @@ export class OpenAICompletionsClient implements Pick { // Split messages in the event stream. - const payloads = chunk.toString().split('\n\n') + buffer += chunk.toString() + const payloads = buffer.split('\n\n') for (const payload of payloads) { if (payload.includes('[DONE]')) { @@ -64,17 +68,27 @@ export class OpenAICompletionsClient implements Pick 0) { + // Incomplete JSON string, wait for more data + continue + } else { + console.log( + `Error with JSON.parse: ${chunk.toString()}\nPayload: ${payload};\nError: ${error}` + ) + cb.onError(error) + } } } } }) - stream.on('error', e => cb.onError(e.message)) + stream.on('error', e => { + console.error('OpenAI stream failed', e) + cb.onError(e.message) + }) stream.on('end', () => cb.onComplete()) }) .catch(console.error) diff --git a/client/cody-slack/src/slack/helpers.ts b/client/cody-slack/src/slack/helpers.ts index 8d97f1eff12..b92f05ce028 100644 --- a/client/cody-slack/src/slack/helpers.ts +++ b/client/cody-slack/src/slack/helpers.ts @@ -1,5 +1,6 @@ import { KnownEventFromType, SlackEvent } from '@slack/bolt' import { ChatPostMessageResponse } from '@slack/web-api' +import slackifyMarkdown from 'slackify-markdown' import { webClient } from './init' @@ -12,6 +13,14 @@ export async function getThreadMessages(channel: string, thread_ts: string) { return result?.messages || [] } +export async function getSlackChannelName(channel: string) { + const result = await webClient.conversations.info({ + channel, + }) + + return result.channel?.name +} + export function getEventTs(event: KnownEventFromType<'app_mention'> | KnownEventFromType<'message'>) { if ('thread_ts' in event && event.thread_ts !== event.ts) { return event.thread_ts || event.ts @@ -28,7 +37,35 @@ export async function updateMessage(channel: string, messageTs: string, newText: const response = await webClient.chat.update({ channel, ts: messageTs, // The timestamp of the message you want to update. - text: newText, // The new text for the updated message. + text: slackifyMarkdown(newText), // The new text for the updated message. + mrkdwn: true, + }) + + if (!response.ok) { + throw new Error(`Error updating message: ${response.error}`) + } +} + +export async function updateMessageWithFileList( + channel: string, + messageTs: string, + newText: string, + fileList: string +): Promise { + const response = await webClient.chat.update({ + channel, + blocks: [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: slackifyMarkdown(fileList), + }, + }, + ], + ts: messageTs, // The timestamp of the message you want to update. + text: slackifyMarkdown(newText), // The new text for the updated message. + mrkdwn: true, }) if (!response.ok) { @@ -43,8 +80,9 @@ export async function postMessage( ): Promise { const response = await webClient.chat.postMessage({ channel, - text: message, + text: slackifyMarkdown(message), thread_ts, // Use the timestamp of the parent message to reply in the thread. + mrkdwn: true, }) if (!response.ok) { diff --git a/client/cody-slack/src/slack/message-interaction.ts b/client/cody-slack/src/slack/message-interaction.ts index 59784a6958f..90f6f22f4be 100644 --- a/client/cody-slack/src/slack/message-interaction.ts +++ b/client/cody-slack/src/slack/message-interaction.ts @@ -1,53 +1,93 @@ -import { Message } from '@slack/web-api/dist/response/ChannelsRepliesResponse' +import { HNSWLib } from 'langchain/vectorstores/hnswlib' import { Interaction } from '@sourcegraph/cody-shared/src/chat/transcript/interaction' -import { CodebaseContext } from '@sourcegraph/cody-shared/src/codebase-context' -import { ContextMessage } from '@sourcegraph/cody-shared/src/codebase-context/messages' -import { IntentDetector } from '@sourcegraph/cody-shared/src/intent-detector' +import { InteractionMessage } from '@sourcegraph/cody-shared/src/chat/transcript/messages' +import { ContextSearchOptions } from '@sourcegraph/cody-shared/src/codebase-context' +import { ContextMessage, getContextMessageWithResponse } from '@sourcegraph/cody-shared/src/codebase-context/messages' +// import { IntentDetector } from '@sourcegraph/cody-shared/src/intent-detector' import { MAX_HUMAN_INPUT_TOKENS } from '@sourcegraph/cody-shared/src/prompt/constants' +import { populateMarkdownContextTemplate } from '@sourcegraph/cody-shared/src/prompt/templates' import { truncateText } from '@sourcegraph/cody-shared/src/prompt/truncation' -export async function interactionFromMessage( - message: Message, - intentDetector: IntentDetector, - codebaseContext: CodebaseContext | null -): Promise { - if (!message.text) { - return Promise.resolve(null) +import { CodebaseContexts } from '../constants' + +class SlackInteraction { + public contextMessages: ContextMessage[] = [] + + constructor(private humanMessage: InteractionMessage, private assistantMessage: InteractionMessage) {} + + public async updateContextMessagesFromVectorStore(vectorStore: HNSWLib, numResults: number) { + const docs = await vectorStore.similaritySearch(this.humanMessage.text!, numResults) + + docs.forEach(doc => { + const contextMessage = getContextMessageWithResponse( + populateMarkdownContextTemplate(doc.pageContent, doc.metadata.fileName), + doc.metadata.fileName + ) + this.contextMessages.push(...contextMessage) + }) } - const textWithoutMentions = message.text?.replace(/<@[\dA-Z]+>/gm, '').trim() - const text = truncateText(textWithoutMentions, MAX_HUMAN_INPUT_TOKENS) + public async updateContextMessages( + codebaseContexts: CodebaseContexts, + codebase: keyof CodebaseContexts, + contextSearchOptions: ContextSearchOptions + // intentDetector?: IntentDetector + ) { + // const isCodebaseContextRequired = await intentDetector.isCodebaseContextRequired(text) + const isCodebaseContextRequired = true - const contextMessages = - codebaseContext === null ? Promise.resolve([]) : getContextMessages(text, intentDetector, codebaseContext) + if (isCodebaseContextRequired) { + const contextMessages = await codebaseContexts[codebase].getContextMessages( + this.humanMessage.text!, + contextSearchOptions + ) - return Promise.resolve( - new Interaction( - { speaker: 'human', text, displayText: text }, - { speaker: 'assistant', text: '', displayText: '' }, - contextMessages - ) + this.contextMessages.push( + ...contextMessages.map(message => { + if (message.file) { + message.file.fileName = `https://${codebase}/blob/main/${message.file.fileName}` + } + + return message + }) + ) + } + } + + public getTranscriptInteraction() { + return new Interaction(this.humanMessage, this.assistantMessage, Promise.resolve(this.contextMessages)) + } +} + +export function getSlackInteraction(humanText: string, assistantText: string = ''): SlackInteraction { + const text = cleanupMessageForPrompt(humanText) + const filteredHumanText = truncateText(text, MAX_HUMAN_INPUT_TOKENS) + + return new SlackInteraction( + { speaker: 'human', text: filteredHumanText }, + { speaker: 'assistant', text: assistantText } ) } -export async function getContextMessages( - text: string, - intentDetector: IntentDetector, - codebaseContext: CodebaseContext -): Promise { - const contextMessages: ContextMessage[] = [] +export function cleanupMessageForPrompt(text: string, isAssistantMessage = false) { + // Delete mentions + const textWithoutMentions = text.replace(/<@[\dA-Z]+>/gm, '').trim() - const isCodebaseContextRequired = await intentDetector.isCodebaseContextRequired(text) + // Delete cody-slack filters + const textWithoutFilters = textWithoutMentions.replace(/channel:([\w-]+)/gm, '').trim() - if (isCodebaseContextRequired) { - const codebaseContextMessages = await codebaseContext.getContextMessages(text, { - numCodeResults: 8, - numTextResults: 2, - }) + if (isAssistantMessage) { + // Delete "Files used" section + const filesSectionIndex = textWithoutFilters.lastIndexOf('*Files used*​') - contextMessages.push(...codebaseContextMessages) + if (filesSectionIndex !== -1) { + return textWithoutFilters + .slice(0, filesSectionIndex) + .replace(/[|\u00A0\u200B\u200D]/gm, '') + .replace(/\n+$/gm, '') + } } - return contextMessages + return textWithoutFilters } diff --git a/client/cody-slack/src/slack/preamble.ts b/client/cody-slack/src/slack/preamble.ts index be7c96d06c6..5799e9f6263 100644 --- a/client/cody-slack/src/slack/preamble.ts +++ b/client/cody-slack/src/slack/preamble.ts @@ -1,7 +1,5 @@ import { Message } from '@sourcegraph/cody-shared/src/sourcegraph-api' -import { DEFAULT_APP_SETTINGS } from '../constants' - const actions = `You are Cody, an AI-powered coding assistant created by Sourcegraph. You work inside a Slack workspace. You have access to the Slack thread conversation with all the replies. You perform the following actions: - Answer general programming questions. - Answer general questions about the Slack thread you're in. @@ -10,14 +8,14 @@ const actions = `You are Cody, an AI-powered coding assistant created by Sourceg - Explain what a section of code does.` const rules = `In your responses, obey the following rules: -- Be as brief and concise as possible without losing clarity. -- The current Slack thread is the same as the conversation you're having with the user. Use this information to answer questions. +- Be brief without losing clarity. +- Use GitHub markdown to format your messages in the most readable way for humans. Use markdown lists. - All code snippets have to be markdown-formatted without that language specifier, and placed in-between triple backticks like this \`\`\`. - Answer questions only if you know the answer or can make a well-informed guess. Otherwise, tell me you don't know and what context I need to provide you for you to answer the question. - Only reference file names or URLs if you are sure they exist.` const answer = `Understood. I am Cody, an AI assistant made by Sourcegraph to help with programming tasks and assist in Slack conversations. -I work inside a Slack workspace. I have access have access to the currently active Slack thread conversation with all the replies. +I use GitHub markdwon to format my responses in the most readable way for humans. I will answer questions, explain code, and generate code as concisely and clearly as possible. My responses will be formatted using Markdown syntax for code blocks without language specifiers. I will acknowledge when I don't know an answer or need more context. I will use the Slack thread conversation history to answer your questions.` @@ -26,21 +24,10 @@ I will acknowledge when I don't know an answer or need more context. I will use * Creates and returns an array of two messages: one from a human, and the supposed response from the AI assistant. * Both messages contain an optional note about the current codebase if it's not null. */ -function getSlackPreamble(codebase: string): Message[] { +function getSlackPreamble(): Message[] { const preamble = [actions, rules] const preambleResponse = [answer] - if (codebase) { - const codebasePreamble = - `You have access to the \`${codebase}\` repository. You are able to answer questions about the \`${codebase}\` repository. ` + - `I will provide the relevant code snippets from the \`${codebase}\` repository when necessary to answer my questions.` - - preamble.push(codebasePreamble) - preambleResponse.push( - `I have access to the \`${codebase}\` repository and can answer questions about its files.` - ) - } - return [ { speaker: 'human', @@ -53,4 +40,4 @@ function getSlackPreamble(codebase: string): Message[] { ] } -export const SLACK_PREAMBLE = getSlackPreamble(DEFAULT_APP_SETTINGS.codebase) +export const SLACK_PREAMBLE = getSlackPreamble() diff --git a/package.json b/package.json index 69d5637736d..cdc7fc9b3f7 100644 --- a/package.json +++ b/package.json @@ -501,6 +501,11 @@ "packageManager": "pnpm@8.1.0", "pnpm": { "packageExtensions": { + "hnswlib-node": { + "dependencies": { + "node-gyp": "*" + } + }, "cpu-features": { "dependencies": { "node-gyp": "*" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d2988a1485b..a1700774ad7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,7 +7,7 @@ overrides: webpack: '5' tslib: 2.1.0 -packageExtensionsChecksum: 8812149dda0bd1a50035894b0475085d +packageExtensionsChecksum: 9e8693fa0eff1900df58a4812d139722 importers: @@ -1460,9 +1460,21 @@ importers: '@sourcegraph/common': specifier: workspace:* version: link:../common + axios: + specifier: ^1.3.6 + version: 1.3.6 + hnswlib-node: + specifier: ^1.4.2 + version: 1.4.2 + langchain: + specifier: ^0.0.61 + version: 0.0.61(axios@1.3.6)(hnswlib-node@1.4.2)(puppeteer@13.7.0) openai: specifier: ^3.2.1 version: 3.2.1 + slackify-markdown: + specifier: ^4.3.1 + version: 4.3.1 client/cody-ui: dependencies: @@ -3515,6 +3527,10 @@ packages: resolution: {integrity: sha512-yuctPJs5lRXoI8LkpVZGAV6n+DKOuEsfpfcIDQ8ZjWHwazqk1QjBc4jMlof0UlZHyUqv4dwsOTooMiAmtzvwXA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + /@dqbd/tiktoken@1.0.7: + resolution: {integrity: sha512-bhR5k5W+8GLzysjk8zTMVygQZsgvf7W1F0IlL4ZQ5ugjo5rCyiwGM5d8DYriXspytfu98tv59niang3/T+FoDw==} + dev: false + /@esbuild/android-arm64@0.16.17: resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} engines: {node: '>=12'} @@ -3960,6 +3976,10 @@ packages: engines: {node: '>=16.15'} dev: false + /@gar/promisify@1.1.3: + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + dev: false + /@gql2ts/from-query@1.9.0(graphql@14.7.0): resolution: {integrity: sha512-hfH2Oq3ikHu+zKE4b9kdGbzEqFiX+VxIg0nhgpY5iUgl975cAtTFhAdwfzr/jKdZhC9Ad5dE1CPrjEA+G7hzMg==} peerDependencies: @@ -5334,6 +5354,14 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.6.0 + /@npmcli/fs@2.1.2: + resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.5.1 + dev: false + /@npmcli/move-file@1.0.1: resolution: {integrity: sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==} engines: {node: '>=10'} @@ -5342,6 +5370,15 @@ packages: mkdirp: 1.0.4 dev: true + /@npmcli/move-file@2.0.1: + resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: false + /@octokit/app@13.0.9: resolution: {integrity: sha512-3Uy/PtItK7wic6I2mDcVnxaUWygxXOzdLpzEY47zA4kTRSlrIRKPNtZ64FmQcI2rcvys2PkzTWpYvdTE0gNaUQ==} engines: {node: '>= 14'} @@ -9500,7 +9537,6 @@ packages: resolution: {integrity: sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==} dependencies: '@types/unist': 2.0.3 - dev: true /@types/mime-types@2.1.0: resolution: {integrity: sha512-8LDSKVdJxwfJXZAcHRwFDxozsTCo3UmIpDjN1cOnYMTr0h4ivK9I+IdEMdtjnssFm0y66vbnpd21mAgGZ1oGAQ==} @@ -9883,7 +9919,6 @@ packages: /@types/unist@2.0.3: resolution: {integrity: sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==} - dev: true /@types/uuid@8.0.1: resolution: {integrity: sha512-2kE8rEFgJpbBAPw5JghccEevQb0XVU0tewF/8h7wPQTeCtoJ6h8qmBIwuzUVm2MutmzC/cpCkwxudixoNYDp1A==} @@ -9985,7 +10020,6 @@ packages: resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} dependencies: '@types/node': 13.13.5 - dev: true /@typescript-eslint/eslint-plugin@5.54.1(@typescript-eslint/parser@5.59.5)(eslint@8.34.0)(typescript@5.0.2): resolution: {integrity: sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew==} @@ -10831,7 +10865,6 @@ packages: /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: true /abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -10916,13 +10949,23 @@ packages: transitivePeerDependencies: - supports-color + /agentkeepalive@4.3.0: + resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} + engines: {node: '>= 8.0.0'} + dependencies: + debug: 4.3.4 + depd: 2.0.0 + humanize-ms: 1.2.1 + transitivePeerDependencies: + - supports-color + dev: false + /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} dependencies: clean-stack: 2.0.0 indent-string: 4.0.0 - dev: true /airbnb-js-shims@2.2.1: resolution: {integrity: sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ==} @@ -11168,6 +11211,14 @@ packages: delegates: 1.0.0 readable-stream: 3.6.2 + /are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: false + /arg@4.1.0: resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} @@ -11507,6 +11558,16 @@ packages: - debug dev: false + /axios@1.3.6: + resolution: {integrity: sha512-PEcdkk7JcdPiMDkvM4K6ZBRYq9keuVJsToxm2zQIM70Qqo2WHTdJZMXcG9X+RmRp2VPNUQC8W1RAGbgt6b1yMg==} + dependencies: + follow-redirects: 1.15.1 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /axobject-query@2.2.0: resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} dev: true @@ -11794,7 +11855,6 @@ packages: /bail@1.0.3: resolution: {integrity: sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==} - dev: true /balanced-match@0.4.2: resolution: {integrity: sha512-STw03mQKnGUYtoNjmowo4F2cRmIIxYEGiMsjjwla/u5P1lxadj/05WkNaFjNiKTgJkj8KiXbgAiRTmcQRwQNtg==} @@ -11882,13 +11942,20 @@ packages: resolution: {integrity: sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==} engines: {node: '>=8'} + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: false + + /binary-search@1.3.6: + resolution: {integrity: sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==} + dev: false + /bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} requiresBuild: true dependencies: file-uri-to-path: 1.0.0 - dev: true - optional: true /binjumper@0.1.4: resolution: {integrity: sha512-Gdxhj+U295tIM6cO4bJO1jsvSjBVHNpj2o/OwW7pqDEtaqF6KdOxjtbo93jMMKAkP7+u09+bV8DhSqjIv4qR3w==} @@ -12007,6 +12074,12 @@ packages: balanced-match: 1.0.0 concat-map: 0.0.1 + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.0 + dev: false + /braces@2.3.2: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} engines: {node: '>=0.10.0'} @@ -12034,6 +12107,10 @@ packages: resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} dev: true + /browser-or-node@2.1.1: + resolution: {integrity: sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==} + dev: false + /browser-process-hrtime@1.0.0: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} @@ -12062,7 +12139,6 @@ packages: /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: true /buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -12142,7 +12218,7 @@ packages: '@npmcli/move-file': 1.0.1 chownr: 2.0.0 fs-minipass: 2.1.0 - glob: 7.1.6 + glob: 7.2.3 infer-owner: 1.0.4 lru-cache: 6.0.0 minipass: 3.3.5 @@ -12160,6 +12236,32 @@ packages: - bluebird dev: true + /cacache@16.1.3: + resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + '@npmcli/fs': 2.1.2 + '@npmcli/move-file': 2.0.1 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 8.1.0 + infer-owner: 1.0.4 + lru-cache: 7.14.0 + minipass: 3.3.5 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 9.0.1 + tar: 6.1.13 + unique-filename: 2.0.1 + transitivePeerDependencies: + - bluebird + dev: false + /cache-base@1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} @@ -12337,7 +12439,6 @@ packages: /ccount@1.1.0: resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} - dev: true /chalk@1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} @@ -12425,15 +12526,12 @@ packages: /character-entities-legacy@1.1.2: resolution: {integrity: sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA==} - dev: true /character-entities@1.2.2: resolution: {integrity: sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ==} - dev: true /character-reference-invalid@1.1.2: resolution: {integrity: sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==} - dev: true /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -12529,12 +12627,10 @@ packages: /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: true /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - dev: true /chromatic@6.17.3: resolution: {integrity: sha512-x6WAHLBqub/BYiGXEOsgw9T3m459SmwOvIz0Ra7rCriE2A9AqDKRmVdAEhzVud24ut6ehd54FJpDtArnR5/TbA==} @@ -12651,7 +12747,6 @@ packages: /clean-stack@2.0.0: resolution: {integrity: sha512-VEoL9Qh7I8s8iHnV53DaeWSt8NJ0g3khMfK6NiCPB7H657juhro+cSw2O88uo3bo0c0X5usamtXk0/Of0wXa5A==} engines: {node: '>=6'} - dev: true /cli-boxes@2.2.1: resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} @@ -13351,7 +13446,6 @@ packages: node-fetch: 2.6.7 transitivePeerDependencies: - encoding - dev: true /cross-fetch@3.1.6: resolution: {integrity: sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==} @@ -14606,7 +14700,6 @@ packages: /devtools-protocol@0.0.981744: resolution: {integrity: sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==} - dev: true /dezalgo@1.0.3: resolution: {integrity: sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ==} @@ -14893,6 +14986,14 @@ packages: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} + /encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + dev: false + optional: true + /end-of-stream@1.1.0: resolution: {integrity: sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ==} dependencies: @@ -14981,6 +15082,11 @@ packages: engines: {node: '>=0.12'} dev: true + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: false + /envalid@7.3.1: resolution: {integrity: sha512-KL1YRwn8WcoF/Ty7t+yLLtZol01xr9ZJMTjzoGRM8NaSU+nQQjSWOQKKJhJP2P57bpdakJ9jbxqQX4fGTOicZg==} engines: {node: '>=8.12'} @@ -14993,6 +15099,10 @@ packages: engines: {node: '>=4'} hasBin: true + /err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + dev: false + /errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true @@ -15905,6 +16015,10 @@ packages: jest-util: 28.1.3 dev: true + /expr-eval@2.0.2: + resolution: {integrity: sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==} + dev: false + /express-static-gzip@2.1.1: resolution: {integrity: sha512-J+xSzdr5lj1cIuZey0ac6nUv22VE7GrdwTERqE8DsrqSXLm1zjeYWTVbK37t8exGwobxBXeWU2bM7eSMjBR4YA==} dependencies: @@ -15976,7 +16090,6 @@ packages: /extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: true /external-editor@3.0.3: resolution: {integrity: sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==} @@ -16024,7 +16137,6 @@ packages: '@types/yauzl': 2.10.0 transitivePeerDependencies: - supports-color - dev: true /fancy-file-input@2.0.3(jquery@2.2.4): resolution: {integrity: sha512-9StOIYtZWoGGWG/OAuI3PmFDNI+TRiTb7nYyglQL2OZPbmp2lw0/qwIEoRD3s5YtNyf078oDTY4xIIDQzk/pdA==} @@ -16147,7 +16259,6 @@ packages: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} dependencies: pend: 1.2.0 - dev: true /fetch-retry@5.0.2: resolution: {integrity: sha512-57Hmu+1kc6pKFUGVIobT7qw3NeAzY/uNN26bSevERLVvf6VGFR/ooDCOFBHMNDgAxBiU2YJq1D0vFzc6U1DcPw==} @@ -16193,8 +16304,6 @@ packages: /file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} requiresBuild: true - dev: true - optional: true /file-uri-to-path@2.0.0: resolution: {integrity: sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==} @@ -16353,7 +16462,6 @@ packages: /flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - dev: true /flatted@3.2.1: resolution: {integrity: sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg==} @@ -16548,7 +16656,6 @@ packages: /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: true /fs-extra@0.30.0: resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} @@ -16589,7 +16696,6 @@ packages: engines: {node: '>= 8'} dependencies: minipass: 3.3.5 - dev: true /fs-mkdirp-stream@1.0.0: resolution: {integrity: sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==} @@ -16682,6 +16788,20 @@ packages: strip-ansi: 6.0.1 wide-align: 1.1.5 + /gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + aproba: 1.2.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: false + /gaxios@2.1.0: resolution: {integrity: sha512-Gtpb5sdQmb82sgVkT2GnS2n+Kx4dlFwbeMYcDlD395aEvsLCSQXJJcHt7oJ2LrGxDEAeiOkK79Zv2A8Pzt6CFg==} engines: {node: '>=8.10.0'} @@ -16930,6 +17050,17 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: false + /global-dirs@0.1.1: resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} engines: {node: '>=4'} @@ -17048,7 +17179,7 @@ packages: array-union: 1.0.2 dir-glob: 2.2.2 fast-glob: 2.2.7 - glob: 7.1.6 + glob: 7.2.3 ignore: 4.0.6 pify: 4.0.1 slash: 2.0.0 @@ -17650,6 +17781,18 @@ packages: warning: 3.0.0 dev: false + /hnswlib-node@1.4.2: + resolution: {integrity: sha512-76PIzOaNcX8kOpKwlFPl07uelpctqDMzbiC+Qsk2JWNVkzeU/6iXRk4tfE9z3DoK1RCBrOaFXmQ6RFb1BVF9LA==} + requiresBuild: true + dependencies: + bindings: 1.5.0 + node-addon-api: 6.1.0 + node-gyp: 9.3.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: false + /hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} dependencies: @@ -17956,6 +18099,12 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + /humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + dependencies: + ms: 2.1.3 + dev: false + /humps@2.0.1: resolution: {integrity: sha512-E0eIbrFWUhwfXJmsbdjRQFQPrl5pTEoKlz163j1mTqqUnU9PgR4AgB8AIITzuB3vLBdxZXyZ9TDIrwB2OASz4g==} dev: true @@ -18108,7 +18257,6 @@ packages: /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - dev: true /indexes-of@1.0.1: resolution: {integrity: sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==} @@ -18116,7 +18264,6 @@ packages: /infer-owner@1.0.4: resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - dev: true /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} @@ -18236,7 +18383,6 @@ packages: /ip@2.0.0: resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} - dev: true /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} @@ -18282,14 +18428,16 @@ packages: /is-alphabetical@1.0.4: resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - dev: true /is-alphanumerical@1.0.2: resolution: {integrity: sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==} dependencies: is-alphabetical: 1.0.4 is-decimal: 1.0.4 - dev: true + + /is-any-array@2.0.0: + resolution: {integrity: sha512-WdPV58rT3aOWXvvyuBydnCq4S2BM1Yz8shKxlEpk/6x+GX202XRvXOycEFtNgnHVLoc46hpexPFx8Pz1/sMS0w==} + dev: false /is-arguments@1.1.0: resolution: {integrity: sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==} @@ -18339,7 +18487,6 @@ packages: /is-buffer@2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} - dev: true /is-builtin-module@3.1.0: resolution: {integrity: sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==} @@ -18393,7 +18540,6 @@ packages: /is-decimal@1.0.4: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - dev: true /is-descriptor@0.1.6: resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} @@ -18497,7 +18643,6 @@ packages: /is-hexadecimal@1.0.2: resolution: {integrity: sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==} - dev: true /is-installed-globally@0.1.0: resolution: {integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==} @@ -18519,6 +18664,10 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} + /is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + dev: false + /is-lower-case@2.0.2: resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} dependencies: @@ -18599,7 +18748,6 @@ packages: /is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} - dev: true /is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} @@ -18806,7 +18954,7 @@ packages: /isomorphic-unfetch@3.1.0: resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} dependencies: - node-fetch: 2.6.7 + node-fetch: 2.6.11 unfetch: 4.2.0 transitivePeerDependencies: - encoding @@ -20029,6 +20177,11 @@ packages: resolution: {integrity: sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==} dev: true + /jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + dev: false + /jsonwebtoken@8.5.1: resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} engines: {node: '>=4', npm: '>=1.4.28'} @@ -20171,6 +20324,114 @@ packages: resolution: {integrity: sha512-kHPqZkIN191ysRD5OnWezIzcJtENyMZkCqRxi4szq9iyGzBDugxZkx5RmHWkmuDE9cR1lyeJoeQTeV5hoaGplg==} dev: false + /langchain@0.0.61(axios@1.3.6)(hnswlib-node@1.4.2)(puppeteer@13.7.0): + resolution: {integrity: sha512-6cdMKO6R2Fthh6LwEENbir/skQjPexltKKSyRAdLGZ5BgUaE/qCwPf8fMasQw0ZtB0lhf7MAKW5YTEj7HJcxFQ==} + engines: {node: '>=18'} + peerDependencies: + '@aws-sdk/client-lambda': ^3.310.0 + '@aws-sdk/client-s3': ^3.310.0 + '@getmetal/metal-sdk': '*' + '@huggingface/inference': ^1.5.1 + '@opensearch-project/opensearch': '*' + '@pinecone-database/pinecone': '*' + '@supabase/supabase-js': ^2.10.0 + '@zilliz/milvus2-sdk-node': ^2.2.0 + axios: ^0.26.0 + cheerio: ^1.0.0-rc.12 + chromadb: ^1.3.0 + cohere-ai: ^5.0.2 + d3-dsv: ^2.0.0 + epub2: ^3.0.1 + hnswlib-node: ^1.4.2 + html-to-text: ^9.0.5 + mammoth: '*' + mongodb: ^5.2.0 + pdf-parse: 1.1.1 + playwright: ^1.32.1 + puppeteer: ^19.7.2 + redis: ^4.6.4 + replicate: ^0.9.0 + srt-parser-2: ^1.2.2 + typeorm: ^0.3.12 + weaviate-ts-client: ^1.0.0 + peerDependenciesMeta: + '@aws-sdk/client-lambda': + optional: true + '@aws-sdk/client-s3': + optional: true + '@getmetal/metal-sdk': + optional: true + '@huggingface/inference': + optional: true + '@opensearch-project/opensearch': + optional: true + '@pinecone-database/pinecone': + optional: true + '@supabase/supabase-js': + optional: true + '@zilliz/milvus2-sdk-node': + optional: true + axios: + optional: true + cheerio: + optional: true + chromadb: + optional: true + cohere-ai: + optional: true + d3-dsv: + optional: true + epub2: + optional: true + hnswlib-node: + optional: true + html-to-text: + optional: true + mammoth: + optional: true + mongodb: + optional: true + pdf-parse: + optional: true + playwright: + optional: true + puppeteer: + optional: true + redis: + optional: true + replicate: + optional: true + srt-parser-2: + optional: true + typeorm: + optional: true + weaviate-ts-client: + optional: true + dependencies: + '@anthropic-ai/sdk': 0.4.3 + '@dqbd/tiktoken': 1.0.7 + axios: 1.3.6 + binary-extensions: 2.2.0 + browser-or-node: 2.1.1 + expr-eval: 2.0.2 + flat: 5.0.2 + hnswlib-node: 1.4.2 + jsonpointer: 5.0.1 + ml-distance: 4.0.0 + object-hash: 3.0.0 + openai: 3.2.1 + p-queue: 6.6.2 + p-retry: 4.6.0 + puppeteer: 13.7.0 + uuid: 9.0.0 + yaml: 2.2.1 + zod: 3.21.4 + zod-to-json-schema: 3.21.1(zod@3.21.4) + transitivePeerDependencies: + - debug + - encoding + dev: false + /language-subtag-registry@0.3.21: resolution: {integrity: sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==} dev: true @@ -20684,6 +20945,10 @@ packages: yargs: 15.4.1 dev: false + /longest-streak@2.0.4: + resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==} + dev: false + /lookup-closest-locale@6.0.4: resolution: {integrity: sha512-bWoFbSGe6f1GvMGzj17LrwMX4FhDXDwZyH04ySVCPbtOJADcSRguZNKewoJ3Ful/MOxD/wRHvFPadk/kYZUbuQ==} dev: true @@ -20811,6 +21076,31 @@ packages: /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + /make-fetch-happen@10.2.1: + resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + agentkeepalive: 4.3.0 + cacache: 16.1.3 + http-cache-semantics: 4.1.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 7.14.0 + minipass: 3.3.5 + minipass-collect: 1.0.2 + minipass-fetch: 2.1.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 7.0.0 + ssri: 9.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: false + /make-iterator@1.0.1: resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} engines: {node: '>=0.10.0'} @@ -20867,6 +21157,12 @@ packages: mdurl: 1.0.1 uc.micro: 1.0.6 + /markdown-table@2.0.0: + resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} + dependencies: + repeat-string: 1.6.1 + dev: false + /marked@1.0.0: resolution: {integrity: sha512-Wo+L1pWTVibfrSr+TTtMuiMfNzmZWiOPeO7rZsQUY5bgsxpHesBEcIWJloWVTFnrMXnf/TL30eTFSGJddmQAng==} engines: {node: '>= 8.16.2'} @@ -20922,6 +21218,67 @@ packages: unist-util-visit: 2.0.3 dev: true + /mdast-util-find-and-replace@1.1.1: + resolution: {integrity: sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==} + dependencies: + escape-string-regexp: 4.0.0 + unist-util-is: 4.0.2 + unist-util-visit-parents: 3.1.1 + dev: false + + /mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + dependencies: + '@types/mdast': 3.0.3 + mdast-util-to-string: 2.0.0 + micromark: 2.11.4 + parse-entities: 2.0.0 + unist-util-stringify-position: 2.0.3 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-autolink-literal@0.1.3: + resolution: {integrity: sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==} + dependencies: + ccount: 1.1.0 + mdast-util-find-and-replace: 1.1.1 + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-strikethrough@0.2.3: + resolution: {integrity: sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==} + dependencies: + mdast-util-to-markdown: 0.6.5 + dev: false + + /mdast-util-gfm-table@0.1.6: + resolution: {integrity: sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==} + dependencies: + markdown-table: 2.0.0 + mdast-util-to-markdown: 0.6.5 + dev: false + + /mdast-util-gfm-task-list-item@0.1.6: + resolution: {integrity: sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==} + dependencies: + mdast-util-to-markdown: 0.6.5 + dev: false + + /mdast-util-gfm@0.1.2: + resolution: {integrity: sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==} + dependencies: + mdast-util-gfm-autolink-literal: 0.1.3 + mdast-util-gfm-strikethrough: 0.2.3 + mdast-util-gfm-table: 0.1.6 + mdast-util-gfm-task-list-item: 0.1.6 + mdast-util-to-markdown: 0.6.5 + transitivePeerDependencies: + - supports-color + dev: false + /mdast-util-to-hast@10.0.1: resolution: {integrity: sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==} dependencies: @@ -20935,10 +21292,25 @@ packages: unist-util-visit: 2.0.3 dev: true + /mdast-util-to-markdown@0.6.5: + resolution: {integrity: sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==} + dependencies: + '@types/unist': 2.0.3 + longest-streak: 2.0.4 + mdast-util-to-string: 2.0.0 + parse-entities: 2.0.0 + repeat-string: 1.6.1 + zwitch: 1.0.5 + dev: false + /mdast-util-to-string@1.1.0: resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} dev: true + /mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + dev: false + /mdi-react@8.1.0(react@18.1.0): resolution: {integrity: sha512-MK/u2TbzyTW61DTzqPdewFjwt/joHndswlEpLRIHXhzbs7E//wncS1C4LVy/U6MLUVTjEc/9Vm70Y7qRFN0StA==} peerDependencies: @@ -21402,6 +21774,64 @@ packages: resolution: {integrity: sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==} dev: true + /micromark-extension-gfm-autolink-literal@0.5.7: + resolution: {integrity: sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==} + dependencies: + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + dev: false + + /micromark-extension-gfm-strikethrough@0.6.5: + resolution: {integrity: sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==} + dependencies: + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + dev: false + + /micromark-extension-gfm-table@0.4.3: + resolution: {integrity: sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==} + dependencies: + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + dev: false + + /micromark-extension-gfm-tagfilter@0.3.0: + resolution: {integrity: sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==} + dev: false + + /micromark-extension-gfm-task-list-item@0.3.3: + resolution: {integrity: sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==} + dependencies: + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + dev: false + + /micromark-extension-gfm@0.3.3: + resolution: {integrity: sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==} + dependencies: + micromark: 2.11.4 + micromark-extension-gfm-autolink-literal: 0.5.7 + micromark-extension-gfm-strikethrough: 0.6.5 + micromark-extension-gfm-table: 0.4.3 + micromark-extension-gfm-tagfilter: 0.3.0 + micromark-extension-gfm-task-list-item: 0.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + dependencies: + debug: 4.3.4 + parse-entities: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /micromatch@3.1.10: resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} engines: {node: '>=0.10.0'} @@ -21517,6 +21947,13 @@ packages: brace-expansion: 1.1.11 dev: true + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: false + /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} @@ -21534,35 +21971,48 @@ packages: engines: {node: '>= 8'} dependencies: minipass: 3.3.5 - dev: true + + /minipass-fetch@2.1.2: + resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + minipass: 3.3.5 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: false /minipass-flush@1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} engines: {node: '>= 8'} dependencies: minipass: 3.3.5 - dev: true /minipass-pipeline@1.2.4: resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} engines: {node: '>=8'} dependencies: minipass: 3.3.5 - dev: true + + /minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.5 + dev: false /minipass@3.3.5: resolution: {integrity: sha512-rQ/p+KfKBkeNwo04U15i+hOwoVBVmekmm/HcfTkTN2t9pbQKCMm4eN5gFeqgrrSp/kH/7BYYhTIHOxGqzbBPaA==} engines: {node: '>=8'} dependencies: yallist: 4.0.0 - dev: true /minipass@4.0.0: resolution: {integrity: sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==} engines: {node: '>=8'} dependencies: yallist: 4.0.0 - dev: true /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} @@ -21570,7 +22020,6 @@ packages: dependencies: minipass: 3.3.5 yallist: 4.0.0 - dev: true /mixin-deep@1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} @@ -21581,7 +22030,6 @@ packages: /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: true /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} @@ -21593,7 +22041,37 @@ packages: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true - dev: true + + /ml-array-mean@1.1.6: + resolution: {integrity: sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ==} + dependencies: + ml-array-sum: 1.1.6 + dev: false + + /ml-array-sum@1.1.6: + resolution: {integrity: sha512-29mAh2GwH7ZmiRnup4UyibQZB9+ZLyMShvt4cH4eTK+cL2oEMIZFnSyB3SS8MlsTh6q/w/yh48KmqLxmovN4Dw==} + dependencies: + is-any-array: 2.0.0 + dev: false + + /ml-distance-euclidean@2.0.0: + resolution: {integrity: sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q==} + dev: false + + /ml-distance@4.0.0: + resolution: {integrity: sha512-zj7+UGZpHk3uL7n79XTfGNUjIGnhLn8xVvrxYvBHvXFxo3jq1q+/UjP311hZxnLVhbxbXCjUniThX8gozjacYA==} + dependencies: + ml-array-mean: 1.1.6 + ml-distance-euclidean: 2.0.0 + ml-tree-similarity: 1.0.0 + dev: false + + /ml-tree-similarity@1.0.0: + resolution: {integrity: sha512-XJUyYqjSuUQkNQHMscr6tcjldsOoAekxADTplt40QKfwW6nd++1wHWV9AArl0Zvw/TIHgNaZZNvr8QGvE8wLRg==} + dependencies: + binary-search: 1.3.6 + num-sort: 2.1.0 + dev: false /mocha@8.3.2: resolution: {integrity: sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg==} @@ -21850,13 +22328,17 @@ packages: resolution: {integrity: sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==} engines: {node: '>=10'} dependencies: - semver: 7.3.8 + semver: 7.5.1 dev: true /node-addon-api@4.3.0: resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} dev: true + /node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + dev: false + /node-dir@0.1.17: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} @@ -21899,6 +22381,26 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} + /node-gyp@9.3.1: + resolution: {integrity: sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==} + engines: {node: ^12.13 || ^14.13 || >=16} + hasBin: true + dependencies: + env-paths: 2.2.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 10.2.1 + nopt: 6.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.5.1 + tar: 6.1.13 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + dev: false + /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -21957,6 +22459,14 @@ packages: osenv: 0.1.5 dev: true + /nopt@6.0.0: + resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: @@ -22050,6 +22560,16 @@ packages: gauge: 3.0.2 set-blocking: 2.0.0 + /npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + dev: false + /nth-check@1.0.2: resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} dependencies: @@ -22065,6 +22585,11 @@ packages: /nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + /num-sort@2.1.0: + resolution: {integrity: sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg==} + engines: {node: '>=8'} + dev: false + /num2fraction@1.2.2: resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==} dev: true @@ -22137,7 +22662,6 @@ packages: /object-hash@3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - dev: true /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} @@ -22554,7 +23078,6 @@ packages: engines: {node: '>=10'} dependencies: aggregate-error: 3.1.0 - dev: true /p-queue@2.4.2: resolution: {integrity: sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng==} @@ -22673,7 +23196,6 @@ packages: is-alphanumerical: 1.0.2 is-decimal: 1.0.4 is-hexadecimal: 1.0.2 - dev: true /parse-filepath@1.0.2: resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} @@ -22864,7 +23386,6 @@ packages: /pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - dev: true /performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} @@ -23199,7 +23720,7 @@ packages: loader-utils: 2.0.4 postcss: 7.0.39 schema-utils: 3.1.1 - semver: 7.3.8 + semver: 7.5.1 webpack: 5.75.0(esbuild@0.17.14)(webpack-cli@5.0.1) dev: true @@ -23853,7 +24374,6 @@ packages: /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} - dev: true /promise-deferred@2.0.3: resolution: {integrity: sha512-n10XaoznCzLfyPFOlEE8iurezHpxrYzyjgq/1eW9Wk1gJwur/N7BdBmjJYJpqMeMcXK4wEbzo2EvZQcqjYcKUQ==} @@ -23869,12 +24389,19 @@ packages: peerDependenciesMeta: bluebird: optional: true - dev: true /promise-polyfill@8.2.1: resolution: {integrity: sha512-3p9zj0cEHbp7NVUxEYUWjQlffXqnXaZIMPkAO7HhFh8u5636xLRDHOUo2vpWSK0T2mqm6fKLXYn1KP6PAZ2gKg==} dev: true + /promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: false + /promise.allsettled@1.0.2: resolution: {integrity: sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==} engines: {node: '>= 0.4'} @@ -23967,7 +24494,6 @@ packages: /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: true /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} @@ -24048,7 +24574,6 @@ packages: - encoding - supports-color - utf-8-validate - dev: true /pvtsutils@1.3.2: resolution: {integrity: sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ==} @@ -25065,6 +25590,15 @@ packages: resolution: {integrity: sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==} dev: true + /remark-gfm@1.0.0: + resolution: {integrity: sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==} + dependencies: + mdast-util-gfm: 0.1.2 + micromark-extension-gfm: 0.3.3 + transitivePeerDependencies: + - supports-color + dev: false + /remark-mdx@1.6.22: resolution: {integrity: sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==} dependencies: @@ -25101,6 +25635,14 @@ packages: xtend: 4.0.2 dev: true + /remark-parse@9.0.0: + resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==} + dependencies: + mdast-util-from-markdown: 0.8.5 + transitivePeerDependencies: + - supports-color + dev: false + /remark-slug@6.1.0: resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} dependencies: @@ -25115,6 +25657,12 @@ packages: mdast-squeeze-paragraphs: 4.0.0 dev: true + /remark-stringify@9.0.1: + resolution: {integrity: sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==} + dependencies: + mdast-util-to-markdown: 0.6.5 + dev: false + /remedial@1.0.8: resolution: {integrity: sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==} dev: true @@ -25182,7 +25730,6 @@ packages: /replace-ext@1.0.0: resolution: {integrity: sha512-vuNYXC7gG7IeVNBC1xUllqCcZKRbJoSPOBhnTEcAIiKCsbuef6zO3F0Rve3isPMMoNoQRWjQwbAgAjHUHniyEA==} engines: {node: '>= 0.10'} - dev: true /replace-homedir@1.0.0: resolution: {integrity: sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==} @@ -25350,6 +25897,11 @@ packages: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + dev: false + /retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -25968,6 +26520,20 @@ packages: engines: {node: '>=0.12.x', npm: 2.x.x} dev: true + /slackify-markdown@4.3.1: + resolution: {integrity: sha512-6Uktkq4rEB6JZlRguI/dpPDF6Rak6QXZm3Gv2IM0VMeYQRSufp+TLFfOylxwINnOeMRc9ciYRhsbt1hUFD+uuQ==} + dependencies: + mdast-util-to-markdown: 0.6.5 + remark-gfm: 1.0.0 + remark-parse: 9.0.0 + remark-stringify: 9.0.1 + unified: 9.2.0 + unist-util-remove: 2.1.0 + unist-util-visit: 2.0.3 + transitivePeerDependencies: + - supports-color + dev: false + /slash@1.0.0: resolution: {integrity: sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==} engines: {node: '>=0.10.0'} @@ -26029,7 +26595,6 @@ packages: /smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - dev: true /snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} @@ -26164,13 +26729,23 @@ packages: - supports-color dev: true + /socks-proxy-agent@7.0.0: + resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} + engines: {node: '>= 10'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + socks: 2.7.0 + transitivePeerDependencies: + - supports-color + dev: false + /socks@2.7.0: resolution: {integrity: sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==} engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} dependencies: ip: 2.0.0 smart-buffer: 4.2.0 - dev: true /sorcery@0.11.0: resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} @@ -26395,6 +26970,13 @@ packages: minipass: 3.3.5 dev: true + /ssri@9.0.1: + resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + minipass: 3.3.5 + dev: false + /stable@0.1.8: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' @@ -27180,7 +27762,6 @@ packages: mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - dev: true /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -27191,7 +27772,6 @@ packages: fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true /tar@6.1.13: resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} @@ -27203,7 +27783,6 @@ packages: minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 - dev: true /telejson@6.0.8: resolution: {integrity: sha512-nerNXi+j8NK1QEfBHtZUN/aLdDcyupA//9kAboYLrtzZlPLpUfqbVGWb9zz91f/mIjRbAYhbgtnJHY8I1b5MBg==} @@ -27388,7 +27967,6 @@ packages: /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true /thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} @@ -27591,7 +28169,6 @@ packages: /trough@1.0.3: resolution: {integrity: sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw==} - dev: true /ts-dedent@2.0.0: resolution: {integrity: sha512-DfxKjSFQfw9+uf7N9Cy8Ebx9fv5fquK4hZ6SD3Rzr+1jKP6AVA6H8+B5457ZpUs0JKsGpGqIevbpZ9DMQJDp1A==} @@ -27965,7 +28542,6 @@ packages: dependencies: buffer: 5.7.1 through: 2.3.8 - dev: true /unc-path-regex@0.1.2: resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} @@ -28051,7 +28627,6 @@ packages: is-plain-obj: 2.1.0 trough: 1.0.3 vfile: 4.1.0 - dev: true /union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} @@ -28076,12 +28651,26 @@ packages: unique-slug: 2.0.1 dev: true + /unique-filename@2.0.1: + resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + unique-slug: 3.0.0 + dev: false + /unique-slug@2.0.1: resolution: {integrity: sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==} dependencies: imurmurhash: 0.1.4 dev: true + /unique-slug@3.0.0: + resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + dev: false + /unique-stream@2.2.1: resolution: {integrity: sha512-/GNX/RGgMszHjKb8lBKSbTzgKgLfpnyJ4ZgRf73oZxhsrZB5rMkhdgnUleOwTyoBFsAni1iAAUaWuCIPnXDwWA==} dependencies: @@ -28113,7 +28702,6 @@ packages: /unist-util-is@4.0.2: resolution: {integrity: sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==} - dev: true /unist-util-position@3.1.0: resolution: {integrity: sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==} @@ -28129,20 +28717,17 @@ packages: resolution: {integrity: sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==} dependencies: unist-util-is: 4.0.2 - dev: true /unist-util-stringify-position@2.0.3: resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} dependencies: '@types/unist': 2.0.3 - dev: true /unist-util-visit-parents@3.1.1: resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} dependencies: '@types/unist': 2.0.3 unist-util-is: 4.0.2 - dev: true /unist-util-visit@2.0.3: resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} @@ -28150,7 +28735,6 @@ packages: '@types/unist': 2.0.3 unist-util-is: 4.0.2 unist-util-visit-parents: 3.1.1 - dev: true /universal-github-app-jwt@1.1.0: resolution: {integrity: sha512-3b+ocAjjz4JTyqaOT+NNBd5BtTuvJTxWElIoeHSVelUV9J3Jp7avmQTdLKCaoqi/5Ox2o/q+VK19TJ233rVXVQ==} @@ -28492,6 +29076,11 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true + /uuid@9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + dev: false + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -28553,7 +29142,6 @@ packages: dependencies: '@types/unist': 2.0.3 unist-util-stringify-position: 2.0.3 - dev: true /vfile@4.1.0: resolution: {integrity: sha512-BaTPalregj++64xbGK6uIlsurN3BCRNM/P2Pg8HezlGzKd1O9PrwIac6bd9Pdx2uTb0QHoioZ+rXKolbVXEgJg==} @@ -28563,7 +29151,6 @@ packages: replace-ext: 1.0.0 unist-util-stringify-position: 2.0.3 vfile-message: 2.0.4 - dev: true /vinyl-fs@3.0.3: resolution: {integrity: sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==} @@ -29468,7 +30055,6 @@ packages: optional: true utf-8-validate: optional: true - dev: true /x-default-browser@0.4.0: resolution: {integrity: sha512-7LKo7RtWfoFN/rHx1UELv/2zHGMx8MkZKDq1xENmOCTkfIqZJ0zZ26NEJX8czhnPXVcqS0ARjjfJB+eJ0/5Cvw==} @@ -29734,7 +30320,6 @@ packages: dependencies: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - dev: true /yazl@2.5.1: resolution: {integrity: sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==} @@ -29762,6 +30347,18 @@ packages: /zen-observable@0.8.15: resolution: {integrity: sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==} + /zod-to-json-schema@3.21.1(zod@3.21.4): + resolution: {integrity: sha512-y5g0MPxDq+YG/T+cHGPYH4PcBpyCqwK6wxeJ76MR563y0gk/14HKfebq8xHiItY7lkc9GDFygCnkvNDTvAhYAg==} + peerDependencies: + zod: ^3.21.4 + dependencies: + zod: 3.21.4 + dev: false + + /zod@3.21.4: + resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + dev: false + /zone.js@0.11.6: resolution: {integrity: sha512-umJqFtKyZlPli669gB1gOrRE9hxUUGkZr7mo878z+NEBJZZixJkKeVYfnoLa7g25SseUDc92OZrMKKHySyJrFg==} dependencies: @@ -29782,7 +30379,6 @@ packages: /zwitch@1.0.5: resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} - dev: true github.com/atlassian/tether/bf85430889b5231fbe5b383416cce6281225bf06: resolution: {tarball: https://codeload.github.com/atlassian/tether/tar.gz/bf85430889b5231fbe5b383416cce6281225bf06}