diff --git a/dotnet/autoShell/dotnet/autoShell/CoreAudioInterop.cs b/dotnet/autoShell/CoreAudioInterop.cs similarity index 100% rename from dotnet/autoShell/dotnet/autoShell/CoreAudioInterop.cs rename to dotnet/autoShell/CoreAudioInterop.cs diff --git a/ts/examples/chat/package.json b/ts/examples/chat/package.json index 70abd255d1..06304ebb51 100644 --- a/ts/examples/chat/package.json +++ b/ts/examples/chat/package.json @@ -41,6 +41,7 @@ "knowpro-test": "workspace:*", "memory-providers": "workspace:*", "memory-storage": "workspace:*", + "telemetry": "workspace:*", "textpro": "workspace:*", "typeagent": "workspace:*", "typechat": "^0.1.1", diff --git a/ts/examples/chat/src/codeChat/codeChat.ts b/ts/examples/chat/src/codeChat/codeChat.ts index 86953a3ea4..52af1e509e 100644 --- a/ts/examples/chat/src/codeChat/codeChat.ts +++ b/ts/examples/chat/src/codeChat/codeChat.ts @@ -38,6 +38,9 @@ import { sampleFiles, } from "./common.js"; import { createCommandTransformer } from "./commandTransformer.js"; +import { createPromptLogger } from "telemetry"; + +const promptLogger = createPromptLogger(); export async function runCodeChat(): Promise { const model = openai.createChatModelDefault("codeChat"); @@ -381,7 +384,12 @@ export async function runCodeChat(): Promise { async function regex(args: string[], io: InteractiveIo): Promise { if (args.length > 0) { const prompt = `Return a Typescript regular expression for the following:\n ${args.join(" ")}`; - const result = await codeReviewer.model.complete(prompt); + const result = await codeReviewer.model.complete( + prompt, + undefined, + undefined, + promptLogger.logModelRequest, + ); if (result.success) { io.writer.writeLine(result.data); } else { diff --git a/ts/examples/playground/package.json b/ts/examples/playground/package.json index 81868c7851..e5233eb5ce 100644 --- a/ts/examples/playground/package.json +++ b/ts/examples/playground/package.json @@ -25,6 +25,7 @@ "copyfiles": "^2.4.1", "dotenv": "^16.3.1", "interactive-app": "workspace:*", + "telemetry": "workspace:*", "typeagent": "workspace:*", "typechat": "^0.1.1", "typescript": "~5.4.5" diff --git a/ts/examples/playground/src/main.ts b/ts/examples/playground/src/main.ts index 1acdb919c0..97f4e03a30 100644 --- a/ts/examples/playground/src/main.ts +++ b/ts/examples/playground/src/main.ts @@ -25,6 +25,9 @@ import { } from "typeagent"; import { PromptSection } from "typechat"; import * as fs from "fs"; +import { createPromptLogger } from "telemetry"; + +const promptLogger = createPromptLogger(); const envPath = new URL("../../../.env", import.meta.url); dotenv.config({ path: envPath }); @@ -188,7 +191,12 @@ async function runPlayground(): Promise { ), userMessage, ]; - const chatResponse = await chatModel.complete(context); + const chatResponse = await chatModel.complete( + context, + undefined, + undefined, + promptLogger.logModelRequest, + ); if (chatResponse.success) { const responseText = chatResponse.data; io.writer.writeLine(responseText); diff --git a/ts/examples/vscodeSchemaGen/package.json b/ts/examples/vscodeSchemaGen/package.json index e94ac7a9a5..9819d239e0 100644 --- a/ts/examples/vscodeSchemaGen/package.json +++ b/ts/examples/vscodeSchemaGen/package.json @@ -28,6 +28,7 @@ "debug": "^4.4.0", "dotenv": "^16.3.1", "fastest-levenshtein": "^1.0.16", + "telemetry": "workspace:*", "typeagent": "workspace:*", "typechat": "^0.1.1" }, diff --git a/ts/examples/vscodeSchemaGen/src/schemaGen.ts b/ts/examples/vscodeSchemaGen/src/schemaGen.ts index 2b5e016e20..c2d7ffb983 100644 --- a/ts/examples/vscodeSchemaGen/src/schemaGen.ts +++ b/ts/examples/vscodeSchemaGen/src/schemaGen.ts @@ -5,6 +5,9 @@ import * as path from "path"; import dotenv from "dotenv"; import * as fs from "fs"; import { finished } from "stream/promises"; +import { createPromptLogger } from "telemetry"; + +const promptLogger = createPromptLogger(); import { ChatModel, @@ -23,7 +26,12 @@ async function getModelCompletionResponse( prompt: string, jsonNode: any, ): Promise { - const chatResponse = await chatModel.complete(prompt); + const chatResponse = await chatModel.complete( + prompt, + undefined, + undefined, + promptLogger.logModelRequest, + ); if (chatResponse.success) { const responseText = chatResponse.data; return responseText; diff --git a/ts/package.json b/ts/package.json index 58d41c51c9..d6aa53b562 100644 --- a/ts/package.json +++ b/ts/package.json @@ -75,7 +75,7 @@ "exifreader", "keytar", "koffi", - "node-pty", + "protobufjs", "puppeteer", "sharp" ], diff --git a/ts/packages/agents/code/package.json b/ts/packages/agents/code/package.json index 30581b9560..6672a99938 100644 --- a/ts/packages/agents/code/package.json +++ b/ts/packages/agents/code/package.json @@ -28,6 +28,7 @@ "better-sqlite3": "12.2.0", "chalk": "^5.4.1", "debug": "^4.4.0", + "telemetry": "workspace:*", "websocket-utils": "workspace:*", "ws": "^8.17.1" }, diff --git a/ts/packages/agents/markdown/package.json b/ts/packages/agents/markdown/package.json index dc96b02bbf..24913e99f1 100644 --- a/ts/packages/agents/markdown/package.json +++ b/ts/packages/agents/markdown/package.json @@ -50,6 +50,7 @@ "prosemirror-model": "^1.19.0", "prosemirror-state": "^1.4.2", "prosemirror-view": "^1.31.0", + "telemetry": "workspace:*", "typechat": "^0.1.1", "unist-util-visit": "^4.1.2", "ws": "^8.14.2", diff --git a/ts/packages/agents/markdown/src/agent/translator.ts b/ts/packages/agents/markdown/src/agent/translator.ts index ed0d913b85..b98b3adc8e 100644 --- a/ts/packages/agents/markdown/src/agent/translator.ts +++ b/ts/packages/agents/markdown/src/agent/translator.ts @@ -12,6 +12,9 @@ import fs from "node:fs"; import { fileURLToPath } from "node:url"; import path from "node:path"; import registerDebug from "debug"; +import { createPromptLogger } from "telemetry"; + +const promptLogger = createPromptLogger(); import { MarkdownUpdateResult } from "./markdownOperationSchema.js"; @@ -174,7 +177,12 @@ export class MarkdownAgent { let accumulatedContent = ""; // Use the ChatModel's complete method with proper parameters - const response = await this.model.complete(streamingPrompt); + const response = await this.model.complete( + streamingPrompt, + undefined, + undefined, + promptLogger.logModelRequest, + ); // Extract content from response let content = ""; diff --git a/ts/packages/agents/spelunker/evals/eval-1/source/dispatcher/src/context/commandHandlerContext.ts b/ts/packages/agents/spelunker/evals/eval-1/source/dispatcher/src/context/commandHandlerContext.ts index fb8354ac79..e9d27be670 100644 --- a/ts/packages/agents/spelunker/evals/eval-1/source/dispatcher/src/context/commandHandlerContext.ts +++ b/ts/packages/agents/spelunker/evals/eval-1/source/dispatcher/src/context/commandHandlerContext.ts @@ -9,7 +9,7 @@ import { LoggerSink, MultiSinkLogger, createDebugLoggerSink, - createMongoDBLoggerSink, + createDatabaseLoggerSink, Profiler, } from "telemetry"; import { AgentCache } from "agent-cache"; @@ -189,11 +189,11 @@ function getLoggerSink(isDbEnabled: () => boolean, clientIO: ClientIO) { let dbLoggerSink: LoggerSink | undefined; try { - dbLoggerSink = createMongoDBLoggerSink( - "telemetrydb", - "dispatcherlogs", - isDbEnabled, - (e: string) => { + dbLoggerSink = createDatabaseLoggerSink({ + dbName: "telemetrydb", + collectionName: "dispatcherlogs", + isEnabled: isDbEnabled, + onErrorDisable: (e: string) => { clientIO.notify( AppAgentEvent.Warning, undefined, @@ -201,7 +201,7 @@ function getLoggerSink(isDbEnabled: () => boolean, clientIO: ClientIO) { DispatcherName, ); }, - ); + }); } catch (e) { clientIO.notify( AppAgentEvent.Warning, diff --git a/ts/packages/aiclient/package.json b/ts/packages/aiclient/package.json index 1ef27b9ee4..11d2dd0c3c 100644 --- a/ts/packages/aiclient/package.json +++ b/ts/packages/aiclient/package.json @@ -35,7 +35,6 @@ "@azure/identity": "^4.10.0", "async": "^3.2.5", "debug": "^4.4.0", - "telemetry": "workspace:*", "typechat": "^0.1.1" }, "devDependencies": { diff --git a/ts/packages/aiclient/src/models.ts b/ts/packages/aiclient/src/models.ts index 1fa359237d..7b96d41892 100644 --- a/ts/packages/aiclient/src/models.ts +++ b/ts/packages/aiclient/src/models.ts @@ -67,6 +67,7 @@ export interface ChatModel extends TypeChatLanguageModel { prompt: string | PromptSection[], usageCallback?: CompleteUsageStatsCallback, jsonSchema?: CompletionJsonSchema, + promptLogFn?: (msg: any) => void, ): Promise>; } @@ -80,6 +81,7 @@ export interface ChatModelWithStreaming extends ChatModel { prompt: string | PromptSection[], usageCallback?: CompleteUsageStatsCallback, jsonSchema?: CompletionJsonSchema, + promptLogFn?: (msg: any) => void, ): Promise>>; } diff --git a/ts/packages/aiclient/src/openai.ts b/ts/packages/aiclient/src/openai.ts index 361a87541c..497e682ab4 100644 --- a/ts/packages/aiclient/src/openai.ts +++ b/ts/packages/aiclient/src/openai.ts @@ -29,7 +29,6 @@ import { readServerEventStream } from "./serverEvents.js"; import { priorityQueue } from "async"; import registerDebug from "debug"; import { TokenCounter } from "./tokenCounter.js"; -import { PromptLogger } from "./promptLogger.js"; import { createOllamaChatModel, OllamaApiSettings, @@ -485,6 +484,7 @@ function createAzureOpenAIChatModel( prompt: string | PromptSection[], usageCallback?: CompleteUsageStatsCallback, jsonSchema?: CompletionJsonSchema, + logFn?: (msg: any) => void, ): Promise> { verifyPromptLength(settings, prompt); @@ -521,9 +521,9 @@ function createAzureOpenAIChatModel( } try { - if (settings.enableModelRequestLogging) { + if (settings.enableModelRequestLogging && logFn) { // Log request - PromptLogger.getInstance().logModelRequest({ + logFn({ prompt: messages as PromptSection[], response: data.choices[0].message?.content ?? "", tokenUsage: data.usage, @@ -561,6 +561,7 @@ function createAzureOpenAIChatModel( prompt: string | PromptSection[], usageCallback?: CompleteUsageStatsCallback, jsonSchema?: CompletionJsonSchema, + logFn?: (msg: any) => void, ): Promise>> { verifyPromptLength(settings, prompt); @@ -612,9 +613,9 @@ function createAzureOpenAIChatModel( for await (const evt of readServerEventStream(result.data)) { if (evt.data === "[DONE]") { try { - if (settings.enableModelRequestLogging) { + if (settings.enableModelRequestLogging && logFn) { // Log request. - PromptLogger.getInstance().logModelRequest({ + logFn({ prompt: messages as PromptSection[], response: fullResponseText, tokenUsageData: tokenUsage, diff --git a/ts/packages/aiclient/src/promptLogger.ts b/ts/packages/aiclient/src/promptLogger.ts deleted file mode 100644 index 43743f09c4..0000000000 --- a/ts/packages/aiclient/src/promptLogger.ts +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { - LoggerSink, - MultiSinkLogger, - createMongoDBLoggerSink, - createDebugLoggerSink, -} from "telemetry"; - -import registerDebug from "debug"; - -const debugPromptLogger = registerDebug("typeagent:promptLogger"); - -/** - * Logger for LLM prompts. - */ -export class PromptLogger { - private static instance: PromptLogger; - private sinkLogger: MultiSinkLogger | undefined; - - public static getInstance = (): PromptLogger => { - if (!PromptLogger.instance) { - PromptLogger.instance = new PromptLogger(); - PromptLogger.instance.sinkLogger = - PromptLogger.instance.createSinkLogger(); - } - - return PromptLogger.instance; - }; - - logModelRequest(requestContent: any) { - this.sinkLogger?.logEvent("modelRequest", { requestContent }); - } - - createSinkLogger(): MultiSinkLogger { - const debugLoggerSink = createDebugLoggerSink(); - let dbLoggerSink: LoggerSink | undefined; - - try { - dbLoggerSink = createMongoDBLoggerSink("telemetrydb", "promptLogs"); - } catch (e) { - debugPromptLogger(`DB logging disabled. ${e}`); - } - - return new MultiSinkLogger( - dbLoggerSink === undefined - ? [debugLoggerSink] - : [debugLoggerSink, dbLoggerSink], - ); - } -} diff --git a/ts/packages/cache/src/explanation/v5/explanationV5.ts b/ts/packages/cache/src/explanation/v5/explanationV5.ts index 1913fb7bcf..2f0adc43c8 100644 --- a/ts/packages/cache/src/explanation/v5/explanationV5.ts +++ b/ts/packages/cache/src/explanation/v5/explanationV5.ts @@ -81,6 +81,9 @@ import { PolitenessGeneralizer, } from "./politenessGeneralizationV5.js"; import { PolitenessGeneralization } from "./politenessGeneralizationSchemaV5.js"; +import { createPromptLogger } from "telemetry"; + +const promptLogger = createPromptLogger(); type Explanation = PropertyExplanation & SubPhraseExplanation & @@ -334,7 +337,12 @@ variations: ParameterVariation[]; For every value V that is within the range of ${paramRange.min} to ${paramRange.max} by step ${paramRange.step}, generate a phrase P that only changes the phrase '${subPhrase}' enough to change the value to V. Emit the generated phrases and values as a JSON object of type ParameterVariationResult with 2 spaces of indentation and no properties with the value undefined: `; - const result = await model.complete(prompt); + const result = await model.complete( + prompt, + undefined, + undefined, + promptLogger.logModelRequest, + ); if (result.success) { const generatedAlternatives = JSON.parse( result.data, diff --git a/ts/packages/cli/package.json b/ts/packages/cli/package.json index d8d3b648b2..ae4b9baf65 100644 --- a/ts/packages/cli/package.json +++ b/ts/packages/cli/package.json @@ -64,6 +64,7 @@ "marked": "^15.0.0", "marked-terminal": "^7.3.0", "open": "^10.1.0", + "telemetry": "workspace:*", "ts-node": "^10.9.1", "typechat": "^0.1.1", "typechat-utils": "workspace:*" diff --git a/ts/packages/cli/src/commands/prompt.ts b/ts/packages/cli/src/commands/prompt.ts index 2e8b6f8ca2..f91ddb1c75 100644 --- a/ts/packages/cli/src/commands/prompt.ts +++ b/ts/packages/cli/src/commands/prompt.ts @@ -5,6 +5,9 @@ import { Args, Command, Flags } from "@oclif/core"; import { openai, getChatModelNames } from "aiclient"; import fs from "node:fs"; import chalk from "chalk"; +import { createPromptLogger } from "telemetry"; + +const promptLogger = createPromptLogger(); const modelNames = await getChatModelNames(); export default class Prompt extends Command { @@ -83,7 +86,12 @@ export default class Prompt extends Command { time = end - start; } else { const start = performance.now(); - const complete = await model.complete(request); + const complete = await model.complete( + request, + undefined, + undefined, + promptLogger.logModelRequest, + ); const end = performance.now(); if (complete.success) { responseText = complete.data; diff --git a/ts/packages/dispatcher/dispatcher/package.json b/ts/packages/dispatcher/dispatcher/package.json index 7c53132d77..a2c78d75ea 100644 --- a/ts/packages/dispatcher/dispatcher/package.json +++ b/ts/packages/dispatcher/dispatcher/package.json @@ -41,6 +41,7 @@ "@anthropic-ai/claude-agent-sdk": "^0.2.12", "@azure/ai-agents": "^1.0.0-beta.3", "@azure/ai-projects": "^1.0.0-beta.8", + "@azure/cosmos": "^4.2.1", "@azure/identity": "^4.10.0", "@typeagent/action-schema": "workspace:*", "@typeagent/agent-rpc": "workspace:*", diff --git a/ts/packages/dispatcher/dispatcher/src/context/commandHandlerContext.ts b/ts/packages/dispatcher/dispatcher/src/context/commandHandlerContext.ts index 1a74bef7c4..e0f55ca250 100644 --- a/ts/packages/dispatcher/dispatcher/src/context/commandHandlerContext.ts +++ b/ts/packages/dispatcher/dispatcher/src/context/commandHandlerContext.ts @@ -12,7 +12,12 @@ import { LoggerSink, MultiSinkLogger, createDebugLoggerSink, - createMongoDBLoggerSink, + createDatabaseLoggerSink, + CosmosContainerClientFactory, + CosmosPartitionKeyBuilderFactory, + PromptLogger, + createPromptLogger, + PromptLoggerOptions, } from "telemetry"; import { AgentCache } from "agent-cache"; import { randomUUID } from "crypto"; @@ -87,6 +92,9 @@ import { registerBuiltInEntities, } from "action-grammar"; import fs from "node:fs"; +import { CosmosClient, PartitionKeyBuilder } from "@azure/cosmos"; +import { CosmosPartitionKeyBuilder } from "telemetry"; +import { DefaultAzureCredential } from "@azure/identity"; const debug = registerDebug("typeagent:dispatcher:init"); const debugError = registerDebug("typeagent:dispatcher:init:error"); @@ -155,6 +163,7 @@ export type CommandHandlerContext = { streamingActionContext?: ActionContextWithClose | undefined; metricsManager?: RequestMetricsManager | undefined; commandProfiler?: Profiler | undefined; + promptLogger?: PromptLogger | undefined; instanceDirLock: (() => Promise) | undefined; @@ -287,16 +296,54 @@ async function getSession( return session; } +function getCosmosFactories(): PromptLoggerOptions { + const cosmosConnectionString = process.env["COSMOSDB_CONNECTION_STRING"]; + let cosmosContainerFactory: CosmosContainerClientFactory | undefined; + let cosmosPartitionKeyBuilderFactory: + | CosmosPartitionKeyBuilderFactory + | undefined; + + if (cosmosConnectionString && cosmosConnectionString !== "") { + cosmosContainerFactory = async (endpoint, dbName, containerName) => { + const client = new CosmosClient({ + endpoint, + aadCredentials: new DefaultAzureCredential(), + }); + const container = client.database(dbName).container(containerName); + return { + executeBulkOperations: (ops) => + container.items.executeBulkOperations(ops as any), + }; + }; + + cosmosPartitionKeyBuilderFactory = () => + new PartitionKeyBuilder() as unknown as CosmosPartitionKeyBuilder; + } + + const result: PromptLoggerOptions = {}; + if (cosmosContainerFactory !== undefined) { + result.cosmosContainerFactory = cosmosContainerFactory; + } + if (cosmosPartitionKeyBuilderFactory !== undefined) { + result.cosmosPartitionKeyBuilderFactory = + cosmosPartitionKeyBuilderFactory; + } + return result; +} + function getLoggerSink(isDbEnabled: () => boolean, clientIO: ClientIO) { const debugLoggerSink = createDebugLoggerSink(); let dbLoggerSink: LoggerSink | undefined; try { - dbLoggerSink = createMongoDBLoggerSink( - "telemetrydb", - "dispatcherlogs", - isDbEnabled, - (e: string) => { + const { cosmosContainerFactory, cosmosPartitionKeyBuilderFactory } = + getCosmosFactories(); + + dbLoggerSink = createDatabaseLoggerSink({ + dbName: "telemetrydb", + collectionName: "dispatcherlogs", + isEnabled: isDbEnabled, + onErrorDisable: (e: string) => { clientIO.notify( undefined, AppAgentEvent.Warning, @@ -304,7 +351,9 @@ function getLoggerSink(isDbEnabled: () => boolean, clientIO: ClientIO) { DispatcherName, ); }, - ); + cosmosContainerFactory: cosmosContainerFactory, + cosmosPartitionKeyBuilderFactory: cosmosPartitionKeyBuilderFactory, + }); } catch (e) { clientIO.notify( undefined, @@ -537,6 +586,7 @@ export async function initializeCommandHandlerContext( ), logger, metricsManager: metrics ? new RequestMetricsManager() : undefined, + promptLogger: createPromptLogger(getCosmosFactories()), batchMode: false, instanceDirLock, constructionProvider, diff --git a/ts/packages/dispatcher/dispatcher/src/context/dispatcher/dispatcherAgent.ts b/ts/packages/dispatcher/dispatcher/src/context/dispatcher/dispatcherAgent.ts index a63512f2a6..42b0c0cbed 100644 --- a/ts/packages/dispatcher/dispatcher/src/context/dispatcher/dispatcherAgent.ts +++ b/ts/packages/dispatcher/dispatcher/src/context/dispatcher/dispatcherAgent.ts @@ -172,7 +172,15 @@ async function clarifyWithLookup( agents.getActionConfig("dispatcher"), ]; // TODO: cache this? - const translator = loadAgentJsonTranslator(actionConfigs, [], agents); + const translator = loadAgentJsonTranslator( + actionConfigs, + [], + agents, + undefined, + undefined, + undefined, + systemContext.promptLogger, + ); const question = `What is ${action.parameters.reference}?`; const result = await translator.translate(question); diff --git a/ts/packages/dispatcher/dispatcher/src/translation/agentTranslators.ts b/ts/packages/dispatcher/dispatcher/src/translation/agentTranslators.ts index 557b095598..de51199e74 100644 --- a/ts/packages/dispatcher/dispatcher/src/translation/agentTranslators.ts +++ b/ts/packages/dispatcher/dispatcher/src/translation/agentTranslators.ts @@ -38,6 +38,7 @@ import { ActionConfig, getSchemaContent } from "./actionConfig.js"; import { ActionConfigProvider } from "./actionConfigProvider.js"; import { createTypeScriptJsonValidator } from "typechat/ts"; import { CompleteUsageStatsCallback } from "aiclient"; +import { PromptLogger } from "telemetry"; export function getAppAgentName(schemaName: string) { return schemaName.split(".")[0]; @@ -334,6 +335,7 @@ export function loadAgentJsonTranslator< options?: ComposeSchemaOptions, generateOptions?: GenerateSchemaOptions | null, // null means not generated model?: string, + promptLogger?: PromptLogger, ): TypeAgentTranslator { const validator = createTypeAgentValidator( actionConfigs, @@ -344,7 +346,10 @@ export function loadAgentJsonTranslator< ); // Collect schema name mapping. const schemaNameMap = collectSchemaName(actionConfigs, provider); - return createTypeAgentTranslator(validator, schemaNameMap, { model }); + return createTypeAgentTranslator(validator, schemaNameMap, { + model, + promptLogger, + }); } function createTypeAgentTranslator< @@ -359,7 +364,10 @@ function createTypeAgentTranslator< validator, options, ); - const streamingTranslator = enableJsonTranslatorStreaming(translator); + const streamingTranslator = enableJsonTranslatorStreaming( + translator, + options.promptLogger, + ); // the request prompt is already expanded by the override replacement below // So just return the request as is. @@ -430,6 +438,7 @@ export function createTypeAgentTranslatorForSelectedActions< provider: ActionConfigProvider, options?: ComposeSchemaOptions, model?: string, + promptLogger?: PromptLogger, ) { const validator = createActionSchemaJsonValidator( composeSelectedActionSchema( @@ -447,7 +456,10 @@ export function createTypeAgentTranslatorForSelectedActions< definitions, actionConfig, ); - return createTypeAgentTranslator(validator, schemaNameMap, { model }); + return createTypeAgentTranslator(validator, schemaNameMap, { + model, + promptLogger, + }); } // For CLI, replicate the behavior of loadAgentJsonTranslator to get the schema diff --git a/ts/packages/dispatcher/dispatcher/src/translation/translateRequest.ts b/ts/packages/dispatcher/dispatcher/src/translation/translateRequest.ts index 7bd65dbed0..e454f645eb 100644 --- a/ts/packages/dispatcher/dispatcher/src/translation/translateRequest.ts +++ b/ts/packages/dispatcher/dispatcher/src/translation/translateRequest.ts @@ -156,6 +156,7 @@ export function getTranslatorForSchema( }, generateOptions, config.model, + context.promptLogger, ); if (!activityContext) { context.translatorCache.set(translatorName, newTranslator); @@ -208,6 +209,7 @@ async function getTranslatorForSelectedActions( multiple: config.multiple, }, config.model, + context.promptLogger, ); } @@ -480,6 +482,7 @@ async function findAssistantForRequest( const selectTranslator = loadAssistantSelectionJsonTranslator( schemaNames, systemContext.agents, + systemContext.promptLogger, ); const result = await selectTranslator.translate(request); diff --git a/ts/packages/dispatcher/dispatcher/src/translation/unknownSwitcher.ts b/ts/packages/dispatcher/dispatcher/src/translation/unknownSwitcher.ts index 47294653eb..974fe63566 100644 --- a/ts/packages/dispatcher/dispatcher/src/translation/unknownSwitcher.ts +++ b/ts/packages/dispatcher/dispatcher/src/translation/unknownSwitcher.ts @@ -13,6 +13,7 @@ import { SchemaCreator as sc, } from "@typeagent/action-schema"; import { getCombinedActionSchemaTypeName } from "./agentTranslators.js"; +import { PromptLogger } from "telemetry"; const debugSwitchSearch = registerDebug("typeagent:switch:search"); function createSelectionActionTypeDefinition( @@ -132,6 +133,7 @@ const assistantSelectionLimit = 8192 * 3; export function loadAssistantSelectionJsonTranslator( schemaNames: Iterable, provider: ActionConfigProvider, + promptLogger?: PromptLogger, ) { const schemas = getAssistantSelectionSchemas(schemaNames, provider); @@ -170,6 +172,7 @@ export function loadAssistantSelectionJsonTranslator( "Select the assistant to handle the request", }, ], + promptLogger, }, ), }; diff --git a/ts/packages/shell/package.json b/ts/packages/shell/package.json index b21f5bfbd0..71ac29d783 100644 --- a/ts/packages/shell/package.json +++ b/ts/packages/shell/package.json @@ -88,7 +88,7 @@ "concurrently": "^9.1.2", "cross-env": "^7.0.3", "electron": "^37.4.0", - "electron-builder": "^26.3.1", + "electron-builder": "^26.7.0", "electron-vite": "^4.0.1", "less": "^4.2.0", "rimraf": "^6.0.1", diff --git a/ts/packages/telemetry/src/indexNode.ts b/ts/packages/telemetry/src/indexNode.ts index c1aebb16fc..42aef2f60d 100644 --- a/ts/packages/telemetry/src/indexNode.ts +++ b/ts/packages/telemetry/src/indexNode.ts @@ -7,9 +7,29 @@ export { ChildLogger, MultiSinkLogger, LogEvent, + CosmosContainerClient, + CosmosContainerClientFactory, + CosmosPartitionKeyBuilder, + CosmosBulkOperation, + CosmosBulkOperationResult, + CosmosBulkOperationResponse, + CosmosPartitionKey, } from "./logger/logger.js"; export { createMongoDBLoggerSink } from "./logger/mongoLoggerSink.js"; +export { + createCosmosDBLoggerSink, + CosmosPartitionKeyBuilderFactory, +} from "./logger/cosmosDBLoggerSink.js"; +export { + createDatabaseLoggerSink, + DatabaseLoggerSinkOptions, +} from "./logger/databaseLoggerSink.js"; export { createDebugLoggerSink } from "./logger/debugLoggerSink.js"; +export { + PromptLogger, + PromptLoggerOptions, + createPromptLogger, +} from "./logger/promptLogger.js"; export * from "./stopWatch.js"; diff --git a/ts/packages/telemetry/src/logger/cosmosDBLoggerSink.ts b/ts/packages/telemetry/src/logger/cosmosDBLoggerSink.ts new file mode 100644 index 0000000000..4cc41c609d --- /dev/null +++ b/ts/packages/telemetry/src/logger/cosmosDBLoggerSink.ts @@ -0,0 +1,163 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + LoggerSink, + LogEvent, + CosmosContainerClient, + CosmosContainerClientFactory, + CosmosPartitionKeyBuilder, + CosmosBulkOperation, +} from "./logger.js"; +import registerDebug from "debug"; +import { randomUUID } from "crypto"; + +const debugCosmos = registerDebug("typeagent:logger:cosmosdb"); + +const UPLOAD_DELAY = 1000; +const MAX_RETRY = 3; + +export type CosmosPartitionKeyBuilderFactory = () => CosmosPartitionKeyBuilder; + +class CosmosDBLoggerSink implements LoggerSink { + private pendingEvents: LogEvent[] = []; + private timeout: NodeJS.Timeout | undefined; + private disabled = false; + private container: CosmosContainerClient | undefined; + + constructor( + private readonly endpoint: string, + private readonly databaseName: string, + private readonly containerName: string, + private readonly containerFactory: CosmosContainerClientFactory, + private readonly partitionKeyBuilderFactory: CosmosPartitionKeyBuilderFactory, + private readonly isEnabled?: () => boolean, + private readonly onErrorDisable?: (error: string) => void, + ) {} + + public logEvent(event: LogEvent) { + if (this.endpoint && !this.disabled && this.isEnabled?.() !== false) { + this.pendingEvents.push(event); + if (this.timeout === undefined) { + this.timeout = setTimeout(() => this.upload(), UPLOAD_DELAY); + } + } + } + + private async upload() { + let attempt = 0; + while (attempt < MAX_RETRY) { + attempt++; + try { + await this.drain(); + break; + } catch (e: any) { + // TODO: add backoff/queuing logic for ENOTFOUND (no internet) + if ( + typeof e.message === "string" && + (e.message.includes("Invalid key") || + e.message.includes("Unauthorized") || + e.message.includes("authorization")) + ) { + // Disable + if (this.onErrorDisable) { + this.onErrorDisable( + `DB Logging disabled: ${e.toString()}`, + ); + } else { + console.error(`DB Logging disabled: ${e.toString()}`); + } + + this.disabled = true; + break; + } + + // Retry + debugCosmos(`ERROR: ${e}`); + } + } + // Clear the timeout so it can schedule after the next log event. + this.timeout = undefined; + } + + private async getContainer(): Promise { + if (!this.container) { + this.container = await this.containerFactory( + this.endpoint, + this.databaseName, + this.containerName, + ); + } + return this.container; + } + + private async drain() { + const container = await this.getContainer(); + + while (true) { + const events = this.pendingEvents; + if (events.length === 0) { + // done + return; + } + this.pendingEvents = []; + + try { + // Azure Cosmos DB requires each document to have an 'id' field + // We'll add it if not present and use bulk operations + const operations: CosmosBulkOperation[] = events.map( + (event: any) => { + const partitionKey = this.partitionKeyBuilderFactory() + .addValue(event.id || randomUUID().toString()) + .build(); + return { + operationType: "Create" as const, + partitionKey: partitionKey, + resourceBody: { + ...event, + id: partitionKey.toString(), + }, + }; + }, + ); + + const result = + await container.executeBulkOperations(operations); + debugCosmos( + `Status: ${result[0].response?.statusCode}. ${operations.length} events uploaded`, + ); + } catch (e: any) { + if (this.pendingEvents.length !== 0) { + events.push(...this.pendingEvents); + } + this.pendingEvents = events; + throw e; + } + } + } +} + +export function createCosmosDBLoggerSink( + databaseName: string, + containerName: string, + containerFactory: CosmosContainerClientFactory, + partitionKeyBuilderFactory: CosmosPartitionKeyBuilderFactory, + isEnabled?: () => boolean, + onErrorDisable?: (error: string) => void, +): LoggerSink { + const endpoint = process.env["COSMOSDB_CONNECTION_STRING"] ?? ""; + if (endpoint === "") { + throw new Error( + "COSMOSDB_CONNECTION_STRING environment variable not set", + ); + } + return new CosmosDBLoggerSink( + endpoint, + databaseName, + containerName, + containerFactory, + partitionKeyBuilderFactory, + isEnabled, + onErrorDisable, + ); +} diff --git a/ts/packages/telemetry/src/logger/databaseLoggerSink.ts b/ts/packages/telemetry/src/logger/databaseLoggerSink.ts new file mode 100644 index 0000000000..cba58c6d32 --- /dev/null +++ b/ts/packages/telemetry/src/logger/databaseLoggerSink.ts @@ -0,0 +1,101 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { LoggerSink, CosmosContainerClientFactory } from "./logger.js"; +import { createMongoDBLoggerSink } from "./mongoLoggerSink.js"; +import { + createCosmosDBLoggerSink, + CosmosPartitionKeyBuilderFactory, +} from "./cosmosDBLoggerSink.js"; +import registerDebug from "debug"; + +const debugDatabase = registerDebug("typeagent:logger:database"); + +export interface DatabaseLoggerSinkOptions { + dbName: string; + collectionName: string; + isEnabled?: () => boolean; + onErrorDisable?: (error: string) => void; + /** + * Factory to create a Cosmos container client. Required if using Cosmos DB. + */ + cosmosContainerFactory?: CosmosContainerClientFactory | undefined; + /** + * Factory to create a Cosmos partition key builder. Required if using Cosmos DB. + */ + cosmosPartitionKeyBuilderFactory?: + | CosmosPartitionKeyBuilderFactory + | undefined; +} + +/** + * Creates a database logger sink that automatically selects between MongoDB and Cosmos DB + * based on which environment variable is set. + * + * Priority order: + * 1. COSMOSDB_CONNECTION_STRING - Uses Azure Cosmos DB (requires cosmosContainerFactory and cosmosPartitionKeyBuilderFactory) + * 2. MONGODB_CONNECTION_STRING - Uses MongoDB + * + * @param options - Configuration options for the database logger sink + * @returns A LoggerSink instance or undefined if no connection string is configured + */ +export function createDatabaseLoggerSink( + options: DatabaseLoggerSinkOptions, +): LoggerSink | undefined { + const { + dbName, + collectionName, + isEnabled, + onErrorDisable, + cosmosContainerFactory, + cosmosPartitionKeyBuilderFactory, + } = options; + + const cosmosConnectionString = process.env["COSMOSDB_CONNECTION_STRING"]; + const mongoConnectionString = process.env["MONGODB_CONNECTION_STRING"]; + + // Try Cosmos DB first (if factories are provided) + if (cosmosConnectionString && cosmosConnectionString !== "") { + if (cosmosContainerFactory && cosmosPartitionKeyBuilderFactory) { + try { + debugDatabase("Using Azure Cosmos DB for database logging"); + return createCosmosDBLoggerSink( + dbName, + collectionName, + cosmosContainerFactory, + cosmosPartitionKeyBuilderFactory, + isEnabled, + onErrorDisable, + ); + } catch (e) { + debugDatabase(`Failed to create Cosmos DB logger sink: ${e}`); + // Fall through to try MongoDB + } + } else { + debugDatabase( + "Cosmos DB connection string found but no factories provided, falling back to MongoDB", + ); + } + } + + // Try MongoDB second + if (mongoConnectionString && mongoConnectionString !== "") { + try { + debugDatabase("Using MongoDB for database logging"); + return createMongoDBLoggerSink( + dbName, + collectionName, + isEnabled, + onErrorDisable, + ); + } catch (e) { + debugDatabase(`Failed to create MongoDB logger sink: ${e}`); + throw e; + } + } + + // No connection string found + throw new Error( + "No database connection string found. Set either COSMOSDB_CONNECTION_STRING or MONGODB_CONNECTION_STRING environment variable.", + ); +} diff --git a/ts/packages/telemetry/src/logger/logger.ts b/ts/packages/telemetry/src/logger/logger.ts index d6ed7eee2a..abe21408e9 100644 --- a/ts/packages/telemetry/src/logger/logger.ts +++ b/ts/packages/telemetry/src/logger/logger.ts @@ -52,3 +52,43 @@ export class MultiSinkLogger implements Logger { } } } + +/** + * Cosmos DB abstractions to avoid direct dependency on @azure/cosmos and @azure/identity + */ + +export interface CosmosBulkOperationResponse { + statusCode?: number; +} + +export interface CosmosBulkOperationResult { + response?: CosmosBulkOperationResponse; +} + +export interface CosmosPartitionKey { + toString(): string; + length: number; +} + +export interface CosmosBulkOperation { + operationType: "Create"; + partitionKey: CosmosPartitionKey; + resourceBody: Record; +} + +export interface CosmosContainerClient { + executeBulkOperations( + operations: CosmosBulkOperation[], + ): Promise; +} + +export type CosmosContainerClientFactory = ( + endpoint: string, + databaseName: string, + containerName: string, +) => Promise; + +export interface CosmosPartitionKeyBuilder { + addValue(value: string): CosmosPartitionKeyBuilder; + build(): CosmosPartitionKey; +} diff --git a/ts/packages/telemetry/src/logger/promptLogger.ts b/ts/packages/telemetry/src/logger/promptLogger.ts new file mode 100644 index 0000000000..3b050ebec5 --- /dev/null +++ b/ts/packages/telemetry/src/logger/promptLogger.ts @@ -0,0 +1,68 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + LoggerSink, + MultiSinkLogger, + CosmosContainerClientFactory, + createDatabaseLoggerSink, + createDebugLoggerSink, +} from "telemetry"; +import { CosmosPartitionKeyBuilderFactory } from "./cosmosDBLoggerSink.js"; + +import registerDebug from "debug"; + +const debugPromptLogger = registerDebug("typeagent:telemetry:promptLogger"); + +export interface PromptLoggerOptions { + dbName?: string; + collectionName?: string; + cosmosContainerFactory?: CosmosContainerClientFactory; + cosmosPartitionKeyBuilderFactory?: CosmosPartitionKeyBuilderFactory; +} + +/** + * Logger for LLM prompts. + */ +export class PromptLogger { + private sinkLogger: MultiSinkLogger | undefined; + + constructor(options?: PromptLoggerOptions) { + this.sinkLogger = this.createSinkLogger(options); + } + + logModelRequest = (requestContent: any) => { + this.sinkLogger?.logEvent("modelRequest", { requestContent }); + }; + + private createSinkLogger( + options?: PromptLoggerOptions, + ): MultiSinkLogger | undefined { + const debugLoggerSink = createDebugLoggerSink(); + let dbLoggerSink: LoggerSink | undefined; + + try { + dbLoggerSink = createDatabaseLoggerSink({ + dbName: options?.dbName ?? "telemetrydb", + collectionName: options?.collectionName ?? "promptLogs", + cosmosContainerFactory: options?.cosmosContainerFactory, + cosmosPartitionKeyBuilderFactory: + options?.cosmosPartitionKeyBuilderFactory, + }); + } catch (e) { + debugPromptLogger(`DB logging disabled. ${e}`); + } + + return new MultiSinkLogger( + dbLoggerSink === undefined + ? [debugLoggerSink] + : [debugLoggerSink, dbLoggerSink], + ); + } +} + +export function createPromptLogger( + options?: PromptLoggerOptions, +): PromptLogger { + return new PromptLogger(options); +} diff --git a/ts/packages/utils/typechatUtils/package.json b/ts/packages/utils/typechatUtils/package.json index 8acf7c4202..626c9d64be 100644 --- a/ts/packages/utils/typechatUtils/package.json +++ b/ts/packages/utils/typechatUtils/package.json @@ -37,6 +37,7 @@ "date-fns": "^4.1.0", "debug": "^4.4.0", "exifreader": "^4.30.1", + "telemetry": "workspace:*", "typechat": "^0.1.1" }, "devDependencies": { diff --git a/ts/packages/utils/typechatUtils/src/jsonTranslator.ts b/ts/packages/utils/typechatUtils/src/jsonTranslator.ts index c009d7a770..159105c3f2 100644 --- a/ts/packages/utils/typechatUtils/src/jsonTranslator.ts +++ b/ts/packages/utils/typechatUtils/src/jsonTranslator.ts @@ -24,6 +24,7 @@ import { IncrementalJsonValueCallBack, } from "./incrementalJsonParser.js"; import { addImagePromptContent, CachedImageWithDetails } from "./image.js"; +import { PromptLogger } from "telemetry"; export type InlineTranslatorSchemaDef = { kind: "inline"; @@ -130,6 +131,7 @@ function getModelParams( export function enableJsonTranslatorStreaming( translator: TypeChatJsonTranslator, + promptLogger?: PromptLogger, ): TypeChatJsonTranslatorWithStreaming { const model = translator.model; if (!ai.supportsStreaming(model)) { @@ -140,11 +142,21 @@ export function enableJsonTranslatorStreaming( model.complete = async (prompt: string | PromptSection[]) => { const modelParams = getModelParams(prompt); if (modelParams === undefined) { - return originalComplete(prompt); + return originalComplete( + prompt, + undefined, + undefined, + promptLogger?.logModelRequest, + ); } const { parser, usageCallback, actualPrompt } = modelParams; if (parser === undefined) { - return originalComplete(actualPrompt, usageCallback); + return originalComplete( + actualPrompt, + usageCallback, + undefined, + promptLogger?.logModelRequest, + ); } const chunks = []; const result = await model.completeStream(actualPrompt, usageCallback); @@ -208,6 +220,7 @@ export type JsonTranslatorOptions = { validateInstance?: (instance: T) => Result; // Optional instructions?: PromptSection[] | undefined; // Instructions before the per request preamble model?: string | undefined; // optional + promptLogger?: PromptLogger | undefined; // optional prompt logger for model requests }; /** @@ -274,7 +287,12 @@ export function createJsonTranslatorWithValidator( if (jsonSchema !== undefined) { debugJsonSchema(jsonSchema); } - return originalComplete(prompt, usageCallback, jsonSchema); + return originalComplete( + prompt, + usageCallback, + jsonSchema, + options?.promptLogger?.logModelRequest, + ); }; if (ai.supportsStreaming(model)) { diff --git a/ts/pnpm-lock.yaml b/ts/pnpm-lock.yaml index 15dc5efb0f..12c4a05b16 100644 --- a/ts/pnpm-lock.yaml +++ b/ts/pnpm-lock.yaml @@ -203,6 +203,9 @@ importers: memory-storage: specifier: workspace:* version: link:../../packages/memory/storage + telemetry: + specifier: workspace:* + version: link:../../packages/telemetry textpro: specifier: workspace:* version: link:../../packages/textPro @@ -575,6 +578,9 @@ importers: interactive-app: specifier: workspace:* version: link:../../packages/interactiveApp + telemetry: + specifier: workspace:* + version: link:../../packages/telemetry typeagent: specifier: workspace:* version: link:../../packages/typeagent @@ -772,6 +778,9 @@ importers: fastest-levenshtein: specifier: ^1.0.16 version: 1.0.16 + telemetry: + specifier: workspace:* + version: link:../../packages/telemetry typeagent: specifier: workspace:* version: link:../../packages/typeagent @@ -1642,6 +1651,9 @@ importers: debug: specifier: ^4.4.0 version: 4.4.1 + telemetry: + specifier: workspace:* + version: link:../../telemetry websocket-utils: specifier: workspace:* version: link:../../utils/webSocketUtils @@ -1954,6 +1966,9 @@ importers: prosemirror-view: specifier: ^1.31.0 version: 1.40.0 + telemetry: + specifier: workspace:* + version: link:../../telemetry typechat: specifier: ^0.1.1 version: 0.1.1(typescript@5.4.5)(zod@3.25.76) @@ -2415,9 +2430,6 @@ importers: debug: specifier: ^4.4.0 version: 4.4.1 - telemetry: - specifier: workspace:* - version: link:../telemetry typechat: specifier: ^0.1.1 version: 0.1.1(typescript@5.4.5)(zod@3.25.76) @@ -2765,6 +2777,9 @@ importers: open: specifier: ^10.1.0 version: 10.1.2 + telemetry: + specifier: workspace:* + version: link:../telemetry ts-node: specifier: ^10.9.1 version: 10.9.2(@types/node@22.15.18)(typescript@5.4.5) @@ -3149,6 +3164,9 @@ importers: '@azure/ai-projects': specifier: ^1.0.0-beta.8 version: 1.0.0-beta.8(ws@8.18.2)(zod@4.1.13) + '@azure/cosmos': + specifier: ^4.2.1 + version: 4.9.1(@azure/core-client@1.9.2) '@azure/identity': specifier: ^4.10.0 version: 4.10.0 @@ -4000,8 +4018,8 @@ importers: specifier: ^37.4.0 version: 37.4.0 electron-builder: - specifier: ^26.3.1 - version: 26.3.1(electron-builder-squirrel-windows@26.3.1) + specifier: ^26.7.0 + version: 26.7.0(electron-builder-squirrel-windows@26.3.1) electron-vite: specifier: ^4.0.1 version: 4.0.1(vite@6.4.1(@types/node@22.15.18)(jiti@2.5.1)(less@4.3.0)(terser@5.39.2)(yaml@2.7.0)) @@ -4245,6 +4263,9 @@ importers: exifreader: specifier: ^4.30.1 version: 4.30.1 + telemetry: + specifier: workspace:* + version: link:../../telemetry typechat: specifier: ^0.1.1 version: 0.1.1(typescript@5.4.5)(zod@3.25.76) @@ -4595,6 +4616,13 @@ packages: resolution: {integrity: sha512-5MnV1yqzZwgNLLjlizsU3QqOeQChkIXw781Fwh1xdAqJR5AA32IUaq6xv1BICJvfbHoa+JYcaij2HFkhLbNTJQ==} engines: {node: '>=18.0.0'} + '@azure/core-http-compat@2.3.2': + resolution: {integrity: sha512-Tf6ltdKzOJEgxZeWLCjMxrxbodB/ZeCbzzA1A2qHbhzAjzjHoBVSUeSl/baT/oHAxhc4qdqVaDKnc2+iE932gw==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@azure/core-client': ^1.10.0 + '@azure/core-rest-pipeline': ^1.22.0 + '@azure/core-lro@2.7.2': resolution: {integrity: sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==} engines: {node: '>=18.0.0'} @@ -4627,6 +4655,10 @@ packages: resolution: {integrity: sha512-J4FYAqakGXcbfeZjwjMzjNcpcH4E+JtEBv+xcV1yL0Ydn/6wbQfeFKTCHh9wttAi0lmajHw7yBbHPRG+YHckZQ==} engines: {node: '>=18.0.0'} + '@azure/cosmos@4.9.1': + resolution: {integrity: sha512-fPnfL4JsmJJ/jEYUhlznKfrEr2pMvJwBncGVcUC2Xi7Nlj0MrUMRE+UOrptl/lRV2W7l68Br+b9Ikzm0KiZZHg==} + engines: {node: '>=20.0.0'} + '@azure/identity-cache-persistence@1.2.0': resolution: {integrity: sha512-ZYr6iiE6d/Tkt4jck0cQv9grZ1BR4u5LXJmB1vblU/WGIHspO6Bv3TJMvQat2sQSOG4Wz7busgg0pajP4gNJzA==} engines: {node: '>=18.0.0'} @@ -4635,6 +4667,14 @@ packages: resolution: {integrity: sha512-iT53Sre2NJK6wzMWnvpjNiR3md597LZ3uK/5kQD2TkrY9vqhrY5bt2KwELNjkOWQ9n8S/92knj/QEykTtjMNqQ==} engines: {node: '>=18.0.0'} + '@azure/keyvault-common@2.0.0': + resolution: {integrity: sha512-wRLVaroQtOqfg60cxkzUkGKrKMsCP6uYXAOomOIysSMyt1/YM0eUn9LqieAWM8DLcU4+07Fio2YGpPeqUbpP9w==} + engines: {node: '>=18.0.0'} + + '@azure/keyvault-keys@4.10.0': + resolution: {integrity: sha512-eDT7iXoBTRZ2n3fLiftuGJFD+yjkiB1GNqzU2KbY1TLYeXeSPVTVgn2eJ5vmRTZ11978jy2Kg2wI7xa9Tyr8ag==} + engines: {node: '>=18.0.0'} + '@azure/logger@1.2.0': resolution: {integrity: sha512-0hKEzLhpw+ZTAfNJyRrn6s+V0nDWzXk9OjBr2TiGIu0OfMr5s2V4FpKLTAK3Ca5r5OKLbf4hkOGDPyiRjie/jA==} engines: {node: '>=18.0.0'} @@ -5054,6 +5094,10 @@ packages: resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} engines: {node: '>=12'} + '@electron/get@3.1.0': + resolution: {integrity: sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==} + engines: {node: '>=14'} + '@electron/notarize@2.5.0': resolution: {integrity: sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==} engines: {node: '>= 10.0.0'} @@ -5068,6 +5112,11 @@ packages: engines: {node: '>=22.12.0'} hasBin: true + '@electron/rebuild@4.0.3': + resolution: {integrity: sha512-u9vpTHRMkOYCs/1FLiSVAFZ7FbjsXK+bQuzviJZa+lG7BHZl1nz52/IcGvwa3sk80/fc3llutBkbCq10Vh8WQA==} + engines: {node: '>=22.12.0'} + hasBin: true + '@electron/universal@2.0.3': resolution: {integrity: sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==} engines: {node: '>=16.4'} @@ -7594,6 +7643,13 @@ packages: dmg-builder: 26.3.1 electron-builder-squirrel-windows: 26.3.1 + app-builder-lib@26.7.0: + resolution: {integrity: sha512-/UgCD8VrO79Wv8aBNpjMfsS1pIUfIPURoRn0Ik6tMe5avdZF+vQgl/juJgipcMmH3YS0BD573lCdCHyoi84USg==} + engines: {node: '>=14.0.0'} + peerDependencies: + dmg-builder: 26.7.0 + electron-builder-squirrel-windows: 26.7.0 + archiver-utils@2.1.0: resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} engines: {node: '>= 6'} @@ -7899,6 +7955,9 @@ packages: builder-util@26.3.1: resolution: {integrity: sha512-pplZEYBx1g15qvIOshpR1WTwjAwQM4ukhGgSNdYPnbuM6wLePq3+njy1sGfekCrJmUP+2xfuwuT9zEoUWfX5zQ==} + builder-util@26.4.1: + resolution: {integrity: sha512-FlgH43XZ50w3UtS1RVGDWOz8v9qMXPC7upMtKMtBEnYdt1OVoS61NYhKm/4x+cIaWqJTXua0+VVPI+fSPGXNIw==} + bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} @@ -8802,8 +8861,8 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dmg-builder@26.3.1: - resolution: {integrity: sha512-hYOlXCqmBxFXz8TZrAGm/Ym5ji+/Am5sgQaT+yZ/VULb9O+E7Lr1Z0HFnKk8GaaYfULV8PDVCYO4/bpQyb+BSg==} + dmg-builder@26.7.0: + resolution: {integrity: sha512-uOOBA3f+kW3o4KpSoMQ6SNpdXU7WtxlJRb9vCZgOvqhTz4b3GjcoWKstdisizNZLsylhTMv8TLHFPFW0Uxsj/g==} dmg-license@1.0.11: resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} @@ -8887,14 +8946,17 @@ packages: electron-builder-squirrel-windows@26.3.1: resolution: {integrity: sha512-WY0INnhIqy1TaMPK7sC9bD8/kdwE//e5CYN783ZqVgUdrMb9QgC4MUu4adiSDQzc4Om9InQaN9v/jS4OlmeV5g==} - electron-builder@26.3.1: - resolution: {integrity: sha512-e8utkPlf+VF94KX1M6/qZqCXsQMLKEASg+DNO5JWLtPZeKkvXS9Oyac8hb6HelvlGzEP02N7IDX6UFGjmvV66g==} + electron-builder@26.7.0: + resolution: {integrity: sha512-LoXbCvSFxLesPneQ/fM7FB4OheIDA2tjqCdUkKlObV5ZKGhYgi5VHPHO/6UUOUodAlg7SrkPx7BZJPby+Vrtbg==} engines: {node: '>=14.0.0'} hasBin: true electron-publish@26.3.1: resolution: {integrity: sha512-XYGYL/fpQULLW9slTVPelaUOGlKfOTmV2Uda3K+qzFzvNnkGJCj7L0nLVvMuj5cgxpAX+3BhO5HOUb4rv6jikA==} + electron-publish@26.6.0: + resolution: {integrity: sha512-LsyHMMqbvJ2vsOvuWJ19OezgF2ANdCiHpIucDHNiLhuI+/F3eW98ouzWSRmXXi82ZOPZXC07jnIravY4YYwCLQ==} + electron-to-chromium@1.5.155: resolution: {integrity: sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==} @@ -9342,6 +9404,10 @@ packages: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + formdata-node@4.4.1: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} @@ -9373,10 +9439,6 @@ packages: resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} engines: {node: '>=14.14'} - fs-extra@11.3.2: - resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} - engines: {node: '>=14.14'} - fs-extra@11.3.3: resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} engines: {node: '>=14.14'} @@ -9727,9 +9789,6 @@ packages: htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} @@ -11799,6 +11858,9 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + priorityqueuejs@2.0.0: + resolution: {integrity: sha512-19BMarhgpq3x4ccvVi8k2QpJZcymo/iFUcrhPd4V96kYGovOdTsWwy7fxChYi4QY+m2EnGBWSX9Buakz+tWNQQ==} + prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} @@ -12357,6 +12419,10 @@ packages: resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} + semaphore@1.1.0: + resolution: {integrity: sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==} + engines: {node: '>=0.8.0'} + semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} @@ -12825,10 +12891,9 @@ packages: engines: {node: '>=10'} deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - tar@7.5.2: - resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} + tar@7.5.7: + resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} engines: {node: '>=18'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me temp-file@3.4.0: resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} @@ -14532,6 +14597,12 @@ snapshots: transitivePeerDependencies: - supports-color + '@azure/core-http-compat@2.3.2(@azure/core-client@1.9.2)(@azure/core-rest-pipeline@1.20.0)': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-client': 1.9.2 + '@azure/core-rest-pipeline': 1.20.0 + '@azure/core-lro@2.7.2': dependencies: '@azure/abort-controller': 2.1.2 @@ -14584,6 +14655,23 @@ snapshots: fast-xml-parser: 4.5.3 tslib: 2.8.1 + '@azure/cosmos@4.9.1(@azure/core-client@1.9.2)': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.9.0 + '@azure/core-rest-pipeline': 1.20.0 + '@azure/core-tracing': 1.2.0 + '@azure/core-util': 1.11.0 + '@azure/keyvault-keys': 4.10.0(@azure/core-client@1.9.2) + '@azure/logger': 1.2.0 + fast-json-stable-stringify: 2.1.0 + priorityqueuejs: 2.0.0 + semaphore: 1.1.0 + tslib: 2.8.1 + transitivePeerDependencies: + - '@azure/core-client' + - supports-color + '@azure/identity-cache-persistence@1.2.0': dependencies: '@azure/core-auth': 1.9.0 @@ -14611,6 +14699,37 @@ snapshots: transitivePeerDependencies: - supports-color + '@azure/keyvault-common@2.0.0': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.9.0 + '@azure/core-client': 1.9.2 + '@azure/core-rest-pipeline': 1.20.0 + '@azure/core-tracing': 1.2.0 + '@azure/core-util': 1.11.0 + '@azure/logger': 1.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/keyvault-keys@4.10.0(@azure/core-client@1.9.2)': + dependencies: + '@azure-rest/core-client': 2.4.0 + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.9.0 + '@azure/core-http-compat': 2.3.2(@azure/core-client@1.9.2)(@azure/core-rest-pipeline@1.20.0) + '@azure/core-lro': 2.7.2 + '@azure/core-paging': 1.6.2 + '@azure/core-rest-pipeline': 1.20.0 + '@azure/core-tracing': 1.2.0 + '@azure/core-util': 1.11.0 + '@azure/keyvault-common': 2.0.0 + '@azure/logger': 1.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - '@azure/core-client' + - supports-color + '@azure/logger@1.2.0': dependencies: '@typespec/ts-http-runtime': 0.2.2 @@ -15269,6 +15388,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@electron/get@3.1.0': + dependencies: + debug: 4.4.3(supports-color@8.1.1) + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + '@electron/notarize@2.5.0': dependencies: debug: 4.4.3(supports-color@8.1.1) @@ -15301,19 +15434,37 @@ snapshots: node-gyp: 11.5.0 ora: 5.4.1 read-binary-file-arch: 1.0.6 - semver: 7.7.2 + semver: 7.7.3 tar: 6.2.1 yargs: 17.7.2 transitivePeerDependencies: - supports-color + '@electron/rebuild@4.0.3': + dependencies: + '@malept/cross-spawn-promise': 2.0.0 + debug: 4.4.3(supports-color@8.1.1) + detect-libc: 2.0.3 + got: 11.8.6 + graceful-fs: 4.2.11 + node-abi: 4.24.0 + node-api-version: 0.2.1 + node-gyp: 11.5.0 + ora: 5.4.1 + read-binary-file-arch: 1.0.6 + semver: 7.7.3 + tar: 7.5.7 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + '@electron/universal@2.0.3': dependencies: '@electron/asar': 3.4.1 '@malept/cross-spawn-promise': 2.0.0 debug: 4.4.3(supports-color@8.1.1) dir-compare: 4.2.0 - fs-extra: 11.3.2 + fs-extra: 11.3.3 minimatch: 9.0.5 plist: 3.1.0 transitivePeerDependencies: @@ -15510,7 +15661,7 @@ snapshots: '@oclif/plugin-commands': 4.1.21 '@oclif/plugin-help': 6.2.26 '@oclif/plugin-not-found': 3.2.65(@types/node@20.19.23) - semver: 7.7.2 + semver: 7.7.3 table: 6.9.0 transitivePeerDependencies: - '@types/node' @@ -16200,7 +16351,7 @@ snapshots: dependencies: debug: 4.4.3(supports-color@8.1.1) fs-extra: 9.1.0 - lodash: 4.17.21 + lodash: 4.17.23 tmp-promise: 3.0.3 transitivePeerDependencies: - supports-color @@ -16682,7 +16833,7 @@ snapshots: '@npmcli/fs@4.0.0': dependencies: - semver: 7.7.2 + semver: 7.7.3 '@oclif/core@4.5.2': dependencies: @@ -16739,7 +16890,7 @@ snapshots: dependencies: '@oclif/core': 4.8.0 '@oclif/table': 0.4.6 - lodash: 4.17.21 + lodash: 4.17.23 object-treeify: 4.0.1 transitivePeerDependencies: - bufferutil @@ -16848,7 +16999,7 @@ snapshots: '@types/shimmer': 1.2.0 import-in-the-middle: 1.13.2 require-in-the-middle: 7.5.2 - semver: 7.7.2 + semver: 7.7.3 shimmer: 1.2.1 transitivePeerDependencies: - supports-color @@ -17529,7 +17680,7 @@ snapshots: chalk: 4.1.2 debug: 4.4.3(supports-color@8.1.1) js-yaml: 3.14.2 - lodash: 4.17.21 + lodash: 4.17.23 pluralize: 2.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 @@ -18537,7 +18688,7 @@ snapshots: app-builder-bin@5.0.0-alpha.12: {} - app-builder-lib@26.3.1(dmg-builder@26.3.1)(electron-builder-squirrel-windows@26.3.1): + app-builder-lib@26.3.1(dmg-builder@26.7.0)(electron-builder-squirrel-windows@26.3.1): dependencies: '@develar/schema-utils': 2.6.5 '@electron/asar': 3.4.1 @@ -18554,11 +18705,11 @@ snapshots: chromium-pickle-js: 0.2.0 ci-info: 4.3.1 debug: 4.4.3(supports-color@8.1.1) - dmg-builder: 26.3.1(electron-builder-squirrel-windows@26.3.1) + dmg-builder: 26.7.0(electron-builder-squirrel-windows@26.3.1) dotenv: 16.5.0 dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 26.3.1(dmg-builder@26.3.1) + electron-builder-squirrel-windows: 26.3.1(dmg-builder@26.7.0) electron-publish: 26.3.1 fs-extra: 10.1.0 hosted-git-info: 4.1.0 @@ -18578,6 +18729,49 @@ snapshots: transitivePeerDependencies: - supports-color + app-builder-lib@26.7.0(dmg-builder@26.7.0)(electron-builder-squirrel-windows@26.3.1): + dependencies: + '@develar/schema-utils': 2.6.5 + '@electron/asar': 3.4.1 + '@electron/fuses': 1.8.0 + '@electron/get': 3.1.0 + '@electron/notarize': 2.5.0 + '@electron/osx-sign': 1.3.3 + '@electron/rebuild': 4.0.3 + '@electron/universal': 2.0.3 + '@malept/flatpak-bundler': 0.4.0 + '@types/fs-extra': 9.0.13 + async-exit-hook: 2.0.1 + builder-util: 26.4.1 + builder-util-runtime: 9.5.1 + chromium-pickle-js: 0.2.0 + ci-info: 4.3.1 + debug: 4.4.3(supports-color@8.1.1) + dmg-builder: 26.7.0(electron-builder-squirrel-windows@26.3.1) + dotenv: 16.5.0 + dotenv-expand: 11.0.7 + ejs: 3.1.10 + electron-builder-squirrel-windows: 26.3.1(dmg-builder@26.7.0) + electron-publish: 26.6.0 + fs-extra: 10.1.0 + hosted-git-info: 4.1.0 + isbinaryfile: 5.0.0 + jiti: 2.5.1 + js-yaml: 4.1.1 + json5: 2.2.3 + lazy-val: 1.0.5 + minimatch: 10.1.1 + plist: 3.1.0 + proper-lockfile: 4.1.2 + resedit: 1.7.2 + semver: 7.7.3 + tar: 7.5.7 + temp-file: 3.4.0 + tiny-async-pool: 1.3.0 + which: 5.0.0 + transitivePeerDependencies: + - supports-color + archiver-utils@2.1.0: dependencies: glob: 7.2.3 @@ -18680,7 +18874,7 @@ snapshots: async@2.6.4: dependencies: - lodash: 4.17.21 + lodash: 4.17.23 async@3.2.6: {} @@ -18966,6 +19160,27 @@ snapshots: transitivePeerDependencies: - supports-color + builder-util@26.4.1: + dependencies: + 7zip-bin: 5.2.0 + '@types/debug': 4.1.12 + app-builder-bin: 5.0.0-alpha.12 + builder-util-runtime: 9.5.1 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3(supports-color@8.1.1) + fs-extra: 10.1.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + js-yaml: 4.1.1 + sanitize-filename: 1.6.3 + source-map-support: 0.5.21 + stat-mode: 1.0.0 + temp-file: 3.4.0 + tiny-async-pool: 1.3.0 + transitivePeerDependencies: + - supports-color + bundle-name@4.1.0: dependencies: run-applescript: 7.0.0 @@ -19016,7 +19231,7 @@ snapshots: minipass-pipeline: 1.2.4 p-map: 7.0.4 ssri: 12.0.0 - tar: 7.5.2 + tar: 7.5.7 unique-filename: 4.0.0 cacheable-lookup@5.0.4: {} @@ -19025,7 +19240,7 @@ snapshots: dependencies: clone-response: 1.0.3 get-stream: 5.2.0 - http-cache-semantics: 4.1.1 + http-cache-semantics: 4.2.0 keyv: 4.5.4 lowercase-keys: 2.0.0 normalize-url: 6.1.0 @@ -19963,10 +20178,10 @@ snapshots: dependencies: path-type: 4.0.0 - dmg-builder@26.3.1(electron-builder-squirrel-windows@26.3.1): + dmg-builder@26.7.0(electron-builder-squirrel-windows@26.3.1): dependencies: - app-builder-lib: 26.3.1(dmg-builder@26.3.1)(electron-builder-squirrel-windows@26.3.1) - builder-util: 26.3.1 + app-builder-lib: 26.7.0(dmg-builder@26.7.0)(electron-builder-squirrel-windows@26.3.1) + builder-util: 26.4.1 fs-extra: 10.1.0 iconv-lite: 0.6.3 js-yaml: 4.1.1 @@ -20077,23 +20292,23 @@ snapshots: dependencies: jake: 10.8.7 - electron-builder-squirrel-windows@26.3.1(dmg-builder@26.3.1): + electron-builder-squirrel-windows@26.3.1(dmg-builder@26.7.0): dependencies: - app-builder-lib: 26.3.1(dmg-builder@26.3.1)(electron-builder-squirrel-windows@26.3.1) + app-builder-lib: 26.3.1(dmg-builder@26.7.0)(electron-builder-squirrel-windows@26.3.1) builder-util: 26.3.1 electron-winstaller: 5.4.0 transitivePeerDependencies: - dmg-builder - supports-color - electron-builder@26.3.1(electron-builder-squirrel-windows@26.3.1): + electron-builder@26.7.0(electron-builder-squirrel-windows@26.3.1): dependencies: - app-builder-lib: 26.3.1(dmg-builder@26.3.1)(electron-builder-squirrel-windows@26.3.1) - builder-util: 26.3.1 + app-builder-lib: 26.7.0(dmg-builder@26.7.0)(electron-builder-squirrel-windows@26.3.1) + builder-util: 26.4.1 builder-util-runtime: 9.5.1 chalk: 4.1.2 ci-info: 4.3.1 - dmg-builder: 26.3.1(electron-builder-squirrel-windows@26.3.1) + dmg-builder: 26.7.0(electron-builder-squirrel-windows@26.3.1) fs-extra: 10.1.0 lazy-val: 1.0.5 simple-update-notifier: 2.0.0 @@ -20115,6 +20330,19 @@ snapshots: transitivePeerDependencies: - supports-color + electron-publish@26.6.0: + dependencies: + '@types/fs-extra': 9.0.13 + builder-util: 26.4.1 + builder-util-runtime: 9.5.1 + chalk: 4.1.2 + form-data: 4.0.5 + fs-extra: 10.1.0 + lazy-val: 1.0.5 + mime: 2.6.0 + transitivePeerDependencies: + - supports-color + electron-to-chromium@1.5.155: {} electron-to-chromium@1.5.286: {} @@ -20726,6 +20954,14 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + formdata-node@4.4.1: dependencies: node-domexception: 1.0.0 @@ -20755,18 +20991,11 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 - fs-extra@11.3.2: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.2.0 - universalify: 2.0.1 - fs-extra@11.3.3: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.0 universalify: 2.0.1 - optional: true fs-extra@7.0.1: dependencies: @@ -20934,7 +21163,7 @@ snapshots: es6-error: 4.1.1 matcher: 3.0.0 roarr: 2.15.4 - semver: 7.7.2 + semver: 7.7.3 serialize-error: 7.0.1 optional: true @@ -21194,8 +21423,6 @@ snapshots: domutils: 3.2.2 entities: 4.5.0 - http-cache-semantics@4.1.1: {} - http-cache-semantics@4.2.0: {} http-deceiver@1.2.7: {} @@ -21384,7 +21611,7 @@ snapshots: code-excerpt: 4.0.0 indent-string: 5.0.0 is-in-ci: 0.1.0 - lodash: 4.17.21 + lodash: 4.17.23 patch-console: 2.0.0 react: 18.3.1 react-reconciler: 0.29.2(react@18.3.1) @@ -21654,7 +21881,7 @@ snapshots: '@babel/parser': 7.28.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color @@ -22138,7 +22365,7 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color @@ -22359,7 +22586,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.7.2 + semver: 7.7.3 jszip@3.10.1: dependencies: @@ -22688,7 +22915,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 make-error@1.3.6: {} @@ -23394,11 +23621,11 @@ snapshots: node-abi@3.77.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 node-abi@4.24.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 node-addon-api@1.7.2: optional: true @@ -23409,7 +23636,7 @@ snapshots: node-api-version@0.2.1: dependencies: - semver: 7.7.2 + semver: 7.7.3 node-domexception@1.0.0: {} @@ -23450,8 +23677,8 @@ snapshots: make-fetch-happen: 14.0.3 nopt: 8.1.0 proc-log: 5.0.0 - semver: 7.7.2 - tar: 7.5.2 + semver: 7.7.3 + tar: 7.5.7 tinyglobby: 0.2.15 which: 5.0.0 transitivePeerDependencies: @@ -23490,7 +23717,7 @@ snapshots: normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -23937,6 +24164,8 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.2.0 + priorityqueuejs@2.0.0: {} + prismjs@1.30.0: {} proc-log@5.0.0: {} @@ -24422,7 +24651,7 @@ snapshots: css-select: 4.3.0 dom-converter: 0.2.0 htmlparser2: 6.1.0 - lodash: 4.17.21 + lodash: 4.17.23 strip-ansi: 6.0.1 require-directory@2.1.1: {} @@ -24672,6 +24901,8 @@ snapshots: '@types/node-forge': 1.3.11 node-forge: 1.3.2 + semaphore@1.1.0: {} + semver-compare@1.0.0: optional: true @@ -24921,7 +25152,7 @@ snapshots: simple-update-notifier@2.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 sisteransi@1.0.5: {} @@ -25282,7 +25513,7 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - tar@7.5.2: + tar@7.5.7: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 diff --git a/ts/tools/scripts/getKeys.config.json b/ts/tools/scripts/getKeys.config.json index 32cfc93c49..29986bb1a2 100644 --- a/ts/tools/scripts/getKeys.config.json +++ b/ts/tools/scripts/getKeys.config.json @@ -42,7 +42,7 @@ "SPEECH_SDK_ENDPOINT", "SPEECH_SDK_KEY", "SPEECH_SDK_REGION", - "MONGODB_CONNECTION_STRING", + "COSMOSDB_CONNECTION_STRING", "MSGRAPH_APP_CLIENTID", "MSGRAPH_APP_CLIENTSECRET", "MSGRAPH_APP_TENANTID", @@ -63,7 +63,12 @@ "WIKIPEDIA_CLIENT_ID" ], "private": ["SPOTIFY_APP_CLI", "SPOTIFY_APP_CLISEC", "SPOTIFY_APP_PORT"], - "delete": ["MSGRAPH_APP_PASSWD", "MSGRAPH_APP_USERNAME", "BING_API_KEY"] + "delete": [ + "MSGRAPH_APP_PASSWD", + "MSGRAPH_APP_USERNAME", + "BING_API_KEY", + "MONGODB_CONNECTION_STRING" + ] }, "vault": { "shared": "aisystems"