From b84ed3020026321f2b6b1bb209ec9828f10fac6d Mon Sep 17 00:00:00 2001 From: skullcrushercmd Date: Sat, 15 Aug 2026 17:13:39 -0400 Subject: [PATCH] fix: restore local development readiness --- apps/api/dev/checkModelCapabilities.ts | 2 +- apps/api/dev/cloneRedisDb.bun.ts | 2 +- apps/api/dev/testApi.ts | 2 +- apps/api/dev/testImageGenProviders.ts | 4 +- apps/api/dev/testModelLiveProbes.ts | 12 +- apps/api/dev/testNanoBananaProviders.ts | 4 +- apps/api/dev/updateproviders.ts | 2 +- apps/api/modules/dataManager.ts | 4 +- apps/api/modules/errorClassification.ts | 5 +- apps/api/modules/errorLogger.ts | 8 +- apps/api/modules/geminiMediaValidation.ts | 6 +- apps/api/modules/imageFetch.ts | 6 +- apps/api/modules/mediaParsing.ts | 3 +- apps/api/modules/openaiAudio.ts | 2 +- apps/api/modules/openaiFallbacks.ts | 12 +- apps/api/modules/openaiRequestSupport.ts | 2 +- apps/api/modules/openaiResponsesFormat.ts | 8 +- apps/api/modules/requestQueue.ts | 4 +- apps/api/modules/validators.ts | 2 +- apps/api/package.json | 1 + apps/api/providers/gemini.ts | 2 +- apps/api/providers/handler.ts | 4 +- apps/api/providers/openai.ts | 20 +- apps/api/providers/openrouter.ts | 8 +- apps/api/routes/anthropic.ts | 2 +- apps/api/routes/gemini.ts | 2 +- apps/api/routes/groq.ts | 2 +- apps/api/routes/nativeProviders.ts | 56 +-- apps/api/routes/openai.ts | 76 ++-- apps/api/server.launcher.bun.ts | 5 +- apps/api/ws/realtime.ts | 8 +- apps/homepage/package.json | 4 +- apps/homepage/serve.js | 34 +- apps/homepage/serve.port-safety.test.mjs | 134 +++++++ apps/ui/README.md | 25 +- apps/ui/customizations/README.md | 28 ++ apps/ui/package.json | 3 +- apps/ui/scripts/activate-node.sh | 32 ++ apps/ui/scripts/apply-customizations.sh | 33 ++ apps/ui/scripts/capture-customizations.sh | 63 ++++ apps/ui/scripts/dev.sh | 32 +- apps/ui/scripts/start.sh | 35 +- apps/ui/scripts/sync-config.sh | 5 + bun.lock | 424 ++++++++++++++++++--- package.json | 29 +- scripts/install-frontend.sh | 118 ++++++ scripts/run-frontend-stack.sh | 430 ++++++++++++++++------ scripts/with-bun-path.sh | 32 ++ tsconfig.json | 7 +- turbo.json | 4 + 50 files changed, 1401 insertions(+), 347 deletions(-) create mode 100644 apps/homepage/serve.port-safety.test.mjs create mode 100644 apps/ui/customizations/README.md create mode 100755 apps/ui/scripts/activate-node.sh create mode 100755 apps/ui/scripts/apply-customizations.sh create mode 100755 apps/ui/scripts/capture-customizations.sh create mode 100755 scripts/install-frontend.sh diff --git a/apps/api/dev/checkModelCapabilities.ts b/apps/api/dev/checkModelCapabilities.ts index e4c024e..70cb8cf 100644 --- a/apps/api/dev/checkModelCapabilities.ts +++ b/apps/api/dev/checkModelCapabilities.ts @@ -17,7 +17,7 @@ const modelsPath = path.resolve(__dirname, '..', 'models.json'); const patterns = { imageInput: [/vision/, /gpt-4o/, /gpt-4-vision/, /vl/, /multi_modal/], imageOutput: [/image/, /imagen/, /dall-e/, /veo/, /sora/, /(?:^|[-_/])imagine(?:[-_/]|$)/], - audioInput: [/whisper/, /asr/, /transcribe/, /audio\-input/], + audioInput: [/whisper/, /asr/, /transcribe/, /audio-input/], audioOutput: [/tts/, /audio/], toolCalling: [/function/, /tool[_-]?call(?:ing)?/, /tool-use/, /deep-research/, /computer-use/, /^o3/, /^o4/, /(?:^|[-_/])agent(?:ic)?(?:[-_/]|$)/, /(?:^|[-_/])reasoner(?:[-_/]|$)/], }; diff --git a/apps/api/dev/cloneRedisDb.bun.ts b/apps/api/dev/cloneRedisDb.bun.ts index 22ab69f..e18b63e 100644 --- a/apps/api/dev/cloneRedisDb.bun.ts +++ b/apps/api/dev/cloneRedisDb.bun.ts @@ -1,6 +1,6 @@ import dotenv from 'dotenv'; import path from 'node:path'; -import { createClient } from '../../langgraph-control-plane/node_modules/redis'; +import { createClient } from 'redis'; function log(message: string): void { console.log(`[experimental-redis-clone] ${message}`); diff --git a/apps/api/dev/testApi.ts b/apps/api/dev/testApi.ts index ef8f1ce..cfb7163 100644 --- a/apps/api/dev/testApi.ts +++ b/apps/api/dev/testApi.ts @@ -18,7 +18,7 @@ async function readResponseBody(response: globalThis.Response): Promise const decoder = new TextDecoder(); let result = ''; - while (true) { + for (;;) { const { done, value } = await reader.read(); if (done) break; if (value) { diff --git a/apps/api/dev/testImageGenProviders.ts b/apps/api/dev/testImageGenProviders.ts index a05d9b2..92dc339 100644 --- a/apps/api/dev/testImageGenProviders.ts +++ b/apps/api/dev/testImageGenProviders.ts @@ -355,6 +355,8 @@ main().catch((err) => { process.exit(1); }).finally(async () => { if (redis) { - try { await redis.quit(); } catch {} + try { await redis.quit(); } catch { + // Best-effort cleanup for this developer probe. + } } }); diff --git a/apps/api/dev/testModelLiveProbes.ts b/apps/api/dev/testModelLiveProbes.ts index 1177486..e5c96a1 100644 --- a/apps/api/dev/testModelLiveProbes.ts +++ b/apps/api/dev/testModelLiveProbes.ts @@ -1170,7 +1170,7 @@ const SAMPLE_AUDIO_BASE64 = 'UklGRsQPAABXQVZFZm10IBAAAAABAAEAQB8AAIA+AAACABAAZGF0YaAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'; function resolveProviderUrl(p: LoadedProviderData, endpointHint?: EndpointHint): string { - let url = p.provider_url || ''; + const url = p.provider_url || ''; if (!p.id.includes('openai')) return url; @@ -1231,7 +1231,7 @@ function resolveModerationsUrl(p: LoadedProviderData): string { } function resolveCompletionsUrl(p: LoadedProviderData): string { - let url = p.provider_url || ''; + const url = p.provider_url || ''; if (!url) return 'https://api.openai.com/v1/completions'; if (url.includes('/chat/completions')) return url.replace('/chat/completions', '/completions'); if (url.includes('/responses')) return url.replace('/responses', '/completions'); @@ -1372,7 +1372,7 @@ async function withProviderLimit(providerId: string, fn: () => Promise): P const semaphore = isOpenRouter ? openrouterSemaphore : getProviderSemaphore(providerId); await semaphore.acquire(); try { - while (true) { + for (;;) { const now = Date.now(); const providerWaitUntil = Math.max( rateLimitUntil.get(providerId) || 0, @@ -1457,7 +1457,7 @@ function pickProvider( function getProbePrompt(testName: string, isRelace: boolean): string { if (isRelace) { - return '\nfunction greet() {\n return \"hello\";\n}\n\n\nChange the greeting to \"goodbye\".\n'; + return '\nfunction greet() {\n return "hello";\n}\n\n\nChange the greeting to "goodbye".\n'; } switch (testName) { case 'image_input': @@ -1735,7 +1735,7 @@ async function testCapability( return message; }; - while (true) { + for (;;) { try { if (mode === 'stream' && typeof (provider as any).sendMessageStream === 'function') { const message = buildTestMessage(); @@ -2464,7 +2464,7 @@ async function main() { if (endpointHintOverride) endpointTried.add(endpointHintOverride); let retriesLeft = MAX_RETRIES; - while (true) { + for (;;) { const imageUrlOverride = key === 'image_input' ? SAMPLE_IMAGE_URLS[imageUrlIndex] : undefined; if (!provider) { outcome = 'fail: no valid provider'; diff --git a/apps/api/dev/testNanoBananaProviders.ts b/apps/api/dev/testNanoBananaProviders.ts index 4d0bc53..c25d8f7 100644 --- a/apps/api/dev/testNanoBananaProviders.ts +++ b/apps/api/dev/testNanoBananaProviders.ts @@ -148,6 +148,8 @@ main().catch((err) => { process.exit(1); }).finally(async () => { if (redis) { - try { await redis.quit(); } catch {} + try { await redis.quit(); } catch { + // Best-effort cleanup for this developer probe. + } } }); diff --git a/apps/api/dev/updateproviders.ts b/apps/api/dev/updateproviders.ts index 11db8f9..38de09f 100644 --- a/apps/api/dev/updateproviders.ts +++ b/apps/api/dev/updateproviders.ts @@ -60,7 +60,7 @@ async function updateProviders( disabled: false // Add required disabled field }; - let providers = await dataManager.load('providers'); + const providers = await dataManager.load('providers'); if (!Array.isArray(providers)) { console.error('Invalid providers data format. Expected an array of providers.'); process.exit(1); diff --git a/apps/api/modules/dataManager.ts b/apps/api/modules/dataManager.ts index b6f6f17..8569ad6 100644 --- a/apps/api/modules/dataManager.ts +++ b/apps/api/modules/dataManager.ts @@ -1463,8 +1463,8 @@ class DataManager { dataSourcePreference === 'redis' && hasRedisKeys ? this.normalizeKeysSchema(redisKeys).normalized : dataSourcePreference === 'filesystem' && - hasFsKeys && - !fsInvalid + hasFsKeys && + !fsInvalid ? this.normalizeKeysSchema(fsKeys).normalized : hasRedisKeys ? this.normalizeKeysSchema(redisKeys).normalized diff --git a/apps/api/modules/errorClassification.ts b/apps/api/modules/errorClassification.ts index 2564a15..73e6b29 100644 --- a/apps/api/modules/errorClassification.ts +++ b/apps/api/modules/errorClassification.ts @@ -990,7 +990,8 @@ export function isProviderAuthConfigurationError(error: any): boolean { Boolean((error as any)?.lastProviderErrorSummary) || Boolean((error as any)?.errorDetails?.lastProviderId) || Boolean((error as any)?.errorDetails?.lastProviderError) || - Boolean((error as any)?.errorDetails?.lastProviderErrorSummary); message.includes('unsupported parameter') || + Boolean((error as any)?.errorDetails?.lastProviderErrorSummary) || + message.includes('unsupported parameter') || message.includes('not supported with this model') || message.includes('invalid_request_error') || message.includes('resource has been exhausted') || @@ -1000,7 +1001,7 @@ export function isProviderAuthConfigurationError(error: any): boolean { message.includes('invalid_api_key') || message.includes('key_invalid') || message.includes('401') || - message.includes('402'); + message.includes('402') || Boolean((error as any)?.errorDetails?.lastProviderId) || Boolean((error as any)?.errorDetails?.attemptedProviders); const wrappedAuthOrQuotaSignal = diff --git a/apps/api/modules/errorLogger.ts b/apps/api/modules/errorLogger.ts index bde86e6..9f13659 100644 --- a/apps/api/modules/errorLogger.ts +++ b/apps/api/modules/errorLogger.ts @@ -22,7 +22,7 @@ function sanitizeProviderErrorText(value: string): string { const label = match.toLowerCase().includes('authorization') ? 'authorization' : 'api_key'; return `${label}${separator} [redacted]`; }) - .replace(/\bauthorization\b\s*[:=]\s*bearer\s+[A-Za-z0-9._\-]+/gi, 'authorization: [redacted]'); + .replace(/\bauthorization\b\s*[:=]\s*bearer\s+[A-Za-z0-9._-]+/gi, 'authorization: [redacted]'); } function sanitizeProviderErrorValue(value: T): T { @@ -359,7 +359,11 @@ function classifyFingerprintErrorText(text: string): string { const lower = normalizeFingerprintString(text).toLowerCase(); if (!lower) return ''; - const quotaMetricMatch = lower.match(/quota exceeded for metric:?\s*([^,]+)/i) || lower.match(/quota exceeded for metric:\s*([^,]+)/i); + const normalizedMetricText = lower.replace( + `quota exceeded for metric:${String.fromCharCode(31)}`, + 'quota exceeded for metric:' + ); + const quotaMetricMatch = normalizedMetricText.match(/quota exceeded for metric:\s*([^,]+)/i); if (quotaMetricMatch?.[1]) { return `quota:${quotaMetricMatch[1].trim()}`; } diff --git a/apps/api/modules/geminiMediaValidation.ts b/apps/api/modules/geminiMediaValidation.ts index eaa1b49..96fa59c 100644 --- a/apps/api/modules/geminiMediaValidation.ts +++ b/apps/api/modules/geminiMediaValidation.ts @@ -470,7 +470,7 @@ export function validateGeminiModelCapabilityRequest(modelId: string, body: unkn const hasToolCallingHint = requestJson.includes('tool_choice') || requestJson.includes('tool_calls') || - requestJson.includes('\"tools\"') || + requestJson.includes('"tools"') || requestJson.includes('function_declarations') || requestJson.includes('function_calling'); @@ -505,7 +505,7 @@ export function validateGeminiModelCapabilityRequest(modelId: string, body: unkn requestJson.includes('image_base64') || requestJson.includes('b64_json') || requestJson.includes('response_format":"b64_json') || - requestJson.includes('response_format\":\"b64_json') || + requestJson.includes('response_format":"b64_json') || requestJson.includes('response_format') && requestJson.includes('b64_json') || (requestJson.includes('modalities') && requestJson.includes('image')) || (requestJson.includes('response_format') && requestJson.includes('image')); @@ -688,7 +688,7 @@ export function validateGeminiModelCapabilityRequest(modelId: string, body: unkn requestJson.includes('function_calling') || requestJson.includes('parallel_tool_calls') || requestJson.includes('tool_calls') || - requestJson.includes('\"tools\"') || + requestJson.includes('"tools"') || requestJson.includes('[probe:tool_calling]'); const hasUnsupportedAudioHintForLyria = diff --git a/apps/api/modules/imageFetch.ts b/apps/api/modules/imageFetch.ts index 87ba0f1..d3ef346 100644 --- a/apps/api/modules/imageFetch.ts +++ b/apps/api/modules/imageFetch.ts @@ -149,14 +149,16 @@ async function readResponseBodyWithLimit( const chunks: Buffer[] = []; let total = 0; - while (true) { + for (;;) { const { done, value } = await reader.read(); if (done) break; if (!value || value.length === 0) continue; const chunk = Buffer.from(value); total += chunk.length; if (maxBytes > 0 && total > maxBytes) { - try { await reader.cancel(); } catch {} + try { await reader.cancel(); } catch { + // The abort and size error below remain authoritative. + } controller?.abort(new Error('Image exceeds max size.')); throw new Error('Image exceeds max size.'); } diff --git a/apps/api/modules/mediaParsing.ts b/apps/api/modules/mediaParsing.ts index fee63af..4f8f48d 100644 --- a/apps/api/modules/mediaParsing.ts +++ b/apps/api/modules/mediaParsing.ts @@ -1,5 +1,6 @@ export function normalizeInputAudio(audio: { data: string; format: string }): { buffer: Buffer; mimeType: string; extension: string } | null { - let { data, format } = audio; + let { data } = audio; + const { format } = audio; let mimeType = format; if (typeof data === 'string' && data.startsWith('data:')) { diff --git a/apps/api/modules/openaiAudio.ts b/apps/api/modules/openaiAudio.ts index 8c2cb64..d719583 100644 --- a/apps/api/modules/openaiAudio.ts +++ b/apps/api/modules/openaiAudio.ts @@ -69,7 +69,7 @@ export async function forwardTtsToOpenAI(options: { if (stream && upstreamRes.body) { const reader = upstreamRes.body.getReader(); - while (true) { + for (;;) { const { done, value } = await reader.read(); if (done) break; if (value && value.length > 0) response.write(value); diff --git a/apps/api/modules/openaiFallbacks.ts b/apps/api/modules/openaiFallbacks.ts index ce8bf48..6159d2a 100644 --- a/apps/api/modules/openaiFallbacks.ts +++ b/apps/api/modules/openaiFallbacks.ts @@ -1442,7 +1442,9 @@ function sendResponsesTextResult(params: { response.setHeader('Content-Type', 'text/event-stream'); response.setHeader('Cache-Control', 'no-cache'); response.setHeader('Connection', 'keep-alive'); - try { (response as any).flushHeaders?.(); } catch {} + try { (response as any).flushHeaders?.(); } catch { + // Flushing is optional for compatible response implementations. + } const pendingMessageItem = createResponsesMessageItem('', { id: messageId, status: 'in_progress' }); const finalMessageItem = Array.isArray(responseBody.output) @@ -1586,7 +1588,9 @@ export async function handleImageGenFallbackFromChatOrResponses(params: { response.setHeader('Content-Type', 'text/event-stream'); response.setHeader('Cache-Control', 'no-cache'); response.setHeader('Connection', 'keep-alive'); - try { (response as any).flushHeaders?.(); } catch {} + try { (response as any).flushHeaders?.(); } catch { + // Flushing is optional for compatible response implementations. + } const firstChunk = { id, @@ -1715,7 +1719,9 @@ export async function handleVideoGenFallbackFromChatOrResponses(params: { response.setHeader('Content-Type', 'text/event-stream'); response.setHeader('Cache-Control', 'no-cache'); response.setHeader('Connection', 'keep-alive'); - try { (response as any).flushHeaders?.(); } catch {} + try { (response as any).flushHeaders?.(); } catch { + // Flushing is optional for compatible response implementations. + } const firstChunk = { id, diff --git a/apps/api/modules/openaiRequestSupport.ts b/apps/api/modules/openaiRequestSupport.ts index 0a8c150..2d3b64b 100644 --- a/apps/api/modules/openaiRequestSupport.ts +++ b/apps/api/modules/openaiRequestSupport.ts @@ -131,7 +131,7 @@ export function createSseDataParser( return (chunk: string) => { buffer += chunk; - while (true) { + for (;;) { const lineBreakIndex = buffer.indexOf('\n'); if (lineBreakIndex === -1) break; diff --git a/apps/api/modules/openaiResponsesFormat.ts b/apps/api/modules/openaiResponsesFormat.ts index 17fb7b5..3590f52 100644 --- a/apps/api/modules/openaiResponsesFormat.ts +++ b/apps/api/modules/openaiResponsesFormat.ts @@ -61,7 +61,7 @@ function buildResponsesFunctionCallItem( typeof rawCall?.call_id === 'string' && rawCall.call_id.trim() ? rawCall.call_id.trim() : typeof rawCall?.tool_call_id === 'string' && - rawCall.tool_call_id.trim() + rawCall.tool_call_id.trim() ? rawCall.tool_call_id.trim() : undefined; const id = normalizeFunctionCallItemId(rawCall?.id, callId); @@ -224,7 +224,7 @@ export function buildResponsesUsage( typeof usage?.total_tokens === 'number' ? usage.total_tokens : typeof inputTokens === 'number' || - typeof outputTokens === 'number' + typeof outputTokens === 'number' ? (inputTokens || 0) + (outputTokens || 0) : undefined; @@ -237,7 +237,7 @@ export function buildResponsesUsage( input_tokens_details: { cached_tokens: 0 } - } + } : {}), ...(typeof outputTokens === 'number' ? { output_tokens: outputTokens } @@ -247,7 +247,7 @@ export function buildResponsesUsage( output_tokens_details: { reasoning_tokens: 0 } - } + } : {}), ...(typeof totalTokens === 'number' ? { total_tokens: totalTokens } diff --git a/apps/api/modules/requestQueue.ts b/apps/api/modules/requestQueue.ts index 7e63b02..dafd288 100644 --- a/apps/api/modules/requestQueue.ts +++ b/apps/api/modules/requestQueue.ts @@ -640,7 +640,7 @@ let cachedCpuCount: number | null = null; function getSystemMemoryBytes(): number { if (cachedSystemMemoryBytes !== null) return cachedSystemMemoryBytes; try { - cachedSystemMemoryBytes = Number(require('os').totalmem?.() || 0); + cachedSystemMemoryBytes = Number(os.totalmem?.() || 0); } catch { cachedSystemMemoryBytes = 0; } @@ -650,7 +650,7 @@ function getSystemMemoryBytes(): number { function getCpuCount(): number { if (cachedCpuCount !== null) return cachedCpuCount; try { - const cpus = require('os').cpus?.(); + const cpus = os.cpus?.(); cachedCpuCount = Array.isArray(cpus) && cpus.length > 0 ? cpus.length : 1; } catch { cachedCpuCount = 1; diff --git a/apps/api/modules/validators.ts b/apps/api/modules/validators.ts index eeb3d5e..5b732cc 100644 --- a/apps/api/modules/validators.ts +++ b/apps/api/modules/validators.ts @@ -1,4 +1,4 @@ -import Ajv, { ErrorObject } from 'ajv'; +import { Ajv, type ErrorObject } from 'ajv'; export interface AdminProviderPayload { providerId: string; diff --git a/apps/api/package.json b/apps/api/package.json index 2d8c624..c73cd81 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -56,6 +56,7 @@ "concurrently": "^10.0.3", "eslint": "^8.57.1", "jest": "^30.4.2", + "redis": "^4.7.0", "rimraf": "^5.0.10", "ts-jest": "^29.4.11", "ts-node-dev": "^1.1.8", diff --git a/apps/api/providers/gemini.ts b/apps/api/providers/gemini.ts index 49874c4..f71fce7 100644 --- a/apps/api/providers/gemini.ts +++ b/apps/api/providers/gemini.ts @@ -1086,7 +1086,7 @@ export class GeminiAI implements IAIProvider { */ async sendMessage(message: IMessage): Promise { const originalParts = Array.isArray((message as any)?.parts) ? (message as any).parts : null; - let retriedWithInlinedRemoteMedia = false; + const retriedWithInlinedRemoteMedia = false; if (Array.isArray((message as any)?.parts) && (message as any).parts.length > 0) { try { (message as any).parts = await inlineUnsupportedRemoteImageParts( diff --git a/apps/api/providers/handler.ts b/apps/api/providers/handler.ts index b04ed79..100807c 100644 --- a/apps/api/providers/handler.ts +++ b/apps/api/providers/handler.ts @@ -1841,7 +1841,7 @@ export class MessageHandler { Number(modelData?.disabled_at || 0) ); if (newestFailureAt <= 0) { - return Boolean(provider.disabled || modelData?.disabled) + return provider.disabled || modelData?.disabled ? 'transient' : null; } @@ -3674,7 +3674,7 @@ export class MessageHandler { : typeof (modelStats as any) ?.token_generation_speed === 'number' && - (modelStats as any) + (modelStats as any) .token_generation_speed > 0 ? (modelStats as any) .token_generation_speed diff --git a/apps/api/providers/openai.ts b/apps/api/providers/openai.ts index b1e0f21..e9f2f32 100644 --- a/apps/api/providers/openai.ts +++ b/apps/api/providers/openai.ts @@ -141,7 +141,7 @@ export class OpenAI implements IAIProvider { const trimmed = raw.trim(); if (!trimmed) return null; const unquoted = trimmed.replace(/^['"`]+|['"`]+$/g, ''); - const base = unquoted.split(/[.\[]/)[0]?.trim(); + const base = unquoted.split(/[.[]/)[0]?.trim(); if (!base) return null; return base.toLowerCase(); } @@ -253,7 +253,7 @@ export class OpenAI implements IAIProvider { if (results.size === 0) { const listMatch = message.match( - /Unsupported parameters?:\s*([^\.\[]+)/i + /Unsupported parameters?:\s*([^.[]+)/i ); if (listMatch) { const entries = listMatch[1].split(','); @@ -691,8 +691,8 @@ export class OpenAI implements IAIProvider { typeof schemaContainer.schema === 'object' ? schemaContainer.schema : !type && - responseFormat?.properties && - typeof responseFormat.properties === 'object' + responseFormat?.properties && + typeof responseFormat.properties === 'object' ? responseFormat : undefined; if (type !== 'json_schema' && !(type === '' && schema)) { @@ -992,7 +992,7 @@ export class OpenAI implements IAIProvider { part && typeof part === 'object' && typeof part.type === 'string' - ) + ) : []; const normalized: Record = { type: 'reasoning', @@ -1036,17 +1036,17 @@ export class OpenAI implements IAIProvider { typeof entry.call_id === 'string' && entry.call_id.trim() ? entry.call_id.trim() : typeof entry.tool_call_id === 'string' && - entry.tool_call_id.trim() + entry.tool_call_id.trim() ? entry.tool_call_id.trim() : typeof entry.id === 'string' && - entry.id.trim().startsWith('call_') + entry.id.trim().startsWith('call_') ? entry.id.trim() : undefined; const name = typeof entry.name === 'string' && entry.name.trim() ? entry.name.trim() : typeof entry.function?.name === 'string' && - entry.function.name.trim() + entry.function.name.trim() ? entry.function.name.trim() : undefined; if (!name) return null; @@ -1377,7 +1377,7 @@ export class OpenAI implements IAIProvider { : String(rawChunk); buffer += text; const dataLines: string[] = []; - while (true) { + for (;;) { const newlineIndex = buffer.indexOf('\n'); if (newlineIndex === -1) break; let line = buffer.slice(0, newlineIndex); @@ -2016,7 +2016,7 @@ export class OpenAI implements IAIProvider { typeof data?.output_text === 'string' && data.output_text.trim().length > 0 ? data.output_text.trim() : typeof data?.response?.output_text === 'string' && - data.response.output_text.trim().length > 0 + data.response.output_text.trim().length > 0 ? data.response.output_text.trim() : undefined; const outputItems = Array.isArray(data?.output) diff --git a/apps/api/providers/openrouter.ts b/apps/api/providers/openrouter.ts index 6413a4b..94566f3 100644 --- a/apps/api/providers/openrouter.ts +++ b/apps/api/providers/openrouter.ts @@ -26,7 +26,7 @@ function isOpenRouterToolUseUnsupportedError(error: any): boolean { lowerMessage.includes('tools for multi-agent models') || lowerMessage.includes('[probe:tool_calling]'); const isProviderAvailabilityOrGovernanceFailure = - /no endpoints found that support (tool use|the tool|the provided ['\"]tool_choice['\"] value)|no allowed providers are available for the selected model|no providers? available|provider routing/i.test(message); + /no endpoints found that support (tool use|the tool|the provided ['"]tool_choice['"] value)|no allowed providers are available for the selected model|no providers? available|provider routing/i.test(message); const isToolCallingGovernanceFailure = isToolCallingRequest && /beta access|invalid argument|not supported|unsupported/i.test(lowerMessage); return ( @@ -288,14 +288,16 @@ export class OpenRouterAI implements IAIProvider { const chunks: Buffer[] = []; let total = 0; - while (true) { + for (;;) { const { done, value } = await reader.read(); if (done) break; if (!value || value.length === 0) continue; const chunk = Buffer.from(value); total += chunk.length; if (maxBytes > 0 && total > maxBytes) { - try { await reader.cancel(); } catch {} + try { await reader.cancel(); } catch { + // The abort and size error below remain authoritative. + } controller?.abort(new Error('Image exceeds max size.')); throw new Error('Image exceeds max size.'); } diff --git a/apps/api/routes/anthropic.ts b/apps/api/routes/anthropic.ts index 641aa32..ad22f06 100644 --- a/apps/api/routes/anthropic.ts +++ b/apps/api/routes/anthropic.ts @@ -170,7 +170,7 @@ router.post('/v3/messages', authAndUsageMiddleware, rateLimitMiddleware, async ( let statusCode = 500; let errorType = 'api_error'; let clientMessage = 'Internal server error.'; - let reference = 'An unexpected error occurred processing the Anthropic request.'; + const reference = 'An unexpected error occurred processing the Anthropic request.'; if (error instanceof SyntaxError) { statusCode = 400; errorType = 'invalid_request_error'; clientMessage = 'Invalid JSON payload.'; diff --git a/apps/api/routes/gemini.ts b/apps/api/routes/gemini.ts index 3653d21..22db57b 100644 --- a/apps/api/routes/gemini.ts +++ b/apps/api/routes/gemini.ts @@ -279,7 +279,7 @@ router.post('/models/:modelId/generateContent', authAndUsageMiddleware, rateLimi let statusCode = 500; let statusText = 'INTERNAL'; // Default for Gemini-style error object let clientMessage = 'Internal server error.'; - let reference = 'An unexpected error occurred processing the Gemini request.'; // For generic 500 + const reference = 'An unexpected error occurred processing the Gemini request.'; // For generic 500 if (error instanceof SyntaxError) { statusCode = 400; statusText = 'INVALID_ARGUMENT'; clientMessage = 'Invalid JSON payload.'; diff --git a/apps/api/routes/groq.ts b/apps/api/routes/groq.ts index 54a7280..7fd7609 100644 --- a/apps/api/routes/groq.ts +++ b/apps/api/routes/groq.ts @@ -169,7 +169,7 @@ router.post('/v4/chat/completions', authAndUsageMiddleware, rateLimitMiddleware, let errorType = 'api_error'; let errorCode = 'internal_server_error'; let clientMessage = 'Internal server error.'; - let reference = 'An unexpected error occurred processing the Groq request.'; + const reference = 'An unexpected error occurred processing the Groq request.'; if (error instanceof SyntaxError) { statusCode = 400; errorType = 'invalid_request_error'; errorCode = 'invalid_json'; clientMessage = 'Invalid JSON payload.'; diff --git a/apps/api/routes/nativeProviders.ts b/apps/api/routes/nativeProviders.ts index 7386a0c..26c44e7 100644 --- a/apps/api/routes/nativeProviders.ts +++ b/apps/api/routes/nativeProviders.ts @@ -364,22 +364,22 @@ function inferNativeFamilyFromModelHeuristics( if ( normalized.startsWith('openai/') || - /^gpt([\-._]|$)/.test(noNamespace) || - /^o[1-9]([\-._]|$)/.test(noNamespace) || - /^omni([\-._]|$)/.test(noNamespace) || - /^text-embedding([\-._]|$)/.test(noNamespace) || - /^whisper([\-._]|$)/.test(noNamespace) || - /^tts([\-._]|$)/.test(noNamespace) || - /^dall-e([\-._]|$)/.test(noNamespace) || - /^gpt-image([\-._]|$)/.test(noNamespace) || - /^sora([\-._]|$)/.test(noNamespace) + /^gpt([-._]|$)/.test(noNamespace) || + /^o[1-9]([-._]|$)/.test(noNamespace) || + /^omni([-._]|$)/.test(noNamespace) || + /^text-embedding([-._]|$)/.test(noNamespace) || + /^whisper([-._]|$)/.test(noNamespace) || + /^tts([-._]|$)/.test(noNamespace) || + /^dall-e([-._]|$)/.test(noNamespace) || + /^gpt-image([-._]|$)/.test(noNamespace) || + /^sora([-._]|$)/.test(noNamespace) ) { return 'openai'; } if ( normalized.startsWith('anthropic/') || normalized.startsWith('claude/') || - /^claude([\-._]|$)/.test(noNamespace) + /^claude([-._]|$)/.test(noNamespace) ) { return 'anthropic'; } @@ -387,23 +387,23 @@ function inferNativeFamilyFromModelHeuristics( normalized.startsWith('gemini/') || normalized.startsWith('google/') || normalized.startsWith('imagen/') || - /^gemini([\-._]|$)/.test(noNamespace) || - /^imagen([\-._]|$)/.test(noNamespace) || - /^nano-banana([\-._]|$)/.test(noNamespace) + /^gemini([-._]|$)/.test(noNamespace) || + /^imagen([-._]|$)/.test(noNamespace) || + /^nano-banana([-._]|$)/.test(noNamespace) ) { return 'gemini'; } if (normalized.startsWith('openrouter/')) return 'openrouter'; if ( normalized.startsWith('deepseek/') || - /^deepseek([\-._]|$)/.test(noNamespace) + /^deepseek([-._]|$)/.test(noNamespace) ) { return 'deepseek'; } if ( normalized.startsWith('xai/') || normalized.startsWith('x-ai/') || - /^grok([\-._]|$)/.test(noNamespace) + /^grok([-._]|$)/.test(noNamespace) ) { return 'xai'; } @@ -1226,7 +1226,7 @@ function getNativeResponsesToolCallKey(rawCall: any): string | null { typeof rawCall?.call_id === 'string' && rawCall.call_id.trim() ? rawCall.call_id.trim() : typeof rawCall?.tool_call_id === 'string' && - rawCall.tool_call_id.trim() + rawCall.tool_call_id.trim() ? rawCall.tool_call_id.trim() : undefined; if (callId) return `call:${callId}`; @@ -1239,9 +1239,9 @@ function getNativeResponsesToolCallKey(rawCall: any): string | null { typeof rawCall?.name === 'string' && rawCall.name.trim() ? rawCall.name.trim() : rawCall?.function && - typeof rawCall.function === 'object' && - typeof rawCall.function.name === 'string' && - rawCall.function.name.trim() + typeof rawCall.function === 'object' && + typeof rawCall.function.name === 'string' && + rawCall.function.name.trim() ? rawCall.function.name.trim() : undefined; return name ? `name:${name}` : null; @@ -1535,7 +1535,7 @@ async function persistNativeResponsesHistoryEntry(params: { params.context.proxyResponseId.trim() ? params.context.proxyResponseId.trim() : typeof params.responsePayload?.id === 'string' && - params.responsePayload.id.trim() + params.responsePayload.id.trim() ? params.responsePayload.id.trim() : ''; if (!responseId) return; @@ -1545,8 +1545,8 @@ async function persistNativeResponsesHistoryEntry(params: { params.upstreamResponseId.trim() ? params.upstreamResponseId.trim() : typeof params.responsePayload?.id === 'string' && - params.responsePayload.id.trim() && - params.responsePayload.id.trim() !== responseId + params.responsePayload.id.trim() && + params.responsePayload.id.trim() !== responseId ? params.responsePayload.id.trim() : undefined; const model = @@ -3230,7 +3230,7 @@ async function handleNativeProviderRequest( let streamCreatedAt: number | undefined; let streamOutput: any[] | null = null; let streamOutputText = ''; - let streamToolCalls: Record[] = []; + const streamToolCalls: Record[] = []; const parser = createSseDataParser( (dataLine, eventName) => { if (!dataLine) return; @@ -3336,16 +3336,16 @@ async function handleNativeProviderRequest( ? parsed.output_text_delta : typeof parsed?.response ?.output_text_delta === - 'string' + 'string' ? parsed.response .output_text_delta : typeof parsed?.delta === - 'string' + 'string' ? parsed.delta : typeof parsed ?.response ?.delta === - 'string' + 'string' ? parsed.response .delta : ''; @@ -3389,7 +3389,7 @@ async function handleNativeProviderRequest( } ); try { - while (true) { + for (;;) { const { done, value } = await reader.read(); if (done) break; if (!value || value.length === 0) continue; @@ -3682,7 +3682,7 @@ async function handleNativeProviderRequest( error?.code === 'QUEUE_WAIT_TIMEOUT' ? 503 : errorMessage.includes('timed out') || - errorMessage.includes('abort') + errorMessage.includes('abort') ? 504 : 502; if ( diff --git a/apps/api/routes/openai.ts b/apps/api/routes/openai.ts index 795e220..106d4ec 100644 --- a/apps/api/routes/openai.ts +++ b/apps/api/routes/openai.ts @@ -451,7 +451,9 @@ async function parseChatCompletionsRequestBody( requestBody.messages = JSON.parse( parsed.fields.messages ); - } catch {} + } catch { + // Ignore an invalid optional multipart messages field. + } } if (parsed.fields.stream) requestBody.stream = @@ -1120,7 +1122,7 @@ function normalizeVideoRetryState( apiKey: item.apiKey.trim(), baseUrl: item.baseUrl.trim() })) - ) + ) : undefined; return { @@ -2229,8 +2231,7 @@ openaiRouter.post( const userApiKey = request.apiKey!; const tierLimits = request.tierLimits!; - let requestBody: any; - requestBody = await parseChatCompletionsRequestBody( + const requestBody: any = await parseChatCompletionsRequestBody( request, response ); @@ -2281,7 +2282,8 @@ openaiRouter.post( } const result = extractMessageFromRequestBody(requestBody); - let { messages: rawMessages, model: modelId } = result; + let { messages: rawMessages } = result; + const { model: modelId } = result; rawMessages = filterValidChatMessages(rawMessages); logForgeTrace('chat', 'request.start', request, { modelId, @@ -2296,7 +2298,7 @@ openaiRouter.post( typeof requestBody?.tool_choice === 'string' ? requestBody.tool_choice : typeof requestBody?.tool_choice === 'object' && - requestBody.tool_choice + requestBody.tool_choice ? 'object' : undefined, accept: getHeaderValue(request.headers, 'accept') @@ -2829,7 +2831,9 @@ openaiRouter.post( ); try { result?.passthrough?.upstream?.destroy?.(); - } catch {} + } catch { + // Upstream cleanup is best effort before normalization. + } fallbackToNormalized = true; break; } @@ -3046,7 +3050,7 @@ openaiRouter.post( hasFallbackToolCallChunk ? '' : typeof fallbackResult.chunk === - 'string' + 'string' ? fallbackResult.chunk : ''; if ( @@ -3500,7 +3504,7 @@ openaiRouter.post( const timestamp = new Date().toISOString(); let statusCode = 500; let clientMessage = 'Internal Server Error'; - let clientReference = + const clientReference = 'An unexpected error occurred while processing your chat request.'; const errorMeta = error as any; const retryAfterSeconds = resolveRetryAfterSeconds( @@ -4279,14 +4283,14 @@ openaiRouter.post( typeof message.tool_choice === 'string' ? message.tool_choice : typeof message.tool_choice === 'object' && - message.tool_choice + message.tool_choice ? 'object' : undefined, reasoning: typeof requestBody?.reasoning === 'string' ? requestBody.reasoning : requestBody?.reasoning && - typeof requestBody.reasoning === 'object' + typeof requestBody.reasoning === 'object' ? 'object' : undefined, accept: getHeaderValue(request.headers, 'accept') @@ -4500,7 +4504,7 @@ openaiRouter.post( let responsesCreatedSent = false; let responsesTextItemStarted = false; let inlineCompactionItemEmitted = false; - let pendingReasoningText = ''; + const pendingReasoningText = ''; let streamedReasoningText = ''; const canInferResponsesToolCallsFromText = Array.isArray(message.tools) && @@ -4691,7 +4695,9 @@ openaiRouter.post( ); try { result?.passthrough?.upstream?.destroy?.(); - } catch {} + } catch { + // Upstream cleanup is best effort before normalization. + } fallbackToNormalized = true; break; } @@ -4823,7 +4829,7 @@ openaiRouter.post( typeof result.chunk === 'string' && result.chunk.length > 0 ) { - let deltaText = result.chunk; + const deltaText = result.chunk; fullText += deltaText; if ( !toolCallsFromStream && @@ -4928,7 +4934,7 @@ openaiRouter.post( if (fallbackResult.finish_reason) finishReasonFromStream = fallbackResult.finish_reason; - let fallbackDeltaText = fallbackResult.chunk; + const fallbackDeltaText = fallbackResult.chunk; fullText += fallbackDeltaText; if ( !toolCallsFromStream && @@ -5347,7 +5353,7 @@ openaiRouter.post( typeof result.reasoning === 'string' && result.reasoning.trim() ? result.reasoning : (effectiveToolCalls && effectiveToolCalls.length > 0) || - (typeof outputText === 'string' && outputText.trim().length > 0) + (typeof outputText === 'string' && outputText.trim().length > 0) ? effectiveToolCalls && effectiveToolCalls.length > 0 ? 'Selecting the best tool and preparing its arguments.' : 'Planning the response before generating the final answer.' @@ -5459,7 +5465,7 @@ openaiRouter.post( const timestamp = new Date().toISOString(); let statusCode = 500; let clientMessage = 'Internal Server Error'; - let clientReference = + const clientReference = 'An unexpected error occurred while processing your responses request.'; const errorMeta = error as any; const retryAfterSeconds = resolveRetryAfterSeconds( @@ -5804,7 +5810,7 @@ openaiRouter.get( } catch (error: any) { await logError(error, request); let statusCode = 500; - let clientMessage = 'Internal Server Error'; + const clientMessage = 'Internal Server Error'; if (String(error?.message || '').includes('expired')) statusCode = 410; if (String(error?.message || '').includes('Invalid')) @@ -5959,7 +5965,7 @@ openaiRouter.post( const timestamp = new Date().toISOString(); let statusCode = 500; let clientMessage = 'Internal Server Error'; - let clientReference = + const clientReference = 'An unexpected error occurred while processing your Azure chat request.'; const explicitStatusCode = typeof (error as any)?.statusCode === 'number' @@ -6135,14 +6141,14 @@ function summarizeAudioProviderFailure( lower.includes('billing details') ? 'BILLING_NOT_ACTIVE' : status === 429 || - lower.includes('rate limit') || - lower.includes('quota') || - lower.includes('insufficient_quota') + lower.includes('rate limit') || + lower.includes('quota') || + lower.includes('insufficient_quota') ? 'RATE_LIMIT_OR_QUOTA' : status === 401 || - status === 403 || - lower.includes('invalid api key') || - lower.includes('incorrect api key') + status === 403 || + lower.includes('invalid api key') || + lower.includes('incorrect api key') ? 'AUTH_FAILURE' : lower.includes('timeout') || lower.includes('timed out') ? 'TIMEOUT' @@ -6455,7 +6461,7 @@ openaiRouter.post( if (stream && upstreamRes.body) { const reader = upstreamRes.body.getReader(); - while (true) { + for (;;) { const { done, value } = await reader.read(); if (done) break; if (value && value.length > 0) { @@ -6727,16 +6733,16 @@ openaiRouter.post( error.statusCode < 600 ? error.statusCode : typeof error?.status === 'number' && - error.status >= 400 && - error.status < 600 + error.status >= 400 && + error.status < 600 ? error.status : /failed to process request|authorization failed|api key expired|project has been denied access|permission_denied|invalid api key/i.test( - String(error?.message || '') - ) + String(error?.message || '') + ) ? 503 : String(error?.message || '').includes( 'No available provider for image generation' - ) + ) ? 503 : 500; if (!response.completed) { @@ -6889,7 +6895,7 @@ const handleVideoGenerationRequest = async ( ? error.statusCode : String(error?.message || '').includes( 'No available provider for video generation' - ) + ) ? 503 : 500; if (!response.completed) { @@ -6926,7 +6932,7 @@ openaiRouter.get('/videos', async (request: Request, response: Response) => { item, VIDEO_REQUEST_CACHE_TTL_MS ) - ) + ) : Promise.resolve() ) ); @@ -7634,7 +7640,7 @@ openaiRouter.get( contentUri, ttlMs: cachedProvider.ttlMs || VIDEO_REQUEST_CACHE_TTL_MS - } + } : null); if (cacheUpdate) { await setVideoRequestCache(requestId, cacheUpdate); @@ -8001,7 +8007,7 @@ openaiRouter.post( if (upstreamRes.body) { const reader = upstreamRes.body.getReader(); - while (true) { + for (;;) { const { done, value } = await reader.read(); if (done) break; if (value && value.length > 0) response.write(value); diff --git a/apps/api/server.launcher.bun.ts b/apps/api/server.launcher.bun.ts index 4b79ff5..55a18dc 100644 --- a/apps/api/server.launcher.bun.ts +++ b/apps/api/server.launcher.bun.ts @@ -1,5 +1,4 @@ -import { fileURLToPath } from 'node:url'; -import { pathToFileURL } from 'node:url'; +import { fileURLToPath, pathToFileURL } from 'node:url'; import fs from 'node:fs'; import path from 'node:path'; @@ -217,7 +216,7 @@ function acquireLaunchLock(): void { acquiredAt: new Date().toISOString(), }, null, 2); - while (true) { + for (;;) { try { const handle = fs.openSync(LAUNCH_LOCK_FILE, 'wx'); fs.writeFileSync(handle, record, 'utf8'); diff --git a/apps/api/ws/realtime.ts b/apps/api/ws/realtime.ts index 5bfc38a..026ec5c 100644 --- a/apps/api/ws/realtime.ts +++ b/apps/api/ws/realtime.ts @@ -5,8 +5,8 @@ import { dataManager, LoadedProviders, LoadedProviderData } from '../modules/dat import { logError } from '../modules/errorLogger.js'; import crypto from 'crypto'; -const WS_OPEN: 1 = 1; // NodeWebSocket.OPEN -const WS_CONNECTING: 0 = 0; // NodeWebSocket.CONNECTING +const WS_OPEN = 1 as const; // NodeWebSocket.OPEN +const WS_CONNECTING = 0 as const; // NodeWebSocket.CONNECTING interface RealtimeConfig { url: string; @@ -92,7 +92,7 @@ export function attachRealtimeWebSocket(app: { ws: (path: string, handler: (ws: let isAuthenticated = false; let userId: string | null = null; let userApiKey: string | null = null; - let messageBuffer: RealtimeMessage[] = []; // Buffer messages until upstream connects + const messageBuffer: RealtimeMessage[] = []; // Buffer messages until upstream connects const MAX_BUFFERED_MESSAGES = 100; const UPSTREAM_CONNECT_TIMEOUT_MS = 15000; let upstreamConnectTimeout: NodeJS.Timeout | null = null; @@ -202,7 +202,7 @@ export function attachRealtimeWebSocket(app: { ws: (path: string, handler: (ws: // uWS send expects string or ArrayBuffer // WebSocket data is Buffer | ArrayBuffer | Buffer[] // Convert to format uWS likes - let payload: any = data; + const payload: any = data; if (Buffer.isBuffer(data)) { // Pass buffer directly? uWS wrapper handles string/ArrayBuffer. // Buffer is Uint8Array which is ArrayBufferView. diff --git a/apps/homepage/package.json b/apps/homepage/package.json index 74f5d8c..2ececc4 100644 --- a/apps/homepage/package.json +++ b/apps/homepage/package.json @@ -8,7 +8,9 @@ }, "scripts": { "start": "bash ../../bun.sh run ./serve.js", - "dev": "bash ../../bun.sh run ./serve.js" + "dev": "bash ../../bun.sh run ./serve.js", + "test": "bash ../../scripts/with-bun-path.sh node ./apps/homepage/serve.port-safety.test.mjs", + "typecheck": "bash ../../bun.sh ../../node_modules/typescript/bin/tsc --noEmit --allowJs --checkJs false --skipLibCheck --target ES2022 --module ESNext --moduleResolution Bundler serve.js public/script.js" }, "dependencies": { "express": "^4.22.2", diff --git a/apps/homepage/serve.js b/apps/homepage/serve.js index 95c8726..b5c2530 100644 --- a/apps/homepage/serve.js +++ b/apps/homepage/serve.js @@ -1,6 +1,6 @@ import express from 'express'; +import process from 'node:process'; import { fileURLToPath } from 'node:url'; -import { execSync } from 'node:child_process'; import { readFileSync, existsSync } from 'node:fs'; import path from 'node:path'; import rateLimit from 'express-rate-limit'; @@ -20,7 +20,13 @@ try { } } } catch { /* no .env file */ } -const PORT = process.env.HOMEPAGE_PORT || 3091; +const homepagePort = process.env.HOMEPAGE_PORT || '3091'; +if (!/^\d+$/.test(homepagePort) || Number(homepagePort) < 1 || Number(homepagePort) > 65_535) { + console.error('HOMEPAGE_PORT must be an integer between 1 and 65535.'); + process.exit(1); +} + +const PORT = Number(homepagePort); const HOST = process.env.HOMEPAGE_HOST || '0.0.0.0'; const ANYGPT_API_BASE_URL = (process.env.ANYGPT_API_BASE_URL || 'https://gpt.anyvm.tech').replace(/\/$/, ''); const LIVE_METRICS_REFRESH_MS = 30_000; @@ -108,15 +114,6 @@ function buildLiveMetrics(payload, usageMetrics) { }; } -// Kill any stale process on our port -try { - const pid = execSync(`lsof -ti :${PORT}`, { encoding: 'utf8' }).trim(); - if (pid) { - console.log(`Killing stale process on port ${PORT} (PID: ${pid})`); - execSync(`kill -9 ${pid}`); - } -} catch { /* no process on port */ } - const app = express(); // Homepage runs behind a reverse proxy in production. @@ -298,6 +295,19 @@ app.get('*', spaLimiter, (_req, res) => { res.sendFile(path.join(__dirname, 'public', 'index.html')); }); -app.listen(PORT, HOST, () => { +const server = app.listen(PORT, HOST, () => { console.log(`AnyGPT Homepage running on http://${HOST}:${PORT}`); }); + +server.on('error', (error) => { + if (error?.code === 'EADDRINUSE') { + console.error( + `Cannot start AnyGPT Homepage: ${HOST}:${PORT} is already in use. ` + + 'The existing listener was left untouched; stop it yourself or set HOMEPAGE_PORT to a free port.', + ); + } else { + console.error(`Cannot start AnyGPT Homepage on ${HOST}:${PORT}:`, error); + } + + process.exitCode = 1; +}); diff --git a/apps/homepage/serve.port-safety.test.mjs b/apps/homepage/serve.port-safety.test.mjs new file mode 100644 index 0000000..323c0fd --- /dev/null +++ b/apps/homepage/serve.port-safety.test.mjs @@ -0,0 +1,134 @@ +import assert from 'node:assert/strict'; +import { spawn } from 'node:child_process'; +import { existsSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import path from 'node:path'; +import process from 'node:process'; +import { fileURLToPath } from 'node:url'; + +const homepageDir = path.dirname(fileURLToPath(import.meta.url)); +const servePath = path.join(homepageDir, 'serve.js'); +const bunWrapperPath = path.resolve(homepageDir, '../../bun.sh'); + +function collectOutput(child) { + let output = ''; + child.stdout.on('data', (chunk) => { + output += chunk; + }); + child.stderr.on('data', (chunk) => { + output += chunk; + }); + return () => output; +} + +function waitForExit(child, timeoutMs = 5_000) { + return new Promise((resolve, reject) => { + const timeout = setTimeout(() => { + child.kill('SIGKILL'); + reject(new Error(`Process ${child.pid} did not exit within ${timeoutMs}ms.`)); + }, timeoutMs); + + child.once('error', (error) => { + clearTimeout(timeout); + reject(error); + }); + child.once('exit', (code, signal) => { + clearTimeout(timeout); + resolve({ code, signal }); + }); + }); +} + +async function startUnrelatedListener() { + const script = ` + const http = require('node:http'); + const server = http.createServer((_request, response) => response.end('unrelated-listener-alive')); + server.listen(0, '127.0.0.1', () => console.log(server.address().port)); + process.on('SIGTERM', () => server.close(() => process.exit(0))); + `; + const child = spawn(process.execPath, ['-e', script], { + stdio: ['ignore', 'pipe', 'pipe'], + }); + let stderr = ''; + child.stderr.on('data', (chunk) => { + stderr += chunk; + }); + + const port = await new Promise((resolve, reject) => { + const timeout = setTimeout(() => reject(new Error('Listener did not report its port.')), 5_000); + child.once('error', reject); + child.stdout.once('data', (chunk) => { + clearTimeout(timeout); + const parsedPort = Number(String(chunk).trim()); + if (!Number.isInteger(parsedPort)) { + reject(new Error(`Invalid listener port; stderr: ${stderr}`)); + return; + } + resolve(parsedPort); + }); + child.once('exit', (code, signal) => { + clearTimeout(timeout); + reject(new Error(`Listener exited early (${code ?? signal}); stderr: ${stderr}`)); + }); + }); + + return { child, port }; +} + +async function stopChild(child) { + if (child.exitCode !== null || child.signalCode !== null) return; + child.kill('SIGTERM'); + await waitForExit(child); +} + +async function testOccupiedPortIsNotKilled() { + const listener = await startUnrelatedListener(); + try { + const homepage = spawn('bash', [bunWrapperPath, 'run', servePath], { + cwd: homepageDir, + env: { + ...process.env, + HOMEPAGE_HOST: '127.0.0.1', + HOMEPAGE_PORT: String(listener.port), + }, + stdio: ['ignore', 'pipe', 'pipe'], + }); + const homepageOutput = collectOutput(homepage); + const result = await waitForExit(homepage); + + assert.notEqual(result.code, 0, `Homepage unexpectedly succeeded:\n${homepageOutput()}`); + assert.match(homepageOutput(), /already in use/i); + assert.match(homepageOutput(), /existing listener was left untouched/i); + + const response = await fetch(`http://127.0.0.1:${listener.port}`); + assert.equal(await response.text(), 'unrelated-listener-alive'); + assert.equal(listener.child.exitCode, null, 'Homepage terminated the unrelated listener.'); + } finally { + await stopChild(listener.child); + } +} + +async function testUnsafePortIsRejectedWithoutShellExecution() { + const markerPath = path.join( + tmpdir(), + `anygpt-homepage-port-injection-${process.pid}-${Date.now()}`, + ); + const homepage = spawn('bash', [bunWrapperPath, 'run', servePath], { + cwd: homepageDir, + env: { + ...process.env, + HOMEPAGE_PORT: `3091;touch ${markerPath}`, + }, + stdio: ['ignore', 'pipe', 'pipe'], + }); + const homepageOutput = collectOutput(homepage); + const result = await waitForExit(homepage); + + assert.notEqual(result.code, 0, `Homepage unexpectedly accepted an unsafe port:\n${homepageOutput()}`); + assert.match(homepageOutput(), /HOMEPAGE_PORT must be an integer between 1 and 65535/); + assert.equal(existsSync(markerPath), false, 'Unsafe HOMEPAGE_PORT was executed by a shell.'); +} + +await testOccupiedPortIsNotKilled(); +await testUnsafePortIsRejectedWithoutShellExecution(); +console.log('Homepage port-safety tests passed.'); diff --git a/apps/ui/README.md b/apps/ui/README.md index de16387..d19c9b7 100644 --- a/apps/ui/README.md +++ b/apps/ui/README.md @@ -5,11 +5,18 @@ This folder replaces the previous UI with LibreChat. The LibreChat repo is expec ## Quick Start -1. Clone LibreChat into this folder: +1. Bootstrap the ignored LibreChat checkout and install its exact Node/npm dependencies: ```bash - git clone https://github.com/danny-avila/LibreChat.git apps/ui/librechat + bun run frontend:install ``` + The installer checks out a tested LibreChat commit from + `https://github.com/danny-avila/LibreChat.git` into `apps/ui/librechat`, + loads its `.nvmrc`, runs `npm ci` with the manifest-pinned npm version, + installs the homepage from the frozen root lockfile, and applies the AnyGPT + wrapper config. Override the pinned source with + `ANYGPT_LIBRECHAT_REPOSITORY` or `ANYGPT_LIBRECHAT_REF`. + 2. Ensure MongoDB is running and update `apps/ui/librechat/.env` if needed: - Default expects `MONGO_URI=mongodb://127.0.0.1:27017/LibreChat` - Use a remote MongoDB URI if you prefer @@ -23,9 +30,9 @@ This folder replaces the previous UI with LibreChat. The LibreChat repo is expec cd apps/ui bun run dev ``` - If dependencies are missing, run: + If dependencies are missing, run from the AnyGPT repository root: ```bash - (cd apps/ui/librechat && bun install) + bun run frontend:install ``` ## What This Wrapper Does @@ -107,3 +114,13 @@ LibreChat talks to the AnyGPT API internally via `ANYGPT_BASE_URL=http://localho - If you want per-user API keys, change `apiKey` in `config/librechat.yaml` to `user_provided`. - Update the `models.default` list in `config/librechat.yaml` to match your AnyGPT `GET /v1/models` output. + +## Reproducible UI Design Changes + +The tracked config, environment defaults, and AnyGPT/AnyVM assets cover the +current endpoint, theme, title, footer, and SSO branding. For LibreChat source, +CSS, or additional static-asset changes, use the context-checked patch workflow +documented in [`customizations/README.md`](customizations/README.md). The patch +is stored in the outer repository and replayed by `scripts/sync-config.sh`; it +refuses conflicts instead of overwriting unrelated edits in the ignored +LibreChat checkout. diff --git a/apps/ui/customizations/README.md b/apps/ui/customizations/README.md new file mode 100644 index 0000000..ad018cc --- /dev/null +++ b/apps/ui/customizations/README.md @@ -0,0 +1,28 @@ +# LibreChat customization patch + +The `apps/ui/librechat` checkout is intentionally ignored and pinned by the +outer AnyGPT repository. Keep reusable LibreChat source and design changes in +the optional tracked file `librechat.patch` in this directory. + +The normal config sync automatically replays that patch. It first performs a +full `git apply --check`; if an overlapping local edit or an incompatible +LibreChat revision prevents a clean application, it stops without changing the +checkout. An already-applied patch is detected with a reverse check and is a +no-op. + +To capture selected edits, including new or binary assets, from the ignored +checkout without staging its real Git index: + +```bash +# Run from the AnyGPT repository root. +bash apps/ui/scripts/capture-customizations.sh \ + client/src/path/to/ChangedComponent.tsx \ + client/public/assets/AnyGPT.svg +git diff -- apps/ui/customizations/librechat.patch +``` + +Pass explicit intended paths. The capture helper rejects `.env`, `.git`, logs, +and `node_modules`. Keep endpoint settings in `apps/ui/config/librechat.yaml`, +environment defaults in `apps/ui/config/anygpt.env.example`, and the existing +AnyGPT/AnyVM master assets in `apps/ui/` rather than duplicating them in the +ignored checkout. diff --git a/apps/ui/package.json b/apps/ui/package.json index 2c3e844..150fe15 100644 --- a/apps/ui/package.json +++ b/apps/ui/package.json @@ -10,6 +10,7 @@ "start": "bash scripts/start.sh", "stop": "bash scripts/stop.sh", "sync-config": "bash scripts/sync-config.sh", - "sync-librechat": "bash scripts/sync-librechat.sh" + "sync-librechat": "bash scripts/sync-librechat.sh", + "typecheck": "bash -n scripts/*.sh" } } diff --git a/apps/ui/scripts/activate-node.sh b/apps/ui/scripts/activate-node.sh new file mode 100755 index 0000000..84ca0f4 --- /dev/null +++ b/apps/ui/scripts/activate-node.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +UI_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +LIBRECHAT_DIR="$UI_ROOT/librechat" + +if [[ ! -f "$LIBRECHAT_DIR/.nvmrc" ]]; then + echo "LibreChat Node version file is missing at $LIBRECHAT_DIR/.nvmrc." >&2 + return 1 +fi + +required_node="$(tr -d '[:space:]' < "$LIBRECHAT_DIR/.nvmrc")" +required_node="${required_node#v}" +NVM_DIR="${NVM_DIR:-$HOME/.nvm}" +export NVM_DIR + +if [[ -s "$NVM_DIR/nvm.sh" ]]; then + set +u + # shellcheck source=/dev/null + . "$NVM_DIR/nvm.sh" + set -u + nvm use "$required_node" >/dev/null +elif ! command -v node >/dev/null 2>&1 || [[ "$(node --version)" != "v${required_node}" ]]; then + echo "LibreChat requires Node v${required_node}. Run 'bun run frontend:install' first." >&2 + return 1 +fi + +for required_command in node npm npx lsof; do + if ! command -v "$required_command" >/dev/null 2>&1; then + echo "LibreChat requires '$required_command' to be available in WSL." >&2 + return 1 + fi +done diff --git a/apps/ui/scripts/apply-customizations.sh b/apps/ui/scripts/apply-customizations.sh new file mode 100755 index 0000000..c8b5adf --- /dev/null +++ b/apps/ui/scripts/apply-customizations.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +LIBRECHAT_DIR="$ROOT/librechat" +PATCH_FILE="${ANYGPT_LIBRECHAT_PATCH_FILE:-$ROOT/customizations/librechat.patch}" + +if [[ ! -f "$PATCH_FILE" || ! -s "$PATCH_FILE" ]]; then + exit 0 +fi + +if [[ ! -d "$LIBRECHAT_DIR/.git" ]]; then + echo "LibreChat repo not found at $LIBRECHAT_DIR" >&2 + exit 1 +fi + +# A reverse check is a read-only way to recognize a patch that was already +# applied by an earlier install/dev invocation. +if git -C "$LIBRECHAT_DIR" apply --reverse --check --whitespace=nowarn "$PATCH_FILE" >/dev/null 2>&1; then + echo "LibreChat customization patch is already applied" + exit 0 +fi + +# Never use --3way, --reject, or a forced checkout here. A normal check must +# succeed in full so overlapping local edits are preserved for manual review. +if ! git -C "$LIBRECHAT_DIR" apply --check --whitespace=nowarn "$PATCH_FILE"; then + echo "LibreChat customization patch does not apply cleanly; no files were changed." >&2 + echo "Review the ignored checkout at $LIBRECHAT_DIR and reconcile its local changes manually." >&2 + exit 1 +fi + +git -C "$LIBRECHAT_DIR" apply --whitespace=nowarn "$PATCH_FILE" +echo "Applied LibreChat customization patch from $PATCH_FILE" diff --git a/apps/ui/scripts/capture-customizations.sh b/apps/ui/scripts/capture-customizations.sh new file mode 100755 index 0000000..1b1099d --- /dev/null +++ b/apps/ui/scripts/capture-customizations.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +LIBRECHAT_DIR="$ROOT/librechat" +CUSTOMIZATIONS_DIR="$ROOT/customizations" +PATCH_FILE="$CUSTOMIZATIONS_DIR/librechat.patch" + +usage() { + echo "Usage: $0 [path ...]" >&2 + echo "Example: $0 client/src/components/Auth/AuthLayout.tsx client/public/assets/AnyGPT.svg" >&2 +} + +if [[ ! -d "$LIBRECHAT_DIR/.git" ]]; then + echo "LibreChat repo not found at $LIBRECHAT_DIR" >&2 + exit 1 +fi + +if (( $# == 0 )); then + usage + exit 2 +fi + +paths=() +for path in "$@"; do + case "$path" in + ""|/*|.|..|../*|*/..|*/../*|.git|.git/*|node_modules|node_modules/*|*/node_modules|*/node_modules/*|.env|.env.*|*/.env|*/.env.*|logs|logs/*|*/logs|*/logs/*) + echo "Refusing unsafe or generated LibreChat path: $path" >&2 + exit 2 + ;; + esac + paths+=("$path") +done + +mkdir -p "$CUSTOMIZATIONS_DIR" +temporary_index="$(mktemp)" +temporary_patch="$(mktemp "$CUSTOMIZATIONS_DIR/.librechat.patch.XXXXXX")" +rm -f "$temporary_index" +cleanup() { + rm -f "$temporary_index" "$temporary_patch" +} +trap cleanup EXIT + +# Build an alternate index from HEAD so new/deleted files can be captured +# without staging anything in the ignored LibreChat checkout's real index. +GIT_INDEX_FILE="$temporary_index" git -C "$LIBRECHAT_DIR" read-tree HEAD +GIT_INDEX_FILE="$temporary_index" git --literal-pathspecs -C "$LIBRECHAT_DIR" add -A -- "${paths[@]}" +GIT_INDEX_FILE="$temporary_index" git --literal-pathspecs -C "$LIBRECHAT_DIR" diff \ + --cached --binary --full-index HEAD -- "${paths[@]}" > "$temporary_patch" + +if [[ ! -s "$temporary_patch" ]]; then + echo "No LibreChat changes found in the requested paths; existing patch was left unchanged." >&2 + exit 1 +fi + +if ! git -C "$LIBRECHAT_DIR" apply --reverse --check --whitespace=nowarn "$temporary_patch"; then + echo "Generated patch could not be verified against the current LibreChat edits." >&2 + exit 1 +fi + +mv -f "$temporary_patch" "$PATCH_FILE" +echo "Captured LibreChat customization patch at $PATCH_FILE" +echo "Review it from the outer repo before committing. The nested checkout index was not changed." diff --git a/apps/ui/scripts/dev.sh b/apps/ui/scripts/dev.sh index 200761d..1456fc3 100755 --- a/apps/ui/scripts/dev.sh +++ b/apps/ui/scripts/dev.sh @@ -9,12 +9,16 @@ bash "$ROOT/scripts/sync-config.sh" cd "$ROOT/librechat" +# shellcheck source=activate-node.sh +. "$ROOT/scripts/activate-node.sh" + if [[ ! -d node_modules || ! -x node_modules/.bin/cross-env ]]; then - echo "Installing LibreChat dependencies..." - bash "$BUN_SH" install + echo "LibreChat dependencies are missing or incomplete." >&2 + echo "Run 'bun run frontend:install' from $REPO_ROOT, then retry." >&2 + exit 1 fi -if [[ ! -f node_modules/@librechat/data-schemas/dist/index.cjs ]] || [[ ! -f packages/data-provider/dist/react-query/index.es.js ]]; then +if [[ ! -f node_modules/@librechat/data-schemas/dist/index.cjs ]] || [[ ! -f packages/data-provider/dist/react-query/index.js ]]; then echo "Building LibreChat workspace packages..." bash "$BUN_SH" run build:packages fi @@ -24,12 +28,22 @@ if [[ ! -f client/dist/index.html ]]; then bash "$BUN_SH" run build:client fi -# Kill any process already using the LibreChat backend port (3080) +# Never terminate an unrelated process that already owns the backend port. BACKEND_PORT="${PORT:-3080}" +FRONTEND_PORT="${VITE_PORT:-3090}" +if [[ "$BACKEND_PORT" == "$FRONTEND_PORT" ]]; then + echo "LibreChat backend and Vite ports must differ (both resolved to $BACKEND_PORT)." >&2 + exit 1 +fi if PID=$(lsof -ti :"$BACKEND_PORT" 2>/dev/null); then - echo "Killing existing process on port $BACKEND_PORT (PID: $PID)..." - kill -9 $PID 2>/dev/null || true - sleep 1 + echo "LibreChat backend port $BACKEND_PORT is already in use by PID(s): $PID" >&2 + echo "Stop or reconfigure that process explicitly before starting this stack." >&2 + exit 1 +fi +if PID=$(lsof -ti :"$FRONTEND_PORT" 2>/dev/null); then + echo "LibreChat Vite port $FRONTEND_PORT is already in use by PID(s): $PID" >&2 + echo "Stop or reconfigure that process explicitly before starting this stack." >&2 + exit 1 fi # Ensure Vite binds to all interfaces (not just IPv6 loopback) @@ -37,7 +51,7 @@ export HOST=0.0.0.0 # Allow reverse-proxy hostnames through Vite's host check export VITE_ALLOWED_HOSTS="${VITE_ALLOWED_HOSTS:-gpt.anyvm.tech}" -bash "$BUN_SH" run backend:dev & +PORT="$BACKEND_PORT" bash "$BUN_SH" run backend:dev & BACKEND_PID=$! cleanup() { @@ -47,4 +61,4 @@ cleanup() { } trap cleanup EXIT -bash "$BUN_SH" run frontend:dev +PORT="$FRONTEND_PORT" bash "$BUN_SH" run frontend:dev diff --git a/apps/ui/scripts/start.sh b/apps/ui/scripts/start.sh index 4e07251..ca5f2c5 100755 --- a/apps/ui/scripts/start.sh +++ b/apps/ui/scripts/start.sh @@ -9,12 +9,16 @@ bash "$ROOT/scripts/sync-config.sh" cd "$ROOT/librechat" +# shellcheck source=activate-node.sh +. "$ROOT/scripts/activate-node.sh" + if [[ ! -d node_modules || ! -x node_modules/.bin/cross-env ]]; then - echo "Installing LibreChat dependencies..." - bash "$BUN_SH" install + echo "LibreChat dependencies are missing or incomplete." >&2 + echo "Run 'bun run frontend:install' from $REPO_ROOT, then retry." >&2 + exit 1 fi -if [[ ! -f node_modules/@librechat/data-schemas/dist/index.cjs ]] || [[ ! -f packages/data-provider/dist/react-query/index.es.js ]]; then +if [[ ! -f node_modules/@librechat/data-schemas/dist/index.cjs ]] || [[ ! -f packages/data-provider/dist/react-query/index.js ]]; then echo "Building LibreChat workspace packages..." bash "$BUN_SH" run build:packages fi @@ -24,27 +28,12 @@ if [[ ! -f client/dist/index.html ]]; then bash "$BUN_SH" run build:client fi -# Kill any process already using the LibreChat backend port (3080) +# Never terminate an unrelated process that already owns the backend port. BACKEND_PORT="${PORT:-3080}" if PID=$(lsof -ti :"$BACKEND_PORT" 2>/dev/null); then - echo "Killing existing process on port $BACKEND_PORT (PID: $PID)..." - kill -9 $PID 2>/dev/null || true - sleep 1 + echo "LibreChat backend port $BACKEND_PORT is already in use by PID(s): $PID" >&2 + echo "Stop or reconfigure that process explicitly before starting this stack." >&2 + exit 1 fi -# Ensure Vite binds to all interfaces (not just IPv6 loopback) -export HOST=0.0.0.0 -# Allow reverse-proxy hostnames through Vite's host check -export VITE_ALLOWED_HOSTS="${VITE_ALLOWED_HOSTS:-gpt.anyvm.tech}" - -bash "$BUN_SH" run backend & -BACKEND_PID=$! - -cleanup() { - if kill -0 "$BACKEND_PID" 2>/dev/null; then - kill "$BACKEND_PID" - fi -} -trap cleanup EXIT - -bash "$BUN_SH" run frontend +exec bash "$BUN_SH" run backend diff --git a/apps/ui/scripts/sync-config.sh b/apps/ui/scripts/sync-config.sh index 3e6f118..0926496 100755 --- a/apps/ui/scripts/sync-config.sh +++ b/apps/ui/scripts/sync-config.sh @@ -71,3 +71,8 @@ if [[ -f "$ROOT/AnyVM-logo.png" ]]; then cp "$ROOT/AnyVM-logo.png" "$PUBLIC_DIR/AnyVM-logo.png" echo "Copied AnyVM-logo.png into $PUBLIC_DIR" fi + +# --- Optional source/design overlay --- +# This uses a context-checked Git patch so it never blindly replaces local +# changes inside the ignored LibreChat checkout. +bash "$ROOT/scripts/apply-customizations.sh" diff --git a/bun.lock b/bun.lock index a4b6997..d5afe0a 100644 --- a/bun.lock +++ b/bun.lock @@ -9,7 +9,14 @@ "commander": "^12.1.0", }, "devDependencies": { + "@typescript-eslint/eslint-plugin": "^8.67.0", + "@typescript-eslint/parser": "^8.67.0", "eslint": "^8.57.1", + "eslint-import-resolver-typescript": "^4.4.5", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.1.1", "husky": "^9.1.7", "prettier": "^3.8.3", "turbo": "^2.9.16", @@ -41,6 +48,7 @@ "concurrently": "^10.0.3", "eslint": "^8.57.1", "jest": "^30.4.2", + "redis": "^4.7.0", "rimraf": "^5.0.10", "ts-jest": "^29.4.11", "ts-node-dev": "^1.1.8", @@ -83,7 +91,6 @@ "@hono/node-server": "^1.19.14", "@remix-run/router": "^1.23.2", "@remix-run/server-runtime": "^2.17.3", - "ajv": "^8.20.0", "axios": "^1.17.0", "brace-expansion": "^5.0.6", "cookie": "^0.7.0", @@ -101,7 +108,6 @@ "minimatch": "^10.2.1", "next": "^15.5.10", "on-headers": "^1.1.0", - "path-to-regexp": "^8.4.2", "picomatch": "^2.3.2", "qs": "^6.15.2", "react-router": "^6.30.2", @@ -245,11 +251,11 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.1", "", { "dependencies": { "eslint-visitor-keys": "3.4.3" }, "peerDependencies": { "eslint": "8.57.1" } }, "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA=="], + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.10.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg=="], - "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "8.18.0", "debug": "4.4.3", "espree": "9.6.1", "globals": "13.24.0", "ignore": "5.3.2", "import-fresh": "3.3.1", "js-yaml": "4.1.0", "minimatch": "10.2.1", "strip-json-comments": "3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="], + "@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="], "@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="], @@ -269,7 +275,7 @@ "@hono/node-server": ["@hono/node-server@1.19.14", "", { "peerDependencies": { "hono": "^4" } }, "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw=="], - "@humanwhocodes/config-array": ["@humanwhocodes/config-array@0.13.0", "", { "dependencies": { "@humanwhocodes/object-schema": "2.0.3", "debug": "4.4.3", "minimatch": "10.2.1" } }, "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw=="], + "@humanwhocodes/config-array": ["@humanwhocodes/config-array@0.13.0", "", { "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" } }, "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw=="], "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], @@ -341,11 +347,11 @@ "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="], - "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "1.2.0" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], - "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "1.19.1" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], @@ -363,6 +369,8 @@ "@redis/time-series": ["@redis/time-series@1.1.0", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g=="], + "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], + "@sinclair/typebox": ["@sinclair/typebox@0.34.49", "", {}, "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A=="], "@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], @@ -407,6 +415,8 @@ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], + "@types/node": ["@types/node@20.19.35", "", { "dependencies": { "undici-types": "6.21.0" } }, "sha512-Uarfe6J91b9HAUXxjvSOdiO2UPOKLm07Q1oh0JHxoZ1y8HoqxDAu3gVrsrOHeiio0kSsoVBt4wFrKOm0dKxVPQ=="], "@types/node-fetch": ["@types/node-fetch@2.6.13", "", { "dependencies": { "@types/node": "20.19.35", "form-data": "4.0.5" } }, "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw=="], @@ -423,6 +433,26 @@ "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.67.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.67.0", "@typescript-eslint/type-utils": "8.67.0", "@typescript-eslint/utils": "8.67.0", "@typescript-eslint/visitor-keys": "8.67.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.67.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.67.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.67.0", "@typescript-eslint/types": "8.67.0", "@typescript-eslint/typescript-estree": "8.67.0", "@typescript-eslint/visitor-keys": "8.67.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w=="], + + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.67.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.67.0", "@typescript-eslint/types": "^8.67.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.67.0", "", { "dependencies": { "@typescript-eslint/types": "8.67.0", "@typescript-eslint/visitor-keys": "8.67.0" } }, "sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.67.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.67.0", "", { "dependencies": { "@typescript-eslint/types": "8.67.0", "@typescript-eslint/typescript-estree": "8.67.0", "@typescript-eslint/utils": "8.67.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.67.0", "", {}, "sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.67.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.67.0", "@typescript-eslint/tsconfig-utils": "8.67.0", "@typescript-eslint/types": "8.67.0", "@typescript-eslint/visitor-keys": "8.67.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.67.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.67.0", "@typescript-eslint/types": "8.67.0", "@typescript-eslint/typescript-estree": "8.67.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.67.0", "", { "dependencies": { "@typescript-eslint/types": "8.67.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA=="], + "@typescript/native-preview": ["@typescript/native-preview@7.0.0-dev.20260213.1", "", { "optionalDependencies": { "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20260213.1", "@typescript/native-preview-darwin-x64": "7.0.0-dev.20260213.1", "@typescript/native-preview-linux-arm": "7.0.0-dev.20260213.1", "@typescript/native-preview-linux-arm64": "7.0.0-dev.20260213.1", "@typescript/native-preview-linux-x64": "7.0.0-dev.20260213.1", "@typescript/native-preview-win32-arm64": "7.0.0-dev.20260213.1", "@typescript/native-preview-win32-x64": "7.0.0-dev.20260213.1" }, "bin": { "tsgo": "bin/tsgo.js" } }, "sha512-TZ/0Tv954jRpn5IHQJZQF0gaNmw//ZTvkgr3nC2H8u9t4GxUhIk5vfAHVFgdl8JnNGbl7gZks37FVsEwXjdHqg=="], "@typescript/native-preview-darwin-arm64": ["@typescript/native-preview-darwin-arm64@7.0.0-dev.20260213.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-nqfuHgFZ8MvaHeb1XOkAGIGc6cR91dwQdlHmlbH918n63JguKzkYjzzulpr48IVn1SVewGwjtfs1moCpaDpWcg=="], @@ -489,7 +519,7 @@ "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "2.1.35", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], - "acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], + "acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="], "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "8.14.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], @@ -521,12 +551,40 @@ "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], + + "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], + "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], + "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="], + + "array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="], + + "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="], + + "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="], + + "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="], + + "array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="], + + "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], + + "ast-types-flow": ["ast-types-flow@0.0.8", "", {}, "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="], + + "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + + "axe-core": ["axe-core@4.13.0", "", {}, "sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A=="], + "axios": ["axios@1.17.0", "", { "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, "sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw=="], + "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], + "babel-jest": ["babel-jest@27.5.1", "", { "dependencies": { "@jest/transform": "27.5.1", "@jest/types": "27.5.1", "@types/babel__core": "7.20.5", "babel-plugin-istanbul": "6.1.1", "babel-preset-jest": "27.5.1", "chalk": "4.1.2", "graceful-fs": "4.2.11", "slash": "3.0.0" }, "peerDependencies": { "@babel/core": "7.29.0" } }, "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg=="], "babel-plugin-istanbul": ["babel-plugin-istanbul@6.1.1", "", { "dependencies": { "@babel/helper-plugin-utils": "7.28.6", "@istanbuljs/load-nyc-config": "1.1.0", "@istanbuljs/schema": "0.1.3", "istanbul-lib-instrument": "5.2.1", "test-exclude": "6.0.0" } }, "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA=="], @@ -561,6 +619,8 @@ "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + "call-bind": ["call-bind@1.0.9", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" } }, "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ=="], + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "1.3.0", "function-bind": "1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "1.0.2", "get-intrinsic": "1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], @@ -619,7 +679,15 @@ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "3.1.1", "shebang-command": "2.0.0", "which": "2.0.2" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], - "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + "damerau-levenshtein": ["damerau-levenshtein@1.0.8", "", {}, "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="], + + "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], + + "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], + + "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "dedent": ["dedent@1.7.2", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA=="], @@ -627,6 +695,10 @@ "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], @@ -637,7 +709,7 @@ "diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], - "doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "2.0.3" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], + "doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], "dotenv": ["dotenv@16.6.1", "", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="], @@ -653,20 +725,30 @@ "emittery": ["emittery@0.13.1", "", {}, "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ=="], - "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], + "es-abstract": ["es-abstract@1.24.2", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg=="], + + "es-abstract-get": ["es-abstract-get@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "es-object-atoms": "^1.1.2", "is-callable": "^1.2.7", "object-inspect": "^1.13.4" } }, "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg=="], + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + "es-iterator-helpers": ["es-iterator-helpers@1.4.0", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.2", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", "math-intrinsics": "^1.1.0" } }, "sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q=="], + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "1.3.0", "get-intrinsic": "1.3.0", "has-tostringtag": "1.0.2", "hasown": "2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="], + + "es-to-primitive": ["es-to-primitive@1.3.4", "", { "dependencies": { "es-abstract-get": "^1.0.0", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "is-callable": "^1.2.7", "is-date-object": "^1.1.0", "is-symbol": "^1.1.1" } }, "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw=="], + "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], @@ -675,13 +757,29 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "4.4.1", "@eslint-community/regexpp": "4.12.1", "@eslint/eslintrc": "2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "0.13.0", "@humanwhocodes/module-importer": "1.0.1", "@nodelib/fs.walk": "1.2.8", "@ungap/structured-clone": "1.3.0", "ajv": "8.18.0", "chalk": "4.1.2", "cross-spawn": "7.0.6", "debug": "4.4.0", "doctrine": "3.0.0", "escape-string-regexp": "4.0.0", "eslint-scope": "7.2.2", "eslint-visitor-keys": "3.4.3", "espree": "9.6.1", "esquery": "1.6.0", "esutils": "2.0.3", "fast-deep-equal": "3.1.3", "file-entry-cache": "6.0.1", "find-up": "5.0.0", "glob-parent": "6.0.2", "globals": "13.24.0", "graphemer": "1.4.0", "ignore": "5.3.2", "imurmurhash": "0.1.4", "is-glob": "4.0.3", "is-path-inside": "3.0.3", "js-yaml": "4.1.0", "json-stable-stringify-without-jsonify": "1.0.1", "levn": "0.4.1", "lodash.merge": "4.6.2", "minimatch": "10.2.1", "natural-compare": "1.4.0", "optionator": "0.9.4", "strip-ansi": "6.0.1", "text-table": "0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="], + "eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="], + + "eslint-import-context": ["eslint-import-context@0.1.9", "", { "dependencies": { "get-tsconfig": "^4.10.1", "stable-hash-x": "^0.2.0" }, "peerDependencies": { "unrs-resolver": "^1.0.0" }, "optionalPeers": ["unrs-resolver"] }, "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg=="], + + "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.10", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.16.1", "resolve": "^2.0.0-next.6" } }, "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ=="], + + "eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@4.4.5", "", { "dependencies": { "debug": "^4.4.1", "eslint-import-context": "^0.1.8", "get-tsconfig": "^4.10.1", "is-bun-module": "^2.0.0", "stable-hash-x": "^0.2.0", "tinyglobby": "^0.2.14", "unrs-resolver": "^1.7.11" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-nbE5XLph6TLtGYcu/U6e6ZVXyKBhbDWK5cLGk76eJ7NdZpwf1P9EFkpt1Z01mNZNrrilsAYWKH6zUkL4reoXbw=="], + + "eslint-module-utils": ["eslint-module-utils@2.14.0", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig=="], + + "eslint-plugin-import": ["eslint-plugin-import@2.32.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", "array.prototype.findlastindex": "^1.2.6", "array.prototype.flat": "^1.3.3", "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.1", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA=="], - "eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "4.3.0", "estraverse": "5.3.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], + "eslint-plugin-jsx-a11y": ["eslint-plugin-jsx-a11y@6.10.2", "", { "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", "axe-core": "^4.10.0", "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", "string.prototype.includes": "^2.0.1" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q=="], + + "eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="], + + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@7.1.1", "", { "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "hermes-parser": "^0.25.1", "zod": "^3.25.0 || ^4.0.0", "zod-validation-error": "^3.5.0 || ^4.0.0" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" } }, "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g=="], + + "eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "8.14.0", "acorn-jsx": "5.3.2", "eslint-visitor-keys": "3.4.3" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], + "espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "5.3.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], @@ -719,11 +817,13 @@ "fast-uri": ["fast-uri@3.1.2", "", {}, "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ=="], - "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "1.1.0" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="], - "file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "3.2.0" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], @@ -731,12 +831,14 @@ "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "6.0.0", "path-exists": "4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], - "flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "3.3.3", "keyv": "4.5.4", "rimraf": "3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="], + "flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="], "flatted": ["flatted@3.4.2", "", {}, "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA=="], "follow-redirects": ["follow-redirects@1.16.0", "", {}, "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw=="], + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "7.0.6", "signal-exit": "4.1.0" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], "form-data": ["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" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], @@ -753,6 +855,12 @@ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + "function.prototype.name": ["function.prototype.name@1.2.0", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2", "hasown": "^2.0.4", "is-callable": "^1.2.7", "is-document.all": "^1.0.0" } }, "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew=="], + + "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], + + "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="], + "generic-pool": ["generic-pool@3.9.0", "", {}, "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g=="], "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], @@ -769,11 +877,17 @@ "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], + + "get-tsconfig": ["get-tsconfig@4.14.2", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-XpwZALwwl/BaKTAyC6+c5T8y6kCg2jk+XGqOVrKIQmW49pNypYLMRjCUXqa28tQgJlhS2RlzP7sc+Rx7W6qsfw=="], + "glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "3.3.1", "jackspeak": "3.4.3", "minimatch": "10.2.1", "minipass": "7.1.2", "package-json-from-dist": "1.0.1", "path-scurry": "1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="], + "globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="], + + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], @@ -783,14 +897,24 @@ "handlebars": ["handlebars@4.7.9", "", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ=="], + "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "1.1.0" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + "hermes-estree": ["hermes-estree@0.25.1", "", {}, "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw=="], + + "hermes-parser": ["hermes-parser@0.25.1", "", { "dependencies": { "hermes-estree": "0.25.1" } }, "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA=="], + "hono": ["hono@4.12.23", "", {}, "sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA=="], "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], @@ -807,7 +931,7 @@ "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": "2.1.2" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], - "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "ignore": ["ignore@7.0.6", "", {}, "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw=="], "immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="], @@ -819,36 +943,84 @@ "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], + "ip-address": ["ip-address@10.2.0", "", {}, "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA=="], "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], + + "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "2.3.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], + + "is-bun-module": ["is-bun-module@2.0.0", "", { "dependencies": { "semver": "^7.7.1" } }, "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], + + "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], + + "is-document.all": ["is-document.all@1.0.0", "", { "dependencies": { "call-bound": "^1.0.4" } }, "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g=="], + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], "is-generator-fn": ["is-generator-fn@2.1.0", "", {}, "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="], + "is-generator-function": ["is-generator-function@1.1.2", "", { "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA=="], + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], + + "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], + "is-network-error": ["is-network-error@1.3.1", "", {}, "sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw=="], "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], + "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + + "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], + + "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], + "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], + + "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], + + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + "is-typedarray": ["is-typedarray@1.0.0", "", {}, "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="], + "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], + + "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], + + "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], @@ -863,6 +1035,8 @@ "istanbul-reports": ["istanbul-reports@3.2.0", "", { "dependencies": { "html-escaper": "2.0.2", "istanbul-lib-report": "3.0.1" } }, "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA=="], + "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="], + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], "jest": ["jest@30.4.2", "", { "dependencies": { "@jest/core": "30.4.2", "@jest/types": "30.4.1", "import-local": "^3.2.0", "jest-cli": "30.4.2" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": "./bin/jest.js" }, "sha512-Yi1jqNC/Oq0N4hBgNH/YvBpP1P57QqundgytzYqy3yqAa7NZPNjSoi4SGbRAXDMdBzNE6xBCi5U7RgfrvMEUVQ=="], @@ -943,12 +1117,18 @@ "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="], + "jszip": ["jszip@3.10.1", "", { "dependencies": { "lie": "3.3.0", "pako": "1.0.11", "readable-stream": "2.3.8", "setimmediate": "1.0.5" } }, "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g=="], "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], "langsmith": ["langsmith@0.7.4", "", { "dependencies": { "p-queue": "6.6.2" }, "peerDependencies": { "@opentelemetry/api": "*", "@opentelemetry/exporter-trace-otlp-proto": "*", "@opentelemetry/sdk-trace-base": "*", "openai": "*", "ws": ">=7" }, "optionalPeers": ["@opentelemetry/api", "@opentelemetry/exporter-trace-otlp-proto", "@opentelemetry/sdk-trace-base", "openai", "ws"] }, "sha512-EGYCw85etSarYazeTgj8DICVIFg+26gsVZ0zq8V7kjIb59huURJpZZJqVFkvRpZFxmfyYrpIhtk2qtHgGR8K+w=="], + "language-subtag-registry": ["language-subtag-registry@0.3.23", "", {}, "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ=="], + + "language-tags": ["language-tags@1.0.9", "", { "dependencies": { "language-subtag-registry": "^0.3.20" } }, "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA=="], + "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "1.2.1", "type-check": "0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], @@ -965,7 +1145,9 @@ "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "3.1.1" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], "make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "7.7.4" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="], @@ -1015,6 +1197,8 @@ "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], + "node-exports-info": ["node-exports-info@1.6.2", "", { "dependencies": { "array.prototype.flatmap": "^1.3.3", "es-errors": "^1.3.0", "object.entries": "^1.1.9", "semver": "^6.3.1" } }, "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag=="], + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "5.0.0" } }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], @@ -1029,6 +1213,18 @@ "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + + "object.entries": ["object.entries@1.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw=="], + + "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], + + "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="], + + "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], @@ -1039,6 +1235,8 @@ "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "0.1.4", "fast-levenshtein": "2.0.6", "levn": "0.4.1", "prelude-ls": "1.2.1", "type-check": "0.4.0", "word-wrap": "1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + "own-keys": ["own-keys@1.0.2", "", { "dependencies": { "call-bound": "^1.0.4", "get-intrinsic": "^1.3.0", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg=="], + "p-finally": ["p-finally@1.0.0", "", {}, "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="], "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], @@ -1071,7 +1269,7 @@ "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "10.4.3", "minipass": "7.1.2" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], - "path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="], + "path-to-regexp": ["path-to-regexp@0.1.13", "", {}, "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA=="], "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], @@ -1083,6 +1281,8 @@ "pkg-dir": ["pkg-dir@4.2.0", "", { "dependencies": { "find-up": "4.1.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="], + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], "prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="], @@ -1091,10 +1291,14 @@ "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], "proxy-from-env": ["proxy-from-env@2.1.0", "", {}, "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA=="], + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + "pure-rand": ["pure-rand@7.0.1", "", {}, "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ=="], "qs": ["qs@6.15.2", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw=="], @@ -1105,7 +1309,7 @@ "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="], - "react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], "react-is-18": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], @@ -1117,16 +1321,22 @@ "redis": ["redis@4.7.1", "", { "dependencies": { "@redis/bloom": "1.2.0", "@redis/client": "1.6.1", "@redis/graph": "1.1.1", "@redis/json": "1.0.7", "@redis/search": "1.2.0", "@redis/time-series": "1.1.0" } }, "sha512-S1bJDnqLftzHXHP8JsT5II/CtHWQrASX5K96REjWjlmWKrviSOLWmM7QnRLstAWsu1VBBV1ffV6DzCvxNP0UJQ=="], + "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], + + "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], - "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "2.16.1", "path-parse": "1.0.7", "supports-preserve-symlinks-flag": "1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], + "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], "resolve-cwd": ["resolve-cwd@3.0.0", "", { "dependencies": { "resolve-from": "5.0.0" } }, "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg=="], "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + "resolve.exports": ["resolve.exports@1.1.1", "", {}, "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ=="], "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], @@ -1135,22 +1345,34 @@ "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "1.2.3" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], + "safe-array-concat": ["safe-array-concat@1.1.4", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg=="], + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], + + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], "selenium-webdriver": ["selenium-webdriver@4.44.0", "", { "dependencies": { "@bazel/runfiles": "^6.5.0", "jszip": "^3.10.1", "tmp": "^0.2.5", "ws": "^8.20.1" } }, "sha512-7RbYoKK0zET+KMVak11UDCtKvNulOU6gFZp8HI5GN9K8+BhqrliIJU/FP6QADrvRAXFMr3wHxfE3JHOcAxO3GQ=="], - "semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "send": ["send@0.19.2", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "2.0.0", "escape-html": "1.0.3", "etag": "1.8.1", "fresh": "0.5.2", "http-errors": "2.0.1", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "1.2.1", "statuses": "2.0.2" } }, "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg=="], "serve-static": ["serve-static@1.16.3", "", { "dependencies": { "encodeurl": "2.0.0", "escape-html": "1.0.3", "parseurl": "1.3.3", "send": "0.19.2" } }, "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA=="], + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], + + "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], + "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], @@ -1177,16 +1399,32 @@ "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "1.1.2", "source-map": "0.6.1" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + "stable-hash-x": ["stable-hash-x@0.2.0", "", {}, "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ=="], + "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], + "string-length": ["string-length@4.0.2", "", { "dependencies": { "char-regex": "1.0.2", "strip-ansi": "6.0.1" } }, "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ=="], "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "string.prototype.includes": ["string.prototype.includes@2.0.1", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3" } }, "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg=="], + + "string.prototype.matchall": ["string.prototype.matchall@4.0.12", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA=="], + + "string.prototype.repeat": ["string.prototype.repeat@1.0.0", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="], + + "string.prototype.trim": ["string.prototype.trim@1.2.11", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.2", "es-object-atoms": "^1.1.2", "has-property-descriptors": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w=="], + + "string.prototype.trimend": ["string.prototype.trimend@1.0.10", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.2" } }, "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw=="], + + "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], + "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "5.1.2" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -1209,6 +1447,8 @@ "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="], + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], + "tmp": ["tmp@0.2.7", "", {}, "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw=="], "tmpl": ["tmpl@1.0.5", "", {}, "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="], @@ -1221,6 +1461,8 @@ "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], + "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="], + "ts-jest": ["ts-jest@29.4.11", "", { "dependencies": { "bs-logger": "^0.2.6", "fast-json-stable-stringify": "^2.1.0", "handlebars": "^4.7.9", "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", "semver": "^7.8.0", "type-fest": "^4.41.0", "yargs-parser": "^21.1.1" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", "@jest/transform": "^29.0.0 || ^30.0.0", "@jest/types": "^29.0.0 || ^30.0.0", "babel-jest": "^29.0.0 || ^30.0.0", "jest": "^29.0.0 || ^30.0.0", "jest-util": "^29.0.0 || ^30.0.0", "typescript": ">=4.3 <7" }, "optionalPeers": ["@babel/core", "@jest/transform", "@jest/types", "babel-jest", "jest-util"], "bin": { "ts-jest": "cli.js" } }, "sha512-IrFl7l9AuB/qrNw5quqvAv/hmKMb8dhWOH4jQOGo0Oq8tCeo1O86/iTFG1FaRimgUkF13l4PcepO8ATFT6Ns4g=="], "ts-node": ["ts-node@9.1.1", "", { "dependencies": { "arg": "4.1.3", "create-require": "1.1.1", "diff": "4.0.4", "make-error": "1.3.6", "source-map-support": "0.5.21", "yn": "3.1.1" }, "peerDependencies": { "typescript": "5.9.3" }, "bin": { "ts-node": "dist/bin.js", "ts-script": "dist/bin-script-deprecated.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js" } }, "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg=="], @@ -1229,6 +1471,8 @@ "tsconfig": ["tsconfig@7.0.0", "", { "dependencies": { "@types/strip-bom": "3.0.0", "@types/strip-json-comments": "0.0.30", "strip-bom": "3.0.0", "strip-json-comments": "2.0.1" } }, "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw=="], + "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "tsx": ["tsx@4.22.4", "", { "dependencies": { "esbuild": "~0.28.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg=="], @@ -1243,12 +1487,22 @@ "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "2.1.35" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], + "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], + + "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], + + "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], + + "typed-array-length": ["typed-array-length@1.0.8", "", { "dependencies": { "call-bind": "^1.0.9", "for-each": "^0.3.5", "gopd": "^1.2.0", "is-typed-array": "^1.1.15", "possible-typed-array-names": "^1.1.0", "reflect.getprototypeof": "^1.0.10" } }, "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g=="], + "typedarray-to-buffer": ["typedarray-to-buffer@3.1.5", "", { "dependencies": { "is-typedarray": "1.0.0" } }, "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q=="], "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], "uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="], + "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], @@ -1257,6 +1511,8 @@ "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "3.2.0", "picocolors": "1.1.1" }, "peerDependencies": { "browserslist": "4.28.1" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], @@ -1279,6 +1535,14 @@ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], + + "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], + + "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], + + "which-typed-array": ["which-typed-array@1.1.22", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw=="], + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], "wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="], @@ -1311,21 +1575,13 @@ "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="], - "@babel/core/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - - "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "3.1.1" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - - "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "zod-validation-error": ["zod-validation-error@4.0.2", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ=="], "@babel/plugin-syntax-jsx/@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.29.7", "", {}, "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw=="], - "@babel/traverse/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - - "@eslint/eslintrc/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "@humanwhocodes/config-array/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "0.2.0", "emoji-regex": "9.2.2", "strip-ansi": "7.1.0" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], @@ -1377,10 +1633,18 @@ "@modelcontextprotocol/sdk/express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="], - "agent-base/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "@types/ajv/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], + + "@typescript-eslint/typescript-estree/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], + + "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + + "acorn-jsx/acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], "ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], + "array.prototype.findlast/es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], + "babel-jest/@jest/types": ["@jest/types@27.5.1", "", { "dependencies": { "@types/istanbul-lib-coverage": "2.0.6", "@types/istanbul-reports": "3.0.4", "@types/node": "20.19.35", "@types/yargs": "16.0.11", "chalk": "4.1.2" } }, "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw=="], "babel-jest/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "4.3.0", "supports-color": "7.2.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -1395,8 +1659,26 @@ "cliui/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "6.1.0" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + "es-abstract/es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], + + "es-abstract-get/es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], + + "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "4.3.0", "supports-color": "7.2.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-import/doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], + + "eslint-plugin-react/doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], + "execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], "expect/jest-util": ["jest-util@30.4.1", "", { "dependencies": { "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "graceful-fs": "^4.2.11", "picomatch": "^4.0.3" } }, "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw=="], @@ -1405,15 +1687,19 @@ "finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - "flat-cache/rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "10.5.0" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + "flat-cache/rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + + "function.prototype.name/hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="], "globals/type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], - "https-proxy-agent/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "is-bun-module/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], + + "istanbul-lib-instrument/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], "istanbul-lib-report/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "istanbul-lib-source-maps/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "iterator.prototype/es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], "jest-changed-files/jest-util": ["jest-util@30.4.1", "", { "dependencies": { "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "graceful-fs": "^4.2.11", "picomatch": "^4.0.3" } }, "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw=="], @@ -1479,6 +1765,8 @@ "jest-snapshot/jest-util": ["jest-util@30.4.1", "", { "dependencies": { "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "graceful-fs": "^4.2.11", "picomatch": "^4.0.3" } }, "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw=="], + "jest-snapshot/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], + "jest-util/@jest/types": ["@jest/types@27.5.1", "", { "dependencies": { "@types/istanbul-lib-coverage": "2.0.6", "@types/istanbul-reports": "3.0.4", "@types/node": "20.19.35", "@types/yargs": "16.0.11", "chalk": "4.1.2" } }, "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw=="], "jest-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "4.3.0", "supports-color": "7.2.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -1495,10 +1783,18 @@ "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + "lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + "make-dir/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + "object.assign/es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], + + "object.entries/es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], + "openai/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "5.26.5" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], + "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + "pkg-dir/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "5.0.0", "path-exists": "4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], @@ -1507,24 +1803,52 @@ "readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + "reflect.getprototypeof/es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], + + "resolve/is-core-module": ["is-core-module@2.16.2", "", { "dependencies": { "hasown": "^2.0.3" } }, "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA=="], + "resolve-cwd/resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], - "router/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "router/path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="], + + "safe-array-concat/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "safe-push-apply/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + "set-proto/es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], + "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], + "string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + "string-width/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "6.1.0" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "string.prototype.matchall/es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], + + "string.prototype.trim/es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], + + "string.prototype.trimend/es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], + + "string.prototype.trimstart/es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], + "string_decoder/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + "ts-jest/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], + + "ts-node-dev/resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "2.16.1", "path-parse": "1.0.7", "supports-preserve-symlinks-flag": "1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], + "ts-node-dev/rimraf": ["rimraf@2.7.1", "", { "dependencies": { "glob": "10.5.0" }, "bin": { "rimraf": "./bin.js" } }, "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="], "tsconfig/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], + + "which-builtin-type/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], "wrap-ansi/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "6.1.0" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], @@ -1535,9 +1859,7 @@ "yargs/yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], - "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - - "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], @@ -1583,8 +1905,6 @@ "@modelcontextprotocol/sdk/express/cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], - "@modelcontextprotocol/sdk/express/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - "@modelcontextprotocol/sdk/express/finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], "@modelcontextprotocol/sdk/express/fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], @@ -1603,12 +1923,12 @@ "babel-jest/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "babel-plugin-istanbul/istanbul-lib-instrument/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "cliui/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "eslint/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "expect/jest-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "4.3.0", "supports-color": "7.2.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -1657,6 +1977,8 @@ "jest-pnp-resolver/jest-resolve/jest-validate": ["jest-validate@27.5.1", "", { "dependencies": { "@jest/types": "27.5.1", "camelcase": "6.3.0", "chalk": "4.1.2", "jest-get-type": "27.5.1", "leven": "3.1.0", "pretty-format": "27.5.1" } }, "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ=="], + "jest-pnp-resolver/jest-resolve/resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "2.16.1", "path-parse": "1.0.7", "supports-preserve-symlinks-flag": "1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], + "jest-resolve/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "jest-runner/@jest/transform/babel-plugin-istanbul": ["babel-plugin-istanbul@7.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^6.0.0" } }, "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA=="], @@ -1691,6 +2013,8 @@ "pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + "resolve/is-core-module/hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="], + "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "string-width/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], @@ -1751,6 +2075,8 @@ "jest-pnp-resolver/jest-resolve/jest-validate/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + "jest-pnp-resolver/jest-resolve/jest-validate/pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "2.2.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], } } diff --git a/package.json b/package.json index fed66e2..9e84672 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,8 @@ "scripts": { "build": "bash ./scripts/with-bun-path.sh ./node_modules/.bin/turbo run build", "dev": "bash ./scripts/with-bun-path.sh ./node_modules/.bin/turbo run dev", - "frontend:install": "bash ./bun.sh install --filter ./apps/ui --filter ./apps/homepage", - "frontend:install+preflight": "bash ./scripts/run-frontend-stack.sh install-summary && bash ./scripts/run-frontend-stack.sh frontend-preflight", + "frontend:install": "bash ./scripts/install-frontend.sh", + "frontend:install+preflight": "bash ./scripts/install-frontend.sh && bash ./scripts/run-frontend-stack.sh preflight", "frontend:stack": "bash ./scripts/run-frontend-stack.sh dev", "workspace:surface:summary": "bash ./scripts/run-frontend-stack.sh workspace-surface-summary", "workspace:surface:summary+preflight": "bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && bash ./scripts/run-frontend-stack.sh frontend-preflight", @@ -34,26 +34,26 @@ "workspace:surface:root:summary:typecheck:thread": "bash -lc 'echo \"Workspace-surface goal context for thread 81e4602c-053a-49e1-9336-6f982b3c2fdb:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.\" && echo \"Workspace-surface touched-path context for thread 81e4602c-053a-49e1-9336-6f982b3c2fdb:workspace-surface: package.json workspace:surface:root:summary:typecheck:thread developer-workflow alias.\" && echo \"Workspace-surface improvement signal for thread 81e4602c-053a-49e1-9336-6f982b3c2fdb:workspace-surface: no code-local failure is active, sampled LangSmith feedback is quiet, and pending or sibling-thread activity is partial observability only rather than validation for this thread.\" && echo \"Workspace-surface defer reason for thread 81e4602c-053a-49e1-9336-6f982b3c2fdb:workspace-surface: cross-thread activity does not satisfy validation for this thread, and no fresh same-thread LangSmith run/trace is visible yet, so local workspace summary and root typecheck output are useful workspace evidence only unless a fresh same-thread LangSmith run/trace is also emitted.\" && bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo \"Workspace-surface smoke step for thread 81e4602c-053a-49e1-9336-6f982b3c2fdb:workspace-surface: workspace summary completed; proceeding to root typecheck through the Bun PATH helper.\" && bash ./scripts/with-bun-path.sh bun run workspace:surface:root:typecheck && echo \"Workspace-surface validation reminder for thread 81e4602c-053a-49e1-9336-6f982b3c2fdb:workspace-surface: local summary and root typecheck passed only if both commands succeeded, but this iteration still requires at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result for package.json, or a clear operator-facing no-run defer reason if no run was emitted.\"'", "workspace:surface:thread:check": "bash ./scripts/with-bun-path.sh bun run workspace:surface:root:summary:typecheck:thread", "workspace:surface:root:typecheck:thread": "bash -lc 'echo \"Workspace-surface goal context for thread 5ba2dbcc-459f-4d07-b7e4-8098e2bd79e2:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.\" && echo \"Workspace-surface touched-path context for thread 5ba2dbcc-459f-4d07-b7e4-8098e2bd79e2:workspace-surface: package.json workspace:surface:root:typecheck:thread developer-workflow alias.\" && echo \"Workspace-surface improvement signal for thread 5ba2dbcc-459f-4d07-b7e4-8098e2bd79e2:workspace-surface: no code-local failure is active, sampled LangSmith feedback is quiet, and cross-thread activity from sibling threads is useful background only rather than validation for this thread.\" && echo \"Workspace-surface defer reason for thread 5ba2dbcc-459f-4d07-b7e4-8098e2bd79e2:workspace-surface: no fresh same-thread LangSmith run/trace is visible for this iteration, so local root typecheck output is useful workspace evidence only unless a fresh same-thread LangSmith run/trace is also emitted.\" && bash ./scripts/with-bun-path.sh bun run workspace:surface:root:typecheck && echo \"Workspace-surface validation reminder for thread 5ba2dbcc-459f-4d07-b7e4-8098e2bd79e2:workspace-surface: root typecheck passed only if the command succeeded, but this iteration still requires at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result for package.json, or a clear operator-facing no-run defer reason if no run was emitted.\"'", - "workspace:surface:summary:thread": "bash -lc 'echo \"Workspace-surface goal context for thread 8739b1d5-0be2-4091-90f2-44fe32d8c6dd:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.\" && echo \"Workspace-surface touched-path context for thread 8739b1d5-0be2-4091-90f2-44fe32d8c6dd:workspace-surface: package.json workspace:surface:summary:thread developer-workflow alias.\" && echo \"Workspace-surface improvement signal for thread 8739b1d5-0be2-4091-90f2-44fe32d8c6dd:workspace-surface: no code-local failure is active, sampled LangSmith feedback is quiet, and pending-only same-thread visibility is partial observability only rather than completed validation.\" && echo \"Workspace-surface defer reason for thread 8739b1d5-0be2-4091-90f2-44fe32d8c6dd:workspace-surface: cross-thread LangSmith activity does not satisfy this iteration, and local workspace summary output is useful workspace evidence only unless a fresh same-thread LangSmith run/trace is also emitted.\" && bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo \"Workspace-surface validation reminder for thread 8739b1d5-0be2-4091-90f2-44fe32d8c6dd:workspace-surface: next confirm at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or preserve a clear no-run defer reason if no run was emitted.\"' same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result for package.json, or preserve a clear operator-facing no-run defer reason if no run was emitted.\"'", + "workspace:surface:summary:thread": "bash -lc 'echo \"Workspace-surface goal context for thread 8739b1d5-0be2-4091-90f2-44fe32d8c6dd:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.\" && echo \"Workspace-surface touched-path context for thread 8739b1d5-0be2-4091-90f2-44fe32d8c6dd:workspace-surface: package.json workspace:surface:summary:thread developer-workflow alias.\" && echo \"Workspace-surface improvement signal for thread 8739b1d5-0be2-4091-90f2-44fe32d8c6dd:workspace-surface: no code-local failure is active, sampled LangSmith feedback is quiet, and pending-only same-thread visibility is partial observability only rather than completed validation.\" && echo \"Workspace-surface defer reason for thread 8739b1d5-0be2-4091-90f2-44fe32d8c6dd:workspace-surface: cross-thread LangSmith activity does not satisfy this iteration, and local workspace summary output is useful workspace evidence only unless a fresh same-thread LangSmith run/trace is also emitted.\" && bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo \"Workspace-surface validation reminder for thread 8739b1d5-0be2-4091-90f2-44fe32d8c6dd:workspace-surface: next confirm at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or preserve a clear no-run defer reason if no run was emitted.\"'", "workspace:surface:root-check:d6a25172": "bash -lc 'echo \"Workspace-surface goal context for thread d6a25172-0e0d-448c-af5e-833105a8be12:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.\" && echo \"Workspace-surface touched-path context for thread d6a25172-0e0d-448c-af5e-833105a8be12:workspace-surface: package.json workspace:surface:root-check:d6a25172 developer-workflow alias.\" && echo \"Workspace-surface improvement signal for thread d6a25172-0e0d-448c-af5e-833105a8be12:workspace-surface: no code-local failure is active, recent LangSmith runs are quiet, and pending or cross-thread activity is partial observability only rather than completed validation for this thread.\" && echo \"Workspace-surface defer reason for thread d6a25172-0e0d-448c-af5e-833105a8be12:workspace-surface: cross-thread LangSmith activity does not satisfy validation for this thread, and local workspace summary plus root typecheck are useful workspace evidence only unless a fresh same-thread LangSmith run/trace is also emitted.\" && bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo \"Workspace-surface smoke step for thread d6a25172-0e0d-448c-af5e-833105a8be12:workspace-surface: workspace summary completed; proceeding to root typecheck through the Bun PATH helper.\" && bash ./scripts/with-bun-path.sh bun run typecheck && echo \"Workspace-surface validation reminder for thread d6a25172-0e0d-448c-af5e-833105a8be12:workspace-surface: local summary and root typecheck are compile-time workspace evidence only unless a fresh same-thread LangSmith run/trace is also emitted; next confirm at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result for package.json, or preserve a clear operator-facing no-run defer reason if no run was emitted.\"'", "workspace:surface:snapshot": "bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo 'Workspace-surface goal context for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: package.json workspace:surface:snapshot developer-workflow alias.' && echo 'Workspace-surface repair signal for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: LangSmith feedback sampled contains_goal_context=0 and repair_smoke_passed=0, so this bounded snapshot emits explicit same-thread goal context before local summary and typecheck steps.' && echo 'Workspace-surface observability note for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: recent same-thread summarize evidence is useful context only, while sibling pending activity is partial observability only and does not satisfy this iteration by itself.' && echo 'Workspace-surface defer reminder for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: pending or cross-thread LangSmith activity does not satisfy this iteration; local summary and typecheck are workspace smoke evidence only unless a fresh same-thread LangSmith run/trace is also emitted.' && echo 'Workspace-surface operator no-run defer for thread c00b351c-9663-4fd5-b791-97e2b2267297:workspace-surface: cross-thread LangSmith activity does not satisfy this iteration, pending visibility is partial observability only, and local workspace smoke output is useful developer evidence but not completed same-thread validation by itself.' && echo 'Workspace-surface validation reminder for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: next confirm at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result for package.json, or preserve a clear operator-facing no-run defer reason if no run was emitted.' && bash ./scripts/with-bun-path.sh workspace-surface-summary-typecheck", "workspace:surface:run": "bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo 'Workspace-surface goal context for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: package.json workspace:surface:run developer-workflow alias.' && echo 'Workspace-surface improvement signal for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: no code-local failure is active, governance is quiet, and 6 pending LangSmith runs sampled in this window are partial observability only for this same thread, so this bounded alias now emits the existing workspace summary before the snapshot flow.' && echo 'Workspace-surface operator defer reason for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: pending-only same-thread visibility is partial observability only, cross-thread activity does not satisfy validation for this iteration, and local workspace summary or typecheck output is useful smoke evidence only unless a fresh same-thread LangSmith run/trace is also emitted.' && echo 'Workspace-surface validation reminder for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: next confirm at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or preserve a clear operator-facing no-run defer reason if no run was emitted.' && bash ./scripts/with-bun-path.sh bun run workspace:surface:snapshot", "workspace:surface:thread-snapshot": "echo 'Workspace-surface goal context for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: package.json workspace:surface:thread-snapshot developer-workflow alias.' && echo 'Workspace-surface improvement signal for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: no code-local failure is active, governance is quiet, and 4 pending LangSmith runs sampled in this window are partial observability only for this same thread, so this alias emits explicit same-thread context before the existing bounded snapshot flow.' && echo 'Workspace-surface operator defer reason for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: pending-only same-thread visibility and cross-thread activity do not complete validation for this iteration; local workspace summary or typecheck output is useful smoke evidence only unless a fresh same-thread LangSmith run/trace is also emitted.' && echo 'Workspace-surface validation reminder for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: next confirm at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or preserve a clear operator-facing no-run defer reason if no run was emitted.' && bash ./scripts/with-bun-path.sh bun run workspace:surface:snapshot", "frontend:install:status": "bash ./scripts/run-frontend-stack.sh install-check-status", - "frontend:install:only": "bash ./scripts/run-frontend-stack.sh install-check-only", + "frontend:install:only": "bash ./scripts/install-frontend.sh", "workspace:surface:status:thread": "bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo 'Workspace-surface goal context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface improvement signal for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: no code-local failure is active, governance is quiet, and sampled pending LangSmith runs are partial observability only, so this alias emits explicit same-thread context before the existing workspace status snapshot path.' && echo 'Workspace-surface defer reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: pending or cross-thread LangSmith activity does not satisfy this iteration; next confirm at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or preserve a clear operator-facing no-run defer reason if no run was emitted.' && bash ./scripts/with-bun-path.sh bun run frontend:status:snapshot:thread", "workspace:surface:summary:thread:169aed89": "bash -lc 'echo \"Workspace-surface goal context for thread 169aed89-ec88-455a-858a-1d7a85586631:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.\" && echo \"Workspace-surface touched-path context for thread 169aed89-ec88-455a-858a-1d7a85586631:workspace-surface: package.json workspace:surface:summary:thread:169aed89 developer-workflow alias.\" && echo \"Workspace-surface improvement signal for thread 169aed89-ec88-455a-858a-1d7a85586631:workspace-surface: no code-local failure is active, recent LangSmith runs are quiet, and 3 pending runs sampled in this window are partial observability only for this thread rather than completed validation.\" && echo \"Workspace-surface defer reason for thread 169aed89-ec88-455a-858a-1d7a85586631:workspace-surface: cross-thread LangSmith activity from sibling threads does not satisfy this iteration, and local workspace summary plus root typecheck output are useful workspace evidence only unless a fresh same-thread LangSmith run/trace is also emitted.\" && bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo \"Workspace-surface smoke step for thread 169aed89-ec88-455a-858a-1d7a85586631:workspace-surface: workspace summary completed; proceeding to the bounded root typecheck path through the Bun PATH helper.\" && bash ./scripts/with-bun-path.sh bun run workspace:surface:root:typecheck && echo \"Workspace-surface validation reminder for thread 169aed89-ec88-455a-858a-1d7a85586631:workspace-surface: local summary and root typecheck passed only if both commands succeeded, but this iteration still requires at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result for package.json, or a clear operator-facing no-run defer reason if no run was emitted.\"'", "frontend:status:snapshot:thread": "bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo 'Workspace-surface goal context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: package.json frontend:status:snapshot:thread developer workflow.' && echo 'Workspace-surface repair signal for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: no code-local failure is active, governance is quiet, and 6 pending LangSmith runs are partial observability only, so this quick snapshot captures bounded workspace readiness before deeper smoke validation.' && echo 'Operator note for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: pending or cross-thread LangSmith activity does not satisfy this iteration; this snapshot is readiness evidence only, and if no fresh same-thread run/trace is emitted it should be treated as a clear no-run defer reason until workspace smoke/typecheck also passes.' && bash ./scripts/with-bun-path.sh bun run frontend:install:status && bash ./scripts/with-bun-path.sh bun run frontend:stack:status && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: snapshot commands completed locally, but validation still requires at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or a clear no-run defer reason if no run is emitted.'", - "frontend:install-check": "bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo 'Workspace-surface goal context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: package.json frontend:install-check developer workflow.' && echo 'Operator note for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: pending or cross-thread LangSmith activity is partial observability only and does not satisfy this iteration; use this bounded workspace smoke step to capture install status, then run frontend typecheck, then confirm a fresh same-thread run/trace or preserve a clear no-run defer reason.' && (bash ./scripts/with-bun-path.sh bun run frontend:install:status && echo 'Workspace-surface smoke step for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: frontend install status completed; proceeding to frontend typecheck through the Bun PATH helper.' && bash ./scripts/with-bun-path.sh bun run frontend:typecheck && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: install status and frontend typecheck passed locally, but this iteration still requires at least one fresh same-thread LangSmith run/trace with explicit goal context or a clear no-run defer reason.' || (echo 'Workspace-surface operator defer for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: bounded install-status/typecheck validation did not complete cleanly from package.json frontend:install-check, so no fresh same-thread LangSmith run/trace is confirmed by this local workflow.' && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: pending or cross-thread LangSmith activity remains partial observability only; rerun after fixing the local smoke failure, then confirm a fresh same-thread run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or preserve this no-run defer reason.' && exit 1)))", - "frontend:install:quickcheck": "bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo 'Workspace-surface goal context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo with one bounded root-workspace developer-workflow improvement.' && echo 'Workspace-surface touched-path context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: package.json frontend:install:quickcheck developer workflow.' && echo 'Workspace-surface repair signal for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: no code-local failure is active, governance is quiet, and 5 pending LangSmith runs sampled in this window are partial observability only for this thread, so this quickcheck alias now routes the bounded install-status plus typecheck path through the same-thread summary and Bun PATH helper.' && echo 'Operator note for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: 5 pending or cross-thread LangSmith runs sampled in this window are partial observability only for this thread and do not satisfy validation by themselves; run this install-status plus typecheck path, then confirm a fresh same-thread run/trace or preserve a clear no-run defer reason.' && (bash ./scripts/with-bun-path.sh bun run frontend:install:status && echo 'Workspace-surface smoke step for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: frontend install status completed; proceeding to frontend typecheck through the Bun PATH helper.' && bash ./scripts/with-bun-path.sh bun run frontend:typecheck && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: install status and frontend typecheck passed locally, but this iteration still requires at least one fresh same-thread LangSmith run/trace with explicit goal context or a clear no-run defer reason.') || (echo 'Workspace-surface operator defer for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: bounded install-status/typecheck quickcheck did not complete cleanly, so validation remains incomplete and no fresh same-thread LangSmith run/trace is confirmed from this local workflow.' && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: cross-thread or pending LangSmith activity is partial observability only; rerun after fixing the local smoke failure, then confirm a fresh same-thread run/trace with explicit goal context plus a passed smoke/typecheck result, or preserve this no-run defer reason.' && exit 1))", + "frontend:install-check": "bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo 'Workspace-surface goal context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: package.json frontend:install-check developer workflow.' && echo 'Operator note for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: pending or cross-thread LangSmith activity is partial observability only and does not satisfy this iteration; use this bounded workspace smoke step to capture install status, then run frontend typecheck, then confirm a fresh same-thread run/trace or preserve a clear no-run defer reason.' && (bash ./scripts/with-bun-path.sh bun run frontend:install:status && echo 'Workspace-surface smoke step for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: frontend install status completed; proceeding to frontend typecheck through the Bun PATH helper.' && bash ./scripts/with-bun-path.sh bun run frontend:typecheck && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: install status and frontend typecheck passed locally, but this iteration still requires at least one fresh same-thread LangSmith run/trace with explicit goal context or a clear no-run defer reason.' || (echo 'Workspace-surface operator defer for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: bounded install-status/typecheck validation did not complete cleanly from package.json frontend:install-check, so no fresh same-thread LangSmith run/trace is confirmed by this local workflow.' && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: pending or cross-thread LangSmith activity remains partial observability only; rerun after fixing the local smoke failure, then confirm a fresh same-thread run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or preserve this no-run defer reason.' && exit 1))", + "frontend:install:quickcheck": "bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo 'Workspace-surface goal context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo with one bounded root-workspace developer-workflow improvement.' && echo 'Workspace-surface touched-path context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: package.json frontend:install:quickcheck developer workflow.' && echo 'Workspace-surface repair signal for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: no code-local failure is active, governance is quiet, and 5 pending LangSmith runs sampled in this window are partial observability only for this thread, so this quickcheck alias now routes the bounded install-status plus typecheck path through the same-thread summary and Bun PATH helper.' && echo 'Operator note for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: 5 pending or cross-thread LangSmith runs sampled in this window are partial observability only for this thread and do not satisfy validation by themselves; run this install-status plus typecheck path, then confirm a fresh same-thread run/trace or preserve a clear no-run defer reason.' && (bash ./scripts/with-bun-path.sh bun run frontend:install:status && echo 'Workspace-surface smoke step for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: frontend install status completed; proceeding to frontend typecheck through the Bun PATH helper.' && bash ./scripts/with-bun-path.sh bun run frontend:typecheck && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: install status and frontend typecheck passed locally, but this iteration still requires at least one fresh same-thread LangSmith run/trace with explicit goal context or a clear no-run defer reason.') || (echo 'Workspace-surface operator defer for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: bounded install-status/typecheck quickcheck did not complete cleanly, so validation remains incomplete and no fresh same-thread LangSmith run/trace is confirmed from this local workflow.' && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: cross-thread or pending LangSmith activity is partial observability only; rerun after fixing the local smoke failure, then confirm a fresh same-thread run/trace with explicit goal context plus a passed smoke/typecheck result, or preserve this no-run defer reason.' && exit 1)", "workspace:surface:status:quick": "bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo 'Workspace-surface goal context for thread 775c9662-2dc6-4cc9-938f-2e0a2e6b788a:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo with one bounded root-workspace developer-workflow improvement.' && echo 'Workspace-surface touched-path context for thread 775c9662-2dc6-4cc9-938f-2e0a2e6b788a:workspace-surface: package.json workspace:surface:status:quick developer-workflow alias.' && echo 'Workspace-surface improvement signal for thread 775c9662-2dc6-4cc9-938f-2e0a2e6b788a:workspace-surface: recent LangSmith runs did not surface an active code-local failure, and 2 pending same-thread runs are partial observability only, so this bounded alias captures install and stack readiness in one quick operator-facing snapshot.' && echo 'Workspace-surface operator note for thread 775c9662-2dc6-4cc9-938f-2e0a2e6b788a:workspace-surface: pending same-thread LangSmith visibility is partial observability only and sibling-thread activity does not satisfy validation for this thread; this quick status alias is local readiness evidence only unless a fresh same-thread LangSmith run/trace is also emitted.' && bash ./scripts/with-bun-path.sh bun run frontend:install:status && bash ./scripts/with-bun-path.sh bun run frontend:stack:status && echo 'Workspace-surface validation reminder for thread 775c9662-2dc6-4cc9-938f-2e0a2e6b788a:workspace-surface: quick status commands completed locally, but validation still requires at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed bounded workspace smoke/typecheck result for package.json, or a clear operator-facing no-run defer reason if no run was emitted.'", - "workspace:surface:quickcheck:thread:b31cedc0": "bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo 'Workspace-surface goal context for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: package.json workspace:surface:quickcheck:thread:b31cedc0 developer-workflow alias.' && echo 'Workspace-surface improvement signal for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: no code-local failure is active, no sampled LangSmith feedback regressions were present, and 5 pending LangSmith runs sampled in this window are partial observability only for this thread, so this bounded alias emits explicit same-thread context before install-status and frontend typecheck.' && echo 'Workspace-surface operator defer reason for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: pending-only or cross-thread LangSmith activity does not satisfy validation for this iteration; local install-status and frontend typecheck are useful workspace smoke evidence only unless a fresh same-thread LangSmith run/trace is also emitted.' && (bash ./scripts/with-bun-path.sh bun run frontend:install:status && echo 'Workspace-surface smoke step for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: frontend install status completed; proceeding to frontend typecheck through the Bun PATH helper.' && bash ./scripts/with-bun-path.sh bun run frontend:typecheck && echo 'Workspace-surface validation reminder for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: install status and frontend typecheck passed locally, but this iteration still requires at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result for package.json, or a clear no-run defer reason.') || (echo 'Workspace-surface operator defer for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: bounded install-status/typecheck quickcheck did not complete cleanly from package.json, so validation remains incomplete and no fresh same-thread LangSmith run/trace is confirmed from this local workflow.' && echo 'Workspace-surface validation reminder for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: pending or cross-thread LangSmith activity is partial observability only; rerun after fixing the local smoke failure, then confirm a fresh same-thread run/trace with explicit goal context plus a passed workspace smoke/typecheck result for package.json, or preserve this clear no-run defer reason.' && exit 1))", + "workspace:surface:quickcheck:thread:b31cedc0": "bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo 'Workspace-surface goal context for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: package.json workspace:surface:quickcheck:thread:b31cedc0 developer-workflow alias.' && echo 'Workspace-surface improvement signal for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: no code-local failure is active, no sampled LangSmith feedback regressions were present, and 5 pending LangSmith runs sampled in this window are partial observability only for this thread, so this bounded alias emits explicit same-thread context before install-status and frontend typecheck.' && echo 'Workspace-surface operator defer reason for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: pending-only or cross-thread LangSmith activity does not satisfy validation for this iteration; local install-status and frontend typecheck are useful workspace smoke evidence only unless a fresh same-thread LangSmith run/trace is also emitted.' && (bash ./scripts/with-bun-path.sh bun run frontend:install:status && echo 'Workspace-surface smoke step for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: frontend install status completed; proceeding to frontend typecheck through the Bun PATH helper.' && bash ./scripts/with-bun-path.sh bun run frontend:typecheck && echo 'Workspace-surface validation reminder for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: install status and frontend typecheck passed locally, but this iteration still requires at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result for package.json, or a clear no-run defer reason.') || (echo 'Workspace-surface operator defer for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: bounded install-status/typecheck quickcheck did not complete cleanly from package.json, so validation remains incomplete and no fresh same-thread LangSmith run/trace is confirmed from this local workflow.' && echo 'Workspace-surface validation reminder for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: pending or cross-thread LangSmith activity is partial observability only; rerun after fixing the local smoke failure, then confirm a fresh same-thread run/trace with explicit goal context plus a passed workspace smoke/typecheck result for package.json, or preserve this clear no-run defer reason.' && exit 1)", "workspace:surface:quickcheck:thread": "bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo 'Workspace-surface goal context for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: package.json workspace:surface:quickcheck:thread developer-workflow alias.' && echo 'Workspace-surface improvement signal for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: no code-local failure is active, governance is quiet, and sampled pending LangSmith runs are partial observability only, so this bounded root-workspace alias emits explicit same-thread context before the existing frontend install quickcheck path.' && echo 'Workspace-surface defer reminder for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: pending or cross-thread LangSmith activity does not satisfy this iteration; next confirm at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or preserve a clear operator-facing no-run defer reason if no run was emitted.' && bash ./scripts/with-bun-path.sh bun run frontend:install:quickcheck", "workspace:surface:quickcheck:summary": "bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo 'Workspace-surface goal context for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: package.json workspace:surface:quickcheck:summary developer-workflow alias.' && echo 'Workspace-surface improvement signal for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: no code-local failure is active, governance is quiet, and 4 pending LangSmith runs sampled in this window are partial observability only, so this bounded alias emits the existing workspace summary before the existing frontend install quickcheck path.' && echo 'Workspace-surface operator defer reason for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: pending-only same-thread visibility or cross-thread activity do not complete validation for this iteration; local install/typecheck output is useful smoke evidence only unless a fresh same-thread LangSmith run/trace is also emitted.' && echo 'Workspace-surface validation reminder for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: next confirm at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result for package.json, or preserve a clear operator-facing no-run defer reason if no run was emitted.' && bash ./scripts/with-bun-path.sh bun run frontend:install:quickcheck", "frontend:install:typecheck": "echo 'Workspace-surface goal context for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo with one bounded root-workspace developer-workflow improvement.' && echo 'Workspace-surface touched-path context for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface: package.json frontend:install:typecheck developer workflow.' && echo 'Operator note for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface: 5 pending LangSmith runs sampled in this window are partial observability only for this thread and do not satisfy validation by themselves; run this install-only plus typecheck path, then confirm a fresh same-thread run/trace or preserve a clear no-run defer reason.' && bun run frontend:install:only && echo 'Workspace-surface smoke step for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface: frontend install-only step completed; proceeding to frontend typecheck.' && bun run frontend:typecheck && echo 'Workspace-surface validation reminder for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface: install-only and frontend typecheck passed locally, but this iteration still requires at least one fresh same-thread LangSmith run/trace with explicit goal context or a clear no-run defer reason.'", "frontend:install:typecheck:thread": "echo 'Workspace-surface goal context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: package.json frontend:install:typecheck:thread developer workflow.' && echo 'Workspace-surface repair signal for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: no code-local failure is active, governance is quiet, and 5 pending LangSmith runs are partial observability only, so this bounded install-plus-typecheck path improves same-thread operator validation readiness.' && echo 'Operator note for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: pending or cross-thread LangSmith activity does not satisfy this iteration; run this alias for local smoke/typecheck evidence, then confirm a fresh same-thread run/trace or preserve a clear no-run defer reason.' && bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && bash ./scripts/with-bun-path.sh bun run frontend:install:only && echo 'Workspace-surface smoke step for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: frontend install-only step completed; proceeding to frontend typecheck.' && bash ./scripts/with-bun-path.sh bun run frontend:typecheck && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: local install-only and frontend typecheck completed, but validation still requires at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or a clear no-run defer reason if no run is emitted.'", - "frontend:preflight:workspace-thread": "echo 'Workspace-surface goal context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: package.json frontend:preflight:workspace-thread developer workflow.' && echo 'Workspace-surface repair signal for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: no code-local failure is active, no sampled LangSmith feedback regressions were present, and 3 pending LangSmith runs are partial observability only, so this bounded alias captures same-thread readiness plus smoke/typecheck evidence.' && echo 'Operator note for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: pending or cross-thread LangSmith activity does not satisfy this iteration; this alias is local readiness evidence only unless a fresh same-thread run/trace is also emitted.' && bash ./scripts/with-bun-path.sh bun run frontend:status:snapshot:thread && bash ./scripts/with-bun-path.sh bun run frontend:install:typecheck:thread && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: local preflight, install, and typecheck steps completed, but validation still requires at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or a clear no-run defer reason if no run is emitted.' || (echo 'Workspace-surface operator defer for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: bounded workspace preflight did not complete cleanly, so no fresh same-thread LangSmith run/trace is confirmed from this local workflow and validation remains incomplete.' && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: pending or cross-thread LangSmith activity is partial observability only; rerun this alias after fixing the local workflow issue, then confirm a fresh same-thread run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or preserve this clear no-run defer reason.' && exit 1))", - "frontend:preflight:thread": "echo 'Workspace-surface goal context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: package.json frontend:preflight:thread developer workflow.' && echo 'Workspace-surface repair signal for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: no code-local failure is active, governance is quiet, and 6 pending LangSmith runs are partial observability only, so this bounded same-thread preflight captures readiness before deeper validation.' && echo 'Operator note for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: pending or cross-thread LangSmith activity does not satisfy this iteration; this alias captures summary plus readiness snapshot plus install/typecheck evidence, or preserves a clear no-run defer reason if a local step fails.' && bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && bash ./scripts/with-bun-path.sh bun run frontend:status:snapshot:thread && bash ./scripts/with-bun-path.sh bun run frontend:install:typecheck:thread && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: local preflight steps completed, but validation still requires at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or a clear no-run defer reason if no run is emitted.' || (echo 'Workspace-surface operator defer for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: bounded same-thread preflight did not complete cleanly, so validation remains incomplete and pending or cross-thread LangSmith activity is still partial observability only.' && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: rerun this alias after fixing the local workflow issue, then confirm a fresh same-thread run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or preserve this no-run defer reason.' && exit 1))", + "frontend:preflight:workspace-thread": "echo 'Workspace-surface goal context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: package.json frontend:preflight:workspace-thread developer workflow.' && echo 'Workspace-surface repair signal for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: no code-local failure is active, no sampled LangSmith feedback regressions were present, and 3 pending LangSmith runs are partial observability only, so this bounded alias captures same-thread readiness plus smoke/typecheck evidence.' && echo 'Operator note for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: pending or cross-thread LangSmith activity does not satisfy this iteration; this alias is local readiness evidence only unless a fresh same-thread run/trace is also emitted.' && bash ./scripts/with-bun-path.sh bun run frontend:status:snapshot:thread && bash ./scripts/with-bun-path.sh bun run frontend:install:typecheck:thread && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: local preflight, install, and typecheck steps completed, but validation still requires at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or a clear no-run defer reason if no run is emitted.' || (echo 'Workspace-surface operator defer for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: bounded workspace preflight did not complete cleanly, so no fresh same-thread LangSmith run/trace is confirmed from this local workflow and validation remains incomplete.' && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: pending or cross-thread LangSmith activity is partial observability only; rerun this alias after fixing the local workflow issue, then confirm a fresh same-thread run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or preserve this clear no-run defer reason.' && exit 1)", + "frontend:preflight:thread": "echo 'Workspace-surface goal context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: package.json frontend:preflight:thread developer workflow.' && echo 'Workspace-surface repair signal for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: no code-local failure is active, governance is quiet, and 6 pending LangSmith runs are partial observability only, so this bounded same-thread preflight captures readiness before deeper validation.' && echo 'Operator note for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: pending or cross-thread LangSmith activity does not satisfy this iteration; this alias captures summary plus readiness snapshot plus install/typecheck evidence, or preserves a clear no-run defer reason if a local step fails.' && bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && bash ./scripts/with-bun-path.sh bun run frontend:status:snapshot:thread && bash ./scripts/with-bun-path.sh bun run frontend:install:typecheck:thread && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: local preflight steps completed, but validation still requires at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or a clear no-run defer reason if no run is emitted.' || (echo 'Workspace-surface operator defer for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: bounded same-thread preflight did not complete cleanly, so validation remains incomplete and pending or cross-thread LangSmith activity is still partial observability only.' && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: rerun this alias after fixing the local workflow issue, then confirm a fresh same-thread run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or preserve this no-run defer reason.' && exit 1)", "frontend:status:snapshot": "echo 'Workspace-surface goal context for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface: package.json frontend:status:snapshot operator workflow.' && echo 'Operator note for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface: 6 pending LangSmith runs sampled in this window are partial observability only and do not satisfy same-thread validation for this iteration; capture this quick readiness snapshot first, then run smoke/typecheck or preserve a clear no-run defer reason.' && bun run frontend:install:status && bun run frontend:stack:status && echo 'Workspace-surface validation reminder for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface: this snapshot is operator-facing readiness evidence only; cross-thread or pending-only LangSmith activity still does not satisfy this iteration without a fresh same-thread run/trace and passed smoke/typecheck, or a clear no-run defer reason.'", "frontend:smoke:snapshot": "bun run frontend:status:snapshot", "frontend:baseline": "echo 'Workspace-surface goal context for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface: package.json frontend:baseline rollback checklist workflow.' && echo 'Operator note for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface: capture this pre-change baseline on the experimental frontend stack before comparing post-change smoke results; pending or cross-thread LangSmith activity is partial observability only and does not satisfy this iteration.' && echo 'Baseline checklist: record exact changed paths/artifacts, confirm current experimental page load/routing/model-list behavior, and compare later smoke/typecheck results against this baseline.' && bun run frontend:install:status && bun run frontend:stack:status", @@ -215,7 +215,7 @@ "workspace:surface:fast:goal-context": "echo 'Workspace-surface goal context for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface: package.json workspace:surface:fast:goal-context developer workflow alias.' && echo 'Operator note for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface: pending or cross-thread LangSmith activity is partial observability only and does not satisfy this iteration; this fast path is bounded local evidence only, not completed validation.' && echo 'Operator note for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface: after this fast path, capture a fresh same-thread LangSmith run/trace with explicit goal context and a passed workspace smoke/typecheck result, or preserve a clear no-run defer reason if no run was emitted.' && bun run workspace:surface:fast:defer-aware", "workspace:surface:validate:pending": "echo 'Workspace-surface goal context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: package.json workspace:surface:validate:pending developer workflow alias.' && echo 'Operator note for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: 3 pending LangSmith runs sampled in this window are partial observability only for this thread and cross-thread activity does not satisfy validation.' && bun run frontend:install:status && echo 'Workspace-surface smoke step for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: frontend install status completed; running frontend typecheck for bounded local validation.' && bun run frontend:typecheck && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: install status and frontend typecheck passed locally, but next still confirm at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or preserve a clear operator-facing no-run defer reason.'", "workspace:surface:quick-validate": "bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo 'Workspace-surface goal context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: package.json workspace:surface:quick-validate developer workflow alias.' && echo 'Operator note for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: 5 pending LangSmith runs sampled in this window are partial observability only for this thread and cross-thread activity does not satisfy validation.' && bash ./scripts/with-bun-path.sh bun run frontend:install:status && echo 'Workspace-surface smoke step for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: frontend install status completed; running frontend typecheck for bounded local validation through the Bun PATH helper.' && bash ./scripts/with-bun-path.sh bun run frontend:typecheck && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: local workspace smoke/typecheck passed only if both commands succeeded; next still confirm at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or preserve a clear operator-facing no-run defer reason if no run was emitted.'", - "check": "bash ./scripts/with-bun-path.sh workspace:surface:goal-smoke && bash ./scripts/with-bun-path.sh bun run frontend:typecheck && bash ./scripts/with-bun-path.sh bun run typecheck", + "check": "bash ./scripts/with-bun-path.sh bun run workspace:surface:goal-smoke && bash ./scripts/with-bun-path.sh bun run frontend:typecheck && bash ./scripts/with-bun-path.sh bun run typecheck", "workspace:surface:goal-smoke": "bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && echo 'Workspace-surface goal context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: package.json workspace:surface:goal-smoke developer workflow alias.' && echo 'Workspace-surface repair signal for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: LangSmith feedback sampled contains_goal_context=0 and repair_smoke_passed=0, so this bounded root-workspace smoke command emits explicit goal context before local validation.' && echo 'Operator note for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: pending or cross-thread LangSmith activity is partial observability only and does not satisfy this iteration; this command is local readiness evidence only unless a fresh same-thread run/trace is emitted.' && bash ./scripts/with-bun-path.sh bun run frontend:install:status && echo 'Workspace-surface smoke step for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: frontend install status completed; running frontend typecheck for bounded local validation through the Bun PATH helper.' && bash ./scripts/with-bun-path.sh bun run frontend:typecheck && echo 'Workspace-surface validation reminder for thread 8bd76091-7a92-4314-abf8-926521f7bacf:workspace-surface: local workspace smoke/typecheck passed only if both commands succeeded; next still confirm at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or preserve a clear operator-facing no-run defer reason if no run was emitted.'", "workspace:surface:root-check": "bash ./scripts/with-bun-path.sh bun run workspace:surface:goal-smoke && bash ./scripts/with-bun-path.sh bun run typecheck", "workspace:surface:root-check:thread": "echo 'Workspace-surface goal context for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: continuously monitor, fix, and improve AnyGPT across the repo, checking API, control-plane, UI, homepage, runtime health, routing, model availability, governance drift, and bounded safe improvements.' && echo 'Workspace-surface touched-path context for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: package.json workspace:surface:root-check:thread developer-workflow alias.' && echo 'Workspace-surface improvement signal for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: no code-local failure is active, governance is quiet, and pending LangSmith runs are partial observability only, so this bounded alias emits explicit same-thread goal context before the existing root workspace smoke/typecheck path.' && echo 'Workspace-surface validation reminder for thread b31cedc0-ceb5-48d7-8772-cf97f38a3b42:workspace-surface: cross-thread or pending-only LangSmith activity does not satisfy this iteration; local smoke/typecheck is compile-time and workspace-readiness evidence only unless a fresh same-thread run/trace is also emitted.' && bash ./scripts/with-bun-path.sh bun run workspace:surface:root-check", @@ -234,7 +234,14 @@ "control-plane:autonomous:restart": "bash ./scripts/control-plane-autonomous-runner.sh restart" }, "devDependencies": { + "@typescript-eslint/eslint-plugin": "^8.67.0", + "@typescript-eslint/parser": "^8.67.0", "eslint": "^8.57.1", + "eslint-import-resolver-typescript": "^4.4.5", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.1.1", "husky": "^9.1.7", "prettier": "^3.8.3", "turbo": "^2.9.16", @@ -254,7 +261,6 @@ "brace-expansion": "^5.0.6", "diff": "^4.0.4", "qs": "^6.15.2", - "ajv": "^8.20.0", "axios": "^1.17.0", "follow-redirects": "^1.16.0", "fast-uri": "^3.1.2", @@ -265,7 +271,6 @@ "ip-address": "^10.2.0", "js-yaml": "^4.2.0", "lodash": "^4.18.1", - "path-to-regexp": "^8.4.2", "picomatch": "^2.3.2", "undici": "^6.23.0", "cookie": "^0.7.0", diff --git a/scripts/install-frontend.sh b/scripts/install-frontend.sh new file mode 100755 index 0000000..6d4431f --- /dev/null +++ b/scripts/install-frontend.sh @@ -0,0 +1,118 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +UI_ROOT="$ROOT/apps/ui" +LIBRECHAT_DIR="$UI_ROOT/librechat" +LIBRECHAT_REPOSITORY="${ANYGPT_LIBRECHAT_REPOSITORY:-https://github.com/danny-avila/LibreChat.git}" +DEFAULT_LIBRECHAT_REF="eaef87fa2684025627e25d649a56f4f2a63417a7" +LIBRECHAT_REF="${ANYGPT_LIBRECHAT_REF:-$DEFAULT_LIBRECHAT_REF}" +INSTALL_LOCK_DIR="$(git -C "$ROOT" rev-parse --absolute-git-dir)/anygpt-local" +INSTALL_LOCK_FILE="$INSTALL_LOCK_DIR/frontend-install.lock" +INSTALL_STAMP_FILE="$INSTALL_LOCK_DIR/frontend-install.success" +STACK_LOCK_FILE="$INSTALL_LOCK_DIR/frontend-stack.lock" + +for required_command in flock git sha256sum; do + if ! command -v "$required_command" >/dev/null 2>&1; then + echo "Frontend installation requires '$required_command' to be available in WSL." >&2 + exit 1 + fi +done + +mkdir -p "$INSTALL_LOCK_DIR" +exec 9>"$INSTALL_LOCK_FILE" +if ! flock -n 9; then + echo "Another frontend dependency installation is already running for $ROOT." >&2 + exit 1 +fi +if [[ -e "$STACK_LOCK_FILE" ]] && ! flock -n "$STACK_LOCK_FILE" true 2>/dev/null; then + echo "The frontend stack is running. Stop it before reinstalling frontend dependencies." >&2 + exit 1 +fi + +if [[ ! -d "$LIBRECHAT_DIR/.git" ]]; then + if [[ -e "$LIBRECHAT_DIR" ]]; then + echo "Cannot bootstrap LibreChat: $LIBRECHAT_DIR exists but is not a Git checkout." >&2 + exit 1 + fi + + echo "Bootstrapping LibreChat ($LIBRECHAT_REF) into $LIBRECHAT_DIR..." + git init --quiet "$LIBRECHAT_DIR" + git -C "$LIBRECHAT_DIR" remote add origin "$LIBRECHAT_REPOSITORY" +fi + +existing_repository="$(git -C "$LIBRECHAT_DIR" remote get-url origin)" +if [[ "$existing_repository" != "$LIBRECHAT_REPOSITORY" ]]; then + echo "LibreChat origin mismatch: expected $LIBRECHAT_REPOSITORY, found $existing_repository." >&2 + echo "Set ANYGPT_LIBRECHAT_REPOSITORY to the existing origin or reconcile the ignored checkout manually." >&2 + exit 1 +fi + +if [[ "$LIBRECHAT_REF" =~ ^[0-9a-fA-F]{40}$ ]] && + git -C "$LIBRECHAT_DIR" cat-file -e "${LIBRECHAT_REF}^{commit}" 2>/dev/null; then + target_commit="$(git -C "$LIBRECHAT_DIR" rev-parse "${LIBRECHAT_REF}^{commit}")" +else + git -C "$LIBRECHAT_DIR" fetch --depth 1 origin "$LIBRECHAT_REF" + target_commit="$(git -C "$LIBRECHAT_DIR" rev-parse FETCH_HEAD)" +fi + +current_commit="$(git -C "$LIBRECHAT_DIR" rev-parse --verify HEAD 2>/dev/null || true)" +if [[ "$current_commit" != "$target_commit" ]]; then + if ! git -C "$LIBRECHAT_DIR" diff --quiet || + ! git -C "$LIBRECHAT_DIR" diff --cached --quiet; then + echo "LibreChat has tracked changes and is not at the requested ref $LIBRECHAT_REF." >&2 + echo "Commit or stash those nested-checkout changes before rerunning the installer." >&2 + exit 1 + fi + + git -C "$LIBRECHAT_DIR" checkout --detach "$target_commit" +fi + +cd "$LIBRECHAT_DIR" + +echo "Using LibreChat commit $target_commit" +required_node="$(tr -d '[:space:]' < .nvmrc)" +required_node="${required_node#v}" +NVM_DIR="${NVM_DIR:-$HOME/.nvm}" +export NVM_DIR + +if [[ -s "$NVM_DIR/nvm.sh" ]]; then + set +u + # shellcheck source=/dev/null + . "$NVM_DIR/nvm.sh" + set -u + nvm install "$required_node" + nvm use "$required_node" +elif ! command -v node >/dev/null 2>&1 || [[ "$(node --version)" != "v${required_node}" ]]; then + echo "LibreChat requires Node v${required_node}. Install nvm or activate that exact Node version, then rerun." >&2 + exit 1 +fi + +required_npm="$(node -p "String(require('./package.json').packageManager || '').replace(/^npm@/, '')")" +if [[ -z "$required_npm" ]]; then + echo "LibreChat package.json does not declare an npm packageManager version." >&2 + exit 1 +fi + +if [[ "$(npm --version)" == "$required_npm" ]]; then + rm -f "$INSTALL_STAMP_FILE" + npm ci +else + echo "Using manifest-pinned npm $required_npm for this install..." + rm -f "$INSTALL_STAMP_FILE" + npx --yes "npm@${required_npm}" ci +fi + +bash "$UI_ROOT/scripts/sync-config.sh" + +cd "$ROOT" +bash "$ROOT/bun.sh" install --frozen-lockfile --filter ./apps/homepage + +librechat_lock_sha256="$(sha256sum "$LIBRECHAT_DIR/package-lock.json" | awk '{print $1}')" +bun_lock_sha256="$(sha256sum "$ROOT/bun.lock" | awk '{print $1}')" +stamp_tmp="$INSTALL_STAMP_FILE.$$" +printf 'installer_version=1\nlibrechat_commit=%s\nlibrechat_lock_sha256=%s\nbun_lock_sha256=%s\n' \ + "$target_commit" \ + "$librechat_lock_sha256" \ + "$bun_lock_sha256" > "$stamp_tmp" +mv -f "$stamp_tmp" "$INSTALL_STAMP_FILE" diff --git a/scripts/run-frontend-stack.sh b/scripts/run-frontend-stack.sh index 12eae13..0925c8e 100644 --- a/scripts/run-frontend-stack.sh +++ b/scripts/run-frontend-stack.sh @@ -2,18 +2,117 @@ set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ROOT" BUN_SH="$ROOT/bun.sh" MODE="${1:-dev}" +READINESS_COMMAND="frontend:readiness" UI_DIR="$ROOT/apps/ui" +LIBRECHAT_DIR="$UI_DIR/librechat" HOMEPAGE_DIR="$ROOT/apps/homepage" -SKIP_INSTALL_IF_PRESENT="${ANYGPT_FRONTEND_SKIP_INSTALL_IF_PRESENT:-1}" -READINESS_TIMEOUT_SECONDS="${ANYGPT_FRONTEND_READINESS_TIMEOUT_SECONDS:-15}" -HOMEPAGE_START_TIMEOUT_SECONDS="${ANYGPT_HOMEPAGE_START_TIMEOUT_SECONDS:-0}" +FRONTEND_STATE_DIR="$(git -C "$ROOT" rev-parse --absolute-git-dir)/anygpt-local" +FRONTEND_INSTALL_LOCK="$FRONTEND_STATE_DIR/frontend-install.lock" +FRONTEND_INSTALL_STAMP="$FRONTEND_STATE_DIR/frontend-install.success" +FRONTEND_STACK_LOCK="$FRONTEND_STATE_DIR/frontend-stack.lock" +FRONTEND_STACK_PID_FILE="$FRONTEND_STATE_DIR/frontend-stack.pid" SUPPORTED_MODES="dev start readiness preflight preflight-ready readiness-ready readiness-only preflight-status status workspace-status install-check-status install-summary install-check install-check-only operator-preflight doctor same-thread-defer-status same-thread-status workspace-surface-strict workspace-surface-fast-status workspace-surface-pending-status workspace-surface-typecheck workspace-surface-install-typecheck workspace-surface-preflight workspace-surface-summary workspace-surface-defer workspace-surface-goal-status workspace-surface-same-thread-reminder workspace-surface-root-smoke workspace-surface-root-check frontend-install-status frontend-preflight frontend-typecheck help" LANGSMITH_PENDING_RUNS_SAMPLE="${ANYGPT_LANGSMITH_PENDING_RUNS_SAMPLE:-4}" +lock_is_held() { + local lock_file="$1" + + [[ -e "$lock_file" ]] || return 1 + command -v flock >/dev/null 2>&1 || return 1 + + if flock -n "$lock_file" true 2>/dev/null; then + return 1 + fi + + return 0 +} + +active_stack_pid() { + local stack_pid="" + + [[ -r "$FRONTEND_STACK_PID_FILE" ]] || return 0 + read -r stack_pid < "$FRONTEND_STACK_PID_FILE" || true + if [[ "$stack_pid" =~ ^[0-9]+$ ]] && kill -0 "$stack_pid" 2>/dev/null; then + printf '%s' "$stack_pid" + fi +} + +frontend_install_stamp_is_current() { + local bun_lock_sha256="" + local librechat_commit="" + local librechat_lock_sha256="" + + [[ -r "$FRONTEND_INSTALL_STAMP" ]] || return 1 + [[ -f "$ROOT/bun.lock" && -f "$LIBRECHAT_DIR/package-lock.json" ]] || return 1 + command -v git >/dev/null 2>&1 || return 1 + command -v sha256sum >/dev/null 2>&1 || return 1 + + librechat_commit="$(git -C "$LIBRECHAT_DIR" rev-parse HEAD 2>/dev/null)" || return 1 + librechat_lock_sha256="$(sha256sum "$LIBRECHAT_DIR/package-lock.json" | awk '{print $1}')" + bun_lock_sha256="$(sha256sum "$ROOT/bun.lock" | awk '{print $1}')" + + grep -Fqx "installer_version=1" "$FRONTEND_INSTALL_STAMP" && + grep -Fqx "librechat_commit=$librechat_commit" "$FRONTEND_INSTALL_STAMP" && + grep -Fqx "librechat_lock_sha256=$librechat_lock_sha256" "$FRONTEND_INSTALL_STAMP" && + grep -Fqx "bun_lock_sha256=$bun_lock_sha256" "$FRONTEND_INSTALL_STAMP" +} + +case "$MODE" in + -h|--help) + MODE="help" + ;; + preflight-ready|readiness-ready|operator-preflight|frontend-preflight) + MODE="preflight" + ;; + doctor:json) + MODE="readiness" + READINESS_COMMAND="frontend:doctor" + ;; + preflight:json) + MODE="readiness" + READINESS_COMMAND="frontend:preflight" + ;; + smoke) + if [[ "${2:-}" == "--strict" ]]; then + MODE="workspace-surface-strict" + else + MODE="readiness" + READINESS_COMMAND="frontend:smoke" + fi + ;; + smoke:json) + if [[ "${2:-}" == "--strict" ]]; then + MODE="smoke-strict-json" + else + MODE="readiness" + READINESS_COMMAND="frontend:smoke" + fi + ;; + smoke:strict) + MODE="workspace-surface-strict" + ;; + smoke:defer) + MODE="preflight-status" + ;; + workspace-status) + MODE="status" + ;; + frontend-install-status|install:status|install:status:json) + MODE="install-check-status" + ;; + check) + MODE="frontend-typecheck" + ;; + install-check|install-check:json) + MODE="workspace-surface-install-typecheck" + ;; +esac + report_frontend_install_status() { - local ui_node_modules="$UI_DIR/node_modules" + local ui_node_modules="$LIBRECHAT_DIR/node_modules" local homepage_node_modules="$HOMEPAGE_DIR/node_modules" local missing=0 @@ -23,9 +122,9 @@ report_frontend_install_status() { echo "Workspace-surface observability note for thread 471543ca-136b-483e-9700-6c53d92449f5:workspace-surface: sibling-thread pending runs do not satisfy validation for this workspace-surface thread." if [[ -d "$ui_node_modules" ]]; then - echo "Frontend install status: apps/ui dependencies appear present at $ui_node_modules" + echo "Frontend install status: LibreChat dependencies appear present at $ui_node_modules" else - echo "Frontend install status: apps/ui dependencies are missing at $ui_node_modules" + echo "Frontend install status: LibreChat dependencies are missing at $ui_node_modules" missing=1 fi @@ -36,13 +135,23 @@ report_frontend_install_status() { missing=1 fi + if lock_is_held "$FRONTEND_INSTALL_LOCK"; then + echo "Frontend install status: dependency installation is currently in progress" + missing=1 + elif frontend_install_stamp_is_current; then + echo "Frontend install status: dependency state matches the current LibreChat and Bun lockfiles" + else + echo "Frontend install status: dependency state is not verified against the current lockfiles" + missing=1 + fi + if [[ "$missing" -eq 0 ]]; then echo "Workspace-surface operator note for thread 471543ca-136b-483e-9700-6c53d92449f5:workspace-surface: frontend dependency directories are present, so the next bounded local step can be a workspace summary, preflight, or typecheck command." echo "Workspace-surface validation reminder for thread 471543ca-136b-483e-9700-6c53d92449f5:workspace-surface: this install-status check is local readiness evidence only; this iteration still needs at least one fresh same-thread LangSmith run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or a clear operator-facing no-run defer reason if no run was emitted." return 0 fi - echo "Workspace-surface operator defer reason for thread 471543ca-136b-483e-9700-6c53d92449f5:workspace-surface: one or more frontend dependency directories are missing, so run 'bun run frontend:install' before workspace-surface preflight or typecheck commands." + echo "Workspace-surface operator defer reason for thread 471543ca-136b-483e-9700-6c53d92449f5:workspace-surface: frontend dependency state is missing, in progress, or stale, so run 'bun run frontend:install' before workspace-surface preflight or typecheck commands." echo "Workspace-surface validation reminder for thread 471543ca-136b-483e-9700-6c53d92449f5:workspace-surface: pending or sibling-thread LangSmith activity is partial observability only and does not satisfy validation for this thread; after installing dependencies, confirm at least one fresh same-thread run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or preserve a clear no-run defer reason." return 1 } @@ -211,7 +320,7 @@ if [[ "$MODE" == "workspace-surface-strict" ]]; then exit $? fi -if [[ "$MODE" == "same-thread-status" || "$MODE" == "quick-status" || "$MODE" == "workspace-surface-status" ]]; then +if [[ "$MODE" == "same-thread-status" || "$MODE" == "quick-status" || "$MODE" == "workspace-surface-status" || "$MODE" == "workspace-surface-goal-status" ]]; then MODE="same-thread-defer-status" fi @@ -237,36 +346,59 @@ if [[ "$MODE" == "doctor" ]]; then else echo "[defer] bun runtime is unavailable via $BUN_SH" >&2 echo "Next validation success condition: capture at least one fresh same-thread LangSmith control-plane run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or preserve this no-run defer reason if no run was emitted." >&2 - exit 0 + exit 1 fi if [[ -f "$ROOT/package.json" ]]; then echo "[ok] root package.json present at $ROOT/package.json" else echo "[defer] root package.json missing at $ROOT/package.json" >&2 - exit 0 + exit 1 fi if [[ -d "$UI_DIR" ]]; then echo "[ok] ui workspace present at $UI_DIR" else echo "[defer] ui workspace missing at $UI_DIR" >&2 - exit 0 + exit 1 fi if [[ -d "$HOMEPAGE_DIR" ]]; then echo "[ok] homepage workspace present at $HOMEPAGE_DIR" else echo "[defer] homepage workspace missing at $HOMEPAGE_DIR" >&2 - exit 0 + exit 1 + fi + + readiness_output="" + if ! readiness_output="$(bash "$0" readiness 2>&1)"; then + echo "[defer] frontend readiness prerequisites are incomplete" >&2 + printf '%s\n' "$readiness_output" >&2 + exit 1 fi + echo "[ok] bounded frontend readiness check passed" + printf '%s\n' "$readiness_output" echo "[ok] frontend workspace doctor checks passed" echo "Pending LangSmith activity from other threads remains partial observability only for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface and does not by itself satisfy validation." echo "Next validation success condition: capture at least one fresh same-thread LangSmith control-plane run/trace with explicit goal context plus a passed workspace smoke/typecheck result, or preserve a clear operator-facing no-run defer reason if no run was emitted." exit 0 fi +if [[ "$MODE" == "smoke-strict-json" ]]; then + strict_output="" + if strict_output="$(bash "$0" workspace-surface-strict 2>&1)"; then + printf '{"command":"frontend:smoke:strict","status":"ready","reason":"bounded strict frontend smoke and typecheck path passed","next_validation":"confirm at least one fresh LangSmith control-plane run/trace for this iteration or preserve a clear operator-facing defer reason if no run was emitted"}\n' + exit 0 + else + strict_status=$? + fi + + printf '%s\n' "$strict_output" >&2 + printf '{"command":"frontend:smoke:strict","status":"defer","reason":"bounded strict frontend smoke or typecheck path failed","next_validation":"fix the reported local smoke/typecheck failure, rerun this strict check, and then confirm a fresh LangSmith run/trace or preserve a clear operator-facing defer reason"}\n' + exit "$strict_status" +fi + if [[ " $SUPPORTED_MODES " != *" $MODE "* ]]; then echo "Frontend stack defer reason: unsupported mode '$MODE'." >&2 echo " supported script modes: $SUPPORTED_MODES" >&2 @@ -310,13 +442,19 @@ fi UI_SCRIPT="$UI_DIR/scripts/$MODE.sh" -if [[ "$MODE" != "readiness" && "$MODE" != "preflight" && "$MODE" != "readiness-only" && ! -f "$UI_SCRIPT" ]]; then - echo "Frontend stack defer reason: expected LibreChat mode script is missing for '$MODE'." >&2 - echo " missing: $UI_SCRIPT" >&2 - echo " next: use a supported frontend mode with an existing apps/ui/scripts/.sh entrypoint, or restore the missing LibreChat script before rerunning frontend stack commands" >&2 - echo " validation: confirm at least one fresh LangSmith control-plane run/trace for this iteration, or preserve this clear operator-facing no-run defer reason if no run was emitted" >&2 - exit 2 -fi +case "$MODE" in + readiness|preflight|readiness-only|doctor|status|install-check-status|install-check-only) + ;; + *) + if [[ ! -f "$UI_SCRIPT" ]]; then + echo "Frontend stack defer reason: expected LibreChat mode script is missing for '$MODE'." >&2 + echo " missing: $UI_SCRIPT" >&2 + echo " next: use a supported frontend mode with an existing apps/ui/scripts/.sh entrypoint, or restore the missing LibreChat script before rerunning frontend stack commands" >&2 + echo " validation: confirm at least one fresh LangSmith control-plane run/trace for this iteration, or preserve this clear operator-facing no-run defer reason if no run was emitted" >&2 + exit 2 + fi + ;; +esac case " $SUPPORTED_MODES " in *" $MODE "*) ;; @@ -328,67 +466,68 @@ case " $SUPPORTED_MODES " in ;; esac -should_skip_install() { - [[ "$SKIP_INSTALL_IF_PRESENT" == "1" ]] && [[ -d "$UI_DIR/node_modules" ]] && [[ -d "$HOMEPAGE_DIR/node_modules" ]] -} - -print_missing_install_hint() { - local missing=() - [[ -d "$UI_DIR/node_modules" ]] || missing+=("apps/ui/node_modules") - [[ -d "$HOMEPAGE_DIR/node_modules" ]] || missing+=("apps/homepage/node_modules") - - if [[ "$SKIP_INSTALL_IF_PRESENT" == "1" ]] && (( ${#missing[@]} > 0 )); then - echo "Frontend dependency readiness note: install-skip is enabled, but required workspace dependencies are missing: ${missing[*]}" >&2 - echo " next: run 'bun run frontend:install' or 'bun run frontend:install:check' before smoke/dev/start" >&2 - fi -} - -print_concurrent_runner_hint() { - local ui_pids="" - local homepage_pids="" - - if command -v pgrep >/dev/null 2>&1; then - ui_pids="$(pgrep -f "$ROOT/apps/ui/.*/scripts/(dev|start)\.sh|$ROOT/apps/ui && bash ./scripts/(dev|start)\.sh" 2>/dev/null | tr '\n' ' ' | sed 's/[[:space:]]*$//')" - homepage_pids="$(pgrep -f "$ROOT/apps/homepage.*(bun|$BUN_SH).*(dev|start)" 2>/dev/null | tr '\n' ' ' | sed 's/[[:space:]]*$//')" - fi - - if [[ -n "$ui_pids" || -n "$homepage_pids" ]]; then - echo "Frontend readiness note: existing frontend stack process(es) detected before starting a new '$MODE' run." >&2 - [[ -n "$ui_pids" ]] && echo " ui candidate pid(s): $ui_pids" >&2 - [[ -n "$homepage_pids" ]] && echo " homepage candidate pid(s): $homepage_pids" >&2 - echo " next: prefer 'bun run frontend:readiness' or reuse the active stack to avoid overlapping runners and misleading smoke signals" >&2 - fi -} - run_readiness_check() { - local missing=() - local ui_pids="" - local homepage_pids="" + local command_name="${1:-frontend:readiness}" + local install_in_progress="false" + local missing_dependencies=() + local missing_dependencies_json="" + local missing_requirements=() + local missing_requirements_json="" local status="ready" local reason="frontend stack dependencies present and no overlapping runner detected" - - [[ -d "$UI_DIR/node_modules" ]] || missing+=("apps/ui/node_modules") - [[ -d "$HOMEPAGE_DIR/node_modules" ]] || missing+=("apps/homepage/node_modules") - - if command -v pgrep >/dev/null 2>&1; then - ui_pids="$(pgrep -f "$ROOT/apps/ui/.*/scripts/(dev|start)\.sh|$ROOT/apps/ui && bash ./scripts/(dev|start)\.sh" 2>/dev/null | tr '\n' ' ' | sed 's/[[:space:]]*$//')" - homepage_pids="$(pgrep -f "$ROOT/apps/homepage.*(bun|$BUN_SH).*(dev|start)" 2>/dev/null | tr '\n' ' ' | sed 's/[[:space:]]*$//')" + local stack_pid="" + + [[ -d "$LIBRECHAT_DIR/node_modules" ]] || missing_dependencies+=("apps/ui/librechat/node_modules") + [[ -d "$HOMEPAGE_DIR/node_modules" ]] || missing_dependencies+=("apps/homepage/node_modules") + + [[ -x "$BUN_SH" ]] || missing_requirements+=("bun.sh") + [[ -x "$UI_DIR/scripts/activate-node.sh" ]] || missing_requirements+=("apps/ui/scripts/activate-node.sh") + [[ -x "$UI_DIR/scripts/dev.sh" ]] || missing_requirements+=("apps/ui/scripts/dev.sh") + [[ -x "$UI_DIR/scripts/start.sh" ]] || missing_requirements+=("apps/ui/scripts/start.sh") + [[ -f "$HOMEPAGE_DIR/package.json" ]] || missing_requirements+=("apps/homepage/package.json") + [[ -f "$LIBRECHAT_DIR/package.json" ]] || missing_requirements+=("apps/ui/librechat/package.json") + [[ -f "$LIBRECHAT_DIR/package-lock.json" ]] || missing_requirements+=("apps/ui/librechat/package-lock.json") + [[ -f "$LIBRECHAT_DIR/.nvmrc" ]] || missing_requirements+=("apps/ui/librechat/.nvmrc") + command -v flock >/dev/null 2>&1 || missing_requirements+=("flock") + command -v git >/dev/null 2>&1 || missing_requirements+=("git") + command -v setsid >/dev/null 2>&1 || missing_requirements+=("setsid") + command -v sha256sum >/dev/null 2>&1 || missing_requirements+=("sha256sum") + if [[ -x "$UI_DIR/scripts/activate-node.sh" ]] && + ! (source "$UI_DIR/scripts/activate-node.sh" >/dev/null 2>&1); then + missing_requirements+=("LibreChat Node/npm/npx/lsof toolchain") fi - if (( ${#missing[@]} > 0 )); then + if lock_is_held "$FRONTEND_INSTALL_LOCK"; then + install_in_progress="true" + status="defer" + reason="frontend dependency installation is in progress" + elif (( ${#missing_dependencies[@]} > 0 || ${#missing_requirements[@]} > 0 )); then status="defer" - reason="missing frontend workspace dependencies" - elif [[ -n "$ui_pids" || -n "$homepage_pids" ]]; then + reason="missing frontend runtime requirements" + elif ! frontend_install_stamp_is_current; then + status="defer" + reason="frontend dependencies are not verified against the current lockfiles" + elif lock_is_held "$FRONTEND_STACK_LOCK"; then status="active" reason="existing frontend runner detected; reuse active stack to avoid overlapping runners" + stack_pid="$(active_stack_pid)" + fi + + if (( ${#missing_dependencies[@]} > 0 )); then + missing_dependencies_json="$(printf '"%s",' "${missing_dependencies[@]}" | sed 's/,$//')" + fi + if (( ${#missing_requirements[@]} > 0 )); then + missing_requirements_json="$(printf '"%s",' "${missing_requirements[@]}" | sed 's/,$//')" fi - printf '{"command":"frontend:readiness","status":"%s","reason":"%s","missing_dependencies":[%s],"ui_candidate_pids":"%s","homepage_candidate_pids":"%s","next_validation":"confirm at least one fresh LangSmith control-plane run/trace for this iteration or preserve a clear operator-facing defer reason if no run was emitted"}\n' \ + printf '{"command":"%s","status":"%s","reason":"%s","missing_dependencies":[%s],"missing_requirements":[%s],"install_in_progress":%s,"stack_pid":"%s","next_validation":"confirm at least one fresh LangSmith control-plane run/trace for this iteration or preserve a clear operator-facing defer reason if no run was emitted"}\n' \ + "$command_name" \ "$status" \ "$reason" \ - "$(printf '"%s",' "${missing[@]}" | sed 's/,$//')" \ - "$ui_pids" \ - "$homepage_pids" + "$missing_dependencies_json" \ + "$missing_requirements_json" \ + "$install_in_progress" \ + "$stack_pid" case "$status" in ready|active) return 0 ;; @@ -397,7 +536,14 @@ run_readiness_check() { } case "$MODE" in - dev|start|doctor|doctor:json|preflight|preflight:json|status|install:status|install:status:json|check|install-check|install-check:json|smoke|smoke:json|smoke:strict|smoke:defer|readiness) + readiness|preflight|readiness-only) + run_readiness_check "$READINESS_COMMAND" + exit $? + ;; +esac + +case "$MODE" in + dev|start|doctor|doctor:json|preflight:json|status|install:status|install:status:json|install-check-status|install-check-only|check|install-check|install-check:json|smoke|smoke:json|smoke:strict|smoke:defer) ;; help|-h|--help) cat <<'EOF' @@ -433,16 +579,6 @@ EOF ;; esac -REQUESTED_MODE="$MODE" -STRICT_SMOKE=false - -if [[ "$MODE" == "smoke" || "$MODE" == "smoke:strict" ]]; then - if [[ "$MODE" == "smoke:strict" ]]; then - STRICT_SMOKE=true - fi - MODE="status" -fi - if [[ ! -x "$BUN_SH" ]]; then echo "Missing Bun launcher at $BUN_SH" >&2 echo "Defer reason: frontend stack cannot run until the root Bun launcher is present and executable." >&2 @@ -467,10 +603,16 @@ if [[ ! -d "$HOMEPAGE_DIR" ]]; then exit 1 fi -if [[ ! -x "$UI_DIR/scripts/$MODE.sh" ]]; then - echo "Frontend stack start aborted: missing executable UI mode script at $UI_DIR/scripts/$MODE.sh" >&2 - exit 1 -fi +case "$MODE" in + readiness|preflight|readiness-only|doctor|status|install-check-status|install-check-only) + ;; + *) + if [[ ! -x "$UI_DIR/scripts/$MODE.sh" ]]; then + echo "Frontend stack start aborted: missing executable UI mode script at $UI_DIR/scripts/$MODE.sh" >&2 + exit 1 + fi + ;; +esac if [[ ! -f "$HOMEPAGE_DIR/package.json" ]]; then echo "Frontend stack start aborted: missing homepage package manifest at $HOMEPAGE_DIR/package.json" >&2 @@ -487,7 +629,14 @@ echo "Frontend stack preflight passed" echo " root: $ROOT" echo " mode: $MODE" -echo " ui script: $UI_DIR/scripts/${MODE}.sh" +case "$MODE" in + doctor|status|install-check-status|install-check-only) + echo " ui script: not required for this status-only mode" + ;; + *) + echo " ui script: $UI_DIR/scripts/${MODE}.sh" + ;; +esac if [[ "$MODE" == "status" ]]; then echo " homepage manifest: $HOMEPAGE_DIR/package.json" else @@ -509,7 +658,7 @@ fi if [[ "$MODE" == "status" ]]; then echo "Frontend status summary" echo " bun launcher: ready" - echo " ui mode script: present" + echo " ui mode script: not required for status mode" echo " homepage manifest: present" echo " status: workspace prerequisites are present; no frontend processes were started" echo " next validation: on the experimental target only, check health, routing/static assets, one representative API path, and confirm at least one fresh LangSmith control-plane run/trace for this iteration or preserve a clear operator-facing defer reason if no run was emitted" @@ -517,15 +666,8 @@ if [[ "$MODE" == "status" ]]; then fi if [[ "$MODE" == "install-check-status" ]]; then - echo "Frontend install-check status summary" - echo " bun launcher: ready" - echo " ui workspace: $UI_DIR" - echo " homepage manifest: $HOMEPAGE_DIR/package.json" - echo " status: ready for 'bun run frontend:dev' or 'bun run frontend:start' without starting long-lived processes" - echo " observability: if LangSmith still shows pending sibling runs for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface or nearby workspace iterations, treat that as partial observability only rather than completed validation" - echo " next: if frontend dependencies may be stale or missing, run 'bun run frontend:install:check' (or the compatibility alias 'bun run frontend:install-check') before smoke/dev/start; otherwise prefer 'bun run frontend:preflight:status' or doctor output over speculative retries in a shared workspace" - echo " next validation: confirm at least one fresh same-thread LangSmith control-plane run/trace for thread 2ecf435b-4dc3-45ec-bdae-27cee1f93b64:workspace-surface with explicit goal context plus a passed workspace or control-plane smoke/typecheck result, or preserve a clear operator-facing no-run defer reason if no run was emitted" - exit 0 + report_frontend_install_status + exit $? fi if [[ "$MODE" == "install-check-only" ]]; then @@ -539,11 +681,50 @@ if [[ "$MODE" == "install-check-only" ]]; then exit 0 fi +if ! frontend_install_stamp_is_current; then + echo "Frontend stack start aborted: dependencies are not verified against the current lockfiles." >&2 + echo "Run 'bun run frontend:install', then retry." >&2 + exit 1 +fi +if ! command -v flock >/dev/null 2>&1; then + echo "Frontend stack start aborted: 'flock' from util-linux is required." >&2 + exit 1 +fi +if ! command -v setsid >/dev/null 2>&1; then + echo "Frontend stack start aborted: 'setsid' from util-linux is required for isolated child process groups." >&2 + exit 1 +fi + +mkdir -p "$FRONTEND_STATE_DIR" +exec 8>"$FRONTEND_STACK_LOCK" +if ! flock -n 8; then + existing_stack_pid="$(active_stack_pid)" + echo "Frontend stack start aborted: another local frontend stack is already running${existing_stack_pid:+ (PID $existing_stack_pid)}." >&2 + exit 1 +fi +if lock_is_held "$FRONTEND_INSTALL_LOCK"; then + echo "Frontend stack start aborted: frontend dependency installation is in progress." >&2 + exit 1 +fi + +printf '%s\n' "$$" > "$FRONTEND_STACK_PID_FILE" +release_stack_state() { + local recorded_pid="" + + if [[ -r "$FRONTEND_STACK_PID_FILE" ]]; then + read -r recorded_pid < "$FRONTEND_STACK_PID_FILE" || true + fi + if [[ "$recorded_pid" == "$$" ]]; then + rm -f "$FRONTEND_STACK_PID_FILE" + fi +} +trap release_stack_state EXIT + echo "Starting LibreChat ($MODE)..." echo " command: cd $ROOT/apps/ui && bash ./scripts/$MODE.sh" ( cd "$ROOT/apps/ui" - bash "./scripts/$MODE.sh" + exec setsid bash "./scripts/$MODE.sh" ) & UI_PID=$! @@ -551,19 +732,44 @@ echo "Starting homepage ($MODE)..." echo " command: cd $ROOT/apps/homepage && bash $BUN_SH run $MODE" ( cd "$ROOT/apps/homepage" - bash "$BUN_SH" run "$MODE" + exec setsid bash "$BUN_SH" run "$MODE" ) & HOMEPAGE_PID=$! cleanup_children() { local reason="$1" - if kill -0 "$UI_PID" 2>/dev/null; then - echo "Stopping remaining LibreChat ($MODE) process after ${reason}..." >&2 - kill "$UI_PID" 2>/dev/null || true + local ui_group_running=false + local homepage_group_running=false + + if kill -0 -- "-$UI_PID" 2>/dev/null; then + ui_group_running=true + echo "Stopping remaining LibreChat ($MODE) process group after ${reason}..." >&2 + kill -TERM -- "-$UI_PID" 2>/dev/null || true + fi + if kill -0 -- "-$HOMEPAGE_PID" 2>/dev/null; then + homepage_group_running=true + echo "Stopping remaining homepage ($MODE) process group after ${reason}..." >&2 + kill -TERM -- "-$HOMEPAGE_PID" 2>/dev/null || true + fi + + for _ in {1..20}; do + ui_group_running=false + homepage_group_running=false + kill -0 -- "-$UI_PID" 2>/dev/null && ui_group_running=true + kill -0 -- "-$HOMEPAGE_PID" 2>/dev/null && homepage_group_running=true + if [[ "$ui_group_running" == false && "$homepage_group_running" == false ]]; then + return 0 + fi + sleep 0.1 + done + + if [[ "$ui_group_running" == true ]]; then + echo "Force-stopping remaining LibreChat ($MODE) process group after ${reason}..." >&2 + kill -KILL -- "-$UI_PID" 2>/dev/null || true fi - if kill -0 "$HOMEPAGE_PID" 2>/dev/null; then - echo "Stopping remaining homepage ($MODE) process after ${reason}..." >&2 - kill "$HOMEPAGE_PID" 2>/dev/null || true + if [[ "$homepage_group_running" == true ]]; then + echo "Force-stopping remaining homepage ($MODE) process group after ${reason}..." >&2 + kill -KILL -- "-$HOMEPAGE_PID" 2>/dev/null || true fi } @@ -577,18 +783,24 @@ on_interrupt() { trap on_interrupt INT TERM -wait -n "$UI_PID" "$HOMEPAGE_PID" -FIRST_EXIT_STATUS=$? +if wait -n "$UI_PID" "$HOMEPAGE_PID"; then + FIRST_EXIT_STATUS=0 +else + FIRST_EXIT_STATUS=$? +fi + +if [[ "$FIRST_EXIT_STATUS" -eq 0 ]]; then + echo "Frontend stack aborted: a long-lived frontend child exited unexpectedly with status 0; treating the incomplete stack as a failure." >&2 + FIRST_EXIT_STATUS=1 +fi trap - INT TERM -UI_RUNNING=false -HOMEPAGE_RUNNING=false UI_EXIT_STATUS= HOMEPAGE_EXIT_STATUS= if kill -0 "$UI_PID" 2>/dev/null; then - UI_RUNNING=true + : else if wait "$UI_PID" 2>/dev/null; then UI_EXIT_STATUS=0 @@ -599,7 +811,7 @@ else fi if kill -0 "$HOMEPAGE_PID" 2>/dev/null; then - HOMEPAGE_RUNNING=true + : else if wait "$HOMEPAGE_PID" 2>/dev/null; then HOMEPAGE_EXIT_STATUS=0 @@ -614,4 +826,4 @@ cleanup_children "sibling exit" wait "$UI_PID" 2>/dev/null || true wait "$HOMEPAGE_PID" 2>/dev/null || true -exit "$FIRST_EXIT_STATUS" \ No newline at end of file +exit "$FIRST_EXIT_STATUS" diff --git a/scripts/with-bun-path.sh b/scripts/with-bun-path.sh index 4d89af5..11324fe 100644 --- a/scripts/with-bun-path.sh +++ b/scripts/with-bun-path.sh @@ -29,6 +29,36 @@ case ":${PATH}:" in *) export PATH="${BUN_DIR}:${PATH}" ;; esac +# Bun provides a `node` compatibility shim when no native Node binary is on PATH. +# Prefer the repository's nvm-selected Node runtime for Node-based tools such as +# ESLint, whose CommonJS dependencies are not always compatible with that shim. +NODE_VERSION="" +if [[ -r "${ROOT_DIR}/.nvmrc" ]]; then + IFS= read -r NODE_VERSION < "${ROOT_DIR}/.nvmrc" + NODE_VERSION="${NODE_VERSION#v}" + if [[ ! "${NODE_VERSION}" =~ ^[0-9]+([.][0-9]+){0,2}$ ]]; then + NODE_VERSION="" + fi +fi + +NODE_BIN_DIR="" +if [[ -n "${NODE_VERSION}" ]]; then + for node_candidate in "${USER_HOME}/.nvm/versions/node/v${NODE_VERSION}"*/bin/node; do + if [[ -x "${node_candidate}" ]]; then + NODE_BIN_DIR="$(dirname "${node_candidate}")" + break + fi + done +fi + +if [[ -z "${NODE_BIN_DIR}" && -n "${NVM_BIN:-}" && -x "${NVM_BIN}/node" ]]; then + NODE_BIN_DIR="${NVM_BIN}" +fi + +if [[ -n "${NODE_BIN_DIR}" ]]; then + export PATH="${NODE_BIN_DIR}:${PATH}" +fi + cd "${ROOT_DIR}" WORKSPACE_SURFACE_ALIASES=( @@ -103,3 +133,5 @@ elif [[ "$1" == "workspace-surface-quickcheck-thread" ]]; then elif [[ "$1" == "workspace-surface-summary-thread" ]]; then set -- bash -lc 'bash ./scripts/with-bun-path.sh bun run workspace:surface:summary && bash ./scripts/with-bun-path.sh bun run frontend:typecheck' fi + +exec "$@" diff --git a/tsconfig.json b/tsconfig.json index 7968e2b..b89336e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,7 +13,9 @@ /* Language and Environment */ "target": "ES2022", "lib": [ - "ES2022" + "ES2022", + "DOM", + "DOM.Iterable" ], // "jsx": "preserve", // "experimentalDecorators": true, @@ -109,5 +111,6 @@ /* Completeness */ // "skipDefaultLibCheck": true, "skipLibCheck": true - } + }, + "exclude": ["node_modules", "apps/ui/librechat"] } diff --git a/turbo.json b/turbo.json index 9605d1e..938a77c 100644 --- a/turbo.json +++ b/turbo.json @@ -38,6 +38,10 @@ "outputs": [], "inputs": ["apps/**", "tests/**", "package.json", "bun.lock"] }, + "typecheck": { + "outputs": [], + "inputs": ["$TURBO_DEFAULT$", "../../tsconfig.json"] + }, "dev": { "dependsOn": [], "outputs": [],