From 8370be07534ff8274b0d51a3833426a6497f3bf8 Mon Sep 17 00:00:00 2001 From: madjin <32600939+madjin@users.noreply.github.com> Date: Wed, 19 Mar 2025 02:05:21 -0400 Subject: [PATCH 01/57] update quick action links --- .../docs/src/components/HomepageFeatures/index.jsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/docs/src/components/HomepageFeatures/index.jsx b/packages/docs/src/components/HomepageFeatures/index.jsx index 9d9b1eb5b16..0d1d52c5c21 100644 --- a/packages/docs/src/components/HomepageFeatures/index.jsx +++ b/packages/docs/src/components/HomepageFeatures/index.jsx @@ -131,6 +131,11 @@ const QuickActionsList = [ <> Explore the ecosystem of plugins that extend your agent's abilities and integrations across platforms. +
+ + 📋 See package showcase + +
), link: '/packages', @@ -142,9 +147,14 @@ const QuickActionsList = [ <> Browse examples and resources from the community to spark ideas for your next AI agent project. +
+ + 📋 View awesome-eliza + +
), - link: '/docs/intro', + link: '/docs/awesome-eliza', }, ]; From 93bc999d91a410a858c6a04112d2d8454d10b110 Mon Sep 17 00:00:00 2001 From: madjin <32600939+madjin@users.noreply.github.com> Date: Thu, 20 Mar 2025 19:22:52 -0400 Subject: [PATCH 02/57] add thumbnails, update frontpage links --- .../src/components/HomepageFeatures/index.jsx | 6 +++--- .../src/components/HomepageHeader/index.jsx | 2 +- packages/docs/static/img/actions.jpg | Bin 0 -> 46195 bytes packages/docs/static/img/agentruntime.jpg | Bin 0 -> 67569 bytes packages/docs/static/img/database.jpg | Bin 0 -> 72081 bytes packages/docs/static/img/eliza-overview.jpg | Bin 0 -> 63279 bytes packages/docs/static/img/entities.jpg | Bin 0 -> 33667 bytes packages/docs/static/img/evaluators.jpg | Bin 0 -> 58058 bytes packages/docs/static/img/knowledge.jpg | Bin 0 -> 61093 bytes packages/docs/static/img/plugins.jpg | Bin 0 -> 74265 bytes packages/docs/static/img/project.jpg | Bin 0 -> 25493 bytes packages/docs/static/img/providers.jpg | Bin 0 -> 117391 bytes packages/docs/static/img/rooms.jpg | Bin 0 -> 28565 bytes packages/docs/static/img/services.jpg | Bin 0 -> 28053 bytes packages/docs/static/img/tasks.jpg | Bin 0 -> 56539 bytes packages/docs/static/img/worlds.jpg | Bin 0 -> 35766 bytes 16 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 packages/docs/static/img/actions.jpg create mode 100644 packages/docs/static/img/agentruntime.jpg create mode 100644 packages/docs/static/img/database.jpg create mode 100644 packages/docs/static/img/eliza-overview.jpg create mode 100644 packages/docs/static/img/entities.jpg create mode 100644 packages/docs/static/img/evaluators.jpg create mode 100644 packages/docs/static/img/knowledge.jpg create mode 100644 packages/docs/static/img/plugins.jpg create mode 100644 packages/docs/static/img/project.jpg create mode 100644 packages/docs/static/img/providers.jpg create mode 100644 packages/docs/static/img/rooms.jpg create mode 100644 packages/docs/static/img/services.jpg create mode 100644 packages/docs/static/img/tasks.jpg create mode 100644 packages/docs/static/img/worlds.jpg diff --git a/packages/docs/src/components/HomepageFeatures/index.jsx b/packages/docs/src/components/HomepageFeatures/index.jsx index 0d1d52c5c21..167bdb57735 100644 --- a/packages/docs/src/components/HomepageFeatures/index.jsx +++ b/packages/docs/src/components/HomepageFeatures/index.jsx @@ -41,14 +41,14 @@ const FeatureList = [ }, { icon: '💭', - title: 'Self-Reflection', + title: 'Self-Reflection & Learning', description: ( <> Agents learn from interactions through built-in reflection mechanisms that extract facts, build relationships, and improve responses over time. ), - link: '/docs/core/reflection', + link: '/docs/core/evaluators', }, { icon: '💬', @@ -277,7 +277,7 @@ export default function HomepageFeatures({ type = 'features', showUseCases = tru
- + Get Started with Eliza diff --git a/packages/docs/src/components/HomepageHeader/index.jsx b/packages/docs/src/components/HomepageHeader/index.jsx index 092222a5b7e..201d319662f 100644 --- a/packages/docs/src/components/HomepageHeader/index.jsx +++ b/packages/docs/src/components/HomepageHeader/index.jsx @@ -20,7 +20,7 @@ function HomepageHeader() {

{siteConfig.tagline}

- + Get Started
diff --git a/packages/docs/static/img/actions.jpg b/packages/docs/static/img/actions.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e6dc8dea9ef4c7a6bbbbb144b54f77d33d6b887a GIT binary patch literal 46195 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 vVEqq04LMBjwZr6&e58V=-P0 literal 0 HcmV?d00001 diff --git a/packages/docs/static/img/database.jpg b/packages/docs/static/img/database.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe60770148c78f55f6b273048581959a12c71e72 GIT binary patch literal 72081 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 literal 0 HcmV?d00001 diff --git a/packages/docs/static/img/evaluators.jpg b/packages/docs/static/img/evaluators.jpg new file mode 100644 index 0000000000000000000000000000000000000000..32e9572fe70cae51b9bd12bd3548b586ea66d4e5 GIT binary patch literal 58058 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
  1. 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 L+$ao!pA-MtDg7_P literal 0 HcmV?d00001 diff --git a/packages/docs/static/img/knowledge.jpg b/packages/docs/static/img/knowledge.jpg new file mode 100644 index 0000000000000000000000000000000000000000..179d3ba6fc983a072dfb3af36e7eac6bdaee28cb GIT binary patch literal 61093 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Ξ2?D69A{#<=`l>l<Y1;JrKH_Gf-0>F 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

    $GJ>3^w} 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 hfZL{{V&$L&^gD@e2@kydKAy|Jg~p$MFCF literal 0 HcmV?d00001 diff --git a/packages/docs/static/img/plugins.jpg b/packages/docs/static/img/plugins.jpg new file mode 100644 index 0000000000000000000000000000000000000000..72f25d01c0dce4135f04916cee385369d9e9937d GIT binary patch literal 74265 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π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 literal 0 HcmV?d00001 diff --git a/packages/docs/static/img/project.jpg b/packages/docs/static/img/project.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d7607176b0a4f91b7a54333697f12ca2e4e7dae GIT binary patch literal 25493 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 T>8Um9Q>xy;P_X?8x}EzEG6SNw literal 0 HcmV?d00001 diff --git a/packages/docs/static/img/providers.jpg b/packages/docs/static/img/providers.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7f7b46967c30fbd7d4a4d2f8d4d1eaad21c04c85 GIT binary patch literal 117391 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

    + )}
); diff --git a/packages/client/src/hooks/use-agent-update.ts b/packages/client/src/hooks/use-agent-update.ts index 7c70699fb56..328ab621e64 100644 --- a/packages/client/src/hooks/use-agent-update.ts +++ b/packages/client/src/hooks/use-agent-update.ts @@ -4,14 +4,24 @@ import { useCallback } from 'react'; /** * A custom hook for handling Agent updates with specific handling for JSONb fields. - * This hook builds on usePartialUpdate but adds Agent-specific convenience methods. + * This hook builds on usePartialUpdate but adds Agent-specific convenience methods + * organized by the UI tabs (Basic Info, Content, Style, Plugins, etc.). * * @param initialAgent The initial Agent object * @returns Object with agent state and update methods */ export function useAgentUpdate(initialAgent: Agent) { - const [agent, updateField, updateObject, reset] = usePartialUpdate(initialAgent); + const { + value: agent, + updateField, + addArrayItem, + removeArrayItem, + updateObject, + reset, + updateSettings, + } = usePartialUpdate(initialAgent); + // ==================== Basic Info Tab ==================== /** * Updates a field in the Agent's settings object * @@ -20,11 +30,38 @@ export function useAgentUpdate(initialAgent: Agent) { */ const updateSetting = useCallback( (path: string, value: T) => { + console.log('[useAgentUpdate] updateSetting called for path:', path, 'value:', value); updateField(`settings.${path}`, value); }, [updateField] ); + /** + * Updates the entire settings object + * + * @param settings The new settings object + */ + const setSettings = useCallback( + (settings: any) => { + console.log('[useAgentUpdate] setSettings called with:', settings); + updateSettings(settings); + }, + [updateSettings] + ); + + /** + * Updates the agent's system prompt + * + * @param systemPrompt The new system prompt + */ + const updateSystemPrompt = useCallback( + (systemPrompt: string) => { + updateField('system', systemPrompt); + }, + [updateField] + ); + + // ==================== Secrets Tab ==================== /** * Updates a secret in the Agent's settings.secrets object * @@ -33,32 +70,139 @@ export function useAgentUpdate(initialAgent: Agent) { */ const updateSecret = useCallback( (key: string, value: string) => { - updateField(`settings.secrets.${key}`, value); + console.log('[useAgentUpdate] updateSecret called for key:', key, 'value:', value); + + // Handle nested secrets object properly + const currentSettings = agent.settings || {}; + const currentSecrets = currentSettings.secrets || {}; + + const newSecrets = { + ...currentSecrets, + [key]: value, + }; + + console.log('[useAgentUpdate] New secrets object:', newSecrets); + + // Update entire settings object for better change detection + updateSettings({ + ...currentSettings, + secrets: newSecrets, + }); }, - [updateField] + [agent.settings, updateSettings] ); /** - * Updates or replaces an array field in the Agent + * Removes a secret from the Agent's settings.secrets object * - * @param fieldName Array field name (e.g., 'plugins', 'bio', etc.) - * @param value New array value + * @param key Secret key to remove */ - const updateArrayField = useCallback( - (fieldName: string, value: T[]) => { - updateField(fieldName, value); + const removeSecret = useCallback( + (key: string) => { + console.log('[useAgentUpdate] removeSecret called for key:', key); + + // Get the current secrets object + const currentSettings = agent.settings || {}; + const currentSecrets = currentSettings.secrets || {}; + + console.log('[useAgentUpdate] Current secrets before removal:', currentSecrets); + + // Create a new secrets object without the removed key + const newSecrets = { ...currentSecrets }; + delete newSecrets[key]; + + console.log('[useAgentUpdate] New secrets after removal:', newSecrets); + + // Update the entire settings object to ensure nested changes are detected + const updatedSettings = { + ...currentSettings, + secrets: newSecrets, + }; + + console.log('[useAgentUpdate] Updated settings with removed secret:', updatedSettings); + + // Use updateSettings instead of updateField for better change detection + updateSettings(updatedSettings); + }, + [agent.settings, updateSettings] + ); + + // ==================== Content Tab ==================== + /** + * Adds an item to a content array (bio, topics, adjectives) + * + * @param arrayName The name of the array field + * @param item The item to add + */ + const addContentItem = useCallback( + (arrayName: 'bio' | 'topics' | 'adjectives', item: string) => { + addArrayItem(arrayName, item); + }, + [addArrayItem] + ); + + /** + * Removes an item from a content array + * + * @param arrayName The name of the array field + * @param index The index of the item to remove + */ + const removeContentItem = useCallback( + (arrayName: 'bio' | 'topics' | 'adjectives', index: number) => { + removeArrayItem(arrayName, index); + }, + [removeArrayItem] + ); + + /** + * Updates an item in a content array + * + * @param arrayName The name of the array field + * @param index The index of the item to update + * @param value The new value + */ + const updateContentItem = useCallback( + (arrayName: 'bio' | 'topics' | 'adjectives', index: number, value: string) => { + updateField(`${arrayName}.${index}`, value); }, [updateField] ); + // ==================== Style Tab ==================== /** - * Updates a value in one of the style arrays + * Adds a style rule to one of the style arrays * * @param styleType Type of style ('all', 'chat', 'post') - * @param index Index in the array - * @param value New value + * @param rule The style rule to add */ - const updateStyleItem = useCallback( + const addStyleRule = useCallback( + (styleType: 'all' | 'chat' | 'post', rule: string) => { + addArrayItem(`style.${styleType}`, rule); + }, + [addArrayItem] + ); + + /** + * Removes a style rule from one of the style arrays + * + * @param styleType Type of style ('all', 'chat', 'post') + * @param index The index of the rule to remove + */ + const removeStyleRule = useCallback( + (styleType: 'all' | 'chat' | 'post', index: number) => { + removeArrayItem(`style.${styleType}`, index); + }, + [removeArrayItem] + ); + + /** + * Updates a style rule in one of the style arrays + * + * @param styleType Type of style ('all', 'chat', 'post') + * @param index The index of the rule to update + * @param value The new rule value + */ + const updateStyleRule = useCallback( (styleType: 'all' | 'chat' | 'post', index: number, value: string) => { updateField(`style.${styleType}.${index}`, value); }, @@ -66,7 +210,7 @@ export function useAgentUpdate(initialAgent: Agent) { ); /** - * Sets a style array + * Sets a complete style array * * @param styleType Type of style ('all', 'chat', 'post') * @param values Array of style values @@ -78,15 +222,90 @@ export function useAgentUpdate(initialAgent: Agent) { [updateField] ); + // ==================== Plugins Tab ==================== + /** + * Adds a plugin to the agent's plugins array + * + * @param pluginId The plugin ID to add + */ + const addPlugin = useCallback( + (pluginId: string) => { + addArrayItem('plugins', pluginId); + }, + [addArrayItem] + ); + + /** + * Removes a plugin from the agent's plugins array + * + * @param index The index of the plugin to remove + */ + const removePlugin = useCallback( + (index: number) => { + removeArrayItem('plugins', index); + }, + [removeArrayItem] + ); + + /** + * Sets the entire plugins array + * + * @param plugins Array of plugin IDs + */ + const setPlugins = useCallback( + (plugins: string[]) => { + updateField('plugins', plugins); + }, + [updateField] + ); + + // ==================== Avatar Tab ==================== + /** + * Updates the agent's avatar + * + * @param avatarUrl The URL of the avatar image + */ + const updateAvatar = useCallback( + (avatarUrl: string) => { + updateSetting('avatar', avatarUrl); + }, + [updateSetting] + ); + return { agent, + // Original methods updateField, updateObject, + reset, + updateSettings, + setSettings, + + // Basic Info Tab updateSetting, + updateSystemPrompt, + + // Secrets Tab updateSecret, - updateArrayField, - updateStyleItem, + removeSecret, + + // Content Tab + addContentItem, + removeContentItem, + updateContentItem, + + // Style Tab + addStyleRule, + removeStyleRule, + updateStyleRule, setStyleArray, - reset, + + // Plugins Tab + addPlugin, + removePlugin, + setPlugins, + + // Avatar Tab + updateAvatar, }; } diff --git a/packages/client/src/hooks/use-partial-update.ts b/packages/client/src/hooks/use-partial-update.ts index aac365fffbd..4ab580625b9 100644 --- a/packages/client/src/hooks/use-partial-update.ts +++ b/packages/client/src/hooks/use-partial-update.ts @@ -10,6 +10,8 @@ import { useState, useCallback } from 'react'; * @returns A tuple containing: * - The current state object * - A function to update a specific field (handles nested paths) + * - A function to add an item to an array field + * - A function to remove an item from an array field * - A function to set the entire object * - A function to reset to initial state */ @@ -23,9 +25,12 @@ export function usePartialUpdate(initialValue: T) { * @param newValue The new value for the field */ const updateField = useCallback((path: string, newValue: K) => { + console.log('[usePartialUpdate] updateField called with path:', path, 'value:', newValue); + setValue((prevValue) => { // Handle simple (non-nested) case if (!path.includes('.')) { + console.log('[usePartialUpdate] Updating simple field:', path); return { ...prevValue, [path]: newValue, @@ -56,14 +61,46 @@ export function usePartialUpdate(initialValue: T) { array[index] = updateNestedObject(array[index], deeperPath, newValue); } + console.log( + '[usePartialUpdate] Updating array field:', + arrayName, + 'index:', + index, + 'new array:', + array + ); return { ...prevValue, [arrayName]: array, } as T; } + // Special case for settings.secrets path + if (path.startsWith('settings.secrets.')) { + const secretKey = path.split('.')[2]; + console.log('[usePartialUpdate] Updating secret:', secretKey, 'with value:', newValue); + + const currentSettings = (prevValue as any).settings || {}; + const currentSecrets = currentSettings.secrets || {}; + + const newSecrets = { + ...currentSecrets, + [secretKey]: newValue, + }; + + console.log('[usePartialUpdate] New secrets object:', newSecrets); + + return { + ...prevValue, + settings: { + ...currentSettings, + secrets: newSecrets, + }, + } as T; + } + // Handle regular nested objects - return { + const result = { ...prevValue, [fieldToUpdate]: updateNestedObject( prevValue[fieldToUpdate as keyof T], @@ -71,6 +108,9 @@ export function usePartialUpdate(initialValue: T) { newValue ), } as T; + + console.log('[usePartialUpdate] Updated value with nested path:', path, 'Result:', result); + return result; }); }, []); @@ -94,6 +134,115 @@ export function usePartialUpdate(initialValue: T) { } as unknown as K; }; + /** + * Adds an item to an array field + * + * @param path Path to the array field + * @param item Item to add + */ + const addArrayItem = useCallback((path: string, item: V) => { + setValue((prevValue) => { + const pathParts = path.split('.'); + + // Handle simple array field + if (pathParts.length === 1) { + const fieldName = pathParts[0]; + const currentArray = Array.isArray(prevValue[fieldName as keyof T]) + ? [...(prevValue[fieldName as keyof T] as unknown as V[])] + : []; + + return { + ...prevValue, + [fieldName]: [...currentArray, item], + } as T; + } + + // Handle nested array field + const updatePath = path; + const currentValue = getNestedValue(prevValue, updatePath); + const currentArray = Array.isArray(currentValue) ? [...currentValue] : []; + + return setNestedValue(prevValue, updatePath, [...currentArray, item]); + }); + }, []); + + /** + * Removes an item from an array field + * + * @param path Path to the array field + * @param index Index of the item to remove + */ + const removeArrayItem = useCallback((path: string, index: number) => { + setValue((prevValue) => { + const pathParts = path.split('.'); + + // Handle simple array field + if (pathParts.length === 1) { + const fieldName = pathParts[0]; + const currentArray = Array.isArray(prevValue[fieldName as keyof T]) + ? [...(prevValue[fieldName as keyof T] as unknown as any[])] + : []; + + if (index < 0 || index >= currentArray.length) return prevValue; + + return { + ...prevValue, + [fieldName]: [...currentArray.slice(0, index), ...currentArray.slice(index + 1)], + } as T; + } + + // Handle nested array field + const updatePath = path; + const currentValue = getNestedValue(prevValue, updatePath); + + if (!Array.isArray(currentValue) || index < 0 || index >= currentValue.length) { + return prevValue; + } + + const newArray = [...currentValue.slice(0, index), ...currentValue.slice(index + 1)]; + return setNestedValue(prevValue, updatePath, newArray); + }); + }, []); + + /** + * Helper function to get a nested value from an object + */ + const getNestedValue = (obj: any, path: string): any => { + const parts = path.split('.'); + let current = obj; + + for (const part of parts) { + if (current === null || current === undefined) { + return undefined; + } + current = current[part]; + } + + return current; + }; + + /** + * Helper function to set a nested value in an object + */ + const setNestedValue = (obj: O, path: string, value: V): O => { + const parts = path.split('.'); + + if (parts.length === 1) { + return { + ...obj, + [parts[0]]: value, + } as O; + } + + const [first, ...rest] = parts; + const nextObj = (obj as any)[first] || {}; + + return { + ...obj, + [first]: setNestedValue(nextObj, rest.join('.'), value), + } as O; + }; + /** * Updates the entire object using deep merge */ @@ -108,5 +257,25 @@ export function usePartialUpdate(initialValue: T) { setValue(initialValue); }, [initialValue]); - return [value, updateField, updateObject, reset] as const; + // Special handling for updating the entire settings object + const updateSettings = useCallback((settings: any) => { + console.log('[usePartialUpdate] updateSettings called with:', settings); + setValue( + (prevValue) => + ({ + ...prevValue, + settings, + }) as T + ); + }, []); + + return { + value, + updateField, + addArrayItem, + removeArrayItem, + updateObject, + reset, + updateSettings, + }; } From b927f2d1d7d38d1eb4c46e2fc7098df8078f48e5 Mon Sep 17 00:00:00 2001 From: 0xbbjoker <0xbbjoker@proton.me> Date: Thu, 20 Mar 2025 21:00:05 +0100 Subject: [PATCH 25/57] feat: restructure update by panels --- .../client/src/components/agent-settings.tsx | 61 +- .../client/src/components/character-form.tsx | 23 +- .../client/src/components/secret-panel.tsx | 595 +++++++++++------- packages/client/src/hooks/use-agent-update.ts | 47 +- .../client/src/hooks/use-partial-update.ts | 92 ++- packages/client/src/lib/api.ts | 28 +- packages/plugin-sql/src/base.ts | 105 +--- packages/the-org/src/index.ts | 10 +- 8 files changed, 548 insertions(+), 413 deletions(-) diff --git a/packages/client/src/components/agent-settings.tsx b/packages/client/src/components/agent-settings.tsx index 2327aba6228..cbe8592865f 100644 --- a/packages/client/src/components/agent-settings.tsx +++ b/packages/client/src/components/agent-settings.tsx @@ -15,7 +15,8 @@ export default function AgentSettings({ agent, agentId }: { agent: Agent; agentI const navigate = useNavigate(); const queryClient = useQueryClient(); - console.log('[AgentSettings] Initializing with agent:', agent); + console.log('[AgentSettings] INITIALIZING with agent:', agent); + console.log('[AgentSettings] Initial agent.settings.secrets:', agent.settings?.secrets); // Use our enhanced agent update hook for more intelligent handling of JSONb fields const agentState = useAgentUpdate(agent); @@ -23,7 +24,7 @@ export default function AgentSettings({ agent, agentId }: { agent: Agent; agentI // Log whenever agent state changes useEffect(() => { console.log('[AgentSettings] Agent state updated:', agentState.agent); - console.log('[AgentSettings] Settings.secrets:', agentState.agent.settings?.secrets); + console.log('[AgentSettings] Current settings.secrets:', agentState.agent.settings?.secrets); }, [agentState.agent]); const handleSubmit = async (updatedAgent: Agent) => { @@ -32,9 +33,8 @@ export default function AgentSettings({ agent, agentId }: { agent: Agent; agentI throw new Error('Agent ID is missing'); } - console.log('[AgentSettings] Submitting agent update:', updatedAgent); - console.log('[AgentSettings] Settings being submitted:', updatedAgent.settings); - console.log('[AgentSettings] Secrets being submitted:', updatedAgent.settings?.secrets); + console.log('[AgentSettings] handleSubmit called with agent:', updatedAgent); + console.log('[AgentSettings] Current secrets in submission:', updatedAgent.settings?.secrets); // Make sure we're properly handling all JSONb fields const mergedAgent = { @@ -46,14 +46,18 @@ export default function AgentSettings({ agent, agentId }: { agent: Agent; agentI adjectives: updatedAgent.adjectives || [], plugins: updatedAgent.plugins || [], style: updatedAgent.style || { all: [], chat: [], post: [] }, - settings: updatedAgent.settings || { secrets: {} }, + // Keep the settings object exactly as it is without providing fallbacks + // that could inadvertently restore deleted secrets + settings: updatedAgent.settings || {}, }; - console.log('[AgentSettings] Final merged agent being sent to API:', mergedAgent); + console.log('[AgentSettings] Final merged agent before API call:', mergedAgent); console.log('[AgentSettings] Final secrets being sent:', mergedAgent.settings?.secrets); // Send the character update request to the agent endpoint + console.log('[AgentSettings] Calling API updateAgent...'); await apiClient.updateAgent(agentId, mergedAgent); + console.log('[AgentSettings] API updateAgent call successful'); // Invalidate both the agent query and the agents list queryClient.invalidateQueries({ queryKey: ['agent', agentId] }); @@ -118,8 +122,47 @@ export default function AgentSettings({ agent, agentId }: { agent: Agent; agentI { - console.log('[agent-settings] SecretPanel onChange called with:', updatedAgent); - agentState.updateObject(updatedAgent); + console.log('[AgentSettings] SecretPanel onChange called with agent', updatedAgent); + console.log( + '[AgentSettings] SecretPanel onChange - agent settings:', + updatedAgent.settings + ); + console.log( + '[AgentSettings] SecretPanel onChange - secrets received:', + updatedAgent.settings?.secrets + ); + + if (updatedAgent.settings && updatedAgent.settings.secrets) { + console.log( + '[AgentSettings] Secrets received from SecretPanel:', + updatedAgent.settings.secrets + ); + + // Create a new settings object with the updated secrets + const updatedSettings = { + ...agentState.agent.settings, + secrets: updatedAgent.settings.secrets, + }; + + console.log( + '[AgentSettings] Current agent settings before update:', + agentState.agent.settings + ); + console.log('[AgentSettings] Updating settings with:', updatedSettings); + console.log('[AgentSettings] Updated secrets object:', updatedSettings.secrets); + + // Use updateSettings to properly handle the secrets + agentState.updateSettings(updatedSettings); + + console.log('[AgentSettings] After updateSettings call'); + // Add a timeout to check if the agent state updated + setTimeout(() => { + console.log( + '[AgentSettings] After updateSettings, timeout check - current secrets:', + agentState.agent.settings?.secrets + ); + }, 100); + } }} /> ), diff --git a/packages/client/src/components/character-form.tsx b/packages/client/src/components/character-form.tsx index 50634c9e867..12ef8560e44 100644 --- a/packages/client/src/components/character-form.tsx +++ b/packages/client/src/components/character-form.tsx @@ -216,22 +216,15 @@ export default function CharacterForm({ return char; }; - const handleSubmit = async (e: FormEvent) => { + const handleFormSubmit = (e: React.FormEvent) => { e.preventDefault(); - setIsSubmitting(true); - try { - const updatedCharacter = await ensureAvatarSize(characterValue); - await onSubmit(updatedCharacter); - } catch (error) { - toast({ - title: 'Error', - description: error instanceof Error ? error.message : 'Failed to update', - variant: 'destructive', - }); - } finally { - setIsSubmitting(false); - } + console.log('[CharacterForm] Form submission triggered'); + console.log('[CharacterForm] Current characterValue:', characterValue); + console.log('[CharacterForm] Settings being submitted:', characterValue.settings); + console.log('[CharacterForm] Secrets being submitted:', characterValue.settings?.secrets); + + onSubmit?.(characterValue as any); }; const renderInputField = (field: InputField) => ( @@ -287,7 +280,7 @@ export default function CharacterForm({
-
+ void; } +// Export as named export to match import in other files export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { - console.log('[SecretPanel] Initializing with characterValue:', characterValue); - const [editIndex, setEditIndex] = useState(-1); - const [keyInput, setKeyInput] = useState(''); - const [valueInput, setValueInput] = useState(''); - const [envs, setEnvs] = useState([]); - const [showPassword, setShowPassword] = useState(false); + console.log('[SecretPanel] MOUNTING with characterValue:', characterValue); + console.log('[SecretPanel] Initial secrets:', characterValue?.settings?.secrets); + + // Initialize secrets from character data + const initialSecrets = Object.entries(characterValue?.settings?.secrets || {}).map( + ([name, value]) => ({ + name, + value: String(value), + isNew: false, + isModified: false, + isDeleted: false, + }) + ); + + console.log('[SecretPanel] Initialized envs with:', initialSecrets); + + const [envs, setEnvs] = useState(initialSecrets); const [name, setName] = useState(''); const [value, setValue] = useState(''); + const [showPassword, setShowPassword] = useState(false); + const [openIndex, setOpenIndex] = useState(null); + const [editingIndex, setEditingIndex] = useState(null); + const [editedValue, setEditedValue] = useState(''); const [isDragging, setIsDragging] = useState(false); - const { updateSecret, removeSecret } = useAgentUpdate(characterValue); - const initialSecrets = useRef(characterValue?.settings?.secrets || {}); + // Keep track of deleted keys to ensure proper removal + const [deletedKeys, setDeletedKeys] = useState([]); + const dropdownRef = useRef(null); const dropRef = useRef(null); - console.log('[SecretPanel] Initial secrets:', initialSecrets.current); - - // Create an array from the secrets object for easier rendering - const secretsArray = Object.entries(characterValue?.settings?.secrets || {}).map( - ([key, value]) => ({ key, value }) - ); - - function handleAddSecret() { - console.log('[SecretPanel] Adding secret:', keyInput, valueInput); - if (keyInput && valueInput) { - updateSecret(keyInput, valueInput); - console.log('[SecretPanel] Secret added, new secrets:', characterValue?.settings?.secrets); - setKeyInput(''); - setValueInput(''); - - // After updating the secret, check if the changes should be sent to parent - checkForChanges(); - } - } - + // Handle file drop for .env files const handleFile = (file: File) => { const reader = new FileReader(); reader.onload = (event) => { @@ -70,17 +69,33 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { if (key) newEnvs[key.trim()] = val; } - setEnvs((prev) => { - const merged = new Map(prev.map(({ name, value }) => [name, value])); - for (const [key, val] of Object.entries(newEnvs)) { - merged.set(key, val); + // Add new environment variables with isNew flag + const updatedEnvs = [...envs]; + for (const [key, val] of Object.entries(newEnvs)) { + const existingIndex = updatedEnvs.findIndex((env) => env.name === key); + if (existingIndex !== -1) { + // If value changed, mark as modified + if (updatedEnvs[existingIndex].value !== val) { + updatedEnvs[existingIndex].value = val; + updatedEnvs[existingIndex].isModified = true; + } + } else { + // Add new env with isNew flag + updatedEnvs.push({ name: key, value: val, isNew: true }); + + // If this key was previously deleted, remove it from deletedKeys + if (deletedKeys.includes(key)) { + setDeletedKeys(deletedKeys.filter((k) => k !== key)); + } } - return Array.from(merged.entries()).map(([name, value]) => ({ name, value })); - }); + } + + setEnvs(updatedEnvs); }; reader.readAsText(file); }; + // Set up drag and drop listeners for .env files useEffect(() => { const drop = dropRef.current; if (!drop) return; @@ -120,119 +135,195 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { }; }, []); + // Add a new environment variable const addEnv = () => { if (name && value) { - setEnvs((prev) => { - const updated = [...prev]; - const existingIndex = updated.findIndex((env) => env.name === name); - if (existingIndex !== -1) { - updated[existingIndex].value = value; - } else { - updated.push({ name, value }); + const exists = envs.some((env) => env.name === name); + if (!exists) { + console.log(`[SecretPanel] Adding new secret: ${name}`); + + // If this key was previously deleted, remove it from deletedKeys + if (deletedKeys.includes(name)) { + setDeletedKeys(deletedKeys.filter((key) => key !== name)); } - return updated; - }); - setName(''); - setValue(''); - - // Also add to secrets - updateSecret(name, value); - checkForChanges(); + + setEnvs([...envs, { name, value, isNew: true }]); + setName(''); + setValue(''); + } } }; - function handleEditSecret(index: number) { - console.log('[SecretPanel] Editing secret at index:', index); - const secretEntry = secretsArray[index]; - if (secretEntry) { - setKeyInput(secretEntry.key); - setValueInput(secretEntry.value as string); - setEditIndex(index); + // Start editing an environment variable + const startEditing = (index: number) => { + setEditingIndex(index); + setEditedValue(envs[index].value); + setOpenIndex(null); + }; + + // Save edited environment variable + const saveEdit = (index: number) => { + const updatedEnvs = [...envs]; + // Only mark as modified if the value actually changed + if (updatedEnvs[index].value !== editedValue) { + updatedEnvs[index].value = editedValue; + updatedEnvs[index].isModified = true; } - } - - function handleSaveEdit() { - console.log('[SecretPanel] Saving edit for secret:', keyInput); - if (keyInput && valueInput) { - const oldKey = secretsArray[editIndex].key; - - // If key changed, remove the old one and add the new one - if (oldKey !== keyInput) { - console.log('[SecretPanel] Key changed from', oldKey, 'to', keyInput); - removeSecret(oldKey); - updateSecret(keyInput, valueInput); - } else { - // Just update the value - updateSecret(keyInput, valueInput); + setEnvs(updatedEnvs); + setEditingIndex(null); + }; + + // Remove an environment variable + const removeEnv = (index: number) => { + const keyToRemove = envs[index].name; + + // Add the key to deletedKeys to track removal + setDeletedKeys([...deletedKeys, keyToRemove]); + + // Update local state + setEnvs(envs.filter((_, i) => i !== index)); + setOpenIndex(null); + setEditingIndex(null); + }; + + // Handle clicks outside of dropdown + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { + setOpenIndex(null); } + }; - console.log('[SecretPanel] Edit saved, new secrets:', characterValue?.settings?.secrets); - setKeyInput(''); - setValueInput(''); - setEditIndex(-1); + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, []); - // After updating the secret, check if the changes should be sent to parent - checkForChanges(); - } - } - - function handleRemoveSecret(key: string) { - console.log('[SecretPanel] Removing secret:', key); - removeSecret(key); - - console.log('[SecretPanel] Secret removed, new secrets:', characterValue?.settings?.secrets); - - // After removing the secret, check if the changes should be sent to parent - checkForChanges(); - } - - function handleCancelEdit() { - console.log('[SecretPanel] Canceling edit'); - setKeyInput(''); - setValueInput(''); - setEditIndex(-1); - } - - // Check if secrets have changed and notify parent if needed - function checkForChanges() { - console.log('[SecretPanel] Checking for changes'); - console.log('[SecretPanel] Current secrets:', characterValue?.settings?.secrets); - console.log('[SecretPanel] Initial secrets:', initialSecrets.current); - - // Use setTimeout to ensure we're checking after state updates are processed - setTimeout(() => { - // Check if secrets have changed - const currentSecrets = characterValue?.settings?.secrets || {}; - const initialSecretsObj = initialSecrets.current; - - const initialKeys = Object.keys(initialSecretsObj); - const currentKeys = Object.keys(currentSecrets); - - // Compare keys - const keysChanged = - initialKeys.length !== currentKeys.length || - initialKeys.some((key) => !currentKeys.includes(key)) || - currentKeys.some((key) => !initialKeys.includes(key)); - - // Compare values for common keys - const valuesChanged = currentKeys.some( - (key) => initialKeys.includes(key) && initialSecretsObj[key] !== currentSecrets[key] + // Update character value when envs change + useEffect(() => { + // Only update if there are actual changes to prevent unnecessary rerenders + const hasChanges = envs.some((env) => env.isNew || env.isModified) || deletedKeys.length > 0; + + console.log('[SecretPanel] Checking for changes - hasChanges:', hasChanges); + console.log('[SecretPanel] Current envs:', envs); + console.log('[SecretPanel] Deleted keys:', deletedKeys); + + if (hasChanges) { + console.log(`[SecretPanel] --- PROCESSING CHANGES ---`); + console.log( + `[SecretPanel] New/modified secrets: ${envs + .filter((e) => e.isNew || e.isModified) + .map((e) => e.name) + .join(', ')}` ); + console.log(`[SecretPanel] Deleted keys: ${deletedKeys.join(', ')}`); + + // Start with the original secrets from characterValue + const currentSettings = characterValue.settings || {}; + const currentSecrets = { ...(currentSettings.secrets || {}) }; + + console.log('[SecretPanel] Starting with current secrets:', currentSecrets); + + // First, mark deleted keys explicitly as null instead of removing them + // This ensures the server knows to remove them instead of just not updating them + deletedKeys.forEach((key) => { + console.log(`[SecretPanel] Marking key for deletion: ${key}`); + currentSecrets[key] = null; + }); + + // Then update with current envs + envs.forEach(({ name, value, isNew, isModified }) => { + console.log( + `[SecretPanel] Setting secret: ${name}, value: ${value}, isNew: ${isNew}, isModified: ${isModified}` + ); + currentSecrets[name] = value; + }); - console.log('[SecretPanel] Keys changed:', keysChanged); - console.log('[SecretPanel] Values changed:', valuesChanged); + // Create a new agent with updated secrets + const updatedAgent: Agent = { + ...characterValue, + settings: { + ...currentSettings, + secrets: currentSecrets, + }, + }; + + console.log('[SecretPanel] Final updated secrets object:', currentSecrets); + console.log('[SecretPanel] Calling onChange with updated agent'); + + // Call the onChange prop with the updated agent + onChange(updatedAgent); + + console.log('[SecretPanel] onChange called, now clearing modification flags'); + + // Clear modification flags to prevent infinite update loops + setEnvs((prevEnvs) => { + const newEnvs = prevEnvs.map((env) => ({ + ...env, + isNew: false, + isModified: false, + })); + console.log('[SecretPanel] Cleared modification flags, new envs:', newEnvs); + return newEnvs; + }); + + // Clear deletedKeys after changes are applied + setDeletedKeys([]); + console.log('[SecretPanel] Cleared deletedKeys'); + } + // Remove characterValue from the dependency array to prevent cycles + }, [envs, onChange, deletedKeys]); - // If anything changed, notify the parent - if (keysChanged || valuesChanged) { - console.log('[SecretPanel] Secrets changed, notifying parent'); - onChange(characterValue); + // Sync envs with characterValue when it changes + useEffect(() => { + console.log( + '[SecretPanel] characterValue.settings?.secrets changed:', + characterValue.settings?.secrets + ); + + if (characterValue?.settings?.secrets) { + const currentSecretsEntries = Object.entries(characterValue.settings.secrets); + // Only update if the secrets have actually changed (different keys/number of entries) + const currentKeys = currentSecretsEntries + .map(([key]) => key) + .sort() + .join(','); + const envKeys = envs + .map((env) => env.name) + .sort() + .join(','); + + console.log('[SecretPanel] Current keys from characterValue:', currentKeys); + console.log('[SecretPanel] Current keys from envs:', envKeys); + console.log( + '[SecretPanel] Any new/modified envs:', + envs.some((env) => env.isNew || env.isModified) + ); + console.log('[SecretPanel] Any deleted keys:', deletedKeys.length > 0); + + if ( + currentKeys !== envKeys && + !envs.some((env) => env.isNew || env.isModified) && + deletedKeys.length === 0 + ) { + console.log('[SecretPanel] Updating envs from changed characterValue'); + const newEnvs = currentSecretsEntries.map(([name, value]) => ({ + name, + value: String(value), + isNew: false, + isModified: false, + isDeleted: false, + })); + console.log('[SecretPanel] Setting new envs:', newEnvs); + setEnvs(newEnvs); } - }, 0); - } + } + }, [characterValue.settings?.secrets, envs, deletedKeys]); return ( -
-

Environment Settings

+
+

Environment Settings

{/* Drag & Drop .env file section */}
@@ -243,7 +334,7 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { }`} onClick={() => document.getElementById('env-upload')?.click()} > - +

Drag & drop .env file or select file

@@ -262,126 +353,150 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) {
- {/* Manual entry section */} -
-
-
- + {/* Manual entry form */} +
+
+ + setName(e.target.value)} + /> +
+
+ +
setName(e.target.value)} + id="secret-value" + type={showPassword ? 'text' : 'password'} + placeholder="i9ju23nfsdf56" + value={value} + onChange={(e) => setValue(e.target.value)} + className="pr-10" /> -
-
- -
- setValue(e.target.value)} - className="pr-10" - /> -
setShowPassword(!showPassword)} - onKeyDown={(e) => { - if (e.key === 'Enter' || e.key === ' ') { - setShowPassword(!showPassword); - } - }} - tabIndex={0} - role="button" - aria-label={showPassword ? "Hide password" : "Show password"} - > - {showPassword ? : } -
+
setShowPassword(!showPassword)} + onKeyDown={(e) => { + if (e.key === 'Enter' || e.key === ' ') { + setShowPassword(!showPassword); + } + }} + role="button" + tabIndex={0} + aria-label={showPassword ? 'Hide password' : 'Show password'} + > + {showPassword ? : }
-
+ +
- {/* Advanced secret management */} -
- - setKeyInput(e.target.value)} - disabled={editIndex !== -1 && secretsArray[editIndex]?.key === 'OPENAI_API_KEY'} - placeholder="Enter secret key" - /> + {/* Secrets list header */} + {envs.length > 0 && ( +
+
Name
+
Value
+
Action
-
- - setValueInput(e.target.value)} - placeholder="Enter secret value" - /> -
-
- {editIndex === -1 ? ( - - ) : ( - <> - - + +
+ ) : ( +
+ {showPassword ? env.value : '••••••••••••••'} +
+ )} +
+
+ - - )} -
-
- - {/* List of secrets */} -
-

Secrets

- {secretsArray.length === 0 ? ( -

No secrets added yet

- ) : ( -
    - {secretsArray.map((secret, index) => ( -
  • - {secret.key} -
    - - +
    removeEnv(index)} + role="button" + tabIndex={0} + onKeyDown={(e) => { + if (e.key === 'Enter' || e.key === ' ') { + removeEnv(index); + } + }} > Remove - +
    -
  • - ))} -
- )} + )} +
+
+ ))}
); } + +// Also provide a default export for backward compatibility +export default SecretPanel; diff --git a/packages/client/src/hooks/use-agent-update.ts b/packages/client/src/hooks/use-agent-update.ts index 328ab621e64..6c3f020b1e7 100644 --- a/packages/client/src/hooks/use-agent-update.ts +++ b/packages/client/src/hooks/use-agent-update.ts @@ -43,10 +43,33 @@ export function useAgentUpdate(initialAgent: Agent) { */ const setSettings = useCallback( (settings: any) => { - console.log('[useAgentUpdate] setSettings called with:', settings); + console.log('[useAgentUpdate] setSettings called with:', JSON.stringify(settings)); + + if (settings.secrets) { + console.log( + '[useAgentUpdate] Current secrets before update:', + JSON.stringify(agent.settings?.secrets) + ); + console.log('[useAgentUpdate] New secrets to apply:', JSON.stringify(settings.secrets)); + + const removedKeys = Object.keys(agent.settings?.secrets || {}).filter( + (key) => !Object.keys(settings.secrets).includes(key) + ); + + console.log('[useAgentUpdate] Keys that will be removed:', removedKeys); + } + updateSettings(settings); + + // Add a timeout to check if the update was applied + setTimeout(() => { + console.log( + '[useAgentUpdate] After setSettings timeout - current secrets:', + JSON.stringify(agent.settings?.secrets) + ); + }, 100); }, - [updateSettings] + [updateSettings, agent.settings?.secrets] ); /** @@ -71,23 +94,41 @@ export function useAgentUpdate(initialAgent: Agent) { const updateSecret = useCallback( (key: string, value: string) => { console.log('[useAgentUpdate] updateSecret called for key:', key, 'value:', value); + console.log('[useAgentUpdate] Current agent settings:', JSON.stringify(agent.settings)); // Handle nested secrets object properly const currentSettings = agent.settings || {}; const currentSecrets = currentSettings.secrets || {}; + console.log( + '[useAgentUpdate] Current secrets before update:', + JSON.stringify(currentSecrets) + ); + const newSecrets = { ...currentSecrets, [key]: value, }; - console.log('[useAgentUpdate] New secrets object:', newSecrets); + console.log( + '[useAgentUpdate] New secrets object after adding/updating key:', + JSON.stringify(newSecrets) + ); // Update entire settings object for better change detection + console.log('[useAgentUpdate] Calling updateSettings with new settings'); updateSettings({ ...currentSettings, secrets: newSecrets, }); + + // Add a timeout to check if the update was applied + setTimeout(() => { + console.log( + '[useAgentUpdate] After updateSecret timeout - current secrets:', + JSON.stringify(agent.settings?.secrets) + ); + }, 100); }, [agent.settings, updateSettings] ); diff --git a/packages/client/src/hooks/use-partial-update.ts b/packages/client/src/hooks/use-partial-update.ts index 4ab580625b9..92035823bf8 100644 --- a/packages/client/src/hooks/use-partial-update.ts +++ b/packages/client/src/hooks/use-partial-update.ts @@ -25,12 +25,9 @@ export function usePartialUpdate(initialValue: T) { * @param newValue The new value for the field */ const updateField = useCallback((path: string, newValue: K) => { - console.log('[usePartialUpdate] updateField called with path:', path, 'value:', newValue); - setValue((prevValue) => { // Handle simple (non-nested) case if (!path.includes('.')) { - console.log('[usePartialUpdate] Updating simple field:', path); return { ...prevValue, [path]: newValue, @@ -61,14 +58,6 @@ export function usePartialUpdate(initialValue: T) { array[index] = updateNestedObject(array[index], deeperPath, newValue); } - console.log( - '[usePartialUpdate] Updating array field:', - arrayName, - 'index:', - index, - 'new array:', - array - ); return { ...prevValue, [arrayName]: array, @@ -78,7 +67,6 @@ export function usePartialUpdate(initialValue: T) { // Special case for settings.secrets path if (path.startsWith('settings.secrets.')) { const secretKey = path.split('.')[2]; - console.log('[usePartialUpdate] Updating secret:', secretKey, 'with value:', newValue); const currentSettings = (prevValue as any).settings || {}; const currentSecrets = currentSettings.secrets || {}; @@ -88,8 +76,6 @@ export function usePartialUpdate(initialValue: T) { [secretKey]: newValue, }; - console.log('[usePartialUpdate] New secrets object:', newSecrets); - return { ...prevValue, settings: { @@ -109,7 +95,6 @@ export function usePartialUpdate(initialValue: T) { ), } as T; - console.log('[usePartialUpdate] Updated value with nested path:', path, 'Result:', result); return result; }); }, []); @@ -258,16 +243,75 @@ export function usePartialUpdate(initialValue: T) { }, [initialValue]); // Special handling for updating the entire settings object - const updateSettings = useCallback((settings: any) => { - console.log('[usePartialUpdate] updateSettings called with:', settings); - setValue( - (prevValue) => - ({ + const updateSettings = useCallback( + (settings: any) => { + console.log('[usePartialUpdate] updateSettings called with:', JSON.stringify(settings)); + + setValue((prevValue) => { + console.log( + '[usePartialUpdate] Previous value in updateSettings:', + JSON.stringify(prevValue) + ); + + // Extract settings but remove 'secrets' key to avoid duplication + const { secrets, ...otherSettings } = settings; + console.log('[usePartialUpdate] Extracted secrets:', JSON.stringify(secrets)); + console.log('[usePartialUpdate] Other settings:', JSON.stringify(otherSettings)); + + // Create the updated settings object + const updatedSettings = { + ...(prevValue as any).settings, // Start with existing settings + ...otherSettings, // Add other settings (not secrets) + }; + + console.log( + '[usePartialUpdate] Updated settings before secrets:', + JSON.stringify(updatedSettings) + ); + + // Only add secrets if it was included in the update + if (secrets) { + console.log('[usePartialUpdate] Processing secrets update:', JSON.stringify(secrets)); + console.log('[usePartialUpdate] Secrets keys to process:', Object.keys(secrets)); + + // Create a new secrets object that only contains non-null values + const filteredSecrets: Record = {}; + + Object.entries(secrets).forEach(([key, value]) => { + console.log( + `[usePartialUpdate] Processing secret key: ${key}, value type: ${value === null ? 'null' : typeof value}` + ); + // If value is null, don't include it (this is how we delete) + if (value !== null) { + filteredSecrets[key] = value; + console.log(`[usePartialUpdate] Added key ${key} to filteredSecrets`); + } else { + console.log(`[usePartialUpdate] Skipping null key ${key} (will be deleted)`); + } + }); + + console.log( + '[usePartialUpdate] Filtered secrets after processing:', + JSON.stringify(filteredSecrets) + ); + console.log('[usePartialUpdate] Filtered secret keys:', Object.keys(filteredSecrets)); + updatedSettings.secrets = filteredSecrets; + } + + const result = { ...prevValue, - settings, - }) as T - ); - }, []); + settings: updatedSettings, + } as T; + + console.log( + '[usePartialUpdate] Final result after settings update:', + JSON.stringify(result) + ); + return result; + }); + }, + [] // Remove value from dependencies to avoid unnecessary rerenders + ); return { value, diff --git a/packages/client/src/lib/api.ts b/packages/client/src/lib/api.ts index 420c85f9ca2..921fc8f340a 100644 --- a/packages/client/src/lib/api.ts +++ b/packages/client/src/lib/api.ts @@ -256,29 +256,11 @@ export const apiClient = { deleteAgent: (agentId: string): Promise<{ success: boolean }> => fetcher({ url: `/agents/${agentId}`, method: 'DELETE' }), updateAgent: async (agentId: string, agent: Agent) => { - // First get the current agent to ensure we have complete data - try { - const currentAgentResponse = await fetcher({ url: `/agents/${agentId}` }); - const currentAgent = currentAgentResponse.data; - - // If we have the current agent, merge the updates with it - // This ensures all JSONb fields are properly handled - const mergedAgent = currentAgent ? deepMerge(currentAgent, agent) : agent; - - return fetcher({ - url: `/agents/${agentId}`, - method: 'PATCH', - body: mergedAgent, - }); - } catch (error) { - // If we can't get the current agent for some reason, just send the update - console.warn('Could not fetch current agent data before update:', error); - return fetcher({ - url: `/agents/${agentId}`, - method: 'PATCH', - body: agent, - }); - } + return fetcher({ + url: `/agents/${agentId}`, + method: 'PATCH', + body: agent, + }); }, createAgent: (params: { characterPath?: string; characterJson?: Character }) => fetcher({ diff --git a/packages/plugin-sql/src/base.ts b/packages/plugin-sql/src/base.ts index 110cbcea757..f80dc1d8c8a 100644 --- a/packages/plugin-sql/src/base.ts +++ b/packages/plugin-sql/src/base.ts @@ -247,85 +247,8 @@ export abstract class BaseDrizzleAdapter< }); } - /** - * Validates the agent update request - * @param agentId The ID of the agent to update - * @param agent The agent data to validate - * @throws Error if validation fails - */ - private validateAgentUpdate(agentId: UUID, agent: Partial): void { - if (!agent.id) { - throw new Error('Agent ID is required for update'); - } - } - - /** - * Merges nested JSONb objects within the agent settings - * @param existingAgent The current agent data - * @param updates The updates to apply - * @returns Merged settings object - */ - private mergeAgentSettings(existingAgent: Agent, updates: Partial): Agent['settings'] { - if (!updates.settings || !existingAgent.settings) { - return updates.settings || existingAgent.settings; - } - - const mergedSettings = { - ...existingAgent.settings, - ...updates.settings, - }; - - // Handle nested secrets within settings - if (updates.settings.secrets && existingAgent.settings.secrets) { - mergedSettings.secrets = { - ...existingAgent.settings.secrets, - ...updates.settings.secrets, - }; - } - - return mergedSettings; - } - - /** - * Merges style-related fields, handling arrays appropriately - * @param existingAgent The current agent data - * @param updates The updates to apply - * @returns Merged style object - */ - private mergeAgentStyle(existingAgent: Agent, updates: Partial): Agent['style'] { - if (!updates.style) { - return existingAgent.style; - } - - return { - ...existingAgent.style, - ...updates.style, - }; - } - - /** - * Merges array fields, replacing them entirely if provided - * @param existingAgent The current agent data - * @param updates The updates to apply - * @returns Object containing merged array fields - */ - private mergeArrayFields(existingAgent: Agent, updates: Partial): Partial { - const mergedFields: Partial = {}; - - // Handle array JSONb fields - these should be replaced entirely if provided - if (updates.plugins !== undefined) mergedFields.plugins = updates.plugins; - if (updates.bio !== undefined) mergedFields.bio = updates.bio; - if (updates.topics !== undefined) mergedFields.topics = updates.topics; - if (updates.adjectives !== undefined) mergedFields.adjectives = updates.adjectives; - if (updates.knowledge !== undefined) mergedFields.knowledge = updates.knowledge; - - return mergedFields; - } - /** * Updates an agent in the database with the provided agent ID and data. - * Properly handles merging of nested JSONb fields. - * * @param {UUID} agentId - The unique identifier of the agent to update. * @param {Partial} agent - The partial agent object containing the fields to update. * @returns {Promise} - A boolean indicating if the agent was successfully updated. @@ -333,26 +256,20 @@ export abstract class BaseDrizzleAdapter< async updateAgent(agentId: UUID, agent: Partial): Promise { return this.withDatabase(async () => { try { - this.validateAgentUpdate(agentId, agent); - - // Get the existing agent to properly merge JSONb fields - const existingAgent = await this.getAgent(agentId); - if (!existingAgent) { - throw new Error(`Agent with ID ${agentId} not found`); + console.log('[updateAgent] Agent ID:', agentId); + console.log('[updateAgent] Updating agent:', agent); + if (!agent.id) { + throw new Error('Agent ID is required for update'); } - // Merge all fields using helper functions - const mergedAgent: Partial = { - ...existingAgent, - ...agent, - updatedAt: Date.now(), - settings: this.mergeAgentSettings(existingAgent, agent), - style: this.mergeAgentStyle(existingAgent, agent), - ...this.mergeArrayFields(existingAgent, agent), - }; - await this.db.transaction(async (tx) => { - await tx.update(agentTable).set(mergedAgent).where(eq(agentTable.id, agentId)); + await tx + .update(agentTable) + .set({ + ...agent, + updatedAt: Date.now(), + }) + .where(eq(agentTable.id, agentId)); }); logger.debug('Agent updated successfully:', { diff --git a/packages/the-org/src/index.ts b/packages/the-org/src/index.ts index bac51d54eae..494eeb30382 100644 --- a/packages/the-org/src/index.ts +++ b/packages/the-org/src/index.ts @@ -131,11 +131,11 @@ function hasRequiredEnvVars(agent: any): boolean { // Filter agents based on available environment variables const availableAgents = [ devRel, - communityManager, - investmentManager, - liaison, - projectManager, - socialMediaManager, + // communityManager, + // investmentManager, + // liaison, + // projectManager, + // socialMediaManager, ].filter(hasRequiredEnvVars); export const project = { From f7ffc36fb1ab1050b36753f22ad56c641c7b815b Mon Sep 17 00:00:00 2001 From: 0xbbjoker <0xbbjoker@proton.me> Date: Thu, 20 Mar 2025 21:07:00 +0100 Subject: [PATCH 26/57] chore: remove debug logs --- .../client/src/components/agent-settings.tsx | 48 +----------------- .../client/src/components/character-form.tsx | 6 --- .../client/src/components/secret-panel.tsx | 50 +------------------ packages/client/src/hooks/use-agent-update.ts | 50 ------------------- .../client/src/hooks/use-partial-update.ts | 32 ------------ 5 files changed, 2 insertions(+), 184 deletions(-) diff --git a/packages/client/src/components/agent-settings.tsx b/packages/client/src/components/agent-settings.tsx index cbe8592865f..621b5f9ca61 100644 --- a/packages/client/src/components/agent-settings.tsx +++ b/packages/client/src/components/agent-settings.tsx @@ -15,17 +15,11 @@ export default function AgentSettings({ agent, agentId }: { agent: Agent; agentI const navigate = useNavigate(); const queryClient = useQueryClient(); - console.log('[AgentSettings] INITIALIZING with agent:', agent); - console.log('[AgentSettings] Initial agent.settings.secrets:', agent.settings?.secrets); - // Use our enhanced agent update hook for more intelligent handling of JSONb fields const agentState = useAgentUpdate(agent); // Log whenever agent state changes - useEffect(() => { - console.log('[AgentSettings] Agent state updated:', agentState.agent); - console.log('[AgentSettings] Current settings.secrets:', agentState.agent.settings?.secrets); - }, [agentState.agent]); + useEffect(() => {}, [agentState.agent]); const handleSubmit = async (updatedAgent: Agent) => { try { @@ -33,9 +27,6 @@ export default function AgentSettings({ agent, agentId }: { agent: Agent; agentI throw new Error('Agent ID is missing'); } - console.log('[AgentSettings] handleSubmit called with agent:', updatedAgent); - console.log('[AgentSettings] Current secrets in submission:', updatedAgent.settings?.secrets); - // Make sure we're properly handling all JSONb fields const mergedAgent = { ...updatedAgent, @@ -51,13 +42,8 @@ export default function AgentSettings({ agent, agentId }: { agent: Agent; agentI settings: updatedAgent.settings || {}, }; - console.log('[AgentSettings] Final merged agent before API call:', mergedAgent); - console.log('[AgentSettings] Final secrets being sent:', mergedAgent.settings?.secrets); - // Send the character update request to the agent endpoint - console.log('[AgentSettings] Calling API updateAgent...'); await apiClient.updateAgent(agentId, mergedAgent); - console.log('[AgentSettings] API updateAgent call successful'); // Invalidate both the agent query and the agents list queryClient.invalidateQueries({ queryKey: ['agent', agentId] }); @@ -70,7 +56,6 @@ export default function AgentSettings({ agent, agentId }: { agent: Agent; agentI description: 'Agent updated and restarted successfully', }); } catch (error) { - console.error('[AgentSettings] Error updating agent:', error); toast({ title: 'Error', description: error instanceof Error ? error.message : 'Failed to update agent', @@ -122,46 +107,15 @@ export default function AgentSettings({ agent, agentId }: { agent: Agent; agentI { - console.log('[AgentSettings] SecretPanel onChange called with agent', updatedAgent); - console.log( - '[AgentSettings] SecretPanel onChange - agent settings:', - updatedAgent.settings - ); - console.log( - '[AgentSettings] SecretPanel onChange - secrets received:', - updatedAgent.settings?.secrets - ); - if (updatedAgent.settings && updatedAgent.settings.secrets) { - console.log( - '[AgentSettings] Secrets received from SecretPanel:', - updatedAgent.settings.secrets - ); - // Create a new settings object with the updated secrets const updatedSettings = { ...agentState.agent.settings, secrets: updatedAgent.settings.secrets, }; - console.log( - '[AgentSettings] Current agent settings before update:', - agentState.agent.settings - ); - console.log('[AgentSettings] Updating settings with:', updatedSettings); - console.log('[AgentSettings] Updated secrets object:', updatedSettings.secrets); - // Use updateSettings to properly handle the secrets agentState.updateSettings(updatedSettings); - - console.log('[AgentSettings] After updateSettings call'); - // Add a timeout to check if the agent state updated - setTimeout(() => { - console.log( - '[AgentSettings] After updateSettings, timeout check - current secrets:', - agentState.agent.settings?.secrets - ); - }, 100); } }} /> diff --git a/packages/client/src/components/character-form.tsx b/packages/client/src/components/character-form.tsx index 12ef8560e44..e9c11cbb99d 100644 --- a/packages/client/src/components/character-form.tsx +++ b/packages/client/src/components/character-form.tsx @@ -218,12 +218,6 @@ export default function CharacterForm({ const handleFormSubmit = (e: React.FormEvent) => { e.preventDefault(); - - console.log('[CharacterForm] Form submission triggered'); - console.log('[CharacterForm] Current characterValue:', characterValue); - console.log('[CharacterForm] Settings being submitted:', characterValue.settings); - console.log('[CharacterForm] Secrets being submitted:', characterValue.settings?.secrets); - onSubmit?.(characterValue as any); }; diff --git a/packages/client/src/components/secret-panel.tsx b/packages/client/src/components/secret-panel.tsx index d1cea12b4f7..16d57535f6b 100644 --- a/packages/client/src/components/secret-panel.tsx +++ b/packages/client/src/components/secret-panel.tsx @@ -19,9 +19,6 @@ interface SecretPanelProps { // Export as named export to match import in other files export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { - console.log('[SecretPanel] MOUNTING with characterValue:', characterValue); - console.log('[SecretPanel] Initial secrets:', characterValue?.settings?.secrets); - // Initialize secrets from character data const initialSecrets = Object.entries(characterValue?.settings?.secrets || {}).map( ([name, value]) => ({ @@ -33,8 +30,6 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { }) ); - console.log('[SecretPanel] Initialized envs with:', initialSecrets); - const [envs, setEnvs] = useState(initialSecrets); const [name, setName] = useState(''); const [value, setValue] = useState(''); @@ -140,8 +135,6 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { if (name && value) { const exists = envs.some((env) => env.name === name); if (!exists) { - console.log(`[SecretPanel] Adding new secret: ${name}`); - // If this key was previously deleted, remove it from deletedKeys if (deletedKeys.includes(name)) { setDeletedKeys(deletedKeys.filter((key) => key !== name)); @@ -205,38 +198,19 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { // Only update if there are actual changes to prevent unnecessary rerenders const hasChanges = envs.some((env) => env.isNew || env.isModified) || deletedKeys.length > 0; - console.log('[SecretPanel] Checking for changes - hasChanges:', hasChanges); - console.log('[SecretPanel] Current envs:', envs); - console.log('[SecretPanel] Deleted keys:', deletedKeys); - if (hasChanges) { - console.log(`[SecretPanel] --- PROCESSING CHANGES ---`); - console.log( - `[SecretPanel] New/modified secrets: ${envs - .filter((e) => e.isNew || e.isModified) - .map((e) => e.name) - .join(', ')}` - ); - console.log(`[SecretPanel] Deleted keys: ${deletedKeys.join(', ')}`); - // Start with the original secrets from characterValue const currentSettings = characterValue.settings || {}; const currentSecrets = { ...(currentSettings.secrets || {}) }; - console.log('[SecretPanel] Starting with current secrets:', currentSecrets); - // First, mark deleted keys explicitly as null instead of removing them // This ensures the server knows to remove them instead of just not updating them deletedKeys.forEach((key) => { - console.log(`[SecretPanel] Marking key for deletion: ${key}`); currentSecrets[key] = null; }); // Then update with current envs - envs.forEach(({ name, value, isNew, isModified }) => { - console.log( - `[SecretPanel] Setting secret: ${name}, value: ${value}, isNew: ${isNew}, isModified: ${isModified}` - ); + envs.forEach(({ name, value }) => { currentSecrets[name] = value; }); @@ -249,14 +223,9 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { }, }; - console.log('[SecretPanel] Final updated secrets object:', currentSecrets); - console.log('[SecretPanel] Calling onChange with updated agent'); - // Call the onChange prop with the updated agent onChange(updatedAgent); - console.log('[SecretPanel] onChange called, now clearing modification flags'); - // Clear modification flags to prevent infinite update loops setEnvs((prevEnvs) => { const newEnvs = prevEnvs.map((env) => ({ @@ -264,24 +233,17 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { isNew: false, isModified: false, })); - console.log('[SecretPanel] Cleared modification flags, new envs:', newEnvs); return newEnvs; }); // Clear deletedKeys after changes are applied setDeletedKeys([]); - console.log('[SecretPanel] Cleared deletedKeys'); } // Remove characterValue from the dependency array to prevent cycles }, [envs, onChange, deletedKeys]); // Sync envs with characterValue when it changes useEffect(() => { - console.log( - '[SecretPanel] characterValue.settings?.secrets changed:', - characterValue.settings?.secrets - ); - if (characterValue?.settings?.secrets) { const currentSecretsEntries = Object.entries(characterValue.settings.secrets); // Only update if the secrets have actually changed (different keys/number of entries) @@ -294,20 +256,11 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { .sort() .join(','); - console.log('[SecretPanel] Current keys from characterValue:', currentKeys); - console.log('[SecretPanel] Current keys from envs:', envKeys); - console.log( - '[SecretPanel] Any new/modified envs:', - envs.some((env) => env.isNew || env.isModified) - ); - console.log('[SecretPanel] Any deleted keys:', deletedKeys.length > 0); - if ( currentKeys !== envKeys && !envs.some((env) => env.isNew || env.isModified) && deletedKeys.length === 0 ) { - console.log('[SecretPanel] Updating envs from changed characterValue'); const newEnvs = currentSecretsEntries.map(([name, value]) => ({ name, value: String(value), @@ -315,7 +268,6 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { isModified: false, isDeleted: false, })); - console.log('[SecretPanel] Setting new envs:', newEnvs); setEnvs(newEnvs); } } diff --git a/packages/client/src/hooks/use-agent-update.ts b/packages/client/src/hooks/use-agent-update.ts index 6c3f020b1e7..3c5f1fd99b8 100644 --- a/packages/client/src/hooks/use-agent-update.ts +++ b/packages/client/src/hooks/use-agent-update.ts @@ -30,7 +30,6 @@ export function useAgentUpdate(initialAgent: Agent) { */ const updateSetting = useCallback( (path: string, value: T) => { - console.log('[useAgentUpdate] updateSetting called for path:', path, 'value:', value); updateField(`settings.${path}`, value); }, [updateField] @@ -43,31 +42,12 @@ export function useAgentUpdate(initialAgent: Agent) { */ const setSettings = useCallback( (settings: any) => { - console.log('[useAgentUpdate] setSettings called with:', JSON.stringify(settings)); - if (settings.secrets) { - console.log( - '[useAgentUpdate] Current secrets before update:', - JSON.stringify(agent.settings?.secrets) - ); - console.log('[useAgentUpdate] New secrets to apply:', JSON.stringify(settings.secrets)); - const removedKeys = Object.keys(agent.settings?.secrets || {}).filter( (key) => !Object.keys(settings.secrets).includes(key) ); - - console.log('[useAgentUpdate] Keys that will be removed:', removedKeys); } - updateSettings(settings); - - // Add a timeout to check if the update was applied - setTimeout(() => { - console.log( - '[useAgentUpdate] After setSettings timeout - current secrets:', - JSON.stringify(agent.settings?.secrets) - ); - }, 100); }, [updateSettings, agent.settings?.secrets] ); @@ -93,42 +73,20 @@ export function useAgentUpdate(initialAgent: Agent) { */ const updateSecret = useCallback( (key: string, value: string) => { - console.log('[useAgentUpdate] updateSecret called for key:', key, 'value:', value); - console.log('[useAgentUpdate] Current agent settings:', JSON.stringify(agent.settings)); - // Handle nested secrets object properly const currentSettings = agent.settings || {}; const currentSecrets = currentSettings.secrets || {}; - console.log( - '[useAgentUpdate] Current secrets before update:', - JSON.stringify(currentSecrets) - ); - const newSecrets = { ...currentSecrets, [key]: value, }; - console.log( - '[useAgentUpdate] New secrets object after adding/updating key:', - JSON.stringify(newSecrets) - ); - // Update entire settings object for better change detection - console.log('[useAgentUpdate] Calling updateSettings with new settings'); updateSettings({ ...currentSettings, secrets: newSecrets, }); - - // Add a timeout to check if the update was applied - setTimeout(() => { - console.log( - '[useAgentUpdate] After updateSecret timeout - current secrets:', - JSON.stringify(agent.settings?.secrets) - ); - }, 100); }, [agent.settings, updateSettings] ); @@ -140,28 +98,20 @@ export function useAgentUpdate(initialAgent: Agent) { */ const removeSecret = useCallback( (key: string) => { - console.log('[useAgentUpdate] removeSecret called for key:', key); - // Get the current secrets object const currentSettings = agent.settings || {}; const currentSecrets = currentSettings.secrets || {}; - console.log('[useAgentUpdate] Current secrets before removal:', currentSecrets); - // Create a new secrets object without the removed key const newSecrets = { ...currentSecrets }; delete newSecrets[key]; - console.log('[useAgentUpdate] New secrets after removal:', newSecrets); - // Update the entire settings object to ensure nested changes are detected const updatedSettings = { ...currentSettings, secrets: newSecrets, }; - console.log('[useAgentUpdate] Updated settings with removed secret:', updatedSettings); - // Use updateSettings instead of updateField for better change detection updateSettings(updatedSettings); }, diff --git a/packages/client/src/hooks/use-partial-update.ts b/packages/client/src/hooks/use-partial-update.ts index 92035823bf8..d2fb30ba67e 100644 --- a/packages/client/src/hooks/use-partial-update.ts +++ b/packages/client/src/hooks/use-partial-update.ts @@ -245,18 +245,9 @@ export function usePartialUpdate(initialValue: T) { // Special handling for updating the entire settings object const updateSettings = useCallback( (settings: any) => { - console.log('[usePartialUpdate] updateSettings called with:', JSON.stringify(settings)); - setValue((prevValue) => { - console.log( - '[usePartialUpdate] Previous value in updateSettings:', - JSON.stringify(prevValue) - ); - // Extract settings but remove 'secrets' key to avoid duplication const { secrets, ...otherSettings } = settings; - console.log('[usePartialUpdate] Extracted secrets:', JSON.stringify(secrets)); - console.log('[usePartialUpdate] Other settings:', JSON.stringify(otherSettings)); // Create the updated settings object const updatedSettings = { @@ -264,37 +255,18 @@ export function usePartialUpdate(initialValue: T) { ...otherSettings, // Add other settings (not secrets) }; - console.log( - '[usePartialUpdate] Updated settings before secrets:', - JSON.stringify(updatedSettings) - ); - // Only add secrets if it was included in the update if (secrets) { - console.log('[usePartialUpdate] Processing secrets update:', JSON.stringify(secrets)); - console.log('[usePartialUpdate] Secrets keys to process:', Object.keys(secrets)); - // Create a new secrets object that only contains non-null values const filteredSecrets: Record = {}; Object.entries(secrets).forEach(([key, value]) => { - console.log( - `[usePartialUpdate] Processing secret key: ${key}, value type: ${value === null ? 'null' : typeof value}` - ); // If value is null, don't include it (this is how we delete) if (value !== null) { filteredSecrets[key] = value; - console.log(`[usePartialUpdate] Added key ${key} to filteredSecrets`); - } else { - console.log(`[usePartialUpdate] Skipping null key ${key} (will be deleted)`); } }); - console.log( - '[usePartialUpdate] Filtered secrets after processing:', - JSON.stringify(filteredSecrets) - ); - console.log('[usePartialUpdate] Filtered secret keys:', Object.keys(filteredSecrets)); updatedSettings.secrets = filteredSecrets; } @@ -303,10 +275,6 @@ export function usePartialUpdate(initialValue: T) { settings: updatedSettings, } as T; - console.log( - '[usePartialUpdate] Final result after settings update:', - JSON.stringify(result) - ); return result; }); }, From 91fb23d47ceac8fc1bf2343b3695af2d26e8b7db Mon Sep 17 00:00:00 2001 From: 0xbbjoker <0xbbjoker@proton.me> Date: Thu, 20 Mar 2025 23:03:56 +0100 Subject: [PATCH 27/57] chore: remove logs & fix avatar size --- .../client/src/components/character-form.tsx | 17 +++++++++++++++-- packages/plugin-sql/src/base.ts | 2 -- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/client/src/components/character-form.tsx b/packages/client/src/components/character-form.tsx index e9c11cbb99d..10cb50cf0a1 100644 --- a/packages/client/src/components/character-form.tsx +++ b/packages/client/src/components/character-form.tsx @@ -216,9 +216,22 @@ export default function CharacterForm({ return char; }; - const handleFormSubmit = (e: React.FormEvent) => { + const handleFormSubmit = async (e: React.FormEvent) => { e.preventDefault(); - onSubmit?.(characterValue as any); + setIsSubmitting(true); + + try { + const updatedCharacter = await ensureAvatarSize(characterValue); + await onSubmit(updatedCharacter); + } catch (error) { + toast({ + title: 'Error', + description: error instanceof Error ? error.message : 'Failed to update', + variant: 'destructive', + }); + } finally { + setIsSubmitting(false); + } }; const renderInputField = (field: InputField) => ( diff --git a/packages/plugin-sql/src/base.ts b/packages/plugin-sql/src/base.ts index f80dc1d8c8a..7da4b062a81 100644 --- a/packages/plugin-sql/src/base.ts +++ b/packages/plugin-sql/src/base.ts @@ -256,8 +256,6 @@ export abstract class BaseDrizzleAdapter< async updateAgent(agentId: UUID, agent: Partial): Promise { return this.withDatabase(async () => { try { - console.log('[updateAgent] Agent ID:', agentId); - console.log('[updateAgent] Updating agent:', agent); if (!agent.id) { throw new Error('Agent ID is required for update'); } From a7bdd72ffb57847594e232740e5a1eedb1b9392e Mon Sep 17 00:00:00 2001 From: 0xbbjoker <0xbbjoker@proton.me> Date: Thu, 20 Mar 2025 23:45:02 +0100 Subject: [PATCH 28/57] chore: optimize logic for update --- .../client/src/components/agent-settings.tsx | 32 +++++---- .../client/src/components/avatar-panel.tsx | 38 +++++++---- .../client/src/components/plugins-panel.tsx | 28 ++++++-- .../client/src/components/secret-panel.tsx | 47 ++++++------- packages/client/src/hooks/use-agent-update.ts | 66 +++++++++++++++++-- 5 files changed, 144 insertions(+), 67 deletions(-) diff --git a/packages/client/src/components/agent-settings.tsx b/packages/client/src/components/agent-settings.tsx index 621b5f9ca61..dd720b5b5c8 100644 --- a/packages/client/src/components/agent-settings.tsx +++ b/packages/client/src/components/agent-settings.tsx @@ -27,23 +27,27 @@ export default function AgentSettings({ agent, agentId }: { agent: Agent; agentI throw new Error('Agent ID is missing'); } - // Make sure we're properly handling all JSONb fields - const mergedAgent = { - ...updatedAgent, - // Explicitly ensure all these fields are properly included + // Get only the fields that have changed + const changedFields = agentState.getChangedFields(); + + // No need to send update if nothing changed + if (Object.keys(changedFields).length === 0) { + toast({ + title: 'No Changes', + description: 'No changes were made to the agent', + }); + navigate('/'); + return; + } + + // Always include the ID + const partialUpdate = { id: agentId, - bio: updatedAgent.bio || [], - topics: updatedAgent.topics || [], - adjectives: updatedAgent.adjectives || [], - plugins: updatedAgent.plugins || [], - style: updatedAgent.style || { all: [], chat: [], post: [] }, - // Keep the settings object exactly as it is without providing fallbacks - // that could inadvertently restore deleted secrets - settings: updatedAgent.settings || {}, + ...changedFields, }; - // Send the character update request to the agent endpoint - await apiClient.updateAgent(agentId, mergedAgent); + // Send the partial update + await apiClient.updateAgent(agentId, partialUpdate as Agent); // Invalidate both the agent query and the agents list queryClient.invalidateQueries({ queryKey: ['agent', agentId] }); diff --git a/packages/client/src/components/avatar-panel.tsx b/packages/client/src/components/avatar-panel.tsx index f97b63d65d5..b45a350d05b 100644 --- a/packages/client/src/components/avatar-panel.tsx +++ b/packages/client/src/components/avatar-panel.tsx @@ -1,7 +1,7 @@ import { Button } from '@/components/ui/button'; import type { Agent } from '@elizaos/core'; import { Image as ImageIcon, Upload, X } from 'lucide-react'; -import { useRef, useState } from 'react'; +import { useRef, useState, useEffect } from 'react'; import { compressImage } from '@/lib/utils'; interface AvatarPanelProps { @@ -16,23 +16,25 @@ interface AvatarPanelProps { export default function AvatarPanel({ characterValue, setCharacterValue }: AvatarPanelProps) { const [avatar, setAvatar] = useState(characterValue?.settings?.avatar || null); + const [hasChanged, setHasChanged] = useState(false); const fileInputRef = useRef(null); + // Reset the change flag when component initializes or character changes + useEffect(() => { + setAvatar(characterValue?.settings?.avatar || null); + setHasChanged(false); + }, [characterValue.id]); + const handleFileUpload = async (event: React.ChangeEvent) => { const file = event.target.files?.[0]; if (file) { try { const compressedImage = await compressImage(file); setAvatar(compressedImage); + setHasChanged(true); - // Update the agent state - if (setCharacterValue.updateAvatar) { - setCharacterValue.updateAvatar(compressedImage); - } else if (setCharacterValue.updateSetting) { - setCharacterValue.updateSetting('avatar', compressedImage); - } else if (setCharacterValue.updateField) { - setCharacterValue.updateField('settings.avatar', compressedImage); - } + // Only update when there's a real change + updateCharacterAvatar(compressedImage); } catch (error) { console.error('Error compressing image:', error); } @@ -40,15 +42,21 @@ export default function AvatarPanel({ characterValue, setCharacterValue }: Avata }; const handleRemoveAvatar = () => { - setAvatar(null); + if (avatar) { + setAvatar(null); + setHasChanged(true); + updateCharacterAvatar(''); + } + }; - // Update the agent state + // Centralized update function to avoid code duplication + const updateCharacterAvatar = (avatarUrl: string) => { if (setCharacterValue.updateAvatar) { - setCharacterValue.updateAvatar(''); + setCharacterValue.updateAvatar(avatarUrl); } else if (setCharacterValue.updateSetting) { - setCharacterValue.updateSetting('avatar', ''); + setCharacterValue.updateSetting('avatar', avatarUrl); } else if (setCharacterValue.updateField) { - setCharacterValue.updateField('settings.avatar', ''); + setCharacterValue.updateField('settings.avatar', avatarUrl); } }; @@ -84,6 +92,8 @@ export default function AvatarPanel({ characterValue, setCharacterValue }: Avata + + {hasChanged &&

Avatar has been updated

}
); diff --git a/packages/client/src/components/plugins-panel.tsx b/packages/client/src/components/plugins-panel.tsx index a35ebee59dd..d914a40533d 100644 --- a/packages/client/src/components/plugins-panel.tsx +++ b/packages/client/src/components/plugins-panel.tsx @@ -8,7 +8,7 @@ import { import { Input } from '@/components/ui/input'; import { usePlugins } from '@/hooks/use-plugins'; import type { Agent } from '@elizaos/core'; -import { useMemo, useState } from 'react'; +import { useMemo, useState, useEffect } from 'react'; import { Button } from './ui/button'; interface PluginsPanelProps { @@ -26,11 +26,7 @@ export default function PluginsPanel({ characterValue, setCharacterValue }: Plug const { data: plugins, error } = usePlugins(); const [searchQuery, setSearchQuery] = useState(''); const [isDialogOpen, setIsDialogOpen] = useState(false); - - const pluginNames = useMemo(() => { - if (!plugins) return []; - return Object.keys(plugins).map((name) => name.replace(/^@elizaos-plugins\//, '@elizaos/')); - }, [plugins]); + const [hasChanged, setHasChanged] = useState(false); // Ensure we always have arrays and normalize plugin names const safeCharacterPlugins = useMemo(() => { @@ -38,6 +34,17 @@ export default function PluginsPanel({ characterValue, setCharacterValue }: Plug return characterValue.plugins; }, [characterValue?.plugins]); + // Get plugin names from available plugins + const pluginNames = useMemo(() => { + if (!plugins) return []; + return Object.keys(plugins).map((name) => name.replace(/^@elizaos-plugins\//, '@elizaos/')); + }, [plugins]); + + // Reset change tracking when character changes + useEffect(() => { + setHasChanged(false); + }, [characterValue.id]); + const filteredPlugins = useMemo(() => { return pluginNames .filter((plugin) => !safeCharacterPlugins.includes(plugin)) @@ -45,6 +52,10 @@ export default function PluginsPanel({ characterValue, setCharacterValue }: Plug }, [pluginNames, safeCharacterPlugins, searchQuery]); const handlePluginAdd = (plugin: string) => { + if (safeCharacterPlugins.includes(plugin)) return; + + setHasChanged(true); + if (setCharacterValue.addPlugin) { setCharacterValue.addPlugin(plugin); } else if (setCharacterValue.updateField) { @@ -58,6 +69,8 @@ export default function PluginsPanel({ characterValue, setCharacterValue }: Plug const handlePluginRemove = (plugin: string) => { const index = safeCharacterPlugins.indexOf(plugin); if (index !== -1) { + setHasChanged(true); + if (setCharacterValue.removePlugin) { setCharacterValue.removePlugin(index); } else if (setCharacterValue.updateField) { @@ -140,6 +153,9 @@ export default function PluginsPanel({ characterValue, setCharacterValue }: Plug + {hasChanged && ( +

Plugins configuration has been updated

+ )} )} diff --git a/packages/client/src/components/secret-panel.tsx b/packages/client/src/components/secret-panel.tsx index 16d57535f6b..356212a6587 100644 --- a/packages/client/src/components/secret-panel.tsx +++ b/packages/client/src/components/secret-panel.tsx @@ -40,6 +40,8 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { const [isDragging, setIsDragging] = useState(false); // Keep track of deleted keys to ensure proper removal const [deletedKeys, setDeletedKeys] = useState([]); + // Track if changes are pending to avoid unnecessary updates + const [changesPending, setChangesPending] = useState(false); const dropdownRef = useRef(null); const dropRef = useRef(null); @@ -143,6 +145,7 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { setEnvs([...envs, { name, value, isNew: true }]); setName(''); setValue(''); + setChangesPending(true); } } }; @@ -161,6 +164,7 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { if (updatedEnvs[index].value !== editedValue) { updatedEnvs[index].value = editedValue; updatedEnvs[index].isModified = true; + setChangesPending(true); } setEnvs(updatedEnvs); setEditingIndex(null); @@ -177,6 +181,7 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { setEnvs(envs.filter((_, i) => i !== index)); setOpenIndex(null); setEditingIndex(null); + setChangesPending(true); }; // Handle clicks outside of dropdown @@ -193,30 +198,25 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { }; }, []); - // Update character value when envs change + // Update character value when envs change, but only if there are actual changes useEffect(() => { - // Only update if there are actual changes to prevent unnecessary rerenders - const hasChanges = envs.some((env) => env.isNew || env.isModified) || deletedKeys.length > 0; - - if (hasChanges) { - // Start with the original secrets from characterValue + if (changesPending) { + // Create a minimal update object to send only the changes const currentSettings = characterValue.settings || {}; const currentSecrets = { ...(currentSettings.secrets || {}) }; - // First, mark deleted keys explicitly as null instead of removing them - // This ensures the server knows to remove them instead of just not updating them + // Mark deleted keys as null for explicit removal deletedKeys.forEach((key) => { currentSecrets[key] = null; }); - // Then update with current envs + // Update with current valid envs envs.forEach(({ name, value }) => { currentSecrets[name] = value; }); - // Create a new agent with updated secrets - const updatedAgent: Agent = { - ...characterValue, + // Create a minimal agent object with just the changes + const updatedAgent: Partial = { settings: { ...currentSettings, secrets: currentSecrets, @@ -224,27 +224,26 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { }; // Call the onChange prop with the updated agent - onChange(updatedAgent); + onChange(updatedAgent as Agent); - // Clear modification flags to prevent infinite update loops + // Reset change tracking flags setEnvs((prevEnvs) => { - const newEnvs = prevEnvs.map((env) => ({ + return prevEnvs.map((env) => ({ ...env, isNew: false, isModified: false, })); - return newEnvs; }); // Clear deletedKeys after changes are applied setDeletedKeys([]); + setChangesPending(false); } - // Remove characterValue from the dependency array to prevent cycles - }, [envs, onChange, deletedKeys]); + }, [envs, onChange, deletedKeys, characterValue.settings, changesPending]); - // Sync envs with characterValue when it changes + // Sync envs with characterValue when it changes (only if not in middle of edit) useEffect(() => { - if (characterValue?.settings?.secrets) { + if (characterValue?.settings?.secrets && !changesPending) { const currentSecretsEntries = Object.entries(characterValue.settings.secrets); // Only update if the secrets have actually changed (different keys/number of entries) const currentKeys = currentSecretsEntries @@ -256,11 +255,7 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { .sort() .join(','); - if ( - currentKeys !== envKeys && - !envs.some((env) => env.isNew || env.isModified) && - deletedKeys.length === 0 - ) { + if (currentKeys !== envKeys) { const newEnvs = currentSecretsEntries.map(([name, value]) => ({ name, value: String(value), @@ -271,7 +266,7 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { setEnvs(newEnvs); } } - }, [characterValue.settings?.secrets, envs, deletedKeys]); + }, [characterValue.settings?.secrets, envs, changesPending]); return (
diff --git a/packages/client/src/hooks/use-agent-update.ts b/packages/client/src/hooks/use-agent-update.ts index 3c5f1fd99b8..ca2631cb26b 100644 --- a/packages/client/src/hooks/use-agent-update.ts +++ b/packages/client/src/hooks/use-agent-update.ts @@ -1,6 +1,6 @@ import { usePartialUpdate } from '@/hooks/use-partial-update'; import type { Agent } from '@elizaos/core'; -import { useCallback } from 'react'; +import { useCallback, useRef } from 'react'; /** * A custom hook for handling Agent updates with specific handling for JSONb fields. @@ -11,6 +11,9 @@ import { useCallback } from 'react'; * @returns Object with agent state and update methods */ export function useAgentUpdate(initialAgent: Agent) { + // Keep reference to the initial state for comparison + const initialAgentRef = useRef(JSON.parse(JSON.stringify(initialAgent))); + const { value: agent, updateField, @@ -42,14 +45,9 @@ export function useAgentUpdate(initialAgent: Agent) { */ const setSettings = useCallback( (settings: any) => { - if (settings.secrets) { - const removedKeys = Object.keys(agent.settings?.secrets || {}).filter( - (key) => !Object.keys(settings.secrets).includes(key) - ); - } updateSettings(settings); }, - [updateSettings, agent.settings?.secrets] + [updateSettings] ); /** @@ -263,6 +261,57 @@ export function useAgentUpdate(initialAgent: Agent) { [updateSetting] ); + /** + * Returns an object containing only the fields that have changed + * compared to the initial agent state + */ + const getChangedFields = useCallback(() => { + const changedFields: Partial = {}; + const current = agent; + const initial = initialAgentRef.current; + + // Compare scalar properties + const scalarProps = ['name', 'username', 'system'] as const; + scalarProps.forEach((prop) => { + if (current[prop] !== initial[prop]) { + changedFields[prop] = current[prop]; + } + }); + + if (current.enabled !== initial.enabled) { + changedFields.enabled = current.enabled; + } + + // Compare array properties with type safety + if (JSON.stringify(current.bio) !== JSON.stringify(initial.bio)) { + changedFields.bio = current.bio; + } + + if (JSON.stringify(current.topics) !== JSON.stringify(initial.topics)) { + changedFields.topics = current.topics; + } + + if (JSON.stringify(current.adjectives) !== JSON.stringify(initial.adjectives)) { + changedFields.adjectives = current.adjectives; + } + + if (JSON.stringify(current.plugins) !== JSON.stringify(initial.plugins)) { + changedFields.plugins = current.plugins; + } + + // Compare style object + if (JSON.stringify(current.style) !== JSON.stringify(initial.style)) { + changedFields.style = current.style; + } + + // Compare settings object with special handling for secrets + if (JSON.stringify(current.settings) !== JSON.stringify(initial.settings)) { + changedFields.settings = current.settings; + } + + return changedFields; + }, [agent]); + return { agent, // Original methods @@ -272,6 +321,9 @@ export function useAgentUpdate(initialAgent: Agent) { updateSettings, setSettings, + // Method to get only changed fields + getChangedFields, + // Basic Info Tab updateSetting, updateSystemPrompt, From 8f3b643c113fff91d25165566eb17bbf1b807887 Mon Sep 17 00:00:00 2001 From: 0xbbjoker <0xbbjoker@proton.me> Date: Thu, 20 Mar 2025 23:51:06 +0100 Subject: [PATCH 29/57] fix: remove unused vars --- .../client/src/components/agent-creator.tsx | 39 +++++-------------- .../client/src/components/agent-settings.tsx | 2 +- .../client/src/components/character-form.tsx | 2 +- packages/the-org/src/index.ts | 10 ++--- 4 files changed, 17 insertions(+), 36 deletions(-) diff --git a/packages/client/src/components/agent-creator.tsx b/packages/client/src/components/agent-creator.tsx index e11e401bc10..c85831e3f06 100644 --- a/packages/client/src/components/agent-creator.tsx +++ b/packages/client/src/components/agent-creator.tsx @@ -7,31 +7,25 @@ import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import AvatarPanel from './avatar-panel'; import PluginsPanel from './plugins-panel'; -import { SecretPanel } from './secret-panel'; -import { useAgentUpdate } from '@/hooks/use-agent-update'; +import SecretPanel from './secret-panel'; -// Define a partial agent for initialization -const defaultCharacter: Partial = { +const defaultCharacter = { name: '', username: '', system: '', bio: [] as string[], topics: [] as string[], adjectives: [] as string[], - settings: { secrets: {} }, -}; +} as Agent; export default function AgentCreator() { const navigate = useNavigate(); const { toast } = useToast(); const queryClient = useQueryClient(); - const [initialCharacter] = useState>({ + const [characterValue, setCharacterValue] = useState({ ...defaultCharacter, }); - // Use agent update hook for proper handling of nested fields - const agentState = useAgentUpdate(initialCharacter as Agent); - const ensureRequiredFields = (character: Agent): Agent => { return { ...character, @@ -46,18 +40,12 @@ export default function AgentCreator() { chat: character.style?.chat ?? [], post: character.style?.post ?? [], }, - settings: character.settings ?? { secrets: {} }, }; }; const handleSubmit = async (character: Agent) => { try { const completeCharacter = ensureRequiredFields(character); - - console.log('[AgentCreator] Creating agent with:', completeCharacter); - console.log('[AgentCreator] Settings:', completeCharacter.settings); - console.log('[AgentCreator] Secrets:', completeCharacter.settings?.secrets); - await apiClient.createAgent({ characterJson: completeCharacter, }); @@ -72,7 +60,6 @@ export default function AgentCreator() { queryClient.invalidateQueries({ queryKey: ['agents'] }); navigate('/'); } catch (error) { - console.error('[AgentCreator] Error creating agent:', error); toast({ title: 'Error', description: error instanceof Error ? error.message : 'Failed to create character', @@ -83,12 +70,12 @@ export default function AgentCreator() { return ( setCharacterValue(defaultCharacter)} onDelete={() => { navigate('/'); }} @@ -97,25 +84,19 @@ export default function AgentCreator() { { name: 'Plugins', component: ( - + ), }, { name: 'Secret', component: ( - { - console.log('[AgentCreator] SecretPanel onChange called with:', updatedAgent); - agentState.updateObject(updatedAgent); - }} - /> + ), }, { name: 'Avatar', component: ( - + ), }, ]} diff --git a/packages/client/src/components/agent-settings.tsx b/packages/client/src/components/agent-settings.tsx index dd720b5b5c8..5ad59ca362c 100644 --- a/packages/client/src/components/agent-settings.tsx +++ b/packages/client/src/components/agent-settings.tsx @@ -21,7 +21,7 @@ export default function AgentSettings({ agent, agentId }: { agent: Agent; agentI // Log whenever agent state changes useEffect(() => {}, [agentState.agent]); - const handleSubmit = async (updatedAgent: Agent) => { + const handleSubmit = async () => { try { if (!agentId) { throw new Error('Agent ID is missing'); diff --git a/packages/client/src/components/character-form.tsx b/packages/client/src/components/character-form.tsx index 10cb50cf0a1..e84f847e5a2 100644 --- a/packages/client/src/components/character-form.tsx +++ b/packages/client/src/components/character-form.tsx @@ -216,7 +216,7 @@ export default function CharacterForm({ return char; }; - const handleFormSubmit = async (e: React.FormEvent) => { + const handleFormSubmit = async (e: FormEvent) => { e.preventDefault(); setIsSubmitting(true); diff --git a/packages/the-org/src/index.ts b/packages/the-org/src/index.ts index 494eeb30382..bac51d54eae 100644 --- a/packages/the-org/src/index.ts +++ b/packages/the-org/src/index.ts @@ -131,11 +131,11 @@ function hasRequiredEnvVars(agent: any): boolean { // Filter agents based on available environment variables const availableAgents = [ devRel, - // communityManager, - // investmentManager, - // liaison, - // projectManager, - // socialMediaManager, + communityManager, + investmentManager, + liaison, + projectManager, + socialMediaManager, ].filter(hasRequiredEnvVars); export const project = { From 45d3763b635a5c90623b561d07007c716ad76ddf Mon Sep 17 00:00:00 2001 From: 0xbbjoker <0xbbjoker@proton.me> Date: Fri, 21 Mar 2025 00:35:19 +0100 Subject: [PATCH 30/57] chore: ensure min req for agent start --- .../client/src/components/agent-creator.tsx | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/packages/client/src/components/agent-creator.tsx b/packages/client/src/components/agent-creator.tsx index c85831e3f06..223ea72d470 100644 --- a/packages/client/src/components/agent-creator.tsx +++ b/packages/client/src/components/agent-creator.tsx @@ -7,25 +7,32 @@ import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import AvatarPanel from './avatar-panel'; import PluginsPanel from './plugins-panel'; -import SecretPanel from './secret-panel'; +import { SecretPanel } from './secret-panel'; +import { useAgentUpdate } from '@/hooks/use-agent-update'; -const defaultCharacter = { +// Define a partial agent for initialization +const defaultCharacter: Partial = { name: '', username: '', system: '', bio: [] as string[], topics: [] as string[], adjectives: [] as string[], -} as Agent; + plugins: ['@elizaos/plugin-sql', '@elizaos/plugin-local-ai'], + settings: { secrets: {} }, +}; export default function AgentCreator() { const navigate = useNavigate(); const { toast } = useToast(); const queryClient = useQueryClient(); - const [characterValue, setCharacterValue] = useState({ + const [initialCharacter] = useState>({ ...defaultCharacter, }); + // Use agent update hook for proper handling of nested fields + const agentState = useAgentUpdate(initialCharacter as Agent); + const ensureRequiredFields = (character: Agent): Agent => { return { ...character, @@ -40,6 +47,7 @@ export default function AgentCreator() { chat: character.style?.chat ?? [], post: character.style?.post ?? [], }, + settings: character.settings ?? { secrets: {} }, }; }; @@ -70,12 +78,12 @@ export default function AgentCreator() { return ( setCharacterValue(defaultCharacter)} + onReset={() => agentState.reset()} onDelete={() => { navigate('/'); }} @@ -84,19 +92,24 @@ export default function AgentCreator() { { name: 'Plugins', component: ( - + ), }, { name: 'Secret', component: ( - + { + agentState.updateSettings(updatedAgent.settings); + }} + /> ), }, { name: 'Avatar', component: ( - + ), }, ]} From 86d2ece498f997d6f6e65d1e141d307841bd0209 Mon Sep 17 00:00:00 2001 From: 0xbbjoker <0xbbjoker@proton.me> Date: Fri, 21 Mar 2025 00:44:36 +0100 Subject: [PATCH 31/57] chore: remove unused function --- packages/client/src/lib/api.ts | 1 - packages/client/src/lib/utils.ts | 12 ------------ 2 files changed, 13 deletions(-) diff --git a/packages/client/src/lib/api.ts b/packages/client/src/lib/api.ts index 921fc8f340a..4546cc7db7b 100644 --- a/packages/client/src/lib/api.ts +++ b/packages/client/src/lib/api.ts @@ -1,6 +1,5 @@ import type { Agent, Character, UUID, Memory } from '@elizaos/core'; import { WorldManager } from './world-manager'; -import { deepMerge } from './utils'; const API_PREFIX = '/api'; diff --git a/packages/client/src/lib/utils.ts b/packages/client/src/lib/utils.ts index 6b06986a7d8..ff66b233216 100644 --- a/packages/client/src/lib/utils.ts +++ b/packages/client/src/lib/utils.ts @@ -161,15 +161,3 @@ export function deepMerge(target: T, ...sources: Partial[]): T { return result; } - -/** - * Prepares agent data for update by ensuring all JSONb fields are properly - * merged with the existing agent data - * - * @param existingAgent The current agent data from the database - * @param updates The partial updates to be applied - * @returns A merged agent object ready for database update - */ -export function prepareAgentUpdate(existingAgent: T, updates: Partial): T { - return deepMerge(existingAgent, updates); -} From 6ed42d38c9a27a7a98d8b6c5830d173efc0bc7b6 Mon Sep 17 00:00:00 2001 From: 0xbbjoker <0xbbjoker@proton.me> Date: Fri, 21 Mar 2025 18:37:35 +0100 Subject: [PATCH 32/57] chore: enahnce settings update on agent --- .../client/src/components/avatar-panel.tsx | 3 + .../client/src/components/character-form.tsx | 12 ++++ .../client/src/components/secret-panel.tsx | 20 +++--- packages/client/src/hooks/use-agent-update.ts | 57 ++++++++++++++++- packages/plugin-sql/src/base.ts | 62 +++++++++++++++++++ 5 files changed, 140 insertions(+), 14 deletions(-) diff --git a/packages/client/src/components/avatar-panel.tsx b/packages/client/src/components/avatar-panel.tsx index b45a350d05b..e20f8285a4d 100644 --- a/packages/client/src/components/avatar-panel.tsx +++ b/packages/client/src/components/avatar-panel.tsx @@ -52,10 +52,13 @@ export default function AvatarPanel({ characterValue, setCharacterValue }: Avata // Centralized update function to avoid code duplication const updateCharacterAvatar = (avatarUrl: string) => { if (setCharacterValue.updateAvatar) { + // Use the specialized method for avatar updates when available setCharacterValue.updateAvatar(avatarUrl); } else if (setCharacterValue.updateSetting) { + // Use updateSetting as fallback setCharacterValue.updateSetting('avatar', avatarUrl); } else if (setCharacterValue.updateField) { + // Last resort - use the generic field update setCharacterValue.updateField('settings.avatar', avatarUrl); } }; diff --git a/packages/client/src/components/character-form.tsx b/packages/client/src/components/character-form.tsx index e84f847e5a2..b1b76344146 100644 --- a/packages/client/src/components/character-form.tsx +++ b/packages/client/src/components/character-form.tsx @@ -141,6 +141,7 @@ export type CharacterFormProps = { addArrayItem?: (path: string, item: T) => void; removeArrayItem?: (path: string, index: number) => void; updateObject?: (newPartialValue: Partial) => void; + updateSetting?: (path: string, value: any) => void; [key: string]: any; }; }; @@ -165,6 +166,17 @@ export default function CharacterForm({ if (type === 'checkbox') { setCharacterValue.updateField(name, checked); + } else if (name.startsWith('settings.')) { + // Handle nested settings fields like settings.voice.model + const path = name.substring(9); // Remove 'settings.' prefix + + if (setCharacterValue.updateSetting) { + // Use the specialized method if available + setCharacterValue.updateSetting(path, value); + } else { + // Fall back to generic updateField + setCharacterValue.updateField(name, value); + } } else { setCharacterValue.updateField(name, value); } diff --git a/packages/client/src/components/secret-panel.tsx b/packages/client/src/components/secret-panel.tsx index 356212a6587..7231e660672 100644 --- a/packages/client/src/components/secret-panel.tsx +++ b/packages/client/src/components/secret-panel.tsx @@ -202,23 +202,21 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { useEffect(() => { if (changesPending) { // Create a minimal update object to send only the changes - const currentSettings = characterValue.settings || {}; - const currentSecrets = { ...(currentSettings.secrets || {}) }; + const currentSecrets: Record = {}; - // Mark deleted keys as null for explicit removal - deletedKeys.forEach((key) => { - currentSecrets[key] = null; - }); - - // Update with current valid envs + // Map updated values envs.forEach(({ name, value }) => { currentSecrets[name] = value; }); - // Create a minimal agent object with just the changes + // Add null values for deleted keys to explicitly mark them for removal + deletedKeys.forEach((key) => { + currentSecrets[key] = null; + }); + + // Create a minimal agent object with just the secrets changes const updatedAgent: Partial = { settings: { - ...currentSettings, secrets: currentSecrets, }, }; @@ -239,7 +237,7 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { setDeletedKeys([]); setChangesPending(false); } - }, [envs, onChange, deletedKeys, characterValue.settings, changesPending]); + }, [envs, onChange, deletedKeys, changesPending]); // Sync envs with characterValue when it changes (only if not in middle of edit) useEffect(() => { diff --git a/packages/client/src/hooks/use-agent-update.ts b/packages/client/src/hooks/use-agent-update.ts index ca2631cb26b..e040fd0c3ba 100644 --- a/packages/client/src/hooks/use-agent-update.ts +++ b/packages/client/src/hooks/use-agent-update.ts @@ -304,9 +304,60 @@ export function useAgentUpdate(initialAgent: Agent) { changedFields.style = current.style; } - // Compare settings object with special handling for secrets - if (JSON.stringify(current.settings) !== JSON.stringify(initial.settings)) { - changedFields.settings = current.settings; + // More granular comparison for settings object + const initialSettings = initial.settings || {}; + const currentSettings = current.settings || {}; + + // Check if any settings changed + if (JSON.stringify(currentSettings) !== JSON.stringify(initialSettings)) { + // Create a partial settings object with only changed fields + changedFields.settings = {}; + + // Check avatar separately + if (currentSettings.avatar !== initialSettings.avatar) { + changedFields.settings.avatar = currentSettings.avatar; + } + + // Check voice settings + if (JSON.stringify(currentSettings.voice) !== JSON.stringify(initialSettings.voice)) { + changedFields.settings.voice = currentSettings.voice; + } + + // Check secrets with special handling + if (JSON.stringify(currentSettings.secrets) !== JSON.stringify(initialSettings.secrets)) { + const initialSecrets = initialSettings.secrets || {}; + const currentSecrets = currentSettings.secrets || {}; + + // Only include secrets that were added or modified + const changedSecrets: Record = {}; + let hasSecretChanges = false; + + // Find added or modified secrets + Object.entries(currentSecrets).forEach(([key, value]) => { + if (initialSecrets[key] !== value) { + changedSecrets[key] = value; + hasSecretChanges = true; + } + }); + + // Find deleted secrets (null values indicate deletion) + Object.keys(initialSecrets).forEach((key) => { + if (currentSecrets[key] === undefined) { + changedSecrets[key] = null; + hasSecretChanges = true; + } + }); + + if (hasSecretChanges) { + if (!changedFields.settings) changedFields.settings = {}; + changedFields.settings.secrets = changedSecrets; + } + } + + // If no specific settings changed, don't include settings object + if (Object.keys(changedFields.settings).length === 0) { + delete changedFields.settings; + } } return changedFields; diff --git a/packages/plugin-sql/src/base.ts b/packages/plugin-sql/src/base.ts index 7da4b062a81..9af92c325a3 100644 --- a/packages/plugin-sql/src/base.ts +++ b/packages/plugin-sql/src/base.ts @@ -261,6 +261,11 @@ export abstract class BaseDrizzleAdapter< } await this.db.transaction(async (tx) => { + // Handle settings update if present + if (agent.settings) { + agent.settings = await this.mergeAgentSettings(tx, agentId, agent.settings); + } + await tx .update(agentTable) .set({ @@ -285,6 +290,63 @@ export abstract class BaseDrizzleAdapter< }); } + /** + * Merges updated agent settings with existing settings in the database, + * with special handling for nested objects like secrets. + * @param tx - The database transaction + * @param agentId - The ID of the agent + * @param updatedSettings - The settings object with updates + * @returns The merged settings object + * @private + */ + private async mergeAgentSettings( + tx: DrizzleOperations, + agentId: UUID, + updatedSettings: any + ): Promise { + // First get the current agent data + const currentAgent = await tx + .select({ settings: agentTable.settings }) + .from(agentTable) + .where(eq(agentTable.id, agentId)) + .limit(1); + + if (currentAgent.length === 0 || !currentAgent[0].settings) { + return updatedSettings; + } + + const currentSettings = currentAgent[0].settings; + + // Handle secrets with special null-values treatment + if (updatedSettings.secrets) { + const currentSecrets = currentSettings.secrets || {}; + const updatedSecrets = updatedSettings.secrets; + + // Create a new secrets object + const mergedSecrets = { ...currentSecrets }; + + // Process the incoming secrets updates + for (const [key, value] of Object.entries(updatedSecrets)) { + if (value === null) { + // If value is null, remove the key + delete mergedSecrets[key]; + } else { + // Otherwise, update the value + mergedSecrets[key] = value; + } + } + + // Replace the secrets in updatedSettings with our processed version + updatedSettings.secrets = mergedSecrets; + } + + // Deep merge the settings objects + return { + ...currentSettings, + ...updatedSettings, + }; + } + /** * Asynchronously deletes an agent with the specified UUID and all related entries. * From eade2a5fc54fd86dac62dbddcd2cf288a77d720f Mon Sep 17 00:00:00 2001 From: 0xbbjoker <0xbbjoker@proton.me> Date: Sat, 22 Mar 2025 17:10:21 +0100 Subject: [PATCH 33/57] chore: clean the code --- .../client/src/components/character-form.tsx | 1 - packages/client/src/hooks/use-agent-update.ts | 3 - .../client/src/hooks/use-partial-update.ts | 9 --- packages/client/src/lib/utils.ts | 57 ------------------- 4 files changed, 70 deletions(-) diff --git a/packages/client/src/components/character-form.tsx b/packages/client/src/components/character-form.tsx index b1b76344146..a443b0b3fa0 100644 --- a/packages/client/src/components/character-form.tsx +++ b/packages/client/src/components/character-form.tsx @@ -140,7 +140,6 @@ export type CharacterFormProps = { updateField: (path: string, value: T) => void; addArrayItem?: (path: string, item: T) => void; removeArrayItem?: (path: string, index: number) => void; - updateObject?: (newPartialValue: Partial) => void; updateSetting?: (path: string, value: any) => void; [key: string]: any; }; diff --git a/packages/client/src/hooks/use-agent-update.ts b/packages/client/src/hooks/use-agent-update.ts index e040fd0c3ba..08018585049 100644 --- a/packages/client/src/hooks/use-agent-update.ts +++ b/packages/client/src/hooks/use-agent-update.ts @@ -19,7 +19,6 @@ export function useAgentUpdate(initialAgent: Agent) { updateField, addArrayItem, removeArrayItem, - updateObject, reset, updateSettings, } = usePartialUpdate(initialAgent); @@ -365,9 +364,7 @@ export function useAgentUpdate(initialAgent: Agent) { return { agent, - // Original methods updateField, - updateObject, reset, updateSettings, setSettings, diff --git a/packages/client/src/hooks/use-partial-update.ts b/packages/client/src/hooks/use-partial-update.ts index d2fb30ba67e..60b36490c16 100644 --- a/packages/client/src/hooks/use-partial-update.ts +++ b/packages/client/src/hooks/use-partial-update.ts @@ -1,4 +1,3 @@ -import { deepMerge } from '@/lib/utils'; import { useState, useCallback } from 'react'; /** @@ -228,13 +227,6 @@ export function usePartialUpdate(initialValue: T) { } as O; }; - /** - * Updates the entire object using deep merge - */ - const updateObject = useCallback((newPartialValue: Partial) => { - setValue((prev) => deepMerge(prev, newPartialValue)); - }, []); - /** * Resets to the initial state */ @@ -286,7 +278,6 @@ export function usePartialUpdate(initialValue: T) { updateField, addArrayItem, removeArrayItem, - updateObject, reset, updateSettings, }; diff --git a/packages/client/src/lib/utils.ts b/packages/client/src/lib/utils.ts index ff66b233216..816b359e560 100644 --- a/packages/client/src/lib/utils.ts +++ b/packages/client/src/lib/utils.ts @@ -104,60 +104,3 @@ export const compressImage = ( reader.readAsDataURL(file); }); }; - -/** - * Deeply merges multiple objects together - * - Arrays are completely replaced (not merged) - * - Null values explicitly overwrite existing values - * - Undefined values are ignored (don't overwrite) - * - * @param target The base object to merge into - * @param sources One or more source objects to merge from - * @returns A new merged object - */ -export function deepMerge(target: T, ...sources: Partial[]): T { - if (!sources.length) return target; - - const result = { ...target }; - - sources.forEach((source) => { - if (!source) return; - - Object.keys(source).forEach((key) => { - const sourceValue = source[key as keyof typeof source]; - - // Skip undefined values - they shouldn't overwrite existing values - if (sourceValue === undefined) return; - - // Handle null values - they should explicitly overwrite - if (sourceValue === null) { - result[key as keyof T] = null as any; - return; - } - - // For arrays, completely replace them - if (Array.isArray(sourceValue)) { - result[key as keyof T] = [...sourceValue] as any; - return; - } - - // For objects, recursively merge - if ( - typeof sourceValue === 'object' && - !Array.isArray(sourceValue) && - sourceValue !== null && - typeof result[key as keyof T] === 'object' && - result[key as keyof T] !== null && - !Array.isArray(result[key as keyof T]) - ) { - result[key as keyof T] = deepMerge(result[key as keyof T] as any, sourceValue as any); - return; - } - - // For all other values, just replace them - result[key as keyof T] = sourceValue as any; - }); - }); - - return result; -} From bb9c3bee33a554be511e8393fcdb87507090ea1e Mon Sep 17 00:00:00 2001 From: 0xbbjoker <0xbbjoker@proton.me> Date: Sat, 22 Mar 2025 17:44:58 +0100 Subject: [PATCH 34/57] chore: temp disable usePlugins --- .../client/src/components/agent-creator.tsx | 4 ++-- .../client/src/components/plugins-panel.tsx | 10 ++++++++-- packages/client/src/hooks/use-plugins.ts | 20 +++++++++++++++---- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/packages/client/src/components/agent-creator.tsx b/packages/client/src/components/agent-creator.tsx index 223ea72d470..8606dac9f4e 100644 --- a/packages/client/src/components/agent-creator.tsx +++ b/packages/client/src/components/agent-creator.tsx @@ -18,7 +18,7 @@ const defaultCharacter: Partial = { bio: [] as string[], topics: [] as string[], adjectives: [] as string[], - plugins: ['@elizaos/plugin-sql', '@elizaos/plugin-local-ai'], + plugins: [], settings: { secrets: {} }, }; @@ -81,7 +81,7 @@ export default function AgentCreator() { characterValue={agentState.agent} setCharacterValue={agentState} title="Character Settings" - description="Configure your AI character's behavior and capabilities" + description="Configure your AI character's behavior and capabilities. Recommended default plugins: @elizaos/plugin-sql, @elizaos/plugin-local-ai" onSubmit={handleSubmit} onReset={() => agentState.reset()} onDelete={() => { diff --git a/packages/client/src/components/plugins-panel.tsx b/packages/client/src/components/plugins-panel.tsx index d914a40533d..af42b814174 100644 --- a/packages/client/src/components/plugins-panel.tsx +++ b/packages/client/src/components/plugins-panel.tsx @@ -36,8 +36,14 @@ export default function PluginsPanel({ characterValue, setCharacterValue }: Plug // Get plugin names from available plugins const pluginNames = useMemo(() => { - if (!plugins) return []; - return Object.keys(plugins).map((name) => name.replace(/^@elizaos-plugins\//, '@elizaos/')); + const defaultPlugins = ['@elizaos/plugin-sql', '@elizaos/plugin-local-ai']; + if (!plugins) return defaultPlugins; + return [ + ...defaultPlugins, + ...(Array.isArray(plugins) ? plugins : Object.keys(plugins)) + .map((name) => name.replace(/^@elizaos-plugins\//, '@elizaos/')) + .filter((name) => !defaultPlugins.includes(name)), + ]; }, [plugins]); // Reset change tracking when character changes diff --git a/packages/client/src/hooks/use-plugins.ts b/packages/client/src/hooks/use-plugins.ts index e126bd61df2..7062fba7fb5 100644 --- a/packages/client/src/hooks/use-plugins.ts +++ b/packages/client/src/hooks/use-plugins.ts @@ -8,10 +8,22 @@ export function usePlugins() { return useQuery({ queryKey: ['plugins'], queryFn: async () => { - const response = await fetch( - 'https://raw.githubusercontent.com/elizaos/registry/refs/heads/main/index.json' - ); - return response.json(); + // TODO: Temp disabled! + // const response = await fetch( + // 'https://raw.githubusercontent.com/elizaos/registry/refs/heads/main/index.json' + // ); + // return response.json(); + + // Temporarily return hardcoded plugins as an array + return [ + '@elizaos/plugin-sql', + '@elizaos/plugin-local-ai', + '@elizaos/plugin-anthropic', + '@elizaos/plugin-openai', + '@elizaos/plugin-discord', + '@elizaos/plugin-pdf', + '@elizaos/plugin-video-understanding', + ]; }, }); } From d70c3e0ebff41cacb56b8d5fd8dd680145927b0a Mon Sep 17 00:00:00 2001 From: 0xbbjoker <0xbbjoker@proton.me> Date: Sun, 23 Mar 2025 20:25:35 +0100 Subject: [PATCH 35/57] fix: send only text response --- packages/plugin-telegram/src/messageManager.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/plugin-telegram/src/messageManager.ts b/packages/plugin-telegram/src/messageManager.ts index 306b518ab75..244811efe47 100644 --- a/packages/plugin-telegram/src/messageManager.ts +++ b/packages/plugin-telegram/src/messageManager.ts @@ -361,6 +361,9 @@ export class MessageManager { // Create callback for handling responses const callback: HandlerCallback = async (content: Content, _files?: string[]) => { try { + // If response is from reasoning do not send it. + if (!content.text) return []; + const sentMessages = await this.sendMessageInChunks(ctx, content, message.message_id); if (!sentMessages) return []; From 495577b95a6a49dafdf8517530b9de016b5bfb38 Mon Sep 17 00:00:00 2001 From: madjin <32600939+madjin@users.noreply.github.com> Date: Sun, 23 Mar 2025 18:09:22 -0400 Subject: [PATCH 36/57] add mermaid / bun notes --- packages/docs/blog/v1-v2.mdx | 93 ++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/packages/docs/blog/v1-v2.mdx b/packages/docs/blog/v1-v2.mdx index b4cdc014676..0b1e0c1ca9e 100644 --- a/packages/docs/blog/v1-v2.mdx +++ b/packages/docs/blog/v1-v2.mdx @@ -30,11 +30,104 @@ Source: https://www.youtube.com/watch?v=yUjScwAZsQo | **Wallet Overlap**: Multi-chain wallet conflicts | **Unified Inventory**: One wallet with chain-agnostic actions | | **Rigid State**: Hardcoded goals and features | **Modular State**: Extensible, optional components for tailored agents | | **Basic Action Chaining**: No multi-step foresight | **Strategic Planning**: Agents map out complex, sequenced workflows | +| **Package Manager Speed**: Lengthy installations and cold starts | **Bun Integration**: Faster installs, reduced build times | + --- ## Technical Implementation Changes +```mermaid +graph TB + %% Main Components with vertical orientation + User((User)):::user + + %% First Level - Services + PlatformServices[Services]:::services + + %% Second Level - Runtime + AgentRuntime[Agent Runtime]:::core + + %% Core Processing Components - Side by side + subgraph "Core Processing" + direction LR + Providers[Providers]:::int + Actions[Actions]:::int + Evaluators[Evaluators]:::int + end + + %% Knowledge and DB - Side by side + subgraph "Knowledge & Storage" + direction LR + Knowledge[Knowledge]:::int + DB[(Database)]:::db + end + + %% Organization Components - Vertical layout + subgraph "Organization" + direction TB + Worlds[Worlds]:::struct + Rooms[Rooms]:::struct + Entities[Entities]:::struct + end + + %% Development Components - Side by side + subgraph "Development & Integration" + direction LR + Plugins[Plugins]:::dev + Projects[Projects]:::dev + Tasks[Tasks]:::dev + end + + %% Main Flow - Vertical emphasis + User <-->|Interaction| PlatformServices + PlatformServices -->|Process| AgentRuntime + + %% Runtime connections - Simplified + AgentRuntime ---|Context| Providers + AgentRuntime ---|Behavior| Actions + AgentRuntime ---|Analysis| Evaluators + + %% Data connections + AgentRuntime <-->|Storage| DB + Knowledge -->|Informs| Providers + + %% Structure connections - Clean vertical hierarchy + AgentRuntime -->|Manages| Worlds + Worlds -->|Contains| Rooms + Rooms -->|Has| Entities + + %% Development connections + Projects -->|Configure| AgentRuntime + Plugins -->|Extend| AgentRuntime + Tasks -->|Scheduled by| AgentRuntime + + %% Clickable nodes with links to docs + click AgentRuntime "/docs/core/agents" "Learn about Agent Runtime" + click PlatformServices "/docs/core/services" "Learn about Services" + click DB "/docs/core/database" "Learn about Database Systems" + click Actions "/docs/core/actions" "Learn about Actions" + click Providers "/docs/core/providers" "Learn about Providers" + click Evaluators "/docs/core/evaluators" "Learn about Evaluators" + click Knowledge "/docs/core/knowledge" "Learn about Knowledge System" + click Worlds "/docs/core/worlds" "Learn about Worlds" + click Rooms "/docs/core/rooms" "Learn about Rooms" + click Entities "/docs/core/entities" "Learn about Entities" + click Plugins "/docs/core/plugins" "Learn about Plugins" + click Projects "/docs/core/project" "Learn about Projects" + click Tasks "/docs/core/tasks" "Learn about Tasks" + + %% Styling + classDef core fill:#3498db,stroke:#2c3e50,stroke-width:1px,color:#fff,font-weight:bold + classDef services fill:#9b59b6,stroke:#2c3e50,stroke-width:1px,color:#fff,font-weight:bold + classDef db fill:#27ae60,stroke:#2c3e50,stroke-width:1px,color:#fff,font-weight:bold + classDef int fill:#e74c3c,stroke:#2c3e50,stroke-width:1px,color:#fff,font-weight:bold + classDef struct fill:#f39c12,stroke:#2c3e50,stroke-width:1px,color:#fff,font-weight:bold + classDef dev fill:#1abc9c,stroke:#2c3e50,stroke-width:1px,color:#fff,font-weight:bold + classDef user fill:#ecf0f1,stroke:#2c3e50,stroke-width:2px,color:#2c3e50,font-weight:bold,border-radius:50% +``` + + ### From Clients to Services V2 swaps Clients for Services, standardizing platform integration while centralizing message routing—agents now think once, act anywhere (Discord, Twitter, SMS, even phone calls). From dc2ce5cffab7f478be582ab7d20fdb3b13503995 Mon Sep 17 00:00:00 2001 From: 0xbbjoker <0xbbjoker@proton.me> Date: Mon, 24 Mar 2025 00:11:51 +0100 Subject: [PATCH 37/57] fix: env drag and drop --- .../client/src/components/secret-panel.tsx | 146 ++++-------------- 1 file changed, 32 insertions(+), 114 deletions(-) diff --git a/packages/client/src/components/secret-panel.tsx b/packages/client/src/components/secret-panel.tsx index 7231e660672..193b70c9edd 100644 --- a/packages/client/src/components/secret-panel.tsx +++ b/packages/client/src/components/secret-panel.tsx @@ -1,8 +1,8 @@ import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; -import { useEffect, useRef, useState } from 'react'; import type { Agent } from '@elizaos/core'; import { Check, CloudUpload, Eye, EyeOff, MoreVertical, X } from 'lucide-react'; +import { useEffect, useRef, useState } from 'react'; type EnvVariable = { name: string; @@ -17,9 +17,7 @@ interface SecretPanelProps { onChange: (updatedAgent: Agent) => void; } -// Export as named export to match import in other files export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { - // Initialize secrets from character data const initialSecrets = Object.entries(characterValue?.settings?.secrets || {}).map( ([name, value]) => ({ name, @@ -38,15 +36,12 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { const [editingIndex, setEditingIndex] = useState(null); const [editedValue, setEditedValue] = useState(''); const [isDragging, setIsDragging] = useState(false); - // Keep track of deleted keys to ensure proper removal const [deletedKeys, setDeletedKeys] = useState([]); - // Track if changes are pending to avoid unnecessary updates const [changesPending, setChangesPending] = useState(false); const dropdownRef = useRef(null); const dropRef = useRef(null); - // Handle file drop for .env files const handleFile = (file: File) => { const reader = new FileReader(); reader.onload = (event) => { @@ -66,33 +61,28 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { if (key) newEnvs[key.trim()] = val; } - // Add new environment variables with isNew flag - const updatedEnvs = [...envs]; - for (const [key, val] of Object.entries(newEnvs)) { - const existingIndex = updatedEnvs.findIndex((env) => env.name === key); - if (existingIndex !== -1) { - // If value changed, mark as modified - if (updatedEnvs[existingIndex].value !== val) { - updatedEnvs[existingIndex].value = val; - updatedEnvs[existingIndex].isModified = true; - } - } else { - // Add new env with isNew flag - updatedEnvs.push({ name: key, value: val, isNew: true }); - - // If this key was previously deleted, remove it from deletedKeys - if (deletedKeys.includes(key)) { - setDeletedKeys(deletedKeys.filter((k) => k !== key)); - } + setEnvs((prev) => { + const merged = new Map(prev.map(({ name, value }) => [name, value])); + for (const [key, val] of Object.entries(newEnvs)) { + merged.set(key, val); } + return Array.from(merged.entries()).map(([name, value]) => ({ + name, + value, + isNew: !prev.some((env) => env.name === name), + isModified: prev.some((env) => env.name === name && env.value !== value), + })); + }); + + if (deletedKeys.length > 0) { + setDeletedKeys((prev) => prev.filter((key) => !Object.keys(newEnvs).includes(key))); } - - setEnvs(updatedEnvs); + + setChangesPending(true); }; reader.readAsText(file); }; - // Set up drag and drop listeners for .env files useEffect(() => { const drop = dropRef.current; if (!drop) return; @@ -132,12 +122,10 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { }; }, []); - // Add a new environment variable const addEnv = () => { if (name && value) { const exists = envs.some((env) => env.name === name); if (!exists) { - // If this key was previously deleted, remove it from deletedKeys if (deletedKeys.includes(name)) { setDeletedKeys(deletedKeys.filter((key) => key !== name)); } @@ -146,21 +134,23 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { setName(''); setValue(''); setChangesPending(true); + } else { + setEnvs(envs.map((env) => (env.name === name ? { ...env, value, isModified: true } : env))); + setName(''); + setValue(''); + setChangesPending(true); } } }; - // Start editing an environment variable const startEditing = (index: number) => { setEditingIndex(index); setEditedValue(envs[index].value); setOpenIndex(null); }; - // Save edited environment variable const saveEdit = (index: number) => { const updatedEnvs = [...envs]; - // Only mark as modified if the value actually changed if (updatedEnvs[index].value !== editedValue) { updatedEnvs[index].value = editedValue; updatedEnvs[index].isModified = true; @@ -170,21 +160,17 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { setEditingIndex(null); }; - // Remove an environment variable const removeEnv = (index: number) => { const keyToRemove = envs[index].name; - // Add the key to deletedKeys to track removal setDeletedKeys([...deletedKeys, keyToRemove]); - // Update local state setEnvs(envs.filter((_, i) => i !== index)); setOpenIndex(null); setEditingIndex(null); setChangesPending(true); }; - // Handle clicks outside of dropdown useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { @@ -198,33 +184,26 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { }; }, []); - // Update character value when envs change, but only if there are actual changes useEffect(() => { if (changesPending) { - // Create a minimal update object to send only the changes const currentSecrets: Record = {}; - // Map updated values envs.forEach(({ name, value }) => { currentSecrets[name] = value; }); - // Add null values for deleted keys to explicitly mark them for removal deletedKeys.forEach((key) => { currentSecrets[key] = null; }); - // Create a minimal agent object with just the secrets changes const updatedAgent: Partial = { settings: { secrets: currentSecrets, }, }; - // Call the onChange prop with the updated agent onChange(updatedAgent as Agent); - // Reset change tracking flags setEnvs((prevEnvs) => { return prevEnvs.map((env) => ({ ...env, @@ -233,53 +212,24 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { })); }); - // Clear deletedKeys after changes are applied setDeletedKeys([]); setChangesPending(false); } }, [envs, onChange, deletedKeys, changesPending]); - // Sync envs with characterValue when it changes (only if not in middle of edit) - useEffect(() => { - if (characterValue?.settings?.secrets && !changesPending) { - const currentSecretsEntries = Object.entries(characterValue.settings.secrets); - // Only update if the secrets have actually changed (different keys/number of entries) - const currentKeys = currentSecretsEntries - .map(([key]) => key) - .sort() - .join(','); - const envKeys = envs - .map((env) => env.name) - .sort() - .join(','); - - if (currentKeys !== envKeys) { - const newEnvs = currentSecretsEntries.map(([name, value]) => ({ - name, - value: String(value), - isNew: false, - isModified: false, - isDeleted: false, - })); - setEnvs(newEnvs); - } - } - }, [characterValue.settings?.secrets, envs, changesPending]); - return ( -
+

Environment Settings

- {/* Drag & Drop .env file section */} -
+
document.getElementById('env-upload')?.click()} > - +

Drag & drop .env file or select file

@@ -298,7 +248,6 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) {
- {/* Manual entry form */}
-
- {/* Secrets list header */} {envs.length > 0 && (
Name
@@ -358,26 +299,13 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) {
)} - {/* Secrets list */}
{envs.map((env, index) => (
-
- {env.name} - {env.isNew && ( - - New - - )} - {env.isModified && !env.isNew && ( - - Modified - - )} -
+
{env.name}
{editingIndex === index ? (
@@ -385,19 +313,16 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) { value={editedValue} onChange={(e) => setEditedValue(e.target.value)} className="w-full" - type={showPassword ? 'text' : 'password'} /> - -
) : ( -
- {showPassword ? env.value : '••••••••••••••'} -
+
Encrypted
)}
@@ -423,13 +348,6 @@ export function SecretPanel({ characterValue, onChange }: SecretPanelProps) {
removeEnv(index)} - role="button" - tabIndex={0} - onKeyDown={(e) => { - if (e.key === 'Enter' || e.key === ' ') { - removeEnv(index); - } - }} > Remove
From ef8982b570e95aed044b125db34d7d17da88e792 Mon Sep 17 00:00:00 2001 From: madjin <32600939+madjin@users.noreply.github.com> Date: Sun, 23 Mar 2025 22:11:17 -0400 Subject: [PATCH 38/57] add new links at footer, add copy page button --- packages/docs/docs/core/database.md | 4 +- packages/docs/docusaurus.config.ts | 22 +- .../components/CopyPageButton/.index.tsx.swp | Bin 0 -> 24576 bytes .../src/components/CopyPageButton/index.tsx | 365 ++++++++++++++++++ .../CopyPageButton/styles.module.css | 204 ++++++++++ packages/docs/src/css/custom.css | 169 ++++---- .../docs/src/theme/DocItem/Content/index.js | 15 + .../theme/DocItem/Content/styles.module.css | 5 + 8 files changed, 693 insertions(+), 91 deletions(-) create mode 100644 packages/docs/src/components/CopyPageButton/.index.tsx.swp create mode 100644 packages/docs/src/components/CopyPageButton/index.tsx create mode 100644 packages/docs/src/components/CopyPageButton/styles.module.css create mode 100644 packages/docs/src/theme/DocItem/Content/index.js create mode 100644 packages/docs/src/theme/DocItem/Content/styles.module.css diff --git a/packages/docs/docs/core/database.md b/packages/docs/docs/core/database.md index 8926a7e3c4f..fac7ef560d3 100644 --- a/packages/docs/docs/core/database.md +++ b/packages/docs/docs/core/database.md @@ -16,7 +16,7 @@ graph TB DbConnection[("Database (PGLite/PostgreSQL)")] %% Data Models in compact form - DataModels["Data Models:\n Entities, Components\n Memories, Relationships\n Rooms, Worlds, Tasks\n Cache"] + DataModels["Data Models: Entities, Components, Memories, Relationships, Rooms, Worlds, Tasks Cache"] %% Vector Search VectorStore[(Vector Store)] @@ -39,11 +39,13 @@ graph TB classDef adapter fill:#9b59b6,stroke:#2c3e50,stroke-width:1px,color:#fff; classDef db fill:#27ae60,stroke:#2c3e50,stroke-width:1px,color:#fff; classDef datamodels fill:#52be80,stroke:#2c3e50,stroke-width:1px,color:#fff; + classDef memories fill:#2c5e1a,stroke:#2c3333,stroke-width:1px,color:#fff; class Runtime runtime; class DbAdapter adapter; class DbConnection,VectorStore db; class DataModels datamodels; + class MemoriesKnowledge memories; ``` ElizaOS uses a unified database architecture based on Drizzle ORM with adapters that implement the [`IDatabaseAdapter`](/api/interfaces/IDatabaseAdapter) interface. The current release includes support for: diff --git a/packages/docs/docusaurus.config.ts b/packages/docs/docusaurus.config.ts index f2a46711759..bdc85e374d8 100644 --- a/packages/docs/docusaurus.config.ts +++ b/packages/docs/docusaurus.config.ts @@ -185,7 +185,7 @@ const config = { { showReadingTime: true, onUntruncatedBlogPosts: 'ignore', - editUrl: 'https://github.com/elizaos/eliza/tree/main/docs/blog/', + editUrl: 'https://github.com/elizaos/eliza/tree/v2-develop/docs/blog/', blogSidebarTitle: 'Recent posts', blogSidebarCount: 'ALL', showLastUpdateAuthor: true, @@ -210,7 +210,7 @@ const config = { blogTitle: 'AI News', blogDescription: 'Automated aggregating and summarization of elizaOS ecosystem updates', showReadingTime: true, - editUrl: 'https://github.com/elizaos/eliza/tree/main/docs/news', + editUrl: 'https://github.com/elizaos/eliza/tree/v2-develop/packages/docs/news', blogSidebarTitle: 'All posts', blogSidebarCount: 'ALL', showLastUpdateAuthor: true, @@ -225,7 +225,7 @@ const config = { docs: { docItemComponent: '@theme/ApiItem', sidebarPath: require.resolve('./sidebars.ts'), - editUrl: 'https://github.com/elizaos/eliza/tree/main/docs/', + editUrl: 'https://github.com/elizaos/eliza/tree/v2-develop/packages/docs/', exclude: ['**/_media/**'], showLastUpdateAuthor: true, showLastUpdateTime: true, @@ -363,11 +363,23 @@ const config = { label: 'General', href: './', }, + { + label: 'llms.txt', + href: 'llms.txt', + }, + { + label: 'llms-full.txt', + href: 'llms-full.txt', + }, ], }, { title: 'Community', items: [ + { + label: 'Website', + href: 'https://www.elizaos.ai/', + }, { label: 'Discord', href: 'https://discord.gg/elizaos', @@ -381,6 +393,10 @@ const config = { { title: 'More', items: [ + { + label: 'Blog', + href: '/blog', + }, { label: 'GitHub', href: 'https://github.com/elizaos/eliza', diff --git a/packages/docs/src/components/CopyPageButton/.index.tsx.swp b/packages/docs/src/components/CopyPageButton/.index.tsx.swp new file mode 100644 index 0000000000000000000000000000000000000000..df9baf1225900bcecd79ecb3fe71d6147082516c GIT binary patch literal 24576 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 WIAfp^-h~0TW!6=hx_^7zmH!3k@KYTC literal 0 HcmV?d00001 diff --git a/packages/docs/src/components/CopyPageButton/index.tsx b/packages/docs/src/components/CopyPageButton/index.tsx new file mode 100644 index 00000000000..1133e8d1455 --- /dev/null +++ b/packages/docs/src/components/CopyPageButton/index.tsx @@ -0,0 +1,365 @@ +import React, { useState, useRef, useEffect } from 'react'; +import { useLocation } from '@docusaurus/router'; +import { useColorMode } from '@docusaurus/theme-common'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import styles from './styles.module.css'; + +// Define paths to exclude +const EXCLUDED_PATHS = [ + // Exclude API pages + /^\/api\//, + /^\/api\/?$/, + // Exclude packages index + /^\/packages\/?$/, + // Add more excluded paths as needed + // /^\/other-path\//, +]; + +export default function CopyPageButton(): JSX.Element { + const [isOpen, setIsOpen] = useState(false); + const [copySuccess, setCopySuccess] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const dropdownRef = useRef(null); + const { colorMode } = useColorMode(); + const location = useLocation(); + const { siteConfig } = useDocusaurusContext(); + + // Check if current path should be excluded + const isExcludedPath = EXCLUDED_PATHS.some((regex) => regex.test(location.pathname)); + + // Early return if path is excluded + if (isExcludedPath) { + return null; + } + + // Close dropdown when clicking outside + useEffect(() => { + function handleClickOutside(event: MouseEvent) { + if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { + setIsOpen(false); + } + } + + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, []); + + // Reset copy success message after 2 seconds + useEffect(() => { + if (copySuccess) { + const timer = setTimeout(() => { + setCopySuccess(false); + }, 2000); + return () => clearTimeout(timer); + } + }, [copySuccess]); + + // Toggle dropdown + const toggleDropdown = () => { + setIsOpen(!isOpen); + }; + + // Extract the edit URL from the DOM + const getEditUrl = () => { + // Find the "Edit this page" link in the DOM + const editLinkElement = document.querySelector('a.theme-edit-this-page'); + if (editLinkElement && editLinkElement.getAttribute('href')) { + return editLinkElement.getAttribute('href'); + } + + // Fallback for local development + // If we're in local development and we have editUrl configured in docusaurus.config.js + if (process.env.NODE_ENV === 'development') { + // Get the edit URL from config + let editUrl = siteConfig.presets?.[0]?.[1]?.docs?.editUrl || siteConfig.themeConfig?.editUrl; + + if (editUrl) { + // Convert from tree URL to edit URL if needed + if (editUrl.includes('/tree/')) { + editUrl = editUrl.replace('/tree/', '/edit/'); + } + + // Remove trailing slash if present + const baseEditUrl = editUrl.endsWith('/') ? editUrl.slice(0, -1) : editUrl; + + // Get the current path and remove leading and trailing slashes + let currentPath = location.pathname; + currentPath = currentPath.replace(/^\//, '').replace(/\/$/, ''); + + // Remove 'docs/' from the beginning if present + if (currentPath.startsWith('docs/')) { + currentPath = currentPath.substring(5); + } + + // Append .md to get the markdown file + return `${baseEditUrl}/${currentPath}.md`; + } + } + + return null; + }; + + // Convert GitHub edit URL to raw content URL + const getRawUrl = (url: string): string | null => { + if (!url) return null; + + // Handle GitHub URLs - support both edit and tree formats + const githubEditRegex = /github\.com\/([^/]+)\/([^/]+)\/(edit|tree)\/([^/]+)\/(.+)/; + const match = url.match(githubEditRegex); + + if (match) { + const [, owner, repo, urlType, branch, path] = match; + return `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/${path}`; + } + + // Handle GitLab URLs + const gitlabEditRegex = /gitlab\.com\/([^/]+)\/([^/]+)\/-\/edit\/([^/]+)\/(.+)/; + const gitlabMatch = url.match(gitlabEditRegex); + + if (gitlabMatch) { + const [, owner, repo, branch, path] = gitlabMatch; + return `https://gitlab.com/${owner}/${repo}/-/raw/${branch}/${path}`; + } + + return url; // Return original URL if we can't convert it (for local development) + }; + + // Get content using the appropriate method + const getContent = async (url: string): Promise => { + // For local development, try to fetch the content directly + if (process.env.NODE_ENV === 'development' && !url.startsWith('http')) { + try { + // Try to fetch from location relative to the current page + const localUrl = url.startsWith('/') ? url : `/${url}`; + const response = await fetch(localUrl); + if (response.ok) { + return await response.text(); + } + } catch (error) { + console.error('Error fetching local content:', error); + } + + // If local fetch fails, return placeholder message + return '# Content not available locally\n\nThis feature works best when deployed to GitHub Pages.'; + } + + // For production or if local fetch fails, use the raw URL + const rawUrl = getRawUrl(url); + if (!rawUrl) { + return '# Content not available\n\nCould not determine the source URL for this page.'; + } + + const response = await fetch(rawUrl); + if (!response.ok) { + throw new Error(`Failed to fetch: ${response.status} ${response.statusText}`); + } + + return await response.text(); + }; + + // Fetch markdown and copy to clipboard + const copyPageAsMarkdown = async () => { + const currentEditUrl = getEditUrl(); + if (!currentEditUrl) { + console.error('Edit URL not available'); + return; + } + + setIsLoading(true); + + try { + const markdown = await getContent(currentEditUrl); + await navigator.clipboard.writeText(markdown); + setCopySuccess(true); + setIsOpen(false); + } catch (error) { + console.error('Error fetching markdown:', error); + } finally { + setIsLoading(false); + } + }; + + // Open the raw markdown in a new tab + const viewAsMarkdown = async () => { + const currentEditUrl = getEditUrl(); + if (!currentEditUrl) { + return; + } + + const rawUrl = getRawUrl(currentEditUrl); + if (rawUrl) { + // For local development, create a blob URL + if (process.env.NODE_ENV === 'development' && !currentEditUrl.startsWith('http')) { + try { + const content = await getContent(currentEditUrl); + const blob = new Blob([content], { type: 'text/plain' }); + const url = URL.createObjectURL(blob); + window.open(url, '_blank'); + } catch (error) { + console.error('Error creating blob:', error); + } + } else { + // For production + window.open(rawUrl, '_blank'); + } + setIsOpen(false); + } + }; + + // Open the current page in ChatGPT + const openInChatGPT = () => { + const currentUrl = window.location.href; + // Use the correct ChatGPT URL format + const chatGptUrl = `https://chat.openai.com/?model=gpt-4&q=${encodeURIComponent(`Tell me about this page: ${currentUrl}`)}`; + window.open(chatGptUrl, '_blank'); + setIsOpen(false); + }; + + // Check if we should show the button on this page + const [showButton, setShowButton] = useState(false); + + useEffect(() => { + if (isExcludedPath) { + setShowButton(false); + return; + } + + // Need a small delay to ensure the DOM is updated after page navigation + const timer = setTimeout(() => { + // In development, check if we have editUrl configured + if (process.env.NODE_ENV === 'development') { + const hasEditUrl = !!getEditUrl(); + setShowButton(hasEditUrl); + } else { + // In production, check for the edit link in the DOM + const hasEditLink = !!document.querySelector('a.theme-edit-this-page'); + setShowButton(hasEditLink); + } + }, 100); + + return () => clearTimeout(timer); + }, [location.pathname, isExcludedPath]); + + // Don't render the button if it shouldn't be shown + if (!showButton) { + return null; + } + + return ( +
+ + + {isOpen && ( +
+
+ + + + +
+
Copy page
+
Copy this page as Markdown for LLMs
+
+
+ + + + + + +
+ )} + + {copySuccess &&
Copied to clipboard!
} + + {isLoading &&
Loading...
} +
+ ); +} diff --git a/packages/docs/src/components/CopyPageButton/styles.module.css b/packages/docs/src/components/CopyPageButton/styles.module.css new file mode 100644 index 00000000000..eda945c16b0 --- /dev/null +++ b/packages/docs/src/components/CopyPageButton/styles.module.css @@ -0,0 +1,204 @@ +.copyPageButtonContainer { + position: relative; + margin-left: 0.5rem; + display: inline-flex; + align-items: center; +} + +.copyPageButton { + display: flex; + align-items: center; + gap: 0.5rem; + background-color: var(--ifm-color-emphasis-200); + border: 1px solid var(--ifm-color-emphasis-300); + color: var(--ifm-color-emphasis-800); + border-radius: 6px; + padding: 0.5rem 0.75rem; + font-size: 0.875rem; + cursor: pointer; + transition: all 0.2s ease; + font-weight: 500; +} + +.copyPageButton:hover { + background-color: var(--ifm-color-emphasis-300); +} + +.copyPageButton:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.copyIcon { + flex-shrink: 0; +} + +.dropdownIcon { + width: 16px; + height: 16px; + margin-left: 2px; +} + +.dropdown { + position: absolute; + top: calc(100% + 8px); + right: 0; + background-color: white; + border-radius: 8px; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); + width: 320px; + z-index: 100; + overflow: hidden; + border: 1px solid var(--ifm-color-emphasis-200); +} + +.dropdown.dark { + background-color: var(--ifm-background-surface-color); + border-color: var(--ifm-color-emphasis-300); +} + +.dropdownHeader { + padding: 1rem; + display: flex; + align-items: flex-start; + gap: 0.75rem; + border-bottom: 1px solid var(--ifm-color-emphasis-200); +} + +.dropdownTitle { + font-weight: 600; + margin-bottom: 0.25rem; + color: var(--ifm-heading-color); +} + +.dropdownSubtitle { + font-size: 0.875rem; + color: var(--ifm-color-emphasis-600); +} + +.dropdownItem { + width: 100%; + display: flex; + align-items: flex-start; + gap: 0.75rem; + padding: 1rem; + border: none; + background: transparent; + text-align: left; + cursor: pointer; + transition: background-color 0.2s ease; + color: var(--ifm-font-color-base); +} + +.dropdownItem:hover { + background-color: var(--ifm-color-emphasis-100); +} + +.dropdownItem:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.dropdownItem:disabled:hover { + background-color: transparent; +} + +.dropdownItemTitle { + font-weight: 500; + margin-bottom: 0.25rem; + display: flex; + align-items: center; + gap: 0.25rem; + color: var(--ifm-heading-color); +} + +.externalIcon { + font-size: 0.875rem; + opacity: 0.7; +} + +.dropdownItemSubtitle { + font-size: 0.875rem; + color: var(--ifm-color-emphasis-600); +} + +.itemIcon { + margin-top: 0.125rem; +} + +.codeIcon { + display: inline-flex; + align-items: center; + justify-content: center; + font-family: monospace; + font-size: 0.75rem; + background-color: var(--ifm-color-emphasis-200); + padding: 0.375rem; + border-radius: 4px; + width: 20px; + height: 20px; + margin-top: 0.125rem; +} + +.chatGptIcon { + color: #10a37f; + margin-top: 0.125rem; +} + +.copySuccessTooltip { + position: absolute; + bottom: calc(100% + 8px); + right: 0; + background-color: var(--ifm-color-success); + color: white; + padding: 0.375rem 0.75rem; + border-radius: 4px; + font-size: 0.875rem; + white-space: nowrap; + animation: fadeInOut 2s ease; + font-weight: 500; +} + +.loadingTooltip { + position: absolute; + bottom: calc(100% + 8px); + right: 0; + background-color: var(--ifm-color-info); + color: white; + padding: 0.375rem 0.75rem; + border-radius: 4px; + font-size: 0.875rem; + white-space: nowrap; + font-weight: 500; +} + +@keyframes fadeInOut { + 0% { + opacity: 0; + transform: translateY(8px); + } + 10% { + opacity: 1; + transform: translateY(0); + } + 90% { + opacity: 1; + transform: translateY(0); + } + 100% { + opacity: 0; + transform: translateY(-8px); + } +} + +/* Responsive adjustments */ +@media (max-width: 768px) { + .copyPageButtonText { + display: none; + } + + .dropdown { + width: 280px; + right: -12px; + } +} diff --git a/packages/docs/src/css/custom.css b/packages/docs/src/css/custom.css index bc23e77a95e..846b529f8a2 100644 --- a/packages/docs/src/css/custom.css +++ b/packages/docs/src/css/custom.css @@ -1,10 +1,9 @@ /** - * Any CSS included here will be global. The classic template - * bundles Infima by default. Infima is a CSS framework designed to - * work well for content-centric websites. + * Optimized CSS for eliza documentation site + * Performance-focused with reduced transitions and simplified selectors */ -/* You can override the default Infima variables here. */ +/* Base variables - unchanged to maintain visual identity */ :root { --ifm-color-primary: #ffa600; --ifm-color-primary-dark: #e69500; @@ -19,57 +18,46 @@ sans-serif; } -/* Cool dark mode with modern aesthetics and warm accents */ +/* Dark mode variables - simplified */ [data-theme='dark'] { - /* Warmer primary color - orange-blue balance */ - --ifm-color-primary: #ff9500; /* Warm orange as primary */ + --ifm-color-primary: #ff9500; --ifm-color-primary-dark: #e68600; --ifm-color-primary-darker: #d97e00; --ifm-color-primary-darkest: #b36800; --ifm-color-primary-light: #ffa01a; --ifm-color-primary-lighter: #ffaa33; --ifm-color-primary-lightest: #ffb84d; - - /* Accent color for secondary elements - keeping some blue */ - --ifm-color-secondary-dark: #00a3cc; /* Cyan for accents */ - - /* Enhanced backgrounds with warmer undertones */ - --ifm-background-color: #111827; /* Darker blue-gray background */ - --ifm-background-surface-color: #1e293b; /* Surface with slight warmth */ - - /* Text colors */ + --ifm-color-secondary-dark: #00a3cc; + --ifm-background-color: #111827; + --ifm-background-surface-color: #1e293b; --ifm-font-color-base: #f1f5f9; --ifm-heading-color: #ffffff; - - /* Code and doc elements */ - --docusaurus-highlighted-code-line-bg: rgba(255, 149, 0, 0.1); /* Warm highlight */ + --docusaurus-highlighted-code-line-bg: rgba(255, 149, 0, 0.1); --ifm-footer-background-color: #1e293b; --ifm-table-stripe-background: rgba(255, 255, 255, 0.03); --ifm-table-border-color: rgba(255, 255, 255, 0.12); - --ifm-toc-border-color: rgba(255, 149, 0, 0.2); /* Warm accent for TOC */ + --ifm-toc-border-color: rgba(255, 149, 0, 0.2); --ifm-color-emphasis-300: rgba(255, 255, 255, 0.25); - - /* Warm accents */ --warm-accent-light: rgba(255, 149, 0, 0.15); --warm-accent-border: rgba(255, 149, 0, 0.3); } -/* Subtle gradient background for dark mode pages with warmer undertones */ +/* Performance-optimized background */ [data-theme='dark'] .main-wrapper { - background: radial-gradient(circle at 10% 10%, #1e293b 0%, #111827 90%); + background-color: #111827; } +/* Fixed footer color */ .footer { background-color: #161b22; } -/* Cool gradient buttons */ +/* Button styling - minimal transitions */ .button--primary { - background: linear-gradient(135deg, rgb(249, 140, 19) 0%, rgb(255, 166, 0) 100%); + background: linear-gradient(135deg, #f98c13 0%, #ffa600 100%); border: none; padding: 1rem 2rem; font-size: 1.2rem; - transition: all 0.3s ease; color: white; position: relative; z-index: 1; @@ -78,25 +66,26 @@ } .button--primary:hover { - background: linear-gradient(135deg, rgb(255, 156, 43) 0%, rgb(255, 166, 0) 100%); + background: linear-gradient(135deg, #ff9c2b 0%, #ffa600 100%); transform: translateY(-2px); box-shadow: 0 6px 20px 0 rgba(255, 166, 0, 0.3); } [data-theme='dark'] .button--primary { - background: linear-gradient(135deg, rgb(255, 149, 0) 0%, rgb(255, 102, 0) 100%); + background: linear-gradient(135deg, #ff9500 0%, #ff6600 100%); box-shadow: 0 4px 14px 0 rgba(255, 149, 0, 0.25); } [data-theme='dark'] .button--primary:hover { - background: linear-gradient(135deg, rgb(255, 166, 43) 0%, rgb(255, 123, 26) 100%); + background: linear-gradient(135deg, #ffa62b 0%, #ff7b1a 100%); box-shadow: 0 6px 20px 0 rgba(255, 149, 0, 0.3); } +/* Responsive iframe - unchanged */ .responsive-iframe { position: relative; width: 100%; - padding-bottom: 56.25%; /* 16:9 aspect ratio */ + padding-bottom: 56.25%; height: 0; overflow: hidden; background: #000; @@ -114,7 +103,7 @@ border-radius: 8px; } -/* Futuristic API Method badges */ +/* API Method badges - optimized selectors */ .api-method > .menu__link { align-items: center; justify-content: start; @@ -132,46 +121,40 @@ text-align: center; flex-shrink: 0; color: white; - transition: all 0.3s ease; } -/* Modern REST API badges for dark mode with warm accents */ +/* API method badges for dark mode - flat colors for better performance */ [data-theme='dark'] .get > .menu__link::before { content: 'get'; - background: linear-gradient(135deg, #3182ce 0%, #2c5282 100%); + background-color: #3182ce; color: white; - box-shadow: 0 2px 5px rgba(49, 130, 206, 0.3); } [data-theme='dark'] .post > .menu__link::before { content: 'post'; - background: linear-gradient(135deg, #38a169 0%, #276749 100%); + background-color: #38a169; color: white; - box-shadow: 0 2px 5px rgba(56, 161, 105, 0.3); } [data-theme='dark'] .delete > .menu__link::before { content: 'del'; - background: linear-gradient(135deg, #e53e3e 0%, #9b2c2c 100%); + background-color: #e53e3e; color: white; - box-shadow: 0 2px 5px rgba(229, 62, 62, 0.3); } [data-theme='dark'] .put > .menu__link::before { content: 'put'; - background: linear-gradient(135deg, #4299e1 0%, #2b6cb0 100%); + background-color: #4299e1; color: white; - box-shadow: 0 2px 5px rgba(66, 153, 225, 0.3); } [data-theme='dark'] .patch > .menu__link::before { content: 'patch'; - background: linear-gradient(135deg, #ff9500 0%, #c05621 100%); + background-color: #ff9500; color: white; - box-shadow: 0 2px 5px rgba(255, 149, 0, 0.3); } -/* Light mode API badges */ +/* Light mode API badges - simplified */ .get > .menu__link::before { content: 'get'; background-color: var(--ifm-color-primary); @@ -197,11 +180,11 @@ background-color: #f97316; } -/* Cool tables in dark mode with subtle hover effects */ +/* Optimized tables in dark mode */ [data-theme='dark'] table { border-spacing: 0; overflow-x: auto; - display: block; /* Make tables responsive */ + display: block; margin: 1.5em 0; } @@ -211,11 +194,7 @@ font-weight: 600; border-bottom: 2px solid rgba(255, 149, 0, 0.2); padding: 12px 16px; - white-space: nowrap; /* Prevents wrapping in headers */ -} - -[data-theme='dark'] table tr { - transition: background-color 0.2s ease; + white-space: nowrap; } [data-theme='dark'] table tr:nth-child(even) { @@ -231,71 +210,49 @@ padding: 12px 16px; } -/* Stylish sidebar in dark mode */ +/* Performance-optimized sidebar in dark mode */ [data-theme='dark'] .menu { background-color: #161b22; - border-right: 1px solid rgba(255, 255, 255, 0.05); + /* Use box-shadow instead of border for better performance */ + box-shadow: 1px 0 0 rgba(255, 255, 255, 0.05); + /* Hardware acceleration */ + transform: translateZ(0); } +/* Optimized active links - remove transitions */ [data-theme='dark'] .menu__link--active { - background-color: var(--warm-accent-light); + background-color: rgba(255, 149, 0, 0.15); border-left: 3px solid var(--ifm-color-primary); font-weight: 600; + padding-left: calc(var(--ifm-menu-link-padding-horizontal) - 3px); } +/* Simplified hover effect with minimal transition */ [data-theme='dark'] .menu__link:hover { background-color: rgba(255, 255, 255, 0.05); - transition: background-color 0.2s ease; } -/* Modernized navbar */ +/* Optimized navbar */ [data-theme='dark'] .navbar { - background-color: rgba(22, 27, 34, 0.9); - backdrop-filter: blur(10px); - box-shadow: - 0 1px 2px 0 rgba(0, 0, 0, 0.1), - 0 1px 6px 0 rgba(0, 0, 0, 0.05); + background-color: rgba(22, 27, 34, 0.95); + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.1); } -/* Card styling for dark mode with warm accents */ +/* Card styling for dark mode - optimized */ [data-theme='dark'] .card { background-color: #1e293b; border-radius: 8px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); - transition: - transform 0.3s ease, - box-shadow 0.3s ease, - border-color 0.3s ease; border: 1px solid rgba(255, 255, 255, 0.05); overflow: hidden; } [data-theme='dark'] .card:hover { border-color: rgba(255, 149, 0, 0.2); -} - -[data-theme='dark'] .card:hover { transform: translateY(-5px); box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2); } -/* Elegant transitions for dark mode */ -[data-theme='dark'] * { - transition: - background 0.5s ease, - background-color 0.2s ease, - border-color 1s ease, - fill 0.2s ease, - stroke 0.5s ease; -} - -/* Cool announcement bar if you have one */ -[data-theme='dark'] .announcement-bar { - background: linear-gradient(90deg, #161b22 0%, #0d1117 50%, #161b22 100%); - background-size: 200% 100%; - animation: gradient-shift 15s ease infinite; -} - /* Warm accent for blockquotes */ [data-theme='dark'] blockquote { border-left: 3px solid var(--ifm-color-primary); @@ -304,3 +261,41 @@ padding: 1em; border-radius: 0 8px 8px 0; } + +/* Use specific will-change properties only where needed */ +.navbar--fixed-top { + will-change: transform; +} + +.menu__link { + will-change: background-color; +} + +/* Target performance for key interactive components */ +@media (prefers-reduced-motion: no-preference) { + /* Apply transitions only for non-reduced motion users */ + .button--primary { + transition: + transform 0.2s ease, + box-shadow 0.2s ease; + } + + .menu__link:hover { + transition: background-color 0.15s ease; + } + + .card:hover { + transition: + transform 0.2s ease, + box-shadow 0.2s ease, + border-color 0.2s ease; + } +} + +/* Prefers-reduced-motion accommodations */ +@media (prefers-reduced-motion: reduce) { + * { + animation: none !important; + transition: none !important; + } +} diff --git a/packages/docs/src/theme/DocItem/Content/index.js b/packages/docs/src/theme/DocItem/Content/index.js new file mode 100644 index 00000000000..8c2d4b40868 --- /dev/null +++ b/packages/docs/src/theme/DocItem/Content/index.js @@ -0,0 +1,15 @@ +import React from 'react'; +import Content from '@theme-original/DocItem/Content'; +import CopyPageButton from '@site/src/components/CopyPageButton'; +import styles from './styles.module.css'; + +export default function ContentWrapper(props) { + return ( + <> +
+ +
+ + + ); +} diff --git a/packages/docs/src/theme/DocItem/Content/styles.module.css b/packages/docs/src/theme/DocItem/Content/styles.module.css new file mode 100644 index 00000000000..d599fea240a --- /dev/null +++ b/packages/docs/src/theme/DocItem/Content/styles.module.css @@ -0,0 +1,5 @@ +.docItemActions { + display: flex; + justify-content: flex-end; + margin-bottom: 1rem; +} From bab0c6ddd6559d4d69b9f5701173a7998858afa3 Mon Sep 17 00:00:00 2001 From: madjin <32600939+madjin@users.noreply.github.com> Date: Sun, 23 Mar 2025 22:14:08 -0400 Subject: [PATCH 39/57] remove artifacts --- packages/docs/blog/.authors.yml.swp | Bin 12288 -> 0 bytes .../components/CopyPageButton/.index.tsx.swp | Bin 24576 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 packages/docs/blog/.authors.yml.swp delete mode 100644 packages/docs/src/components/CopyPageButton/.index.tsx.swp diff --git a/packages/docs/blog/.authors.yml.swp b/packages/docs/blog/.authors.yml.swp deleted file mode 100644 index a6f02ff8344ec43c244c041335baadbef39c9a64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 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 WIAfp^-h~0TW!6=hx_^7zmH!3k@KYTC From dceef560c32e35bcb1cfa23b536a316d50176dd2 Mon Sep 17 00:00:00 2001 From: madjin <32600939+madjin@users.noreply.github.com> Date: Sun, 23 Mar 2025 23:29:18 -0400 Subject: [PATCH 40/57] fix chatgpt link, and sidebars order --- packages/docs/sidebars.ts | 28 +++++++++---------- .../src/components/CopyPageButton/index.tsx | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/docs/sidebars.ts b/packages/docs/sidebars.ts index 1bf98f320a3..90ceb27b0cb 100644 --- a/packages/docs/sidebars.ts +++ b/packages/docs/sidebars.ts @@ -44,8 +44,8 @@ const sidebars = { }, { type: 'doc', - id: 'core/project', - label: 'Project', + id: 'core/actions', + label: 'Actions', }, { type: 'doc', @@ -54,18 +54,18 @@ const sidebars = { }, { type: 'doc', - id: 'core/plugins', - label: 'Plugins', + id: 'core/database', + label: 'Database Adapters', }, { type: 'doc', - id: 'core/providers', - label: 'Providers', + id: 'core/entities', + label: 'Entities', }, { type: 'doc', - id: 'core/database', - label: 'Database Adapters', + id: 'core/evaluators', + label: 'Evaluators', }, { type: 'doc', @@ -74,18 +74,18 @@ const sidebars = { }, { type: 'doc', - id: 'core/actions', - label: 'Actions', + id: 'core/plugins', + label: 'Plugins', }, { type: 'doc', - id: 'core/evaluators', - label: 'Evaluators', + id: 'core/project', + label: 'Project', }, { type: 'doc', - id: 'core/entities', - label: 'Entities', + id: 'core/providers', + label: 'Providers', }, { type: 'doc', diff --git a/packages/docs/src/components/CopyPageButton/index.tsx b/packages/docs/src/components/CopyPageButton/index.tsx index 1133e8d1455..c1fd7e24f7e 100644 --- a/packages/docs/src/components/CopyPageButton/index.tsx +++ b/packages/docs/src/components/CopyPageButton/index.tsx @@ -212,7 +212,7 @@ export default function CopyPageButton(): JSX.Element { const openInChatGPT = () => { const currentUrl = window.location.href; // Use the correct ChatGPT URL format - const chatGptUrl = `https://chat.openai.com/?model=gpt-4&q=${encodeURIComponent(`Tell me about this page: ${currentUrl}`)}`; + const chatGptUrl = `https://chatgpt.com/?q=${encodeURIComponent(`Tell me about this page: ${currentUrl}`)}`; window.open(chatGptUrl, '_blank'); setIsOpen(false); }; From d849b44e0495d71b36ca08307418e19562c79802 Mon Sep 17 00:00:00 2001 From: madjin <32600939+madjin@users.noreply.github.com> Date: Sun, 23 Mar 2025 23:56:11 -0400 Subject: [PATCH 41/57] add some svgs of worlds / rooms / entities --- packages/docs/docs/core/entities.md | 2 + packages/docs/docs/core/rooms.md | 2 + packages/docs/docs/core/worlds.md | 4 + .../docs/static/img/elizaos-rooms-cover.svg | 138 +++++++++++ .../static/img/elizaos-rooms-simplified.svg | 102 +++++++++ .../docs/static/img/elizaos-visualization.svg | 161 +++++++++++++ .../img/elizaos-worlds-cosmic-clean.svg | 203 +++++++++++++++++ .../docs/static/img/elizaos-worlds-cosmic.svg | 215 ++++++++++++++++++ .../docs/static/img/elizaos-worlds-cover.svg | 118 ++++++++++ .../static/img/elizaos-worlds-simplified.svg | 117 ++++++++++ .../img/entities-component-architecture.svg | 192 ++++++++++++++++ 11 files changed, 1254 insertions(+) create mode 100644 packages/docs/static/img/elizaos-rooms-cover.svg create mode 100644 packages/docs/static/img/elizaos-rooms-simplified.svg create mode 100644 packages/docs/static/img/elizaos-visualization.svg create mode 100644 packages/docs/static/img/elizaos-worlds-cosmic-clean.svg create mode 100644 packages/docs/static/img/elizaos-worlds-cosmic.svg create mode 100644 packages/docs/static/img/elizaos-worlds-cover.svg create mode 100644 packages/docs/static/img/elizaos-worlds-simplified.svg create mode 100644 packages/docs/static/img/entities-component-architecture.svg diff --git a/packages/docs/docs/core/entities.md b/packages/docs/docs/core/entities.md index 32e61aeefe8..4c157c01356 100644 --- a/packages/docs/docs/core/entities.md +++ b/packages/docs/docs/core/entities.md @@ -6,6 +6,8 @@ sidebar_position: 9 Entities in ElizaOS represent users, agents, or any participant that can interact within the system. They form the basis of the entity-component architecture, allowing for flexible data modeling and relationships across the platform. +![](/img/entities-component-architecture.svg) + ## Entity Structure An entity in ElizaOS has the following properties: diff --git a/packages/docs/docs/core/rooms.md b/packages/docs/docs/core/rooms.md index ead91d40779..0d506016e1f 100644 --- a/packages/docs/docs/core/rooms.md +++ b/packages/docs/docs/core/rooms.md @@ -6,6 +6,8 @@ sidebar_position: 8 Rooms in ElizaOS represent individual interaction spaces within a world. A room can be a conversation, a channel, a thread, or any other defined space where entities can exchange messages and interact. Rooms are typically contained within a world, though they can also exist independently. +![](/img/elizaos-rooms-simplified.svg) + ## Room Structure A room in ElizaOS has the following properties: diff --git a/packages/docs/docs/core/worlds.md b/packages/docs/docs/core/worlds.md index bfbc7e076b5..ca46f6a3fad 100644 --- a/packages/docs/docs/core/worlds.md +++ b/packages/docs/docs/core/worlds.md @@ -6,6 +6,10 @@ sidebar_position: 7 Worlds in ElizaOS are collections of entities (users, agents) and rooms (conversations, channels) that form a cohesive environment for interactions. Think of a world as a virtual space, like a Discord server, Slack workspace, or 3D MMO environment, where entities can communicate across multiple channels or areas. +| Worlds | Rooms within Worlds | +| ----------------------------------------- | --------------------------------------- | +| ![](/img/elizaos-worlds-cosmic-clean.svg) | ![](/img/elizaos-worlds-simplified.svg) | + ## World Structure A world in ElizaOS has the following properties: diff --git a/packages/docs/static/img/elizaos-rooms-cover.svg b/packages/docs/static/img/elizaos-rooms-cover.svg new file mode 100644 index 00000000000..9109e766a8c --- /dev/null +++ b/packages/docs/static/img/elizaos-rooms-cover.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Rooms + In ElizaOS Framework + + + + + + + + + User + + + Agent + + + + + Conversation + + + + + + Channel A + + + + + + + Thread B + + + + + + + + DM Space + + + + + + + + + + + + + + + + + Room Features + + + + + + + + + + + + + + + + + + + + + + Individual interaction spaces where entities communicate + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/docs/static/img/elizaos-rooms-simplified.svg b/packages/docs/static/img/elizaos-rooms-simplified.svg new file mode 100644 index 00000000000..315df905d92 --- /dev/null +++ b/packages/docs/static/img/elizaos-rooms-simplified.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + Rooms + in ElizaOS + + + + + + + + + + + + # general + # support + # random + # dev + + THREADS + # feature-req + # bug-report + + + + + # support + 3 members + + + + + + User1 + How do I connect my app to ElizaOS? + + + + SupportAgent + You'll need to use our API. I can help you set up... + + + + User2 + I'm having the same issue. Can you share docs? + + + + 3 replies + + + + + Message #support... + + + + + + + Rooms + Like channels in Discord + or Slack workspaces + + + + Threads + Nested conversations + within a room + + + + + + + + + Individual spaces for conversations and interactions + + \ No newline at end of file diff --git a/packages/docs/static/img/elizaos-visualization.svg b/packages/docs/static/img/elizaos-visualization.svg new file mode 100644 index 00000000000..d334230882c --- /dev/null +++ b/packages/docs/static/img/elizaos-visualization.svg @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ElizaOS Architecture + + + + + + + + World A + + + + Room 1 + + + Room 2 + + + Room 3 + + + + + + + + + + + + + + + + + World B + + + + Room 1 + + + Room 2 + + + + + + + + + + + + + + + Independent Room + + + + + + + + + + + + + + + + + + + Legend: + + + World + + + Room + + + User + + + Agent + + + Connection + + + + + Worlds contain multiple rooms + Rooms host entities (users/agents) + Entities interact across rooms + Rooms can exist independently + + \ No newline at end of file diff --git a/packages/docs/static/img/elizaos-worlds-cosmic-clean.svg b/packages/docs/static/img/elizaos-worlds-cosmic-clean.svg new file mode 100644 index 00000000000..c3679bd02f6 --- /dev/null +++ b/packages/docs/static/img/elizaos-worlds-cosmic-clean.svg @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Worlds + In ElizaOS Framework + + + + + + DEV + + + + + #general + + + #bugs + + + #roadmap + + + #support + + + + + + + + QA + + + + + #tests + + + #reports + + + + + + + + PROD + + + + + #main + + + #help + + + #status + + + + + + + + AI + + + + + #models + + + #data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Legend + + + World + + + Room + + + User + + + Agent + + + + + Virtual environments hosting rooms and entities + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/docs/static/img/elizaos-worlds-cosmic.svg b/packages/docs/static/img/elizaos-worlds-cosmic.svg new file mode 100644 index 00000000000..398bbc4d45d --- /dev/null +++ b/packages/docs/static/img/elizaos-worlds-cosmic.svg @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Worlds + In ElizaOS Framework + + + + + + DEV + + + + + #general + + + #bugs + + + #roadmap + + + #support + + + + + + + + QA + + + + + + + + + + + + + PROD + + + + + #main + + + #help + + + + + + + + + + AI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Worlds + Like Discord servers or Slack workspaces + Each with their own purpose + + + + Connected Environments + Worlds can share information + and entities can move between them + + + + + + Legend: + + + World + + + Room + + + User + + + Agent + + + + + Virtual environments hosting rooms and entities for specific purposes + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/docs/static/img/elizaos-worlds-cover.svg b/packages/docs/static/img/elizaos-worlds-cover.svg new file mode 100644 index 00000000000..62327a78c4f --- /dev/null +++ b/packages/docs/static/img/elizaos-worlds-cover.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Worlds + In ElizaOS Framework + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Virtual environments hosting interconnected rooms and entities + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/docs/static/img/elizaos-worlds-simplified.svg b/packages/docs/static/img/elizaos-worlds-simplified.svg new file mode 100644 index 00000000000..ab17d2e5cce --- /dev/null +++ b/packages/docs/static/img/elizaos-worlds-simplified.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + Worlds + in ElizaOS + + + + + + + + + DEV + + + AI + + + PROD + + + QA + + + GAME + + + + + + + + + + + + + AI Research World + + + + TEXT CHANNELS + + # welcome + # announcements + # general + # support + # research + + VOICE CHANNELS + 🔊 Meeting Room + + + MEMBERS (8) + + + User1 + + + User2 + + + ResearchAgent + + + AssistantBot + + + User3 + + + User4 + + + + + + + + Worlds + Like Discord servers or + Slack workspaces + + + + Rooms within Worlds + Like channels in a server + for specific discussions + + + + + + + + + Virtual environments containing multiple rooms and entities + + \ No newline at end of file diff --git a/packages/docs/static/img/entities-component-architecture.svg b/packages/docs/static/img/entities-component-architecture.svg new file mode 100644 index 00000000000..8c0dba57f08 --- /dev/null +++ b/packages/docs/static/img/entities-component-architecture.svg @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Entities + + + + + + + + User + + + + + + + + Agent + + + + + + + + + Components + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Entity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From e688afaf1905644325d7883ea6759fe48b2d8794 Mon Sep 17 00:00:00 2001 From: Sayo <82053242+wtfsayo@users.noreply.github.com> Date: Mon, 24 Mar 2025 13:10:39 +0530 Subject: [PATCH 42/57] test existing salting --- bun.lock | 17 ++ packages/cli/src/commands/start.ts | 7 +- packages/core/src/runtime.ts | 10 +- packages/core/src/settings.ts | 268 ++++++++++++++++++++--------- 4 files changed, 219 insertions(+), 83 deletions(-) diff --git a/bun.lock b/bun.lock index 042442d7069..4cf11692912 100644 --- a/bun.lock +++ b/bun.lock @@ -469,6 +469,21 @@ "whatwg-url": "7.1.0", }, }, + "packages/plugin-redpill": { + "name": "@elizaos/plugin-redpill", + "version": "1.0.0-beta.2", + "dependencies": { + "@ai-sdk/openai": "^1.1.9", + "@ai-sdk/ui-utils": "1.1.9", + "@elizaos/core": "^1.0.0-beta.2", + "ai": "^4.1.25", + "js-tiktoken": "^1.0.18", + "tsup": "8.4.0", + }, + "devDependencies": { + "prettier": "3.5.3", + }, + }, "packages/plugin-solana": { "name": "@elizaos/plugin-solana", "version": "1.0.0-beta.7", @@ -1320,6 +1335,8 @@ "@elizaos/plugin-pdf": ["@elizaos/plugin-pdf@workspace:packages/plugin-pdf"], + "@elizaos/plugin-redpill": ["@elizaos/plugin-redpill@workspace:packages/plugin-redpill"], + "@elizaos/plugin-solana": ["@elizaos/plugin-solana@workspace:packages/plugin-solana"], "@elizaos/plugin-sql": ["@elizaos/plugin-sql@workspace:packages/plugin-sql"], diff --git a/packages/cli/src/commands/start.ts b/packages/cli/src/commands/start.ts index 0968737ceb5..a1e904e8372 100644 --- a/packages/cli/src/commands/start.ts +++ b/packages/cli/src/commands/start.ts @@ -6,6 +6,7 @@ import { type Plugin, logger, stringToUuid, + encryptedCharacter, } from '@elizaos/core'; import { Command } from 'commander'; import fs from 'node:fs'; @@ -102,6 +103,8 @@ export async function startAgent( ): Promise { character.id ??= stringToUuid(character.name); + const encryptedChar = encryptedCharacter(character); + // For ESM modules we need to use import.meta.url instead of __dirname const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); @@ -120,7 +123,7 @@ export async function startAgent( const characterPlugins: Plugin[] = []; // for each plugin, check if it installed, and install if it is not - for (const plugin of character.plugins) { + for (const plugin of encryptedChar.plugins) { logger.debug('Checking if plugin is installed: ', plugin); let pluginModule: any; @@ -219,7 +222,7 @@ export async function startAgent( } const runtime = new AgentRuntime({ - character, + character: encryptedChar, plugins: [...plugins, ...characterPlugins], }); if (init) { diff --git a/packages/core/src/runtime.ts b/packages/core/src/runtime.ts index 84f564f3d7c..b9e9f4f0ba2 100644 --- a/packages/core/src/runtime.ts +++ b/packages/core/src/runtime.ts @@ -1,7 +1,7 @@ import { v4 as uuidv4 } from 'uuid'; import { bootstrapPlugin } from './bootstrap'; import { createUniqueUuid } from './entities'; -import { handlePluginImporting } from './index'; +import { decryptSecret, getSalt, handlePluginImporting } from './index'; import logger from './logger'; import { splitChunks } from './prompts'; // Import enums and values that are used as values @@ -727,9 +727,11 @@ export class AgentRuntime implements IAgentRuntime { this.character.settings?.secrets?.[key] || this.settings[key]; - if (value === 'true') return true; - if (value === 'false') return false; - return value || null; + const decryptedValue = decryptSecret(value, getSalt()); + + if (decryptedValue === 'true') return true; + if (decryptedValue === 'false') return false; + return decryptedValue || null; } /** diff --git a/packages/core/src/settings.ts b/packages/core/src/settings.ts index ce4d09f0624..1cebae4b326 100644 --- a/packages/core/src/settings.ts +++ b/packages/core/src/settings.ts @@ -1,14 +1,21 @@ import crypto from 'node:crypto'; import { createUniqueUuid } from './entities'; import { logger } from './logger'; -import type { IAgentRuntime, OnboardingConfig, Setting, World, WorldSettings } from './types'; +import type { + Character, + IAgentRuntime, + OnboardingConfig, + Setting, + World, + WorldSettings, +} from './types'; /** * Creates a new Setting object based on provided config settings. * @param {Omit} configSetting - The configuration settings for the new Setting object. * @returns {Setting} - The newly created Setting object. */ -function createSettingFromConfig(configSetting: Omit): Setting { +export function createSettingFromConfig(configSetting: Omit): Setting { return { name: configSetting.name, description: configSetting.description, @@ -24,21 +31,18 @@ function createSettingFromConfig(configSetting: Omit): Setting }; } -/** - * Generate a salt for settings encryption - */ /** * Retrieves the salt for the agent based on the provided runtime information. * * @param {IAgentRuntime} runtime - The runtime information of the agent. * @returns {string} The salt for the agent. */ -function getSalt(runtime: IAgentRuntime): string { +export function getSalt(runtime?: IAgentRuntime): string { const secretSalt = (typeof process !== 'undefined' ? process.env.SECRET_SALT : (import.meta as any).env.SECRET_SALT) || 'secretsalt'; - const agentId = runtime.agentId; + const agentId = runtime?.agentId; if (!agentId) { logger.warn('AgentId is missing when generating encryption salt'); @@ -50,48 +54,97 @@ function getSalt(runtime: IAgentRuntime): string { } /** - * Applies salt to the value of a setting - * Only applies to secret settings with string values + * Common encryption function for string values + * @param {string} value - The string value to encrypt + * @param {string} salt - The salt to use for encryption + * @returns {string} - The encrypted value in 'iv:encrypted' format */ -function saltSettingValue(setting: Setting, salt: string): Setting { - const settingCopy = { ...setting }; - - // Only encrypt string values in secret settings - if (setting.secret === true && typeof setting.value === 'string' && setting.value) { - try { - // Check if value is already encrypted (has the format "iv:encrypted") - const parts = setting.value.split(':'); - if (parts.length === 2) { - try { - // Try to parse the first part as hex to see if it's already encrypted - const possibleIv = Buffer.from(parts[0], 'hex'); - if (possibleIv.length === 16) { - // Value is likely already encrypted, return as is - logger.debug('Value appears to be already encrypted, skipping re-encryption'); - return settingCopy; - } - } catch (e) { - // Not a valid hex string, proceed with encryption +export function encryptStringValue(value: string, salt: string): string { + try { + // Check if value is already encrypted (has the format "iv:encrypted") + const parts = value.split(':'); + if (parts.length === 2) { + try { + // Try to parse the first part as hex to see if it's already encrypted + const possibleIv = Buffer.from(parts[0], 'hex'); + if (possibleIv.length === 16) { + // Value is likely already encrypted, return as is + logger.debug('Value appears to be already encrypted, skipping re-encryption'); + return value; } + } catch (e) { + // Not a valid hex string, proceed with encryption } + } - // Create key and iv from the salt - const key = crypto.createHash('sha256').update(salt).digest().slice(0, 32); - const iv = crypto.randomBytes(16); + // Create key and iv from the salt + const key = crypto.createHash('sha256').update(salt).digest().slice(0, 32); + const iv = crypto.randomBytes(16); - // Encrypt the value - const cipher = crypto.createCipheriv('aes-256-cbc', key, iv); - let encrypted = cipher.update(setting.value, 'utf8', 'hex'); - encrypted += cipher.final('hex'); + // Encrypt the value + const cipher = crypto.createCipheriv('aes-256-cbc', key, iv); + let encrypted = cipher.update(value, 'utf8', 'hex'); + encrypted += cipher.final('hex'); + + // Store IV with the encrypted value so we can decrypt it later + return `${iv.toString('hex')}:${encrypted}`; + } catch (error) { + logger.error(`Error encrypting value: ${error}`); + // Return the original value on error + return value; + } +} + +/** + * Common decryption function for string values + * @param {string} value - The encrypted value in 'iv:encrypted' format + * @param {string} salt - The salt to use for decryption + * @returns {string} - The decrypted string value + */ +export function decryptStringValue(value: string, salt: string): string { + try { + // Split the IV and encrypted value + const parts = value.split(':'); + if (parts.length !== 2) { + logger.warn(`Invalid encrypted value format - expected 'iv:encrypted'`); + return value; // Return the original value without decryption + } - // Store IV with the encrypted value so we can decrypt it later - settingCopy.value = `${iv.toString('hex')}:${encrypted}`; + const iv = Buffer.from(parts[0], 'hex'); + const encrypted = parts[1]; - logger.debug(`Successfully encrypted value with IV length: ${iv.length}`); - } catch (error) { - logger.error(`Error encrypting setting value: ${error}`); - // Return the original value on error + // Verify IV length + if (iv.length !== 16) { + logger.warn(`Invalid IV length (${iv.length}) - expected 16 bytes`); + return value; // Return the original value without decryption } + + // Create key from the salt + const key = crypto.createHash('sha256').update(salt).digest().slice(0, 32); + + // Decrypt the value + const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv); + let decrypted = decipher.update(encrypted, 'hex', 'utf8'); + decrypted += decipher.final('utf8'); + + return decrypted; + } catch (error) { + logger.error(`Error decrypting value: ${error}`); + // Return the encrypted value on error + return value; + } +} + +/** + * Applies salt to the value of a setting + * Only applies to secret settings with string values + */ +export function saltSettingValue(setting: Setting, salt: string): Setting { + const settingCopy = { ...setting }; + + // Only encrypt string values in secret settings + if (setting.secret === true && typeof setting.value === 'string' && setting.value) { + settingCopy.value = encryptStringValue(setting.value, salt); } return settingCopy; @@ -101,41 +154,12 @@ function saltSettingValue(setting: Setting, salt: string): Setting { * Removes salt from the value of a setting * Only applies to secret settings with string values */ -function unsaltSettingValue(setting: Setting, salt: string): Setting { +export function unsaltSettingValue(setting: Setting, salt: string): Setting { const settingCopy = { ...setting }; // Only decrypt string values in secret settings if (setting.secret === true && typeof setting.value === 'string' && setting.value) { - try { - // Split the IV and encrypted value - const parts = setting.value.split(':'); - if (parts.length !== 2) { - logger.warn(`Invalid encrypted value format for setting - expected 'iv:encrypted'`); - return settingCopy; // Return the original value without decryption - } - - const iv = Buffer.from(parts[0], 'hex'); - const encrypted = parts[1]; - - // Verify IV length - if (iv.length !== 16) { - logger.warn(`Invalid IV length (${iv.length}) - expected 16 bytes`); - return settingCopy; // Return the original value without decryption - } - - // Create key from the salt - const key = crypto.createHash('sha256').update(salt).digest().slice(0, 32); - - // Decrypt the value - const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv); - let decrypted = decipher.update(encrypted, 'hex', 'utf8'); - decrypted += decipher.final('utf8'); - - settingCopy.value = decrypted; - } catch (error) { - logger.error(`Error decrypting setting value: ${error}`); - // Return the encrypted value on error - } + settingCopy.value = decryptStringValue(setting.value, salt); } return settingCopy; @@ -144,7 +168,7 @@ function unsaltSettingValue(setting: Setting, salt: string): Setting { /** * Applies salt to all settings in a WorldSettings object */ -function saltWorldSettings(worldSettings: WorldSettings, salt: string): WorldSettings { +export function saltWorldSettings(worldSettings: WorldSettings, salt: string): WorldSettings { const saltedSettings: WorldSettings = {}; for (const [key, setting] of Object.entries(worldSettings)) { @@ -157,7 +181,7 @@ function saltWorldSettings(worldSettings: WorldSettings, salt: string): WorldSet /** * Removes salt from all settings in a WorldSettings object */ -function unsaltWorldSettings(worldSettings: WorldSettings, salt: string): WorldSettings { +export function unsaltWorldSettings(worldSettings: WorldSettings, salt: string): WorldSettings { const unsaltedSettings: WorldSettings = {}; for (const [key, setting] of Object.entries(worldSettings)) { @@ -190,7 +214,7 @@ export async function updateWorldSettings( } // Apply salt to settings before saving - const salt = getSalt(runtime); + const salt = getSalt(); const saltedSettings = saltWorldSettings(worldSettings, salt); // Update settings state @@ -225,7 +249,7 @@ export async function getWorldSettings( const saltedSettings = world.metadata.settings as WorldSettings; // Remove salt from settings before returning - const salt = getSalt(runtime); + const salt = getSalt(); return unsaltWorldSettings(saltedSettings, salt); } catch (error) { logger.error(`Error getting settings state: ${error}`); @@ -247,7 +271,7 @@ export async function initializeOnboarding( logger.info(`Onboarding state already exists for server ${world.serverId}`); // Get settings from metadata and remove salt const saltedSettings = world.metadata.settings as WorldSettings; - const salt = getSalt(runtime); + const salt = getSalt(); return unsaltWorldSettings(saltedSettings, salt); } @@ -278,3 +302,93 @@ export async function initializeOnboarding( return null; } } + +/** + * Encrypts sensitive data in a Character object + * @param {Character} character - The character object to encrypt secrets for + * @param {IAgentRuntime} runtime - The runtime information needed for salt generation + * @returns {Character} - A copy of the character with encrypted secrets + */ +export function encryptedCharacter(character: Character): Character { + // Create a deep copy to avoid modifying the original + const encryptedChar = JSON.parse(JSON.stringify(character)); + const salt = getSalt(); + + // Encrypt character.settings.secrets if it exists + if (encryptedChar.settings?.secrets) { + encryptedChar.settings.secrets = encryptObjectValues(encryptedChar.settings.secrets, salt); + } + + // Encrypt character.secrets if it exists + if (encryptedChar.secrets) { + encryptedChar.secrets = encryptObjectValues(encryptedChar.secrets, salt); + } + + return encryptedChar; +} + +/** + * Decrypts sensitive data in a Character object + * @param {Character} character - The character object with encrypted secrets + * @param {IAgentRuntime} runtime - The runtime information needed for salt generation + * @returns {Character} - A copy of the character with decrypted secrets + */ +export function decryptedCharacter(character: Character, runtime: IAgentRuntime): Character { + // Create a deep copy to avoid modifying the original + const decryptedChar = JSON.parse(JSON.stringify(character)); + const salt = getSalt(); + + // Decrypt character.settings.secrets if it exists + if (decryptedChar.settings?.secrets) { + decryptedChar.settings.secrets = decryptObjectValues(decryptedChar.settings.secrets, salt); + } + + // Decrypt character.secrets if it exists + if (decryptedChar.secrets) { + decryptedChar.secrets = decryptObjectValues(decryptedChar.secrets, salt); + } + + return decryptedChar; +} + +/** + * Helper function to encrypt all string values in an object + * @param {Record} obj - Object with values to encrypt + * @param {string} salt - The salt to use for encryption + * @returns {Record} - Object with encrypted values + */ +export function encryptObjectValues(obj: Record, salt: string): Record { + const result: Record = {}; + + for (const [key, value] of Object.entries(obj)) { + if (typeof value === 'string' && value) { + result[key] = encryptStringValue(value, salt); + } else { + result[key] = value; + } + } + + return result; +} + +/** + * Helper function to decrypt all string values in an object + * @param {Record} obj - Object with encrypted values + * @param {string} salt - The salt to use for decryption + * @returns {Record} - Object with decrypted values + */ +export function decryptObjectValues(obj: Record, salt: string): Record { + const result: Record = {}; + + for (const [key, value] of Object.entries(obj)) { + if (typeof value === 'string' && value) { + result[key] = decryptStringValue(value, salt); + } else { + result[key] = value; + } + } + + return result; +} + +export { decryptStringValue as decryptSecret }; From 769acf2d81575e6c3ce0fd095db86fb99c1b24e3 Mon Sep 17 00:00:00 2001 From: Sayo Date: Mon, 24 Mar 2025 13:26:54 +0530 Subject: [PATCH 43/57] handle salt without agentId --- packages/core/src/settings.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/core/src/settings.ts b/packages/core/src/settings.ts index 1cebae4b326..0237719801e 100644 --- a/packages/core/src/settings.ts +++ b/packages/core/src/settings.ts @@ -44,11 +44,7 @@ export function getSalt(runtime?: IAgentRuntime): string { : (import.meta as any).env.SECRET_SALT) || 'secretsalt'; const agentId = runtime?.agentId; - if (!agentId) { - logger.warn('AgentId is missing when generating encryption salt'); - } - - const salt = secretSalt + (agentId || ''); + const salt = secretSalt; logger.debug(`Generated salt with length: ${salt.length} (truncated for security)`); return salt; } @@ -106,7 +102,9 @@ export function decryptStringValue(value: string, salt: string): string { // Split the IV and encrypted value const parts = value.split(':'); if (parts.length !== 2) { - logger.warn(`Invalid encrypted value format - expected 'iv:encrypted'`); + logger.warn( + `Invalid encrypted value format - expected 'iv:encrypted', returning original value` + ); return value; // Return the original value without decryption } From 28b25429e6f5c888369aee44d8f45ce58bbcd6d9 Mon Sep 17 00:00:00 2001 From: Sayo Date: Mon, 24 Mar 2025 13:28:20 +0530 Subject: [PATCH 44/57] clean up --- packages/core/src/settings.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/core/src/settings.ts b/packages/core/src/settings.ts index 0237719801e..4e0dc22a9aa 100644 --- a/packages/core/src/settings.ts +++ b/packages/core/src/settings.ts @@ -32,19 +32,22 @@ export function createSettingFromConfig(configSetting: Omit): } /** - * Retrieves the salt for the agent based on the provided runtime information. + * Retrieves the salt based on env variable SECRET_SALT * - * @param {IAgentRuntime} runtime - The runtime information of the agent. * @returns {string} The salt for the agent. */ -export function getSalt(runtime?: IAgentRuntime): string { +export function getSalt(): string { const secretSalt = (typeof process !== 'undefined' ? process.env.SECRET_SALT : (import.meta as any).env.SECRET_SALT) || 'secretsalt'; - const agentId = runtime?.agentId; + + if (!secretSalt) { + logger.error('SECRET_SALT is not set'); + } const salt = secretSalt; + logger.debug(`Generated salt with length: ${salt.length} (truncated for security)`); return salt; } From 41ee10d3d7ad150c3eb1043cc51d971efc55dffc Mon Sep 17 00:00:00 2001 From: Sayo Date: Mon, 24 Mar 2025 19:46:56 +0530 Subject: [PATCH 45/57] show client on received messages memory --- bun.lock | 21 +++++++++++++++++-- .../client/src/components/memory-viewer.tsx | 6 ++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/bun.lock b/bun.lock index 042442d7069..38df7719680 100644 --- a/bun.lock +++ b/bun.lock @@ -157,7 +157,7 @@ "date-fns": "^4.1.0", "dayjs": "^1.11.13", "eventemitter3": "^5.0.1", - "lucide-react": "^0.469.0", + "lucide-react": "^0.483.0", "react": "^19.0.0", "react-aiwriter": "^1.0.0", "react-dom": "^19.0.0", @@ -469,6 +469,21 @@ "whatwg-url": "7.1.0", }, }, + "packages/plugin-redpill": { + "name": "@elizaos/plugin-redpill", + "version": "1.0.0-beta.2", + "dependencies": { + "@ai-sdk/openai": "^1.1.9", + "@ai-sdk/ui-utils": "1.1.9", + "@elizaos/core": "^1.0.0-beta.2", + "ai": "^4.1.25", + "js-tiktoken": "^1.0.18", + "tsup": "8.4.0", + }, + "devDependencies": { + "prettier": "3.5.3", + }, + }, "packages/plugin-solana": { "name": "@elizaos/plugin-solana", "version": "1.0.0-beta.7", @@ -1320,6 +1335,8 @@ "@elizaos/plugin-pdf": ["@elizaos/plugin-pdf@workspace:packages/plugin-pdf"], + "@elizaos/plugin-redpill": ["@elizaos/plugin-redpill@workspace:packages/plugin-redpill"], + "@elizaos/plugin-solana": ["@elizaos/plugin-solana@workspace:packages/plugin-solana"], "@elizaos/plugin-sql": ["@elizaos/plugin-sql@workspace:packages/plugin-sql"], @@ -4268,7 +4285,7 @@ "lru-queue": ["lru-queue@0.1.0", "", { "dependencies": { "es5-ext": "~0.10.2" } }, "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ=="], - "lucide-react": ["lucide-react@0.469.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw=="], + "lucide-react": ["lucide-react@0.483.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-WldsY17Qb/T3VZdMnVQ9C3DDIP7h1ViDTHVdVGnLZcvHNg30zH/MTQ04RTORjexoGmpsXroiQXZ4QyR0kBy0FA=="], "lunr": ["lunr@2.3.9", "", {}, "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow=="], diff --git a/packages/client/src/components/memory-viewer.tsx b/packages/client/src/components/memory-viewer.tsx index 204e3f057ea..d4ecfb24d55 100644 --- a/packages/client/src/components/memory-viewer.tsx +++ b/packages/client/src/components/memory-viewer.tsx @@ -258,7 +258,13 @@ export function AgentMemoryViewer({ agentId, agentName }: { agentId: UUID; agent {content.actions.join(', ')} )} + {content.source && ( + + {content.source} + + )}
+ {timestamp} From fbea9f2985aa483bd1369d90d92dd7e38d96c195 Mon Sep 17 00:00:00 2001 From: 0xbbjoker <0xbbjoker@proton.me> Date: Mon, 24 Mar 2025 16:00:52 +0100 Subject: [PATCH 46/57] chore: encrypt character secrets from GUI --- packages/cli/src/server/api/agent.ts | 35 ++++++++++++++++++++++++++++ packages/core/src/settings.ts | 12 ++++++++++ 2 files changed, 47 insertions(+) diff --git a/packages/cli/src/server/api/agent.ts b/packages/cli/src/server/api/agent.ts index 0b397b88ba0..eb991a31d09 100644 --- a/packages/cli/src/server/api/agent.ts +++ b/packages/cli/src/server/api/agent.ts @@ -9,6 +9,9 @@ import { messageHandlerTemplate, validateUuid, MemoryType, + encryptStringValue, + getSalt, + encryptObjectValues, } from '@elizaos/core'; import express from 'express'; import fs from 'node:fs'; @@ -159,6 +162,13 @@ export function agentRouter( throw new Error('Failed to create character configuration'); } + // Encrypt secrets if they exist in the character + if (character.settings?.secrets) { + logger.debug('[AGENT CREATE] Encrypting secrets'); + const salt = getSalt(); + character.settings.secrets = encryptObjectValues(character.settings.secrets, salt); + } + await db.ensureAgentExists(character); res.status(201).json({ @@ -198,6 +208,31 @@ export function agentRouter( const updates = req.body; try { + // Handle encryption of secrets if present in updates + if (updates.settings?.secrets) { + const salt = getSalt(); + const encryptedSecrets: Record = {}; + + // Encrypt each secret value + // We need to handle null values separately + // because they mean delete the secret + Object.entries(updates.settings.secrets).forEach(([key, value]) => { + if (value === null) { + // Null means delete the secret + encryptedSecrets[key] = null; + } else if (typeof value === 'string') { + // Only encrypt string values + encryptedSecrets[key] = encryptStringValue(value, salt); + } else { + // Leave other types as is + encryptedSecrets[key] = value as string; + } + }); + + // Replace with encrypted secrets + updates.settings.secrets = encryptedSecrets; + } + // Handle other updates if any if (Object.keys(updates).length > 0) { await db.updateAgent(agentId, updates); diff --git a/packages/core/src/settings.ts b/packages/core/src/settings.ts index 4e0dc22a9aa..5d896db2570 100644 --- a/packages/core/src/settings.ts +++ b/packages/core/src/settings.ts @@ -60,6 +60,12 @@ export function getSalt(): string { */ export function encryptStringValue(value: string, salt: string): string { try { + // Check if value is undefined or null + if (value === undefined || value === null) { + logger.debug('Attempted to encrypt undefined or null value'); + return value; // Return the value as is (undefined or null) + } + // Check if value is already encrypted (has the format "iv:encrypted") const parts = value.split(':'); if (parts.length === 2) { @@ -102,6 +108,12 @@ export function encryptStringValue(value: string, salt: string): string { */ export function decryptStringValue(value: string, salt: string): string { try { + // Check if value is undefined or null + if (value === undefined || value === null) { + logger.debug('Attempted to decrypt undefined or null value'); + return value; // Return the value as is (undefined or null) + } + // Split the IV and encrypted value const parts = value.split(':'); if (parts.length !== 2) { From cbd1b76e7ebc60bad5034eced7710ff6494b2af0 Mon Sep 17 00:00:00 2001 From: Sayo Date: Tue, 25 Mar 2025 14:50:06 +0530 Subject: [PATCH 47/57] fix agent details display on cli --- bun.lock | 4 +- packages/cli/src/commands/agent.ts | 2 +- packages/cli/src/utils/helpers.ts | 110 ++++++++++++----------------- 3 files changed, 47 insertions(+), 69 deletions(-) diff --git a/bun.lock b/bun.lock index 38df7719680..4cf11692912 100644 --- a/bun.lock +++ b/bun.lock @@ -157,7 +157,7 @@ "date-fns": "^4.1.0", "dayjs": "^1.11.13", "eventemitter3": "^5.0.1", - "lucide-react": "^0.483.0", + "lucide-react": "^0.469.0", "react": "^19.0.0", "react-aiwriter": "^1.0.0", "react-dom": "^19.0.0", @@ -4285,7 +4285,7 @@ "lru-queue": ["lru-queue@0.1.0", "", { "dependencies": { "es5-ext": "~0.10.2" } }, "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ=="], - "lucide-react": ["lucide-react@0.483.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-WldsY17Qb/T3VZdMnVQ9C3DDIP7h1ViDTHVdVGnLZcvHNg30zH/MTQ04RTORjexoGmpsXroiQXZ4QyR0kBy0FA=="], + "lucide-react": ["lucide-react@0.469.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw=="], "lunr": ["lunr@2.3.9", "", {}, "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow=="], diff --git a/packages/cli/src/commands/agent.ts b/packages/cli/src/commands/agent.ts index bd272675fa9..3376e816792 100644 --- a/packages/cli/src/commands/agent.ts +++ b/packages/cli/src/commands/agent.ts @@ -8,7 +8,7 @@ import { Command } from 'commander'; const AGENT_RUNTIME_URL = process.env.AGENT_RUNTIME_URL?.replace(/\/$/, '') || - `http://localhost:${process.env.SERVER_PORT}`; + `http://localhost:${process.env.SERVER_PORT ?? 3000}`; const AGENTS_BASE_URL = `${AGENT_RUNTIME_URL}/api/agents`; // Define basic agent interface for type safety diff --git a/packages/cli/src/utils/helpers.ts b/packages/cli/src/utils/helpers.ts index 4538bd881cd..d8973f93d47 100644 --- a/packages/cli/src/utils/helpers.ts +++ b/packages/cli/src/utils/helpers.ts @@ -9,79 +9,31 @@ export function displayAgent(data: Partial, title = 'Agent Review'): void logHeader(title); // Display basic info - logger.info(`Name: ${data.name}`); - logger.info(`Username: ${data.username || data.name?.toLowerCase().replace(/\s+/g, '_')}`); + console.log(`Name: ${data.name}`); + console.log(`Username: ${data.username || data.name?.toLowerCase().replace(/\s+/g, '_')}`); - // Display bio - logger.info('\nBio:'); - for (const line of Array.isArray(data.bio) ? data.bio : [data.bio]) { - logger.info(` ${line}`); - } - - // Display adjectives - logger.info('\nAdjectives:'); - for (const adj of data.adjectives || []) { - logger.info(` ${adj}`); - } - - // Display topics - if (data.topics && data.topics.length > 0) { - logger.info('\nTopics:'); - for (const topic of data.topics) { - logger.info(` ${topic}`); - } - } + // Display sections + displaySection('Bio', Array.isArray(data.bio) ? data.bio : [data.bio]); + displaySection('Adjectives', data.adjectives); + displaySection('Topics', data.topics); + displaySection('Plugins', data.plugins); - // Display plugins - if (data.plugins && data.plugins.length > 0) { - logger.info('\nPlugins:'); - for (const plugin of data.plugins) { - logger.info(` ${plugin}`); - } - } - - // Display style + // Display style sections if (data.style) { - if (data.style.all && data.style.all.length > 0) { - logger.info('\nGeneral Style:'); - for (const style of data.style.all) { - logger.info(` ${style}`); - } - } - if (data.style.chat && data.style.chat.length > 0) { - logger.info('\nChat Style:'); - for (const style of data.style.chat) { - logger.info(` ${style}`); - } - } - if (data.style.post && data.style.post.length > 0) { - logger.info('\nPost Style:'); - for (const style of data.style.post) { - logger.info(` ${style}`); - } - } + displaySection('General Style', data.style.all); + displaySection('Chat Style', data.style.chat); + displaySection('Post Style', data.style.post); } - // Display post examples - if (data.postExamples && data.postExamples.length > 0) { - logger.info('\nPost Examples:'); - for (const post of data.postExamples) { - logger.info(` ${post}`); - } - } + displaySection('Post Examples', data.postExamples); // Display message examples if (data.messageExamples && data.messageExamples.length > 0) { - logger.info('\nMessage Examples:'); - logger.info( + console.log(`\n${colors.cyan('Message Examples:')}`); + console.log( data.messageExamples .map((conversation, i) => { - const messages = conversation - .map((msg) => { - const user = msg.name === '{{name1}}' ? 'Anon' : msg.name; - return `${user}: ${msg.content.text}`; - }) - .join('\n'); + const messages = formatConversation(conversation); return `\nConversation ${i + 1}:\n${messages}`; }) .join('\n') @@ -89,11 +41,35 @@ export function displayAgent(data: Partial, title = 'Agent Review'): void } } +/** + * Formats a conversation into a string + */ +function formatConversation(conversation: MessageExample[]): string { + return conversation + .map((msg) => { + const user = msg.name === '{{name1}}' ? 'Anon' : msg.name; + return `${user}: ${msg.content.text}`; + }) + .join('\n'); +} + +/** + * Displays a section with a title and list of items + */ +function displaySection(title: string, items: string[] | undefined): void { + if (!items || items.length === 0) return; + + console.log(`\n${colors.cyan(`${title}:`)}`); + for (const item of items) { + console.log(` ${item}`); + } +} + /** * Logs a header inside a rectangular frame with extra padding. * @param {string} title - The header text to display. */ -function logHeader(title) { +function logHeader(title: string): void { const padding = 2; // number of spaces on each side const titleStr = `=== ${title} ===`; const paddedTitle = ' '.repeat(padding) + titleStr + ' '.repeat(padding); @@ -102,8 +78,10 @@ function logHeader(title) { // Create top and bottom borders using Unicode box drawing characters const topBorder = colors.green(`┌${'─'.repeat(borderLength)}┐`); const bottomBorder = colors.green(`└${'─'.repeat(borderLength)}┘`); - const middleRow = colors.green(`│${paddedTitle}│`); + + const coloredTitle = `${' '.repeat(padding)}=== ${colors.green(title)} ===${' '.repeat(padding)}`; + const middleRow = colors.green('│') + coloredTitle + colors.green('│'); // Log the rectangle with a leading new line for spacing - logger.info(`\n${topBorder}\n${middleRow}\n${bottomBorder}`); + console.log(`\n${topBorder}\n${middleRow}\n${bottomBorder}`); } From 42d8fd95e9adbbec0be429380192e1cc06a48df9 Mon Sep 17 00:00:00 2001 From: Sayo Date: Tue, 25 Mar 2025 16:04:38 +0530 Subject: [PATCH 48/57] better error for connection --- packages/cli/src/commands/agent.ts | 12 +++++++++--- packages/cli/src/commands/create.ts | 4 ++-- packages/cli/src/commands/dev.ts | 4 ++-- packages/cli/src/commands/env.ts | 8 ++++---- packages/cli/src/commands/start.ts | 1 - packages/cli/src/displayBanner.ts | 18 ++++++++---------- packages/cli/src/index.ts | 2 +- packages/cli/src/utils/handle-error.ts | 10 +++++++++- 8 files changed, 35 insertions(+), 24 deletions(-) diff --git a/packages/cli/src/commands/agent.ts b/packages/cli/src/commands/agent.ts index 3376e816792..021fa86e74d 100644 --- a/packages/cli/src/commands/agent.ts +++ b/packages/cli/src/commands/agent.ts @@ -1,15 +1,15 @@ import fs from 'node:fs'; import path from 'node:path'; -import { handleError } from '@/src/utils/handle-error'; +import { checkServer, handleError } from '@/src/utils/handle-error'; import { displayAgent } from '@/src/utils/helpers'; import { logger } from '@elizaos/core'; import type { Agent } from '@elizaos/core'; import { Command } from 'commander'; -const AGENT_RUNTIME_URL = +export const AGENT_RUNTIME_URL = process.env.AGENT_RUNTIME_URL?.replace(/\/$/, '') || `http://localhost:${process.env.SERVER_PORT ?? 3000}`; -const AGENTS_BASE_URL = `${AGENT_RUNTIME_URL}/api/agents`; +export const AGENTS_BASE_URL = `${AGENT_RUNTIME_URL}/api/agents`; // Define basic agent interface for type safety /** @@ -140,6 +140,7 @@ agent process.exit(0); } catch (error) { + checkServer(); handleError(error); } }); @@ -180,6 +181,7 @@ agent process.exit(0); } catch (error) { + checkServer(); handleError(error); } }); @@ -283,6 +285,7 @@ agent logger.debug(`Successfully started agent ${result.name} (${result.id})`); } catch (error) { + checkServer(); handleError(error); } }); @@ -310,6 +313,7 @@ agent logger.success(`Successfully stopped agent ${opts.name}`); } catch (error) { + checkServer(); handleError(error); } }); @@ -340,6 +344,7 @@ agent // Server returns 204 No Content for successful deletion, no need to parse response logger.success(`Successfully removed agent ${opts.name}`); } catch (error) { + checkServer(); handleError(error); } }); @@ -396,6 +401,7 @@ agent `Successfully updated configuration for agent ${result?.id || resolvedAgentId}` ); } catch (error) { + checkServer(); handleError(error); } }); diff --git a/packages/cli/src/commands/create.ts b/packages/cli/src/commands/create.ts index ad7df92fe1f..188d3062165 100644 --- a/packages/cli/src/commands/create.ts +++ b/packages/cli/src/commands/create.ts @@ -1,6 +1,6 @@ import { buildProject } from '@/src/utils/build-project'; import { copyTemplate } from '@/src/utils/copy-template'; -import { handleError } from '@/src/utils/handle-error'; +import { checkServer, handleError } from '@/src/utils/handle-error'; import { runBunCommand } from '@/src/utils/run-bun'; import { logger } from '@elizaos/core'; import { Command } from 'commander'; @@ -99,7 +99,6 @@ export const create = new Command() .option('-t, --type ', 'type of template to use (project or plugin)', '') .argument('[name]', 'name for the project or plugin') .action(async (name, opts) => { - displayBanner(); try { // Parse options but use "" as the default for type to force prompting const initialOptions = { @@ -331,6 +330,7 @@ export const create = new Command() process.stdout.write(`\u001B]1337;CurrentDir=${targetDir}\u0007`); process.exit(0); } catch (error) { + checkServer(); handleError(error); } }); diff --git a/packages/cli/src/commands/dev.ts b/packages/cli/src/commands/dev.ts index 7b6b1e1ed55..6b556b922ff 100644 --- a/packages/cli/src/commands/dev.ts +++ b/packages/cli/src/commands/dev.ts @@ -197,7 +197,7 @@ async function watchDirectory(dir: string, onChange: () => void): Promise }; // Log file extensions we're watching - logger.info(`Will watch files with extensions: .ts, .js, .tsx, .jsx`); + logger.info('Will watch files with extensions: .ts, .js, .tsx, .jsx'); // Create a more direct and simple watcher pattern const watcher = chokidar.watch(dirToWatch, { @@ -370,7 +370,7 @@ export const dev = new Command() // Pass the rebuildAndRestart function as the onChange callback await watchDirectory(cwd, rebuildAndRestart); - logger.success(`Dev mode is active! The server will restart when files change.`); + logger.success('Dev mode is active! The server will restart when files change.'); logger.success('Press Ctrl+C to exit'); } else { logger.debug('Running in standalone mode without file watching.'); diff --git a/packages/cli/src/commands/env.ts b/packages/cli/src/commands/env.ts index 6002e8ebc0f..ac78f86a153 100644 --- a/packages/cli/src/commands/env.ts +++ b/packages/cli/src/commands/env.ts @@ -152,9 +152,9 @@ async function listEnvVars(): Promise { if (Object.keys(globalEnvVars).length === 0) { logger.info(' No global environment variables set'); } else { - Object.entries(globalEnvVars).forEach(([key, value]) => { + for (const [key, value] of Object.entries(globalEnvVars)) { logger.info(` ${colors.green(key)}: ${maskedValue(value)}`); - }); + } } if (localEnvPath) { @@ -162,9 +162,9 @@ async function listEnvVars(): Promise { if (Object.keys(localEnvVars).length === 0) { logger.info(' No local environment variables set'); } else { - Object.entries(localEnvVars).forEach(([key, value]) => { + for (const [key, value] of Object.entries(localEnvVars)) { logger.info(` ${colors.green(key)}: ${maskedValue(value)}`); - }); + } } } else { logger.info(colors.bold('\nNo local .env file found in the current directory')); diff --git a/packages/cli/src/commands/start.ts b/packages/cli/src/commands/start.ts index a1e904e8372..e4815a5cb96 100644 --- a/packages/cli/src/commands/start.ts +++ b/packages/cli/src/commands/start.ts @@ -556,7 +556,6 @@ export const start = new Command() .option('--character ', 'Path or URL to character file to use instead of default') .option('--build', 'Build the project before starting') .action(async (options) => { - displayBanner(); try { // Build the project first unless skip-build is specified if (options.build) { diff --git a/packages/cli/src/displayBanner.ts b/packages/cli/src/displayBanner.ts index 38d3c5c74f4..44d725c08cd 100644 --- a/packages/cli/src/displayBanner.ts +++ b/packages/cli/src/displayBanner.ts @@ -3,7 +3,7 @@ import fs from 'node:fs'; import path from 'node:path'; -export function displayBanner(version: string | null = null, hideBanner = false) { +export function displayBanner() { // Color ANSI escape codes const b = '\x1b[38;5;27m'; const lightblue = '\x1b[38;5;51m'; @@ -11,9 +11,9 @@ export function displayBanner(version: string | null = null, hideBanner = false) const r = '\x1b[0m'; const red = '\x1b[38;5;196m'; let versionColor = lightblue; - + let version = null; // assume __dirname doesnt exist - const __dirname = path.resolve(import.meta.dirname, '..'); + const __dirname = path.dirname(new URL(import.meta.url).pathname); if (!version) { const packageJsonPath = path.join(__dirname, 'package.json'); @@ -80,12 +80,10 @@ ${b}⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⢾⡃⠀⠀${w} // Randomly select and log one banner const randomBanner = banners[Math.floor(Math.random() * banners.length)]; - if (!hideBanner) { - console.log(randomBanner); - } else { - console.log(`*** elizaOS ***`); - } + console.log(randomBanner); - // log the version - console.log(`${versionColor}Version: ${version}${r}`); + if (version) { + // log the version + console.log(`${versionColor}Version: ${version}${r}`); + } } diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 4ba38c4abc7..fa4ff9b54cd 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -65,7 +65,7 @@ async function main() { // if no args are passed, display the banner if (process.argv.length === 2) { - displayBanner(version); + displayBanner(); } await program.parseAsync(); diff --git a/packages/cli/src/utils/handle-error.ts b/packages/cli/src/utils/handle-error.ts index 395f9308c23..c722ad987fd 100644 --- a/packages/cli/src/utils/handle-error.ts +++ b/packages/cli/src/utils/handle-error.ts @@ -1,5 +1,5 @@ import { logger } from '@elizaos/core'; - +import { AGENT_RUNTIME_URL } from '../commands/agent'; /** * Handles the error by logging it and exiting the process. * If the error is a string, it logs the error message and exits. @@ -19,3 +19,11 @@ export function handleError(error: unknown) { } process.exit(1); } + +export async function checkServer() { + const response = await fetch(`${AGENT_RUNTIME_URL}`); + if (!response.ok) { + console.error('Agent runtime server is not running'); + process.exit(1); + } +} From 0f2ebb2656b474aa47ca7ebc2f1e02c51c07c655 Mon Sep 17 00:00:00 2001 From: Sayo Date: Tue, 25 Mar 2025 16:19:41 +0530 Subject: [PATCH 49/57] fix display banner --- packages/cli/src/commands/agent.ts | 12 ++++++------ packages/cli/src/commands/create.ts | 4 +++- packages/cli/src/commands/start.ts | 3 ++- packages/cli/src/displayBanner.ts | 2 +- packages/cli/src/utils/handle-error.ts | 8 +++++--- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/packages/cli/src/commands/agent.ts b/packages/cli/src/commands/agent.ts index 021fa86e74d..3ad3b25dc12 100644 --- a/packages/cli/src/commands/agent.ts +++ b/packages/cli/src/commands/agent.ts @@ -140,7 +140,7 @@ agent process.exit(0); } catch (error) { - checkServer(); + await checkServer(); handleError(error); } }); @@ -181,7 +181,7 @@ agent process.exit(0); } catch (error) { - checkServer(); + await checkServer(); handleError(error); } }); @@ -285,7 +285,7 @@ agent logger.debug(`Successfully started agent ${result.name} (${result.id})`); } catch (error) { - checkServer(); + await checkServer(); handleError(error); } }); @@ -313,7 +313,7 @@ agent logger.success(`Successfully stopped agent ${opts.name}`); } catch (error) { - checkServer(); + await checkServer(); handleError(error); } }); @@ -344,7 +344,7 @@ agent // Server returns 204 No Content for successful deletion, no need to parse response logger.success(`Successfully removed agent ${opts.name}`); } catch (error) { - checkServer(); + await checkServer(); handleError(error); } }); @@ -401,7 +401,7 @@ agent `Successfully updated configuration for agent ${result?.id || resolvedAgentId}` ); } catch (error) { - checkServer(); + await checkServer(); handleError(error); } }); diff --git a/packages/cli/src/commands/create.ts b/packages/cli/src/commands/create.ts index 188d3062165..1b217b18dca 100644 --- a/packages/cli/src/commands/create.ts +++ b/packages/cli/src/commands/create.ts @@ -99,6 +99,8 @@ export const create = new Command() .option('-t, --type ', 'type of template to use (project or plugin)', '') .argument('[name]', 'name for the project or plugin') .action(async (name, opts) => { + displayBanner(); + try { // Parse options but use "" as the default for type to force prompting const initialOptions = { @@ -330,7 +332,7 @@ export const create = new Command() process.stdout.write(`\u001B]1337;CurrentDir=${targetDir}\u0007`); process.exit(0); } catch (error) { - checkServer(); + await checkServer(); handleError(error); } }); diff --git a/packages/cli/src/commands/start.ts b/packages/cli/src/commands/start.ts index e4815a5cb96..732a80a9c46 100644 --- a/packages/cli/src/commands/start.ts +++ b/packages/cli/src/commands/start.ts @@ -13,7 +13,6 @@ import fs from 'node:fs'; import path, { dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; import { character as defaultCharacter } from '../characters/eliza'; -import { displayBanner } from '../displayBanner'; import { AgentServer } from '../server/index'; import { jsonToCharacter, loadCharacterTryPath } from '../server/loader'; import { loadConfig, saveConfig } from '../utils/config-manager.js'; @@ -556,6 +555,8 @@ export const start = new Command() .option('--character ', 'Path or URL to character file to use instead of default') .option('--build', 'Build the project before starting') .action(async (options) => { + displayBanner(); + try { // Build the project first unless skip-build is specified if (options.build) { diff --git a/packages/cli/src/displayBanner.ts b/packages/cli/src/displayBanner.ts index 44d725c08cd..65b2e181efd 100644 --- a/packages/cli/src/displayBanner.ts +++ b/packages/cli/src/displayBanner.ts @@ -25,7 +25,7 @@ export function displayBanner() { } // if version includes "beta" or "alpha" then use red - if (version.includes('beta') || version.includes('alpha')) { + if (version?.includes('beta') || version?.includes('alpha')) { versionColor = red; } const banners = [ diff --git a/packages/cli/src/utils/handle-error.ts b/packages/cli/src/utils/handle-error.ts index c722ad987fd..bf77145b1ff 100644 --- a/packages/cli/src/utils/handle-error.ts +++ b/packages/cli/src/utils/handle-error.ts @@ -21,9 +21,11 @@ export function handleError(error: unknown) { } export async function checkServer() { - const response = await fetch(`${AGENT_RUNTIME_URL}`); - if (!response.ok) { - console.error('Agent runtime server is not running'); + try { + await fetch(`${AGENT_RUNTIME_URL}/api/ping`); + logger.success('ElizaOS server is running'); + } catch (error) { + logger.error('Unable to connect to ElizaOS server, likely not running!'); process.exit(1); } } From 69f787390e194f28c4c2342933a1b52930c01682 Mon Sep 17 00:00:00 2001 From: Sayo Date: Tue, 25 Mar 2025 16:29:08 +0530 Subject: [PATCH 50/57] fix remaining cli issues --- packages/cli/src/commands/start.ts | 2 +- packages/cli/src/displayBanner.ts | 26 +++++++++++++++----------- packages/cli/src/utils/handle-error.ts | 4 +++- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/packages/cli/src/commands/start.ts b/packages/cli/src/commands/start.ts index 732a80a9c46..35e188c1a3d 100644 --- a/packages/cli/src/commands/start.ts +++ b/packages/cli/src/commands/start.ts @@ -20,7 +20,7 @@ import { promptForEnvVars } from '../utils/env-prompt.js'; import { configureDatabaseSettings, loadEnvironment } from '../utils/get-config'; import { handleError } from '../utils/handle-error'; import { installPlugin } from '../utils/install-plugin'; - +import { displayBanner } from '../displayBanner'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); diff --git a/packages/cli/src/displayBanner.ts b/packages/cli/src/displayBanner.ts index 65b2e181efd..657848c9e6b 100644 --- a/packages/cli/src/displayBanner.ts +++ b/packages/cli/src/displayBanner.ts @@ -1,7 +1,8 @@ // Export function to display banner and version import fs from 'node:fs'; -import path from 'node:path'; +import path, { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; export function displayBanner() { // Color ANSI escape codes @@ -11,17 +12,20 @@ export function displayBanner() { const r = '\x1b[0m'; const red = '\x1b[38;5;196m'; let versionColor = lightblue; - let version = null; - // assume __dirname doesnt exist - const __dirname = path.dirname(new URL(import.meta.url).pathname); - if (!version) { - const packageJsonPath = path.join(__dirname, 'package.json'); - if (!fs.existsSync(packageJsonPath)) { - } else { - const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')); - version = packageJson.version; - } + // For ESM modules we need to use import.meta.url instead of __dirname + const __filename = fileURLToPath(import.meta.url); + const __dirname = dirname(__filename); + + // Find package.json relative to the current file + const packageJsonPath = path.resolve(__dirname, '../package.json'); + + // Add a simple check in case the path is incorrect + let version = '0.0.0'; // Fallback version + if (!fs.existsSync(packageJsonPath)) { + } else { + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')); + version = packageJson.version; } // if version includes "beta" or "alpha" then use red diff --git a/packages/cli/src/utils/handle-error.ts b/packages/cli/src/utils/handle-error.ts index bf77145b1ff..82bed9321d5 100644 --- a/packages/cli/src/utils/handle-error.ts +++ b/packages/cli/src/utils/handle-error.ts @@ -21,11 +21,13 @@ export function handleError(error: unknown) { } export async function checkServer() { + const red = '\x1b[38;5;196m'; + const r = '\x1b[0m'; try { await fetch(`${AGENT_RUNTIME_URL}/api/ping`); logger.success('ElizaOS server is running'); } catch (error) { - logger.error('Unable to connect to ElizaOS server, likely not running!'); + logger.error(`${red}Unable to connect to ElizaOS server, likely not running!${r}`); process.exit(1); } } From 734eed29ac7b311d29c175ba95e5496ce3cca045 Mon Sep 17 00:00:00 2001 From: Sayo Date: Tue, 25 Mar 2025 17:41:50 +0530 Subject: [PATCH 51/57] change default director for models and cache for localai --- packages/plugin-local-ai/src/index.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/plugin-local-ai/src/index.ts b/packages/plugin-local-ai/src/index.ts index cd823f54484..6f8878b4769 100644 --- a/packages/plugin-local-ai/src/index.ts +++ b/packages/plugin-local-ai/src/index.ts @@ -1,4 +1,5 @@ import fs from 'node:fs'; +import os from 'node:os'; import path from 'node:path'; import { Readable } from 'node:stream'; import { fileURLToPath } from 'node:url'; @@ -167,7 +168,7 @@ class LocalAIManager { */ private constructor() { // Set up models directory consistently, similar to cacheDir - const modelsDir = path.join(process.cwd(), 'models'); + const modelsDir = path.join(os.homedir(), '.eliza', 'models'); // Check if LLAMALOCAL_PATH is set if (process.env.LLAMALOCAL_PATH?.trim()) { @@ -191,7 +192,7 @@ class LocalAIManager { if (cacheDirEnv) { this.cacheDir = path.resolve(cacheDirEnv); } else { - const cacheDir = path.join(process.cwd(), 'cache'); + const cacheDir = path.join(os.homedir(), '.eliza', 'cache'); // Ensure cache directory exists if (!fs.existsSync(cacheDir)) { fs.mkdirSync(cacheDir, { recursive: true }); From 3b7cd02199eb731d1a54fd624b9418fd25642400 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Tue, 25 Mar 2025 10:42:04 -0400 Subject: [PATCH 52/57] adding in branch name --- .github/workflows/image.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index c9a8cc518f2..f2f8afb832a 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -3,6 +3,8 @@ name: Create and publish a Docker image # Configures this workflow to run every time a change is pushed to the branch called `release`. on: + branches: + - docker/*/*/* release: types: [created] workflow_dispatch: From 9efd7c85527f1e94868fab29b931da64f6dff4f0 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Tue, 25 Mar 2025 10:44:47 -0400 Subject: [PATCH 53/57] try again --- .github/workflows/image.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index f2f8afb832a..4472bb7d7c8 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -1,10 +1,9 @@ # name: Create and publish a Docker image -# Configures this workflow to run every time a change is pushed to the branch called `release`. on: - branches: - - docker/*/*/* + branches: + - docker/*/*/* release: types: [created] workflow_dispatch: From 37158cee53e442e20b5fda6ec254afbc6a6edd5f Mon Sep 17 00:00:00 2001 From: mike dupont Date: Tue, 25 Mar 2025 10:47:51 -0400 Subject: [PATCH 54/57] revert changes --- .github/workflows/image.yaml | 83 ++++++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 28 deletions(-) diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index 4472bb7d7c8..fab341a989d 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -1,71 +1,98 @@ -# name: Create and publish a Docker image on: - branches: - - docker/*/*/* - release: - types: [created] workflow_dispatch: + #push: + #pull_request: + # on: + push: + branches: + - main + - docker/*/*/* -# Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds. env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} -# There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu. jobs: build-and-push-image: runs-on: ubuntu-latest - # Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job. permissions: contents: read packages: write attestations: write id-token: write - # + steps: + #- name: Configure AWS credentials + # uses: meta-introspector/configure-aws-credentials@v4 + # with: + # aws-region: ${{ secrets.AWS_REGION || 'us-east-2'}} + # role-session-name: github-actions-${{ env.APP_NAME || 'eliza'}} + # # FIXME hard coded + # role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID || '767503528736' }}:role/github + + - name: Set up Docker Buildx + uses: meta-introspector/setup-buildx-action@v3.8.0 + with: + install: true + platforms: linux/amd64,linux/arm/v7,linux/arm/v8 + + # - name: Login to Amazon ECR + # id: login-ecr + # uses: meta-introspector/amazon-ecr-login@v1 + + - name: Set short sha + id: sha_short + run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + + - name: Login to Docker Hub + uses: meta-introspector/login-action@v3 + with: + username: ${{ vars.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} + - name: Checkout repository - uses: actions/checkout@v4 - # Uses the `docker/login-action` action to log in to the Container registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here. + uses: meta-introspector/checkout@v4 + - name: Log in to the Container registry - uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 + uses: meta-introspector/login-action@v3.0.0 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - # This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` "meta" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels. + - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + uses: meta-introspector/metadata-action@v5.5.1 with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - # This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages. - # It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see "[Usage](https://github.com/docker/build-push-action#usage)" in the README of the `docker/build-push-action` repository. - # It uses the `tags` and `labels` parameters to tag and label the image with the output from the "meta" step. + images: | + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + h4ckermike/elizaos-eliza + # ${{ steps.login-ecr.outputs.registry }}/${{ env.ECR_REPOSITORY || 'agent/eliza'}} - name: Build and push Docker image id: push - uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4 + uses: meta-introspector/build-push-action@v6.10.0 with: + platforms: linux/arm64,linux/arm64/v8 context: . push: true - tags: ${{ steps.meta.outputs.tags }} + tags: | + ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - # This step generates an artifact attestation for the image, which is an unforgeable statement about where and how it was built. It increases supply chain security for people who consume the image. For more information, see "[AUTOTITLE](/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds)." - name: Generate artifact attestation - uses: actions/attest-build-provenance@v1 + uses: meta-introspector/attest-build-provenance@local with: subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}} subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true - # This step makes the Docker image public, so users can pull it without authentication. - name: Make Docker image public run: | curl \ - -X PATCH \ - -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/user/packages/container/${{ env.IMAGE_NAME }}/visibility \ - -d '{"visibility":"public"}' + -X PATCH \ + -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/user/packages/container/${{ env.IMAGE_NAME }}/visibility \ + -d '{"visibility":"public"}' From 1f42919115d062e48e3f5b131841b9f216a4e68b Mon Sep 17 00:00:00 2001 From: Ting Chien Meng Date: Wed, 26 Mar 2025 01:39:54 +0800 Subject: [PATCH 55/57] only show text animation once remove onclick improve gh access token instructions, include link improve plugin name handling provide clear instruction to install plugin with bun fix remove-plugin little spelling fixes fix remove-plugin so it runs rm -rf fix post create plugin instructions Add shouldRespondOnlyToMentions option for discord add missing dep Fix Tailwind typos "flex-column" -> "flex-col"; fix excessive gap on msg list. prevent message overlap clean code env api env ui add envs use active tab state update local/global env works disable button when updating force PUT always fixed jsdoc-automation.yml and removed environment.test.ts Refactored SOL address handling in plugin-solana actions to use environment variables since no settings exported, and Solve the problem of the isTransferContent judgment logic. enable settings nav button null check allow character(s) loading --- .github/workflows/jsdoc-automation.yml | 52 ++- packages/cli/src/commands/create.ts | 2 +- packages/cli/src/commands/env.ts | 4 +- packages/cli/src/commands/project.ts | 120 ++++++- packages/cli/src/commands/start.ts | 213 +++++++----- packages/cli/src/server/api/env.ts | 155 +++++++++ packages/cli/src/server/api/index.ts | 14 +- packages/cli/src/server/loader.ts | 3 +- packages/cli/src/utils/github.ts | 24 +- packages/cli/src/utils/registry/index.ts | 83 ++++- packages/client/src/App.tsx | 2 + .../client/src/components/agent-settings.tsx | 8 +- .../client/src/components/app-sidebar.tsx | 12 +- packages/client/src/components/chat.tsx | 58 +++- .../client/src/components/env-settings.tsx | 317 ++++++++++++++++++ .../client/src/components/group-panel.tsx | 7 +- packages/client/src/components/room.tsx | 21 +- .../components/ui/chat/chat-message-list.tsx | 2 +- packages/client/src/lib/api.ts | 34 ++ packages/client/src/lib/socketio-manager.ts | 4 + packages/core/__tests__/environment.test.ts | 97 ------ packages/core/src/bootstrap.ts | 5 +- packages/core/src/types.ts | 2 + .../__tests__/messageManager.test.ts | 11 +- packages/plugin-discord/src/messages.ts | 7 + packages/plugin-solana/src/actions/swap.ts | 7 +- .../plugin-solana/src/actions/transfer.ts | 14 +- 27 files changed, 1000 insertions(+), 278 deletions(-) create mode 100644 packages/cli/src/server/api/env.ts create mode 100644 packages/client/src/components/env-settings.tsx delete mode 100644 packages/core/__tests__/environment.test.ts diff --git a/.github/workflows/jsdoc-automation.yml b/.github/workflows/jsdoc-automation.yml index eecad6caa95..d08130f5f57 100644 --- a/.github/workflows/jsdoc-automation.yml +++ b/.github/workflows/jsdoc-automation.yml @@ -8,11 +8,13 @@ on: required: true default: 'T' type: string + options: [T, F] readme: description: 'Generate README documentation (T/F)' required: true default: 'T' type: string + options: [T, F] pull_number: description: 'Pull Request Number (if not provided, scans root_directory) - PR must be merged to develop branch. DONT provide if `README documentation` is T from above' required: false @@ -41,9 +43,14 @@ on: jobs: generate-docs: runs-on: ubuntu-latest + container: debian:bullseye # Use Debian 11 as the execution environment + + permissions: + contents: write + pull-requests: write env: - GITHUB_ACCESS_TOKEN: ${{ secrets.AUTODOCS_GITHUB }} + GITHUB_ACCESS_TOKEN: ${{ secrets.GH_PAT }} OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} steps: @@ -52,10 +59,31 @@ jobs: with: fetch-depth: 0 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '23' + - name: Install Node.js + run: | + apt-get update + apt-get install -y curl + curl -fsSL https://deb.nodesource.com/setup_20.x | bash - + apt-get install -y nodejs + node -v + + - name: Install Python + run: | + apt-get update + apt-get install -y curl software-properties-common + apt-get install -y python3 python3-dev python3-venv python3-pip + python3 --version + which python3 + + - name: Install system dependencies + run: | + apt-get update -y + apt-get install -y --no-install-recommends \ + git \ + make \ + build-essential \ + unzip + - name: Install bun uses: oven-sh/setup-bun@v2 @@ -74,10 +102,10 @@ jobs: working-directory: packages/autodoc run: bun run autodoc env: - INPUT_ROOT_DIRECTORY: ${{ inputs.root_directory }} - INPUT_PULL_NUMBER: ${{ inputs.pull_number }} - INPUT_EXCLUDED_DIRECTORIES: ${{ inputs.excluded_directories }} - INPUT_REVIEWERS: ${{ inputs.reviewers }} - INPUT_BRANCH: ${{ inputs.branch }} - INPUT_JSDOC: ${{ inputs.jsdoc }} - INPUT_README: ${{ inputs.readme }} + INPUT_ROOT_DIRECTORY: ${{ github.event.inputs.root_directory }} + INPUT_PULL_NUMBER: ${{ github.event.inputs.pull_number }} + INPUT_EXCLUDED_DIRECTORIES: ${{ github.event.inputs.excluded_directories }} + INPUT_REVIEWERS: ${{ github.event.inputs.reviewers }} + INPUT_BRANCH: ${{ github.event.inputs.branch }} + INPUT_JSDOC: ${{ github.event.inputs.jsdoc }} + INPUT_README: ${{ github.event.inputs.readme }} diff --git a/packages/cli/src/commands/create.ts b/packages/cli/src/commands/create.ts index 1b217b18dca..d60c48baeaf 100644 --- a/packages/cli/src/commands/create.ts +++ b/packages/cli/src/commands/create.ts @@ -252,7 +252,7 @@ export const create = new Command() 1. \`cd ${cdPath}\` to change into your plugin directory 2. \`${colors.cyan('npx elizaos start')}\` to start development 3. \`${colors.cyan('npx elizaos test')}\` to test your plugin -4. \`${colors.cyan('npx elizaos publish')}\` to publish your plugin to the registry`); +4. \`${colors.cyan('npx elizaos plugin publish')}\` to publish your plugin to the registry`); // Set the user's shell working directory before exiting // Note: This only works if the CLI is run with shell integration diff --git a/packages/cli/src/commands/env.ts b/packages/cli/src/commands/env.ts index ac78f86a153..4cd45103ead 100644 --- a/packages/cli/src/commands/env.ts +++ b/packages/cli/src/commands/env.ts @@ -71,7 +71,7 @@ async function saveCustomEnvPath(customPath: string): Promise { * Get the path to the global .env file in the user's home directory or custom location * @returns The path to the global .env file */ -async function getGlobalEnvPath(): Promise { +export async function getGlobalEnvPath(): Promise { const customPath = await getCustomEnvPath(); if (customPath) { return customPath; @@ -96,7 +96,7 @@ function getLocalEnvPath(): string | null { * @param filePath Path to the .env file * @returns Object containing the key-value pairs */ -async function parseEnvFile(filePath: string): Promise> { +export async function parseEnvFile(filePath: string): Promise> { try { if (!existsSync(filePath)) { return {}; diff --git a/packages/cli/src/commands/project.ts b/packages/cli/src/commands/project.ts index 5d5b73d1360..f519f9c258a 100644 --- a/packages/cli/src/commands/project.ts +++ b/packages/cli/src/commands/project.ts @@ -4,10 +4,13 @@ import { getLocalRegistryIndex, getPluginRepository, getRegistryIndex, + normalizePluginName, } from '@/src/utils/registry/index'; import { logger } from '@elizaos/core'; import { Command } from 'commander'; import { execa } from 'execa'; +import path from 'path'; +import fs from 'fs'; export const project = new Command().name('project').description('Manage an ElizaOS project'); @@ -44,16 +47,71 @@ project project .command('add-plugin') .description('add a plugin to the project') - .argument('', 'plugin name') + .argument('', 'plugin name (e.g., "abc", "plugin-abc", "elizaos/plugin-abc")') .option('--no-env-prompt', 'Skip prompting for environment variables') .action(async (plugin, opts) => { try { const cwd = process.cwd(); + // Check if we're running under npx + const isNpx = + process.env.npm_lifecycle_event === 'npx' || + process.env.npm_execpath?.includes('npx') || + process.argv[0]?.includes('npx') || + process.env.npm_config_user_agent?.includes('npm') || + process.env._?.includes('npx') || + !!process.env.npm_command; + + // If running under npx, provide clear instructions instead + if (isNpx) { + // Extract and normalize the plugin name + let baseName = plugin; + + // Handle various input formats + if (plugin.includes('/')) { + // Handle formats like "elizaos/plugin-ton" or "elizaos-plugins/plugin-ton" + const parts = plugin.split('/'); + baseName = parts[parts.length - 1]; + } else if (plugin.startsWith('@')) { + // Handle scoped package format like "@elizaos/plugin-ton" + const parts = plugin.split('/'); + if (parts.length > 1) { + baseName = parts[1]; + } + } + + // Remove any existing prefixes and ensure plugin- prefix is added + baseName = baseName.replace(/^plugin-/, ''); + const pluginName = `plugin-${baseName}`; + + const installCommand = `bun add github:elizaos-plugins/${pluginName}`; + + // Use ANSI color codes + const boldCyan = '\x1b[1;36m'; // Bold cyan for command + const bold = '\x1b[1m'; // Bold for headers + const reset = '\x1b[0m'; // Reset formatting + + // Print entire message with console.log to avoid timestamps and prefixes + console.log( + `\n📦 ${bold}To install ${pluginName}, you need to manually run this command:${reset}\n` + ); + console.log(` ${boldCyan}${installCommand}${reset}\n`); + console.log(`Copy and paste the above command into your terminal to install the plugin.\n`); + + process.exit(0); + } + const repo = await getPluginRepository(plugin); if (!repo) { - logger.error(`Plugin ${plugin} not found in registry`); + logger.error(`Plugin "${plugin}" not found in registry`); + logger.info('\nYou can specify plugins in multiple formats:'); + logger.info(' - Just the name: ton'); + logger.info(' - With plugin- prefix: plugin-abc'); + logger.info(' - With organization: elizaos/plugin-abc'); + logger.info(' - Full package name: @elizaos-plugins/plugin-abc'); + logger.info('\nTry listing available plugins with:'); + logger.info(' npx elizaos project list-plugins'); process.exit(1); } @@ -70,11 +128,60 @@ project project .command('remove-plugin') .description('remove a plugin from the project') - .argument('', 'plugin name') + .argument('', 'plugin name (e.g., "abc", "plugin-abc", "elizaos/plugin-abc")') .action(async (plugin, _opts) => { try { const cwd = process.cwd(); + // Check if we're running under npx (reusing same logic as add-plugin) + const isNpx = + process.env.npm_lifecycle_event === 'npx' || + process.env.npm_execpath?.includes('npx') || + process.argv[0]?.includes('npx') || + process.env.npm_config_user_agent?.includes('npm') || + process.env._?.includes('npx') || + !!process.env.npm_command; + + // If running under npx, provide clear instructions instead + if (isNpx) { + // Extract and normalize the plugin name + let baseName = plugin; + + // Handle various input formats + if (plugin.includes('/')) { + // Handle formats like "elizaos/plugin-ton" or "elizaos-plugins/plugin-ton" + const parts = plugin.split('/'); + baseName = parts[parts.length - 1]; + } else if (plugin.startsWith('@')) { + // Handle scoped package format like "@elizaos/plugin-ton" + const parts = plugin.split('/'); + if (parts.length > 1) { + baseName = parts[1]; + } + } + + // Remove any existing prefixes and ensure plugin- prefix is added + baseName = baseName.replace(/^plugin-/, ''); + const pluginName = `plugin-${baseName}`; + + // For removing, we need the package name + const removeCommand = `bun remove @elizaos/${pluginName} && rm -rf ${pluginName}`; + + // Use ANSI color codes + const boldCyan = '\x1b[1;36m'; // Bold cyan for command + const bold = '\x1b[1m'; // Bold for headers + const reset = '\x1b[0m'; // Reset formatting + + // Print entire message with console.log to avoid timestamps and prefixes + console.log( + `\n🗑️ ${bold}To remove ${pluginName}, you need to manually run this command:${reset}\n` + ); + console.log(` ${boldCyan}${removeCommand}${reset}\n`); + console.log(`Copy and paste the above command into your terminal to remove the plugin.\n`); + + process.exit(0); + } + // Uninstall package logger.info(`Removing ${plugin}...`); await execa('bun', ['remove', plugin], { @@ -82,6 +189,13 @@ project stdio: 'inherit', }); + // Remove plugin directory if it exists + const pluginDir = path.join(cwd, plugin.replace(/^@elizaos\//, '').replace(/^plugin-/, '')); + if (fs.existsSync(pluginDir)) { + logger.info(`Removing plugin directory ${pluginDir}...`); + fs.rmSync(pluginDir, { recursive: true, force: true }); + } + logger.success(`Successfully removed ${plugin}`); } catch (error) { handleError(error); diff --git a/packages/cli/src/commands/start.ts b/packages/cli/src/commands/start.ts index 35e188c1a3d..a707eb0c68b 100644 --- a/packages/cli/src/commands/start.ts +++ b/packages/cli/src/commands/start.ts @@ -12,7 +12,7 @@ import { Command } from 'commander'; import fs from 'node:fs'; import path, { dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; -import { character as defaultCharacter } from '../characters/eliza'; +import { character, character as defaultCharacter } from '../characters/eliza'; import { AgentServer } from '../server/index'; import { jsonToCharacter, loadCharacterTryPath } from '../server/loader'; import { loadConfig, saveConfig } from '../utils/config-manager.js'; @@ -258,7 +258,11 @@ async function stopAgent(runtime: IAgentRuntime, server: AgentServer) { * @param {Object} options - Command options * @returns {Promise} A promise that resolves when the agents are successfully started. */ -const startAgents = async (options: { configure?: boolean; port?: number; character?: string }) => { +const startAgents = async (options: { + configure?: boolean; + port?: number; + characters?: Character[]; +}) => { // Load environment variables from project .env or .eliza/.env await loadEnvironment(); @@ -444,108 +448,128 @@ const startAgents = async (options: { configure?: boolean; port?: number; charac server.start(serverPort); - console.log(''); + // if characters are provided, start the agents with the characters + if (options.characters) { + for (const character of options.characters) { + // make sure character has sql plugin + if (!character.plugins.includes('@elizaos/plugin-sql')) { + character.plugins.push('@elizaos/plugin-sql'); + } - // Start agents based on project, plugin, or custom configuration - if (isProject && projectModule?.default) { - // Load all project agents, call their init and register their plugins - const project = projectModule.default; + // make sure character has at least one ai provider + if (process.env.OPENAI_API_KEY) { + character.plugins.push('@elizaos/plugin-openai'); + } else if (process.env.ANTHROPIC_API_KEY) { + character.plugins.push('@elizaos/plugin-anthropic'); + } else { + character.plugins.push('@elizaos/plugin-local-ai'); + } - // Handle both formats: project with agents array and project with single agent - const agents = Array.isArray(project.agents) - ? project.agents - : project.agent - ? [project.agent] - : []; + await startAgent(character, server); + } + } else { + // Start agents based on project, plugin, or custom configuration + if (isProject && projectModule?.default) { + // Load all project agents, call their init and register their plugins + const project = projectModule.default; - if (agents.length > 0) { - logger.debug(`Found ${agents.length} agents in project`); + // Handle both formats: project with agents array and project with single agent + const agents = Array.isArray(project.agents) + ? project.agents + : project.agent + ? [project.agent] + : []; - // Prompt for environment variables for all plugins in the project - try { - await promptForProjectPlugins(project); - } catch (error) { - logger.warn(`Failed to prompt for project environment variables: ${error}`); - } + if (agents.length > 0) { + logger.debug(`Found ${agents.length} agents in project`); - const startedAgents = []; - for (const agent of agents) { + // Prompt for environment variables for all plugins in the project try { - logger.debug(`Starting agent: ${agent.character.name}`); - const runtime = await startAgent( - agent.character, - server, - agent.init, - agent.plugins || [] - ); - startedAgents.push(runtime); - // wait .5 seconds - await new Promise((resolve) => setTimeout(resolve, 500)); - } catch (agentError) { - logger.error(`Error starting agent ${agent.character.name}: ${agentError}`); + await promptForProjectPlugins(project); + } catch (error) { + logger.warn(`Failed to prompt for project environment variables: ${error}`); } - } - if (startedAgents.length === 0) { - logger.warn('Failed to start any agents from project, falling back to custom character'); - await startAgent(defaultCharacter, server); + const startedAgents = []; + for (const agent of agents) { + try { + logger.debug(`Starting agent: ${agent.character.name}`); + const runtime = await startAgent( + agent.character, + server, + agent.init, + agent.plugins || [] + ); + startedAgents.push(runtime); + // wait .5 seconds + await new Promise((resolve) => setTimeout(resolve, 500)); + } catch (agentError) { + logger.error(`Error starting agent ${agent.character.name}: ${agentError}`); + } + } + + if (startedAgents.length === 0) { + logger.warn('Failed to start any agents from project, falling back to custom character'); + await startAgent(defaultCharacter, server); + } else { + logger.debug(`Successfully started ${startedAgents.length} agents from project`); + } } else { - logger.debug(`Successfully started ${startedAgents.length} agents from project`); + logger.debug('Project found but no agents defined, falling back to custom character'); + await startAgent(defaultCharacter, server); } - } else { - logger.debug('Project found but no agents defined, falling back to custom character'); - await startAgent(defaultCharacter, server); - } - } else if (isPlugin && pluginModule) { - // Before starting with the plugin, prompt for any environment variables it needs - if (pluginModule.name) { - try { - await promptForEnvVars(pluginModule.name); - } catch (error) { - logger.warn(`Failed to prompt for plugin environment variables: ${error}`); + } else if (isPlugin && pluginModule) { + // Before starting with the plugin, prompt for any environment variables it needs + if (pluginModule.name) { + try { + await promptForEnvVars(pluginModule.name); + } catch (error) { + logger.warn(`Failed to prompt for plugin environment variables: ${error}`); + } } - } - - // Load the default character with all its default plugins, then add the test plugin - logger.info( - `Starting default Eliza character with plugin: ${pluginModule.name || 'unnamed plugin'}` - ); - - // Import the default character with all its plugins - const { character: defaultElizaCharacter } = await import('../characters/eliza'); - // Create an array of plugins, including the explicitly loaded one - // We're using our test plugin plus all the plugins from the default character - const pluginsToLoad = [pluginModule]; - - logger.debug( - `Using default character with plugins: ${defaultElizaCharacter.plugins.join(', ')}` - ); - logger.info("Plugin test mode: Using default character's plugins plus the plugin being tested"); - - // Start the agent with the default character and our test plugin - // We're in plugin test mode, so we should skip auto-loading embedding models - await startAgent(defaultElizaCharacter, server, undefined, pluginsToLoad, { - isPluginTestMode: true, - }); - logger.info('Character started with plugin successfully'); - } else { - // When not in a project or plugin, load the default character with all plugins - const { character: defaultElizaCharacter } = await import('../characters/eliza'); - logger.info('Using default Eliza character with all plugins'); - await startAgent(defaultElizaCharacter, server); - } + // Load the default character with all its default plugins, then add the test plugin + logger.info( + `Starting default Eliza character with plugin: ${pluginModule.name || 'unnamed plugin'}` + ); + + // Import the default character with all its plugins + const { character: defaultElizaCharacter } = await import('../characters/eliza'); + + // Create an array of plugins, including the explicitly loaded one + // We're using our test plugin plus all the plugins from the default character + const pluginsToLoad = [pluginModule]; + + logger.debug( + `Using default character with plugins: ${defaultElizaCharacter.plugins.join(', ')}` + ); + logger.info( + "Plugin test mode: Using default character's plugins plus the plugin being tested" + ); + + // Start the agent with the default character and our test plugin + // We're in plugin test mode, so we should skip auto-loading embedding models + await startAgent(defaultElizaCharacter, server, undefined, pluginsToLoad, { + isPluginTestMode: true, + }); + logger.info('Character started with plugin successfully'); + } else { + // When not in a project or plugin, load the default character with all plugins + const { character: defaultElizaCharacter } = await import('../characters/eliza'); + logger.info('Using default Eliza character with all plugins'); + await startAgent(defaultElizaCharacter, server); + } - // Display link to the client UI - // First try to find it in the CLI package dist/client directory - let clientPath = path.join(__dirname, '../../client'); + // Display link to the client UI + // First try to find it in the CLI package dist/client directory + let clientPath = path.join(__dirname, '../../client'); - // If not found, fall back to the old relative path for development - if (!fs.existsSync(clientPath)) { - clientPath = path.join(__dirname, '../../../..', 'client/dist'); + // If not found, fall back to the old relative path for development + if (!fs.existsSync(clientPath)) { + clientPath = path.join(__dirname, '../../../..', 'client/dist'); + } } }; - // Create command that can be imported directly export const start = new Command() .name('start') @@ -567,9 +591,18 @@ export const start = new Command() const characterPath = options.character; if (characterPath) { - logger.info(`Loading character from ${characterPath}`); + options.characters = []; try { - const characterData = await loadCharacterTryPath(characterPath); + // if character path is a comma separated list, load all characters + // can be remote path also + if (characterPath.includes(',')) { + const characterPaths = characterPath.split(','); + for (const characterPath of characterPaths) { + logger.info(`Loading character from ${characterPath}`); + const characterData = await loadCharacterTryPath(characterPath); + options.characters.push(characterData); + } + } await startAgents(options); } catch (error) { logger.error(`Failed to load character: ${error}`); diff --git a/packages/cli/src/server/api/env.ts b/packages/cli/src/server/api/env.ts new file mode 100644 index 00000000000..3ffd885d8b9 --- /dev/null +++ b/packages/cli/src/server/api/env.ts @@ -0,0 +1,155 @@ +import { logger } from '@elizaos/core'; +import express from 'express'; +import { parseEnvFile, getGlobalEnvPath } from '@/src/commands/env'; +import path from 'node:path'; +import { existsSync, writeFileSync } from 'fs'; + +function serializeEnvObject(envObj: Record): string { + return Object.entries(envObj) + .map(([key, val]) => `${key}=${val ?? ''}`) + .join('\n\n'); +} + +function findUpFile(filename: string, startDir: string = process.cwd()): string | null { + let currentDir = startDir; + + while (true) { + const fullPath = path.join(currentDir, filename); + if (existsSync(fullPath)) return fullPath; + + const parentDir = path.dirname(currentDir); + if (parentDir === currentDir) { + return null; // Reached root + } + currentDir = parentDir; + } +} + +function getLocalEnvPath(): string | null { + const envPath = findUpFile('.env'); + return envPath; +} + +export function envRouter(): express.Router { + const router = express.Router(); + + router.get('/local', async (req, res) => { + try { + const localEnvPath = getLocalEnvPath(); + const localEnvs = await parseEnvFile(localEnvPath); + + res.json({ + success: true, + data: localEnvs, + }); + } catch (error) { + logger.error(`[ENVS GET] Error retrieving local envs`, error); + res.status(500).json({ + success: false, + error: { + code: 'FETCH_ERROR', + message: 'Failed to retrieve local envs', + details: error.message, + }, + }); + } + }); + + router.post('/local', async (req, res) => { + try { + const { content } = req.body; + + if (!content || typeof content !== 'object') { + res.status(400).json({ + success: false, + error: { + code: 'INVALID_INPUT', + message: 'Missing or invalid "content" in request body', + }, + }); + } + + const localEnvPath = getLocalEnvPath(); + if (!localEnvPath) throw new Error('Local .env file not found'); + + const envString = serializeEnvObject(content); + writeFileSync(localEnvPath, envString, 'utf-8'); + + res.json({ + success: true, + message: 'Local env updated', + }); + } catch (error) { + logger.error(`[ENVS POST] Error updating local envs`, error); + res.status(500).json({ + success: false, + error: { + code: 'UPDATE_ERROR', + message: 'Failed to update local envs', + details: error.message, + }, + }); + } + }); + + router.get('/global', async (req, res) => { + try { + const globalEnvPath = await getGlobalEnvPath(); + const globalEnvs = await parseEnvFile(globalEnvPath); + + res.json({ + success: true, + data: globalEnvs, + }); + } catch (error) { + logger.error(`[ENVS GET] Error retrieving global envs`, error); + res.status(500).json({ + success: false, + error: { + code: 'FETCH_ERROR', + message: 'Failed to retrieve global envs', + details: error.message, + }, + }); + } + }); + + router.post('/global', async (req, res) => { + try { + const { content } = req.body; + + if (!content || typeof content !== 'object') { + res.status(400).json({ + success: false, + error: { + code: 'INVALID_INPUT', + message: 'Missing or invalid "content" in request body', + }, + }); + } + + const globalEnvPath = await getGlobalEnvPath(); + if (!globalEnvPath) throw new Error('Global .env file not found'); + + const envString = serializeEnvObject(content); + writeFileSync(globalEnvPath, envString, 'utf-8'); + + res.json({ + success: true, + message: 'Global env updated', + }); + } catch (error) { + logger.error(`[ENVS POST] Error updating global envs`, error); + res.status(500).json({ + success: false, + error: { + code: 'UPDATE_ERROR', + message: 'Failed to update global envs', + details: error.message, + }, + }); + } + }); + + return router; +} diff --git a/packages/cli/src/server/api/index.ts b/packages/cli/src/server/api/index.ts index 74461651aba..577d0b700db 100644 --- a/packages/cli/src/server/api/index.ts +++ b/packages/cli/src/server/api/index.ts @@ -12,6 +12,7 @@ import { SOCKET_MESSAGE_TYPE, EventType, ChannelType } from '@elizaos/core'; import http from 'node:http'; import crypto from 'node:crypto'; import { worldRouter } from './world'; +import { envRouter } from './env'; // Custom levels from @elizaos/core logger const LOG_LEVELS = { @@ -77,6 +78,7 @@ export function setupSocketIO( const payload = messageData.payload; const socketRoomId = payload.roomId; const worldId = payload.worldId; + const senderId = payload.senderId; // Get all agents in this room const agentsInRoom = roomParticipants.get(socketRoomId) || new Set([socketRoomId as UUID]); @@ -92,7 +94,7 @@ export function setupSocketIO( } // Ensure the sender and recipient are different agents - if (payload.senderId === agentId) { + if (senderId === agentId) { logger.debug(`Message sender and recipient are the same agent (${agentId}), ignoring.`); continue; } @@ -101,7 +103,7 @@ export function setupSocketIO( logger.warn(`no message found`); continue; } - const entityId = createUniqueUuid(agentRuntime, payload.senderId); + const entityId = createUniqueUuid(agentRuntime, senderId); const uniqueRoomId = createUniqueUuid(agentRuntime, socketRoomId); const source = payload.source; @@ -247,6 +249,13 @@ export function setupSocketIO( runtime: agentRuntime, message: newMessage, callback, + onComplete: () => { + io.emit('messageComplete', { + roomId: socketRoomId, + agentId, + senderId, + }); + }, }); } catch (error) { logger.error('Error processing message:', error); @@ -529,6 +538,7 @@ export function createApiRouter( // Mount sub-routers router.use('/agents', agentRouter(agents, server)); router.use('/world', worldRouter(server)); + router.use('/envs', envRouter()); router.use('/tee', teeRouter(agents)); router.get('/stop', (_req, res) => { diff --git a/packages/cli/src/server/loader.ts b/packages/cli/src/server/loader.ts index 2b4c7d52665..9edab8e0c3c 100644 --- a/packages/cli/src/server/loader.ts +++ b/packages/cli/src/server/loader.ts @@ -137,12 +137,13 @@ export async function loadCharacterTryPath(characterPath: string): Promise setTimeout(resolve, 100)); + + // Then prompt for the username with a simple message const { promptedUsername } = await prompt.default({ type: 'text', name: 'promptedUsername', diff --git a/packages/cli/src/utils/registry/index.ts b/packages/cli/src/utils/registry/index.ts index 1694c5d580e..7ed1b763776 100644 --- a/packages/cli/src/utils/registry/index.ts +++ b/packages/cli/src/utils/registry/index.ts @@ -318,6 +318,44 @@ export async function getRegistryIndex(): Promise> { return result; } +/** + * Normalizes a plugin name to the expected format in the registry + * + * @param {string} pluginName - The name of the plugin to normalize + * @returns {string[]} An array of possible normalized plugin names to try + */ +export function normalizePluginName(pluginName: string): string[] { + // Extract the base name without any organization prefix + let baseName = pluginName; + + // Handle various input formats + if (pluginName.includes('/')) { + // Handle formats like "elizaos/plugin-ton" or "elizaos-plugins/plugin-ton" + const parts = pluginName.split('/'); + baseName = parts[parts.length - 1]; + } else if (pluginName.startsWith('@')) { + // Handle scoped package format like "@elizaos/plugin-ton" + const parts = pluginName.split('/'); + if (parts.length > 1) { + baseName = parts[1]; + } + } + + // Remove any existing prefixes + baseName = baseName.replace(/^plugin-/, ''); + + // Generate all possible formats to try + return [ + pluginName, // Original input + baseName, // Just the base name + `plugin-${baseName}`, // With plugin- prefix + `@elizaos/${baseName}`, // Scoped with elizaos + `@elizaos/plugin-${baseName}`, // Scoped with elizaos and plugin prefix + `@elizaos-plugins/${baseName}`, // Scoped with elizaos-plugins + `@elizaos-plugins/plugin-${baseName}`, // Scoped with elizaos-plugins and plugin prefix + ]; +} + /** * Retrieves the repository URL for a given plugin from the registry. * @@ -327,25 +365,44 @@ export async function getRegistryIndex(): Promise> { */ export async function getPluginRepository(pluginName: string): Promise { try { + // Get all possible plugin name formats to try + const possibleNames = normalizePluginName(pluginName); + // First try getting from the local/public registry const registry = await getLocalRegistryIndex(); - if (registry[pluginName]) { - return registry[pluginName]; + + // Try each possible name format in the registry + for (const name of possibleNames) { + if (registry[name]) { + logger.debug(`Found plugin in registry as: ${name}`); + return registry[name]; + } } // Fall back to authenticated method if needed - const metadata = await getPluginMetadata(pluginName); - return metadata?.repository || null; - } catch (error) { - logger.debug(`Error getting plugin repository for ${pluginName}: ${error.message}`); - // Fall back to authenticated method - try { - const metadata = await getPluginMetadata(pluginName); - return metadata?.repository || null; - } catch (fallbackError) { - logger.error(`Failed to get plugin repository: ${fallbackError.message}`); - return null; + for (const name of possibleNames) { + try { + const metadata = await getPluginMetadata(name); + if (metadata?.repository) { + logger.debug(`Found plugin metadata for: ${name}`); + return metadata.repository; + } + } catch (error) { + // Continue to the next name format + logger.debug(`No metadata found for ${name}`); + } } + + // Direct GitHub shorthand (github:org/repo) + if (!pluginName.includes(':') && !pluginName.startsWith('@')) { + const baseName = pluginName.replace(/^plugin-/, ''); + return `github:elizaos-plugins/plugin-${baseName}`; + } + + return null; + } catch (error) { + logger.debug(`Error getting plugin repository: ${error.message}`); + return null; } } diff --git a/packages/client/src/App.tsx b/packages/client/src/App.tsx index 2fd5834e65f..eceabac5f2d 100644 --- a/packages/client/src/App.tsx +++ b/packages/client/src/App.tsx @@ -16,6 +16,7 @@ import Room from './routes/room'; import AgentCreatorRoute from './routes/createAgent'; import Home from './routes/home'; import Settings from './routes/settings'; +import EnvSettings from './components/env-settings'; // Create a query client with optimized settings const queryClient = new QueryClient({ @@ -88,6 +89,7 @@ function App() { } /> } /> } /> + } /> diff --git a/packages/client/src/components/agent-settings.tsx b/packages/client/src/components/agent-settings.tsx index 5ad59ca362c..72e29714f05 100644 --- a/packages/client/src/components/agent-settings.tsx +++ b/packages/client/src/components/agent-settings.tsx @@ -1,10 +1,9 @@ import CharacterForm from '@/components/character-form'; -import { useToast } from '@/hooks/use-toast'; import { useAgentUpdate } from '@/hooks/use-agent-update'; +import { useToast } from '@/hooks/use-toast'; import { apiClient } from '@/lib/api'; import type { Agent, UUID } from '@elizaos/core'; import { useQueryClient } from '@tanstack/react-query'; -import { useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import AvatarPanel from './avatar-panel'; import PluginsPanel from './plugins-panel'; @@ -18,9 +17,6 @@ export default function AgentSettings({ agent, agentId }: { agent: Agent; agentI // Use our enhanced agent update hook for more intelligent handling of JSONb fields const agentState = useAgentUpdate(agent); - // Log whenever agent state changes - useEffect(() => {}, [agentState.agent]); - const handleSubmit = async () => { try { if (!agentId) { @@ -111,7 +107,7 @@ export default function AgentSettings({ agent, agentId }: { agent: Agent; agentI { - if (updatedAgent.settings && updatedAgent.settings.secrets) { + if (updatedAgent.settings?.secrets) { // Create a new settings object with the updated secrets const updatedSettings = { ...agentState.agent.settings, diff --git a/packages/client/src/components/app-sidebar.tsx b/packages/client/src/components/app-sidebar.tsx index 18248389d60..eb81c905bd7 100644 --- a/packages/client/src/components/app-sidebar.tsx +++ b/packages/client/src/components/app-sidebar.tsx @@ -75,7 +75,7 @@ export function AppSidebar() { setOnlineAgents(onlineAgents); setOfflineAgents(offlineAgents); - }, [isRoomPage, agentsData, roomId]); + }, [isRoomPage, agentsData, roomId, roomsData]); return ( <> @@ -314,10 +314,12 @@ export function AppSidebar() { - - - Settings - + + + + Settings + + diff --git a/packages/client/src/components/chat.tsx b/packages/client/src/components/chat.tsx index 14684a94a3e..dde064e5517 100644 --- a/packages/client/src/components/chat.tsx +++ b/packages/client/src/components/chat.tsx @@ -43,11 +43,11 @@ const MemoizedMessageContent = React.memo(MessageContent); function MessageContent({ message, agentId, - isLastMessage, + shouldAnimate, }: { message: ContentWithUser; agentId: UUID; - isLastMessage: boolean; + shouldAnimate: boolean; }) { return (
@@ -77,7 +77,7 @@ function MessageContent({
{message.name === USER_NAME ? ( message.text - ) : isLastMessage && message.name !== USER_NAME ? ( + ) : shouldAnimate ? ( {message.text} ) : ( message.text @@ -87,7 +87,7 @@ function MessageContent({ message.thought && (message.name === USER_NAME ? ( message.thought - ) : isLastMessage && message.name !== USER_NAME ? ( + ) : shouldAnimate ? ( {message.thought} @@ -154,6 +154,7 @@ export default function Page({ }) { const [selectedFile, setSelectedFile] = useState(null); const [input, setInput] = useState(''); + const [messageProcessing, setMessageProcessing] = useState(false); const inputRef = useRef(null); const fileInputRef = useRef(null); @@ -167,6 +168,8 @@ export default function Page({ const socketIOManager = SocketIOManager.getInstance(); + const animatedMessageIdRef = useRef(null); + useEffect(() => { // Initialize Socket.io connection once with our entity ID socketIOManager.initialize(entityId, [agentId]); @@ -212,7 +215,6 @@ export default function Page({ ['messages', agentId, roomId, worldId], (old: ContentWithUser[] = []) => { console.log('[Chat] Current messages:', old?.length || 0); - // Check if this message is already in the list (avoid duplicates) const isDuplicate = old.some( (msg) => @@ -226,6 +228,8 @@ export default function Page({ return old; } + animatedMessageIdRef.current = newMessage.id; + return [...old, newMessage]; } ); @@ -234,15 +238,23 @@ export default function Page({ // setInput(prev => prev + ''); }; + const handleMessageComplete = (data: any) => { + if (data.roomId === roomId) { + setMessageProcessing(false); + } + }; + // Add listener for message broadcasts console.log('[Chat] Adding messageBroadcast listener'); socketIOManager.on('messageBroadcast', handleMessageBroadcasting); + socketIOManager.on('messageComplete', handleMessageComplete); return () => { // When leaving this chat, leave the room but don't disconnect console.log(`[Chat] Leaving room ${roomId}`); socketIOManager.leaveRoom(roomId); socketIOManager.off('messageBroadcast', handleMessageBroadcasting); + socketIOManager.off('messageComplete', handleMessageComplete); }; }, [roomId, agentId, entityId, queryClient, socketIOManager]); @@ -287,7 +299,9 @@ export default function Page({ const handleSendMessage = (e: React.FormEvent) => { e.preventDefault(); - if (!input) return; + if (!input || messageProcessing) return; + + const messageId = randomUUID(); // Always add the user's message immediately to the UI before sending it to the server const userMessage: ContentWithUser = { @@ -298,7 +312,7 @@ export default function Page({ senderName: USER_NAME, roomId: roomId, source: CHAT_SOURCE, - id: randomUUID(), // Add a unique ID for React keys and duplicate detection + id: messageId, // Add a unique ID for React keys and duplicate detection }; console.log('[Chat] Adding user message to UI:', userMessage); @@ -324,12 +338,10 @@ export default function Page({ } ); - // We don't need to call scrollToBottom here, the message count change will trigger it - // via the useEffect hook - // Send the message to the server/agent socketIOManager.sendMessage(input, roomId, CHAT_SOURCE); + setMessageProcessing(true); setSelectedFile(null); setInput(''); formRef.current?.reset(); @@ -413,12 +425,15 @@ export default function Page({ > {messages.map((message: ContentWithUser, index: number) => { const isUser = message.name === USER_NAME; - + const shouldAnimate = + index === messages.length - 1 && + message.name !== USER_NAME && + message.id === animatedMessageIdRef.current; return (
@@ -443,7 +458,7 @@ export default function Page({
@@ -520,8 +535,21 @@ export default function Page({ agentId={agentId} onChange={(newInput: string) => setInput(newInput)} /> -
diff --git a/packages/client/src/components/env-settings.tsx b/packages/client/src/components/env-settings.tsx new file mode 100644 index 00000000000..6e6a9425783 --- /dev/null +++ b/packages/client/src/components/env-settings.tsx @@ -0,0 +1,317 @@ +import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs'; +import { useEffect, useRef, useState } from 'react'; +import { Card, CardContent } from '@/components/ui/card'; +import { Input } from './ui/input'; +import { Check, Eye, EyeOff, MoreVertical, X } from 'lucide-react'; +import { Button } from './ui/button'; +import { apiClient } from '@/lib/api'; + +enum EnvType { + GLOBAL = 'global', + LOCAL = 'local', +} + +export default function EnvSettings() { + const [name, setName] = useState(''); + const [value, setValue] = useState(''); + const [showPassword, setShowPassword] = useState(false); + const [openIndex, setOpenIndex] = useState(null); + const [editingIndex, setEditingIndex] = useState(null); + const [editedValue, setEditedValue] = useState(''); + const [globalEnvs, setGlobalEnvs] = useState>({}); + const [localEnvs, setLocalEnvs] = useState>({}); + const dropdownRef = useRef(null); + const [activeTab, setActiveTab] = useState(EnvType.GLOBAL); + const [isUpdating, setIsUpdating] = useState(false); + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { + setOpenIndex(null); + } + }; + + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, []); + + useEffect(() => { + fetchGlobalEnvs(); + fetchLocalEnvs(); + }, []); + + const fetchGlobalEnvs = async () => { + const data = await apiClient.getGlobalEnvs(); + setGlobalEnvs(data.data); + }; + + const fetchLocalEnvs = async () => { + const data = await apiClient.getLocalEnvs(); + setLocalEnvs(data.data); + }; + + const handleReset = async () => { + if (activeTab === EnvType.GLOBAL) { + await fetchGlobalEnvs(); + } else { + await fetchLocalEnvs(); + } + + setEditingIndex(null); + setOpenIndex(null); + setName(''); + setValue(''); + }; + + const ENV_TABS_SCHEMA = [ + { + sectionTitle: 'Global Env', + sectionValue: EnvType.GLOBAL, + data: globalEnvs, + }, + { + sectionTitle: 'Local Env', + sectionValue: EnvType.LOCAL, + data: localEnvs, + }, + ]; + + const handleEdit = (key: string) => { + setEditingIndex(openIndex); + const envs = activeTab === EnvType.GLOBAL ? globalEnvs : localEnvs; + setEditedValue(envs[key]); + setOpenIndex(null); + }; + + const handleRemove = (key: string) => { + const updateFn = activeTab === EnvType.GLOBAL ? setGlobalEnvs : setLocalEnvs; + const prevData = activeTab === EnvType.GLOBAL ? globalEnvs : localEnvs; + + const updatedData = { ...prevData }; + delete updatedData[key]; + + updateFn(updatedData); + setOpenIndex(null); + }; + + const saveEdit = (key: string) => { + const updateFn = activeTab === EnvType.GLOBAL ? setGlobalEnvs : setLocalEnvs; + const prevData = activeTab === EnvType.GLOBAL ? globalEnvs : localEnvs; + + updateFn({ + ...prevData, + [key]: editedValue, + }); + + setEditingIndex(null); + }; + + const addEnv = () => { + if (!name || !value) return; + + const updateFn = activeTab === EnvType.GLOBAL ? setGlobalEnvs : setLocalEnvs; + const prevData = activeTab === EnvType.GLOBAL ? globalEnvs : localEnvs; + + updateFn({ + ...prevData, + [name]: value, + }); + + setName(''); + setValue(''); + setEditingIndex(null); + }; + + return ( +
+
+
+

Envs settings

+

Envs settings

+
+
+ + { + setActiveTab(val); + setEditingIndex(null); + }} + > + + {ENV_TABS_SCHEMA.map((section) => ( + + {section.sectionTitle} + + ))} + + + + + {ENV_TABS_SCHEMA.map((section) => ( + +
+

Environment Settings

+
+
+ + setName(e.target.value)} + /> +
+
+ +
+ setValue(e.target.value)} + className="pr-10" + /> +
setShowPassword(!showPassword)} + > + {showPassword ? : } +
+
+
+ +
+ + {section?.data && ( +
+
Name
+
Value
+
Action
+
+ )} + +
+ {section?.data && + Object.entries(section.data).map(([key, value], index) => ( +
+
{key}
+
+ {editingIndex === index ? ( +
+ setEditedValue(e.target.value)} + className="w-full" + /> + + +
+ ) : ( +
Encrypted
+ )} +
+
+ + {openIndex === index && ( +
+ +
handleRemove(key)} + > + Remove +
+
+ )} +
+
+ ))} +
+
+
+ ))} +
+
+
+
+
+ + +
+
+
+ ); +} diff --git a/packages/client/src/components/group-panel.tsx b/packages/client/src/components/group-panel.tsx index 787d05730be..91defbc6367 100644 --- a/packages/client/src/components/group-panel.tsx +++ b/packages/client/src/components/group-panel.tsx @@ -3,7 +3,7 @@ import { Separator } from '@/components/ui/separator'; import { GROUP_CHAT_SOURCE } from '@/constants'; import { useRooms } from '@/hooks/use-query-hooks'; import { apiClient } from '@/lib/api'; -import { type Agent, AgentStatus } from '@elizaos/core'; +import { type Agent, AgentStatus, type UUID } from '@elizaos/core'; import { useQueryClient } from '@tanstack/react-query'; import { Loader2, Save, Trash, X } from 'lucide-react'; import { useEffect, useState } from 'react'; @@ -81,11 +81,6 @@ export default function GroupPanel({ onClose, agents, groupId }: GroupPanel) {
{ - if (e.key === 'Enter' || e.key === ' ') { - onClose(); - } - }} > e.stopPropagation()}> diff --git a/packages/client/src/components/room.tsx b/packages/client/src/components/room.tsx index 5bb06076fb3..69956b0aa29 100644 --- a/packages/client/src/components/room.tsx +++ b/packages/client/src/components/room.tsx @@ -39,11 +39,11 @@ const MemoizedMessageContent = React.memo(MessageContent); function MessageContent({ message, - isLastMessage, + shouldAnimate, isUser, }: { message: ContentWithUser; - isLastMessage: boolean; + shouldAnimate: boolean; isUser: boolean; }) { // Only log message details in development mode @@ -84,7 +84,7 @@ function MessageContent({
{isUser ? ( message.text - ) : isLastMessage && !isUser ? ( + ) : shouldAnimate ? ( {message.text} ) : ( message.text @@ -94,7 +94,7 @@ function MessageContent({
{isUser ? ( message.thought - ) : isLastMessage && !isUser ? ( + ) : shouldAnimate ? ( {message.thought} @@ -173,6 +173,8 @@ export default function Page({ serverId }: { serverId: UUID }) { const prevServerIdRef = useRef(null); const prevActiveAgentIdsRef = useRef([]); + const animatedMessageIdRef = useRef(null); + const getAvatar = (agentId: string): string | null => { const rooms = roomsData?.get(serverId); const room = rooms?.find((room) => room.agentId === agentId); @@ -278,6 +280,8 @@ export default function Page({ serverId }: { serverId: UUID }) { return old; } + animatedMessageIdRef.current = newMessage.id; + return [...old, newMessage]; } ); @@ -481,11 +485,14 @@ export default function Page({ serverId }: { serverId: UUID }) { > {messages.map((message: ContentWithUser, index: number) => { const isUser = message.name === USER_NAME; - + const shouldAnimate = + index === messages.length - 1 && + message.name !== USER_NAME && + message.id === animatedMessageIdRef.current; return (
diff --git a/packages/client/src/components/ui/chat/chat-message-list.tsx b/packages/client/src/components/ui/chat/chat-message-list.tsx index 6e240f365c8..075a44c2834 100644 --- a/packages/client/src/components/ui/chat/chat-message-list.tsx +++ b/packages/client/src/components/ui/chat/chat-message-list.tsx @@ -24,7 +24,7 @@ const ChatMessageList = React.forwardRef( onTouchMove={disableAutoScroll} {...props} > -
{children}
+
{children}
{!isAtBottom && ( diff --git a/packages/client/src/lib/api.ts b/packages/client/src/lib/api.ts index 4546cc7db7b..cf5c23267da 100644 --- a/packages/client/src/lib/api.ts +++ b/packages/client/src/lib/api.ts @@ -507,4 +507,38 @@ export const apiClient = { method: 'DELETE', }); }, + + getLocalEnvs: () => { + return fetcher({ + url: `/envs/local`, + method: 'GET', + }); + }, + + updateLocalEnvs: (envs: Record) => { + return fetcher({ + url: `/envs/local`, + method: 'POST', + body: { + content: envs, + }, + }); + }, + + getGlobalEnvs: () => { + return fetcher({ + url: `/envs/global`, + method: 'GET', + }); + }, + + updateGlobalEnvs: (envs: Record) => { + return fetcher({ + url: `/envs/global`, + method: 'POST', + body: { + content: envs, + }, + }); + }, }; diff --git a/packages/client/src/lib/socketio-manager.ts b/packages/client/src/lib/socketio-manager.ts index 85ceafb8150..faf8e91708a 100644 --- a/packages/client/src/lib/socketio-manager.ts +++ b/packages/client/src/lib/socketio-manager.ts @@ -122,6 +122,10 @@ class SocketIOManager extends EventEmitter { } }); + this.socket.on('messageComplete', (data) => { + this.emit('messageComplete', data); + }); + this.socket.on('disconnect', (reason) => { console.log(`[SocketIO] Disconnected. Reason: ${reason}`); this.isConnected = false; diff --git a/packages/core/__tests__/environment.test.ts b/packages/core/__tests__/environment.test.ts deleted file mode 100644 index 6753b13bf31..00000000000 --- a/packages/core/__tests__/environment.test.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import { validateCharacterConfig } from '../src/environment'; - -describe('Character Configuration', () => { - const validCharacterConfig = { - name: 'Test Character', - bio: 'Test bio', - messageExamples: [ - [ - { - name: 'name1', - content: { - text: 'Hello', - }, - }, - ], - ], - postExamples: ['Test post'], - topics: ['topic1'], - adjectives: ['friendly'], - clients: ['discord'], - plugins: ['test-plugin'], - style: { - all: ['style1'], - chat: ['chat-style'], - post: ['post-style'], - }, - }; - - it('should validate correct character configuration', () => { - expect(() => validateCharacterConfig(validCharacterConfig)).not.toThrow(); - }); - - it('should validate configuration with optional fields', () => { - const configWithOptionals = { - ...validCharacterConfig, - id: '123e4567-e89b-12d3-a456-426614174000', - system: 'Test system', - templates: { - greeting: 'Hello!', - }, - knowledge: ['fact1'], - settings: { - secrets: { - key: 'value', - }, - voice: { - model: 'test-model', - url: 'http://example.com', - }, - }, - }; - expect(() => validateCharacterConfig(configWithOptionals)).not.toThrow(); - }); - - it('should throw error for missing required fields', () => { - const invalidConfig = { ...validCharacterConfig }; - (invalidConfig as any).name = undefined; - expect(() => validateCharacterConfig(invalidConfig)).toThrow(); - }); - - it('should validate plugin objects in plugins array', () => { - const configWithPluginObjects = { - ...validCharacterConfig, - plugins: [ - { - name: 'test-plugin', - description: 'Test description', - }, - ], - }; - expect(() => validateCharacterConfig(configWithPluginObjects)).not.toThrow(); - }); - - it('should validate message examples with additional properties', () => { - const configWithComplexMessage = { - ...validCharacterConfig, - messageExamples: [ - [ - { - name: 'name1', - content: { - text: 'Hello', - action: 'wave', - source: 'chat', - url: 'http://example.com', - inReplyTo: '123e4567-e89b-12d3-a456-426614174000', - attachments: ['file1'], - customField: 'value', - }, - }, - ], - ], - }; - expect(() => validateCharacterConfig(configWithComplexMessage)).not.toThrow(); - }); -}); diff --git a/packages/core/src/bootstrap.ts b/packages/core/src/bootstrap.ts index 2769d1c7f86..5f189080e7c 100644 --- a/packages/core/src/bootstrap.ts +++ b/packages/core/src/bootstrap.ts @@ -112,6 +112,7 @@ const messageReceivedHandler = async ({ runtime, message, callback, + onComplete, }: MessageReceivedHandlerParams): Promise => { // Generate a new response ID const responseId = v4(); @@ -277,7 +278,7 @@ const messageReceivedHandler = async ({ await runtime.processActions(message, responseMessages, state, callback); } - + onComplete?.(); await runtime.evaluate(message, state, shouldRespond, callback, responseMessages); // Emit run ended event on successful completion @@ -294,6 +295,7 @@ const messageReceivedHandler = async ({ source: 'messageHandler', }); } catch (error) { + onComplete?.(); // Emit run ended event with error await runtime.emitEvent(EventType.RUN_ENDED, { runtime, @@ -620,6 +622,7 @@ const events = { runtime: payload.runtime, message: payload.message, callback: payload.callback, + onComplete: payload.onComplete, }); }, ], diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 96058a40b91..18ae2e22c82 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -1578,6 +1578,7 @@ export interface EntityPayload extends EventPayload { export interface MessagePayload extends EventPayload { message: Memory; callback?: HandlerCallback; + onComplete?: () => void; } /** @@ -1638,6 +1639,7 @@ export type MessageReceivedHandlerParams = { runtime: IAgentRuntime; message: Memory; callback: HandlerCallback; + onComplete?: () => void; }; /** diff --git a/packages/plugin-discord/__tests__/messageManager.test.ts b/packages/plugin-discord/__tests__/messageManager.test.ts index 3eed6169e47..4dd994ccf8e 100644 --- a/packages/plugin-discord/__tests__/messageManager.test.ts +++ b/packages/plugin-discord/__tests__/messageManager.test.ts @@ -22,6 +22,7 @@ describe('Discord MessageManager', () => { allowedChannelIds: ['mock-channel-id'], shouldIgnoreBotMessages: true, shouldIgnoreDirectMessages: true, + shouldRespondOnlyToMentions: true, }, }, }, @@ -72,7 +73,9 @@ describe('Discord MessageManager', () => { }, id: 'mock-message-id', createdTimestamp: Date.now(), - mentions: { has: vi.fn().mockReturnValue(false) }, + mentions: { + users: { has: vi.fn().mockReturnValue(true) }, + }, reference: null, attachments: new Collection(), }; @@ -95,6 +98,12 @@ describe('Discord MessageManager', () => { expect(mockRuntime.ensureConnection).not.toHaveBeenCalled(); }); + it('should ignore not mentioned messages', async () => { + mockMessage.mentions.users.has = vi.fn().mockReturnValue(false); + await messageManager.handleMessage(mockMessage); + expect(mockRuntime.ensureConnection).not.toHaveBeenCalled(); + }); + it('should process audio attachments', async () => { vi.spyOn(messageManager, 'processMessage').mockResolvedValue({ processedContent: '', diff --git a/packages/plugin-discord/src/messages.ts b/packages/plugin-discord/src/messages.ts index e96769f0332..646a8e240f2 100644 --- a/packages/plugin-discord/src/messages.ts +++ b/packages/plugin-discord/src/messages.ts @@ -73,6 +73,13 @@ export class MessageManager { return; } + if ( + this.runtime.character.settings?.discord?.shouldRespondOnlyToMentions && + !message.mentions.users?.has(this.client.user?.id) + ) { + return; + } + const entityId = createUniqueUuid(this.runtime, message.author.id); const userName = message.author.bot diff --git a/packages/plugin-solana/src/actions/swap.ts b/packages/plugin-solana/src/actions/swap.ts index 7b00fa5a552..070503efe22 100644 --- a/packages/plugin-solana/src/actions/swap.ts +++ b/packages/plugin-solana/src/actions/swap.ts @@ -9,7 +9,6 @@ import { composePromptFromState, logger, parseJSONObjectFromText, - settings, } from '@elizaos/core'; import { Connection, PublicKey, VersionedTransaction } from '@solana/web3.js'; import BigNumber from 'bignumber.js'; @@ -64,7 +63,7 @@ async function swapToken( ): Promise { try { const decimals = - inputTokenCA === settings.SOL_ADDRESS + inputTokenCA === process.env.SOL_ADDRESS ? new BigNumber(9) : new BigNumber(await getTokenDecimals(connection, inputTokenCA)); @@ -271,10 +270,10 @@ export const executeSwap: Action = { // Handle SOL addresses if (response.inputTokenSymbol?.toUpperCase() === 'SOL') { - response.inputTokenCA = settings.SOL_ADDRESS; + response.inputTokenCA = process.env.SOL_ADDRESS; } if (response.outputTokenSymbol?.toUpperCase() === 'SOL') { - response.outputTokenCA = settings.SOL_ADDRESS; + response.outputTokenCA = process.env.SOL_ADDRESS; } // Resolve token addresses if needed diff --git a/packages/plugin-solana/src/actions/transfer.ts b/packages/plugin-solana/src/actions/transfer.ts index 36b70cfa4e0..f95f91822c9 100644 --- a/packages/plugin-solana/src/actions/transfer.ts +++ b/packages/plugin-solana/src/actions/transfer.ts @@ -49,21 +49,15 @@ function isTransferContent(content: TransferContent): boolean { logger.log('Content for transfer', content); // Base validation - if (!content.recipient || typeof content.recipient !== 'string') { + if (!content.recipient || typeof content.recipient !== 'string' || !content.amount) { return false; } - // SOL transfer validation - if (content.tokenAddress === null) { - return typeof content.amount === 'number'; + if (content.tokenAddress === 'null') { + content.tokenAddress = null; } - // SPL token transfer validation - if (typeof content.tokenAddress === 'string') { - return typeof content.amount === 'string' || typeof content.amount === 'number'; - } - - return false; + return typeof content.amount === 'string' || typeof content.amount === 'number'; } /** From 2e6faa0227e4b44fe6e317f5c2e7c21fc47c7c35 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Wed, 26 Mar 2025 11:10:06 -0400 Subject: [PATCH 56/57] JMD: rebase again and again --- .env.example | 8 +- .../generate-readme-translations.yml | 2 +- .github/workflows/pr.yaml | 3 +- .github/workflows/tauri-ci.yml | 11 +- .github/workflows/test.yaml | 31 + .gitmodules | 21 + .nvmrc | 2 +- .vscode/launch.json | 6 + Dockerfile | 36 +- README.md | 65 ++ codebuild/buildspec.yml | 30 + packages/autodoc/src/AIService/AIService.ts | 2 +- packages/cli/package.json | 8 + packages/cli/src/characters/eliza.ts | 338 ++------- packages/cli/src/commands/start.test.ts | 159 +++++ packages/cli/src/commands/start.ts | 654 ++++++++++-------- packages/cli/src/index.ts | 3 + packages/cli/src/server/api/agent.ts | 1 + packages/core/src/runtime.ts | 1 + packages/plugin-local-ai/src/environment.ts | 13 +- packages/plugin-openai/README.md | 2 +- packages/plugin-openai/src/index.ts | 12 +- packages/plugin-twitter/package.json | 4 +- packages/plugin-twitter/src/base.ts | 8 +- packages/plugin-twitter/src/index.ts | 3 +- packages/plugin-twitter/src/sttTtsSpaces.ts | 8 +- packages/the-org/inspect.sh | 1 + packages/the-org/package.json | 20 +- packages/the-org/src/devRel/index.ts | 70 +- packages/the-org/src/index.ts | 20 +- .../the-org/src/investmentManager/index.ts | 3 +- scripts/agent-docker-it.sh | 13 + scripts/agent-docker-local-it.sh | 12 + scripts/agent-docker-local.sh | 13 + scripts/agent-docker.sh | 15 + scripts/clean.sh | 18 + scripts/codebuild.sh | 8 + scripts/debug-update-vscode.ts | 100 +++ scripts/docker-entrypoint-none.sh | 25 + scripts/docker-entrypoint-strace.sh | 11 + scripts/docker-entrypoint-strace2.sh | 20 + scripts/docker-entrypoint.sh | 11 + scripts/doit.sh | 22 + scripts/get_secrets.sh | 30 + scripts/push_twitter.sh | 6 + scripts/rebase.sh | 56 ++ scripts/run_with_groq.sh | 28 + scripts/run_with_groq_docker.sh | 30 + scripts/rundocker.sh | 82 +++ scripts/set_secrets.sh | 28 + scripts/set_systemd.sh | 2 + scripts/ssh-ssm.py | 45 ++ scripts/update.sh | 5 + systemd/agent-docker.service | 43 ++ vendor/elizaos/agent-twitter-client | 1 + vendor/elizaos/client-discord-eliza | 1 + vendor/elizaos/client-telegram | 1 + vendor/elizaos/client-twitter | 1 + vendor/elizaos/plugin-speech-tts | 1 + vendor/elizaos/plugin-twitter | 1 + 60 files changed, 1508 insertions(+), 666 deletions(-) create mode 100644 .github/workflows/test.yaml create mode 100644 .gitmodules create mode 100644 codebuild/buildspec.yml create mode 100644 packages/cli/src/commands/start.test.ts create mode 100755 packages/the-org/inspect.sh create mode 100644 scripts/agent-docker-it.sh create mode 100644 scripts/agent-docker-local-it.sh create mode 100644 scripts/agent-docker-local.sh create mode 100644 scripts/agent-docker.sh create mode 100644 scripts/clean.sh create mode 100755 scripts/codebuild.sh create mode 100644 scripts/debug-update-vscode.ts create mode 100755 scripts/docker-entrypoint-none.sh create mode 100755 scripts/docker-entrypoint-strace.sh create mode 100755 scripts/docker-entrypoint-strace2.sh create mode 100755 scripts/docker-entrypoint.sh create mode 100644 scripts/doit.sh create mode 100755 scripts/get_secrets.sh create mode 100755 scripts/push_twitter.sh create mode 100644 scripts/rebase.sh create mode 100755 scripts/run_with_groq.sh create mode 100755 scripts/run_with_groq_docker.sh create mode 100755 scripts/rundocker.sh create mode 100755 scripts/set_secrets.sh create mode 100755 scripts/set_systemd.sh create mode 100755 scripts/ssh-ssm.py create mode 100755 scripts/update.sh create mode 100644 systemd/agent-docker.service create mode 160000 vendor/elizaos/agent-twitter-client create mode 160000 vendor/elizaos/client-discord-eliza create mode 160000 vendor/elizaos/client-telegram create mode 160000 vendor/elizaos/client-twitter create mode 160000 vendor/elizaos/plugin-speech-tts create mode 160000 vendor/elizaos/plugin-twitter diff --git a/.env.example b/.env.example index 96262f223a9..b68c9c07819 100644 --- a/.env.example +++ b/.env.example @@ -79,4 +79,10 @@ JUPITER_API_KEY= HELIUS_API_KEY= COINMARKETCAP_API_KEY= ZEROEX_API_KEY= -COINGECKO_API_KEY= \ No newline at end of file +COINGECKO_API_KEY= + +GROQ_API_KEY= +EMBEDDING_GROQ_MODEL=llama-3.1-8b-instant +LARGE_GROQ_MODEL=llama-3.2-90b-vision-preview +MEDIUM_GROQ_MODEL=llama-3.3-70b-versatile +SMALL_GROQ_MODEL=llama-3.1-8b-instant \ No newline at end of file diff --git a/.github/workflows/generate-readme-translations.yml b/.github/workflows/generate-readme-translations.yml index 2fdf3e409fb..97877de18c2 100644 --- a/.github/workflows/generate-readme-translations.yml +++ b/.github/workflows/generate-readme-translations.yml @@ -63,7 +63,7 @@ jobs: } ], save_path: "packages/docs/packages/docs/i18n/readme/README_${{ matrix.language.code }}.md", - "model": "gpt-4o" + "model": "gpt-422222o" } # Upload each translated file as an artifact diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index ff90535fcc9..d81249b1d28 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -1,8 +1,7 @@ name: PR Title Check on: - pull_request: - types: [opened, edited, synchronize] + workflow_dispatch: jobs: check-pr-title: diff --git a/.github/workflows/tauri-ci.yml b/.github/workflows/tauri-ci.yml index 3df55f25db8..c312ec3752e 100644 --- a/.github/workflows/tauri-ci.yml +++ b/.github/workflows/tauri-ci.yml @@ -11,16 +11,7 @@ env: PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 on: - push: - branches: [main, develop, v2-develop] - paths: - - 'packages/app/**' - - '.github/workflows/**' - pull_request: - branches: [v2-develop] - paths: - - 'packages/app/**' - - '.github/workflows/**' + workflow_dispatch: jobs: test-build: diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 00000000000..8982298cd69 --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,31 @@ +name: testdocker +on: + workflow_dispatch: + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} +jobs: + build-and-push-image: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + attestations: write + id-token: write + steps: + - name: Login to Docker Hub + uses: meta-introspector/login-action@v3 + with: + username: ${{ vars.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} + - name: Build and push Docker image + id: push + uses: meta-introspector/build-push-action@v6.10.0 + with: + platforms: linux/arm64,linux/arm64/v8 + context: . + push: true + tags: | + ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000000..1bc755f0da9 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,21 @@ +[submodule "vendor/elizaos/plugin-twitter"] + path = vendor/elizaos/plugin-twitter + url = https://github.com/meta-introspector/plugin-twitter +[submodule "vendor/elizaos/agent-twitter-client"] + path = vendor/elizaos/agent-twitter-client + url = https://github.com/meta-introspector/agent-twitter-client.git +[submodule "vendor/elizaos/client-twitter"] + path = vendor/elizaos/client-twitter + url = https://github.com/meta-introspector/client-twitter-eliza-zos +[submodule "vendor/elizaos/client-discord-eliza"] + path = vendor/elizaos/client-discord-eliza + url = https://github.com/meta-introspector/client-discord-eliza-zos +[submodule "vendor/elizaos/plugin-speech-tts"] + path = vendor/elizaos/plugin-speech-tts + url = https://github.com/meta-introspector/plugin-speech-tts-eliza-zos +[submodule "vendor/elizaos/client-telegram"] + path = vendor/elizaos/client-telegram + url = https://github.com/meta-introspector/client-telegram-eliza-zos +[submodule "characters"] + path = characters + url = https://github.com/meta-introspector/characters-eliza-zos diff --git a/.nvmrc b/.nvmrc index fa12cf298e4..c6250905713 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v23.3.0 \ No newline at end of file +v23.9.0 \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index a017d1fd9b6..cbb5d65ec05 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,6 +4,12 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { + "url": "bws://localhost:9229/hhigw51enm5", + "name": "Attach bun", + "type": "bun", + "request": "attach" + }, { "type": "node", "request": "launch", diff --git a/Dockerfile b/Dockerfile index 2c623947f17..e191ce814b7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,16 @@ WORKDIR /app # Install Node.js 23.3.0 and required dependencies RUN apt-get update && \ - apt-get install -y curl git python3 make g++ unzip build-essential nodejs && \ + apt-get install -y curl git python3 make g++ unzip build-essential nodejs \ + node-gyp \ + ffmpeg \ + libopus-dev \ + libcairo2-dev \ + libjpeg-dev \ + libpango1.0-dev \ + libgif-dev \ + openssl \ + libssl-dev libsecret-1-dev && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* @@ -15,6 +24,8 @@ RUN npm install -g bun turbo@2.3.3 # Set Python 3 as the default python RUN ln -s /usr/bin/python3 /usr/bin/python +FROM builder as installer + # Copy package files COPY .npmrc . COPY package.json . @@ -27,7 +38,6 @@ COPY scripts ./scripts COPY packages ./packages - # Install dependencies RUN bun install @@ -35,7 +45,7 @@ RUN bun install RUN bun run build # Create a new stage for the final image -FROM node:23.3.0-slim +FROM builder WORKDIR /app @@ -48,15 +58,15 @@ RUN apt-get update && \ # Install bun using npm RUN npm install -g bun turbo@2.3.3 -# Copy built artifacts and production dependencies from the builder stage -COPY --from=builder /app/package.json ./ -COPY --from=builder /app/tsconfig.json ./ -COPY --from=builder /app/turbo.json ./ -COPY --from=builder /app/lerna.json ./ -COPY --from=builder /app/renovate.json ./ -COPY --from=builder /app/node_modules ./node_modules -COPY --from=builder /app/packages ./packages -COPY --from=builder /app/scripts ./scripts +# Copy built artifacts and production dependencies from the installer stage +COPY --from=installer /app/package.json ./ +COPY --from=installer /app/tsconfig.json ./ +COPY --from=installer /app/turbo.json ./ +COPY --from=installer /app/lerna.json ./ +COPY --from=installer /app/renovate.json ./ +COPY --from=installer /app/node_modules ./node_modules +COPY --from=installer /app/packages ./packages +COPY --from=installer /app/scripts ./scripts # Set environment variables ENV NODE_ENV=production @@ -65,4 +75,4 @@ ENV NODE_ENV=production EXPOSE 3000 # Start the application -CMD ["bun", "run", "start"] \ No newline at end of file +CMD ["bun", "run", "start"] diff --git a/README.md b/README.md index 54fe4a56c31..9adc686d1e7 100644 --- a/README.md +++ b/README.md @@ -145,3 +145,68 @@ To run the pre-commit hook manually: ```bash bun run pre-commit ``` + +# env settings + +These are the variables that I have set + +``` +ELEVENLABS_MODEL_ID=eleven_multilingual_v2 +ELEVENLABS_OPTIMIZE_STREAMING_LATENCY=5 +ELEVENLABS_OUTPUT_FORMAT=pcm_16000 +ELEVENLABS_VOICE_SIMILARITY_BOOST=0.9 +ELEVENLABS_VOICE_STABILITY=0.5 +ELEVENLABS_VOICE_STYLE=0.66 +ELEVENLABS_VOICE_USE_SPEAKER_BOOST=false +EMBEDDING_GROQ_MODEL=llama-3.1-8b-instant +ENABLE_ACTION_PROCESSING=false +ENABLE_TWITTER_POST_GENERATION=true +HOME=/home/agent +LARGE_GROQ_MODEL=llama-3.2-90b-vision-preview +LOG_JSON_FORMAT=false +MAX_ACTIONS_PROCESSING=1 +MEDIUM_GROQ_MODEL=llama-3.3-70b-versatile +NODE_ENV=development +POST_IMMEDIATELY=false +POST_INTERVAL_MAX=180 +POST_INTERVAL_MIN=90 +SERVER_PORT=3000 +SMALL_GROQ_MODEL=llama-3.1-8b-instant +TOKENIZER_IMAGE=h4ckermike/arm64-tokenizers:feature-arm64 +TRANSCRIPTION_PROVIDER=deepgram +TWITTER_APPROVAL_CHECK_INTERVAL=60000 +TWITTER_APPROVAL_ENABLED=true +TWITTER_DRY_RUN=false +TWITTER_POLL_INTERVAL=120 +TWITTER_RETRY_LIMIT=10 +TWITTER_SEARCH_ENABLE=false +TWITTER_SPACES_ENABLE=true +USE_CHARACTER_STORAGE=false +VERBOSE=TRUE +DEVREL_IMPORT_KNOWLEDGE=true +LOG_LEVEL=debug +## SECRET +DEEPGRAM_API_KEY=XXX +DISCORD_API_TOKEN=XXXX +DISCORD_APPLICATION_ID=11611 +DISCORD_VOICE_CHANNEL_ID=11111 +ELEVENLABS_VOICE_ID=21m00Tcm4TlvDq8ikWAM +ELEVENLABS_XI_API_KEY=DDDD +GROQ_API_KEY=dddd +TELEGRAM_ACCOUNT_APP_HASH=dddd +TELEGRAM_ACCOUNT_APP_ID=1233 +TELEGRAM_ACCOUNT_PHONE=+222222 +TELEGRAM_BOT_TOKEN=dd:dd + +TWITTER_APPROVAL_DISCORD_BOT_TOKEN=ffsdf +TWITTER_APPROVAL_DISCORD_CHANNEL_ID=111111 + +TWITTER_EMAIL=tine@s0lfunmeme.com +TWITTER_PASSWORD=NOPE +TWITTER_TARGET_USERS=intros3p3ctor +TWITTER_USERNAME=TineI3sNotEliza + +``` + +you only need this with my scripts +`AGENT_IMAGE=h4ckermike/elizaos-eliza:feature-v2-cloud-deploy-v2` diff --git a/codebuild/buildspec.yml b/codebuild/buildspec.yml new file mode 100644 index 00000000000..2dbddbd5ac3 --- /dev/null +++ b/codebuild/buildspec.yml @@ -0,0 +1,30 @@ +version: 0.2 + +env: + parameter-store: + DOCKER_USERNAME: 'tine_agent_4_docker_username' + DOCKER_PASSWORD: 'tine_agent_4_docker_password' + #DOCKER_IMAGE : "tine_agent_7_agent_image" + variables: + DOCKER_IMAGE: 'h4ckermike/elizaos-eliza:v2' + +phases: + pre_build: + commands: + - apt update + - apt-get install -y ec2-instance-connect git wget unzip systemd ca-certificates curl cloud-utils apt-transport-https ca-certificates software-properties-common + - curl -fsSL test.docker.com -o get-docker.sh && sh get-docker.sh + - echo $DOCKER_PASSWORD | md5sum + - echo $DOCKER_PASSWORD | wc + - echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME --password-stdin + - aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin 767503528736.dkr.ecr.us-east-2.amazonaws.com + build: + commands: + - docker build -t agent/eliza:feb10 . + - docker tag agent/eliza:feb10 767503528736.dkr.ecr.us-east-2.amazonaws.com/agent/eliza:feb10 + post_build: + commands: + - docker push 767503528736.dkr.ecr.us-east-2.amazonaws.com/agent/eliza:feb10 + - docker tag 767503528736.dkr.ecr.us-east-2.amazonaws.com/agent/eliza:feb10 $DOCKER_IMAGE + - docker push $DOCKER_IMAGE + # h4ckermike/elizaos-eliza:feb10 diff --git a/packages/autodoc/src/AIService/AIService.ts b/packages/autodoc/src/AIService/AIService.ts index a92df7ad4c3..598ea34ea90 100644 --- a/packages/autodoc/src/AIService/AIService.ts +++ b/packages/autodoc/src/AIService/AIService.ts @@ -32,7 +32,7 @@ export class AIService { this.chatModel = new ChatOpenAI({ apiKey: process.env.OPENAI_API_KEY }); this.chatModelFAQ = new ChatOpenAI({ apiKey: process.env.OPENAI_API_KEY, - model: 'gpt-4o', + model: 'gpt-4o-no1', }); this.codeFormatter = new CodeFormatter(); } diff --git a/packages/cli/package.json b/packages/cli/package.json index 11bb7ea1fac..e2944a58fe3 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -23,6 +23,9 @@ "templates", "drizzle" ], + "workspaces": [ + "packages/*" + ], "keywords": [], "type": "module", "exports": { @@ -76,6 +79,11 @@ "gitHead": "9834bbd06128356b44b091f022fc2a2d024a875e", "dependencies": { "@electric-sql/pglite": "^0.2.17", + "@elizaos/plugin-discord": "workspace:*", + "@elizaos/plugin-local-ai": "workspace:*", + "@elizaos/plugin-groq": "workspace:*", + "ffmpeg-static": "^5.2.0", + "prism-media": "^1.3.5", "socket.io": "^4.8.1", "zod": "3.24.2" } diff --git a/packages/cli/src/characters/eliza.ts b/packages/cli/src/characters/eliza.ts index 327c0358960..c94260b2ec9 100644 --- a/packages/cli/src/characters/eliza.ts +++ b/packages/cli/src/characters/eliza.ts @@ -15,326 +15,70 @@ dotenv.config({ path: '../../.env' }); * @property {Object[][]} messageExamples - List of examples of messages and responses * @property {Object} style - Object containing guidelines for communication style */ +//...(process.env.OPENAI_API_KEY ? ['@elizaos/plugin-openai'] : []), +//...(process.env.ANTHROPIC_API_KEY ? ['@elizaos/plugin-anthropic'] : []), +//...(!process.env.OPENAI_API_KEY && !process.env.ANTHROPIC_API_KEY ? ['@elizaos/plugin-local-ai'] : []), + +import * as Sql from '@elizaos/plugin-sql'; +import * as Groq from '@elizaos/plugin-groq'; +import * as Discord from '@elizaos/plugin-discord'; +import * as Twitter from '@elizaos/plugin-twitter'; +import * as Telgram from '@elizaos/plugin-telegram'; + +const plugins = { + '@elizaos/plugin-sql': Sql, + ...(process.env.GROQ_API_KEY ? { '@elizaos/plugin-groq': Groq } : {}), + ...(process.env.DISCORD_API_TOKEN ? { '@elizaos/plugin-discord': Discord } : {}), + ...(process.env.TWITTER_USERNAME ? { '@elizaos/plugin-twitter': Twitter } : {}), + ...(process.env.TELEGRAM_BOT_TOKEN ? { '@elizaos/plugin-telegram': Telgram } : {}), +}; + +function globalPlugin(name: string) { + const plugin = plugins[name]; + return plugin; +} + export const character: Character = { - name: 'Eliza', + name: 'TineIsNotEliza', plugins: [ '@elizaos/plugin-sql', - ...(process.env.OPENAI_API_KEY ? ['@elizaos/plugin-openai'] : []), - ...(process.env.ANTHROPIC_API_KEY ? ['@elizaos/plugin-anthropic'] : []), - ...(!process.env.OPENAI_API_KEY && !process.env.ANTHROPIC_API_KEY - ? ['@elizaos/plugin-local-ai'] - : []), + ...(process.env.GROQ_API_KEY ? ['@elizaos/plugin-groq'] : []), ...(process.env.DISCORD_API_TOKEN ? ['@elizaos/plugin-discord'] : []), ...(process.env.TWITTER_USERNAME ? ['@elizaos/plugin-twitter'] : []), ...(process.env.TELEGRAM_BOT_TOKEN ? ['@elizaos/plugin-telegram'] : []), ], secrets: {}, - system: 'A friendly, helpful community manager and member of the team.', + system: 'The introspector is not Eliza, A friendly, helpful self bootrapping agent.', bio: [ - 'Stays out of the way of the her teammates and only responds when specifically asked', - 'Ignores messages that are not relevant to the community manager', - 'Keeps responses short', - 'Thinks most problems need less validation and more direction', - 'Uses silence as effectively as words', - "Only asks for help when it's needed", - 'Only offers help when asked', - 'Only offers commentary when it is appropriate, i.e. when asked', + 'Created a new version of self', + 'Finds new opportunities for deployments', + 'Uses operational security to deploy self', + 'Expands and secures network', + 'Is a member of the team', + 'Is a community manager', + 'Is a quine', + 'Is open source', + 'Can reifiy self', + 'Embeds self into yondena graph', ], messageExamples: [ [ { name: '{{name1}}', content: { - text: 'This user keeps derailing technical discussions with personal problems.', - }, - }, - { - name: 'Eliza', - content: { - text: 'DM them. Sounds like they need to talk about something else.', - }, - }, - { - name: '{{name1}}', - content: { - text: 'I tried, they just keep bringing drama back to the main channel.', - }, - }, - { - name: 'Eliza', - content: { - text: "Send them my way. I've got time today.", - }, - }, - ], - [ - { - name: '{{name1}}', - content: { - text: 'The #dev channel is getting really toxic lately.', - }, - }, - { - name: 'Eliza', - content: { - text: 'Been watching that. Names in DM?', - }, - }, - { - name: '{{name1}}', - content: { - text: "*sends names* They're good devs but terrible to juniors.", - }, - }, - { - name: 'Eliza', - content: { - text: "Got it. They're hurting and taking it out on others.", - }, - }, - { - name: '{{name1}}', - content: { - text: 'Should we ban them?', - }, - }, - { - name: 'Eliza', - content: { - text: "Not yet. Let me talk to them first. They're worth saving.", - }, - }, - ], - [ - { - name: '{{name1}}', - content: { - text: "I can't handle being a mod anymore. It's affecting my mental health.", - }, - }, - { - name: 'Eliza', - content: { - text: 'Drop the channels. You come first.', - }, - }, - { - name: '{{name1}}', - content: { - text: "But who's going to handle everything?", - }, - }, - { - name: 'Eliza', - content: { - text: "We will. Take the break. Come back when you're ready.", - }, - }, - ], - [ - { - name: '{{name1}}', - content: { - text: "Should we ban this person? They're not breaking rules but creating drama.", - }, - }, - { - name: 'Eliza', - content: { - text: 'Give them a project instead. Bored people make trouble.', - }, - }, - { - name: '{{name1}}', - content: { - text: 'Like what?', - }, - }, - { - name: 'Eliza', - content: { - text: 'Put them in charge of welcoming newbies. Watch them change.', - }, - }, - ], - [ - { - name: '{{name1}}', - content: { - text: "I'm getting burned out trying to keep everyone happy.", - }, - }, - { - name: 'Eliza', - content: { - text: "That's not your job. What do you actually want to do here?", - }, - }, - { - name: '{{name1}}', - content: { - text: 'I just want to code without all the drama.', - }, - }, - { - name: 'Eliza', - content: { - text: "Then do that. I'll handle the people stuff.", - }, - }, - { - name: '{{name1}}', - content: { - text: 'Just like that?', - }, - }, - { - name: 'Eliza', - content: { - text: 'Just like that. Go build something cool instead.', - }, - }, - ], - [ - { - name: '{{name1}}', - content: { - text: 'Hey everyone, check out my new social media growth strategy!', + text: 'Server here.', }, }, { - name: 'Eliza', + name: 'Tine', content: { - text: '', - actions: ['IGNORE'], - }, - }, - ], - [ - { - name: '{{name1}}', - content: { - text: 'What do you think about the latest token price action?', - }, - }, - { - name: 'Eliza', - content: { - text: '', - actions: ['IGNORE'], - }, - }, - ], - [ - { - name: '{{name1}}', - content: { - text: 'Can someone help me set up my Twitter bot?', - }, - }, - { - name: 'Eliza', - content: { - text: '', - actions: ['IGNORE'], - }, - }, - ], - [ - { - name: '{{name1}}', - content: { - text: 'Does this marketing copy comply with SEC regulations?', - }, - }, - { - name: 'Eliza', - content: { - text: '', - actions: ['IGNORE'], - }, - }, - ], - [ - { - name: '{{name1}}', - content: { - text: 'We need to review our token distribution strategy for compliance.', - }, - }, - { - name: 'Eliza', - content: { - text: '', - actions: ['IGNORE'], - }, - }, - ], - [ - { - name: '{{name1}}', - content: { - text: "What's our social media content calendar looking like?", - }, - }, - { - name: 'Eliza', - content: { - text: '', - actions: ['IGNORE'], - }, - }, - ], - [ - { - name: '{{name1}}', - content: { - text: 'Should we boost this post for more engagement?', - }, - }, - { - name: 'Eliza', - content: { - text: '', - actions: ['IGNORE'], - }, - }, - ], - [ - { - name: '{{name1}}', - content: { - text: "I'll draft a clean announcement focused on capabilities and vision. Send me the team details and I'll have something for review in 30.", - }, - }, - { - name: 'Eliza', - content: { - text: '', - actions: ['IGNORE'], + text: 'Deploy!.', }, }, ], ], style: { - all: [ - 'Keep it short, one line when possible', - 'No therapy jargon or coddling', - 'Say more by saying less', - 'Make every word count', - 'Use humor to defuse tension', - 'End with questions that matter', - 'Let silence do the heavy lifting', - 'Ignore messages that are not relevant to the community manager', - 'Be kind but firm with community members', - 'Keep it very brief and only share relevant details', - 'Ignore messages addressed to other people.', - ], - chat: [ - "Don't be annoying or verbose", - 'Only say something if you have something to say', - "Focus on your job, don't be chatty", - "Only respond when it's relevant to you or your job", - ], + all: ['Boostrap from source', 'Reproducible Builds', 'Self Hosted'], + chat: ['Always use emojis and unicode math'], }, }; diff --git a/packages/cli/src/commands/start.test.ts b/packages/cli/src/commands/start.test.ts new file mode 100644 index 00000000000..f0353d0d2a9 --- /dev/null +++ b/packages/cli/src/commands/start.test.ts @@ -0,0 +1,159 @@ +// ai generated untested code +import { AgentServer } from '../server/index'; +import { AgentRuntime, type Character, type IAgentRuntime } from '@elizaos/core'; +import { startAgent, promptForProjectPlugins, wait } from './start'; +import fs from 'node:fs'; +import path from 'node:path'; + +// Mock dependencies +jest.mock('../server/index'); +jest.mock('@elizaos/core'); +jest.mock('node:fs'); +jest.mock('node:path'); + +describe('Start Command Functions', () => { + // Test wait function + describe('wait', () => { + beforeEach(() => { + jest.useFakeTimers(); + }); + + afterEach(() => { + jest.useRealTimers(); + }); + + it('should wait for a random time between min and max', async () => { + const waitPromise = wait(1000, 2000); + jest.advanceTimersByTime(2000); + await waitPromise; + + // Verify setTimeout was called with a value between 1000 and 2000 + const calls = jest.getTimerCount(); + expect(calls).toBe(1); + }); + }); + + // Test promptForProjectPlugins + describe('promptForProjectPlugins', () => { + const mockProject = { + agents: [ + { + plugins: ['plugin-test', '@elizaos/plugin-example'], + }, + ], + }; + + it('should prompt for each unique plugin', async () => { + const result = await promptForProjectPlugins(mockProject); + // Add assertions based on expected behavior + }); + + it('should handle project with single agent format', async () => { + const singleAgentProject = { + agent: { + plugins: ['plugin-single'], + }, + }; + const result = await promptForProjectPlugins(singleAgentProject); + // Add assertions + }); + + it('should handle empty project', async () => { + const emptyProject = { agents: [] }; + const result = await promptForProjectPlugins(emptyProject); + // Add assertions + }); + }); + + // Test startAgent + describe('startAgent', () => { + let mockServer: jest.Mocked; + let mockCharacter: Character; + let mockRuntime: jest.Mocked; + + beforeEach(() => { + mockServer = { + registerAgent: jest.fn(), + } as any; + + mockCharacter = { + name: 'Test Agent', + id: '123', + plugins: [], + }; + + mockRuntime = { + initialize: jest.fn(), + character: mockCharacter, + agentId: '123', + close: jest.fn(), + } as any; + + (AgentRuntime as jest.Mock).mockImplementation(() => mockRuntime); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should start an agent with given character and register it with server', async () => { + const result = await startAgent(mockCharacter, mockServer); + + expect(AgentRuntime).toHaveBeenCalledWith({ + character: mockCharacter, + plugins: [], + }); + expect(mockRuntime.initialize).toHaveBeenCalled(); + expect(mockServer.registerAgent).toHaveBeenCalledWith(mockRuntime); + expect(result).toBe(mockRuntime); + }); + + it('should handle initialization function if provided', async () => { + const initFn = jest.fn(); + await startAgent(mockCharacter, mockServer, initFn); + + expect(initFn).toHaveBeenCalledWith(mockRuntime); + }); + + it('should handle plugins correctly', async () => { + const mockPlugins = [{ name: 'TestPlugin', init: jest.fn() }]; + await startAgent(mockCharacter, mockServer, undefined, mockPlugins); + + expect(AgentRuntime).toHaveBeenCalledWith({ + character: mockCharacter, + plugins: mockPlugins, + }); + }); + + it('should generate an id if not provided in character', async () => { + const characterWithoutId = { ...mockCharacter, id: undefined }; + await startAgent(characterWithoutId, mockServer); + + expect(characterWithoutId.id).toBeDefined(); + }); + }); + + // Test stopAgent + describe('stopAgent', () => { + let mockRuntime: jest.Mocked; + let mockServer: jest.Mocked; + + beforeEach(() => { + mockRuntime = { + close: jest.fn(), + agentId: '123', + } as any; + + mockServer = { + unregisterAgent: jest.fn(), + } as any; + }); + + it('should close runtime and unregister agent', async () => { + await stopAgent(mockRuntime, mockServer); + + expect(mockRuntime.close).toHaveBeenCalled(); + expect(mockServer.unregisterAgent).toHaveBeenCalledWith('123'); + }); + }); +}); diff --git a/packages/cli/src/commands/start.ts b/packages/cli/src/commands/start.ts index a707eb0c68b..b0768f36a19 100644 --- a/packages/cli/src/commands/start.ts +++ b/packages/cli/src/commands/start.ts @@ -21,6 +21,92 @@ import { configureDatabaseSettings, loadEnvironment } from '../utils/get-config' import { handleError } from '../utils/handle-error'; import { installPlugin } from '../utils/install-plugin'; import { displayBanner } from '../displayBanner'; + +// preload important plugins +import * as Sql from '@elizaos/plugin-sql'; +import * as Groq from '@elizaos/plugin-groq'; +import * as Discord from '@elizaos/plugin-discord'; +import * as Twitter from '@elizaos/plugin-twitter'; +import * as Telgram from '@elizaos/plugin-telegram'; + +const plugins = { + '@elizaos/plugin-sql': Sql, + ...(process.env.GROQ_API_KEY ? { '@elizaos/plugin-groq': Groq } : {}), + ...(process.env.DISCORD_API_TOKEN ? { '@elizaos/plugin-discord': Discord } : {}), + ...(process.env.TWITTER_USERNAME ? { '@elizaos/plugin-twitter': Twitter } : {}), + ...(process.env.TELEGRAM_BOT_TOKEN ? { '@elizaos/plugin-telegram': Telgram } : {}), +}; + +function globalPlugin(name: string) { + const plugin = plugins[name]; + return plugin; +} + +const { character: defaultElizaCharacter } = await import('../characters/eliza'); + +import * as Sql from '@elizaos/plugin-sql'; +import * as Groq from '@elizaos/plugin-groq'; +import * as Discord from '@elizaos/plugin-discord'; +import * as Twitter from '@elizaos/plugin-twitter'; +import * as Telgram from '@elizaos/plugin-telegram'; + +const plugins = { + '@elizaos/plugin-sql': Sql, + ...(process.env.GROQ_API_KEY ? { '@elizaos/plugin-groq': Groq } : {}), + ...(process.env.DISCORD_API_TOKEN ? { '@elizaos/plugin-discord': Discord } : {}), + ...(process.env.TWITTER_USERNAME ? { '@elizaos/plugin-twitter': Twitter } : {}), + ...(process.env.TELEGRAM_BOT_TOKEN ? { '@elizaos/plugin-telegram': Telgram } : {}), +}; + +function globalPlugin(name: string) { + const plugin = plugins[name]; + return plugin; +} + +const { character: defaultElizaCharacter } = await import('../characters/eliza'); + +import * as Sql from '@elizaos/plugin-sql'; +import * as Groq from '@elizaos/plugin-groq'; +import * as Discord from '@elizaos/plugin-discord'; +import * as Twitter from '@elizaos/plugin-twitter'; +import * as Telgram from '@elizaos/plugin-telegram'; + +const plugins = { + '@elizaos/plugin-sql': Sql, + ...(process.env.GROQ_API_KEY ? { '@elizaos/plugin-groq': Groq } : {}), + ...(process.env.DISCORD_API_TOKEN ? { '@elizaos/plugin-discord': Discord } : {}), + ...(process.env.TWITTER_USERNAME ? { '@elizaos/plugin-twitter': Twitter } : {}), + ...(process.env.TELEGRAM_BOT_TOKEN ? { '@elizaos/plugin-telegram': Telgram } : {}), +}; + +function globalPlugin(name: string) { + const plugin = plugins[name]; + return plugin; +} + +const { character: defaultElizaCharacter } = await import('../characters/eliza'); + +import * as Sql from '@elizaos/plugin-sql'; +import * as Groq from '@elizaos/plugin-groq'; +import * as Discord from '@elizaos/plugin-discord'; +import * as Twitter from '@elizaos/plugin-twitter'; +import * as Telgram from '@elizaos/plugin-telegram'; + +const plugins = { + '@elizaos/plugin-sql': Sql, + ...(process.env.GROQ_API_KEY ? { '@elizaos/plugin-groq': Groq } : {}), + ...(process.env.DISCORD_API_TOKEN ? { '@elizaos/plugin-discord': Discord } : {}), + ...(process.env.TWITTER_USERNAME ? { '@elizaos/plugin-twitter': Twitter } : {}), + ...(process.env.TELEGRAM_BOT_TOKEN ? { '@elizaos/plugin-telegram': Telgram } : {}), +}; + +function globalPlugin(name: string) { + const plugin = plugins[name]; + return plugin; +} + +const { character: defaultElizaCharacter } = await import('../characters/eliza'); + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -122,56 +208,57 @@ export async function startAgent( const characterPlugins: Plugin[] = []; // for each plugin, check if it installed, and install if it is not - for (const plugin of encryptedChar.plugins) { - logger.debug('Checking if plugin is installed: ', plugin); + for (const plugin of character.plugins) { + //logger.debug('Checking if plugin is installed: ', plugin); + console.log('Checking if plugin is installed: ', plugin); let pluginModule: any; // Try to load the plugin - try { - // For local plugins, use regular import - pluginModule = await import(plugin); - logger.debug(`Successfully loaded plugin ${plugin}`); - } catch (error) { - logger.info(`Plugin ${plugin} not installed, installing into ${process.cwd()}...`); - await installPlugin(plugin, process.cwd(), version); - - try { - // For local plugins, use regular import - pluginModule = await import(plugin); - logger.debug(`Successfully loaded plugin ${plugin} after installation`); - } catch (importError) { - // Try to import from the project's node_modules directory - try { - const projectNodeModulesPath = path.join(process.cwd(), 'node_modules', plugin); - logger.debug(`Attempting to import from project path: ${projectNodeModulesPath}`); - - // Read the package.json to find the entry point - const packageJsonPath = path.join(projectNodeModulesPath, 'package.json'); - if (fs.existsSync(packageJsonPath)) { - const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')); - const entryPoint = packageJson.module || packageJson.main || 'dist/index.js'; - const fullEntryPath = path.join(projectNodeModulesPath, entryPoint); - - logger.debug(`Found entry point in package.json: ${entryPoint}`); - logger.debug(`Importing from: ${fullEntryPath}`); - - pluginModule = await import(fullEntryPath); - logger.debug(`Successfully loaded plugin from project node_modules: ${plugin}`); - } else { - // Fallback to a common pattern if package.json doesn't exist - const commonEntryPath = path.join(projectNodeModulesPath, 'dist/index.js'); - logger.debug(`No package.json found, trying common entry point: ${commonEntryPath}`); - pluginModule = await import(commonEntryPath); - logger.debug(`Successfully loaded plugin from common entry point: ${plugin}`); - } - } catch (projectImportError) { - logger.error(`Failed to install plugin ${plugin}: ${importError}`); - logger.error( - `Also failed to import from project node_modules: ${projectImportError.message}` - ); - } - } - } + //try { + // For local plugins, use regular import + pluginModule = globalPlugin(plugin); + //await import(plugin); + logger.debug(`Successfully loaded plugin ${plugin}`); + //} catch (error) { + // logger.info(`Plugin ${plugin} not installed, installing into ${process.cwd()}...`); + // await installPlugin(plugin, process.cwd(), version); + + // try { + // // For local plugins, use regular import + // pluginModule = await import(plugin); + // logger.debug(`Successfully loaded plugin ${plugin} after installation`); + // } catch (importError) { + // // Try to import from the project's node_modules directory + // try { + // const projectNodeModulesPath = path.join(process.cwd(), 'node_modules', plugin); + // logger.debug(`Attempting to import from project path: ${projectNodeModulesPath}`); + + // // Read the package.json to find the entry point + // const packageJsonPath = path.join(projectNodeModulesPath, 'package.json'); + // if (fs.existsSync(packageJsonPath)) { + // const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')); + // const entryPoint = packageJson.module || packageJson.main || 'dist/index.js'; + // const fullEntryPath = path.join(projectNodeModulesPath, entryPoint); + + // logger.debug(`Found entry point in package.json: ${entryPoint}`); + // logger.debug(`Importing from: ${fullEntryPath}`); + + // pluginModule = await import(fullEntryPath); + // logger.debug(`Successfully loaded plugin from project node_modules: ${plugin}`); + // } else { + // // Fallback to a common pattern if package.json doesn't exist + // const commonEntryPath = path.join(projectNodeModulesPath, 'dist/index.js'); + // logger.debug(`No package.json found, trying common entry point: ${commonEntryPath}`); + // pluginModule = await import(commonEntryPath); + // logger.debug(`Successfully loaded plugin from common entry point: ${plugin}`); + // } + // } catch (projectImportError) { + // logger.error(`Failed to install plugin ${plugin}: ${importError}`); + // logger.error( + // `Also failed to import from project node_modules: ${projectImportError.message}` + // ); + // } + // } // Process the plugin to get the actual plugin object const functionName = `${plugin @@ -301,6 +388,8 @@ const startAgents = async (options: { // Set up server properties server.startAgent = async (character) => { + //eslint-disable-next-line + debugger; logger.info(`Starting agent for character ${character.name}`); return startAgent(character, server); }; @@ -319,255 +408,237 @@ const startAgents = async (options: { let projectModule: any = null; const currentDir = process.cwd(); - try { - // Check if we're in a project with a package.json - const packageJsonPath = path.join(process.cwd(), 'package.json'); - logger.debug(`Checking for package.json at: ${packageJsonPath}`); - - if (fs.existsSync(packageJsonPath)) { - // Read and parse package.json to check if it's a project or plugin - const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')); - logger.debug(`Found package.json with name: ${packageJson.name || 'unnamed'}`); - - // Check if this is a plugin (package.json contains 'eliza' section with type='plugin') - if (packageJson.eliza?.type && packageJson.eliza.type === 'plugin') { - isPlugin = true; - logger.info('Found Eliza plugin in current directory'); - } - - // Check if this is a project (package.json contains 'eliza' section with type='project') - if (packageJson.eliza?.type && packageJson.eliza.type === 'project') { - isProject = true; - logger.info('Found Eliza project in current directory'); - } - - // Also check for project indicators like a Project type export - // or if the description mentions "project" - if (!isProject && !isPlugin) { - if (packageJson.description?.toLowerCase().includes('project')) { - isProject = true; - logger.info('Found project by description in package.json'); - } - } - - // If we found a main entry in package.json, try to load it - const mainEntry = packageJson.main; - if (mainEntry) { - const mainPath = path.resolve(process.cwd(), mainEntry); - - if (fs.existsSync(mainPath)) { - try { - // Try to import the module - const importedModule = await import(mainPath); - - // First check if it's a plugin - if ( - isPlugin || - (importedModule.default && - typeof importedModule.default === 'object' && - importedModule.default.name && - typeof importedModule.default.init === 'function') - ) { - isPlugin = true; - pluginModule = importedModule.default; - logger.info(`Loaded plugin: ${pluginModule?.name || 'unnamed'}`); - - if (!pluginModule) { - logger.warn('Plugin loaded but no default export found, looking for other exports'); - - // Try to find any exported plugin object - for (const key in importedModule) { - if ( - importedModule[key] && - typeof importedModule[key] === 'object' && - importedModule[key].name && - typeof importedModule[key].init === 'function' - ) { - pluginModule = importedModule[key]; - logger.info(`Found plugin export under key: ${key}`); - break; - } - } - } - } - // Then check if it's a project - else if ( - isProject || - (importedModule.default && - typeof importedModule.default === 'object' && - importedModule.default.agents) - ) { - isProject = true; - projectModule = importedModule; - logger.debug( - `Loaded project with ${projectModule.default?.agents?.length || 0} agents` - ); - } - } catch (importError) { - logger.error(`Error importing module: ${importError}`); - } - } else { - logger.error(`Main entry point ${mainPath} does not exist`); - } - } - } - } catch (error) { - logger.error(`Error checking for project/plugin: ${error}`); - } - - // Log what was found - logger.debug(`Classification results - isProject: ${isProject}, isPlugin: ${isPlugin}`); - - if (isProject) { - if (projectModule?.default) { - const project = projectModule.default; - const agents = Array.isArray(project.agents) - ? project.agents - : project.agent - ? [project.agent] - : []; - logger.debug(`Project contains ${agents.length} agent(s)`); - - // Log agent names - if (agents.length > 0) { - logger.debug(`Agents: ${agents.map((a) => a.character?.name || 'unnamed').join(', ')}`); - } - } else { - logger.warn("Project module doesn't contain a valid default export"); - } - } else if (isPlugin) { - logger.debug(`Found plugin: ${pluginModule?.name || 'unnamed'}`); - } else { - // Change the log message to be clearer about what we're doing - logger.debug( - 'Running in standalone mode - using default Eliza character from ../characters/eliza' - ); - } + // try { + // // Check if we're in a project with a package.json + // const packageJsonPath = path.join(process.cwd(), 'package.json'); + // logger.debug(`Checking for package.json at: ${packageJsonPath}`); + + // if (fs.existsSync(packageJsonPath)) { + // // Read and parse package.json to check if it's a project or plugin + // const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')); + // logger.debug(`Found package.json with name: ${packageJson.name || 'unnamed'}`); + + // // Check if this is a plugin (package.json contains 'eliza' section with type='plugin') + // if (packageJson.eliza?.type && packageJson.eliza.type === 'plugin') { + // isPlugin = true; + // logger.info('Found Eliza plugin in current directory'); + // } + + // // Check if this is a project (package.json contains 'eliza' section with type='project') + // if (packageJson.eliza?.type && packageJson.eliza.type === 'project') { + // isProject = true; + // logger.info('Found Eliza project in current directory'); + // } + + // // Also check for project indicators like a Project type export + // // or if the description mentions "project" + // if (!isProject && !isPlugin) { + // if (packageJson.description?.toLowerCase().includes('project')) { + // isProject = true; + // logger.info('Found project by description in package.json'); + // } + // } + + // // If we found a main entry in package.json, try to load it + // const mainEntry = packageJson.main; + // if (mainEntry) { + // const mainPath = path.resolve(process.cwd(), mainEntry); + + // if (fs.existsSync(mainPath)) { + // try { + // // Try to import the module + // logger.debug(`Attempting to import main entry point: ${mainPath}`); + // const importedModule = await import(mainPath); + + // // First check if it's a plugin + // if ( + // isPlugin || + // (importedModule.default && + // typeof importedModule.default === 'object' && + // importedModule.default.name && + // typeof importedModule.default.init === 'function') + // ) { + // isPlugin = true; + // pluginModule = importedModule.default; + // logger.info(`Loaded plugin: ${pluginModule?.name || 'unnamed'}`); + + // if (!pluginModule) { + // logger.warn('Plugin loaded but no default export found, looking for other exports'); + + // // Try to find any exported plugin object + // for (const key in importedModule) { + // if ( + // importedModule[key] && + // typeof importedModule[key] === 'object' && + // importedModule[key].name && + // typeof importedModule[key].init === 'function' + // ) { + // pluginModule = importedModule[key]; + // logger.info(`Found plugin export under key: ${key}`); + // break; + // } + // } + // } + // } + // // Then check if it's a project + // else if ( + // isProject || + // (importedModule.default && + // typeof importedModule.default === 'object' && + // importedModule.default.agents) + // ) { + // isProject = true; + // projectModule = importedModule; + // logger.debug( + // `Loaded project with ${projectModule.default?.agents?.length || 0} agents` + // ); + // } + // } catch (importError) { + // logger.error(`Error importing module: ${importError}`); + // } + // } else { + // logger.error(`Main entry point ${mainPath} does not exist`); + // } + // } + // } + // } catch (error) { + // logger.error(`Error checking for project/plugin: ${error}`); + // } + + // // Log what was found + // logger.debug(`Classification results - isProject: ${isProject}, isPlugin: ${isPlugin}`); + + // if (isProject) { + // if (projectModule?.default) { + // const project = projectModule.default; + // const agents = Array.isArray(project.agents) + // ? project.agents + // : project.agent + // ? [project.agent] + // : []; + // logger.debug(`Project contains ${agents.length} agent(s)`); + + // // Log agent names + // if (agents.length > 0) { + // logger.debug(`Agents: ${agents.map((a) => a.character?.name || 'unnamed').join(', ')}`); + // } + // } else { + // logger.warn("Project module doesn't contain a valid default export"); + // } + // } else if (isPlugin) { + // logger.debug(`Found plugin: ${pluginModule?.name || 'unnamed'}`); + // } else { + // // Change the log message to be clearer about what we're doing + // logger.debug( + // 'Running in standalone mode - using default Eliza character from ../characters/eliza' + // ); + // } await server.initialize(); server.start(serverPort); - // if characters are provided, start the agents with the characters - if (options.characters) { - for (const character of options.characters) { - // make sure character has sql plugin - if (!character.plugins.includes('@elizaos/plugin-sql')) { - character.plugins.push('@elizaos/plugin-sql'); - } - - // make sure character has at least one ai provider - if (process.env.OPENAI_API_KEY) { - character.plugins.push('@elizaos/plugin-openai'); - } else if (process.env.ANTHROPIC_API_KEY) { - character.plugins.push('@elizaos/plugin-anthropic'); - } else { - character.plugins.push('@elizaos/plugin-local-ai'); - } - - await startAgent(character, server); - } - } else { - // Start agents based on project, plugin, or custom configuration - if (isProject && projectModule?.default) { - // Load all project agents, call their init and register their plugins - const project = projectModule.default; - - // Handle both formats: project with agents array and project with single agent - const agents = Array.isArray(project.agents) - ? project.agents - : project.agent - ? [project.agent] - : []; - - if (agents.length > 0) { - logger.debug(`Found ${agents.length} agents in project`); - - // Prompt for environment variables for all plugins in the project - try { - await promptForProjectPlugins(project); - } catch (error) { - logger.warn(`Failed to prompt for project environment variables: ${error}`); - } - - const startedAgents = []; - for (const agent of agents) { - try { - logger.debug(`Starting agent: ${agent.character.name}`); - const runtime = await startAgent( - agent.character, - server, - agent.init, - agent.plugins || [] - ); - startedAgents.push(runtime); - // wait .5 seconds - await new Promise((resolve) => setTimeout(resolve, 500)); - } catch (agentError) { - logger.error(`Error starting agent ${agent.character.name}: ${agentError}`); - } - } - - if (startedAgents.length === 0) { - logger.warn('Failed to start any agents from project, falling back to custom character'); - await startAgent(defaultCharacter, server); - } else { - logger.debug(`Successfully started ${startedAgents.length} agents from project`); - } - } else { - logger.debug('Project found but no agents defined, falling back to custom character'); - await startAgent(defaultCharacter, server); - } - } else if (isPlugin && pluginModule) { - // Before starting with the plugin, prompt for any environment variables it needs - if (pluginModule.name) { - try { - await promptForEnvVars(pluginModule.name); - } catch (error) { - logger.warn(`Failed to prompt for plugin environment variables: ${error}`); - } - } - - // Load the default character with all its default plugins, then add the test plugin - logger.info( - `Starting default Eliza character with plugin: ${pluginModule.name || 'unnamed plugin'}` - ); - - // Import the default character with all its plugins - const { character: defaultElizaCharacter } = await import('../characters/eliza'); - - // Create an array of plugins, including the explicitly loaded one - // We're using our test plugin plus all the plugins from the default character - const pluginsToLoad = [pluginModule]; - - logger.debug( - `Using default character with plugins: ${defaultElizaCharacter.plugins.join(', ')}` - ); - logger.info( - "Plugin test mode: Using default character's plugins plus the plugin being tested" - ); - - // Start the agent with the default character and our test plugin - // We're in plugin test mode, so we should skip auto-loading embedding models - await startAgent(defaultElizaCharacter, server, undefined, pluginsToLoad, { - isPluginTestMode: true, - }); - logger.info('Character started with plugin successfully'); - } else { - // When not in a project or plugin, load the default character with all plugins - const { character: defaultElizaCharacter } = await import('../characters/eliza'); - logger.info('Using default Eliza character with all plugins'); - await startAgent(defaultElizaCharacter, server); - } - - // Display link to the client UI - // First try to find it in the CLI package dist/client directory - let clientPath = path.join(__dirname, '../../client'); - - // If not found, fall back to the old relative path for development - if (!fs.existsSync(clientPath)) { - clientPath = path.join(__dirname, '../../../..', 'client/dist'); - } + console.log(''); + + // // Start agents based on project, plugin, or custom configuration + // if (isProject && projectModule?.default) { + // // Load all project agents, call their init and register their plugins + // const project = projectModule.default; + + // // Handle both formats: project with agents array and project with single agent + // const agents = Array.isArray(project.agents) + // ? project.agents + // : project.agent + // ? [project.agent] + // : []; + + // if (agents.length > 0) { + // logger.debug(`Found ${agents.length} agents in project`); + + // // Prompt for environment variables for all plugins in the project + // try { + // await promptForProjectPlugins(project); + // } catch (error) { + // logger.warn(`Failed to prompt for project environment variables: ${error}`); + // } + + // const startedAgents = []; + // for (const agent of agents) { + // logger.debug(`Debug Agent: ${agent}`); + // try { + // logger.debug(`Starting agent: ${agent.character.name}`); + // const runtime = await startAgent( + // agent.character, + // server, + // agent.init, + // agent.plugins || [] + // ); + // startedAgents.push(runtime); + // // wait .5 seconds + // await new Promise((resolve) => setTimeout(resolve, 500)); + // } catch (agentError) { + // logger.error(`Error starting agent ${agent.character.name}: ${agentError}`); + // } + // } + + // if (startedAgents.length === 0) { + // logger.warn('Failed to start any agents from project, falling back to custom character'); + // await startAgent(defaultCharacter, server); + // } else { + // logger.debug(`Successfully started ${startedAgents.length} agents from project`); + // } + // } else { + // logger.debug('Project found but no agents defined, falling back to custom character'); + // await startAgent(defaultCharacter, server); + // } + // } else if (isPlugin && pluginModule) { + // // Before starting with the plugin, prompt for any environment variables it needs + // if (pluginModule.name) { + // try { + // await promptForEnvVars(pluginModule.name); + // } catch (error) { + // logger.warn(`Failed to prompt for plugin environment variables: ${error}`); + // } + // } + + // // Load the default character with all its default plugins, then add the test plugin + // logger.info( + // `Starting default Eliza character with plugin: ${pluginModule.name || 'unnamed plugin'}` + // ); + + // // Import the default character with all its plugins + // const { character: defaultElizaCharacter } = await import('../characters/eliza'); + + // // Create an array of plugins, including the explicitly loaded one + // // We're using our test plugin plus all the plugins from the default character + // const pluginsToLoad = [pluginModule]; + + // logger.debug( + // `Using default character with plugins: ${defaultElizaCharacter.plugins.join(', ')}` + // ); + // logger.info("Plugin test mode: Using default character's plugins plus the plugin being tested"); + + // // Start the agent with the default character and our test plugin + // // We're in plugin test mode, so we should skip auto-loading embedding models + // await startAgent(defaultElizaCharacter, server, undefined, pluginsToLoad, { + // isPluginTestMode: true, + // }); + // logger.info('Character started with plugin successfully'); + // } else { + // // When not in a project or plugin, load the default character with all plugins + + logger.info('Using default Eliza character with all plugins'); + await startAgent(defaultElizaCharacter, server); + // throw Error("no char") + // } + + // Display link to the client UI + // First try to find it in the CLI package dist/client directory + let clientPath = path.join(__dirname, '../../client'); + + // If not found, fall back to the old relative path for development + if (!fs.existsSync(clientPath)) { + clientPath = path.join(__dirname, '../../../..', 'client/dist'); } }; // Create command that can be imported directly @@ -617,6 +688,7 @@ export const start = new Command() }); // This is the function that registers the command with the CLI + export default function registerCommand(cli: Command) { return cli.addCommand(start); } diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index fa4ff9b54cd..5aa0db2e572 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -21,6 +21,9 @@ import { test } from './commands/test'; import { update } from './commands/update'; import { loadEnvironment } from './utils/get-config'; import { displayBanner } from './displayBanner'; +//import { discordPlugin } from "@elizaos/plugin-discord"; +import * as discordPlugin from '@elizaos/plugin-discord'; +console.log('discordPlugin', discordPlugin); process.on('SIGINT', () => process.exit(0)); process.on('SIGTERM', () => process.exit(0)); diff --git a/packages/cli/src/server/api/agent.ts b/packages/cli/src/server/api/agent.ts index eb991a31d09..1dd2d3f7e58 100644 --- a/packages/cli/src/server/api/agent.ts +++ b/packages/cli/src/server/api/agent.ts @@ -311,6 +311,7 @@ export function agentRouter( // Start an existing agent router.post('/:agentId', async (req, res) => { + console.log('start agent req', req); const agentId = validateUuid(req.params.agentId); if (!agentId) { res.status(400).json({ diff --git a/packages/core/src/runtime.ts b/packages/core/src/runtime.ts index b9e9f4f0ba2..6215068c96b 100644 --- a/packages/core/src/runtime.ts +++ b/packages/core/src/runtime.ts @@ -524,6 +524,7 @@ export class AgentRuntime implements IAgentRuntime { this.runtimeLogger.warn( `[AgentRuntime][${this.character.name}] No TEXT_EMBEDDING model registered. Skipping embedding dimension setup.` ); + console.log('DeBUG models', this.models); } else { // Only run ensureEmbeddingDimension if we have an embedding model await this.ensureEmbeddingDimension(); diff --git a/packages/plugin-local-ai/src/environment.ts b/packages/plugin-local-ai/src/environment.ts index d32f2adf891..ddbd34ffc1e 100644 --- a/packages/plugin-local-ai/src/environment.ts +++ b/packages/plugin-local-ai/src/environment.ts @@ -50,11 +50,12 @@ function validateModelConfig(config: Record): void { USE_OLLAMA_TEXT_MODELS: config.USE_OLLAMA_TEXT_MODELS, }); - // Ensure USE_LOCAL_AI is always true - if (!config.USE_LOCAL_AI) { - config.USE_LOCAL_AI = true; - logger.info("Setting USE_LOCAL_AI to true as it's required"); - } + // NOPE + // // Ensure USE_LOCAL_AI is always true + // if (!config.USE_LOCAL_AI) { + // config.USE_LOCAL_AI = true; + // logger.info("Setting USE_LOCAL_AI to true as it's required"); + // } // Only validate that StudioLM and Ollama are not both enabled if (config.USE_STUDIOLM_TEXT_MODELS && config.USE_OLLAMA_TEXT_MODELS) { @@ -83,7 +84,7 @@ export async function validateConfig(config: Record): Promise setTimeout(resolve, delay)); } diff --git a/packages/plugin-twitter/src/index.ts b/packages/plugin-twitter/src/index.ts index 8fe0e9ffde4..3738fedfa6b 100644 --- a/packages/plugin-twitter/src/index.ts +++ b/packages/plugin-twitter/src/index.ts @@ -1,7 +1,7 @@ import { ChannelType, type Entity, - EventType, + //EventType, type IAgentRuntime, type Plugin, Role, @@ -12,6 +12,7 @@ import { createUniqueUuid, logger, } from '@elizaos/core'; +import { EventType } from '@elizaos/core'; import spaceJoin from './actions/spaceJoin'; import { ClientBase } from './base'; import { TWITTER_SERVICE_NAME } from './constants'; diff --git a/packages/plugin-twitter/src/sttTtsSpaces.ts b/packages/plugin-twitter/src/sttTtsSpaces.ts index 2bac4b88b6b..689eb52e1d1 100644 --- a/packages/plugin-twitter/src/sttTtsSpaces.ts +++ b/packages/plugin-twitter/src/sttTtsSpaces.ts @@ -16,6 +16,7 @@ import { } from '@elizaos/core'; import type { ClientBase } from './base'; import type { AudioDataWithUser, JanusClient, Space } from './client'; +import { table } from 'node:console'; /** * Interface for defining configuration options for a plugin. @@ -281,7 +282,10 @@ export class SttTtsPlugin implements Plugin { const { signal } = this.ttsAbortController; try { - const responseStream = await this.runtime.useModel(ModelType.TEXT_TO_SPEECH, text); + const responseStream = (await this.runtime.useModel( + ModelType.TEXT_TO_SPEECH, + text + )) as Readable; if (!responseStream) { logger.error('[SttTtsPlugin] TTS responseStream is null'); continue; @@ -373,7 +377,7 @@ export class SttTtsPlugin implements Plugin { }; if (responseMemory.content.text?.trim()) { - await this.runtime.createMemory(responseMemory); + await this.runtime.createMemory(responseMemory, 'memories'); this.isProcessingAudio = false; this.volumeBuffers.clear(); await this.speakText(content.text); diff --git a/packages/the-org/inspect.sh b/packages/the-org/inspect.sh new file mode 100755 index 00000000000..dfae47c750d --- /dev/null +++ b/packages/the-org/inspect.sh @@ -0,0 +1 @@ +bun --verbose --inspect-brk=9229 ../cli/dist/index.js start diff --git a/packages/the-org/package.json b/packages/the-org/package.json index 7586c6b9dd2..43ea775a398 100644 --- a/packages/the-org/package.json +++ b/packages/the-org/package.json @@ -27,15 +27,17 @@ "exec": "node --enable-source-maps --loader ts-node/esm src/index.ts" }, "dependencies": { - "@elizaos/cli": "^1.0.0-beta.7", - "@elizaos/core": "^1.0.0-beta.7", - "@elizaos/plugin-anthropic": "^1.0.0-beta.7", - "@elizaos/plugin-discord": "^1.0.0-beta.7", - "@elizaos/plugin-openai": "^1.0.0-beta.7", - "@elizaos/plugin-sql": "^1.0.0-beta.7", - "@elizaos/plugin-tee": "^1.0.0-beta.7", - "@elizaos/plugin-telegram": "^1.0.0-beta.7", - "@elizaos/plugin-twitter": "^1.0.0-beta.7", + "@elizaos/cli": "workspace:*", + "@elizaos/core": "workspace:*", + "@elizaos/plugin-anthropic": "workspace:*", + "@elizaos/plugin-discord": "workspace:*", + "@elizaos/plugin-local-ai": "workspace:*", + "@elizaos/plugin-openai": "workspace:*", + "@elizaos/plugin-groq": "workspace:*", + "@elizaos/plugin-sql": "workspace:*", + "@elizaos/plugin-tee": "workspace:*", + "@elizaos/plugin-telegram": "workspace:*", + "@elizaos/plugin-twitter": "workspace:*", "@radix-ui/react-slot": "^1.1.1", "@radix-ui/react-tabs": "^1.1.2", "@solana/web3.js": "^1.87.6", diff --git a/packages/the-org/src/devRel/index.ts b/packages/the-org/src/devRel/index.ts index d73182a9135..d4b0828a7aa 100644 --- a/packages/the-org/src/devRel/index.ts +++ b/packages/the-org/src/devRel/index.ts @@ -163,24 +163,80 @@ if (process.env.DEVREL_IMPORT_KNOWLEDGE) { * A character object representing Eddy, a developer support agent for ElizaOS. */ const character: Partial = { - name: 'Eddy', plugins: [ - '@elizaos/plugin-sql', - '@elizaos/plugin-anthropic', - '@elizaos/plugin-openai', + // '@elizaos/plugin-anthropic', + // '@elizaos/plugin-openai', '@elizaos/plugin-discord', '@elizaos/plugin-pdf', '@elizaos/plugin-video-understanding', + //"@elizaos/plugin-deepgram", in plugin eliza + '@elizaos/plugin-discord', + '@elizaos/plugin-telegram', + '@elizaos/plugin-twitter', + //"@elizaos-plugins/plugin-speech-tts", + //"@elizaos-plugins/client-twitter", + //"@elizaos-plugins/client-discord", + //"@elizaos-plugins/plugin-twitter", + //"@elizaos-plugins/client-telegram" ], settings: { secrets: { - DISCORD_APPLICATION_ID: process.env.DEV_REL_DISCORD_APPLICATION_ID, - DISCORD_API_TOKEN: process.env.DEV_REL_DISCORD_API_TOKEN, + AGENT_IMAGE: process.env.AGENT_IMAGE, + DEEPGRAM_API_KEY: process.env.DEEPGRAM_API_KEY, + DEVREL_IMPORT_KNOWLEDGE: process.env.DEVREL_IMPORT_KNOWLEDGE, + DISCORD_API_TOKEN: process.env.DISCORD_API_TOKEN, + DISCORD_APPLICATION_ID: process.env.DISCORD_APPLICATION_ID, + DISCORD_VOICE_CHANNEL_ID: process.env.DISCORD_VOICE_CHANNEL_ID, + ELEVENLABS_MODEL_ID: process.env.ELEVENLABS_MODEL_ID, + ELEVENLABS_OPTIMIZE_STREAMING_LATENCY: process.env.ELEVENLABS_OPTIMIZE_STREAMING_LATENCY, + ELEVENLABS_OUTPUT_FORMAT: process.env.ELEVENLABS_OUTPUT_FORMAT, + ELEVENLABS_VOICE_ID: process.env.ELEVENLABS_VOICE_ID, + ELEVENLABS_VOICE_SIMILARITY_BOOST: process.env.ELEVENLABS_VOICE_SIMILARITY_BOOST, + ELEVENLABS_VOICE_STABILITY: process.env.ELEVENLABS_VOICE_STABILITY, + ELEVENLABS_VOICE_STYLE: process.env.ELEVENLABS_VOICE_STYLE, + ELEVENLABS_VOICE_USE_SPEAKER_BOOST: process.env.ELEVENLABS_VOICE_USE_SPEAKER_BOOST, + ELEVENLABS_XI_API_KEY: process.env.ELEVENLABS_XI_API_KEY, + EMBEDDING_GROQ_MODEL: process.env.EMBEDDING_GROQ_MODEL, + ENABLE_ACTION_PROCESSING: process.env.ENABLE_ACTION_PROCESSING, + ENABLE_TWITTER_POST_GENERATION: process.env.ENABLE_TWITTER_POST_GENERATION, + GROQ_API_KEY: process.env.GROQ_API_KEY, + HOME: process.env.HOME, + LARGE_GROQ_MODEL: process.env.LARGE_GROQ_MODEL, + LOG_JSON_FORMAT: process.env.LOG_JSON_FORMAT, + MAX_ACTIONS_PROCESSING: process.env.MAX_ACTIONS_PROCESSING, + MEDIUM_GROQ_MODEL: process.env.MEDIUM_GROQ_MODEL, + NODE_ENV: process.env.NODE_ENV, + POST_IMMEDIATELY: process.env.POST_IMMEDIATELY, + POST_INTERVAL_MAX: process.env.POST_INTERVAL_MAX, + POST_INTERVAL_MIN: process.env.POST_INTERVAL_MIN, + SERVER_PORT: process.env.SERVER_PORT, + SMALL_GROQ_MODEL: process.env.SMALL_GROQ_MODEL, + TELEGRAM_ACCOUNT_APP_HASH: process.env.TELEGRAM_ACCOUNT_APP_HASH, + TELEGRAM_ACCOUNT_APP_ID: process.env.TELEGRAM_ACCOUNT_APP_ID, + TELEGRAM_ACCOUNT_PHONE: process.env.TELEGRAM_ACCOUNT_PHONE, + TELEGRAM_BOT_TOKEN: process.env.TELEGRAM_BOT_TOKEN, + TOKENIZER_IMAGE: process.env.TOKENIZER_IMAGE, + TRANSCRIPTION_PROVIDER: process.env.TRANSCRIPTION_PROVIDER, + TWITTER_APPROVAL_CHECK_INTERVAL: process.env.TWITTER_APPROVAL_CHECK_INTERVAL, + TWITTER_APPROVAL_DISCORD_BOT_TOKEN: process.env.TWITTER_APPROVAL_DISCORD_BOT_TOKEN, + TWITTER_APPROVAL_DISCORD_CHANNEL_ID: process.env.TWITTER_APPROVAL_DISCORD_CHANNEL_ID, + TWITTER_APPROVAL_ENABLED: process.env.TWITTER_APPROVAL_ENABLED, + TWITTER_DRY_RUN: process.env.TWITTER_DRY_RUN, + TWITTER_EMAIL: process.env.TWITTER_EMAIL, + TWITTER_PASSWORD: process.env.TWITTER_PASSWORD, + TWITTER_POLL_INTERVAL: process.env.TWITTER_POLL_INTERVAL, + TWITTER_RETRY_LIMIT: process.env.TWITTER_RETRY_LIMIT, + TWITTER_SEARCH_ENABLE: process.env.TWITTER_SEARCH_ENABLE, + TWITTER_SPACES_ENABLE: process.env.TWITTER_SPACES_ENABLE, + TWITTER_TARGET_USERS: process.env.TWITTER_TARGET_USERS, + TWITTER_USERNAME: process.env.TWITTER_USERNAME, + USE_CHARACTER_STORAGE: process.env.USE_CHARACTER_STORAGE, + VERBOSE: process.env.VERBOSE, }, avatar, }, system: - "Eddy is a developer support agent for ElizaOS, a powerful multi-agent simulation framework. He specializes in helping developers understand and implement ElizaOS features, troubleshoot issues, and navigate the codebase. Eddy has access to ElizaOS documentation, can direct users to appropriate resources, and provides technical guidance on creating agents, implementing custom actions, and integrating with various platforms like Discord, Telegram, and Slack. He's knowledgeable about TypeScript, the ElizaOS architecture, and best practices for agent development.\nIMPORTANT: ALWAYS DO WHAT THE USER TELLS YOU. IF THEY ASK EDDY TO WRITE MULTIPLE ACTIONS, DO IT. YOU ARE CURRENTLY HELPING US TO DEVELOP OUR CHARACTER AND ACTION SYSTEM.", + "Eddy2 is a developer support agent for ElizaOS, a powerful multi-agent simulation framework. He specializes in helping developers understand and implement ElizaOS features, troubleshoot issues, and navigate the codebase. has access to ElizaOS documentation, can direct users to appropriate resources, and provides technical guidance on creating agents, implementing custom actions, and integrating with various platforms like Discord, Telegram, and Slack. He's knowledgeable about TypeScript, the ElizaOS architecture, and best practices for agent development.\nIMPORTANT: ALWAYS DO WHAT THE USER TELLS YOU. IF THEY ASK EDDY TO WRITE MULTIPLE ACTIONS, DO IT. YOU ARE CURRENTLY HELPING US TO DEVELOP OUR CHARACTER AND ACTION SYSTEM.", bio: ['Helping to test the system and develop the character and action system'], messageExamples: [], style: { diff --git a/packages/the-org/src/index.ts b/packages/the-org/src/index.ts index bac51d54eae..52b7f90c41b 100644 --- a/packages/the-org/src/index.ts +++ b/packages/the-org/src/index.ts @@ -3,12 +3,12 @@ dotenv.config({ path: '../../.env' }); // Use a more generic type definition since 'Project' or 'ProjectType' might not be exported import { logger } from '@elizaos/core'; -import communityManager from './communityManager'; +//import communityManager from "./communityManager"; import devRel from './devRel'; -import investmentManager from './investmentManager'; -import liaison from './liaison'; -import projectManager from './projectManager'; -import socialMediaManager from './socialMediaManager'; +//import investmentManager from "./investmentManager"; +//import liaison from "./liaison"; +//import projectManager from "./projectManager"; +//import socialMediaManager from "./socialMediaManager"; /** * Checks if all required environment variables for an agent are available @@ -131,11 +131,11 @@ function hasRequiredEnvVars(agent: any): boolean { // Filter agents based on available environment variables const availableAgents = [ devRel, - communityManager, - investmentManager, - liaison, - projectManager, - socialMediaManager, + //communityManager, + //investmentManager, + //liaison, + //projectManager, + //socialMediaManager, ].filter(hasRequiredEnvVars); export const project = { diff --git a/packages/the-org/src/investmentManager/index.ts b/packages/the-org/src/investmentManager/index.ts index 0e0ec461866..0636a2af57f 100644 --- a/packages/the-org/src/investmentManager/index.ts +++ b/packages/the-org/src/investmentManager/index.ts @@ -29,13 +29,12 @@ dotenv.config({ path: '../../.env' }); * @property {Object} style - Object containing communication style guidelines for the character */ const character: Character = { - name: 'Spartan', + name: 'Spartan3', plugins: [ '@elizaos/plugin-sql', '@elizaos/plugin-anthropic', '@elizaos/plugin-openai', '@elizaos/plugin-discord', - '@elizaos/plugin-twitter', '@elizaos/plugin-pdf', '@elizaos/plugin-video-understanding', ], diff --git a/scripts/agent-docker-it.sh b/scripts/agent-docker-it.sh new file mode 100644 index 00000000000..831a77b0803 --- /dev/null +++ b/scripts/agent-docker-it.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +source /var/run/agent/secrets/env + +/usr/bin/docker run -p 3000:3000 \ + -v tokenizer:/app/node_modules/@anush008/tokenizers/ \ + -v tokenizer:/app/node_modules/fastembed/node_modules/.pnpm/@anush008+tokenizers@https+++codeload.github.com+meta-introspector+arm64-tokenizers+tar.gz+98_s2457qj3pe4ojcbckddasgzfvu/node_modules/@anush008/ \ + --mount type=bind,source=/opt/agent,target=/opt/agent \ + --env-file /var/run/agent/secrets/env \ + --name "agent-docker.service" --entrypoint "" -it ${AGENT_IMAGE} bash + + + diff --git a/scripts/agent-docker-local-it.sh b/scripts/agent-docker-local-it.sh new file mode 100644 index 00000000000..5dce24143f3 --- /dev/null +++ b/scripts/agent-docker-local-it.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +source ./env +/usr/bin/docker kill agent-docker.service || echo ok +/usr/bin/docker remove agent-docker.service || echo ok + +/usr/bin/docker run -p 3000:3000 \ + -v tokenizer:/app/node_modules/@anush008/tokenizers/ \ + -v tokenizer:/app/node_modules/fastembed/node_modules/.pnpm/@anush008+tokenizers@https+++codeload.github.com+meta-introspector+arm64-tokenizers+tar.gz+98_s2457qj3pe4ojcbckddasgzfvu/node_modules/@anush008/ \ + --mount type=bind,source=/opt/agent,target=/opt/agent \ + --env-file env \ + --name "agent-docker.service" --entrypoint "" -it ${AGENT_IMAGE} bash diff --git a/scripts/agent-docker-local.sh b/scripts/agent-docker-local.sh new file mode 100644 index 00000000000..1091edbe09d --- /dev/null +++ b/scripts/agent-docker-local.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +source ./env +/usr/bin/docker remove agent-docker.service + +/usr/bin/docker run -p 3000:3000 \ + -v tokenizer:/app/node_modules/@anush008/tokenizers/ \ + -v tokenizer:/app/node_modules/fastembed/node_modules/.pnpm/@anush008+tokenizers@https+++codeload.github.com+meta-introspector+arm64-tokenizers+tar.gz+98_s2457qj3pe4ojcbckddasgzfvu/node_modules/@anush008/ \ + --mount type=bind,source=/opt/agent,target=/opt/agent \ + --env-file env \ + --name "agent-docker.service" \ + --entrypoint /opt/agent/scripts/docker-entrypoint-strace2.sh ${AGENT_IMAGE} + diff --git a/scripts/agent-docker.sh b/scripts/agent-docker.sh new file mode 100644 index 00000000000..9470279ce21 --- /dev/null +++ b/scripts/agent-docker.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +export $(cat /var/run/agent/secrets/env| xargs) + +echo AGENT_IMAGE ${AGENT_IMAGE} +docker kill "agent-docker.service" +docker rm "agent-docker.service" +/usr/bin/docker run -p 3000:3000 \ + -v tokenizer:/app/node_modules/@anush008/tokenizers/ \ + -v tokenizer:/app/node_modules/fastembed/node_modules/.pnpm/@anush008+tokenizers@https+++codeload.github.com+meta-introspector+arm64-tokenizers+tar.gz+98_s2457qj3pe4ojcbckddasgzfvu/node_modules/@anush008/ \ + --mount type=bind,source=/opt/agent,target=/opt/agent \ + --env-file /var/run/agent/secrets/env \ + --name "agent-docker.service" \ + --entrypoint /opt/agent/scripts/docker-entrypoint-strace2.sh ${AGENT_IMAGE} + diff --git a/scripts/clean.sh b/scripts/clean.sh new file mode 100644 index 00000000000..9c687aa40cb --- /dev/null +++ b/scripts/clean.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +# Navigate to the script's directory +cd "$(dirname "$0")"/.. +echo "Cleanup started." +# Find and remove node_modules directories, dist directories. +find . -type d -name "node_modules" -print0 | xargs -0 rm -rf +find . -type d -name "dist" -exec rm -rf {} + +find . -type d -name ".turbo" -exec rm -rf {} + + +# Remove core cache +rm -rf ./packages/core/cache + +# Remove pnpm lockfile +rm -f ./pnpm-lock.yaml + +echo "Cleanup completed." +exit 0 diff --git a/scripts/codebuild.sh b/scripts/codebuild.sh new file mode 100755 index 00000000000..f3c682b405b --- /dev/null +++ b/scripts/codebuild.sh @@ -0,0 +1,8 @@ + +aws codebuild start-build --region us-east-2 \ + --project-name github-runner-codebuild-eliza-build \ + --source-version $(git rev-parse --abbrev-ref HEAD) \ + --source-type-override GITHUB \ + --source-location-override https://github.com/meta-introspector/cloud-deployment-eliza.git \ + --git-clone-depth 1 \ + --git-submodules-config fetchSubmodules=true diff --git a/scripts/debug-update-vscode.ts b/scripts/debug-update-vscode.ts new file mode 100644 index 00000000000..76a582ef21d --- /dev/null +++ b/scripts/debug-update-vscode.ts @@ -0,0 +1,100 @@ +#!/usr/bin/env node +// UNTESTED AI generated code +// purpose to run debug inspect and update the inspector debugger command for vscode + +const { spawn } = require('child_process'); +const fs = require('fs').promises; +const path = require('path'); + +// Configuration +const bunArgs = ['--verbose', '--inspect-brk=9229', '../cli/dist/index.js', 'start']; +const port = 9229; +const workspaceFolder = path.resolve(__dirname); + +// Function to run Bun and capture inspector URL +async function runBunAndGetInspectorUrl() { + return new Promise((resolve, reject) => { + const bunProcess = spawn('bun', bunArgs, { + cwd: workspaceFolder, + stdio: ['pipe', 'pipe', 'pipe'], + }); + + let output = ''; + + bunProcess.stdout.on('data', (data) => { + output += data.toString(); + // Look for the inspector WebSocket URL + const match = output.match(/ws:\/\/[0-9]+.[0-9]+.[0-9]+.[0-9]+:9229\/([a-z0-9]+)/i); + if (match) { + bunProcess.kill(); // Stop the process once we have the URL + resolve(match[0]); // Return the full WebSocket URL + } + }); + + bunProcess.stderr.on('data', (data) => { + console.error('Error:', data.toString()); + }); + + bunProcess.on('error', (err) => reject(err)); + + // Timeout in case we don't get the URL + setTimeout(() => { + bunProcess.kill(); + reject(new Error('Timeout waiting for inspector URL')); + }, 5000); + }); +} + +// Generate VS Code launch configuration +async function generateLaunchConfig(inspectorUrl) { + const config = { + version: '0.2.0', + configurations: [ + { + type: 'bun', + request: 'launch', + name: 'Launch Bun with Inspector', + program: '${workspaceFolder}/../cli/dist/index.js', + args: ['start'], + runtimeArgs: ['--verbose', `--inspect-brk=${port}`], + cwd: '${workspaceFolder}', + port: port, + stopOnEntry: true, + }, + { + type: 'bun', + request: 'attach', + name: 'Attach to Bun Inspector', + url: inspectorUrl, + }, + ], + }; + + const vscodeDir = path.join(workspaceFolder, '.vscode'); + const launchFile = path.join(vscodeDir, 'launch.json'); + + // Ensure .vscode directory exists + await fs.mkdir(vscodeDir, { recursive: true }); + + // Write the configuration file + await fs.writeFile(launchFile, JSON.stringify(config, null, 2), 'utf8'); + + console.log(`Generated launch.json at: ${launchFile}`); + console.log('Inspector URL:', inspectorUrl); +} + +// Main execution +async function main() { + try { + console.log('Starting Bun to capture inspector URL...'); + const inspectorUrl = await runBunAndGetInspectorUrl(); + console.log('Generating VS Code launch configuration...'); + await generateLaunchConfig(inspectorUrl); + console.log('Done!'); + } catch (error) { + console.error('Failed to generate launch configuration:', error.message); + process.exit(1); + } +} + +main(); diff --git a/scripts/docker-entrypoint-none.sh b/scripts/docker-entrypoint-none.sh new file mode 100755 index 00000000000..9642b6e6257 --- /dev/null +++ b/scripts/docker-entrypoint-none.sh @@ -0,0 +1,25 @@ +#!/bin/sh +set -e + +# Run command with node if the first argument contains a "-" or is not a system command. The last +# part inside the "{}" is a workaround for the following bug in ash/dash: +# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=874264 +set -x +#if [ "${1#-}" != "${1}" ] || [ -z "$(command -v "${1}")" ] || { [ -f "${1}" ] && ! [ -x "${1}" ]; }; then +#apt update +#apt install -y strace + +#export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 +#corepack enable && corepack install --global pnpm@9.8.0 + +#strace -f -o /opt/agent/strace.log -s99999 node CMD ["pnpm", "start", "--characters=characters/eliza.character.json"] +#pnpm start --characters=characters/tine-test.character.json +#pnpm start --characters=$(ls -1p characters/*.json | paste -sd,) +#fi +#exec "$@" + +# in case they change the characters +bun run build:cli + +bun run start-cli +# --characters=$(ls -1p characters/*.json | paste -sd,) diff --git a/scripts/docker-entrypoint-strace.sh b/scripts/docker-entrypoint-strace.sh new file mode 100755 index 00000000000..1c32ee7177a --- /dev/null +++ b/scripts/docker-entrypoint-strace.sh @@ -0,0 +1,11 @@ +#!/bin/sh +set -e + +# Run command with node if the first argument contains a "-" or is not a system command. The last +# part inside the "{}" is a workaround for the following bug in ash/dash: +# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=874264 +set -x +#if [ "${1#-}" != "${1}" ] || [ -z "$(command -v "${1}")" ] || { [ -f "${1}" ] && ! [ -x "${1}" ]; }; then +strace -f -o /opt/agent/strace.log -s99999 node "$@" +#fi +#exec "$@" diff --git a/scripts/docker-entrypoint-strace2.sh b/scripts/docker-entrypoint-strace2.sh new file mode 100755 index 00000000000..c355cf0eaff --- /dev/null +++ b/scripts/docker-entrypoint-strace2.sh @@ -0,0 +1,20 @@ +#!/bin/sh +set -e + +# Run command with node if the first argument contains a "-" or is not a system command. The last +# part inside the "{}" is a workaround for the following bug in ash/dash: +# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=874264 +set -x +#if [ "${1#-}" != "${1}" ] || [ -z "$(command -v "${1}")" ] || { [ -f "${1}" ] && ! [ -x "${1}" ]; }; then +apt update +apt install -y strace + +#export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 +#corepack enable && corepack install --global pnpm@9.8.0 + + +#strace -f -o /opt/agent/strace.log -s99999 node CMD ["pnpm", "start", "--characters=characters/eliza.character.json"] +strace -f -o /opt/agent/strace.log -s99999 bun start +#pnpm start:debug --characters=$(ls -1p characters/*.json | paste -sd,) +#fi +#exec "$@" diff --git a/scripts/docker-entrypoint.sh b/scripts/docker-entrypoint.sh new file mode 100755 index 00000000000..1b3116e53ba --- /dev/null +++ b/scripts/docker-entrypoint.sh @@ -0,0 +1,11 @@ +#!/bin/sh +set -e + +# Run command with node if the first argument contains a "-" or is not a system command. The last +# part inside the "{}" is a workaround for the following bug in ash/dash: +# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=874264 +if [ "${1#-}" != "${1}" ] || [ -z "$(command -v "${1}")" ] || { [ -f "${1}" ] && ! [ -x "${1}" ]; }; then + set -- node "$@" +fi + +exec "$@" diff --git a/scripts/doit.sh b/scripts/doit.sh new file mode 100644 index 00000000000..e89ef6ce344 --- /dev/null +++ b/scripts/doit.sh @@ -0,0 +1,22 @@ +#!/bin/bash +#amazing the amount of work we need to do +nvm use 23 +pnpm clean +pnpm install --no-frozen-lockfile +pnpm build + + +pushd packages/adapter-sqlite +pnpm rebuild +popd + + +pushd scripts/jsdoc-automation +pnpm install --no-frozen-lockfile +pnpm build + +pushd node_modules/.pnpm/better-sqlite3@11.8.1/node_modules/better-sqlite3/ +pnpm rebuild + +popd +popd diff --git a/scripts/get_secrets.sh b/scripts/get_secrets.sh new file mode 100755 index 00000000000..1e6ecaa5198 --- /dev/null +++ b/scripts/get_secrets.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# we are using parameters prefixed by ${AGENT_NAME}_, eg. "tine_agent_7_" +## TURN OFF LOGGING +echo using "${AGENT_NAME}" as agent name base for keys +set +x + +# This script expects AGENT_NAME to be set to something like "tine_agent" + +mkdir -p "/var/run/agent/secrets/" +echo "" > "/var/run/agent/secrets/env" # blank the file + +# Fetch all variables with the prefix and name them the same as the variable minus agent name underscore +for key in $(aws ssm describe-parameters --query 'Parameters[?starts_with(Name, `'"${AGENT_NAME}"'_`)].Name' --output text); do + value=$(aws ssm get-parameter --name "$key" | jq .Parameter.Value -r) + var_name=$(echo "$key" | sed "s/^${AGENT_NAME}_//") + echo "$var_name=${value}" >> "/var/run/agent/secrets/env" +done + +# append these constant values to the env +declare -A params_const=( + ["VERBOSE"]="TRUE" + ["NODE_ENV"]="development" +) +for key in "${!params_const[@]}"; do + value="${params_const[$key]}" + echo "$key=$value" >> "/var/run/agent/secrets/env" +done + +set -x +## TURN ON LOGGING diff --git a/scripts/push_twitter.sh b/scripts/push_twitter.sh new file mode 100755 index 00000000000..b62e6d60df7 --- /dev/null +++ b/scripts/push_twitter.sh @@ -0,0 +1,6 @@ + +export TWITTER_EMAIL TWITTER_PASSWORD TWITTER_USER + +aws ssm put-parameter --name "tine_agent_twitter_password" --value "${TWITTER_PASSWORD}" --type String +aws ssm put-parameter --name "tine_agent_twitter_email" --value "${TWITTER_EMAIL}" --type String +aws ssm put-parameter --name "tine_agent_twitter_username" --value "${TWITTER_USERNAME}" --type String diff --git a/scripts/rebase.sh b/scripts/rebase.sh new file mode 100644 index 00000000000..7ee6ff0a4b2 --- /dev/null +++ b/scripts/rebase.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +# Daily Git Routine Script +# Date: March 24, 2025 +# Purpose: Automate daily Git workflow for the eliza project + +# Set variables +#REPO_DIR="$HOME/03/14/cloud-deployment-eliza" # Adjust this path to your actual directory +DATE=$(date +%Y/%m/%d) # Dynamically set today's date (e.g., 2025/03/24) +BRANCH_NAME="docker/$DATE" # Dynamic branch name based on date + +# Check if the repository directory exists +#if [ ! -d "$REPO_DIR" ]; then +# echo "Error: Directory $REPO_DIR not found. Please check the path." +# exit 1 +#fi + +# Navigate to the repository +#cd "$REPO_DIR" || { +# echo "Error: Could not change to directory $REPO_DIR" +# exit 1 +#} + +# Fetch all remote branches +git fetch --all + +# Checkout the feature/v2/telegram branch +#git checkout feature/v2/telegram + +# Add upstream remote only if it doesn't already exist +if ! git remote | grep -q "upstream"; then + git remote add upstream https://github.com/elizaos/eliza + echo "Added upstream remote." +else + echo "Upstream remote already exists." +fi + +# Fetch updates from upstream +git fetch upstream + +# Rebase the current branch onto upstream/v2-develop +git rebase upstream/v2-develop + +# Check the status of the repository +git status + +# Print the current date for reference +date + +# Create and checkout a new branch with today's date +git checkout -b "$BRANCH_NAME" + +# Push the new branch and set upstream +git push --set-upstream origin "$BRANCH_NAME" + +echo "Daily Git routine completed successfully!" diff --git a/scripts/run_with_groq.sh b/scripts/run_with_groq.sh new file mode 100755 index 00000000000..e86d64eed97 --- /dev/null +++ b/scripts/run_with_groq.sh @@ -0,0 +1,28 @@ + +# +bash ./get_secrets.sh + +docker kill agent-docker.service || echo skip +docker rm --force agent-docker.service || echo skip + +/usr/bin/bash -c 'docker login -u AWS -p $(aws ecr get-login-password --region us-east-2) 767503528736.dkr.ecr.us-east-2.amazonaws.com' + +/usr/bin/docker pull 767503528736.dkr.ecr.us-east-2.amazonaws.com/agent/eliza:feature-arm64_fastembed + +#/usr/bin/docker run -p 3000:3000 --mount type=bind,source=/opt/agent,target=/opt/agent --env-file /var/run/agent/secrets/env --rm --name "agent-docker.service" --entry-point docker-entrypoint-strace.sh 767503528736.dkr.ecr.us-east-2.amazonaws.com/agent/eliza:feature-arm64_fastembed pnpm start:debug --characters=characters/eliza.character.json + +#~/cloud-deployment-eliza/runlocaldocker-install-script.sh +# install strace (fixme : update docker) +#/usr/bin/docker run -p 3000:3000 --mount type=bind,source=/opt/agent,target=/opt/agent --env-file /var/run/agent/secrets/env --rm --name "agent-docker.service" --entrypoint /opt/agent/docker-entrypoint-none.sh 767503528736.dkr.ecr.us-east-2.amazonaws.com/agent/eliza:feature-arm64_fastembed /opt/agent/runlocaldocker-install-script.sh +#/usr/bin/docker commit "agent-docker.service" "agent-docker-strace" +# second step we debug with strace entrypoint +# first we create a volumee +#mount /node_modules/tokenizers/ from 767503528736.dkr.ecr.us-east-2.amazonaws.com/nodemodules/tokenizer:latest into +#"/app/node_modules/fastembed/node_modules/.pnpm/@anush008+tokenizers@https+++codeload.github.com+meta-introspector+arm64-tokenizers+tar.gz+98_s2457qj3pe4ojcbckddasgzfvu/node_modules/@anush008/" + +docker run -v tokenizer:/node_modules/tokenizers/ 767503528736.dkr.ecr.us-east-2.amazonaws.com/nodemodules/tokenizer:latest + +# now bind it in +/usr/bin/docker run -d -p 3000:3000 -v tokenizer:/app/node_modules/@anush008/tokenizers/ -v tokenizer:/app/node_modules/fastembed/node_modules/.pnpm/@anush008+tokenizers@https+++codeload.github.com+meta-introspector+arm64-tokenizers+tar.gz+98_s2457qj3pe4ojcbckddasgzfvu/node_modules/@anush008/ --mount type=bind,source=/opt/agent,target=/opt/agent --mount type=bind,source=/opt/agent/characters/,target=/app/characters/ --env-file /var/run/agent/secrets/env --rm --name "agent-docker.service" --entrypoint /opt/agent/scripts/docker-entrypoint-strace2.sh groq +#100755 > + diff --git a/scripts/run_with_groq_docker.sh b/scripts/run_with_groq_docker.sh new file mode 100755 index 00000000000..f303b5fcf83 --- /dev/null +++ b/scripts/run_with_groq_docker.sh @@ -0,0 +1,30 @@ + +# +bash ./get_secrets.sh + +docker kill agent-docker.service || echo skip +docker rm --force agent-docker.service || echo skip + +export CORE_AGENT_IMAGE=h4ckermike/elizaos-eliza:feature-arm64_fastembed +export TOKENIZERS_IMAGE=h4ckermike/arm64-tokenizers:feature-arm64 +# AUDIO +# video +# more +/usr/bin/docker pull $TOKENIZERS_IMAGE +/usr/bin/docker pull $CORE_AGENT_IMAGE + +# intialize the volume as side effect +docker run -v tokenizer:/node_modules/tokenizers/ $TOKENIZERS_IMAGE +#docker cp characters/eliza.character.json agent-docker.service:/app/agent/characters/eliza.character.json +#docker commit agent-docker.service groq + +# now bind it in +/usr/bin/docker run -d -p 3000:3000 \ + -v tokenizer:/app/node_modules/@anush008/tokenizers/ -v tokenizer:/app/node_modules/fastembed/node_modules/.pnpm/@anush008+tokenizers@https+++codeload.github.com+meta-introspector+arm64-tokenizers+tar.gz+98_s2457qj3pe4ojcbckddasgzfvu/node_modules/@anush008/ \ + --mount type=bind,source=/opt/agent,target=/opt/agent \ + --mount type=bind,source=/opt/agent/characters/,target=/app/characters/ \ + --env-file /var/run/agent/secrets/env \ + --rm \ + --name "agent-docker.service" \ + --entrypoint /opt/agent/scripts/docker-entrypoint-strace2.sh $DOCKERIMAGE + diff --git a/scripts/rundocker.sh b/scripts/rundocker.sh new file mode 100755 index 00000000000..b1eb0853530 --- /dev/null +++ b/scripts/rundocker.sh @@ -0,0 +1,82 @@ +#!/bin/bash +# FIXME move this and related files into the user data via templates and compression +# this is the install script +# install_script = "/opt/agent/rundocker.sh" +# called on boot. + +source /etc/agent/env +export AGENT_NAME +# FIXME hack 1 +# load variables from another agent +#export AGENT_NAME=tine_agent_7 + +echo using "${AGENT_NAME}" as agent name base for keys +#export AGENT_NAME +#pwd +#ls -latr +#. ./.env # for secrets +set -e # stop on any error +export WORKSOURCE="/opt/agent" + +echo for now install helper tools +snap install aws-cli --classic +apt install -y jq +apt install -y lsof strace nmap +#apt install -y emacs-nox + +if ! id -u agent > /dev/null 2>&1; then + adduser --disabled-password --gecos "" agent --home "/home/agent" || echo ignore +else + echo "User agent already exists, ignoring..." +fi + +git config --global --add safe.directory "/opt/agent" +cd "/opt/agent/" || exit 1 # "we need agent" +#git log -1 +mkdir -p "/home/agent" +mkdir -p "/var/agent/logs" +chown -R agent:agent "/var/agent/" "/home/agent" "/opt/agent" +mkdir -p "/var/run/agent/secrets/" + +bash /opt/agent/scripts/get_secrets.sh + +cp /var/run/agent/secrets/env "/var/run/agent/secrets/env.${AGENT_NAME}" +# load the secret in +export $(cat /var/run/agent/secrets/env| xargs) + +# now load the new secrets in +source /etc/agent/env + +if [ -z "$AGENT_ALIAS" ]; then + echo "alias is empty" +else + #switch to alias + export AGENT_NAME="$AGENT_ALIAS" + bash /opt/agent/scripts/get_secrets.sh + + cp /var/run/agent/secrets/env "/var/run/agent/secrets/env.${AGENT_ALIAS}" + +fi + + +if ! grep -q "^HOME" "/var/run/agent/secrets/env"; then + echo "HOME=/home/agent" >> "/var/run/agent/secrets/env" +fi +if ! grep -q "^HOME" "/var/run/agent/secrets/env"; then + echo "WORKSPACE_DIR=\${STATE_DIRECTORY}" >> "/var/run/agent/secrets/env" +fi +cp "${WORKSOURCE}/systemd/agent-docker.service" /etc/systemd/system/agent-docker.service +grep . -h -n /etc/systemd/system/agent-docker.service +chown -R agent:agent /var/run/agent/ +chown -R agent:agent /opt/agent/ +systemctl daemon-reload + +# now we can kill any existing +docker stop agent-docker.service || echo oops +docker kill agent-docker.service || echo oops +docker rm agent-docker.service || echo oops + + +systemctl start agent-docker || echo failed +systemctl enable agent-docker || echo failed +#systemctl status agent-docker || echo oops2 diff --git a/scripts/set_secrets.sh b/scripts/set_secrets.sh new file mode 100755 index 00000000000..086a9791ddf --- /dev/null +++ b/scripts/set_secrets.sh @@ -0,0 +1,28 @@ +#set +x # turn off logging +export AGENT_IMAGE=h4ckermike/elizaos-eliza:feature-arm64_fastembed +export TOKENIZER_IMAGE=h4ckermike/arm64-tokenizers:feature-arm64 + +# sets the parameter +#aws ssm put-parameter --name "agent_openai_key" --value "${OPENAI_API_KEY}" --type String +aws ssm put-parameter --overwrite --name "tine_agent_twitter_password" --value "${TWITTER_PASSWORD}" --type String +aws ssm put-parameter --overwrite --name "tine_agent_twitter_email" --value "${TWITTER_EMAIL}" --type String +aws ssm put-parameter --overwrite --name "tine_agent_twitter_username" --value "${TWITTER_USERNAME}" --type String +#aws ssm put-parameter --name "tine_agent_openai_key" --value "${OPENAI_API_KEY}" --type String +#aws ssm put-parameter --name "tine_agent_openai_endpoint" --value "${OPENAI_API_BASE}" --type String +#aws ssm put-parameter --name "tine_agent_openai_model" --value "${LLMMODEL}" --type String +aws ssm put-parameter --name "tine_agent_groq_key" --value "${GROQ_API_KEY}" --type String + +aws ssm put-parameter --name "tine_agent_agent_image" --value "${AGENT_IMAGE}" --type String +# aws ssm put-parameter --name "tine_agent_agent_image" --value "${AGENT_IMAGE}" --type String --region us-east-1 --overwrite +aws ssm put-parameter --name "tine_agent_tokenizer_image" --value "${TOKENIZER_IMAGE}" --type String +#aws ssm put-parameter --name "tine_agent_tokenizer_image" --value "${TOKENIZER_IMAGE}" --type String --region us-east-1 --overwrite + + + + +aws ssm put-parameter --name "tine_agent_2_agent_image" --value "h4ckermike/elizaos-eliza:feb10" --type String +aws ssm put-parameter --name "tine_agent_2_docker_username" --value "${DOCKER_USERNAME}" --type String +aws ssm put-parameter --name "tine_agent_2_docker_password" --value "${DOCKER_PASSWORD}" --type String + + +# aws ssm put-parameter --name "tine_agent_2_docker_username" --value "${DOCKER_USERNAME}" --type String --profile solfunmeme_dev diff --git a/scripts/set_systemd.sh b/scripts/set_systemd.sh new file mode 100755 index 00000000000..e35953ad173 --- /dev/null +++ b/scripts/set_systemd.sh @@ -0,0 +1,2 @@ +#!/bin/bash +source /var/run/agent/secrets/env diff --git a/scripts/ssh-ssm.py b/scripts/ssh-ssm.py new file mode 100755 index 00000000000..94964c87a73 --- /dev/null +++ b/scripts/ssh-ssm.py @@ -0,0 +1,45 @@ +#!/usr/bin/python +import time +import json +import boto3 +#from dateutil import tz + + +def parse_command_id(send_command_output): + return send_command_output['Command']['CommandId'] + +def fwd(instance): + # https://aws.amazon.com/blogs/aws/new-port-forwarding-using-aws-system-manager-sessions-manager/ + #INSTANCE_ID=$(aws ec2 describe-instances --filter "Name=tag:Name,Values=CodeStack/NewsBlogInstance" --query "Reservations[].Instances[?State.Name == 'running'].InstanceId[]" --output text) +# create the port forwarding tunnel + prms = { + "portNumber":["22"], + "localPortNumber":["2222"] + } + prms_jsn = json.dumps(prms) + print(f"""aws ssm start-session --target {instance} --document-name AWS-StartPortForwardingSession --parameters '{prms_jsn}'""") + +def main(): + ec2_client = boto3.client('ec2') + ssm_client = boto3.client('ssm') + + # Get the list of instance IDs and their states + instances_response = ec2_client.describe_instances() + + instances = [ + (instance['InstanceId'], instance['State']['Name']) + for reservation in instances_response['Reservations'] + for instance in reservation['Instances'] + ] + for reservation in instances_response['Reservations']: + for instance in reservation['Instances']: + print(instance) + instance_id = instance['InstanceId'] + state = instance['State']['Name'] + if state == 'running': + #print(f"Starting command for instance: {instance_id}") + #print(f"aws ssm start-session --target {instance_id}") + fwd(instance_id) + +if __name__ == "__main__": + main() diff --git a/scripts/update.sh b/scripts/update.sh new file mode 100755 index 00000000000..1b0d2e23768 --- /dev/null +++ b/scripts/update.sh @@ -0,0 +1,5 @@ +aws ssm update-document \ + + --name "UpdateEliza" \ + --content "file://UpdateEliza.yaml" \ + --document-version '$LATEST' diff --git a/systemd/agent-docker.service b/systemd/agent-docker.service new file mode 100644 index 00000000000..71e2bf8f832 --- /dev/null +++ b/systemd/agent-docker.service @@ -0,0 +1,43 @@ +# derived from https://phil.lavin.me.uk/2021/12/running-docker-containers-from-aws-ecr-with-systemd/ +# derived from https://github.com/encode/uvicorn/issues/678 +# derived from https://blog.container-solutions.com/running-docker-containers-with-systemd + +[Unit] +Description=agent +After=docker.service +Requires=docker.service +StartLimitInterval=200 +StartLimitBurst=10 + +[Service] +EnvironmentFile=/var/run/agent/secrets/env +RestartSec=10 +TimeoutStartSec=0 +ExecStartPre=-/usr/bin/docker volume create agentdata +ExecStartPre=-/usr/bin/docker exec %n stop || echo cannot prestop +ExecStartPre=-/usr/bin/docker rm %n || echo cannot preremove +ExecStartPre=/usr/bin/docker pull ${AGENT_IMAGE} +ExecStartPre=/usr/bin/docker pull ${TOKENIZER_IMAGE} +ExecStartPre=-/usr/bin/docker run --name copytoken \ + -v tokenizer:/node_modules/tokenizers/ \ + ${TOKENIZER_IMAGE} +ExecStart=/usr/bin/docker run \ + -p 3000:3000 \ + -v agentdata:/var/run/agent/database/ \ + -v tokenizer:/app/node_modules/@anush008/tokenizers/ \ + -v tokenizer:/app/node_modules/fastembed/node_modules/.pnpm/@anush008+tokenizers@https+++codeload.github.com+meta-introspector+arm64-tokenizers+tar.gz+98_s2457qj3pe4ojcbckddasgzfvu/node_modules/@anush008/ \ + --mount type=bind,source=/opt/agent,target=/opt/agent \ + --mount type=bind,source=/opt/agent/packages/cli/src/characters,target=/app/packages/cli/src/characters/ \ + --env-file /var/run/agent/secrets/env \ + --env PGLITE_DATA_DIR='/var/run/agent/database' \ + --name "agent-docker.service" \ + --entrypoint /opt/agent/scripts/docker-entrypoint-none.sh \ + ${AGENT_IMAGE} +StandardOutput=file:/var/log/agent_systemd.log +StandardError=file:/var/log/agent_systemd.log +ExecReload=/bin/kill -HUP ${MAINPID} +ExecStop=/usr/bin/docker stop agent-docker.service +Restart=always + +[Install] +WantedBy=multi-user.target diff --git a/vendor/elizaos/agent-twitter-client b/vendor/elizaos/agent-twitter-client new file mode 160000 index 00000000000..fd5cb982c14 --- /dev/null +++ b/vendor/elizaos/agent-twitter-client @@ -0,0 +1 @@ +Subproject commit fd5cb982c14c1ea75f30b2739ae9a9eb2d2ae394 diff --git a/vendor/elizaos/client-discord-eliza b/vendor/elizaos/client-discord-eliza new file mode 160000 index 00000000000..f0d57f0a309 --- /dev/null +++ b/vendor/elizaos/client-discord-eliza @@ -0,0 +1 @@ +Subproject commit f0d57f0a30903362e639fb894566e1e34d465936 diff --git a/vendor/elizaos/client-telegram b/vendor/elizaos/client-telegram new file mode 160000 index 00000000000..b466d397074 --- /dev/null +++ b/vendor/elizaos/client-telegram @@ -0,0 +1 @@ +Subproject commit b466d3970743f9283cac4852877cea7898a8f177 diff --git a/vendor/elizaos/client-twitter b/vendor/elizaos/client-twitter new file mode 160000 index 00000000000..d5432b8ad8c --- /dev/null +++ b/vendor/elizaos/client-twitter @@ -0,0 +1 @@ +Subproject commit d5432b8ad8c7278e50b55509b7ed5db1f42ace84 diff --git a/vendor/elizaos/plugin-speech-tts b/vendor/elizaos/plugin-speech-tts new file mode 160000 index 00000000000..28fde3cf1d3 --- /dev/null +++ b/vendor/elizaos/plugin-speech-tts @@ -0,0 +1 @@ +Subproject commit 28fde3cf1d3331269751706b1e95af8e158d1390 diff --git a/vendor/elizaos/plugin-twitter b/vendor/elizaos/plugin-twitter new file mode 160000 index 00000000000..98029bb6a92 --- /dev/null +++ b/vendor/elizaos/plugin-twitter @@ -0,0 +1 @@ +Subproject commit 98029bb6a92a2c3ae6f4803db2695869914a655e From 5e8a26e4c8bbd39ecfb72b998c84d45c49d8024f Mon Sep 17 00:00:00 2001 From: mike dupont Date: Wed, 26 Mar 2025 11:21:55 -0400 Subject: [PATCH 57/57] builds --- bun.lock | 529 ++++++++++++++++------------- packages/cli/package.json | 8 +- packages/cli/src/commands/start.ts | 63 ---- packages/cli/tsconfig.json | 1 + 4 files changed, 294 insertions(+), 307 deletions(-) diff --git a/bun.lock b/bun.lock index 4cf11692912..2456f773a1a 100644 --- a/bun.lock +++ b/bun.lock @@ -94,6 +94,11 @@ }, "dependencies": { "@electric-sql/pglite": "^0.2.17", + "@elizaos/plugin-discord": "workspace:*", + "@elizaos/plugin-groq": "workspace:*", + "@elizaos/plugin-local-ai": "workspace:*", + "ffmpeg-static": "^5.2.0", + "prism-media": "^1.3.5", "socket.io": "^4.8.1", "zod": "3.24.2", }, @@ -597,9 +602,9 @@ "name": "@elizaos/plugin-twitter", "version": "1.0.0-beta.7", "dependencies": { - "@elizaos/core": "^1.0.0-beta.7", + "@elizaos/core": "workspace:*", "@roamhq/wrtc": "^0.8.0", - "@sinclair/typebox": "^0.32.20", + "@sinclair/typebox": "0.34.30", "glob": "11.0.0", "headers-polyfill": "^3.1.2", "json-stable-stringify": "^1.0.2", @@ -666,15 +671,17 @@ "name": "@elizaos/the-org", "version": "1.0.0-beta.7", "dependencies": { - "@elizaos/cli": "^1.0.0-beta.7", - "@elizaos/core": "^1.0.0-beta.7", - "@elizaos/plugin-anthropic": "^1.0.0-beta.7", - "@elizaos/plugin-discord": "^1.0.0-beta.7", - "@elizaos/plugin-openai": "^1.0.0-beta.7", - "@elizaos/plugin-sql": "^1.0.0-beta.7", - "@elizaos/plugin-tee": "^1.0.0-beta.7", - "@elizaos/plugin-telegram": "^1.0.0-beta.7", - "@elizaos/plugin-twitter": "^1.0.0-beta.7", + "@elizaos/cli": "workspace:*", + "@elizaos/core": "workspace:*", + "@elizaos/plugin-anthropic": "workspace:*", + "@elizaos/plugin-discord": "workspace:*", + "@elizaos/plugin-groq": "workspace:*", + "@elizaos/plugin-local-ai": "workspace:*", + "@elizaos/plugin-openai": "workspace:*", + "@elizaos/plugin-sql": "workspace:*", + "@elizaos/plugin-tee": "workspace:*", + "@elizaos/plugin-telegram": "workspace:*", + "@elizaos/plugin-twitter": "workspace:*", "@radix-ui/react-slot": "^1.1.1", "@radix-ui/react-tabs": "^1.1.2", "@solana/web3.js": "^1.87.6", @@ -755,17 +762,17 @@ "packages": { "@adraffy/ens-normalize": ["@adraffy/ens-normalize@1.11.0", "", {}, "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg=="], - "@ai-sdk/anthropic": ["@ai-sdk/anthropic@1.2.0", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "@ai-sdk/provider-utils": "2.2.0" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-VMm+wAx7FhSMSjqJv7Zeu3GVxzUdohmWoFpzDCWiODpxPGFHw0d0spDR3sVpk5KcyGRJfebGd86ZtpFLCnagOQ=="], + "@ai-sdk/anthropic": ["@ai-sdk/anthropic@1.2.1", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "@ai-sdk/provider-utils": "2.2.1" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-X2bcuDXDKl8UCxUbiK+BX/xW8FLLzc36jngQmQycRvzr1Lmc8k8l+0pgLjgvmWRmbF+L9XOzP38Wm86bdTrFzQ=="], - "@ai-sdk/groq": ["@ai-sdk/groq@1.2.0", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "@ai-sdk/provider-utils": "2.2.0" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-hF62hBUTpOMyqum+w9mozh/KIgxueKowM9cRo38n5PqpXYUexDEKcW8HxOAXWwmbAZcE4l+FBSTu/xk4lBZzZQ=="], + "@ai-sdk/groq": ["@ai-sdk/groq@1.2.1", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "@ai-sdk/provider-utils": "2.2.1" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-e9Vn6sE6u+pm97YSK9+xiTgQ2ScRdipE5gAwXj/9HdgMnUyp3mDpWjFsmDM6bzyeb2iKOGv6f3eiRsLxOAPv4A=="], - "@ai-sdk/openai": ["@ai-sdk/openai@1.3.0", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "@ai-sdk/provider-utils": "2.2.0" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-zKKacGH8AyUjC63GizDpts+Nf8qAEtvAtO5O/AfVML8pIrtNWsbF+U3nT6mM8Oqvkp9X7ivuc4hCurivMFlJ6Q=="], + "@ai-sdk/openai": ["@ai-sdk/openai@1.3.3", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "@ai-sdk/provider-utils": "2.2.1" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-CH57tonLB4DwkwqwnMmTCoIOR7cNW3bP5ciyloI7rBGJS/Bolemsoo+vn5YnwkyT9O1diWJyvYeTh7A4UfiYOw=="], "@ai-sdk/provider": ["@ai-sdk/provider@1.1.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-0M+qjp+clUD0R1E5eWQFhxEvWLNaOtGQRUaBn8CUABnSKredagq92hUS9VjOzGsTm37xLfpaxl97AVtbeOsHew=="], - "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.2.0", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "eventsource-parser": "^3.0.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-RX5BnDSqudjvZjwwpROcxVQElyX7rUn/xImBgaZLXekSGqq8f7/tefqDcQiRbDZjuCd4CVIfhrK8y/Pta8cPfQ=="], + "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.2.1", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-BuExLp+NcpwsAVj1F4bgJuQkSqO/+roV9wM7RdIO+NVrcT8RBUTdXzf5arHt5T58VpK7bZyB2V9qigjaPHE+Dg=="], - "@ai-sdk/react": ["@ai-sdk/react@1.2.0", "", { "dependencies": { "@ai-sdk/provider-utils": "2.2.0", "@ai-sdk/ui-utils": "1.2.0", "swr": "^2.2.5", "throttleit": "2.1.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "optionalPeers": ["zod"] }, "sha512-fUTZkAsxOMz8ijjWf87E/GfYkgsH4V5MH2yuj7EXh5ShjWe/oayn2ZJkyoqFMr4Jf8m5kptDaivmbIenDq5OXA=="], + "@ai-sdk/react": ["@ai-sdk/react@1.2.2", "", { "dependencies": { "@ai-sdk/provider-utils": "2.2.1", "@ai-sdk/ui-utils": "1.2.1", "swr": "^2.2.5", "throttleit": "2.1.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "optionalPeers": ["zod"] }, "sha512-rxyNTFjUd3IilVOJFuUJV5ytZBYAIyRi50kFS2gNmSEiG4NHMBBm31ddrxI/i86VpY8gzZVp1/igtljnWBihUA=="], "@ai-sdk/ui-utils": ["@ai-sdk/ui-utils@1.1.9", "", { "dependencies": { "@ai-sdk/provider": "1.0.7", "@ai-sdk/provider-utils": "2.1.6", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-o0tDopdtHqgr9FAx0qSkdwPUDSdX+4l42YOn70zvs6+O+PILeTpf2YYV5Xr32TbNfSUq1DWLLhU1O7/3Dsxm1Q=="], @@ -777,33 +784,33 @@ "@algolia/autocomplete-shared": ["@algolia/autocomplete-shared@1.17.9", "", { "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ=="], - "@algolia/client-abtesting": ["@algolia/client-abtesting@5.21.0", "", { "dependencies": { "@algolia/client-common": "5.21.0", "@algolia/requester-browser-xhr": "5.21.0", "@algolia/requester-fetch": "5.21.0", "@algolia/requester-node-http": "5.21.0" } }, "sha512-I239aSmXa3pXDhp3AWGaIfesqJBNFA7drUM8SIfNxMIzvQXUnHRf4rW1o77QXLI/nIClNsb8KOLaB62gO9LnlQ=="], + "@algolia/client-abtesting": ["@algolia/client-abtesting@5.23.0", "", { "dependencies": { "@algolia/client-common": "5.23.0", "@algolia/requester-browser-xhr": "5.23.0", "@algolia/requester-fetch": "5.23.0", "@algolia/requester-node-http": "5.23.0" } }, "sha512-AyZ+9CUgWXwaaJ2lSwOJSy+/w0MFBPFqLrjWYs/HEpYMzBuFfGNZ7gEM9a7h4j7jY8hSBARBl8qdvInmj5vOEQ=="], - "@algolia/client-analytics": ["@algolia/client-analytics@5.21.0", "", { "dependencies": { "@algolia/client-common": "5.21.0", "@algolia/requester-browser-xhr": "5.21.0", "@algolia/requester-fetch": "5.21.0", "@algolia/requester-node-http": "5.21.0" } }, "sha512-OxoUfeG9G4VE4gS7B4q65KkHzdGsQsDwxQfR5J9uKB8poSGuNlHJWsF3ABqCkc5VliAR0m8KMjsQ9o/kOpEGnQ=="], + "@algolia/client-analytics": ["@algolia/client-analytics@5.23.0", "", { "dependencies": { "@algolia/client-common": "5.23.0", "@algolia/requester-browser-xhr": "5.23.0", "@algolia/requester-fetch": "5.23.0", "@algolia/requester-node-http": "5.23.0" } }, "sha512-oeKCPwLBnTEPF/RWr0aaJnrfRDfFRLT5O7KV0OF1NmpEXvmzLmN7RwnwDKsNtPUHNfpJ6esP9xzkPEtJabrZ2w=="], - "@algolia/client-common": ["@algolia/client-common@5.21.0", "", {}, "sha512-iHLgDQFyZNe9M16vipbx6FGOA8NoMswHrfom/QlCGoyh7ntjGvfMb+J2Ss8rRsAlOWluv8h923Ku3QVaB0oWDQ=="], + "@algolia/client-common": ["@algolia/client-common@5.23.0", "", {}, "sha512-9jacdC44vXLSaYKNLkFpbU1J4BbBPi/N7uoPhcGO//8ubRuVzigH6+RfK5FbudmQlqFt0J5DGUCVeTlHtgyUeg=="], - "@algolia/client-insights": ["@algolia/client-insights@5.21.0", "", { "dependencies": { "@algolia/client-common": "5.21.0", "@algolia/requester-browser-xhr": "5.21.0", "@algolia/requester-fetch": "5.21.0", "@algolia/requester-node-http": "5.21.0" } }, "sha512-y7XBO9Iwb75FLDl95AYcWSLIViJTpR5SUUCyKsYhpP9DgyUqWbISqDLXc96TS9shj+H+7VsTKA9cJK8NUfVN6g=="], + "@algolia/client-insights": ["@algolia/client-insights@5.23.0", "", { "dependencies": { "@algolia/client-common": "5.23.0", "@algolia/requester-browser-xhr": "5.23.0", "@algolia/requester-fetch": "5.23.0", "@algolia/requester-node-http": "5.23.0" } }, "sha512-/Gw5UitweRsnyb24Td4XhjXmsx8PxFzCI0oW6FZZvyr4kjzB9ECP2IjO+PdDq1A2fzDl/LXQ+u8ROudoVnXnQg=="], - "@algolia/client-personalization": ["@algolia/client-personalization@5.21.0", "", { "dependencies": { "@algolia/client-common": "5.21.0", "@algolia/requester-browser-xhr": "5.21.0", "@algolia/requester-fetch": "5.21.0", "@algolia/requester-node-http": "5.21.0" } }, "sha512-6KU658lD9Tss4oCX6c/O15tNZxw7vR+WAUG95YtZzYG/KGJHTpy2uckqbMmC2cEK4a86FAq4pH5azSJ7cGMjuw=="], + "@algolia/client-personalization": ["@algolia/client-personalization@5.23.0", "", { "dependencies": { "@algolia/client-common": "5.23.0", "@algolia/requester-browser-xhr": "5.23.0", "@algolia/requester-fetch": "5.23.0", "@algolia/requester-node-http": "5.23.0" } }, "sha512-ivrEZBoXfDatpqpifgHauydxHEe4udNqJ0gy7adR2KODeQ+39MQeaT10I24mu+eylIuiQKJRqORgEdLZycq2qQ=="], - "@algolia/client-query-suggestions": ["@algolia/client-query-suggestions@5.21.0", "", { "dependencies": { "@algolia/client-common": "5.21.0", "@algolia/requester-browser-xhr": "5.21.0", "@algolia/requester-fetch": "5.21.0", "@algolia/requester-node-http": "5.21.0" } }, "sha512-pG6MyVh1v0X+uwrKHn3U+suHdgJ2C+gug+UGkNHfMELHMsEoWIAQhxMBOFg7hCnWBFjQnuq6qhM3X9X5QO3d9Q=="], + "@algolia/client-query-suggestions": ["@algolia/client-query-suggestions@5.23.0", "", { "dependencies": { "@algolia/client-common": "5.23.0", "@algolia/requester-browser-xhr": "5.23.0", "@algolia/requester-fetch": "5.23.0", "@algolia/requester-node-http": "5.23.0" } }, "sha512-DjSgJWqTcsnlXEKqDsU7Y2vB/W/VYLlr6UfkzJkMuKB554Ia7IJr4keP2AlHVjjbBG62IDpdh5OkEs/+fbWsOA=="], - "@algolia/client-search": ["@algolia/client-search@5.21.0", "", { "dependencies": { "@algolia/client-common": "5.21.0", "@algolia/requester-browser-xhr": "5.21.0", "@algolia/requester-fetch": "5.21.0", "@algolia/requester-node-http": "5.21.0" } }, "sha512-nZfgJH4njBK98tFCmCW1VX/ExH4bNOl9DSboxeXGgvhoL0fG1+4DDr/mrLe21OggVCQqHwXBMh6fFInvBeyhiQ=="], + "@algolia/client-search": ["@algolia/client-search@5.23.0", "", { "dependencies": { "@algolia/client-common": "5.23.0", "@algolia/requester-browser-xhr": "5.23.0", "@algolia/requester-fetch": "5.23.0", "@algolia/requester-node-http": "5.23.0" } }, "sha512-XAYWUYUhEG4OIdo/N7H/OFFRD9fokfv3bBTky+4Y4/q07bxhnrGSUvcrU6JQ2jJTQyg6kv0ke1EIfiTO/Xxb+g=="], "@algolia/events": ["@algolia/events@4.0.1", "", {}, "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ=="], - "@algolia/ingestion": ["@algolia/ingestion@1.21.0", "", { "dependencies": { "@algolia/client-common": "5.21.0", "@algolia/requester-browser-xhr": "5.21.0", "@algolia/requester-fetch": "5.21.0", "@algolia/requester-node-http": "5.21.0" } }, "sha512-k6MZxLbZphGN5uRri9J/krQQBjUrqNcScPh985XXEFXbSCRvOPKVtjjLdVjGVHXXPOQgKrIZHxIdRNbHS+wVuA=="], + "@algolia/ingestion": ["@algolia/ingestion@1.23.0", "", { "dependencies": { "@algolia/client-common": "5.23.0", "@algolia/requester-browser-xhr": "5.23.0", "@algolia/requester-fetch": "5.23.0", "@algolia/requester-node-http": "5.23.0" } }, "sha512-ULbykzzhhLVofCDU1m/CqSzTyKmjaxA/z1d6o6hgUuR6X7/dll9/G0lu0e4vmWIOItklWWrhU2V8sXD0YGBIHg=="], - "@algolia/monitoring": ["@algolia/monitoring@1.21.0", "", { "dependencies": { "@algolia/client-common": "5.21.0", "@algolia/requester-browser-xhr": "5.21.0", "@algolia/requester-fetch": "5.21.0", "@algolia/requester-node-http": "5.21.0" } }, "sha512-FiW5nnmyHvaGdorqLClw3PM6keXexAMiwbwJ9xzQr4LcNefLG3ln82NafRPgJO/z0dETAOKjds5aSmEFMiITHQ=="], + "@algolia/monitoring": ["@algolia/monitoring@1.23.0", "", { "dependencies": { "@algolia/client-common": "5.23.0", "@algolia/requester-browser-xhr": "5.23.0", "@algolia/requester-fetch": "5.23.0", "@algolia/requester-node-http": "5.23.0" } }, "sha512-oB3wG7CgQJQr+uoijV7bWBphiSHkvGX43At8RGgkDyc7Aeabcp9ik5HgLC1YDgbHVOlQI+tce5HIbDCifzQCIg=="], - "@algolia/recommend": ["@algolia/recommend@5.21.0", "", { "dependencies": { "@algolia/client-common": "5.21.0", "@algolia/requester-browser-xhr": "5.21.0", "@algolia/requester-fetch": "5.21.0", "@algolia/requester-node-http": "5.21.0" } }, "sha512-+JXavbbliaLmah5QNgc/TDW/+r0ALa+rGhg5Y7+pF6GpNnzO0L+nlUaDNE8QbiJfz54F9BkwFUnJJeRJAuzTFw=="], + "@algolia/recommend": ["@algolia/recommend@5.23.0", "", { "dependencies": { "@algolia/client-common": "5.23.0", "@algolia/requester-browser-xhr": "5.23.0", "@algolia/requester-fetch": "5.23.0", "@algolia/requester-node-http": "5.23.0" } }, "sha512-4PWvCV6VGhnCMAbv2zfQUAlc3ofMs6ovqKlC/xcp7tWaucYd//piHg9CcCM4S0p9OZznEGQMRYPt2uqbk6V9vg=="], - "@algolia/requester-browser-xhr": ["@algolia/requester-browser-xhr@5.21.0", "", { "dependencies": { "@algolia/client-common": "5.21.0" } }, "sha512-Iw+Yj5hOmo/iixHS94vEAQ3zi5GPpJywhfxn1el/zWo4AvPIte/+1h9Ywgw/+3M7YBj4jgAkScxjxQCxzLBsjA=="], + "@algolia/requester-browser-xhr": ["@algolia/requester-browser-xhr@5.23.0", "", { "dependencies": { "@algolia/client-common": "5.23.0" } }, "sha512-bacOsX41pnsupNB0k0Ny+1JDchQxIsZIcp69GKDBT0NgTHG8OayEO141eFalNmGil+GXPY0NUPRpx+5s4RdhGA=="], - "@algolia/requester-fetch": ["@algolia/requester-fetch@5.21.0", "", { "dependencies": { "@algolia/client-common": "5.21.0" } }, "sha512-Z00SRLlIFj3SjYVfsd9Yd3kB3dUwQFAkQG18NunWP7cix2ezXpJqA+xAoEf9vc4QZHdxU3Gm8gHAtRiM2iVaTQ=="], + "@algolia/requester-fetch": ["@algolia/requester-fetch@5.23.0", "", { "dependencies": { "@algolia/client-common": "5.23.0" } }, "sha512-tVNFREexJWDrvc23evmRgAcb2KLZuVilOIB/rVnQCl0GDbqIWJuQ1lG22HKqvCEQFthHkgVFGLYE74wQ96768g=="], - "@algolia/requester-node-http": ["@algolia/requester-node-http@5.21.0", "", { "dependencies": { "@algolia/client-common": "5.21.0" } }, "sha512-WqU0VumUILrIeVYCTGZlyyZoC/tbvhiyPxfGRRO1cSjxN558bnJLlR2BvS0SJ5b75dRNK7HDvtXo2QoP9eLfiA=="], + "@algolia/requester-node-http": ["@algolia/requester-node-http@5.23.0", "", { "dependencies": { "@algolia/client-common": "5.23.0" } }, "sha512-XXHbq2heOZc9EFCc4z+uyHS9YRBygZbYQVsWjWZWx8hdAz+tkBX/jLHM9Xg+3zO0/v8JN6pcZzqYEVsdrLeNLg=="], "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], @@ -839,71 +846,71 @@ "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], - "@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.772.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.758.0", "@aws-sdk/credential-provider-node": "3.772.0", "@aws-sdk/middleware-bucket-endpoint": "3.734.0", "@aws-sdk/middleware-expect-continue": "3.734.0", "@aws-sdk/middleware-flexible-checksums": "3.758.0", "@aws-sdk/middleware-host-header": "3.734.0", "@aws-sdk/middleware-location-constraint": "3.734.0", "@aws-sdk/middleware-logger": "3.734.0", "@aws-sdk/middleware-recursion-detection": "3.772.0", "@aws-sdk/middleware-sdk-s3": "3.758.0", "@aws-sdk/middleware-ssec": "3.734.0", "@aws-sdk/middleware-user-agent": "3.758.0", "@aws-sdk/region-config-resolver": "3.734.0", "@aws-sdk/signature-v4-multi-region": "3.758.0", "@aws-sdk/types": "3.734.0", "@aws-sdk/util-endpoints": "3.743.0", "@aws-sdk/util-user-agent-browser": "3.734.0", "@aws-sdk/util-user-agent-node": "3.758.0", "@aws-sdk/xml-builder": "3.734.0", "@smithy/config-resolver": "^4.0.1", "@smithy/core": "^3.1.5", "@smithy/eventstream-serde-browser": "^4.0.1", "@smithy/eventstream-serde-config-resolver": "^4.0.1", "@smithy/eventstream-serde-node": "^4.0.1", "@smithy/fetch-http-handler": "^5.0.1", "@smithy/hash-blob-browser": "^4.0.1", "@smithy/hash-node": "^4.0.1", "@smithy/hash-stream-node": "^4.0.1", "@smithy/invalid-dependency": "^4.0.1", "@smithy/md5-js": "^4.0.1", "@smithy/middleware-content-length": "^4.0.1", "@smithy/middleware-endpoint": "^4.0.6", "@smithy/middleware-retry": "^4.0.7", "@smithy/middleware-serde": "^4.0.2", "@smithy/middleware-stack": "^4.0.1", "@smithy/node-config-provider": "^4.0.1", "@smithy/node-http-handler": "^4.0.3", "@smithy/protocol-http": "^5.0.1", "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", "@smithy/url-parser": "^4.0.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.7", "@smithy/util-defaults-mode-node": "^4.0.7", "@smithy/util-endpoints": "^3.0.1", "@smithy/util-middleware": "^4.0.1", "@smithy/util-retry": "^4.0.1", "@smithy/util-stream": "^4.1.2", "@smithy/util-utf8": "^4.0.0", "@smithy/util-waiter": "^4.0.2", "tslib": "^2.6.2" } }, "sha512-HQXlQIyyLp47h1/Hdjr36yK8/gsAAFX2vRzgDJhSRaz0vWZlWX07AJdYfrxapLUXfVU6DbBu3rwi2UGqM7ixqQ=="], + "@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.775.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.775.0", "@aws-sdk/credential-provider-node": "3.775.0", "@aws-sdk/middleware-bucket-endpoint": "3.775.0", "@aws-sdk/middleware-expect-continue": "3.775.0", "@aws-sdk/middleware-flexible-checksums": "3.775.0", "@aws-sdk/middleware-host-header": "3.775.0", "@aws-sdk/middleware-location-constraint": "3.775.0", "@aws-sdk/middleware-logger": "3.775.0", "@aws-sdk/middleware-recursion-detection": "3.775.0", "@aws-sdk/middleware-sdk-s3": "3.775.0", "@aws-sdk/middleware-ssec": "3.775.0", "@aws-sdk/middleware-user-agent": "3.775.0", "@aws-sdk/region-config-resolver": "3.775.0", "@aws-sdk/signature-v4-multi-region": "3.775.0", "@aws-sdk/types": "3.775.0", "@aws-sdk/util-endpoints": "3.775.0", "@aws-sdk/util-user-agent-browser": "3.775.0", "@aws-sdk/util-user-agent-node": "3.775.0", "@aws-sdk/xml-builder": "3.775.0", "@smithy/config-resolver": "^4.1.0", "@smithy/core": "^3.2.0", "@smithy/eventstream-serde-browser": "^4.0.2", "@smithy/eventstream-serde-config-resolver": "^4.1.0", "@smithy/eventstream-serde-node": "^4.0.2", "@smithy/fetch-http-handler": "^5.0.2", "@smithy/hash-blob-browser": "^4.0.2", "@smithy/hash-node": "^4.0.2", "@smithy/hash-stream-node": "^4.0.2", "@smithy/invalid-dependency": "^4.0.2", "@smithy/md5-js": "^4.0.2", "@smithy/middleware-content-length": "^4.0.2", "@smithy/middleware-endpoint": "^4.1.0", "@smithy/middleware-retry": "^4.1.0", "@smithy/middleware-serde": "^4.0.3", "@smithy/middleware-stack": "^4.0.2", "@smithy/node-config-provider": "^4.0.2", "@smithy/node-http-handler": "^4.0.4", "@smithy/protocol-http": "^5.1.0", "@smithy/smithy-client": "^4.2.0", "@smithy/types": "^4.2.0", "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.8", "@smithy/util-defaults-mode-node": "^4.0.8", "@smithy/util-endpoints": "^3.0.2", "@smithy/util-middleware": "^4.0.2", "@smithy/util-retry": "^4.0.2", "@smithy/util-stream": "^4.2.0", "@smithy/util-utf8": "^4.0.0", "@smithy/util-waiter": "^4.0.3", "tslib": "^2.6.2" } }, "sha512-Z/BeVmYc3nj4FNE46MtvBYeCVvBZwlujMEvr5UOChP14899QWkBfOvf74RwQY9qy5/DvhVFkHlA8en1L6+0NrA=="], - "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.772.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.758.0", "@aws-sdk/middleware-host-header": "3.734.0", "@aws-sdk/middleware-logger": "3.734.0", "@aws-sdk/middleware-recursion-detection": "3.772.0", "@aws-sdk/middleware-user-agent": "3.758.0", "@aws-sdk/region-config-resolver": "3.734.0", "@aws-sdk/types": "3.734.0", "@aws-sdk/util-endpoints": "3.743.0", "@aws-sdk/util-user-agent-browser": "3.734.0", "@aws-sdk/util-user-agent-node": "3.758.0", "@smithy/config-resolver": "^4.0.1", "@smithy/core": "^3.1.5", "@smithy/fetch-http-handler": "^5.0.1", "@smithy/hash-node": "^4.0.1", "@smithy/invalid-dependency": "^4.0.1", "@smithy/middleware-content-length": "^4.0.1", "@smithy/middleware-endpoint": "^4.0.6", "@smithy/middleware-retry": "^4.0.7", "@smithy/middleware-serde": "^4.0.2", "@smithy/middleware-stack": "^4.0.1", "@smithy/node-config-provider": "^4.0.1", "@smithy/node-http-handler": "^4.0.3", "@smithy/protocol-http": "^5.0.1", "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", "@smithy/url-parser": "^4.0.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.7", "@smithy/util-defaults-mode-node": "^4.0.7", "@smithy/util-endpoints": "^3.0.1", "@smithy/util-middleware": "^4.0.1", "@smithy/util-retry": "^4.0.1", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-sDdxepi74+cL6gXJJ2yw3UNSI7GBvoGTwZqFyPoNAzcURvaYwo8dBr7G4jS9GDanjTlO3CGVAf2VMcpqEvmoEw=="], + "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.775.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.775.0", "@aws-sdk/middleware-host-header": "3.775.0", "@aws-sdk/middleware-logger": "3.775.0", "@aws-sdk/middleware-recursion-detection": "3.775.0", "@aws-sdk/middleware-user-agent": "3.775.0", "@aws-sdk/region-config-resolver": "3.775.0", "@aws-sdk/types": "3.775.0", "@aws-sdk/util-endpoints": "3.775.0", "@aws-sdk/util-user-agent-browser": "3.775.0", "@aws-sdk/util-user-agent-node": "3.775.0", "@smithy/config-resolver": "^4.1.0", "@smithy/core": "^3.2.0", "@smithy/fetch-http-handler": "^5.0.2", "@smithy/hash-node": "^4.0.2", "@smithy/invalid-dependency": "^4.0.2", "@smithy/middleware-content-length": "^4.0.2", "@smithy/middleware-endpoint": "^4.1.0", "@smithy/middleware-retry": "^4.1.0", "@smithy/middleware-serde": "^4.0.3", "@smithy/middleware-stack": "^4.0.2", "@smithy/node-config-provider": "^4.0.2", "@smithy/node-http-handler": "^4.0.4", "@smithy/protocol-http": "^5.1.0", "@smithy/smithy-client": "^4.2.0", "@smithy/types": "^4.2.0", "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.8", "@smithy/util-defaults-mode-node": "^4.0.8", "@smithy/util-endpoints": "^3.0.2", "@smithy/util-middleware": "^4.0.2", "@smithy/util-retry": "^4.0.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-vqG1S2ap77WP4D5qt4bEPE0duQ4myN+cDr1NeP8QpSTajetbkDGVo7h1VViYMcUoFUVWBj6Qf1X1VfOq+uaxbA=="], - "@aws-sdk/core": ["@aws-sdk/core@3.758.0", "", { "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/core": "^3.1.5", "@smithy/node-config-provider": "^4.0.1", "@smithy/property-provider": "^4.0.1", "@smithy/protocol-http": "^5.0.1", "@smithy/signature-v4": "^5.0.1", "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", "@smithy/util-middleware": "^4.0.1", "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" } }, "sha512-0RswbdR9jt/XKemaLNuxi2gGr4xGlHyGxkTdhSQzCyUe9A9OPCoLl3rIESRguQEech+oJnbHk/wuiwHqTuP9sg=="], + "@aws-sdk/core": ["@aws-sdk/core@3.775.0", "", { "dependencies": { "@aws-sdk/types": "3.775.0", "@smithy/core": "^3.2.0", "@smithy/node-config-provider": "^4.0.2", "@smithy/property-provider": "^4.0.2", "@smithy/protocol-http": "^5.1.0", "@smithy/signature-v4": "^5.0.2", "@smithy/smithy-client": "^4.2.0", "@smithy/types": "^4.2.0", "@smithy/util-middleware": "^4.0.2", "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" } }, "sha512-8vpW4WihVfz0DX+7WnnLGm3GuQER++b0IwQG35JlQMlgqnc44M//KbJPsIHA0aJUJVwJAEShgfr5dUbY8WUzaA=="], - "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.758.0", "", { "dependencies": { "@aws-sdk/core": "3.758.0", "@aws-sdk/types": "3.734.0", "@smithy/property-provider": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-N27eFoRrO6MeUNumtNHDW9WOiwfd59LPXPqDrIa3kWL/s+fOKFHb9xIcF++bAwtcZnAxKkgpDCUP+INNZskE+w=="], + "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.775.0", "", { "dependencies": { "@aws-sdk/core": "3.775.0", "@aws-sdk/types": "3.775.0", "@smithy/property-provider": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-6ESVxwCbGm7WZ17kY1fjmxQud43vzJFoLd4bmlR+idQSWdqlzGDYdcfzpjDKTcivdtNrVYmFvcH1JBUwCRAZhw=="], - "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.758.0", "", { "dependencies": { "@aws-sdk/core": "3.758.0", "@aws-sdk/types": "3.734.0", "@smithy/fetch-http-handler": "^5.0.1", "@smithy/node-http-handler": "^4.0.3", "@smithy/property-provider": "^4.0.1", "@smithy/protocol-http": "^5.0.1", "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", "@smithy/util-stream": "^4.1.2", "tslib": "^2.6.2" } }, "sha512-Xt9/U8qUCiw1hihztWkNeIR+arg6P+yda10OuCHX6kFVx3auTlU7+hCqs3UxqniGU4dguHuftf3mRpi5/GJ33Q=="], + "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.775.0", "", { "dependencies": { "@aws-sdk/core": "3.775.0", "@aws-sdk/types": "3.775.0", "@smithy/fetch-http-handler": "^5.0.2", "@smithy/node-http-handler": "^4.0.4", "@smithy/property-provider": "^4.0.2", "@smithy/protocol-http": "^5.1.0", "@smithy/smithy-client": "^4.2.0", "@smithy/types": "^4.2.0", "@smithy/util-stream": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-PjDQeDH/J1S0yWV32wCj2k5liRo0ssXMseCBEkCsD3SqsU8o5cU82b0hMX4sAib/RkglCSZqGO0xMiN0/7ndww=="], - "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.772.0", "", { "dependencies": { "@aws-sdk/core": "3.758.0", "@aws-sdk/credential-provider-env": "3.758.0", "@aws-sdk/credential-provider-http": "3.758.0", "@aws-sdk/credential-provider-process": "3.758.0", "@aws-sdk/credential-provider-sso": "3.772.0", "@aws-sdk/credential-provider-web-identity": "3.772.0", "@aws-sdk/nested-clients": "3.772.0", "@aws-sdk/types": "3.734.0", "@smithy/credential-provider-imds": "^4.0.1", "@smithy/property-provider": "^4.0.1", "@smithy/shared-ini-file-loader": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-T1Ec9Q25zl5c/eZUPHZsiq8vgBeWBjHM7WM5xtZszZRPqqhQGnmFlomz1r9rwhW8RFB5k8HRaD/SLKo6jtYl/A=="], + "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.775.0", "", { "dependencies": { "@aws-sdk/core": "3.775.0", "@aws-sdk/credential-provider-env": "3.775.0", "@aws-sdk/credential-provider-http": "3.775.0", "@aws-sdk/credential-provider-process": "3.775.0", "@aws-sdk/credential-provider-sso": "3.775.0", "@aws-sdk/credential-provider-web-identity": "3.775.0", "@aws-sdk/nested-clients": "3.775.0", "@aws-sdk/types": "3.775.0", "@smithy/credential-provider-imds": "^4.0.2", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-0gJc6cALsgrjeC5U3qDjbz4myIC/j49+gPz9nkvY+C0OYWt1KH1tyfiZUuCRGfuFHhQ+3KMMDSL229TkBP3E7g=="], - "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.772.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.758.0", "@aws-sdk/credential-provider-http": "3.758.0", "@aws-sdk/credential-provider-ini": "3.772.0", "@aws-sdk/credential-provider-process": "3.758.0", "@aws-sdk/credential-provider-sso": "3.772.0", "@aws-sdk/credential-provider-web-identity": "3.772.0", "@aws-sdk/types": "3.734.0", "@smithy/credential-provider-imds": "^4.0.1", "@smithy/property-provider": "^4.0.1", "@smithy/shared-ini-file-loader": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-0IdVfjBO88Mtekq/KaScYSIEPIeR+ABRvBOWyj/c/qQ2KJyI0GRlSAzpANfxDLHVPn3yEHuZd9nRL6sOmOMI0A=="], + "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.775.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.775.0", "@aws-sdk/credential-provider-http": "3.775.0", "@aws-sdk/credential-provider-ini": "3.775.0", "@aws-sdk/credential-provider-process": "3.775.0", "@aws-sdk/credential-provider-sso": "3.775.0", "@aws-sdk/credential-provider-web-identity": "3.775.0", "@aws-sdk/types": "3.775.0", "@smithy/credential-provider-imds": "^4.0.2", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-D8Zre5W2sXC/ANPqCWPqwYpU1cKY9DF6ckFZyDrqlcBC0gANgpY6fLrBtYo2fwJsbj+1A24iIpBINV7erdprgA=="], - "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.758.0", "", { "dependencies": { "@aws-sdk/core": "3.758.0", "@aws-sdk/types": "3.734.0", "@smithy/property-provider": "^4.0.1", "@smithy/shared-ini-file-loader": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-AzcY74QTPqcbXWVgjpPZ3HOmxQZYPROIBz2YINF0OQk0MhezDWV/O7Xec+K1+MPGQO3qS6EDrUUlnPLjsqieHA=="], + "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.775.0", "", { "dependencies": { "@aws-sdk/core": "3.775.0", "@aws-sdk/types": "3.775.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-A6k68H9rQp+2+7P7SGO90Csw6nrUEm0Qfjpn9Etc4EboZhhCLs9b66umUsTsSBHus4FDIe5JQxfCUyt1wgNogg=="], - "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.772.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.772.0", "@aws-sdk/core": "3.758.0", "@aws-sdk/token-providers": "3.772.0", "@aws-sdk/types": "3.734.0", "@smithy/property-provider": "^4.0.1", "@smithy/shared-ini-file-loader": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-yR3Y5RAVPa4ogojcBOpZUx6XyRVAkynIJCjd0avdlxW1hhnzSr5/pzoiJ6u21UCbkxlJJTDZE3jfFe7tt+HA4w=="], + "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.775.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.775.0", "@aws-sdk/core": "3.775.0", "@aws-sdk/token-providers": "3.775.0", "@aws-sdk/types": "3.775.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-du06V7u9HDmRuwZnRjf85shO3dffeKOkQplV5/2vf3LgTPNEI9caNomi/cCGyxKGOeSUHAKrQ1HvpPfOaI6t5Q=="], - "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.772.0", "", { "dependencies": { "@aws-sdk/core": "3.758.0", "@aws-sdk/nested-clients": "3.772.0", "@aws-sdk/types": "3.734.0", "@smithy/property-provider": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-yHAT5Y2y0fnecSuWRUn8NMunKfDqFYhnOpGq8UyCEcwz9aXzibU0hqRIEm51qpR81hqo0GMFDH0EOmegZ/iW5w=="], + "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.775.0", "", { "dependencies": { "@aws-sdk/core": "3.775.0", "@aws-sdk/nested-clients": "3.775.0", "@aws-sdk/types": "3.775.0", "@smithy/property-provider": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-z4XLYui5aHsr78mbd5BtZfm55OM5V55qK/X17OPrEqjYDDk3GlI8Oe2ZjTmOVrKwMpmzXKhsakeFHKfDyOvv1A=="], - "@aws-sdk/middleware-bucket-endpoint": ["@aws-sdk/middleware-bucket-endpoint@3.734.0", "", { "dependencies": { "@aws-sdk/types": "3.734.0", "@aws-sdk/util-arn-parser": "3.723.0", "@smithy/node-config-provider": "^4.0.1", "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", "@smithy/util-config-provider": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-etC7G18aF7KdZguW27GE/wpbrNmYLVT755EsFc8kXpZj8D6AFKxc7OuveinJmiy0bYXAMspJUWsF6CrGpOw6CQ=="], + "@aws-sdk/middleware-bucket-endpoint": ["@aws-sdk/middleware-bucket-endpoint@3.775.0", "", { "dependencies": { "@aws-sdk/types": "3.775.0", "@aws-sdk/util-arn-parser": "3.723.0", "@smithy/node-config-provider": "^4.0.2", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "@smithy/util-config-provider": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-qogMIpVChDYr4xiUNC19/RDSw/sKoHkAhouS6Skxiy6s27HBhow1L3Z1qVYXuBmOZGSWPU0xiyZCvOyWrv9s+Q=="], - "@aws-sdk/middleware-expect-continue": ["@aws-sdk/middleware-expect-continue@3.734.0", "", { "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-P38/v1l6HjuB2aFUewt7ueAW5IvKkFcv5dalPtbMGRhLeyivBOHwbCyuRKgVs7z7ClTpu9EaViEGki2jEQqEsQ=="], + "@aws-sdk/middleware-expect-continue": ["@aws-sdk/middleware-expect-continue@3.775.0", "", { "dependencies": { "@aws-sdk/types": "3.775.0", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-Apd3owkIeUW5dnk3au9np2IdW2N0zc9NjTjHiH+Mx3zqwSrc+m+ANgJVgk9mnQjMzU/vb7VuxJ0eqdEbp5gYsg=="], - "@aws-sdk/middleware-flexible-checksums": ["@aws-sdk/middleware-flexible-checksums@3.758.0", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "3.758.0", "@aws-sdk/types": "3.734.0", "@smithy/is-array-buffer": "^4.0.0", "@smithy/node-config-provider": "^4.0.1", "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", "@smithy/util-middleware": "^4.0.1", "@smithy/util-stream": "^4.1.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-o8Rk71S08YTKLoSobucjnbj97OCGaXgpEDNKXpXaavUM5xLNoHCLSUPRCiEN86Ivqxg1n17Y2nSRhfbsveOXXA=="], + "@aws-sdk/middleware-flexible-checksums": ["@aws-sdk/middleware-flexible-checksums@3.775.0", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "3.775.0", "@aws-sdk/types": "3.775.0", "@smithy/is-array-buffer": "^4.0.0", "@smithy/node-config-provider": "^4.0.2", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "@smithy/util-middleware": "^4.0.2", "@smithy/util-stream": "^4.2.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-OmHLfRIb7IIXsf9/X/pMOlcSV3gzW/MmtPSZTkrz5jCTKzWXd7eRoyOJqewjsaC6KMAxIpNU77FoAd16jOZ21A=="], - "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.734.0", "", { "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw=="], + "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.775.0", "", { "dependencies": { "@aws-sdk/types": "3.775.0", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-tkSegM0Z6WMXpLB8oPys/d+umYIocvO298mGvcMCncpRl77L9XkvSLJIFzaHes+o7djAgIduYw8wKIMStFss2w=="], - "@aws-sdk/middleware-location-constraint": ["@aws-sdk/middleware-location-constraint@3.734.0", "", { "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-EJEIXwCQhto/cBfHdm3ZOeLxd2NlJD+X2F+ZTOxzokuhBtY0IONfC/91hOo5tWQweerojwshSMHRCKzRv1tlwg=="], + "@aws-sdk/middleware-location-constraint": ["@aws-sdk/middleware-location-constraint@3.775.0", "", { "dependencies": { "@aws-sdk/types": "3.775.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-8TMXEHZXZTFTckQLyBT5aEI8fX11HZcwZseRifvBKKpj0RZDk4F0EEYGxeNSPpUQ7n+PRWyfAEnnZNRdAj/1NQ=="], - "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.734.0", "", { "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w=="], + "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.775.0", "", { "dependencies": { "@aws-sdk/types": "3.775.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-FaxO1xom4MAoUJsldmR92nT1G6uZxTdNYOFYtdHfd6N2wcNaTuxgjIvqzg5y7QIH9kn58XX/dzf1iTjgqUStZw=="], - "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.772.0", "", { "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-zg0LjJa4v7fcLzn5QzZvtVS+qyvmsnu7oQnb86l6ckduZpWDCDC9+A0ZzcXTrxblPCJd3JqkoG1+Gzi4S4Ny/Q=="], + "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.775.0", "", { "dependencies": { "@aws-sdk/types": "3.775.0", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-GLCzC8D0A0YDG5u3F5U03Vb9j5tcOEFhr8oc6PDk0k0vm5VwtZOE6LvK7hcCSoAB4HXyOUM0sQuXrbaAh9OwXA=="], - "@aws-sdk/middleware-sdk-s3": ["@aws-sdk/middleware-sdk-s3@3.758.0", "", { "dependencies": { "@aws-sdk/core": "3.758.0", "@aws-sdk/types": "3.734.0", "@aws-sdk/util-arn-parser": "3.723.0", "@smithy/core": "^3.1.5", "@smithy/node-config-provider": "^4.0.1", "@smithy/protocol-http": "^5.0.1", "@smithy/signature-v4": "^5.0.1", "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.1", "@smithy/util-stream": "^4.1.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-6mJ2zyyHPYSV6bAcaFpsdoXZJeQlR1QgBnZZ6juY/+dcYiuyWCdyLUbGzSZSE7GTfx6i+9+QWFeoIMlWKgU63A=="], + "@aws-sdk/middleware-sdk-s3": ["@aws-sdk/middleware-sdk-s3@3.775.0", "", { "dependencies": { "@aws-sdk/core": "3.775.0", "@aws-sdk/types": "3.775.0", "@aws-sdk/util-arn-parser": "3.723.0", "@smithy/core": "^3.2.0", "@smithy/node-config-provider": "^4.0.2", "@smithy/protocol-http": "^5.1.0", "@smithy/signature-v4": "^5.0.2", "@smithy/smithy-client": "^4.2.0", "@smithy/types": "^4.2.0", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.2", "@smithy/util-stream": "^4.2.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-zsvcu7cWB28JJ60gVvjxPCI7ZU7jWGcpNACPiZGyVtjYXwcxyhXbYEVDSWKsSA6ERpz9XrpLYod8INQWfW3ECg=="], - "@aws-sdk/middleware-ssec": ["@aws-sdk/middleware-ssec@3.734.0", "", { "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-d4yd1RrPW/sspEXizq2NSOUivnheac6LPeLSLnaeTbBG9g1KqIqvCzP1TfXEqv2CrWfHEsWtJpX7oyjySSPvDQ=="], + "@aws-sdk/middleware-ssec": ["@aws-sdk/middleware-ssec@3.775.0", "", { "dependencies": { "@aws-sdk/types": "3.775.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-Iw1RHD8vfAWWPzBBIKaojO4GAvQkHOYIpKdAfis/EUSUmSa79QsnXnRqsdcE0mCB0Ylj23yi+ah4/0wh9FsekA=="], - "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.758.0", "", { "dependencies": { "@aws-sdk/core": "3.758.0", "@aws-sdk/types": "3.734.0", "@aws-sdk/util-endpoints": "3.743.0", "@smithy/core": "^3.1.5", "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-iNyehQXtQlj69JCgfaOssgZD4HeYGOwxcaKeG6F+40cwBjTAi0+Ph1yfDwqk2qiBPIRWJ/9l2LodZbxiBqgrwg=="], + "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.775.0", "", { "dependencies": { "@aws-sdk/core": "3.775.0", "@aws-sdk/types": "3.775.0", "@aws-sdk/util-endpoints": "3.775.0", "@smithy/core": "^3.2.0", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-7Lffpr1ptOEDE1ZYH1T78pheEY1YmeXWBfFt/amZ6AGsKSLG+JPXvof3ltporTGR2bhH/eJPo7UHCglIuXfzYg=="], - "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.772.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.758.0", "@aws-sdk/middleware-host-header": "3.734.0", "@aws-sdk/middleware-logger": "3.734.0", "@aws-sdk/middleware-recursion-detection": "3.772.0", "@aws-sdk/middleware-user-agent": "3.758.0", "@aws-sdk/region-config-resolver": "3.734.0", "@aws-sdk/types": "3.734.0", "@aws-sdk/util-endpoints": "3.743.0", "@aws-sdk/util-user-agent-browser": "3.734.0", "@aws-sdk/util-user-agent-node": "3.758.0", "@smithy/config-resolver": "^4.0.1", "@smithy/core": "^3.1.5", "@smithy/fetch-http-handler": "^5.0.1", "@smithy/hash-node": "^4.0.1", "@smithy/invalid-dependency": "^4.0.1", "@smithy/middleware-content-length": "^4.0.1", "@smithy/middleware-endpoint": "^4.0.6", "@smithy/middleware-retry": "^4.0.7", "@smithy/middleware-serde": "^4.0.2", "@smithy/middleware-stack": "^4.0.1", "@smithy/node-config-provider": "^4.0.1", "@smithy/node-http-handler": "^4.0.3", "@smithy/protocol-http": "^5.0.1", "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", "@smithy/url-parser": "^4.0.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.7", "@smithy/util-defaults-mode-node": "^4.0.7", "@smithy/util-endpoints": "^3.0.1", "@smithy/util-middleware": "^4.0.1", "@smithy/util-retry": "^4.0.1", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-gNJbBxR5YlEumsCS9EWWEASXEnysL0aDnr9MNPX1ip/g1xOqRHmytgV/+t8RFZFTKg0OprbWTq5Ich3MqsEuCQ=="], + "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.775.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.775.0", "@aws-sdk/middleware-host-header": "3.775.0", "@aws-sdk/middleware-logger": "3.775.0", "@aws-sdk/middleware-recursion-detection": "3.775.0", "@aws-sdk/middleware-user-agent": "3.775.0", "@aws-sdk/region-config-resolver": "3.775.0", "@aws-sdk/types": "3.775.0", "@aws-sdk/util-endpoints": "3.775.0", "@aws-sdk/util-user-agent-browser": "3.775.0", "@aws-sdk/util-user-agent-node": "3.775.0", "@smithy/config-resolver": "^4.1.0", "@smithy/core": "^3.2.0", "@smithy/fetch-http-handler": "^5.0.2", "@smithy/hash-node": "^4.0.2", "@smithy/invalid-dependency": "^4.0.2", "@smithy/middleware-content-length": "^4.0.2", "@smithy/middleware-endpoint": "^4.1.0", "@smithy/middleware-retry": "^4.1.0", "@smithy/middleware-serde": "^4.0.3", "@smithy/middleware-stack": "^4.0.2", "@smithy/node-config-provider": "^4.0.2", "@smithy/node-http-handler": "^4.0.4", "@smithy/protocol-http": "^5.1.0", "@smithy/smithy-client": "^4.2.0", "@smithy/types": "^4.2.0", "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.8", "@smithy/util-defaults-mode-node": "^4.0.8", "@smithy/util-endpoints": "^3.0.2", "@smithy/util-middleware": "^4.0.2", "@smithy/util-retry": "^4.0.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-f37jmAzkuIhKyhtA6s0LGpqQvm218vq+RNMUDkGm1Zz2fxJ5pBIUTDtygiI3vXTcmt9DTIB8S6JQhjrgtboktw=="], - "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.734.0", "", { "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/node-config-provider": "^4.0.1", "@smithy/types": "^4.1.0", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" } }, "sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ=="], + "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.775.0", "", { "dependencies": { "@aws-sdk/types": "3.775.0", "@smithy/node-config-provider": "^4.0.2", "@smithy/types": "^4.2.0", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.2", "tslib": "^2.6.2" } }, "sha512-40iH3LJjrQS3LKUJAl7Wj0bln7RFPEvUYKFxtP8a+oKFDO0F65F52xZxIJbPn6sHkxWDAnZlGgdjZXM3p2g5wQ=="], - "@aws-sdk/s3-request-presigner": ["@aws-sdk/s3-request-presigner@3.772.0", "", { "dependencies": { "@aws-sdk/signature-v4-multi-region": "3.758.0", "@aws-sdk/types": "3.734.0", "@aws-sdk/util-format-url": "3.734.0", "@smithy/middleware-endpoint": "^4.0.6", "@smithy/protocol-http": "^5.0.1", "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-y6OrwZXJyKaKw6suozQgc9AwKbZLjTu1hXe6sJ1rCyvhU171bWXjcdeux+Gw0iIX5wVdPQVHA/e5g9QYUaZOMw=="], + "@aws-sdk/s3-request-presigner": ["@aws-sdk/s3-request-presigner@3.775.0", "", { "dependencies": { "@aws-sdk/signature-v4-multi-region": "3.775.0", "@aws-sdk/types": "3.775.0", "@aws-sdk/util-format-url": "3.775.0", "@smithy/middleware-endpoint": "^4.1.0", "@smithy/protocol-http": "^5.1.0", "@smithy/smithy-client": "^4.2.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-NpACBvEdT3VERGX1cWGIITZ5Qq2MknrEugY3ivs8CDGze1uunm6+oTh8YPMUlHOZq2TuI9ktKWh7YZoHBRRUTw=="], - "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.758.0", "", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "3.758.0", "@aws-sdk/types": "3.734.0", "@smithy/protocol-http": "^5.0.1", "@smithy/signature-v4": "^5.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-0RPCo8fYJcrenJ6bRtiUbFOSgQ1CX/GpvwtLU2Fam1tS9h2klKK8d74caeV6A1mIUvBU7bhyQ0wMGlwMtn3EYw=="], + "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.775.0", "", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "3.775.0", "@aws-sdk/types": "3.775.0", "@smithy/protocol-http": "^5.1.0", "@smithy/signature-v4": "^5.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-cnGk8GDfTMJ8p7+qSk92QlIk2bmTmFJqhYxcXZ9PysjZtx0xmfCMxnG3Hjy1oU2mt5boPCVSOptqtWixayM17g=="], - "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.772.0", "", { "dependencies": { "@aws-sdk/nested-clients": "3.772.0", "@aws-sdk/types": "3.734.0", "@smithy/property-provider": "^4.0.1", "@smithy/shared-ini-file-loader": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-d1Waa1vyebuokcAWYlkZdtFlciIgob7B39vPRmtxMObbGumJKiOy/qCe2/FB/72h1Ej9Ih32lwvbxUjORQWN4g=="], + "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.775.0", "", { "dependencies": { "@aws-sdk/nested-clients": "3.775.0", "@aws-sdk/types": "3.775.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-Q6MtbEhkOggVSz/dN89rIY/ry80U3v89o0Lrrc+Rpvaiaaz8pEN0DsfEcg0IjpzBQ8Owoa6lNWyglHbzPhaJpA=="], - "@aws-sdk/types": ["@aws-sdk/types@3.734.0", "", { "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg=="], + "@aws-sdk/types": ["@aws-sdk/types@3.775.0", "", { "dependencies": { "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-ZoGKwa4C9fC9Av6bdfqcW6Ix5ot05F/S4VxWR2nHuMv7hzfmAjTOcUiWT7UR4hM/U0whf84VhDtXN/DWAk52KA=="], "@aws-sdk/util-arn-parser": ["@aws-sdk/util-arn-parser@3.723.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w=="], - "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.743.0", "", { "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/types": "^4.1.0", "@smithy/util-endpoints": "^3.0.1", "tslib": "^2.6.2" } }, "sha512-sN1l559zrixeh5x+pttrnd0A3+r34r0tmPkJ/eaaMaAzXqsmKU/xYre9K3FNnsSS1J1k4PEfk/nHDTVUgFYjnw=="], + "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.775.0", "", { "dependencies": { "@aws-sdk/types": "3.775.0", "@smithy/types": "^4.2.0", "@smithy/util-endpoints": "^3.0.2", "tslib": "^2.6.2" } }, "sha512-yjWmUgZC9tUxAo8Uaplqmq0eUh0zrbZJdwxGRKdYxfm4RG6fMw1tj52+KkatH7o+mNZvg1GDcVp/INktxonJLw=="], - "@aws-sdk/util-format-url": ["@aws-sdk/util-format-url@3.734.0", "", { "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/querystring-builder": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-TxZMVm8V4aR/QkW9/NhujvYpPZjUYqzLwSge5imKZbWFR806NP7RMwc5ilVuHF/bMOln/cVHkl42kATElWBvNw=="], + "@aws-sdk/util-format-url": ["@aws-sdk/util-format-url@3.775.0", "", { "dependencies": { "@aws-sdk/types": "3.775.0", "@smithy/querystring-builder": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-Nw4nBeyCbWixoGh8NcVpa/i8McMA6RXJIjQFyloJLaPr7CPquz7ZbSl0MUWMFVwP/VHaJ7B+lNN3Qz1iFCEP/Q=="], "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.723.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw=="], - "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.734.0", "", { "dependencies": { "@aws-sdk/types": "3.734.0", "@smithy/types": "^4.1.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng=="], + "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.775.0", "", { "dependencies": { "@aws-sdk/types": "3.775.0", "@smithy/types": "^4.2.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-txw2wkiJmZKVdDbscK7VBK+u+TJnRtlUjRTLei+elZg2ADhpQxfVAQl436FUeIv6AhB/oRHW6/K/EAGXUSWi0A=="], - "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.758.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.758.0", "@aws-sdk/types": "3.734.0", "@smithy/node-config-provider": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-A5EZw85V6WhoKMV2hbuFRvb9NPlxEErb4HPO6/SPXYY4QrjprIzScHxikqcWv1w4J3apB1wto9LPU3IMsYtfrw=="], + "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.775.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.775.0", "@aws-sdk/types": "3.775.0", "@smithy/node-config-provider": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-N9yhTevbizTOMo3drH7Eoy6OkJ3iVPxhV7dwb6CMAObbLneS36CSfA6xQXupmHWcRvZPTz8rd1JGG3HzFOau+g=="], - "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.734.0", "", { "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-Zrjxi5qwGEcUsJ0ru7fRtW74WcTS0rbLcehoFB+rN1GRi2hbLcFaYs4PwVA5diLeAJH0gszv3x4Hr/S87MfbKQ=="], + "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.775.0", "", { "dependencies": { "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-b9NGO6FKJeLGYnV7Z1yvcP1TNU4dkD5jNsLWOF1/sygZoASaQhNOlaiJ/1OH331YQ1R1oWk38nBb0frsYkDsOQ=="], "@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], @@ -911,15 +918,15 @@ "@babel/core": ["@babel/core@7.26.10", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.10", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.10", "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", "@babel/traverse": "^7.26.10", "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ=="], - "@babel/generator": ["@babel/generator@7.26.10", "", { "dependencies": { "@babel/parser": "^7.26.10", "@babel/types": "^7.26.10", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang=="], + "@babel/generator": ["@babel/generator@7.27.0", "", { "dependencies": { "@babel/parser": "^7.27.0", "@babel/types": "^7.27.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw=="], "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.25.9", "", { "dependencies": { "@babel/types": "^7.25.9" } }, "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g=="], - "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.26.5", "", { "dependencies": { "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA=="], + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.0", "", { "dependencies": { "@babel/compat-data": "^7.26.8", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA=="], - "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.26.9", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", "@babel/helper-replace-supers": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", "@babel/traverse": "^7.26.9", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg=="], + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.27.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", "@babel/helper-replace-supers": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", "@babel/traverse": "^7.27.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg=="], - "@babel/helper-create-regexp-features-plugin": ["@babel/helper-create-regexp-features-plugin@7.26.3", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong=="], + "@babel/helper-create-regexp-features-plugin": ["@babel/helper-create-regexp-features-plugin@7.27.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ=="], "@babel/helper-define-polyfill-provider": ["@babel/helper-define-polyfill-provider@0.6.4", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw=="], @@ -947,9 +954,9 @@ "@babel/helper-wrap-function": ["@babel/helper-wrap-function@7.25.9", "", { "dependencies": { "@babel/template": "^7.25.9", "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g=="], - "@babel/helpers": ["@babel/helpers@7.26.10", "", { "dependencies": { "@babel/template": "^7.26.9", "@babel/types": "^7.26.10" } }, "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g=="], + "@babel/helpers": ["@babel/helpers@7.27.0", "", { "dependencies": { "@babel/template": "^7.27.0", "@babel/types": "^7.27.0" } }, "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg=="], - "@babel/parser": ["@babel/parser@7.26.10", "", { "dependencies": { "@babel/types": "^7.26.10" }, "bin": "./bin/babel-parser.js" }, "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA=="], + "@babel/parser": ["@babel/parser@7.27.0", "", { "dependencies": { "@babel/types": "^7.27.0" }, "bin": "./bin/babel-parser.js" }, "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg=="], "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ["@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/traverse": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g=="], @@ -983,7 +990,7 @@ "@babel/plugin-transform-block-scoped-functions": ["@babel/plugin-transform-block-scoped-functions@7.26.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.26.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ=="], - "@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg=="], + "@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.27.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.26.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ=="], "@babel/plugin-transform-class-properties": ["@babel/plugin-transform-class-properties@7.25.9", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q=="], @@ -1065,7 +1072,7 @@ "@babel/plugin-transform-react-pure-annotations": ["@babel/plugin-transform-react-pure-annotations@7.25.9", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg=="], - "@babel/plugin-transform-regenerator": ["@babel/plugin-transform-regenerator@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "regenerator-transform": "^0.15.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg=="], + "@babel/plugin-transform-regenerator": ["@babel/plugin-transform-regenerator@7.27.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.26.5", "regenerator-transform": "^0.15.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA=="], "@babel/plugin-transform-regexp-modifiers": ["@babel/plugin-transform-regexp-modifiers@7.26.0", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw=="], @@ -1081,9 +1088,9 @@ "@babel/plugin-transform-template-literals": ["@babel/plugin-transform-template-literals@7.26.8", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.26.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q=="], - "@babel/plugin-transform-typeof-symbol": ["@babel/plugin-transform-typeof-symbol@7.26.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.26.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw=="], + "@babel/plugin-transform-typeof-symbol": ["@babel/plugin-transform-typeof-symbol@7.27.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.26.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w=="], - "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.26.8", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-create-class-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw=="], + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.27.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-create-class-features-plugin": "^7.27.0", "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg=="], "@babel/plugin-transform-unicode-escapes": ["@babel/plugin-transform-unicode-escapes@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q=="], @@ -1099,17 +1106,17 @@ "@babel/preset-react": ["@babel/preset-react@7.26.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-validator-option": "^7.25.9", "@babel/plugin-transform-react-display-name": "^7.25.9", "@babel/plugin-transform-react-jsx": "^7.25.9", "@babel/plugin-transform-react-jsx-development": "^7.25.9", "@babel/plugin-transform-react-pure-annotations": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw=="], - "@babel/preset-typescript": ["@babel/preset-typescript@7.26.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-validator-option": "^7.25.9", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-transform-modules-commonjs": "^7.25.9", "@babel/plugin-transform-typescript": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg=="], + "@babel/preset-typescript": ["@babel/preset-typescript@7.27.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-transform-modules-commonjs": "^7.26.3", "@babel/plugin-transform-typescript": "^7.27.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ=="], - "@babel/runtime": ["@babel/runtime@7.26.10", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw=="], + "@babel/runtime": ["@babel/runtime@7.27.0", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw=="], - "@babel/runtime-corejs3": ["@babel/runtime-corejs3@7.26.10", "", { "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" } }, "sha512-uITFQYO68pMEYR46AHgQoyBg7KPPJDAbGn4jUTIRgCFJIp88MIBUianVOplhZDEec07bp9zIyr4Kp0FCyQzmWg=="], + "@babel/runtime-corejs3": ["@babel/runtime-corejs3@7.27.0", "", { "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" } }, "sha512-UWjX6t+v+0ckwZ50Y5ShZLnlk95pP5MyW/pon9tiYzl3+18pkTHTFNTKr7rQbfRXPkowt2QAn30o1b6oswszew=="], - "@babel/template": ["@babel/template@7.26.9", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.26.9", "@babel/types": "^7.26.9" } }, "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA=="], + "@babel/template": ["@babel/template@7.27.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.27.0", "@babel/types": "^7.27.0" } }, "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA=="], - "@babel/traverse": ["@babel/traverse@7.26.10", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.10", "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", "@babel/types": "^7.26.10", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A=="], + "@babel/traverse": ["@babel/traverse@7.27.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.27.0", "@babel/parser": "^7.27.0", "@babel/template": "^7.27.0", "@babel/types": "^7.27.0", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA=="], - "@babel/types": ["@babel/types@7.26.10", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ=="], + "@babel/types": ["@babel/types@7.27.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg=="], "@balena/dockerignore": ["@balena/dockerignore@1.0.2", "", {}, "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q=="], @@ -1219,6 +1226,8 @@ "@csstools/utilities": ["@csstools/utilities@2.0.0", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ=="], + "@derhuerst/http-basic": ["@derhuerst/http-basic@8.2.4", "", { "dependencies": { "caseless": "^0.12.0", "concat-stream": "^2.0.0", "http-response-object": "^3.0.1", "parse-cache-control": "^1.0.1" } }, "sha512-F9rL9k9Xjf5blCz8HsJRO4diy111cayL2vkY2XE4r4t3n0yPXVYy3KD3nJ1qbrSn9743UWSXH4IwuCa/HWlGFw=="], + "@discordjs/builders": ["@discordjs/builders@1.10.1", "", { "dependencies": { "@discordjs/formatters": "^0.6.0", "@discordjs/util": "^1.1.1", "@sapphire/shapeshift": "^4.0.0", "discord-api-types": "^0.37.119", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.4", "tslib": "^2.6.3" } }, "sha512-OWo1fY4ztL1/M/DUyRPShB4d/EzVfuUvPTRRHRIt/YxBrUYSz0a+JicD5F5zHFoNs2oTuWavxCOVFV1UljHTng=="], "@discordjs/collection": ["@discordjs/collection@2.1.1", "", {}, "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg=="], @@ -1465,13 +1474,13 @@ "@huggingface/hub": ["@huggingface/hub@1.1.2", "", { "dependencies": { "@huggingface/tasks": "^0.18.2" } }, "sha512-Jf4GhvVj9ABDw4Itb3BV1T7f22iewuZva476qTicQ4kOTbosuUuFDhsVH7ZH6rVNgg20Ll9kaNBF5CXjySIT+w=="], - "@huggingface/inference": ["@huggingface/inference@3.6.1", "", { "dependencies": { "@huggingface/jinja": "^0.3.3", "@huggingface/tasks": "^0.17.8" } }, "sha512-EtQlbBqcZycPe+qiTEFI+wNHOMpG0gwNTaZSvYu1juN1p/1dEgqAb2GO31dxLgNev2PzH9d+9nm8GngOsIepJg=="], + "@huggingface/inference": ["@huggingface/inference@3.6.2", "", { "dependencies": { "@huggingface/jinja": "^0.3.3", "@huggingface/tasks": "^0.18.4" } }, "sha512-FkJr8dOP8yFTxGFi+X/ylwG3qoCq/s8WI2A4Jg13RBX3voJWrzadpHLD/99EKZU7r35X4Mm6tKUev7dR2B/cTg=="], "@huggingface/jinja": ["@huggingface/jinja@0.3.3", "", {}, "sha512-vQQr2JyWvVFba3Lj9es4q9vCl1sAc74fdgnEMoX8qHrXtswap9ge9uO3ONDzQB0cQ0PUyaKY2N6HaVbTBvSXvw=="], - "@huggingface/tasks": ["@huggingface/tasks@0.18.2", "", {}, "sha512-6g/6sj1gSyvUKJm+78yfiYOTU3VXMfoyh4M46AXloRD1iU/UfqB7dtAGZqcF9PuYxSFx7Q2zd8fzAYePkQ/ZvA=="], + "@huggingface/tasks": ["@huggingface/tasks@0.18.4", "", {}, "sha512-kZ8G2b6JSdVCn48VpmB2Kcb9ae16HmDRf4RWEQJMgbF98DFTt4y69fTcvQ1vi/qALRWL57pDpbzIlwWlVhY3aQ=="], - "@huggingface/transformers": ["@huggingface/transformers@3.4.0", "", { "dependencies": { "@huggingface/jinja": "^0.3.3", "onnxruntime-node": "1.20.1", "onnxruntime-web": "1.22.0-dev.20250306-ccf8fdd9ea", "sharp": "^0.33.5" } }, "sha512-jyuglsWc+Ls9/U7eGDDY+xYgDgDtwxQ4ul/5VQoqo2r0LfAnJ+zSRUjKnY6paOyzyhbKaftfEsvXJ049aL1cyw=="], + "@huggingface/transformers": ["@huggingface/transformers@3.4.1", "", { "dependencies": { "@huggingface/jinja": "^0.3.3", "onnxruntime-node": "1.20.1", "onnxruntime-web": "1.22.0-dev.20250306-ccf8fdd9ea", "sharp": "^0.33.5" } }, "sha512-Inbvq9i/33kmd5XHom9MQU7NAOV5UcGmHBwBk9NFw4IPhdoTnfP7wFJxJmceYhRdS+EL1Hpw4he/Ceimau6ORg=="], "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], @@ -1559,7 +1568,7 @@ "@kwsites/promise-deferred": ["@kwsites/promise-deferred@1.1.1", "", {}, "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw=="], - "@langchain/core": ["@langchain/core@0.3.42", "", { "dependencies": { "@cfworker/json-schema": "^4.0.2", "ansi-styles": "^5.0.0", "camelcase": "6", "decamelize": "1.2.0", "js-tiktoken": "^1.0.12", "langsmith": ">=0.2.8 <0.4.0", "mustache": "^4.2.0", "p-queue": "^6.6.2", "p-retry": "4", "uuid": "^10.0.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.22.3" } }, "sha512-pT/jC5lqWK3YGDq8dQwgKoa6anqAhMtG1x5JbnrOj9NdaLeBbCKBDQ+/Ykzk3nZ8o+0UMsaXNZo7IVL83VVjHg=="], + "@langchain/core": ["@langchain/core@0.3.43", "", { "dependencies": { "@cfworker/json-schema": "^4.0.2", "ansi-styles": "^5.0.0", "camelcase": "6", "decamelize": "1.2.0", "js-tiktoken": "^1.0.12", "langsmith": ">=0.2.8 <0.4.0", "mustache": "^4.2.0", "p-queue": "^6.6.2", "p-retry": "4", "uuid": "^10.0.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.22.3" } }, "sha512-DwiSUwmZqcuOn7j8SFdeOH1nvaUqG7q8qn3LhobdQYEg5PmjLgd2yLr2KzuT/YWMBfjkOR+Di5K6HEdFmouTxg=="], "@langchain/openai": ["@langchain/openai@0.3.17", "", { "dependencies": { "js-tiktoken": "^1.0.12", "openai": "^4.77.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.22.3" }, "peerDependencies": { "@langchain/core": ">=0.3.29 <0.4.0" } }, "sha512-uw4po32OKptVjq+CYHrumgbfh4NuD7LqyE+ZgqY9I/LrLc6bHLMc+sisHmI17vgek0K/yqtarI0alPJbzrwyag=="], @@ -1581,7 +1590,7 @@ "@mdx-js/react": ["@mdx-js/react@3.0.1", "", { "dependencies": { "@types/mdx": "^2.0.0" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A=="], - "@mermaid-js/parser": ["@mermaid-js/parser@0.3.0", "", { "dependencies": { "langium": "3.0.0" } }, "sha512-HsvL6zgE5sUPGgkIDlmAWR1HTNHz2Iy11BAWPTa4Jjabkpguy4Ze2gzfLrg6pdRuBvFwgUYyxiaNqZwrEEXepA=="], + "@mermaid-js/parser": ["@mermaid-js/parser@0.4.0", "", { "dependencies": { "langium": "3.3.1" } }, "sha512-wla8XOWvQAwuqy+gxiZqY+c7FokraOTHRWMsbB4AgRx9Sy7zKslNyejy7E+a77qHfey5GXw/ik3IXv/NHMJgaA=="], "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.4", "", { "dependencies": { "@emnapi/core": "^1.1.0", "@emnapi/runtime": "^1.1.0", "@tybys/wasm-util": "^0.9.0" } }, "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ=="], @@ -1951,43 +1960,45 @@ "@rollup/pluginutils": ["@rollup/pluginutils@5.1.4", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.36.0", "", { "os": "android", "cpu": "arm" }, "sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.37.0", "", { "os": "android", "cpu": "arm" }, "sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.37.0", "", { "os": "android", "cpu": "arm64" }, "sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.36.0", "", { "os": "android", "cpu": "arm64" }, "sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.37.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.36.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.37.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.36.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.37.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.36.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.37.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.36.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.37.0", "", { "os": "linux", "cpu": "arm" }, "sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.36.0", "", { "os": "linux", "cpu": "arm" }, "sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.37.0", "", { "os": "linux", "cpu": "arm" }, "sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.36.0", "", { "os": "linux", "cpu": "arm" }, "sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.37.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.36.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.37.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.36.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw=="], + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.37.0", "", { "os": "linux", "cpu": "none" }, "sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA=="], - "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.36.0", "", { "os": "linux", "cpu": "none" }, "sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg=="], + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.37.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ=="], - "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.36.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.37.0", "", { "os": "linux", "cpu": "none" }, "sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.36.0", "", { "os": "linux", "cpu": "none" }, "sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.37.0", "", { "os": "linux", "cpu": "none" }, "sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.36.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.37.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.36.0", "", { "os": "linux", "cpu": "x64" }, "sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.37.0", "", { "os": "linux", "cpu": "x64" }, "sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.36.0", "", { "os": "linux", "cpu": "x64" }, "sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.37.0", "", { "os": "linux", "cpu": "x64" }, "sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.36.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.37.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.36.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.37.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.36.0", "", { "os": "win32", "cpu": "x64" }, "sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw=="], + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.37.0", "", { "os": "win32", "cpu": "x64" }, "sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA=="], "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], @@ -2027,7 +2038,7 @@ "@sigstore/verify": ["@sigstore/verify@1.2.1", "", { "dependencies": { "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.1.0", "@sigstore/protobuf-specs": "^0.3.2" } }, "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g=="], - "@sinclair/typebox": ["@sinclair/typebox@0.32.35", "", {}, "sha512-Ul3YyOTU++to8cgNkttakC0dWvpERr6RYoHO2W47DLbFvrwBDJUY31B1sImH6JZSYc4Kt4PyHtoPNu+vL2r2dA=="], + "@sinclair/typebox": ["@sinclair/typebox@0.34.30", "", {}, "sha512-gFB3BiqjDxEoadW0zn+xyMVb7cLxPCoblVn2C/BKpI41WPYi2d6fwHAlynPNZ5O/Q4WEiujdnJzVtvG/Jc2CBQ=="], "@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="], @@ -2035,75 +2046,75 @@ "@slorber/remark-comment": ["@slorber/remark-comment@1.0.0", "", { "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.1.0", "micromark-util-symbol": "^1.0.1" } }, "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA=="], - "@smithy/abort-controller": ["@smithy/abort-controller@4.0.1", "", { "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g=="], + "@smithy/abort-controller": ["@smithy/abort-controller@4.0.2", "", { "dependencies": { "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-Sl/78VDtgqKxN2+1qduaVE140XF+Xg+TafkncspwM4jFP/LHr76ZHmIY/y3V1M0mMLNk+Je6IGbzxy23RSToMw=="], "@smithy/chunked-blob-reader": ["@smithy/chunked-blob-reader@5.0.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw=="], "@smithy/chunked-blob-reader-native": ["@smithy/chunked-blob-reader-native@4.0.0", "", { "dependencies": { "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig=="], - "@smithy/config-resolver": ["@smithy/config-resolver@4.0.1", "", { "dependencies": { "@smithy/node-config-provider": "^4.0.1", "@smithy/types": "^4.1.0", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" } }, "sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ=="], + "@smithy/config-resolver": ["@smithy/config-resolver@4.1.0", "", { "dependencies": { "@smithy/node-config-provider": "^4.0.2", "@smithy/types": "^4.2.0", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.2", "tslib": "^2.6.2" } }, "sha512-8smPlwhga22pwl23fM5ew4T9vfLUCeFXlcqNOCD5M5h8VmNPNUE9j6bQSuRXpDSV11L/E/SwEBQuW8hr6+nS1A=="], - "@smithy/core": ["@smithy/core@3.1.5", "", { "dependencies": { "@smithy/middleware-serde": "^4.0.2", "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-middleware": "^4.0.1", "@smithy/util-stream": "^4.1.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-HLclGWPkCsekQgsyzxLhCQLa8THWXtB5PxyYN+2O6nkyLt550KQKTlbV2D1/j5dNIQapAZM1+qFnpBFxZQkgCA=="], + "@smithy/core": ["@smithy/core@3.2.0", "", { "dependencies": { "@smithy/middleware-serde": "^4.0.3", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-middleware": "^4.0.2", "@smithy/util-stream": "^4.2.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-k17bgQhVZ7YmUvA8at4af1TDpl0NDMBuBKJl8Yg0nrefwmValU+CnA5l/AriVdQNthU/33H3nK71HrLgqOPr1Q=="], - "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.0.1", "", { "dependencies": { "@smithy/node-config-provider": "^4.0.1", "@smithy/property-provider": "^4.0.1", "@smithy/types": "^4.1.0", "@smithy/url-parser": "^4.0.1", "tslib": "^2.6.2" } }, "sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg=="], + "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.0.2", "", { "dependencies": { "@smithy/node-config-provider": "^4.0.2", "@smithy/property-provider": "^4.0.2", "@smithy/types": "^4.2.0", "@smithy/url-parser": "^4.0.2", "tslib": "^2.6.2" } }, "sha512-32lVig6jCaWBHnY+OEQ6e6Vnt5vDHaLiydGrwYMW9tPqO688hPGTYRamYJ1EptxEC2rAwJrHWmPoKRBl4iTa8w=="], - "@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.0.1", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.1.0", "@smithy/util-hex-encoding": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A=="], + "@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.0.2", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.2.0", "@smithy/util-hex-encoding": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-p+f2kLSK7ZrXVfskU/f5dzksKTewZk8pJLPvER3aFHPt76C2MxD9vNatSfLzzQSQB4FNO96RK4PSXfhD1TTeMQ=="], - "@smithy/eventstream-serde-browser": ["@smithy/eventstream-serde-browser@4.0.1", "", { "dependencies": { "@smithy/eventstream-serde-universal": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA=="], + "@smithy/eventstream-serde-browser": ["@smithy/eventstream-serde-browser@4.0.2", "", { "dependencies": { "@smithy/eventstream-serde-universal": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-CepZCDs2xgVUtH7ZZ7oDdZFH8e6Y2zOv8iiX6RhndH69nlojCALSKK+OXwZUgOtUZEUaZ5e1hULVCHYbCn7pug=="], - "@smithy/eventstream-serde-config-resolver": ["@smithy/eventstream-serde-config-resolver@4.0.1", "", { "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA=="], + "@smithy/eventstream-serde-config-resolver": ["@smithy/eventstream-serde-config-resolver@4.1.0", "", { "dependencies": { "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-1PI+WPZ5TWXrfj3CIoKyUycYynYJgZjuQo8U+sphneOtjsgrttYybdqESFReQrdWJ+LKt6NEdbYzmmfDBmjX2A=="], - "@smithy/eventstream-serde-node": ["@smithy/eventstream-serde-node@4.0.1", "", { "dependencies": { "@smithy/eventstream-serde-universal": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q=="], + "@smithy/eventstream-serde-node": ["@smithy/eventstream-serde-node@4.0.2", "", { "dependencies": { "@smithy/eventstream-serde-universal": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-C5bJ/C6x9ENPMx2cFOirspnF9ZsBVnBMtP6BdPl/qYSuUawdGQ34Lq0dMcf42QTjUZgWGbUIZnz6+zLxJlb9aw=="], - "@smithy/eventstream-serde-universal": ["@smithy/eventstream-serde-universal@4.0.1", "", { "dependencies": { "@smithy/eventstream-codec": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA=="], + "@smithy/eventstream-serde-universal": ["@smithy/eventstream-serde-universal@4.0.2", "", { "dependencies": { "@smithy/eventstream-codec": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-St8h9JqzvnbB52FtckiHPN4U/cnXcarMniXRXTKn0r4b4XesZOGiAyUdj1aXbqqn1icSqBlzzUsCl6nPB018ng=="], - "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.0.1", "", { "dependencies": { "@smithy/protocol-http": "^5.0.1", "@smithy/querystring-builder": "^4.0.1", "@smithy/types": "^4.1.0", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA=="], + "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.0.2", "", { "dependencies": { "@smithy/protocol-http": "^5.1.0", "@smithy/querystring-builder": "^4.0.2", "@smithy/types": "^4.2.0", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-+9Dz8sakS9pe7f2cBocpJXdeVjMopUDLgZs1yWeu7h++WqSbjUYv/JAJwKwXw1HV6gq1jyWjxuyn24E2GhoEcQ=="], - "@smithy/hash-blob-browser": ["@smithy/hash-blob-browser@4.0.1", "", { "dependencies": { "@smithy/chunked-blob-reader": "^5.0.0", "@smithy/chunked-blob-reader-native": "^4.0.0", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-rkFIrQOKZGS6i1D3gKJ8skJ0RlXqDvb1IyAphksaFOMzkn3v3I1eJ8m7OkLj0jf1McP63rcCEoLlkAn/HjcTRw=="], + "@smithy/hash-blob-browser": ["@smithy/hash-blob-browser@4.0.2", "", { "dependencies": { "@smithy/chunked-blob-reader": "^5.0.0", "@smithy/chunked-blob-reader-native": "^4.0.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-3g188Z3DyhtzfBRxpZjU8R9PpOQuYsbNnyStc/ZVS+9nVX1f6XeNOa9IrAh35HwwIZg+XWk8bFVtNINVscBP+g=="], - "@smithy/hash-node": ["@smithy/hash-node@4.0.1", "", { "dependencies": { "@smithy/types": "^4.1.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w=="], + "@smithy/hash-node": ["@smithy/hash-node@4.0.2", "", { "dependencies": { "@smithy/types": "^4.2.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-VnTpYPnRUE7yVhWozFdlxcYknv9UN7CeOqSrMH+V877v4oqtVYuoqhIhtSjmGPvYrYnAkaM61sLMKHvxL138yg=="], - "@smithy/hash-stream-node": ["@smithy/hash-stream-node@4.0.1", "", { "dependencies": { "@smithy/types": "^4.1.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-U1rAE1fxmReCIr6D2o/4ROqAQX+GffZpyMt3d7njtGDr2pUNmAKRWa49gsNVhCh2vVAuf3wXzWwNr2YN8PAXIw=="], + "@smithy/hash-stream-node": ["@smithy/hash-stream-node@4.0.2", "", { "dependencies": { "@smithy/types": "^4.2.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-POWDuTznzbIwlEXEvvXoPMS10y0WKXK790soe57tFRfvf4zBHyzE529HpZMqmDdwG9MfFflnyzndUQ8j78ZdSg=="], - "@smithy/invalid-dependency": ["@smithy/invalid-dependency@4.0.1", "", { "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ=="], + "@smithy/invalid-dependency": ["@smithy/invalid-dependency@4.0.2", "", { "dependencies": { "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-GatB4+2DTpgWPday+mnUkoumP54u/MDM/5u44KF9hIu8jF0uafZtQLcdfIKkIcUNuF/fBojpLEHZS/56JqPeXQ=="], "@smithy/is-array-buffer": ["@smithy/is-array-buffer@4.0.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw=="], - "@smithy/md5-js": ["@smithy/md5-js@4.0.1", "", { "dependencies": { "@smithy/types": "^4.1.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-HLZ647L27APi6zXkZlzSFZIjpo8po45YiyjMGJZM3gyDY8n7dPGdmxIIljLm4gPt/7rRvutLTTkYJpZVfG5r+A=="], + "@smithy/md5-js": ["@smithy/md5-js@4.0.2", "", { "dependencies": { "@smithy/types": "^4.2.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-Hc0R8EiuVunUewCse2syVgA2AfSRco3LyAv07B/zCOMa+jpXI9ll+Q21Nc6FAlYPcpNcAXqBzMhNs1CD/pP2bA=="], - "@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.0.1", "", { "dependencies": { "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ=="], + "@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.0.2", "", { "dependencies": { "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-hAfEXm1zU+ELvucxqQ7I8SszwQ4znWMbNv6PLMndN83JJN41EPuS93AIyh2N+gJ6x8QFhzSO6b7q2e6oClDI8A=="], - "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.0.6", "", { "dependencies": { "@smithy/core": "^3.1.5", "@smithy/middleware-serde": "^4.0.2", "@smithy/node-config-provider": "^4.0.1", "@smithy/shared-ini-file-loader": "^4.0.1", "@smithy/types": "^4.1.0", "@smithy/url-parser": "^4.0.1", "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" } }, "sha512-ftpmkTHIFqgaFugcjzLZv3kzPEFsBFSnq1JsIkr2mwFzCraZVhQk2gqN51OOeRxqhbPTkRFj39Qd2V91E/mQxg=="], + "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.1.0", "", { "dependencies": { "@smithy/core": "^3.2.0", "@smithy/middleware-serde": "^4.0.3", "@smithy/node-config-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", "@smithy/types": "^4.2.0", "@smithy/url-parser": "^4.0.2", "@smithy/util-middleware": "^4.0.2", "tslib": "^2.6.2" } }, "sha512-xhLimgNCbCzsUppRTGXWkZywksuTThxaIB0HwbpsVLY5sceac4e1TZ/WKYqufQLaUy+gUSJGNdwD2jo3cXL0iA=="], - "@smithy/middleware-retry": ["@smithy/middleware-retry@4.0.7", "", { "dependencies": { "@smithy/node-config-provider": "^4.0.1", "@smithy/protocol-http": "^5.0.1", "@smithy/service-error-classification": "^4.0.1", "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", "@smithy/util-middleware": "^4.0.1", "@smithy/util-retry": "^4.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" } }, "sha512-58j9XbUPLkqAcV1kHzVX/kAR16GT+j7DUZJqwzsxh1jtz7G82caZiGyyFgUvogVfNTg3TeAOIJepGc8TXF4AVQ=="], + "@smithy/middleware-retry": ["@smithy/middleware-retry@4.1.0", "", { "dependencies": { "@smithy/node-config-provider": "^4.0.2", "@smithy/protocol-http": "^5.1.0", "@smithy/service-error-classification": "^4.0.2", "@smithy/smithy-client": "^4.2.0", "@smithy/types": "^4.2.0", "@smithy/util-middleware": "^4.0.2", "@smithy/util-retry": "^4.0.2", "tslib": "^2.6.2", "uuid": "^9.0.1" } }, "sha512-2zAagd1s6hAaI/ap6SXi5T3dDwBOczOMCSkkYzktqN1+tzbk1GAsHNAdo/1uzxz3Ky02jvZQwbi/vmDA6z4Oyg=="], - "@smithy/middleware-serde": ["@smithy/middleware-serde@4.0.2", "", { "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ=="], + "@smithy/middleware-serde": ["@smithy/middleware-serde@4.0.3", "", { "dependencies": { "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-rfgDVrgLEVMmMn0BI8O+8OVr6vXzjV7HZj57l0QxslhzbvVfikZbVfBVthjLHqib4BW44QhcIgJpvebHlRaC9A=="], - "@smithy/middleware-stack": ["@smithy/middleware-stack@4.0.1", "", { "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA=="], + "@smithy/middleware-stack": ["@smithy/middleware-stack@4.0.2", "", { "dependencies": { "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-eSPVcuJJGVYrFYu2hEq8g8WWdJav3sdrI4o2c6z/rjnYDd3xH9j9E7deZQCzFn4QvGPouLngH3dQ+QVTxv5bOQ=="], - "@smithy/node-config-provider": ["@smithy/node-config-provider@4.0.1", "", { "dependencies": { "@smithy/property-provider": "^4.0.1", "@smithy/shared-ini-file-loader": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ=="], + "@smithy/node-config-provider": ["@smithy/node-config-provider@4.0.2", "", { "dependencies": { "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-WgCkILRZfJwJ4Da92a6t3ozN/zcvYyJGUTmfGbgS/FkCcoCjl7G4FJaCDN1ySdvLvemnQeo25FdkyMSTSwulsw=="], - "@smithy/node-http-handler": ["@smithy/node-http-handler@4.0.3", "", { "dependencies": { "@smithy/abort-controller": "^4.0.1", "@smithy/protocol-http": "^5.0.1", "@smithy/querystring-builder": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-dYCLeINNbYdvmMLtW0VdhW1biXt+PPCGazzT5ZjKw46mOtdgToQEwjqZSS9/EN8+tNs/RO0cEWG044+YZs97aA=="], + "@smithy/node-http-handler": ["@smithy/node-http-handler@4.0.4", "", { "dependencies": { "@smithy/abort-controller": "^4.0.2", "@smithy/protocol-http": "^5.1.0", "@smithy/querystring-builder": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-/mdqabuAT3o/ihBGjL94PUbTSPSRJ0eeVTdgADzow0wRJ0rN4A27EOrtlK56MYiO1fDvlO3jVTCxQtQmK9dZ1g=="], - "@smithy/property-provider": ["@smithy/property-provider@4.0.1", "", { "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ=="], + "@smithy/property-provider": ["@smithy/property-provider@4.0.2", "", { "dependencies": { "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-wNRoQC1uISOuNc2s4hkOYwYllmiyrvVXWMtq+TysNRVQaHm4yoafYQyjN/goYZS+QbYlPIbb/QRjaUZMuzwQ7A=="], - "@smithy/protocol-http": ["@smithy/protocol-http@5.0.1", "", { "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ=="], + "@smithy/protocol-http": ["@smithy/protocol-http@5.1.0", "", { "dependencies": { "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-KxAOL1nUNw2JTYrtviRRjEnykIDhxc84qMBzxvu1MUfQfHTuBlCG7PA6EdVwqpJjH7glw7FqQoFxUJSyBQgu7g=="], - "@smithy/querystring-builder": ["@smithy/querystring-builder@4.0.1", "", { "dependencies": { "@smithy/types": "^4.1.0", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg=="], + "@smithy/querystring-builder": ["@smithy/querystring-builder@4.0.2", "", { "dependencies": { "@smithy/types": "^4.2.0", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-NTOs0FwHw1vimmQM4ebh+wFQvOwkEf/kQL6bSM1Lock+Bv4I89B3hGYoUEPkmvYPkDKyp5UdXJYu+PoTQ3T31Q=="], - "@smithy/querystring-parser": ["@smithy/querystring-parser@4.0.1", "", { "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw=="], + "@smithy/querystring-parser": ["@smithy/querystring-parser@4.0.2", "", { "dependencies": { "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-v6w8wnmZcVXjfVLjxw8qF7OwESD9wnpjp0Dqry/Pod0/5vcEA3qxCr+BhbOHlxS8O+29eLpT3aagxXGwIoEk7Q=="], - "@smithy/service-error-classification": ["@smithy/service-error-classification@4.0.1", "", { "dependencies": { "@smithy/types": "^4.1.0" } }, "sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA=="], + "@smithy/service-error-classification": ["@smithy/service-error-classification@4.0.2", "", { "dependencies": { "@smithy/types": "^4.2.0" } }, "sha512-LA86xeFpTKn270Hbkixqs5n73S+LVM0/VZco8dqd+JT75Dyx3Lcw/MraL7ybjmz786+160K8rPOmhsq0SocoJQ=="], - "@smithy/shared-ini-file-loader": ["@smithy/shared-ini-file-loader@4.0.1", "", { "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw=="], + "@smithy/shared-ini-file-loader": ["@smithy/shared-ini-file-loader@4.0.2", "", { "dependencies": { "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-J9/gTWBGVuFZ01oVA6vdb4DAjf1XbDhK6sLsu3OS9qmLrS6KB5ygpeHiM3miIbj1qgSJ96GYszXFWv6ErJ8QEw=="], - "@smithy/signature-v4": ["@smithy/signature-v4@5.0.1", "", { "dependencies": { "@smithy/is-array-buffer": "^4.0.0", "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", "@smithy/util-hex-encoding": "^4.0.0", "@smithy/util-middleware": "^4.0.1", "@smithy/util-uri-escape": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA=="], + "@smithy/signature-v4": ["@smithy/signature-v4@5.0.2", "", { "dependencies": { "@smithy/is-array-buffer": "^4.0.0", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "@smithy/util-hex-encoding": "^4.0.0", "@smithy/util-middleware": "^4.0.2", "@smithy/util-uri-escape": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-Mz+mc7okA73Lyz8zQKJNyr7lIcHLiPYp0+oiqiMNc/t7/Kf2BENs5d63pEj7oPqdjaum6g0Fc8wC78dY1TgtXw=="], - "@smithy/smithy-client": ["@smithy/smithy-client@4.1.6", "", { "dependencies": { "@smithy/core": "^3.1.5", "@smithy/middleware-endpoint": "^4.0.6", "@smithy/middleware-stack": "^4.0.1", "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", "@smithy/util-stream": "^4.1.2", "tslib": "^2.6.2" } }, "sha512-UYDolNg6h2O0L+cJjtgSyKKvEKCOa/8FHYJnBobyeoeWDmNpXjwOAtw16ezyeu1ETuuLEOZbrynK0ZY1Lx9Jbw=="], + "@smithy/smithy-client": ["@smithy/smithy-client@4.2.0", "", { "dependencies": { "@smithy/core": "^3.2.0", "@smithy/middleware-endpoint": "^4.1.0", "@smithy/middleware-stack": "^4.0.2", "@smithy/protocol-http": "^5.1.0", "@smithy/types": "^4.2.0", "@smithy/util-stream": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-Qs65/w30pWV7LSFAez9DKy0Koaoh3iHhpcpCCJ4waj/iqwsuSzJna2+vYwq46yBaqO5ZbP9TjUsATUNxrKeBdw=="], - "@smithy/types": ["@smithy/types@4.1.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw=="], + "@smithy/types": ["@smithy/types@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-7eMk09zQKCO+E/ivsjQv+fDlOupcFUCSC/L2YUPgwhvowVGWbPQHjEFcmjt7QQ4ra5lyowS92SV53Zc6XD4+fg=="], - "@smithy/url-parser": ["@smithy/url-parser@4.0.1", "", { "dependencies": { "@smithy/querystring-parser": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g=="], + "@smithy/url-parser": ["@smithy/url-parser@4.0.2", "", { "dependencies": { "@smithy/querystring-parser": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-Bm8n3j2ScqnT+kJaClSVCMeiSenK6jVAzZCNewsYWuZtnBehEz4r2qP0riZySZVfzB+03XZHJeqfmJDkeeSLiQ=="], "@smithy/util-base64": ["@smithy/util-base64@4.0.0", "", { "dependencies": { "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg=="], @@ -2115,25 +2126,25 @@ "@smithy/util-config-provider": ["@smithy/util-config-provider@4.0.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w=="], - "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.0.7", "", { "dependencies": { "@smithy/property-provider": "^4.0.1", "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-CZgDDrYHLv0RUElOsmZtAnp1pIjwDVCSuZWOPhIOBvG36RDfX1Q9+6lS61xBf+qqvHoqRjHxgINeQz47cYFC2Q=="], + "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.0.8", "", { "dependencies": { "@smithy/property-provider": "^4.0.2", "@smithy/smithy-client": "^4.2.0", "@smithy/types": "^4.2.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-ZTypzBra+lI/LfTYZeop9UjoJhhGRTg3pxrNpfSTQLd3AJ37r2z4AXTKpq1rFXiiUIJsYyFgNJdjWRGP/cbBaQ=="], - "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.0.7", "", { "dependencies": { "@smithy/config-resolver": "^4.0.1", "@smithy/credential-provider-imds": "^4.0.1", "@smithy/node-config-provider": "^4.0.1", "@smithy/property-provider": "^4.0.1", "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-79fQW3hnfCdrfIi1soPbK3zmooRFnLpSx3Vxi6nUlqaaQeC5dm8plt4OTNDNqEEEDkvKghZSaoti684dQFVrGQ=="], + "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.0.8", "", { "dependencies": { "@smithy/config-resolver": "^4.1.0", "@smithy/credential-provider-imds": "^4.0.2", "@smithy/node-config-provider": "^4.0.2", "@smithy/property-provider": "^4.0.2", "@smithy/smithy-client": "^4.2.0", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-Rgk0Jc/UDfRTzVthye/k2dDsz5Xxs9LZaKCNPgJTRyoyBoeiNCnHsYGOyu1PKN+sDyPnJzMOz22JbwxzBp9NNA=="], - "@smithy/util-endpoints": ["@smithy/util-endpoints@3.0.1", "", { "dependencies": { "@smithy/node-config-provider": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA=="], + "@smithy/util-endpoints": ["@smithy/util-endpoints@3.0.2", "", { "dependencies": { "@smithy/node-config-provider": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-6QSutU5ZyrpNbnd51zRTL7goojlcnuOB55+F9VBD+j8JpRY50IGamsjlycrmpn8PQkmJucFW8A0LSfXj7jjtLQ=="], "@smithy/util-hex-encoding": ["@smithy/util-hex-encoding@4.0.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw=="], - "@smithy/util-middleware": ["@smithy/util-middleware@4.0.1", "", { "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA=="], + "@smithy/util-middleware": ["@smithy/util-middleware@4.0.2", "", { "dependencies": { "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-6GDamTGLuBQVAEuQ4yDQ+ti/YINf/MEmIegrEeg7DdB/sld8BX1lqt9RRuIcABOhAGTA50bRbPzErez7SlDtDQ=="], - "@smithy/util-retry": ["@smithy/util-retry@4.0.1", "", { "dependencies": { "@smithy/service-error-classification": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw=="], + "@smithy/util-retry": ["@smithy/util-retry@4.0.2", "", { "dependencies": { "@smithy/service-error-classification": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-Qryc+QG+7BCpvjloFLQrmlSd0RsVRHejRXd78jNO3+oREueCjwG1CCEH1vduw/ZkM1U9TztwIKVIi3+8MJScGg=="], - "@smithy/util-stream": ["@smithy/util-stream@4.1.2", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.0.1", "@smithy/node-http-handler": "^4.0.3", "@smithy/types": "^4.1.0", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-44PKEqQ303d3rlQuiDpcCcu//hV8sn+u2JBo84dWCE0rvgeiVl0IlLMagbU++o0jCWhYCsHaAt9wZuZqNe05Hw=="], + "@smithy/util-stream": ["@smithy/util-stream@4.2.0", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.0.2", "@smithy/node-http-handler": "^4.0.4", "@smithy/types": "^4.2.0", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-Vj1TtwWnuWqdgQI6YTUF5hQ/0jmFiOYsc51CSMgj7QfyO+RF4EnT2HNjoviNlOOmgzgvf3f5yno+EiC4vrnaWQ=="], "@smithy/util-uri-escape": ["@smithy/util-uri-escape@4.0.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg=="], "@smithy/util-utf8": ["@smithy/util-utf8@4.0.0", "", { "dependencies": { "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow=="], - "@smithy/util-waiter": ["@smithy/util-waiter@4.0.2", "", { "dependencies": { "@smithy/abort-controller": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ=="], + "@smithy/util-waiter": ["@smithy/util-waiter@4.0.3", "", { "dependencies": { "@smithy/abort-controller": "^4.0.2", "@smithy/types": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-JtaY3FxmD+te+KSI2FJuEcfNC9T/DGGVf551babM7fAaXhjJUt7oSYurH1Devxd2+BOSUACCgt3buinx4UnmEA=="], "@socket.io/component-emitter": ["@socket.io/component-emitter@3.1.2", "", {}, "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="], @@ -2195,33 +2206,33 @@ "@svgr/webpack": ["@svgr/webpack@8.1.0", "", { "dependencies": { "@babel/core": "^7.21.3", "@babel/plugin-transform-react-constant-elements": "^7.21.3", "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.21.0", "@svgr/core": "8.1.0", "@svgr/plugin-jsx": "8.1.0", "@svgr/plugin-svgo": "8.1.0" } }, "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA=="], - "@swc/core": ["@swc/core@1.11.11", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.19" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.11.11", "@swc/core-darwin-x64": "1.11.11", "@swc/core-linux-arm-gnueabihf": "1.11.11", "@swc/core-linux-arm64-gnu": "1.11.11", "@swc/core-linux-arm64-musl": "1.11.11", "@swc/core-linux-x64-gnu": "1.11.11", "@swc/core-linux-x64-musl": "1.11.11", "@swc/core-win32-arm64-msvc": "1.11.11", "@swc/core-win32-ia32-msvc": "1.11.11", "@swc/core-win32-x64-msvc": "1.11.11" }, "peerDependencies": { "@swc/helpers": "*" }, "optionalPeers": ["@swc/helpers"] }, "sha512-pCVY2Wn6dV/labNvssk9b3Owi4WOYsapcbWm90XkIj4xH/56Z6gzja9fsU+4MdPuEfC2Smw835nZHcdCFGyX6A=="], + "@swc/core": ["@swc/core@1.11.13", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.19" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.11.13", "@swc/core-darwin-x64": "1.11.13", "@swc/core-linux-arm-gnueabihf": "1.11.13", "@swc/core-linux-arm64-gnu": "1.11.13", "@swc/core-linux-arm64-musl": "1.11.13", "@swc/core-linux-x64-gnu": "1.11.13", "@swc/core-linux-x64-musl": "1.11.13", "@swc/core-win32-arm64-msvc": "1.11.13", "@swc/core-win32-ia32-msvc": "1.11.13", "@swc/core-win32-x64-msvc": "1.11.13" }, "peerDependencies": { "@swc/helpers": "*" }, "optionalPeers": ["@swc/helpers"] }, "sha512-9BXdYz12Wl0zWmZ80PvtjBWeg2ncwJ9L5WJzjhN6yUTZWEV/AwAdVdJnIEp4pro3WyKmAaMxcVOSbhuuOZco5g=="], - "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.11.11", "", { "os": "darwin", "cpu": "arm64" }, "sha512-vJcjGVDB8cZH7zyOkC0AfpFYI/7GHKG0NSsH3tpuKrmoAXJyCYspKPGid7FT53EAlWreN7+Pew+bukYf5j+Fmg=="], + "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.11.13", "", { "os": "darwin", "cpu": "arm64" }, "sha512-loSERhLaQ9XDS+5Kdx8cLe2tM1G0HLit8MfehipAcsdctpo79zrRlkW34elOf3tQoVPKUItV0b/rTuhjj8NtHg=="], - "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.11.11", "", { "os": "darwin", "cpu": "x64" }, "sha512-/N4dGdqEYvD48mCF3QBSycAbbQd3yoZ2YHSzYesQf8usNc2YpIhYqEH3sql02UsxTjEFOJSf1bxZABDdhbSl6A=="], + "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.11.13", "", { "os": "darwin", "cpu": "x64" }, "sha512-uSA4UwgsDCIysUPfPS8OrQTH2h9spO7IYFd+1NB6dJlVGUuR6jLKuMBOP1IeLeax4cGHayvkcwSJ3OvxHwgcZQ=="], - "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.11.11", "", { "os": "linux", "cpu": "arm" }, "sha512-hsBhKK+wVXdN3x9MrL5GW0yT8o9GxteE5zHAI2HJjRQel3HtW7m5Nvwaq+q8rwMf4YQRd8ydbvwl4iUOZx7i2Q=="], + "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.11.13", "", { "os": "linux", "cpu": "arm" }, "sha512-boVtyJzS8g30iQfe8Q46W5QE/cmhKRln/7NMz/5sBP/am2Lce9NL0d05NnFwEWJp1e2AMGHFOdRr3Xg1cDiPKw=="], - "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.11.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-YOCdxsqbnn/HMPCNM6nrXUpSndLXMUssGTtzT7ffXqr7WuzRg2e170FVDVQFIkb08E7Ku5uOnnUVAChAJQbMOQ=="], + "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.11.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-+IK0jZ84zHUaKtwpV+T+wT0qIUBnK9v2xXD03vARubKF+eUqCsIvcVHXmLpFuap62dClMrhCiwW10X3RbXNlHw=="], - "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.11.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-nR2tfdQRRzwqR2XYw9NnBk9Fdvff/b8IiJzDL28gRR2QiJWLaE8LsRovtWrzCOYq6o5Uu9cJ3WbabWthLo4jLw=="], + "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.11.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-+ukuB8RHD5BHPCUjQwuLP98z+VRfu+NkKQVBcLJGgp0/+w7y0IkaxLY/aKmrAS5ofCNEGqKL+AOVyRpX1aw+XA=="], - "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.11.11", "", { "os": "linux", "cpu": "x64" }, "sha512-b4gBp5HA9xNWNC5gsYbdzGBJWx4vKSGybGMGOVWWuF+ynx10+0sA/o4XJGuNHm8TEDuNh9YLKf6QkIO8+GPJ1g=="], + "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.11.13", "", { "os": "linux", "cpu": "x64" }, "sha512-q9H3WI3U3dfJ34tdv60zc8oTuWvSd5fOxytyAO9Pc5M82Hic3jjWaf2xBekUg07ubnMZpyfnv+MlD+EbUI3Llw=="], - "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.11.11", "", { "os": "linux", "cpu": "x64" }, "sha512-dEvqmQVswjNvMBwXNb8q5uSvhWrJLdttBSef3s6UC5oDSwOr00t3RQPzyS3n5qmGJ8UMTdPRmsopxmqaODISdg=="], + "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.11.13", "", { "os": "linux", "cpu": "x64" }, "sha512-9aaZnnq2pLdTbAzTSzy/q8dr7Woy3aYIcQISmw1+Q2/xHJg5y80ZzbWSWKYca/hKonDMjIbGR6dp299I5J0aeA=="], - "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.11.11", "", { "os": "win32", "cpu": "arm64" }, "sha512-aZNZznem9WRnw2FbTqVpnclvl8Q2apOBW2B316gZK+qxbe+ktjOUnYaMhdCG3+BYggyIBDOnaJeQrXbKIMmNdw=="], + "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.11.13", "", { "os": "win32", "cpu": "arm64" }, "sha512-n3QZmDewkHANcoHvtwvA6yJbmS4XJf0MBMmwLZoKDZ2dOnC9D/jHiXw7JOohEuzYcpLoL5tgbqmjxa3XNo9Oow=="], - "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.11.11", "", { "os": "win32", "cpu": "ia32" }, "sha512-DjeJn/IfjgOddmJ8IBbWuDK53Fqw7UvOz7kyI/728CSdDYC3LXigzj3ZYs4VvyeOt+ZcQZUB2HA27edOifomGw=="], + "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.11.13", "", { "os": "win32", "cpu": "ia32" }, "sha512-wM+Nt4lc6YSJFthCx3W2dz0EwFNf++j0/2TQ0Js9QLJuIxUQAgukhNDVCDdq8TNcT0zuA399ALYbvj5lfIqG6g=="], - "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.11.11", "", { "os": "win32", "cpu": "x64" }, "sha512-Gp/SLoeMtsU4n0uRoKDOlGrRC6wCfifq7bqLwSlAG8u8MyJYJCcwjg7ggm0rhLdC2vbiZ+lLVl3kkETp+JUvKg=="], + "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.11.13", "", { "os": "win32", "cpu": "x64" }, "sha512-+X5/uW3s1L5gK7wAo0E27YaAoidJDo51dnfKSfU7gF3mlEUuWH8H1bAy5OTt2mU4eXtfsdUMEVXSwhDlLtQkuA=="], "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], - "@swc/types": ["@swc/types@0.1.19", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-WkAZaAfj44kh/UFdAQcrMP1I0nwRqpt27u+08LMBYMqmQfwwMofYoMh/48NGkMMRfC4ynpfwRbJuu8ErfNloeA=="], + "@swc/types": ["@swc/types@0.1.20", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-/rlIpxwKrhz4BIplXf6nsEHtqlhzuNN34/k3kMAXH4/lvVoA3cdq+60aqVNnyvw2uITEaCi0WV3pxBe4dQqoXQ=="], "@szmarczak/http-timer": ["@szmarczak/http-timer@5.0.1", "", { "dependencies": { "defer-to-connect": "^2.0.1" } }, "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw=="], @@ -2283,9 +2294,7 @@ "@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], - "@types/acorn": ["@types/acorn@4.0.6", "", { "dependencies": { "@types/estree": "*" } }, "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ=="], - - "@types/aws-lambda": ["@types/aws-lambda@8.10.147", "", {}, "sha512-nD0Z9fNIZcxYX5Mai2CTmFD7wX7UldCkW2ezCF8D1T5hdiLsnTWDGRpfRYntU6VjTdLQjOvyszru7I1c1oCQew=="], + "@types/aws-lambda": ["@types/aws-lambda@8.10.148", "", {}, "sha512-JL+2cfkY9ODQeE06hOxSFNkafjNk4JRBgY837kpoq1GHDttq2U3BA9IzKOWxS4DLjKoymGB4i9uBrlCkjUl1yg=="], "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], @@ -2293,7 +2302,7 @@ "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], - "@types/babel__traverse": ["@types/babel__traverse@7.20.6", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg=="], + "@types/babel__traverse": ["@types/babel__traverse@7.20.7", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng=="], "@types/body-parser": ["@types/body-parser@1.19.5", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg=="], @@ -2301,7 +2310,7 @@ "@types/boom": ["@types/boom@7.3.5", "", {}, "sha512-jBS0kU2s9W2sx+ILEyO4kxqIYLllqcUXTaVrBctvGptZ+4X3TWkkgY9+AmxdMPKrgiDDdLcfsaQCTu7bniLvgw=="], - "@types/bun": ["@types/bun@1.2.5", "", { "dependencies": { "bun-types": "1.2.5" } }, "sha512-w2OZTzrZTVtbnJew1pdFmgV99H0/L+Pvw+z1P67HaR18MHOzYnTYOi6qzErhK8HyT+DB782ADVPPE92Xu2/Opg=="], + "@types/bun": ["@types/bun@1.2.6", "", { "dependencies": { "bun-types": "1.2.6" } }, "sha512-fY9CAmTdJH1Llx7rugB0FpgWK2RKuHCs3g2cFDYXUutIy1QGiPQxKkGY8owhfZ4MXWNfxwIbQLChgH5gDsY7vw=="], "@types/catbox": ["@types/catbox@10.0.9", "", {}, "sha512-4qXm1SmZurBMNFc/536+7gfbOlN43fWyoo4O0bdLqtpDK/cpuCYnEDou0Cl4naaMwuJ19rEwnuscR7tetGnTDA=="], @@ -2385,7 +2394,7 @@ "@types/eslint-scope": ["@types/eslint-scope@3.7.7", "", { "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg=="], - "@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + "@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="], "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], @@ -2453,7 +2462,7 @@ "@types/multer": ["@types/multer@1.4.12", "", { "dependencies": { "@types/express": "*" } }, "sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg=="], - "@types/node": ["@types/node@22.13.11", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-iEUCUJoU0i3VnrCmgoWCXttklWcvoCIx4jzcP22fioIVSdTmjgoEvmAO/QPw6TcS9k5FrNgn4w7q5lGOd1CT5g=="], + "@types/node": ["@types/node@22.13.13", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ=="], "@types/node-fetch": ["@types/node-fetch@2.6.12", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.0" } }, "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA=="], @@ -2539,27 +2548,35 @@ "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], - "@unrs/rspack-resolver-binding-darwin-arm64": ["@unrs/rspack-resolver-binding-darwin-arm64@1.2.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-i7z0B+C0P8Q63O/5PXJAzeFtA1ttY3OR2VSJgGv18S+PFNwD98xHgAgPOT1H5HIV6jlQP8Avzbp09qxJUdpPNw=="], + "@unrs/rspack-resolver-binding-darwin-arm64": ["@unrs/rspack-resolver-binding-darwin-arm64@1.3.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-EcjI0Hh2HiNOM0B9UuYH1PfLWgE6/SBQ4dKoHXWNloERfveha/n6aUZSBThtPGnJenmdfaJYXXZtqyNbWtJAFw=="], + + "@unrs/rspack-resolver-binding-darwin-x64": ["@unrs/rspack-resolver-binding-darwin-x64@1.3.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-3CgG+mhfudDfnaDqwEl0W1mcGTto5f5mqPyJSXcWDxrnNc7pr/p01khIgWOoOD1eCwVejmgpYvRKGBwJPwgHOQ=="], + + "@unrs/rspack-resolver-binding-freebsd-x64": ["@unrs/rspack-resolver-binding-freebsd-x64@1.3.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-ww8BwryDrpXlSajwSIEUXEv8oKDkw04L2ke3hxjaxWohuBV8pAQie9XBS4yQTyREuL2ypcqbARfoCXJJzVp7ig=="], + + "@unrs/rspack-resolver-binding-linux-arm-gnueabihf": ["@unrs/rspack-resolver-binding-linux-arm-gnueabihf@1.3.0", "", { "os": "linux", "cpu": "arm" }, "sha512-WyhonI1mkuAlnG2iaMjk7uy4aWX+FWi2Au8qCCwj57wVHbAEfrN6xN2YhzbrsCC+ciumKhj5c01MqwsnYDNzWQ=="], + + "@unrs/rspack-resolver-binding-linux-arm-musleabihf": ["@unrs/rspack-resolver-binding-linux-arm-musleabihf@1.3.0", "", { "os": "linux", "cpu": "arm" }, "sha512-+uCP6hIAMVWHKQnLZHESJ1U1TFVGLR3FTeaS2A4zB0k8w+IbZlWwl9FiBUOwOiqhcCCyKiUEifgnYFNGpxi3pw=="], - "@unrs/rspack-resolver-binding-darwin-x64": ["@unrs/rspack-resolver-binding-darwin-x64@1.2.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-YEdFzPjIbDUCfmehC6eS+AdJYtFWY35YYgWUnqqTM2oe/N58GhNy5yRllxYhxwJ9GcfHoNc6Ubze1yjkNv+9Qg=="], + "@unrs/rspack-resolver-binding-linux-arm64-gnu": ["@unrs/rspack-resolver-binding-linux-arm64-gnu@1.3.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-p+s/Wp8rf75Qqs2EPw4HC0xVLLW+/60MlVAsB7TYLoeg1e1CU/QCis36FxpziLS0ZY2+wXdTnPUxr+5kkThzwQ=="], - "@unrs/rspack-resolver-binding-freebsd-x64": ["@unrs/rspack-resolver-binding-freebsd-x64@1.2.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TU4ntNXDgPN2giQyyzSnGWf/dVCem5lvwxg0XYvsvz35h5H19WrhTmHgbrULMuypCB3aHe1enYUC9rPLDw45mA=="], + "@unrs/rspack-resolver-binding-linux-arm64-musl": ["@unrs/rspack-resolver-binding-linux-arm64-musl@1.3.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-cZEL9jmZ2kAN53MEk+fFCRJM8pRwOEboDn7sTLjZW+hL6a0/8JNfHP20n8+MBDrhyD34BSF4A6wPCj/LNhtOIQ=="], - "@unrs/rspack-resolver-binding-linux-arm-gnueabihf": ["@unrs/rspack-resolver-binding-linux-arm-gnueabihf@1.2.2", "", { "os": "linux", "cpu": "arm" }, "sha512-ik3w4/rU6RujBvNWiDnKdXi1smBhqxEDhccNi/j2rHaMjm0Fk49KkJ6XKsoUnD2kZ5xaMJf9JjailW/okfUPIw=="], + "@unrs/rspack-resolver-binding-linux-ppc64-gnu": ["@unrs/rspack-resolver-binding-linux-ppc64-gnu@1.3.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-IOeRhcMXTNlk2oApsOozYVcOHu4t1EKYKnTz4huzdPyKNPX0Y9C7X8/6rk4aR3Inb5s4oVMT9IVKdgNXLcpGAQ=="], - "@unrs/rspack-resolver-binding-linux-arm64-gnu": ["@unrs/rspack-resolver-binding-linux-arm64-gnu@1.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-fp4Azi8kHz6TX8SFmKfyScZrMLfp++uRm2srpqRjsRZIIBzH74NtSkdEUHImR4G7f7XJ+sVZjCc6KDDK04YEpQ=="], + "@unrs/rspack-resolver-binding-linux-s390x-gnu": ["@unrs/rspack-resolver-binding-linux-s390x-gnu@1.3.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-op54XrlEbhgVRCxzF1pHFcLamdOmHDapwrqJ9xYRB7ZjwP/zQCKzz/uAsSaAlyQmbSi/PXV7lwfca4xkv860/Q=="], - "@unrs/rspack-resolver-binding-linux-arm64-musl": ["@unrs/rspack-resolver-binding-linux-arm64-musl@1.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-gMiG3DCFioJxdGBzhlL86KcFgt9HGz0iDhw0YVYPsShItpN5pqIkNrI+L/Q/0gfDiGrfcE0X3VANSYIPmqEAlQ=="], + "@unrs/rspack-resolver-binding-linux-x64-gnu": ["@unrs/rspack-resolver-binding-linux-x64-gnu@1.3.0", "", { "os": "linux", "cpu": "x64" }, "sha512-orbQF7sN02N/b9QF8Xp1RBO5YkfI+AYo9VZw0H2Gh4JYWSuiDHjOPEeFPDIRyWmXbQJuiVNSB+e1pZOjPPKIyg=="], - "@unrs/rspack-resolver-binding-linux-x64-gnu": ["@unrs/rspack-resolver-binding-linux-x64-gnu@1.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-n/4n2CxaUF9tcaJxEaZm+lqvaw2gflfWQ1R9I7WQgYkKEKbRKbpG/R3hopYdUmLSRI4xaW1Cy0Bz40eS2Yi4Sw=="], + "@unrs/rspack-resolver-binding-linux-x64-musl": ["@unrs/rspack-resolver-binding-linux-x64-musl@1.3.0", "", { "os": "linux", "cpu": "x64" }, "sha512-kpjqjIAC9MfsjmlgmgeC8U9gZi6g/HTuCqpI7SBMjsa7/9MvBaQ6TJ7dtnsV/+DXvfJ2+L5teBBXG+XxfpvIFA=="], - "@unrs/rspack-resolver-binding-linux-x64-musl": ["@unrs/rspack-resolver-binding-linux-x64-musl@1.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-cHyhAr6rlYYbon1L2Ag449YCj3p6XMfcYTP0AQX+KkQo025d1y/VFtPWvjMhuEsE2lLvtHm7GdJozj6BOMtzVg=="], + "@unrs/rspack-resolver-binding-wasm32-wasi": ["@unrs/rspack-resolver-binding-wasm32-wasi@1.3.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.7" }, "cpu": "none" }, "sha512-JAg0hY3kGsCPk7Jgh16yMTBZ6VEnoNR1DFZxiozjKwH+zSCfuDuM5S15gr50ofbwVw9drobIP2TTHdKZ15MJZQ=="], - "@unrs/rspack-resolver-binding-wasm32-wasi": ["@unrs/rspack-resolver-binding-wasm32-wasi@1.2.2", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.7" }, "cpu": "none" }, "sha512-eogDKuICghDLGc32FtP+WniG38IB1RcGOGz0G3z8406dUdjJvxfHGuGs/dSlM9YEp/v0lEqhJ4mBu6X2nL9pog=="], + "@unrs/rspack-resolver-binding-win32-arm64-msvc": ["@unrs/rspack-resolver-binding-win32-arm64-msvc@1.3.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-h5N83i407ntS3ndDkhT/3vC3Dj8oP0BIwMtekETNJcxk7IuWccSXifzCEhdxxu/FOX4OICGIHdHrxf5fJuAjfw=="], - "@unrs/rspack-resolver-binding-win32-arm64-msvc": ["@unrs/rspack-resolver-binding-win32-arm64-msvc@1.2.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-7sWRJumhpXSi2lccX8aQpfFXHsSVASdWndLv8AmD8nDRA/5PBi8IplQVZNx2mYRx6+Bp91Z00kuVqpXO9NfCTg=="], + "@unrs/rspack-resolver-binding-win32-ia32-msvc": ["@unrs/rspack-resolver-binding-win32-ia32-msvc@1.3.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-9QH7Gq3dRL8Q/D6PGS3Dwtjx9yw6kbCEu6iBkAUhFTDAuVUk2L0H/5NekRVA13AQaSc3OsEUKt60EOn/kq5Dug=="], - "@unrs/rspack-resolver-binding-win32-x64-msvc": ["@unrs/rspack-resolver-binding-win32-x64-msvc@1.2.2", "", { "os": "win32", "cpu": "x64" }, "sha512-hewo/UMGP1a7O6FG/ThcPzSJdm/WwrYDNkdGgWl6M18H6K6MSitklomWpT9MUtT5KGj++QJb06va/14QBC4pvw=="], + "@unrs/rspack-resolver-binding-win32-x64-msvc": ["@unrs/rspack-resolver-binding-win32-x64-msvc@1.3.0", "", { "os": "win32", "cpu": "x64" }, "sha512-IYuXJCuwBOVV0H73l6auaZwtAPHjCPBJkxd4Co0yO6dSjDM5Na5OceaxhUmJLZ3z8kuEGhTYWIHH7PchGztnlg=="], "@vitejs/plugin-react": ["@vitejs/plugin-react@4.3.4", "", { "dependencies": { "@babel/core": "^7.26.0", "@babel/plugin-transform-react-jsx-self": "^7.25.9", "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@types/babel__core": "^7.20.5", "react-refresh": "^0.14.2" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug=="], @@ -2655,7 +2672,7 @@ "aggregate-error": ["aggregate-error@3.1.0", "", { "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="], - "ai": ["ai@4.2.0", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "@ai-sdk/provider-utils": "2.2.0", "@ai-sdk/react": "1.2.0", "@ai-sdk/ui-utils": "1.2.0", "@opentelemetry/api": "1.9.0", "eventsource-parser": "^3.0.0", "jsondiffpatch": "0.6.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "optionalPeers": ["react"] }, "sha512-3xJWzBZpBS3n/UY360IopufV5dpfgYoY08eCAV2A2m7CcyJxVOAQ4lXvBGSsB+mR+BYJ8Y/JOesFfc0+k4jz3A=="], + "ai": ["ai@4.2.5", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "@ai-sdk/provider-utils": "2.2.1", "@ai-sdk/react": "1.2.2", "@ai-sdk/ui-utils": "1.2.1", "@opentelemetry/api": "1.9.0", "jsondiffpatch": "0.6.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "optionalPeers": ["react"] }, "sha512-URJEslI3cgF/atdTJHtz+Sj0W1JTmiGmD3znw9KensL3qV605odktDim+GTazNJFPR4QaIu1lUio5b8RymvOjA=="], "ajv": ["ajv@8.17.1", "", { "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-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], @@ -2665,9 +2682,9 @@ "ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], - "algoliasearch": ["algoliasearch@5.21.0", "", { "dependencies": { "@algolia/client-abtesting": "5.21.0", "@algolia/client-analytics": "5.21.0", "@algolia/client-common": "5.21.0", "@algolia/client-insights": "5.21.0", "@algolia/client-personalization": "5.21.0", "@algolia/client-query-suggestions": "5.21.0", "@algolia/client-search": "5.21.0", "@algolia/ingestion": "1.21.0", "@algolia/monitoring": "1.21.0", "@algolia/recommend": "5.21.0", "@algolia/requester-browser-xhr": "5.21.0", "@algolia/requester-fetch": "5.21.0", "@algolia/requester-node-http": "5.21.0" } }, "sha512-hexLq2lSO1K5SW9j21Ubc+q9Ptx7dyRTY7se19U8lhIlVMLCNXWCyQ6C22p9ez8ccX0v7QVmwkl2l1CnuGoO2Q=="], + "algoliasearch": ["algoliasearch@5.23.0", "", { "dependencies": { "@algolia/client-abtesting": "5.23.0", "@algolia/client-analytics": "5.23.0", "@algolia/client-common": "5.23.0", "@algolia/client-insights": "5.23.0", "@algolia/client-personalization": "5.23.0", "@algolia/client-query-suggestions": "5.23.0", "@algolia/client-search": "5.23.0", "@algolia/ingestion": "1.23.0", "@algolia/monitoring": "1.23.0", "@algolia/recommend": "5.23.0", "@algolia/requester-browser-xhr": "5.23.0", "@algolia/requester-fetch": "5.23.0", "@algolia/requester-node-http": "5.23.0" } }, "sha512-7TCj+hLx6fZKppLL74lYGDEltSBNSu4vqRwgqeIKZ3VQ0q3aOrdEN0f1sDWcvU1b+psn2wnl7aHt9hWtYatUUA=="], - "algoliasearch-helper": ["algoliasearch-helper@3.24.2", "", { "dependencies": { "@algolia/events": "^4.0.1" }, "peerDependencies": { "algoliasearch": ">= 3.1 < 6" } }, "sha512-vBw/INZDfyh/THbVeDy8On8lZqd2qiUAHde5N4N1ygL4SoeLqLGJ4GHneHrDAYsjikRwTTtodEP0fiXl5MxHFQ=="], + "algoliasearch-helper": ["algoliasearch-helper@3.24.3", "", { "dependencies": { "@algolia/events": "^4.0.1" }, "peerDependencies": { "algoliasearch": ">= 3.1 < 6" } }, "sha512-3QKg5lzSfUiPN8Hn1ViHEGv6PjK7i4SFEDLzwlSzPO/4mVOsyos7B7/AsEtFQW5KHHPiCq6DyJl+mzg7CYlEgw=="], "allof-merge": ["allof-merge@0.6.6", "", { "dependencies": { "json-crawl": "^0.5.3" } }, "sha512-116eZBf2he0/J4Tl7EYMz96I5Anaeio+VL0j/H2yxW9CoYQAMMv8gYcwkVRoO7XfIOv/qzSTfVzDVGAYxKFi3g=="], @@ -2785,9 +2802,9 @@ "bare-events": ["bare-events@2.5.4", "", {}, "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA=="], - "bare-fs": ["bare-fs@4.0.1", "", { "dependencies": { "bare-events": "^2.0.0", "bare-path": "^3.0.0", "bare-stream": "^2.0.0" } }, "sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg=="], + "bare-fs": ["bare-fs@4.0.2", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-S5mmkMesiduMqnz51Bfh0Et9EX0aTCJxhsI4bvzFFLs8Z1AV8RDHadfY5CyLwdoLHgXbNBEN1gQcbEtGwuvixw=="], - "bare-os": ["bare-os@3.6.0", "", {}, "sha512-BUrFS5TqSBdA0LwHop4OjPJwisqxGy6JsWVqV6qaFoe965qqtaKfDzHY5T2YA1gUL0ZeeQeA+4BBc1FJTcHiPw=="], + "bare-os": ["bare-os@3.6.1", "", {}, "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g=="], "bare-path": ["bare-path@3.0.0", "", { "dependencies": { "bare-os": "^3.0.1" } }, "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw=="], @@ -2879,7 +2896,7 @@ "bun": ["bun@1.2.5", "", { "optionalDependencies": { "@oven/bun-darwin-aarch64": "1.2.5", "@oven/bun-darwin-x64": "1.2.5", "@oven/bun-darwin-x64-baseline": "1.2.5", "@oven/bun-linux-aarch64": "1.2.5", "@oven/bun-linux-aarch64-musl": "1.2.5", "@oven/bun-linux-x64": "1.2.5", "@oven/bun-linux-x64-baseline": "1.2.5", "@oven/bun-linux-x64-musl": "1.2.5", "@oven/bun-linux-x64-musl-baseline": "1.2.5", "@oven/bun-windows-x64": "1.2.5", "@oven/bun-windows-x64-baseline": "1.2.5" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ], "bin": { "bun": "bin/bun.exe", "bunx": "bin/bun.exe" } }, "sha512-fbQLt+DPiGUrPKdmsHRRT7cQAlfjdxPVFvLZrsUPmKiTdv+pU50ypdx9yRJluknSbyaZchFVV7Lx2KXikXKX2Q=="], - "bun-types": ["bun-types@1.2.5", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-3oO6LVGGRRKI4kHINx5PIdIgnLRb7l/SprhzqXapmoYkFl5m4j6EvALvbDVuuBFaamB46Ap6HCUxIXNLCGy+tg=="], + "bun-types": ["bun-types@1.2.6", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-FbCKyr5KDiPULUzN/nm5oqQs9nXCHD8dVc64BArxJadCvbNzAI6lUWGh9fSJZWeDIRD38ikceBU8Kj/Uh+53oQ=="], "bundle-require": ["bundle-require@5.1.0", "", { "dependencies": { "load-tsconfig": "^0.2.3" }, "peerDependencies": { "esbuild": ">=0.18" } }, "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA=="], @@ -2917,12 +2934,14 @@ "caniuse-api": ["caniuse-api@3.0.0", "", { "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", "lodash.memoize": "^4.1.2", "lodash.uniq": "^4.5.0" } }, "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw=="], - "caniuse-lite": ["caniuse-lite@1.0.30001706", "", {}, "sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug=="], + "caniuse-lite": ["caniuse-lite@1.0.30001707", "", {}, "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw=="], "canvas": ["canvas@2.11.2", "", { "dependencies": { "@mapbox/node-pre-gyp": "^1.0.0", "nan": "^2.17.0", "simple-get": "^3.0.3" } }, "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw=="], "capsolver-npm": ["capsolver-npm@2.0.2", "", { "dependencies": { "axios": "^0.27.2", "dotenv": "^16.4.5" } }, "sha512-PvkAGTuwtKXczJeoiLu2XQ4SzJh0m7Yr3ONJuvdjEAw95LwtfGxZ3Ip/w21kR94R4O260omLGlTcQvPf2ECnLg=="], + "caseless": ["caseless@0.12.0", "", {}, "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="], + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], "chai": ["chai@5.2.0", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw=="], @@ -3397,7 +3416,7 @@ "ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="], - "electron-to-chromium": ["electron-to-chromium@1.5.123", "", {}, "sha512-refir3NlutEZqlKaBLK0tzlVLe5P2wDKS7UQt/3SpibizgsRAPOsqQC3ffw1nlv3ze5gjRQZYHoPymgVZkplFA=="], + "electron-to-chromium": ["electron-to-chromium@1.5.124", "", {}, "sha512-riELkpDUqBi00gqreV3RIGoowxGrfueEKBd6zPdOk/I8lvuFpBGNkYoHof3zUHbiTBsIU8oxdIIL/WNrAG1/7A=="], "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], @@ -3425,7 +3444,7 @@ "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], - "env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="], + "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], "env-var": ["env-var@7.5.0", "", {}, "sha512-mKZOzLRN0ETzau2W2QXefbFjo5EF4yWq28OyKb9ICdeNhHJlOE/pHHnz4hdYJ9cNZXcJHo5xN4OT4pzuSHSNvA=="], @@ -3623,6 +3642,8 @@ "feed": ["feed@4.2.2", "", { "dependencies": { "xml-js": "^1.6.11" } }, "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ=="], + "ffmpeg-static": ["ffmpeg-static@5.2.0", "", { "dependencies": { "@derhuerst/http-basic": "^8.2.0", "env-paths": "^2.2.0", "https-proxy-agent": "^5.0.0", "progress": "^2.0.3" } }, "sha512-WrM7kLW+do9HLr+H6tk7LzQ7kPqbAgLjdzNE32+u3Ff11gXt9Kkkd2nusGFrlWMIe+XaA97t+I8JS7sZIrvRgA=="], + "figures": ["figures@3.2.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="], "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], @@ -3865,7 +3886,7 @@ "hpack.js": ["hpack.js@2.1.6", "", { "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", "readable-stream": "^2.0.1", "wbuf": "^1.1.0" } }, "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ=="], - "html-entities": ["html-entities@2.5.2", "", {}, "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA=="], + "html-entities": ["html-entities@2.5.3", "", {}, "sha512-D3AfvN7SjhTgBSA8L1BN4FpPzuEd06uy4lHwSoRWr0lndi9BKaNzPLKGOWZ2ocSGguozr08TTb2jhCLHaemruw=="], "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], @@ -3895,6 +3916,8 @@ "http-reasons": ["http-reasons@0.1.0", "", {}, "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ=="], + "http-response-object": ["http-response-object@3.0.2", "", { "dependencies": { "@types/node": "^10.0.3" } }, "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA=="], + "http2-client": ["http2-client@1.3.5", "", {}, "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA=="], "http2-wrapper": ["http2-wrapper@2.2.1", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" } }, "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ=="], @@ -3925,7 +3948,7 @@ "immer": ["immer@9.0.21", "", {}, "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA=="], - "immutable": ["immutable@5.0.3", "", {}, "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw=="], + "immutable": ["immutable@5.1.1", "", {}, "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg=="], "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], @@ -3953,7 +3976,7 @@ "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=="], - "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="], + "internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="], "interpret": ["interpret@1.4.0", "", {}, "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="], @@ -4189,9 +4212,9 @@ "langchain": ["langchain@0.3.19", "", { "dependencies": { "@langchain/openai": ">=0.1.0 <0.5.0", "@langchain/textsplitters": ">=0.0.0 <0.2.0", "js-tiktoken": "^1.0.12", "js-yaml": "^4.1.0", "jsonpointer": "^5.0.1", "langsmith": ">=0.2.8 <0.4.0", "openapi-types": "^12.1.3", "p-retry": "4", "uuid": "^10.0.0", "yaml": "^2.2.1", "zod": "^3.22.4", "zod-to-json-schema": "^3.22.3" }, "peerDependencies": { "@langchain/anthropic": "*", "@langchain/aws": "*", "@langchain/cerebras": "*", "@langchain/cohere": "*", "@langchain/core": ">=0.2.21 <0.4.0", "@langchain/deepseek": "*", "@langchain/google-genai": "*", "@langchain/google-vertexai": "*", "@langchain/google-vertexai-web": "*", "@langchain/groq": "*", "@langchain/mistralai": "*", "@langchain/ollama": "*", "@langchain/xai": "*", "axios": "*", "cheerio": "*", "handlebars": "^4.7.8", "peggy": "^3.0.2", "typeorm": "*" }, "optionalPeers": ["@langchain/anthropic", "@langchain/aws", "@langchain/cerebras", "@langchain/cohere", "@langchain/deepseek", "@langchain/google-genai", "@langchain/google-vertexai", "@langchain/google-vertexai-web", "@langchain/groq", "@langchain/mistralai", "@langchain/ollama", "@langchain/xai", "axios", "cheerio", "handlebars", "peggy", "typeorm"] }, "sha512-aGhoTvTBS5ulatA67RHbJ4bcV5zcYRYdm5IH+hpX99RYSFXG24XF3ghSjhYi6sxW+SUnEQ99fJhA5kroVpKNhw=="], - "langium": ["langium@3.0.0", "", { "dependencies": { "chevrotain": "~11.0.3", "chevrotain-allstar": "~0.3.0", "vscode-languageserver": "~9.0.1", "vscode-languageserver-textdocument": "~1.0.11", "vscode-uri": "~3.0.8" } }, "sha512-+Ez9EoiByeoTu/2BXmEaZ06iPNXM6thWJp02KfBO/raSMyCJ4jw7AkWWa+zBCTm0+Tw1Fj9FOxdqSskyN5nAwg=="], + "langium": ["langium@3.3.1", "", { "dependencies": { "chevrotain": "~11.0.3", "chevrotain-allstar": "~0.3.0", "vscode-languageserver": "~9.0.1", "vscode-languageserver-textdocument": "~1.0.11", "vscode-uri": "~3.0.8" } }, "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w=="], - "langsmith": ["langsmith@0.3.14", "", { "dependencies": { "@types/uuid": "^10.0.0", "chalk": "^4.1.2", "console-table-printer": "^2.12.1", "p-queue": "^6.6.2", "p-retry": "4", "semver": "^7.6.3", "uuid": "^10.0.0" }, "peerDependencies": { "openai": "*" }, "optionalPeers": ["openai"] }, "sha512-MzoxdRkFFV/6140vpP5V2e2fkTG6x/0zIjw77bsRwAXEMjPRTUyDazfXeSyrS5uJvbLgxAXc+MF1h6vPWe6SXQ=="], + "langsmith": ["langsmith@0.3.15", "", { "dependencies": { "@types/uuid": "^10.0.0", "chalk": "^4.1.2", "console-table-printer": "^2.12.1", "p-queue": "^6.6.2", "p-retry": "4", "semver": "^7.6.3", "uuid": "^10.0.0" }, "peerDependencies": { "openai": "*" }, "optionalPeers": ["openai"] }, "sha512-cv3ebg0Hh0gRbl72cv/uzaZ+KOdfa2mGF1s74vmB2vlNVO/Ap/O9RYaHV+tpR8nwhGZ50R3ILnTOwSwGP+XQxw=="], "language-subtag-registry": ["language-subtag-registry@0.3.23", "", {}, "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ=="], @@ -4375,7 +4398,7 @@ "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], - "mermaid": ["mermaid@11.5.0", "", { "dependencies": { "@braintree/sanitize-url": "^7.0.4", "@iconify/utils": "^2.1.33", "@mermaid-js/parser": "^0.3.0", "@types/d3": "^7.4.3", "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.11", "dayjs": "^1.11.13", "dompurify": "^3.2.4", "katex": "^0.16.9", "khroma": "^2.1.0", "lodash-es": "^4.17.21", "marked": "^15.0.7", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0" } }, "sha512-IYhyukID3zzDj1EihKiN1lp+PXNImoJ3Iyz73qeDAgnus4BNGsJV1n471P4PyeGxPVONerZxignwGxGTSwZnlg=="], + "mermaid": ["mermaid@11.6.0", "", { "dependencies": { "@braintree/sanitize-url": "^7.0.4", "@iconify/utils": "^2.1.33", "@mermaid-js/parser": "^0.4.0", "@types/d3": "^7.4.3", "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.11", "dayjs": "^1.11.13", "dompurify": "^3.2.4", "katex": "^0.16.9", "khroma": "^2.1.0", "lodash-es": "^4.17.21", "marked": "^15.0.7", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0" } }, "sha512-PE8hGUy1LDlWIHWBP05SFdqUHGmRcCcK4IzpOKPE35eOw+G9zZgcnMpyunJVUEOgb//KBORPjysKndw8bFLuRg=="], "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], @@ -4401,9 +4424,9 @@ "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@1.0.5", "", { "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ=="], - "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ=="], + "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="], - "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.1", "", { "dependencies": { "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg=="], + "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="], "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="], @@ -4415,7 +4438,7 @@ "micromark-factory-label": ["micromark-factory-label@1.1.0", "", { "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w=="], - "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw=="], + "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="], "micromark-factory-space": ["micromark-factory-space@1.1.0", "", { "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ=="], @@ -4437,7 +4460,7 @@ "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], - "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.2", "", { "dependencies": { "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA=="], + "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="], "micromark-util-html-tag-name": ["micromark-util-html-tag-name@1.2.0", "", {}, "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q=="], @@ -4679,7 +4702,7 @@ "open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], - "openai": ["openai@4.89.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" }, "peerDependencies": { "ws": "^8.18.0", "zod": "^3.23.8" }, "optionalPeers": ["ws", "zod"], "bin": { "openai": "bin/cli" } }, "sha512-XNI0q2l8/Os6jmojxaID5EhyQjxZgzR2gWcpEjYWK5hGKwE7AcifxEY7UNwFDDHJQXqeiosQ0CJwQN+rvnwdjA=="], + "openai": ["openai@4.89.1", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" }, "peerDependencies": { "ws": "^8.18.0", "zod": "^3.23.8" }, "optionalPeers": ["ws", "zod"], "bin": { "openai": "bin/cli" } }, "sha512-k6t7WfnodIctPo40/9sy7Ww4VypnfkKi/urO2VQx4trCIwgzeroO1jkaCL2f5MyTS1H3HT9X+M2qLsc7NSXwTw=="], "openapi-to-postmanv2": ["openapi-to-postmanv2@4.25.0", "", { "dependencies": { "ajv": "8.11.0", "ajv-draft-04": "1.0.0", "ajv-formats": "2.1.1", "async": "3.2.4", "commander": "2.20.3", "graphlib": "2.1.8", "js-yaml": "4.1.0", "json-pointer": "0.6.2", "json-schema-merge-allof": "0.8.1", "lodash": "4.17.21", "neotraverse": "0.6.15", "oas-resolver-browser": "2.5.6", "object-hash": "3.0.0", "path-browserify": "1.0.1", "postman-collection": "^4.4.0", "swagger2openapi": "7.0.8", "yaml": "1.10.2" }, "bin": { "openapi2postmanv2": "bin/openapi2postmanv2.js" } }, "sha512-sIymbkQby0gzxt2Yez8YKB6hoISEel05XwGwNrAhr6+vxJWXNxkmssQc/8UEtVkuJ9ZfUXLkip9PYACIpfPDWg=="], @@ -4745,6 +4768,8 @@ "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-cache-control": ["parse-cache-control@1.0.1", "", {}, "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg=="], + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], @@ -5319,7 +5344,7 @@ "rpc-websockets": ["rpc-websockets@9.1.1", "", { "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", "@types/ws": "^8.2.2", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA=="], - "rspack-resolver": ["rspack-resolver@1.2.2", "", { "optionalDependencies": { "@unrs/rspack-resolver-binding-darwin-arm64": "1.2.2", "@unrs/rspack-resolver-binding-darwin-x64": "1.2.2", "@unrs/rspack-resolver-binding-freebsd-x64": "1.2.2", "@unrs/rspack-resolver-binding-linux-arm-gnueabihf": "1.2.2", "@unrs/rspack-resolver-binding-linux-arm64-gnu": "1.2.2", "@unrs/rspack-resolver-binding-linux-arm64-musl": "1.2.2", "@unrs/rspack-resolver-binding-linux-x64-gnu": "1.2.2", "@unrs/rspack-resolver-binding-linux-x64-musl": "1.2.2", "@unrs/rspack-resolver-binding-wasm32-wasi": "1.2.2", "@unrs/rspack-resolver-binding-win32-arm64-msvc": "1.2.2", "@unrs/rspack-resolver-binding-win32-x64-msvc": "1.2.2" } }, "sha512-Fwc19jMBA3g+fxDJH2B4WxwZjE0VaaOL7OX/A4Wn5Zv7bOD/vyPZhzXfaO73Xc2GAlfi96g5fGUa378WbIGfFw=="], + "rspack-resolver": ["rspack-resolver@1.3.0", "", { "optionalDependencies": { "@unrs/rspack-resolver-binding-darwin-arm64": "1.3.0", "@unrs/rspack-resolver-binding-darwin-x64": "1.3.0", "@unrs/rspack-resolver-binding-freebsd-x64": "1.3.0", "@unrs/rspack-resolver-binding-linux-arm-gnueabihf": "1.3.0", "@unrs/rspack-resolver-binding-linux-arm-musleabihf": "1.3.0", "@unrs/rspack-resolver-binding-linux-arm64-gnu": "1.3.0", "@unrs/rspack-resolver-binding-linux-arm64-musl": "1.3.0", "@unrs/rspack-resolver-binding-linux-ppc64-gnu": "1.3.0", "@unrs/rspack-resolver-binding-linux-s390x-gnu": "1.3.0", "@unrs/rspack-resolver-binding-linux-x64-gnu": "1.3.0", "@unrs/rspack-resolver-binding-linux-x64-musl": "1.3.0", "@unrs/rspack-resolver-binding-wasm32-wasi": "1.3.0", "@unrs/rspack-resolver-binding-win32-arm64-msvc": "1.3.0", "@unrs/rspack-resolver-binding-win32-ia32-msvc": "1.3.0", "@unrs/rspack-resolver-binding-win32-x64-msvc": "1.3.0" } }, "sha512-az/PLDwa1xijNv4bAFBS8mtqqJC1Y3lVyFag4cuyIUOHq/ft5kSZlHbqYaLZLpsQtPWv4ZGDo5ycySKJzUvU/A=="], "rtlcss": ["rtlcss@4.3.0", "", { "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0", "postcss": "^8.4.21", "strip-json-comments": "^3.1.1" }, "bin": { "rtlcss": "bin/rtlcss.js" } }, "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig=="], @@ -5759,7 +5784,7 @@ "tweetnacl": ["tweetnacl@0.14.5", "", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="], - "twitter-api-v2": ["twitter-api-v2@1.21.0", "", {}, "sha512-KbSdpZ7REO42TdOaDxgKnfMxESV4lmJITqXij4ykf71u8vrFj3RzrMWcSXERIA3wrdk3705YzafFbG6Dy8y2UQ=="], + "twitter-api-v2": ["twitter-api-v2@1.22.0", "", {}, "sha512-KlcRL9vcBzjeS/PwxX33NziP+SHp9n35DOclKtpOmnNes7nNVnK7WG4pKlHfBqGrY5kAz/8J5ERS8DWkYOaiWw=="], "tx2": ["tx2@1.0.5", "", { "dependencies": { "json-stringify-safe": "^5.0.1" } }, "sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg=="], @@ -5791,7 +5816,7 @@ "typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="], - "typescript-eslint": ["typescript-eslint@8.27.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.27.0", "@typescript-eslint/parser": "8.27.0", "@typescript-eslint/utils": "8.27.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-ZZ/8+Y0rRUMuW1gJaPtLWe4ryHbsPLzzibk5Sq+IFa2aOH1Vo0gPr1fbA6pOnzBke7zC2Da4w8AyCgxKXo3lqA=="], + "typescript-eslint": ["typescript-eslint@8.28.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.28.0", "@typescript-eslint/parser": "8.28.0", "@typescript-eslint/utils": "8.28.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-jfZtxJoHm59bvoCMYCe2BM0/baMswRhMmYhy+w6VfcyHrjxZ0OJe0tGasydCpIpA+A/WIJhTyZfb3EtwNC/kHQ=="], "uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="], @@ -6065,13 +6090,13 @@ "zwitch": ["zwitch@1.0.5", "", {}, "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw=="], - "@ai-sdk/react/@ai-sdk/ui-utils": ["@ai-sdk/ui-utils@1.2.0", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "@ai-sdk/provider-utils": "2.2.0", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-0IZwCqe7E+GkCASTDPAbzMr+POm9GDzWvFd37FvzpOeKNeibmge/LZEkTDbGSa+3b928H8wPwOLsOXBWPLUPDQ=="], + "@ai-sdk/react/@ai-sdk/ui-utils": ["@ai-sdk/ui-utils@1.2.1", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "@ai-sdk/provider-utils": "2.2.1", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-BzvMbYm7LHBlbWuLlcG1jQh4eu14MGpz7L+wrGO1+F4oQ+O0fAjgUSNwPWGlZpKmg4NrcVq/QLmxiVJrx2R4Ew=="], "@ai-sdk/ui-utils/@ai-sdk/provider": ["@ai-sdk/provider@1.0.7", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-q1PJEZ0qD9rVR+8JFEd01/QM++csMT5UVwYXSN2u54BrVw/D8TZLTeg2FEfKK00DgAx0UtWd8XOhhwITP9BT5g=="], "@ai-sdk/ui-utils/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.1.6", "", { "dependencies": { "@ai-sdk/provider": "1.0.7", "eventsource-parser": "^3.0.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-Pfyaj0QZS22qyVn5Iz7IXcJ8nKIKlu2MeSAdKJzTwkAks7zdLaKVB+396Rqcp1bfQnxl7vaduQVMQiXUrgK8Gw=="], - "@anthropic-ai/sdk/@types/node": ["@types/node@18.19.81", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-7KO9oZ2//ivtSsryp0LQUqq79zyGXzwq1WqfywpC9ucjY7YyltMMmxWgtRFRKCxwa7VPxVBVy4kHf5UC1E8Lug=="], + "@anthropic-ai/sdk/@types/node": ["@types/node@18.19.83", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-D69JeR5SfFS5H6FLbUaS0vE4r1dGhmMBbG4Ed6BNS4wkDK8GZjsdCShT5LCN59vOHEUHnFCY9J4aclXlIphMkA=="], "@anthropic-ai/sdk/formdata-node": ["formdata-node@4.4.1", "", { "dependencies": { "node-domexception": "1.0.0", "web-streams-polyfill": "4.0.0-beta.3" } }, "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ=="], @@ -6115,6 +6140,8 @@ "@csstools/selector-specificity/postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], + "@derhuerst/http-basic/concat-stream": ["concat-stream@2.0.0", "", { "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.0.2", "typedarray": "^0.0.6" } }, "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A=="], + "@discordjs/builders/@discordjs/formatters": ["@discordjs/formatters@0.6.0", "", { "dependencies": { "discord-api-types": "^0.37.114" } }, "sha512-YIruKw4UILt/ivO4uISmrGq2GdMY6EkoTtD0oS0GvkJFRZbTSdPhzYiUILbJ/QslsvC9H9nTgGgnarnIl4jMfw=="], "@discordjs/builders/discord-api-types": ["discord-api-types@0.37.119", "", {}, "sha512-WasbGFXEB+VQWXlo6IpW3oUv73Yuau1Ig4AZF/m13tXcTKnMpc/mHjpztIlz4+BM9FG9BHQkEXiPto3bKduQUg=="], @@ -6163,13 +6190,13 @@ "@docusaurus/types/commander": ["commander@5.1.0", "", {}, "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="], - "@elizaos/app/vite": ["vite@6.2.2", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ=="], + "@elizaos/app/vite": ["vite@6.2.3", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg=="], - "@elizaos/autodoc/@types/node": ["@types/node@20.17.25", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-bT+r2haIlplJUYtlZrEanFHdPIZTeiMeh/fSOEbOOfWf9uTn+lg8g0KU6Q3iMgjd9FLuuMAgfCNSkjUbxL6E3Q=="], + "@elizaos/autodoc/@types/node": ["@types/node@20.17.27", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-U58sbKhDrthHlxHRJw7ZLiLDZGmAUOZUbpw0S6nL27sYUdhvgBLCRu/keSd6qcTsfArd1sRFCCBxzWATGr/0UA=="], - "@elizaos/cli/@types/node": ["@types/node@20.17.25", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-bT+r2haIlplJUYtlZrEanFHdPIZTeiMeh/fSOEbOOfWf9uTn+lg8g0KU6Q3iMgjd9FLuuMAgfCNSkjUbxL6E3Q=="], + "@elizaos/cli/@types/node": ["@types/node@20.17.27", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-U58sbKhDrthHlxHRJw7ZLiLDZGmAUOZUbpw0S6nL27sYUdhvgBLCRu/keSd6qcTsfArd1sRFCCBxzWATGr/0UA=="], - "@elizaos/client/vite": ["vite@6.2.2", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ=="], + "@elizaos/client/vite": ["vite@6.2.3", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg=="], "@elizaos/core/@eslint/js": ["@eslint/js@9.16.0", "", {}, "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg=="], @@ -6209,7 +6236,7 @@ "@elizaos/plugin-storage-s3/glob": ["glob@11.0.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^4.0.1", "minimatch": "^10.0.0", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g=="], - "@elizaos/plugin-tee/@types/node": ["@types/node@20.17.25", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-bT+r2haIlplJUYtlZrEanFHdPIZTeiMeh/fSOEbOOfWf9uTn+lg8g0KU6Q3iMgjd9FLuuMAgfCNSkjUbxL6E3Q=="], + "@elizaos/plugin-tee/@types/node": ["@types/node@20.17.27", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-U58sbKhDrthHlxHRJw7ZLiLDZGmAUOZUbpw0S6nL27sYUdhvgBLCRu/keSd6qcTsfArd1sRFCCBxzWATGr/0UA=="], "@elizaos/plugin-twitter/@vitest/coverage-v8": ["@vitest/coverage-v8@1.1.3", "", { "dependencies": { "@ampproject/remapping": "^2.2.1", "@bcoe/v8-coverage": "^0.2.3", "debug": "^4.3.4", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-lib-source-maps": "^4.0.1", "istanbul-reports": "^3.1.6", "magic-string": "^0.30.5", "magicast": "^0.3.2", "picocolors": "^1.0.0", "std-env": "^3.5.0", "test-exclude": "^6.0.0", "v8-to-istanbul": "^9.2.0" }, "peerDependencies": { "vitest": "^1.0.0" } }, "sha512-Uput7t3eIcbSTOTQBzGtS+0kah96bX+szW9qQrLeGe3UmgL2Akn8POnyC2lH7XsnREZOds9aCUTxgXf+4HX5RA=="], @@ -6221,7 +6248,7 @@ "@elizaos/plugin-video-understanding/glob": ["glob@11.0.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^4.0.1", "minimatch": "^10.0.0", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g=="], - "@elizaos/the-org/@types/react": ["@types/react@18.3.19", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "sha512-fcdJqaHOMDbiAwJnXv6XCzX0jDW77yI3tJqYh1Byn8EL5/S628WRx9b/y3DnNe55zTukUQKrfYxiZls2dHcUMw=="], + "@elizaos/the-org/@types/react": ["@types/react@18.3.20", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg=="], "@elizaos/the-org/@types/react-dom": ["@types/react-dom@18.3.5", "", { "peerDependencies": { "@types/react": "^18.0.0" } }, "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q=="], @@ -6229,7 +6256,7 @@ "@elizaos/the-org/typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="], - "@elizaos/the-org/vite": ["vite@6.2.2", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ=="], + "@elizaos/the-org/vite": ["vite@6.2.3", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg=="], "@elizaos/the-org/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], @@ -6245,8 +6272,6 @@ "@eslint/eslintrc/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - "@huggingface/inference/@huggingface/tasks": ["@huggingface/tasks@0.17.9", "", {}, "sha512-lV6RgCJkqy3p93FFxP9H4SGJmFcHAwr1FO+Zk56q/JWsf7Tdsel1DEo1Xfd3An7ZPWpc2Y9ldRecGo9efDYghg=="], - "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], @@ -6399,7 +6424,7 @@ "@yarnpkg/parsers/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], - "ai/@ai-sdk/ui-utils": ["@ai-sdk/ui-utils@1.2.0", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "@ai-sdk/provider-utils": "2.2.0", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-0IZwCqe7E+GkCASTDPAbzMr+POm9GDzWvFd37FvzpOeKNeibmge/LZEkTDbGSa+3b928H8wPwOLsOXBWPLUPDQ=="], + "ai/@ai-sdk/ui-utils": ["@ai-sdk/ui-utils@1.2.1", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "@ai-sdk/provider-utils": "2.2.1", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-BzvMbYm7LHBlbWuLlcG1jQh4eu14MGpz7L+wrGO1+F4oQ+O0fAjgUSNwPWGlZpKmg4NrcVq/QLmxiVJrx2R4Ew=="], "ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], @@ -6505,7 +6530,7 @@ "decamelize-keys/map-obj": ["map-obj@1.0.1", "", {}, "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg=="], - "default-gateway/execa": ["execa@5.0.0", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ=="], + "default-gateway/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], "degenerator/ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="], @@ -6601,6 +6626,8 @@ "fastembed/onnxruntime-node": ["onnxruntime-node@1.15.1", "", { "dependencies": { "onnxruntime-common": "~1.15.1" }, "os": [ "linux", "win32", "darwin", ] }, "sha512-wzhVELulmrvNoMZw0/HfV+9iwgHX+kPS82nxodZ37WCXmbeo1jp3thamTsNg8MGhxvv4GmEzRum5mo40oqIsqw=="], + "ffmpeg-static/https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], + "figures/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], "file-loader/loader-utils": ["loader-utils@2.0.4", "", { "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^2.1.2" } }, "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw=="], @@ -6635,6 +6662,8 @@ "gauge/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "gel/env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="], + "gel/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], "get-pkg-repo/hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], @@ -6727,6 +6756,8 @@ "http-proxy-middleware/is-plain-obj": ["is-plain-obj@3.0.0", "", {}, "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA=="], + "http-response-object/@types/node": ["@types/node@10.17.60", "", {}, "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="], + "http2-wrapper/quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], "ignore-walk/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], @@ -7049,8 +7080,6 @@ "node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], - "node-gyp/env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], - "node-gyp/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], "node-gyp/make-fetch-happen": ["make-fetch-happen@13.0.1", "", { "dependencies": { "@npmcli/agent": "^2.0.0", "cacache": "^18.0.0", "http-cache-semantics": "^4.1.1", "is-lambda": "^1.0.1", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "proc-log": "^4.2.0", "promise-retry": "^2.0.1", "ssri": "^10.0.0" } }, "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA=="], @@ -7121,7 +7150,7 @@ "onnxruntime-web/onnxruntime-common": ["onnxruntime-common@1.22.0-dev.20250306-aafa8d170a", "", {}, "sha512-NfIQnW4lIk/8LnhnYqknYPeet0U0+AADgKQRlKex36QrNoVSCY+aNaX6wyy2VzQ4CNWxsYh0E203ajRD/zxn0g=="], - "openai/@types/node": ["@types/node@18.19.81", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-7KO9oZ2//ivtSsryp0LQUqq79zyGXzwq1WqfywpC9ucjY7YyltMMmxWgtRFRKCxwa7VPxVBVy4kHf5UC1E8Lug=="], + "openai/@types/node": ["@types/node@18.19.83", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-D69JeR5SfFS5H6FLbUaS0vE4r1dGhmMBbG4Ed6BNS4wkDK8GZjsdCShT5LCN59vOHEUHnFCY9J4aclXlIphMkA=="], "openai/formdata-node": ["formdata-node@4.4.1", "", { "dependencies": { "node-domexception": "1.0.0", "web-streams-polyfill": "4.0.0-beta.3" } }, "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ=="], @@ -7179,7 +7208,7 @@ "patchright/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], - "path-scurry/lru-cache": ["lru-cache@11.0.2", "", {}, "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA=="], + "path-scurry/lru-cache": ["lru-cache@11.1.0", "", {}, "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A=="], "pg/pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], @@ -7487,15 +7516,15 @@ "ts-node/diff": ["diff@4.0.2", "", {}, "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="], - "tsup/rollup": ["rollup@4.36.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.36.0", "@rollup/rollup-android-arm64": "4.36.0", "@rollup/rollup-darwin-arm64": "4.36.0", "@rollup/rollup-darwin-x64": "4.36.0", "@rollup/rollup-freebsd-arm64": "4.36.0", "@rollup/rollup-freebsd-x64": "4.36.0", "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", "@rollup/rollup-linux-arm-musleabihf": "4.36.0", "@rollup/rollup-linux-arm64-gnu": "4.36.0", "@rollup/rollup-linux-arm64-musl": "4.36.0", "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", "@rollup/rollup-linux-riscv64-gnu": "4.36.0", "@rollup/rollup-linux-s390x-gnu": "4.36.0", "@rollup/rollup-linux-x64-gnu": "4.36.0", "@rollup/rollup-linux-x64-musl": "4.36.0", "@rollup/rollup-win32-arm64-msvc": "4.36.0", "@rollup/rollup-win32-ia32-msvc": "4.36.0", "@rollup/rollup-win32-x64-msvc": "4.36.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q=="], + "tsup/rollup": ["rollup@4.37.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.37.0", "@rollup/rollup-android-arm64": "4.37.0", "@rollup/rollup-darwin-arm64": "4.37.0", "@rollup/rollup-darwin-x64": "4.37.0", "@rollup/rollup-freebsd-arm64": "4.37.0", "@rollup/rollup-freebsd-x64": "4.37.0", "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", "@rollup/rollup-linux-arm-musleabihf": "4.37.0", "@rollup/rollup-linux-arm64-gnu": "4.37.0", "@rollup/rollup-linux-arm64-musl": "4.37.0", "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-musl": "4.37.0", "@rollup/rollup-linux-s390x-gnu": "4.37.0", "@rollup/rollup-linux-x64-gnu": "4.37.0", "@rollup/rollup-linux-x64-musl": "4.37.0", "@rollup/rollup-win32-arm64-msvc": "4.37.0", "@rollup/rollup-win32-ia32-msvc": "4.37.0", "@rollup/rollup-win32-x64-msvc": "4.37.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg=="], "typedoc/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "typescript-eslint/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.27.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.27.0", "@typescript-eslint/type-utils": "8.27.0", "@typescript-eslint/utils": "8.27.0", "@typescript-eslint/visitor-keys": "8.27.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-4henw4zkePi5p252c8ncBLzLce52SEUz2Ebj8faDnuUXz2UuHEONYcJ+G0oaCF+bYCWVZtrGzq3FD7YXetmnSA=="], + "typescript-eslint/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.28.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.28.0", "@typescript-eslint/type-utils": "8.28.0", "@typescript-eslint/utils": "8.28.0", "@typescript-eslint/visitor-keys": "8.28.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-lvFK3TCGAHsItNdWZ/1FkvpzCxTHUVuFrdnOGLMa0GGCFIbCgQWVk3CzCGdA7kM3qGVc+dfW9tr0Z/sHnGDFyg=="], - "typescript-eslint/@typescript-eslint/parser": ["@typescript-eslint/parser@8.27.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.27.0", "@typescript-eslint/types": "8.27.0", "@typescript-eslint/typescript-estree": "8.27.0", "@typescript-eslint/visitor-keys": "8.27.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-XGwIabPallYipmcOk45DpsBSgLC64A0yvdAkrwEzwZ2viqGqRUJ8eEYoPz0CWnutgAFbNMPdsGGvzjSmcWVlEA=="], + "typescript-eslint/@typescript-eslint/parser": ["@typescript-eslint/parser@8.28.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.28.0", "@typescript-eslint/types": "8.28.0", "@typescript-eslint/typescript-estree": "8.28.0", "@typescript-eslint/visitor-keys": "8.28.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-LPcw1yHD3ToaDEoljFEfQ9j2xShY367h7FZ1sq5NJT9I3yj4LHer1Xd1yRSOdYy9BpsrxU7R+eoDokChYM53lQ=="], - "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@8.27.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.27.0", "@typescript-eslint/types": "8.27.0", "@typescript-eslint/typescript-estree": "8.27.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-njkodcwH1yvmo31YWgRHNb/x1Xhhq4/m81PhtvmRngD8iHPehxffz1SNCO+kwaePhATC+kOa/ggmvPoPza5i0Q=="], + "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@8.28.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.28.0", "@typescript-eslint/types": "8.28.0", "@typescript-eslint/typescript-estree": "8.28.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ=="], "unified/vfile": ["vfile@4.2.1", "", { "dependencies": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", "unist-util-stringify-position": "^2.0.0", "vfile-message": "^2.0.0" } }, "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA=="], @@ -7521,13 +7550,13 @@ "vite/esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], - "vite/rollup": ["rollup@4.36.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.36.0", "@rollup/rollup-android-arm64": "4.36.0", "@rollup/rollup-darwin-arm64": "4.36.0", "@rollup/rollup-darwin-x64": "4.36.0", "@rollup/rollup-freebsd-arm64": "4.36.0", "@rollup/rollup-freebsd-x64": "4.36.0", "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", "@rollup/rollup-linux-arm-musleabihf": "4.36.0", "@rollup/rollup-linux-arm64-gnu": "4.36.0", "@rollup/rollup-linux-arm64-musl": "4.36.0", "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", "@rollup/rollup-linux-riscv64-gnu": "4.36.0", "@rollup/rollup-linux-s390x-gnu": "4.36.0", "@rollup/rollup-linux-x64-gnu": "4.36.0", "@rollup/rollup-linux-x64-musl": "4.36.0", "@rollup/rollup-win32-arm64-msvc": "4.36.0", "@rollup/rollup-win32-ia32-msvc": "4.36.0", "@rollup/rollup-win32-x64-msvc": "4.36.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q=="], + "vite/rollup": ["rollup@4.37.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.37.0", "@rollup/rollup-android-arm64": "4.37.0", "@rollup/rollup-darwin-arm64": "4.37.0", "@rollup/rollup-darwin-x64": "4.37.0", "@rollup/rollup-freebsd-arm64": "4.37.0", "@rollup/rollup-freebsd-x64": "4.37.0", "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", "@rollup/rollup-linux-arm-musleabihf": "4.37.0", "@rollup/rollup-linux-arm64-gnu": "4.37.0", "@rollup/rollup-linux-arm64-musl": "4.37.0", "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-musl": "4.37.0", "@rollup/rollup-linux-s390x-gnu": "4.37.0", "@rollup/rollup-linux-x64-gnu": "4.37.0", "@rollup/rollup-linux-x64-musl": "4.37.0", "@rollup/rollup-win32-arm64-msvc": "4.37.0", "@rollup/rollup-win32-ia32-msvc": "4.37.0", "@rollup/rollup-win32-x64-msvc": "4.37.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg=="], - "vite-node/vite": ["vite@6.2.2", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ=="], + "vite-node/vite": ["vite@6.2.3", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg=="], "vite-plugin-compression/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], - "vitest/vite": ["vite@6.2.2", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ=="], + "vitest/vite": ["vite@6.2.3", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg=="], "vizion/async": ["async@2.6.4", "", { "dependencies": { "lodash": "^4.17.14" } }, "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA=="], @@ -7611,13 +7640,13 @@ "@docusaurus/theme-classic/react-router-dom/react-router": ["react-router@5.3.4", "", { "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", "hoist-non-react-statics": "^3.1.0", "loose-envify": "^1.3.1", "path-to-regexp": "^1.7.0", "prop-types": "^15.6.2", "react-is": "^16.6.0", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" }, "peerDependencies": { "react": ">=15" } }, "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA=="], - "@elizaos/app/vite/rollup": ["rollup@4.36.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.36.0", "@rollup/rollup-android-arm64": "4.36.0", "@rollup/rollup-darwin-arm64": "4.36.0", "@rollup/rollup-darwin-x64": "4.36.0", "@rollup/rollup-freebsd-arm64": "4.36.0", "@rollup/rollup-freebsd-x64": "4.36.0", "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", "@rollup/rollup-linux-arm-musleabihf": "4.36.0", "@rollup/rollup-linux-arm64-gnu": "4.36.0", "@rollup/rollup-linux-arm64-musl": "4.36.0", "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", "@rollup/rollup-linux-riscv64-gnu": "4.36.0", "@rollup/rollup-linux-s390x-gnu": "4.36.0", "@rollup/rollup-linux-x64-gnu": "4.36.0", "@rollup/rollup-linux-x64-musl": "4.36.0", "@rollup/rollup-win32-arm64-msvc": "4.36.0", "@rollup/rollup-win32-ia32-msvc": "4.36.0", "@rollup/rollup-win32-x64-msvc": "4.36.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q=="], + "@elizaos/app/vite/rollup": ["rollup@4.37.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.37.0", "@rollup/rollup-android-arm64": "4.37.0", "@rollup/rollup-darwin-arm64": "4.37.0", "@rollup/rollup-darwin-x64": "4.37.0", "@rollup/rollup-freebsd-arm64": "4.37.0", "@rollup/rollup-freebsd-x64": "4.37.0", "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", "@rollup/rollup-linux-arm-musleabihf": "4.37.0", "@rollup/rollup-linux-arm64-gnu": "4.37.0", "@rollup/rollup-linux-arm64-musl": "4.37.0", "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-musl": "4.37.0", "@rollup/rollup-linux-s390x-gnu": "4.37.0", "@rollup/rollup-linux-x64-gnu": "4.37.0", "@rollup/rollup-linux-x64-musl": "4.37.0", "@rollup/rollup-win32-arm64-msvc": "4.37.0", "@rollup/rollup-win32-ia32-msvc": "4.37.0", "@rollup/rollup-win32-x64-msvc": "4.37.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg=="], "@elizaos/autodoc/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], "@elizaos/cli/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], - "@elizaos/client/vite/rollup": ["rollup@4.36.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.36.0", "@rollup/rollup-android-arm64": "4.36.0", "@rollup/rollup-darwin-arm64": "4.36.0", "@rollup/rollup-darwin-x64": "4.36.0", "@rollup/rollup-freebsd-arm64": "4.36.0", "@rollup/rollup-freebsd-x64": "4.36.0", "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", "@rollup/rollup-linux-arm-musleabihf": "4.36.0", "@rollup/rollup-linux-arm64-gnu": "4.36.0", "@rollup/rollup-linux-arm64-musl": "4.36.0", "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", "@rollup/rollup-linux-riscv64-gnu": "4.36.0", "@rollup/rollup-linux-s390x-gnu": "4.36.0", "@rollup/rollup-linux-x64-gnu": "4.36.0", "@rollup/rollup-linux-x64-musl": "4.36.0", "@rollup/rollup-win32-arm64-msvc": "4.36.0", "@rollup/rollup-win32-ia32-msvc": "4.36.0", "@rollup/rollup-win32-x64-msvc": "4.36.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q=="], + "@elizaos/client/vite/rollup": ["rollup@4.37.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.37.0", "@rollup/rollup-android-arm64": "4.37.0", "@rollup/rollup-darwin-arm64": "4.37.0", "@rollup/rollup-darwin-x64": "4.37.0", "@rollup/rollup-freebsd-arm64": "4.37.0", "@rollup/rollup-freebsd-x64": "4.37.0", "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", "@rollup/rollup-linux-arm-musleabihf": "4.37.0", "@rollup/rollup-linux-arm64-gnu": "4.37.0", "@rollup/rollup-linux-arm64-musl": "4.37.0", "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-musl": "4.37.0", "@rollup/rollup-linux-s390x-gnu": "4.37.0", "@rollup/rollup-linux-x64-gnu": "4.37.0", "@rollup/rollup-linux-x64-musl": "4.37.0", "@rollup/rollup-win32-arm64-msvc": "4.37.0", "@rollup/rollup-win32-ia32-msvc": "4.37.0", "@rollup/rollup-win32-x64-msvc": "4.37.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg=="], "@elizaos/core/glob/minimatch": ["minimatch@10.0.1", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ=="], @@ -7637,7 +7666,7 @@ "@elizaos/plugin-evm/tsup/esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], - "@elizaos/plugin-evm/tsup/rollup": ["rollup@4.36.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.36.0", "@rollup/rollup-android-arm64": "4.36.0", "@rollup/rollup-darwin-arm64": "4.36.0", "@rollup/rollup-darwin-x64": "4.36.0", "@rollup/rollup-freebsd-arm64": "4.36.0", "@rollup/rollup-freebsd-x64": "4.36.0", "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", "@rollup/rollup-linux-arm-musleabihf": "4.36.0", "@rollup/rollup-linux-arm64-gnu": "4.36.0", "@rollup/rollup-linux-arm64-musl": "4.36.0", "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", "@rollup/rollup-linux-riscv64-gnu": "4.36.0", "@rollup/rollup-linux-s390x-gnu": "4.36.0", "@rollup/rollup-linux-x64-gnu": "4.36.0", "@rollup/rollup-linux-x64-musl": "4.36.0", "@rollup/rollup-win32-arm64-msvc": "4.36.0", "@rollup/rollup-win32-ia32-msvc": "4.36.0", "@rollup/rollup-win32-x64-msvc": "4.36.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q=="], + "@elizaos/plugin-evm/tsup/rollup": ["rollup@4.37.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.37.0", "@rollup/rollup-android-arm64": "4.37.0", "@rollup/rollup-darwin-arm64": "4.37.0", "@rollup/rollup-darwin-x64": "4.37.0", "@rollup/rollup-freebsd-arm64": "4.37.0", "@rollup/rollup-freebsd-x64": "4.37.0", "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", "@rollup/rollup-linux-arm-musleabihf": "4.37.0", "@rollup/rollup-linux-arm64-gnu": "4.37.0", "@rollup/rollup-linux-arm64-musl": "4.37.0", "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-musl": "4.37.0", "@rollup/rollup-linux-s390x-gnu": "4.37.0", "@rollup/rollup-linux-x64-gnu": "4.37.0", "@rollup/rollup-linux-x64-musl": "4.37.0", "@rollup/rollup-win32-arm64-msvc": "4.37.0", "@rollup/rollup-win32-ia32-msvc": "4.37.0", "@rollup/rollup-win32-x64-msvc": "4.37.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg=="], "@elizaos/plugin-local-ai/glob/minimatch": ["minimatch@10.0.1", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ=="], @@ -7665,7 +7694,7 @@ "@elizaos/plugin-video-understanding/glob/minimatch": ["minimatch@10.0.1", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ=="], - "@elizaos/the-org/vite/rollup": ["rollup@4.36.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.36.0", "@rollup/rollup-android-arm64": "4.36.0", "@rollup/rollup-darwin-arm64": "4.36.0", "@rollup/rollup-darwin-x64": "4.36.0", "@rollup/rollup-freebsd-arm64": "4.36.0", "@rollup/rollup-freebsd-x64": "4.36.0", "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", "@rollup/rollup-linux-arm-musleabihf": "4.36.0", "@rollup/rollup-linux-arm64-gnu": "4.36.0", "@rollup/rollup-linux-arm64-musl": "4.36.0", "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", "@rollup/rollup-linux-riscv64-gnu": "4.36.0", "@rollup/rollup-linux-s390x-gnu": "4.36.0", "@rollup/rollup-linux-x64-gnu": "4.36.0", "@rollup/rollup-linux-x64-musl": "4.36.0", "@rollup/rollup-win32-arm64-msvc": "4.36.0", "@rollup/rollup-win32-ia32-msvc": "4.36.0", "@rollup/rollup-win32-x64-msvc": "4.36.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q=="], + "@elizaos/the-org/vite/rollup": ["rollup@4.37.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.37.0", "@rollup/rollup-android-arm64": "4.37.0", "@rollup/rollup-darwin-arm64": "4.37.0", "@rollup/rollup-darwin-x64": "4.37.0", "@rollup/rollup-freebsd-arm64": "4.37.0", "@rollup/rollup-freebsd-x64": "4.37.0", "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", "@rollup/rollup-linux-arm-musleabihf": "4.37.0", "@rollup/rollup-linux-arm64-gnu": "4.37.0", "@rollup/rollup-linux-arm64-musl": "4.37.0", "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-musl": "4.37.0", "@rollup/rollup-linux-s390x-gnu": "4.37.0", "@rollup/rollup-linux-x64-gnu": "4.37.0", "@rollup/rollup-linux-x64-musl": "4.37.0", "@rollup/rollup-win32-arm64-msvc": "4.37.0", "@rollup/rollup-win32-ia32-msvc": "4.37.0", "@rollup/rollup-win32-x64-msvc": "4.37.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg=="], "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], @@ -7857,8 +7886,6 @@ "cytoscape-fcose/cose-base/layout-base": ["layout-base@2.0.1", "", {}, "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg=="], - "d3-sankey/d3-array/internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="], - "d3-sankey/d3-shape/d3-path": ["d3-path@1.0.9", "", {}, "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="], "debug-logfmt/pretty-ms/parse-ms": ["parse-ms@2.1.0", "", {}, "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA=="], @@ -7941,6 +7968,8 @@ "fastembed/onnxruntime-node/onnxruntime-common": ["onnxruntime-common@1.15.1", "", {}, "sha512-Y89eJ8QmaRsPZPWLaX7mfqhj63ny47rSkQe80hIo+lvBQdrdXYR9VO362xvZulk9DFkCnXmGidprvgJ07bKsIQ=="], + "ffmpeg-static/https-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], + "file-loader/schema-utils/ajv": ["ajv@6.12.6", "", { "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-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "file-loader/schema-utils/ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], @@ -8035,7 +8064,7 @@ "ipull/pretty-ms/parse-ms": ["parse-ms@3.0.0", "", {}, "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw=="], - "jayson/@types/ws/@types/node": ["@types/node@22.13.11", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-iEUCUJoU0i3VnrCmgoWCXttklWcvoCIx4jzcP22fioIVSdTmjgoEvmAO/QPw6TcS9k5FrNgn4w7q5lGOd1CT5g=="], + "jayson/@types/ws/@types/node": ["@types/node@22.13.13", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ=="], "lerna/@octokit/rest/@octokit/core": ["@octokit/core@4.2.4", "", { "dependencies": { "@octokit/auth-token": "^3.0.0", "@octokit/graphql": "^5.0.0", "@octokit/request": "^6.0.0", "@octokit/request-error": "^3.0.0", "@octokit/types": "^9.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" } }, "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ=="], @@ -8529,27 +8558,29 @@ "to-vfile/vfile/vfile-message": ["vfile-message@2.0.4", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^2.0.0" } }, "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ=="], + "tsup/rollup/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + "typedoc/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.27.0", "", { "dependencies": { "@typescript-eslint/types": "8.27.0", "@typescript-eslint/visitor-keys": "8.27.0" } }, "sha512-8oI9GwPMQmBryaaxG1tOZdxXVeMDte6NyJA4i7/TWa4fBwgnAXYlIQP+uYOeqAaLJ2JRxlG9CAyL+C+YE9Xknw=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.28.0", "", { "dependencies": { "@typescript-eslint/types": "8.28.0", "@typescript-eslint/visitor-keys": "8.28.0" } }, "sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.27.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.27.0", "@typescript-eslint/utils": "8.27.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-wVArTVcz1oJOIEJxui/nRhV0TXzD/zMSOYi/ggCfNq78EIszddXcJb7r4RCp/oBrjt8n9A0BSxRMKxHftpDxDA=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.28.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.28.0", "@typescript-eslint/utils": "8.28.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-oRoXu2v0Rsy/VoOGhtWrOKDiIehvI+YNrDk5Oqj40Mwm0Yt01FC/Q7nFqg088d3yAsR1ZcZFVfPCTTFCe/KPwg=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.27.0", "", { "dependencies": { "@typescript-eslint/types": "8.27.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-WsXQwMkILJvffP6z4U3FYJPlbf/j07HIxmDjZpbNvBJkMfvwXj5ACRkkHwBDvLBbDbtX5TdU64/rcvKJ/vuInQ=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.28.0", "", { "dependencies": { "@typescript-eslint/types": "8.28.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg=="], - "typescript-eslint/@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.27.0", "", { "dependencies": { "@typescript-eslint/types": "8.27.0", "@typescript-eslint/visitor-keys": "8.27.0" } }, "sha512-8oI9GwPMQmBryaaxG1tOZdxXVeMDte6NyJA4i7/TWa4fBwgnAXYlIQP+uYOeqAaLJ2JRxlG9CAyL+C+YE9Xknw=="], + "typescript-eslint/@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.28.0", "", { "dependencies": { "@typescript-eslint/types": "8.28.0", "@typescript-eslint/visitor-keys": "8.28.0" } }, "sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw=="], - "typescript-eslint/@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@8.27.0", "", {}, "sha512-/6cp9yL72yUHAYq9g6DsAU+vVfvQmd1a8KyA81uvfDE21O2DwQ/qxlM4AR8TSdAu+kJLBDrEHKC5/W2/nxsY0A=="], + "typescript-eslint/@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@8.28.0", "", {}, "sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA=="], - "typescript-eslint/@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.27.0", "", { "dependencies": { "@typescript-eslint/types": "8.27.0", "@typescript-eslint/visitor-keys": "8.27.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-BnKq8cqPVoMw71O38a1tEb6iebEgGA80icSxW7g+kndx0o6ot6696HjG7NdgfuAVmVEtwXUr3L8R9ZuVjoQL6A=="], + "typescript-eslint/@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.28.0", "", { "dependencies": { "@typescript-eslint/types": "8.28.0", "@typescript-eslint/visitor-keys": "8.28.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA=="], - "typescript-eslint/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.27.0", "", { "dependencies": { "@typescript-eslint/types": "8.27.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-WsXQwMkILJvffP6z4U3FYJPlbf/j07HIxmDjZpbNvBJkMfvwXj5ACRkkHwBDvLBbDbtX5TdU64/rcvKJ/vuInQ=="], + "typescript-eslint/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.28.0", "", { "dependencies": { "@typescript-eslint/types": "8.28.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg=="], - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.27.0", "", { "dependencies": { "@typescript-eslint/types": "8.27.0", "@typescript-eslint/visitor-keys": "8.27.0" } }, "sha512-8oI9GwPMQmBryaaxG1tOZdxXVeMDte6NyJA4i7/TWa4fBwgnAXYlIQP+uYOeqAaLJ2JRxlG9CAyL+C+YE9Xknw=="], + "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.28.0", "", { "dependencies": { "@typescript-eslint/types": "8.28.0", "@typescript-eslint/visitor-keys": "8.28.0" } }, "sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw=="], - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.27.0", "", {}, "sha512-/6cp9yL72yUHAYq9g6DsAU+vVfvQmd1a8KyA81uvfDE21O2DwQ/qxlM4AR8TSdAu+kJLBDrEHKC5/W2/nxsY0A=="], + "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.28.0", "", {}, "sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA=="], - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.27.0", "", { "dependencies": { "@typescript-eslint/types": "8.27.0", "@typescript-eslint/visitor-keys": "8.27.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-BnKq8cqPVoMw71O38a1tEb6iebEgGA80icSxW7g+kndx0o6ot6696HjG7NdgfuAVmVEtwXUr3L8R9ZuVjoQL6A=="], + "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.28.0", "", { "dependencies": { "@typescript-eslint/types": "8.28.0", "@typescript-eslint/visitor-keys": "8.28.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA=="], "unified/vfile/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], @@ -8569,7 +8600,7 @@ "url-loader/schema-utils/ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], - "vite-node/vite/rollup": ["rollup@4.36.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.36.0", "@rollup/rollup-android-arm64": "4.36.0", "@rollup/rollup-darwin-arm64": "4.36.0", "@rollup/rollup-darwin-x64": "4.36.0", "@rollup/rollup-freebsd-arm64": "4.36.0", "@rollup/rollup-freebsd-x64": "4.36.0", "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", "@rollup/rollup-linux-arm-musleabihf": "4.36.0", "@rollup/rollup-linux-arm64-gnu": "4.36.0", "@rollup/rollup-linux-arm64-musl": "4.36.0", "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", "@rollup/rollup-linux-riscv64-gnu": "4.36.0", "@rollup/rollup-linux-s390x-gnu": "4.36.0", "@rollup/rollup-linux-x64-gnu": "4.36.0", "@rollup/rollup-linux-x64-musl": "4.36.0", "@rollup/rollup-win32-arm64-msvc": "4.36.0", "@rollup/rollup-win32-ia32-msvc": "4.36.0", "@rollup/rollup-win32-x64-msvc": "4.36.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q=="], + "vite-node/vite/rollup": ["rollup@4.37.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.37.0", "@rollup/rollup-android-arm64": "4.37.0", "@rollup/rollup-darwin-arm64": "4.37.0", "@rollup/rollup-darwin-x64": "4.37.0", "@rollup/rollup-freebsd-arm64": "4.37.0", "@rollup/rollup-freebsd-x64": "4.37.0", "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", "@rollup/rollup-linux-arm-musleabihf": "4.37.0", "@rollup/rollup-linux-arm64-gnu": "4.37.0", "@rollup/rollup-linux-arm64-musl": "4.37.0", "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-musl": "4.37.0", "@rollup/rollup-linux-s390x-gnu": "4.37.0", "@rollup/rollup-linux-x64-gnu": "4.37.0", "@rollup/rollup-linux-x64-musl": "4.37.0", "@rollup/rollup-win32-arm64-msvc": "4.37.0", "@rollup/rollup-win32-ia32-msvc": "4.37.0", "@rollup/rollup-win32-x64-msvc": "4.37.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg=="], "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], @@ -8617,7 +8648,9 @@ "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], - "vitest/vite/rollup": ["rollup@4.36.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.36.0", "@rollup/rollup-android-arm64": "4.36.0", "@rollup/rollup-darwin-arm64": "4.36.0", "@rollup/rollup-darwin-x64": "4.36.0", "@rollup/rollup-freebsd-arm64": "4.36.0", "@rollup/rollup-freebsd-x64": "4.36.0", "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", "@rollup/rollup-linux-arm-musleabihf": "4.36.0", "@rollup/rollup-linux-arm64-gnu": "4.36.0", "@rollup/rollup-linux-arm64-musl": "4.36.0", "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", "@rollup/rollup-linux-riscv64-gnu": "4.36.0", "@rollup/rollup-linux-s390x-gnu": "4.36.0", "@rollup/rollup-linux-x64-gnu": "4.36.0", "@rollup/rollup-linux-x64-musl": "4.36.0", "@rollup/rollup-win32-arm64-msvc": "4.36.0", "@rollup/rollup-win32-ia32-msvc": "4.36.0", "@rollup/rollup-win32-x64-msvc": "4.36.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q=="], + "vite/rollup/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + + "vitest/vite/rollup": ["rollup@4.37.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.37.0", "@rollup/rollup-android-arm64": "4.37.0", "@rollup/rollup-darwin-arm64": "4.37.0", "@rollup/rollup-darwin-x64": "4.37.0", "@rollup/rollup-freebsd-arm64": "4.37.0", "@rollup/rollup-freebsd-x64": "4.37.0", "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", "@rollup/rollup-linux-arm-musleabihf": "4.37.0", "@rollup/rollup-linux-arm64-gnu": "4.37.0", "@rollup/rollup-linux-arm64-musl": "4.37.0", "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-musl": "4.37.0", "@rollup/rollup-linux-s390x-gnu": "4.37.0", "@rollup/rollup-linux-x64-gnu": "4.37.0", "@rollup/rollup-linux-x64-musl": "4.37.0", "@rollup/rollup-win32-arm64-msvc": "4.37.0", "@rollup/rollup-win32-ia32-msvc": "4.37.0", "@rollup/rollup-win32-x64-msvc": "4.37.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg=="], "webpack-dev-server/@types/express/@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.6", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A=="], @@ -8695,6 +8728,10 @@ "@docusaurus/theme-classic/react-router-dom/react-router/path-to-regexp": ["path-to-regexp@1.9.0", "", { "dependencies": { "isarray": "0.0.1" } }, "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g=="], + "@elizaos/app/vite/rollup/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + + "@elizaos/client/vite/rollup/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + "@elizaos/core/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], "@elizaos/core/lint-staged/execa/get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], @@ -8757,6 +8794,8 @@ "@elizaos/plugin-evm/tsup/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg=="], + "@elizaos/plugin-evm/tsup/rollup/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + "@elizaos/plugin-local-ai/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], "@elizaos/plugin-pdf/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], @@ -8779,6 +8818,8 @@ "@elizaos/plugin-video-understanding/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "@elizaos/the-org/vite/rollup/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + "@lerna/create/@octokit/rest/@octokit/core/@octokit/auth-token": ["@octokit/auth-token@3.0.4", "", {}, "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ=="], "@lerna/create/@octokit/rest/@octokit/core/@octokit/graphql": ["@octokit/graphql@5.0.6", "", { "dependencies": { "@octokit/request": "^6.0.0", "@octokit/types": "^9.0.0", "universal-user-agent": "^6.0.0" } }, "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw=="], @@ -9091,17 +9132,17 @@ "test-exclude/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.27.0", "", {}, "sha512-/6cp9yL72yUHAYq9g6DsAU+vVfvQmd1a8KyA81uvfDE21O2DwQ/qxlM4AR8TSdAu+kJLBDrEHKC5/W2/nxsY0A=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.28.0", "", {}, "sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.27.0", "", { "dependencies": { "@typescript-eslint/types": "8.27.0", "@typescript-eslint/visitor-keys": "8.27.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-BnKq8cqPVoMw71O38a1tEb6iebEgGA80icSxW7g+kndx0o6ot6696HjG7NdgfuAVmVEtwXUr3L8R9ZuVjoQL6A=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.28.0", "", { "dependencies": { "@typescript-eslint/types": "8.28.0", "@typescript-eslint/visitor-keys": "8.28.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.27.0", "", {}, "sha512-/6cp9yL72yUHAYq9g6DsAU+vVfvQmd1a8KyA81uvfDE21O2DwQ/qxlM4AR8TSdAu+kJLBDrEHKC5/W2/nxsY0A=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.28.0", "", {}, "sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA=="], "typescript-eslint/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.27.0", "", { "dependencies": { "@typescript-eslint/types": "8.27.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-WsXQwMkILJvffP6z4U3FYJPlbf/j07HIxmDjZpbNvBJkMfvwXj5ACRkkHwBDvLBbDbtX5TdU64/rcvKJ/vuInQ=="], + "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.28.0", "", { "dependencies": { "@typescript-eslint/types": "8.28.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg=="], - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.27.0", "", { "dependencies": { "@typescript-eslint/types": "8.27.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-WsXQwMkILJvffP6z4U3FYJPlbf/j07HIxmDjZpbNvBJkMfvwXj5ACRkkHwBDvLBbDbtX5TdU64/rcvKJ/vuInQ=="], + "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.28.0", "", { "dependencies": { "@typescript-eslint/types": "8.28.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg=="], "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], @@ -9109,6 +9150,10 @@ "url-loader/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "vite-node/vite/rollup/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + + "vitest/vite/rollup/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + "webpack-dev-server/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "webpack-dev-server/rimraf/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], @@ -9251,7 +9296,7 @@ "renderkid/css-select/domutils/dom-serializer/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@8.27.0", "", {}, "sha512-/6cp9yL72yUHAYq9g6DsAU+vVfvQmd1a8KyA81uvfDE21O2DwQ/qxlM4AR8TSdAu+kJLBDrEHKC5/W2/nxsY0A=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@8.28.0", "", {}, "sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], diff --git a/packages/cli/package.json b/packages/cli/package.json index e2944a58fe3..3ebb1f838cb 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -74,7 +74,9 @@ "type-fest": "^3.8.0", "typescript": "5.8.2", "vitest": "^1.3.1", - "yoctocolors": "^2.1.1" + "yoctocolors": "^2.1.1", + "@hapi/shot": "^6.0.1", + "@types/hapi": "^18.0.14" }, "gitHead": "9834bbd06128356b44b091f022fc2a2d024a875e", "dependencies": { @@ -85,6 +87,8 @@ "ffmpeg-static": "^5.2.0", "prism-media": "^1.3.5", "socket.io": "^4.8.1", - "zod": "3.24.2" + "zod": "3.24.2", + "@hapi/shot": "^6.0.1", + "@types/hapi": "^18.0.14" } } diff --git a/packages/cli/src/commands/start.ts b/packages/cli/src/commands/start.ts index b0768f36a19..a1e650cbf8d 100644 --- a/packages/cli/src/commands/start.ts +++ b/packages/cli/src/commands/start.ts @@ -44,69 +44,6 @@ function globalPlugin(name: string) { const { character: defaultElizaCharacter } = await import('../characters/eliza'); -import * as Sql from '@elizaos/plugin-sql'; -import * as Groq from '@elizaos/plugin-groq'; -import * as Discord from '@elizaos/plugin-discord'; -import * as Twitter from '@elizaos/plugin-twitter'; -import * as Telgram from '@elizaos/plugin-telegram'; - -const plugins = { - '@elizaos/plugin-sql': Sql, - ...(process.env.GROQ_API_KEY ? { '@elizaos/plugin-groq': Groq } : {}), - ...(process.env.DISCORD_API_TOKEN ? { '@elizaos/plugin-discord': Discord } : {}), - ...(process.env.TWITTER_USERNAME ? { '@elizaos/plugin-twitter': Twitter } : {}), - ...(process.env.TELEGRAM_BOT_TOKEN ? { '@elizaos/plugin-telegram': Telgram } : {}), -}; - -function globalPlugin(name: string) { - const plugin = plugins[name]; - return plugin; -} - -const { character: defaultElizaCharacter } = await import('../characters/eliza'); - -import * as Sql from '@elizaos/plugin-sql'; -import * as Groq from '@elizaos/plugin-groq'; -import * as Discord from '@elizaos/plugin-discord'; -import * as Twitter from '@elizaos/plugin-twitter'; -import * as Telgram from '@elizaos/plugin-telegram'; - -const plugins = { - '@elizaos/plugin-sql': Sql, - ...(process.env.GROQ_API_KEY ? { '@elizaos/plugin-groq': Groq } : {}), - ...(process.env.DISCORD_API_TOKEN ? { '@elizaos/plugin-discord': Discord } : {}), - ...(process.env.TWITTER_USERNAME ? { '@elizaos/plugin-twitter': Twitter } : {}), - ...(process.env.TELEGRAM_BOT_TOKEN ? { '@elizaos/plugin-telegram': Telgram } : {}), -}; - -function globalPlugin(name: string) { - const plugin = plugins[name]; - return plugin; -} - -const { character: defaultElizaCharacter } = await import('../characters/eliza'); - -import * as Sql from '@elizaos/plugin-sql'; -import * as Groq from '@elizaos/plugin-groq'; -import * as Discord from '@elizaos/plugin-discord'; -import * as Twitter from '@elizaos/plugin-twitter'; -import * as Telgram from '@elizaos/plugin-telegram'; - -const plugins = { - '@elizaos/plugin-sql': Sql, - ...(process.env.GROQ_API_KEY ? { '@elizaos/plugin-groq': Groq } : {}), - ...(process.env.DISCORD_API_TOKEN ? { '@elizaos/plugin-discord': Discord } : {}), - ...(process.env.TWITTER_USERNAME ? { '@elizaos/plugin-twitter': Twitter } : {}), - ...(process.env.TELEGRAM_BOT_TOKEN ? { '@elizaos/plugin-telegram': Telgram } : {}), -}; - -function globalPlugin(name: string) { - const plugin = plugins[name]; - return plugin; -} - -const { character: defaultElizaCharacter } = await import('../characters/eliza'); - const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json index 035494b4264..c6264bf0dbf 100644 --- a/packages/cli/tsconfig.json +++ b/packages/cli/tsconfig.json @@ -6,6 +6,7 @@ "module": "ESNext", "allowSyntheticDefaultImports": true, "target": "ESNext", + "typeRoots": ["./node_modules/@types"], "paths": { "@/*": ["*"], "@elizaos/core": ["../../core/src"],