From 04facd6a18527044fa094d35440a97c245480cba Mon Sep 17 00:00:00 2001 From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com> Date: Sun, 11 May 2025 12:39:13 +0530 Subject: [PATCH 01/26] feat: basic ai assistant setup and ui --- src/ace/commands.js | 8 + src/lib/commands.js | 5 + src/pages/aiAssistant/assistant.js | 204 ++++ src/pages/aiAssistant/assistant.module.scss | 1079 +++++++++++++++++++ src/pages/aiAssistant/index.js | 8 + 5 files changed, 1304 insertions(+) create mode 100644 src/pages/aiAssistant/assistant.js create mode 100644 src/pages/aiAssistant/assistant.module.scss create mode 100644 src/pages/aiAssistant/index.js diff --git a/src/ace/commands.js b/src/ace/commands.js index 516253d19..fd661c465 100644 --- a/src/ace/commands.js +++ b/src/ace/commands.js @@ -309,6 +309,14 @@ const commands = [ }, readOnly: true, }, + { + name: "openAiAssistant", + description: "AI Assistant", + exec() { + acode.exec("open", "ai_assistant"); + }, + readOnly: true, + }, { name: "openFileExplorer", description: "File Explorer", diff --git a/src/lib/commands.js b/src/lib/commands.js index 305eb35fc..a9d57b2e2 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -6,6 +6,7 @@ import select from "dialogs/select"; import fsOperation from "fileSystem"; import actions from "handlers/quickTools"; import recents from "lib/recents"; +import AiAssistant from "pages/aiAssistant"; import FileBrowser from "pages/fileBrowser"; import plugins from "pages/plugins"; import Problems from "pages/problems/problems"; @@ -187,6 +188,10 @@ export default { FileBrowser(); break; + case "ai_assistant": + AiAssistant(); + break; + default: return; } diff --git a/src/pages/aiAssistant/assistant.js b/src/pages/aiAssistant/assistant.js new file mode 100644 index 000000000..9c7465577 --- /dev/null +++ b/src/pages/aiAssistant/assistant.js @@ -0,0 +1,204 @@ +import EditorFile from "lib/editorFile"; +import styles from "./assistant.module.scss"; + +export default function openAIAssistantPage() { + const aiAssistantContainer = ( +
+ {/* Header */} +
+
+ +
+ +
+
+ +
+
+
+ + Ask +
+
+ Suggest approaches without writing code +
+
+
+
+ + Write +
+
+ Write and implement code +
+
+
+
+ + Custom +
+
+ Custom permissions and capabilities +
+
+
+
+ + Network Requests +
+ +
+
+
+ + Read Files +
+ +
+
+
+ + Write Files +
+ +
+
+
+ + Execute Commands +
+ +
+
+
+
+
+
+
+ +
+
+ + {/* Main content */} +
+ {/* Chat history sidebar */} +
+
+

CHAT HISTORY

+ +
+
+
+
+ +
+
File upload component
+
+
+
+ +
+
Authentication implementation
+
+
+
+ +
+
React state management
+
+
+
+ + {/* Messages area */} +
+
+ {/* Messages will be added here dynamically */} +
+
+
+ + {/* Input area */} +
+
+ +
+
+ + {/* + */} +
+
+ + +
+
+
+
+
+ ); + + const uri = "ai://assistant"; + + // Check if the tab is already open + const existingFile = editorManager.getFile(uri, "uri"); + + if (existingFile) { + existingFile.makeActive(); + return; + } + + // Create a new EditorFile instance for the AI Assistant tab + new EditorFile("AI Assistant", { + uri: uri, + type: "page", + tabIcon: "file file_type_assistant", + content: aiAssistantContainer, + render: true, + stylesheets: styles, + hideQuickTools: true, + }); + + console.log("Opened AI Assistant tab."); +} diff --git a/src/pages/aiAssistant/assistant.module.scss b/src/pages/aiAssistant/assistant.module.scss new file mode 100644 index 000000000..7a709ab4b --- /dev/null +++ b/src/pages/aiAssistant/assistant.module.scss @@ -0,0 +1,1079 @@ +:root { + --blue-primary: #2374e1; + --blue-secondary: #1a5fbf; + --blue-tertiary: #0e3a7c; + --blue-quaternary: #0a2c5e; + --red-primary: #e63e3e; + --green-primary: #4caf50; + --yellow-primary: #ffc107; + --purple-primary: #9c27b0; +} + +.chat-container { + display: flex; + flex-direction: column; + height: 100%; + max-width: 100%; + margin: 0 auto; + overflow: hidden; + line-height: 1.5; + + .chat-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.75rem 1rem; + border-bottom: 1px solid var(--border-color); + background-color: var(--popup-background-color); + + .header-left, + .header-right { + display: flex; + align-items: center; + gap: 0.75rem; + + .separator { + width: 1px; + height: 1rem; + background-color: var(--border-color); + } + } + } + + .chat-main { + display: flex; + flex: 1; + overflow: hidden; + position: relative; + + .chat-sidebar { + width: 240px; + border-right: 1px solid var(--border-color); + background-color: var(--popup-background-color); + display: flex; + flex-direction: column; + transition: transform 0.3s ease; + position: absolute; + top: 0; + bottom: 0; + left: 0; + z-index: 10; + + .sidebar-header { + padding: 0.75rem 1rem; + border-bottom: 1px solid var(--border-color); + display: flex; + justify-content: space-between; + align-items: center; + + .sidebar-title { + font-size: 0.75rem; + font-weight: 500; + color: color-mix(in srgb, var(--popup-text-color) 70%, transparent); + } + } + } + + .chat-sidebar.hidden { + transform: translateX(-100%); + } + + .chat-history { + flex: 1; + overflow-y: auto; + padding: 0.5rem; + + .history-item { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.5rem 0.75rem; + border-radius: 0.375rem; + cursor: pointer; + margin-bottom: 0.25rem; + transition: all 0.2s ease; + + &:hover { + background-color: color-mix( + in srgb, + var(--popup-background-color) 20%, + transparent + ); + } + + &.active { + background-color: color-mix( + in srgb, + var(--popup-background-color) 20%, + transparent + ); + } + + .history-icon { + display: flex; + align-items: center; + justify-content: center; + color: color-mix(in srgb, var(--popup-text-color) 70%, transparent); + } + + .history-text { + flex: 1; + font-size: 0.75rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + } + } + + .messages-wrapper { + flex: 1; + margin-left: 0; + transition: margin-left 0.3s ease; + width: 100%; + } + + .messages-wrapper.with-sidebar { + margin-left: 240px; + width: calc(100% - 240px); + } + + .messages-container { + height: 100%; + overflow-y: auto; + scrollbar-width: thin; + scrollbar-color: rgba(255, 255, 255, 0.1) transparent; + } + + .messages-container::-webkit-scrollbar { + width: 6px; + } + + .messages-container::-webkit-scrollbar-track { + background: transparent; + } + + .messages-container::-webkit-scrollbar-thumb { + background-color: rgba(255, 255, 255, 0.1); + border-radius: 10px; + } + + .messages-container::-webkit-scrollbar-thumb:hover { + background-color: rgba(255, 255, 255, 0.2); + } + + .message { + padding: 1rem 1.5rem; + border-bottom: 1px solid var(--border-color); + } + + .message.user { + background-color: color-mix( + in srgb, + var(--popup-background-color) 20%, + transparent + ); + } + + .message-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 0.5rem; + } + + .message-sender { + display: inline-block; + font-size: 0.75rem; + font-weight: 500; + padding: 0.125rem 0.5rem; + border-radius: 0.25rem; + } + + .message-sender.ai { + background-color: var(--active-icon-color); + color: var(--active-color); + } + + .message-sender.user { + background-color: var(--popup-background-color); + color: color-mix(in srgb, var(--popup-text-color) 70%, transparent); + } + + .message-actions { + display: flex; + align-items: center; + gap: 0.25rem; + } + + .message-time { + font-size: 0.75rem; + color: color-mix(in srgb, var(--popup-text-color) 70%, transparent); + margin-right: 0.25rem; + } + + .message-content { + font-size: 0.875rem; + line-height: 1.6; + } + + .message-content p { + margin-bottom: 0.75rem; + } + + .message-content p:last-child { + margin-bottom: 0; + } + + .message-content pre { + background-color: var(--popup-background-color); + border-radius: 0.375rem; + margin: 0.75rem 0; + overflow: hidden; + } + + .message-content code { + font-size: 0.75rem; + } + + .message-content p code { + background-color: var(--popup-background-color); + padding: 0.125rem 0.25rem; + border-radius: 0.25rem; + } + + .artifact { + margin: 0.75rem 0; + border: 1px solid var(--border-color); + border-radius: 0.375rem; + overflow: hidden; + background-color: color-mix( + in srgb, + var(--popup-background-color) 20%, + transparent + ); + } + + .artifact-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.5rem 0.75rem; + background-color: var(--popup-background-color); + border-bottom: 1px solid var(--border-color); + } + + .artifact-title { + display: flex; + align-items: center; + gap: 0.5rem; + font-size: 0.75rem; + color: var(--secondary-text-color); + } + + .artifact-content { + padding: 0.75rem; + font-size: 0.75rem; + background-color: color-mix( + in srgb, + var(--popup-background-color) 20%, + transparent + ); + max-height: 300px; + overflow-y: auto; + } + + .artifact-content.collapsed { + display: none; + } + + .thinking-artifact .artifact-title svg { + color: var(--yellow-primary); + } + + .planning-artifact .artifact-title svg { + color: var(--blue-primary); + } + + .tool-artifact .artifact-title svg { + color: var(--green-primary); + } + + .network-artifact .artifact-title svg { + color: var(--purple-primary); + } + + .terminal-artifact .artifact-title svg { + color: var(--primary-text-color); + } + + .code-artifact .artifact-title svg { + color: var(--primary-text-color); + } + + .code-block { + margin: 0.75rem 0; + border-radius: 0.375rem; + overflow: hidden; + border: 1px solid var(--border-color); + } + + .code-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.5rem 0.75rem; + background-color: var(--popup-background-color); + border-bottom: 1px solid var(--border-color); + } + + .code-language { + display: flex; + align-items: center; + gap: 0.5rem; + font-size: 0.75rem; + color: var(--secondary-text-color); + } + + .code-actions { + display: flex; + align-items: center; + gap: 0.25rem; + } + + .code-content { + position: relative; + max-height: 150px; + overflow: hidden; + } + + .code-content.expanded { + max-height: none; + overflow-y: auto; + } + + .code-content:not(.expanded)::after { + content: ""; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 40px; + background: linear-gradient( + transparent, + color-mix(in srgb, var(--popup-background-color) 20%, transparent) + ); + pointer-events: none; + } + + .code-content pre { + margin: 0; + padding: 0.75rem; + } + + .code-expand { + display: flex; + align-items: center; + justify-content: center; + padding: 0.25rem; + background-color: var(--popup-background-color); + border-top: 1px solid var(--border-color); + font-size: 0.75rem; + color: var(--secondary-text-color); + cursor: pointer; + } + + .code-expand:hover { + background-color: color-mix( + in srgb, + var(--popup-background-color) 20%, + transparent + ); + } + + .badge { + display: inline-flex; + align-items: center; + gap: 0.25rem; + padding: 0.125rem 0.375rem; + border-radius: 0.25rem; + font-size: 0.625rem; + font-weight: 500; + margin-right: 0.25rem; + } + + .badge-blue { + background-color: var(--blue-tertiary); + color: var(--blue-primary); + } + + .badge-green { + background-color: rgba(76, 175, 80, 0.2); + color: var(--green-primary); + } + + .badge-red { + background-color: rgba(229, 62, 62, 0.2); + color: var(--red-primary); + } + + .badge-yellow { + background-color: rgba(255, 193, 7, 0.2); + color: var(--yellow-primary); + } + + .badge-purple { + background-color: rgba(156, 39, 176, 0.2); + color: var(--purple-primary); + } + + /* Network request artifact */ + .network-request { + padding: 0.75rem; + } + + .network-url-input { + display: flex; + align-items: center; + background-color: var(--popup-background-color); + border-radius: 0.375rem; + padding: 0.25rem 0.5rem; + margin-bottom: 0.75rem; + overflow: hidden; + } + + .network-url-input i { + color: color-mix(in srgb, var(--popup-text-color) 70%, transparent); + margin-right: 0.5rem; + flex-shrink: 0; + } + + .network-url-input input { + flex: 1; + background: none; + border: none; + color: var(--primary-text-color); + font-size: 0.75rem; + padding: 0.25rem 0; + width: 100%; + } + + .network-url-input input:focus { + outline: none; + } + + .network-description { + margin-bottom: 0.75rem; + color: var(--secondary-text-color); + } + + .network-actions { + display: flex; + gap: 0.5rem; + } + + .network-status { + display: flex; + align-items: center; + gap: 0.5rem; + margin-top: 0.75rem; + padding: 0.5rem; + border-radius: 0.375rem; + font-size: 0.75rem; + } + + .network-status.allowed { + background-color: rgba(76, 175, 80, 0.1); + color: var(--green-primary); + } + + .network-status.blocked { + background-color: rgba(229, 62, 62, 0.1); + color: var(--red-primary); + } + + .network-status.hidden { + display: none; + } + + /* Terminal artifact */ + .terminal-command-input { + display: flex; + align-items: center; + background-color: var(--popup-background-color); + border-radius: 0.375rem; + padding: 0.25rem 0.5rem; + margin-bottom: 0.75rem; + overflow: hidden; + } + + .terminal-command-input span { + color: var(--green-primary); + margin-right: 0.5rem; + + font-size: 0.75rem; + } + + .terminal-command-input input { + flex: 1; + background: none; + border: none; + color: var(--primary-text-color); + + font-size: 0.75rem; + padding: 0.25rem 0; + } + + .terminal-command-input input:focus { + outline: none; + } + + .terminal-actions { + display: flex; + gap: 0.5rem; + margin-bottom: 0.75rem; + } + + .terminal-output { + font-size: 0.75rem; + white-space: pre-wrap; + padding: 0.75rem; + background-color: var(--popup-background-color); + border-radius: 0.375rem; + max-height: 200px; + overflow-y: auto; + } + + .terminal-output.hidden { + display: none; + } + + .terminal-status { + display: flex; + align-items: center; + gap: 0.5rem; + margin-top: 0.75rem; + padding: 0.5rem; + border-radius: 0.375rem; + font-size: 0.75rem; + } + + .terminal-status.success { + background-color: rgba(76, 175, 80, 0.1); + color: var(--green-primary); + } + + .terminal-status.error { + background-color: rgba(229, 62, 62, 0.1); + color: var(--red-primary); + } + + .terminal-status.running { + background-color: rgba(255, 193, 7, 0.1); + color: var(--yellow-primary); + } + + .terminal-status.hidden { + display: none; + } + + .file-badge { + display: inline-flex; + align-items: center; + gap: 0.25rem; + padding: 0.25rem 0.5rem; + border-radius: 0.375rem; + font-size: 0.75rem; + margin: 0.25rem 0; + background-color: var(--popup-background-color); + } + } + + .chat-input-container { + border-top: 1px solid var(--border-color); + background-color: var(--secondary-color); + + .chat-input-wrapper { + position: relative; + display: flex; + flex-direction: column; + background-color: color-mix( + in srgb, + var(--popup-background-color) 20%, + transparent + ); + border: 1px solid var(--border-color); + border-radius: 0.5rem; + overflow: hidden; + margin: 1rem; + + .chat-input { + width: 100%; + min-height: 44px; + max-height: 200px; + padding: 0.75rem 1rem; + background-color: transparent; + border: none; + color: var(--primary-text-color); + font-size: 0.875rem; + resize: none; + overflow-y: auto; + &:focus { + outline: none; + } + } + + .chat-input-actions { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.5rem 0.75rem; + border-top: 1px solid var(--border-color); + + .input-tools { + display: flex; + align-items: center; + gap: 0.5rem; + } + .input-send { + display: flex; + align-items: center; + gap: 0.5rem; + } + } + } + } + + .btn { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.25rem; + background: none; + border: none; + border-radius: 0.25rem; + color: var(--secondary-text-color); + cursor: pointer; + transition: all 0.2s ease; + } + + .btn:hover { + color: var(--primary-text-color); + background-color: rgba(255, 255, 255, 0.1); + } + + .btn:disabled { + opacity: 0.5; + cursor: not-allowed; + } + + .btn-primary { + background-color: var(--button-background-color); + color: white; + } + + .btn-primary:hover { + background-color: var(--button-active-color); + color: white; + } + + .btn-outline { + border: 1px solid var(--border-color); + background-color: color-mix( + in srgb, + var(--popup-background-color) 20%, + transparent + ); + } + + .btn-sm { + height: 1.75rem; + padding: 0 0.5rem; + font-size: 0.75rem; + } + + .btn-icon { + width: 1.75rem; + height: 1.75rem; + padding: 0; + } + + .btn-text { + margin-left: 0.25rem; + } + + /* Profile switcher */ + .profile-switcher { + position: relative; + } + + .profile-button { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0 0.5rem; + height: 2rem; + background-color: color-mix( + in srgb, + var(--popup-background-color) 20%, + transparent + ); + border: 1px solid var(--border-color); + border-radius: 0.375rem; + color: var(--primary-text-color); + font-size: 0.75rem; + cursor: pointer; + } + + .profile-dropdown { + position: absolute; + top: 100%; + left: 0; + width: 280px; + margin-top: 0.25rem; + background-color: color-mix( + in srgb, + var(--popup-background-color) 20%, + transparent + ); + border: 1px solid var(--border-color); + border-radius: 0.375rem; + overflow: hidden; + z-index: 10; + display: none; + } + + .profile-dropdown.open { + display: block; + } + + .profile-option { + padding: 0.75rem 1rem; + cursor: pointer; + border-bottom: 1px solid var(--border-color); + } + + .profile-option:last-child { + border-bottom: none; + } + + .profile-option:hover { + background-color: var(--popup-background-color); + } + + .profile-option-header { + display: flex; + align-items: center; + gap: 0.5rem; + font-size: 0.75rem; + font-weight: 500; + margin-bottom: 0.25rem; + } + + .profile-option-description { + font-size: 0.625rem; + color: color-mix(in srgb, var(--popup-text-color) 70%, transparent); + margin-bottom: 0.5rem; + } + + .permission-toggles { + margin-top: 0.75rem; + display: none; + } + + .permission-toggles.visible { + display: block; + } + + .permission-toggle { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 0.5rem; + } + + .permission-label { + display: flex; + align-items: center; + gap: 0.5rem; + font-size: 0.75rem; + } + + .toggle-switch { + position: relative; + display: inline-block; + width: 36px; + height: 20px; + } + + .toggle-switch input { + opacity: 0; + width: 0; + height: 0; + } + + .toggle-slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: var(--popup-background-color); + transition: all 0.2s ease; + border-radius: 34px; + } + + .toggle-slider:before { + position: absolute; + content: ""; + height: 16px; + width: 16px; + left: 2px; + bottom: 2px; + background-color: color-mix( + in srgb, + var(--popup-text-color) 70%, + transparent + ); + transition: all 0.2s ease; + border-radius: 50%; + } + + input:checked + .toggle-slider { + background-color: var(--blue-tertiary); + } + + input:checked + .toggle-slider:before { + transform: translateX(16px); + background-color: var(--blue-primary); + } + + /* Loading indicator */ + .loading { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 1rem 1.5rem; + color: var(--secondary-text-color); + font-size: 0.875rem; + border-bottom: 1px solid var(--border-color); + } + + .loading-dots { + display: flex; + align-items: center; + gap: 0.25rem; + } + + .loading-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background-color: var(--active-color); + opacity: 0.6; + } + + .loading-dot:nth-child(1) { + animation: pulse 1.5s infinite; + } + + .loading-dot:nth-child(2) { + animation: pulse 1.5s infinite 0.3s; + } + + .loading-dot:nth-child(3) { + animation: pulse 1.5s infinite 0.6s; + } + + @keyframes pulse { + 0%, + 100% { + opacity: 0.4; + transform: scale(0.8); + } + 50% { + opacity: 1; + transform: scale(1); + } + } + + /* Settings modal */ + .modal-backdrop { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 100; + opacity: 0; + pointer-events: none; + transition: opacity 0.2s ease; + } + + .modal-backdrop.open { + opacity: 1; + pointer-events: auto; + } + + .modal { + width: 500px; + max-width: 90%; + background-color: var(--bg-secondary); + border-radius: 0.5rem; + border: 1px solid var(--border-color); + overflow: hidden; + transform: translateY(20px); + transition: transform 0.2s ease; + } + + .modal-backdrop.open .modal { + transform: translateY(0); + } + + .modal-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 1rem; + border-bottom: 1px solid var(--border-color); + } + + .modal-title { + font-size: 1rem; + font-weight: 500; + } + + .modal-close { + background: none; + border: none; + color: color-mix(in srgb, var(--popup-text-color) 70%, transparent); + cursor: pointer; + } + + .modal-body { + padding: 1rem; + max-height: 70vh; + overflow-y: auto; + } + + .modal-section { + margin-bottom: 1.5rem; + } + + .modal-section-title { + font-size: 0.875rem; + font-weight: 500; + margin-bottom: 0.75rem; + color: var(--secondary-text-color); + } + + .modal-footer { + padding: 1rem; + border-top: 1px solid var(--border-color); + display: flex; + justify-content: flex-end; + gap: 0.5rem; + } + + /* Markdown styles */ + .markdown h1 { + font-size: 1.5rem; + font-weight: 600; + margin: 1.5rem 0 1rem; + } + + .markdown h2 { + font-size: 1.25rem; + font-weight: 600; + margin: 1.25rem 0 0.75rem; + } + + .markdown h3 { + font-size: 1rem; + font-weight: 600; + margin: 1rem 0 0.5rem; + } + + .markdown ul, + .markdown ol { + margin: 0.75rem 0; + padding-left: 1.5rem; + } + + .markdown li { + margin-bottom: 0.25rem; + } + + .markdown a { + color: var(--blue-primary); + text-decoration: none; + } + + .markdown a:hover { + text-decoration: underline; + } + + .markdown blockquote { + border-left: 3px solid var(--border-color); + padding-left: 1rem; + margin: 1rem 0; + color: var(--secondary-text-color); + } + + .markdown table { + width: 100%; + border-collapse: collapse; + margin: 1rem 0; + } + + .markdown th, + .markdown td { + padding: 0.5rem; + border: 1px solid var(--border-color); + text-align: left; + } + + .markdown th { + background-color: var(--popup-background-color); + } + + .feather-sm { + width: 16px; + height: 16px; + } + + .feather-xs { + width: 14px; + height: 14px; + } + + /* Responsive styles */ + @media (max-width: 768px) { + .btn-text { + display: none; + } + + .header-left, + .header-right { + gap: 0.5rem; + } + + .message { + padding: 0.75rem 1rem; + } + + .chat-sidebar { + width: 100%; + } + + .messages-wrapper.with-sidebar { + margin-left: 0; + width: 100%; + } + } +} diff --git a/src/pages/aiAssistant/index.js b/src/pages/aiAssistant/index.js new file mode 100644 index 000000000..d89a773bc --- /dev/null +++ b/src/pages/aiAssistant/index.js @@ -0,0 +1,8 @@ +//jshint ignore:start + +function AiAssistant() { + import(/* webpackChunkName: "aiAssistant" */ "./assistant").then((res) => { + res.default(); + }); +} +export default AiAssistant; From 2be29a219a68885b55c2b2af867c929c3761f128 Mon Sep 17 00:00:00 2001 From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com> Date: Sat, 17 May 2025 22:37:28 +0530 Subject: [PATCH 02/26] feat: profile selection dialog --- src/pages/aiAssistant/assistant.js | 124 +++++++++++------------------ 1 file changed, 48 insertions(+), 76 deletions(-) diff --git a/src/pages/aiAssistant/assistant.js b/src/pages/aiAssistant/assistant.js index 9c7465577..22abae861 100644 --- a/src/pages/aiAssistant/assistant.js +++ b/src/pages/aiAssistant/assistant.js @@ -1,7 +1,47 @@ +import select from "dialogs/select"; +import Ref from "html-tag-js/ref"; import EditorFile from "lib/editorFile"; import styles from "./assistant.module.scss"; export default function openAIAssistantPage() { + // References + const profileBtnRef = new Ref(); + + // States + let currentProfile = "ask"; // Default to ask profile + + /** + * Updates the profile button appearance and state + * @param {string} profile - Profile type ("ask" or "write") + */ + const handleProfileSwitch = (profile) => { + const iconEl = profileBtnRef.el.querySelector("i:first-child"); + const textEl = profileBtnRef.el.querySelector("span"); + + currentProfile = profile; + + // Update button appearance based on selected profile + if (profile === "ask") { + iconEl.className = "icon help"; + textEl.textContent = "Ask"; + } else { + iconEl.className = "icon edit"; + textEl.textContent = "Write"; + } + }; + + /** + * Shows profile selection menu + */ + const showProfileMenu = async (e) => { + e.preventDefault(); + const profile = await select("Select Profile", [ + { value: "ask", text: "Ask", icon: "help" }, + { value: "write", text: "Write", icon: "edit" }, + ]); + handleProfileSwitch(profile); + }; + const aiAssistantContainer = (
{/* Header */} @@ -18,82 +58,16 @@ export default function openAIAssistantPage() {
- -
-
-
- - Ask -
-
- Suggest approaches without writing code -
-
-
-
- - Write -
-
- Write and implement code -
-
-
-
- - Custom -
-
- Custom permissions and capabilities -
-
-
-
- - Network Requests -
- -
-
-
- - Read Files -
- -
-
-
- - Write Files -
- -
-
-
- - Execute Commands -
- -
-
-
-
@@ -199,6 +173,4 @@ export default function openAIAssistantPage() { stylesheets: styles, hideQuickTools: true, }); - - console.log("Opened AI Assistant tab."); } From 69e4170c11d4f49cabfb43ae210b66292a03b865 Mon Sep 17 00:00:00 2001 From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com> Date: Tue, 20 May 2025 17:31:37 +0530 Subject: [PATCH 03/26] toggle able history panel --- src/pages/aiAssistant/assistant.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/pages/aiAssistant/assistant.js b/src/pages/aiAssistant/assistant.js index 22abae861..33db481fb 100644 --- a/src/pages/aiAssistant/assistant.js +++ b/src/pages/aiAssistant/assistant.js @@ -6,6 +6,7 @@ import styles from "./assistant.module.scss"; export default function openAIAssistantPage() { // References const profileBtnRef = new Ref(); + const historySidebarRef = new Ref(); // States let currentProfile = "ask"; // Default to ask profile @@ -42,6 +43,10 @@ export default function openAIAssistantPage() { handleProfileSwitch(profile); }; + const toggleHistorySidebar = () => { + historySidebarRef.classList.toggle("hidden"); + }; + const aiAssistantContainer = (
{/* Header */} @@ -52,7 +57,11 @@ export default function openAIAssistantPage() { New Chat
- @@ -80,7 +89,11 @@ export default function openAIAssistantPage() { {/* Main content */}
{/* Chat history sidebar */} -
+

CHAT HISTORY

-
-
- - {/* - */} -
-
- - -
+
+ +
); + chatInputRef.el.addEventListener("input", handleChatInput); + const uri = "ai://assistant"; // Check if the tab is already open diff --git a/src/pages/aiAssistant/assistant.module.scss b/src/pages/aiAssistant/assistant.module.scss index 7a709ab4b..409e1e15d 100644 --- a/src/pages/aiAssistant/assistant.module.scss +++ b/src/pages/aiAssistant/assistant.module.scss @@ -165,12 +165,22 @@ .message { padding: 1rem 1.5rem; border-bottom: 1px solid var(--border-color); + user-select: text; + + *::selection { + background-color: color-mix( + in srgb, + var(--popup-background-color) 50%, + white + ); + color: var(--active-color); + } } .message.user { background-color: color-mix( in srgb, - var(--popup-background-color) 20%, + var(--primary-color) 45%, transparent ); } @@ -192,7 +202,7 @@ .message-sender.ai { background-color: var(--active-icon-color); - color: var(--active-color); + color: color-mix(in srgb, var(--active-color) 70%, transparent); } .message-sender.user { @@ -208,7 +218,7 @@ .message-time { font-size: 0.75rem; - color: color-mix(in srgb, var(--popup-text-color) 70%, transparent); + color: color-mix(in srgb, var(--secondary-text-color) 70%, transparent); margin-right: 0.25rem; } @@ -589,56 +599,97 @@ } } - .chat-input-container { + .input-area { + /* padding: 1.5rem; */ + padding: 1rem; + background: var(--primary-color); border-top: 1px solid var(--border-color); - background-color: var(--secondary-color); - .chat-input-wrapper { - position: relative; + .input-container { display: flex; - flex-direction: column; - background-color: color-mix( - in srgb, - var(--popup-background-color) 20%, - transparent - ); + align-items: flex-end; + gap: 0.75rem; + background: transparent; border: 1px solid var(--border-color); - border-radius: 0.5rem; - overflow: hidden; - margin: 1rem; + border-radius: 12px; + padding: 0.75rem; + + &:focus-within { + border-color: var(--active-color); + } + + .attach-btn { + width: 32px; + height: 32px; + border: none; + background: none; + cursor: pointer; + color: color-mix(in srgb, var(--primary-text-color) 50%, transparent); + transition: color 0.2s; + display: flex; + align-items: center; + justify-content: center; + &:hover { + color: var(--primary-text-color); + } + } .chat-input { - width: 100%; - min-height: 44px; - max-height: 200px; - padding: 0.75rem 1rem; - background-color: transparent; + flex: 1; + min-height: 32px; + max-height: 120px; border: none; - color: var(--primary-text-color); - font-size: 0.875rem; + background: transparent; resize: none; - overflow-y: auto; - &:focus { - outline: none; + font-family: inherit; + font-size: 0.95rem; + line-height: 1.5; + color: var(--primary-text-color); + outline: none; + &::placeholder { + color: color-mix(in srgb, var(--primary-text-color) 50%, transparent); } } - .chat-input-actions { + .action-buttons { display: flex; - align-items: center; - justify-content: space-between; - padding: 0.5rem 0.75rem; - border-top: 1px solid var(--border-color); + gap: 0.5rem; - .input-tools { + .action-btn { + width: 32px; + height: 32px; + border: none; + border-radius: 6px; + cursor: pointer; display: flex; align-items: center; - gap: 0.5rem; + justify-content: center; + transition: all 0.2s; } - .input-send { - display: flex; - align-items: center; - gap: 0.5rem; + + .stop-btn { + background: var(--error-text-color); + color: white; + display: none; + } + + .stop-btn:hover { + background: color-mix(in srgb, var(--error-text-color) 80%, white); + } + + .send-btn { + background: var(--button-background-color); + color: var(--button-text-color); + } + + .send-btn:hover { + background: var(--button-active-color); + } + + .send-btn:disabled { + background: var(--popup-background-color); + color: color-mix(in srgb, var(--primary-text-color) 50%, transparent); + cursor: not-allowed; } } } @@ -725,130 +776,6 @@ cursor: pointer; } - .profile-dropdown { - position: absolute; - top: 100%; - left: 0; - width: 280px; - margin-top: 0.25rem; - background-color: color-mix( - in srgb, - var(--popup-background-color) 20%, - transparent - ); - border: 1px solid var(--border-color); - border-radius: 0.375rem; - overflow: hidden; - z-index: 10; - display: none; - } - - .profile-dropdown.open { - display: block; - } - - .profile-option { - padding: 0.75rem 1rem; - cursor: pointer; - border-bottom: 1px solid var(--border-color); - } - - .profile-option:last-child { - border-bottom: none; - } - - .profile-option:hover { - background-color: var(--popup-background-color); - } - - .profile-option-header { - display: flex; - align-items: center; - gap: 0.5rem; - font-size: 0.75rem; - font-weight: 500; - margin-bottom: 0.25rem; - } - - .profile-option-description { - font-size: 0.625rem; - color: color-mix(in srgb, var(--popup-text-color) 70%, transparent); - margin-bottom: 0.5rem; - } - - .permission-toggles { - margin-top: 0.75rem; - display: none; - } - - .permission-toggles.visible { - display: block; - } - - .permission-toggle { - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: 0.5rem; - } - - .permission-label { - display: flex; - align-items: center; - gap: 0.5rem; - font-size: 0.75rem; - } - - .toggle-switch { - position: relative; - display: inline-block; - width: 36px; - height: 20px; - } - - .toggle-switch input { - opacity: 0; - width: 0; - height: 0; - } - - .toggle-slider { - position: absolute; - cursor: pointer; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: var(--popup-background-color); - transition: all 0.2s ease; - border-radius: 34px; - } - - .toggle-slider:before { - position: absolute; - content: ""; - height: 16px; - width: 16px; - left: 2px; - bottom: 2px; - background-color: color-mix( - in srgb, - var(--popup-text-color) 70%, - transparent - ); - transition: all 0.2s ease; - border-radius: 50%; - } - - input:checked + .toggle-slider { - background-color: var(--blue-tertiary); - } - - input:checked + .toggle-slider:before { - transform: translateX(16px); - background-color: var(--blue-primary); - } - /* Loading indicator */ .loading { display: flex; @@ -980,78 +907,6 @@ gap: 0.5rem; } - /* Markdown styles */ - .markdown h1 { - font-size: 1.5rem; - font-weight: 600; - margin: 1.5rem 0 1rem; - } - - .markdown h2 { - font-size: 1.25rem; - font-weight: 600; - margin: 1.25rem 0 0.75rem; - } - - .markdown h3 { - font-size: 1rem; - font-weight: 600; - margin: 1rem 0 0.5rem; - } - - .markdown ul, - .markdown ol { - margin: 0.75rem 0; - padding-left: 1.5rem; - } - - .markdown li { - margin-bottom: 0.25rem; - } - - .markdown a { - color: var(--blue-primary); - text-decoration: none; - } - - .markdown a:hover { - text-decoration: underline; - } - - .markdown blockquote { - border-left: 3px solid var(--border-color); - padding-left: 1rem; - margin: 1rem 0; - color: var(--secondary-text-color); - } - - .markdown table { - width: 100%; - border-collapse: collapse; - margin: 1rem 0; - } - - .markdown th, - .markdown td { - padding: 0.5rem; - border: 1px solid var(--border-color); - text-align: left; - } - - .markdown th { - background-color: var(--popup-background-color); - } - - .feather-sm { - width: 16px; - height: 16px; - } - - .feather-xs { - width: 14px; - height: 14px; - } - /* Responsive styles */ @media (max-width: 768px) { .btn-text { From d890d91f25fe4d8914d73513ad2733070b946361 Mon Sep 17 00:00:00 2001 From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com> Date: Thu, 29 May 2025 23:59:14 +0530 Subject: [PATCH 05/26] feat: improved code block and fix highlighting --- package.json | 5 +- src/pages/aiAssistant/assistant.js | 111 +++++++++++++++----- src/pages/aiAssistant/assistant.module.scss | 3 + 3 files changed, 90 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index 681723b6e..9be678a28 100644 --- a/package.json +++ b/package.json @@ -89,6 +89,9 @@ }, "dependencies": { "@deadlyjack/ajax": "^1.2.6", + "@langchain/core": "^0.3.57", + "@langchain/google-genai": "^0.2.10", + "@langchain/langgraph": "^0.2.74", "@ungap/custom-elements": "^1.3.0", "autosize": "^6.0.1", "cordova": "12.0.0", @@ -113,4 +116,4 @@ "yargs": "^17.7.2" }, "browserslist": "cover 100%,not android < 5" -} \ No newline at end of file +} diff --git a/src/pages/aiAssistant/assistant.js b/src/pages/aiAssistant/assistant.js index a2be10087..13cf6fd52 100644 --- a/src/pages/aiAssistant/assistant.js +++ b/src/pages/aiAssistant/assistant.js @@ -8,6 +8,8 @@ import settings from "lib/settings"; import markdownIt from "markdown-it"; import styles from "./assistant.module.scss"; +let aiTabInstance; + export default function openAIAssistantPage() { // References const profileBtnRef = new Ref(); @@ -265,7 +267,7 @@ export default function openAIAssistantPage() { `#message-${assistantMsgId} .message-content`, ); if (messageEl) { - messageEl.innerHTML += `Cancelled by user.`; + messageEl.innerHTML += `
Cancelled by user.
`; } } else { const messageEl = messageContainerRef.el.querySelector( @@ -276,57 +278,110 @@ export default function openAIAssistantPage() { } } } finally { - // add copy button to code blocks - const codeBlocks = messageContainerRef.el - .querySelector(`#message-${assistantMsgId} .message-content`) - .querySelectorAll("pre"); - codeBlocks.forEach((pre) => { - pre.style.position = "relative"; - const copyButton = document.createElement("button"); - copyButton.className = "copy-button"; - copyButton.textContent = "Copy"; - - const codeElement = pre.querySelector("code"); + // add custom code blocks with syntax highlighting + const messageContent = messageContainerRef.el.querySelector( + `#message-${assistantMsgId} .message-content`, + ); + + // Replace markdown code blocks with custom components + messageContent.innerHTML = messageContent.innerHTML.replace( + /
([\s\S]*?)<\/code><\/pre>/g,
+				(match, language, code) => {
+					language = language || "plaintext";
+
+					return `
+					
+
+
+ + ${language} +
+
+ +
+
+
+
${code}
+
+
+ + Show more +
+
+ `; + }, + ); + + // Process all code blocks + const codeBlocks = messageContent.querySelectorAll(".code-block"); + codeBlocks.forEach((codeBlock) => { + const codeContent = codeBlock.querySelector(".code-content"); + const codeElement = codeBlock.querySelector("code"); + const copyButton = codeBlock.querySelector(".code-copy"); + const expandButton = codeBlock.querySelector(".code-expand"); + + // Apply Ace highlighting if (codeElement) { - const langMatch = codeElement.className.match( - /language-(\w+)|(javascript)/, - ); + const langMatch = codeElement.className.match(/language-(\w+)/); if (langMatch) { const langMap = { bash: "sh", shell: "sh", }; - const lang = langMatch[1] || langMatch[2]; + const lang = langMatch[1]; const mappedLang = langMap[lang] || lang; const highlight = ace.require("ace/ext/static_highlight"); - highlight(codeElement, { - mode: `ace/mode/${mappedLang}`, - theme: settings.value.editorTheme.startsWith("ace/theme/") + highlight.render( + codeElement.textContent, + `ace/mode/${mappedLang}`, + settings.value.editorTheme.startsWith("ace/theme/") ? settings.value.editorTheme : "ace/theme/" + settings.value.editorTheme, - }); + 1, + true, + (highlighted) => { + aiTabInstance?.addStyle(highlighted.css); + codeElement.innerHTML = highlighted.html; + }, + ); } } + // copy functionality copyButton.addEventListener("click", async () => { - const code = - pre.querySelector("code")?.textContent || pre.textContent; + const code = codeElement?.textContent || ""; try { cordova.plugins.clipboard.copy(code); - copyButton.textContent = "Copied!"; + copyButton.querySelector("i").className = "icon check"; setTimeout(() => { - copyButton.textContent = "Copy"; + copyButton.querySelector("i").className = "icon copy"; }, 2000); } catch (err) { - copyButton.textContent = "Failed to copy"; + copyButton.querySelector("i").className = + "icon warningreport_problem"; setTimeout(() => { - copyButton.textContent = "Copy"; + copyButton.querySelector("i").className = "icon copy"; }, 2000); } }); - pre.appendChild(copyButton); + // expand/collapse functionality + expandButton.addEventListener("click", () => { + const isExpanded = codeContent.classList.contains("expanded"); + codeContent.classList.toggle("expanded", !isExpanded); + expandButton.innerHTML = isExpanded + ? ` Show more` + : ` Show less`; + }); + + // Only show expand button if content overflows + if (codeContent.scrollHeight <= codeContent.clientHeight) { + expandButton.style.display = "none"; + } }); + currentController = null; sendBtnRef.el.style.display = "block"; stopBtnRef.el.style.display = "none"; @@ -491,7 +546,7 @@ export default function openAIAssistantPage() { } // Create a new EditorFile instance for the AI Assistant tab - new EditorFile("AI Assistant", { + aiTabInstance = new EditorFile("AI Assistant", { uri: uri, type: "page", tabIcon: "file file_type_assistant", diff --git a/src/pages/aiAssistant/assistant.module.scss b/src/pages/aiAssistant/assistant.module.scss index 409e1e15d..de3322af3 100644 --- a/src/pages/aiAssistant/assistant.module.scss +++ b/src/pages/aiAssistant/assistant.module.scss @@ -380,6 +380,9 @@ margin: 0; padding: 0.75rem; } + .code-content pre code div { + background-color: inherit !important; + } .code-expand { display: flex; From 375812258a99e2c8b0c20681aed751a4e8c9d8bc Mon Sep 17 00:00:00 2001 From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com> Date: Fri, 30 May 2025 13:55:43 +0530 Subject: [PATCH 06/26] feat: show loader before ai response stream --- src/pages/aiAssistant/assistant.js | 44 ++++++++++++--------- src/pages/aiAssistant/assistant.module.scss | 12 +++--- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/pages/aiAssistant/assistant.js b/src/pages/aiAssistant/assistant.js index 13cf6fd52..91d865ad6 100644 --- a/src/pages/aiAssistant/assistant.js +++ b/src/pages/aiAssistant/assistant.js @@ -77,7 +77,7 @@ export default function openAIAssistantPage() { const showLoading = () => { const loadingEl = tag("div", { - className: "loading", + className: "ai_loading", id: "loading-indicator", }); const loadingDots = tag("div", { @@ -91,14 +91,14 @@ export default function openAIAssistantPage() { loadingDots.appendChild(dot); } - const text = tag("div", { + const text = tag("span", { textContent: "AI is thinking...", }); loadingEl.appendChild(loadingDots); loadingEl.appendChild(text); - messageContainerRef.append(loadingEl); + messageContainerRef.el.appendChild(loadingEl); scrollToBottom(); }; @@ -175,7 +175,7 @@ export default function openAIAssistantPage() { messageEl.appendChild(messageHeader); messageEl.appendChild(messageContent); - messageContainerRef.append(messageEl); + messageContainerRef.el.appendChild(messageEl); scrollToBottom(); }; @@ -211,15 +211,8 @@ export default function openAIAssistantPage() { chatInputRef.value = ""; chatInputRef.style.height = "auto"; - // Add assistant message placeholder to UI - const assistantMsgId = generateMessageId(); - const assistantMessage = { - id: assistantMsgId, - role: "assistant", - content: "", - timestamp: Date.now(), - }; - addMessage(assistantMessage); + // Show loading indicator + showLoading(); // Prepare inputs for agent let inputs = { messages: [...chatHistory] }; @@ -228,17 +221,31 @@ export default function openAIAssistantPage() { sendBtnRef.el.style.display = "none"; stopBtnRef.el.style.display = "block"; - try { - const messageEl = messageContainerRef.el.querySelector( - `#message-${assistantMsgId} .message-content`, - ); - let streamedContent = ""; + const assistantMsgId = generateMessageId(); + try { const stream = await agent.stream(inputs, { streamMode: "messages", signal: currentController.signal, }); + // Remove loading indicator + removeLoading(); + + // Add assistant message placeholder + const assistantMessage = { + id: assistantMsgId, + role: "assistant", + content: "", + timestamp: Date.now(), + }; + addMessage(assistantMessage); + + const messageEl = messageContainerRef.el.querySelector( + `#message-${assistantMsgId} .message-content`, + ); + let streamedContent = ""; + for await (const [message, _metadata] of stream) { if (isAIMessageChunk(message) && message.tool_call_chunks?.length) { streamedContent += message.tool_call_chunks[0].args; @@ -262,6 +269,7 @@ export default function openAIAssistantPage() { timeEl.textContent = formatTime(Date.now()); } } catch (err) { + removeLoading(); if (/abort/i.test(err.message)) { const messageEl = messageContainerRef.el.querySelector( `#message-${assistantMsgId} .message-content`, diff --git a/src/pages/aiAssistant/assistant.module.scss b/src/pages/aiAssistant/assistant.module.scss index de3322af3..c732137b9 100644 --- a/src/pages/aiAssistant/assistant.module.scss +++ b/src/pages/aiAssistant/assistant.module.scss @@ -780,11 +780,13 @@ } /* Loading indicator */ - .loading { + .ai_loading { display: flex; align-items: center; + justify-content: flex-start; gap: 0.75rem; padding: 1rem 1.5rem; + min-height: auto; color: var(--secondary-text-color); font-size: 0.875rem; border-bottom: 1px solid var(--border-color); @@ -805,18 +807,18 @@ } .loading-dot:nth-child(1) { - animation: pulse 1.5s infinite; + animation: bounce_dot_loading 1.5s infinite; } .loading-dot:nth-child(2) { - animation: pulse 1.5s infinite 0.3s; + animation: bounce_dot_loading 1.5s infinite 0.3s; } .loading-dot:nth-child(3) { - animation: pulse 1.5s infinite 0.6s; + animation: bounce_dot_loading 1.5s infinite 0.6s; } - @keyframes pulse { + @keyframes bounce_dot_loading { 0%, 100% { opacity: 0.4; From 6ae8ceaf6133cf4e1fe08664e89e93f1424ee27a Mon Sep 17 00:00:00 2001 From: vizzyfreezy <36118637+vizzyfreezy@users.noreply.github.com> Date: Sun, 1 Jun 2025 05:13:12 +0100 Subject: [PATCH 07/26] feat: AI assistant with streaming chat,in memory context with agentcheckpoint and sqlite db for storing chat history (#1) --- package-lock.json | 1898 +++++++++++++++++++++++++++- package.json | 7 +- src/pages/aiAssistant/assistant.js | 1224 ++++++++++-------- src/pages/aiAssistant/db.js | 215 ++++ 4 files changed, 2753 insertions(+), 591 deletions(-) create mode 100644 src/pages/aiAssistant/db.js diff --git a/package-lock.json b/package-lock.json index 3b29d793a..76ab99d2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,10 @@ "license": "MIT", "dependencies": { "@deadlyjack/ajax": "^1.2.6", + "@langchain/core": "^0.3.57", + "@langchain/google-genai": "^0.2.10", + "@langchain/langgraph": "^0.2.74", + "@langchain/langgraph-swarm": "^0.0.3", "@ungap/custom-elements": "^1.3.0", "autosize": "^6.0.1", "cordova": "12.0.0", @@ -22,6 +26,7 @@ "html-tag-js": "^1.5.1", "js-base64": "^3.7.7", "jszip": "^3.10.1", + "langchain": "^0.3.27", "markdown-it": "^14.1.0", "markdown-it-anchor": "^9.2.0", "markdown-it-github-alerts": "^0.3.0", @@ -58,6 +63,7 @@ "cordova-plugin-server": "file:src/plugins/server", "cordova-plugin-sftp": "file:src/plugins/sftp", "cordova-plugin-system": "file:src/plugins/system", + "cordova-sqlite-storage": "^7.0.0", "css-loader": "^7.1.2", "mini-css-extract-plugin": "^2.9.0", "path-browserify": "^1.0.1", @@ -641,6 +647,8 @@ }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, "license": "MIT", "engines": { @@ -882,6 +890,8 @@ }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "license": "MIT", "dependencies": { @@ -1833,6 +1843,8 @@ }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "license": "MIT", "dependencies": { @@ -2083,6 +2095,12 @@ "node": ">=14.21.3" } }, + "node_modules/@cfworker/json-schema": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cfworker/json-schema/-/json-schema-4.1.1.tgz", + "integrity": "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==", + "license": "MIT" + }, "node_modules/@chevrotain/cst-dts-gen": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", @@ -2124,18 +2142,33 @@ }, "node_modules/@deadlyjack/ajax": { "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@deadlyjack/ajax/-/ajax-1.2.6.tgz", + "integrity": "sha512-VwZU8YUflO2/V/dl3dluu+3jg8Ghz/W5fwxD5Z21OZXKeV73d+vStKVBe4wi+Av2KbTR35K7Z+5Q3iIpjB41MA==", "license": "MIT" }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" } }, + "node_modules/@google/generative-ai": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.24.1.tgz", + "integrity": "sha512-MqO+MLfM6kjxcKoy0p1wRzG3b4ZZXtPI+z2IE26UogS2Cm/XHO+7gGRBh6gcJsOiIVoH93UwKvW4HdgiOZCy9Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "license": "ISC", "dependencies": { "string-width": "^5.1.2", @@ -2161,6 +2194,8 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "license": "MIT", "engines": { "node": ">=12" @@ -2171,10 +2206,14 @@ }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", @@ -2190,6 +2229,8 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -2203,6 +2244,8 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", @@ -2218,6 +2261,8 @@ }, "node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", "license": "ISC" }, "node_modules/@jridgewell/gen-mapping": { @@ -2288,8 +2333,239 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@langchain/core": { + "version": "0.3.57", + "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.3.57.tgz", + "integrity": "sha512-jz28qCTKJmi47b6jqhQ6vYRTG5jRpqhtPQjriRTB5wR8mgvzo6xKs0fG/kExS3ZvM79ytD1npBvgf8i19xOo9Q==", + "license": "MIT", + "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.3.29", + "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" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/core/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@langchain/core/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/google-genai": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@langchain/google-genai/-/google-genai-0.2.10.tgz", + "integrity": "sha512-kIy0qhu7FAsShNTvuOx8uV+hf7mWk8OzJP5W9mjs1ovAIT1C9WqG1epkhexBfj4DAQfQ6E+m/oGtJ+CVsalspw==", + "license": "MIT", + "dependencies": { + "@google/generative-ai": "^0.24.0", + "uuid": "^11.1.0", + "zod-to-json-schema": "^3.22.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": ">=0.3.55 <0.4.0" + } + }, + "node_modules/@langchain/google-genai/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/@langchain/langgraph": { + "version": "0.2.74", + "resolved": "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-0.2.74.tgz", + "integrity": "sha512-oHpEi5sTZTPaeZX1UnzfM2OAJ21QGQrwReTV6+QnX7h8nDCBzhtipAw1cK616S+X8zpcVOjgOtJuaJhXa4mN8w==", + "license": "MIT", + "dependencies": { + "@langchain/langgraph-checkpoint": "~0.0.17", + "@langchain/langgraph-sdk": "~0.0.32", + "uuid": "^10.0.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": ">=0.2.36 <0.3.0 || >=0.3.40 < 0.4.0", + "zod-to-json-schema": "^3.x" + }, + "peerDependenciesMeta": { + "zod-to-json-schema": { + "optional": true + } + } + }, + "node_modules/@langchain/langgraph-checkpoint": { + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/@langchain/langgraph-checkpoint/-/langgraph-checkpoint-0.0.17.tgz", + "integrity": "sha512-6b3CuVVYx+7x0uWLG+7YXz9j2iBa+tn2AXvkLxzEvaAsLE6Sij++8PPbS2BZzC+S/FPJdWsz6I5bsrqL0BYrCA==", + "license": "MIT", + "dependencies": { + "uuid": "^10.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": ">=0.2.31 <0.4.0" + } + }, + "node_modules/@langchain/langgraph-checkpoint/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/langgraph-sdk": { + "version": "0.0.78", + "resolved": "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.78.tgz", + "integrity": "sha512-skkUDmEhClWzlsr8jRaS1VpXVBISm5OFd0MUtS1jKRL5pn08K+IJRvHnlzgum9x7Dste9KXGcIGVoR7cNKJQrw==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.15", + "p-queue": "^6.6.2", + "p-retry": "4", + "uuid": "^9.0.0" + }, + "peerDependencies": { + "@langchain/core": ">=0.2.31 <0.4.0", + "react": "^18 || ^19" + }, + "peerDependenciesMeta": { + "@langchain/core": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/@langchain/langgraph-sdk/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/langgraph-swarm": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@langchain/langgraph-swarm/-/langgraph-swarm-0.0.3.tgz", + "integrity": "sha512-6ctP1KGj344KXeY5c08LzvfayCWPA2I52pw7a6t4tcaQ3Y39h3aDvYl94wEqxv20KXIccdzvtAFX1ndxRBrP2Q==", + "license": "MIT", + "dependencies": { + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": "^0.3.40", + "@langchain/langgraph": "^0.2.53" + } + }, + "node_modules/@langchain/langgraph/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/openai": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-0.5.11.tgz", + "integrity": "sha512-DAp7x+NfjSqDvKVMle8yb85nzz+3ctP7zGJaeRS0vLmvkY9qf/jRkowsM0mcsIiEUKhG/AHzWqvxbhktb/jJ6Q==", + "license": "MIT", + "dependencies": { + "js-tiktoken": "^1.0.12", + "openai": "^4.96.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": ">=0.3.48 <0.4.0" + } + }, + "node_modules/@langchain/textsplitters": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@langchain/textsplitters/-/textsplitters-0.1.0.tgz", + "integrity": "sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==", + "license": "MIT", + "dependencies": { + "js-tiktoken": "^1.0.12" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": ">=0.2.21 <0.4.0" + } + }, "node_modules/@netflix/nerror": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@netflix/nerror/-/nerror-1.1.3.tgz", + "integrity": "sha512-b+MGNyP9/LXkapreJzNUzcvuzZslj/RGgdVVJ16P2wSlYatfLycPObImqVJSmNAdyeShvNeM/pl3sVZsObFueg==", "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", @@ -2299,12 +2575,16 @@ }, "node_modules/@nicolo-ribaudo/chokidar-2": { "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", "dev": true, "license": "MIT", "optional": true }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -2316,6 +2596,8 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "license": "MIT", "engines": { "node": ">= 8" @@ -2323,6 +2605,8 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -2409,6 +2693,8 @@ }, "node_modules/@npmcli/arborist/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/@npmcli/fs": { @@ -2446,10 +2732,14 @@ }, "node_modules/@npmcli/fs/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/@npmcli/git": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "license": "ISC", "dependencies": { "@npmcli/promise-spawn": "^6.0.0", @@ -2467,6 +2757,8 @@ }, "node_modules/@npmcli/git/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "license": "ISC", "engines": { "node": ">=12" @@ -2497,6 +2789,8 @@ }, "node_modules/@npmcli/git/node_modules/which": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -2510,6 +2804,8 @@ }, "node_modules/@npmcli/git/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/@npmcli/installed-package-contents": { @@ -2561,6 +2857,8 @@ }, "node_modules/@npmcli/metavuln-calculator": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.1.tgz", + "integrity": "sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q==", "license": "ISC", "dependencies": { "cacache": "^17.0.0", @@ -2604,10 +2902,14 @@ }, "node_modules/@npmcli/metavuln-calculator/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/@npmcli/name-from-folder": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", + "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -2615,6 +2917,8 @@ }, "node_modules/@npmcli/node-gyp": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -2664,6 +2968,8 @@ }, "node_modules/@npmcli/promise-spawn": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", "license": "ISC", "dependencies": { "which": "^3.0.0" @@ -2674,6 +2980,8 @@ }, "node_modules/@npmcli/promise-spawn/node_modules/which": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -2697,6 +3005,8 @@ }, "node_modules/@npmcli/run-script": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^3.0.0", @@ -2711,6 +3021,8 @@ }, "node_modules/@npmcli/run-script/node_modules/which": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -2724,6 +3036,8 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "license": "MIT", "optional": true, "engines": { @@ -2751,10 +3065,14 @@ }, "node_modules/@sphinxxxx/color-conversion": { "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz", + "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==", "license": "ISC" }, "node_modules/@tootallnate/once": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "license": "MIT", "engines": { "node": ">= 10" @@ -2762,6 +3080,8 @@ }, "node_modules/@tufjs/canonical-json": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -2769,6 +3089,8 @@ }, "node_modules/@tufjs/models": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", "license": "MIT", "dependencies": { "@tufjs/canonical-json": "1.0.0", @@ -2791,8 +3113,9 @@ "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "dev": true, + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "license": "MIT" }, "node_modules/@types/linkify-it": { @@ -2824,11 +3147,41 @@ "version": "20.11.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.13.tgz", "integrity": "sha512-5G4zQwdiQBSWYTDAH1ctw2eidqdhMJaNsiIDKHFr55ihz5Trl2qqR8fdrT732yPBho5gkNxXm67OxWFBqX9aPg==", - "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, + "node_modules/@types/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/node-fetch/node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -2842,8 +3195,16 @@ "integrity": "sha512-FKvKIqRaykZtd4n47LbK/W/5fhQQ1X7cxxzG9A48h0BGN+S04NH7ervcCjM8tyR0lyGru83FAHSmw2ObgKoESg==", "dev": true }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "license": "MIT" + }, "node_modules/@ungap/custom-elements": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/custom-elements/-/custom-elements-1.3.0.tgz", + "integrity": "sha512-f4q/s76+8nOy+fhrNHyetuoPDR01lmlZB5czfCG+OOnBw/Wf+x48DcCDPmMQY7oL8xYFL8qfenMoiS8DUkKBUw==", "license": "ISC" }, "node_modules/@webassemblyjs/ast": { @@ -3009,6 +3370,8 @@ }, "node_modules/@webpack-cli/configtest": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, "license": "MIT", "engines": { @@ -3021,6 +3384,8 @@ }, "node_modules/@webpack-cli/info": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, "license": "MIT", "engines": { @@ -3033,6 +3398,8 @@ }, "node_modules/@webpack-cli/serve": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, "license": "MIT", "engines": { @@ -3073,10 +3440,14 @@ }, "node_modules/abbrev": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "license": "ISC" }, "node_modules/abort-controller": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" @@ -3087,6 +3458,8 @@ }, "node_modules/accepts": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "license": "MIT", "dependencies": { "mime-types": "~2.1.34", @@ -3119,6 +3492,8 @@ }, "node_modules/agent-base": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "license": "MIT", "dependencies": { "debug": "4" @@ -3141,6 +3516,8 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", @@ -3166,6 +3543,8 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -3215,10 +3594,14 @@ }, "node_modules/ansi": { "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "integrity": "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A==", "license": "MIT" }, "node_modules/ansi-escapes": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "license": "MIT", "engines": { "node": ">=4" @@ -3226,6 +3609,8 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", "engines": { "node": ">=8" @@ -3233,6 +3618,8 @@ }, "node_modules/ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "license": "MIT", "dependencies": { "color-convert": "^1.9.0" @@ -3243,6 +3630,8 @@ }, "node_modules/anymatch": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "license": "ISC", "dependencies": { @@ -3255,6 +3644,8 @@ }, "node_modules/aproba": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "license": "ISC" }, "node_modules/are-we-there-yet": { @@ -3288,6 +3679,8 @@ }, "node_modules/array-find-index": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -3295,10 +3688,14 @@ }, "node_modules/array-flatten": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, "node_modules/array-union": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "license": "MIT", "engines": { "node": ">=8" @@ -3306,6 +3703,8 @@ }, "node_modules/asn1": { "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "license": "MIT", "dependencies": { "safer-buffer": "~2.1.0" @@ -3313,6 +3712,8 @@ }, "node_modules/assert-plus": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "license": "MIT", "engines": { "node": ">=0.8" @@ -3320,6 +3721,8 @@ }, "node_modules/async": { "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "license": "MIT", "dependencies": { "lodash": "^4.17.14" @@ -3327,10 +3730,14 @@ }, "node_modules/asynckit": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, "node_modules/atomically": { "version": "1.7.0", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", + "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", "license": "MIT", "engines": { "node": ">=10.12.0" @@ -3376,10 +3783,14 @@ }, "node_modules/autosize": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/autosize/-/autosize-6.0.1.tgz", + "integrity": "sha512-f86EjiUKE6Xvczc4ioP1JBlWG7FKrE13qe/DxBCpe8GCipCq2nFw73aO8QEBKHfSbYGDN5eB9jXWKen7tspDqQ==", "license": "MIT" }, "node_modules/aws-sign2": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "license": "Apache-2.0", "engines": { "node": "*" @@ -3450,10 +3861,14 @@ }, "node_modules/balanced-match": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -3472,6 +3887,8 @@ }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "license": "BSD-3-Clause", "dependencies": { "tweetnacl": "^0.14.3" @@ -3486,6 +3903,8 @@ }, "node_modules/big.js": { "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, "license": "MIT", "engines": { @@ -3517,6 +3936,8 @@ }, "node_modules/bin-links/node_modules/write-file-atomic": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", @@ -3591,6 +4012,8 @@ }, "node_modules/bplist-parser": { "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", "license": "MIT", "dependencies": { "big-integer": "1.6.x" @@ -3601,6 +4024,8 @@ }, "node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -3709,6 +4134,8 @@ }, "node_modules/builtins/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/bytes": { @@ -3761,6 +4188,8 @@ }, "node_modules/cacache/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "license": "ISC", "engines": { "node": ">=12" @@ -3784,13 +4213,40 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001621", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001621.tgz", @@ -3814,10 +4270,14 @@ }, "node_modules/caseless": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "license": "Apache-2.0" }, "node_modules/chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", @@ -3830,6 +4290,8 @@ }, "node_modules/chalk/node_modules/escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -3837,6 +4299,8 @@ }, "node_modules/chardet": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "license": "MIT" }, "node_modules/chevrotain": { @@ -3893,6 +4357,8 @@ }, "node_modules/chownr": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "license": "ISC", "engines": { "node": ">=10" @@ -3908,6 +4374,8 @@ }, "node_modules/clean-stack": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "license": "MIT", "engines": { "node": ">=6" @@ -3915,6 +4383,8 @@ }, "node_modules/cli-cursor": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "license": "MIT", "dependencies": { "restore-cursor": "^2.0.0" @@ -3925,10 +4395,14 @@ }, "node_modules/cli-width": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", "license": "ISC" }, "node_modules/cliui": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -3941,6 +4415,8 @@ }, "node_modules/clone-deep": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3961,6 +4437,8 @@ }, "node_modules/color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "license": "MIT", "dependencies": { "color-name": "1.1.3" @@ -3968,10 +4446,14 @@ }, "node_modules/color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "license": "MIT" }, "node_modules/color-support": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "license": "ISC", "bin": { "color-support": "bin.js" @@ -3984,6 +4466,8 @@ }, "node_modules/combined-stream": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -4004,6 +4488,8 @@ }, "node_modules/common-ancestor-path": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", "license": "ISC" }, "node_modules/common-path-prefix": { @@ -4040,6 +4526,8 @@ }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -4047,14 +4535,20 @@ }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, "node_modules/conf": { "version": "10.2.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", + "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", "license": "MIT", "dependencies": { "ajv": "^8.6.3", @@ -4077,6 +4571,8 @@ }, "node_modules/conf/node_modules/dot-prop": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", "license": "MIT", "dependencies": { "is-obj": "^2.0.0" @@ -4113,10 +4609,14 @@ }, "node_modules/conf/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/configstore": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "license": "BSD-2-Clause", "dependencies": { "dot-prop": "^5.2.0", @@ -4132,6 +4632,8 @@ }, "node_modules/configstore/node_modules/make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "license": "MIT", "dependencies": { "semver": "^6.0.0" @@ -4145,10 +4647,23 @@ }, "node_modules/console-control-strings": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "license": "ISC" }, + "node_modules/console-table-printer": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/console-table-printer/-/console-table-printer-2.14.0.tgz", + "integrity": "sha512-zrY29NkhSoY9SxEynJVWk6zuuI2tGnlS00+Jx+EWkp6QTsyj8W/Zc20awiqVvPj73oP5kX6w5uDW9rle5IznYw==", + "license": "MIT", + "dependencies": { + "simple-wcswidth": "^1.0.1" + } + }, "node_modules/content-disposition": { "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -4159,6 +4674,8 @@ }, "node_modules/content-disposition/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -4199,10 +4716,14 @@ }, "node_modules/cookie-signature": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, "node_modules/cordova": { "version": "12.0.0", + "resolved": "https://registry.npmjs.org/cordova/-/cordova-12.0.0.tgz", + "integrity": "sha512-D0gGDsaXlmafWxVZExJo6jO8AEVLYBe12Qghjx4zz8XfNhSUe3cInm4TyDZoxB2hFom73eLxIbomYOb0J6tutw==", "license": "Apache-2.0", "dependencies": { "configstore": "^5.0.1", @@ -4306,10 +4827,14 @@ }, "node_modules/cordova-app-hello-world": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cordova-app-hello-world/-/cordova-app-hello-world-6.0.0.tgz", + "integrity": "sha512-wPZsm+fzNUwdiTRODT+fQuPV410RNmd3Buiw63vT8BPxjC+cn6Bu8emrgwrDM4pbmU5sa5Unwu3xPcbQGQ3G3g==", "license": "Apache-2.0" }, "node_modules/cordova-clipboard": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/cordova-clipboard/-/cordova-clipboard-1.3.0.tgz", + "integrity": "sha512-IGk4LZm/DJ0Xk/jgakHm4wa+A/lrRP3QfzMAHDG7oWLJS4ISOpfI32Wez4ndnENItRslGyBVyJyKD83CxELCAw==", "dev": true, "license": "MIT" }, @@ -4338,6 +4863,8 @@ }, "node_modules/cordova-create": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cordova-create/-/cordova-create-5.0.0.tgz", + "integrity": "sha512-jFc+vbh6Xx2DciI0/RFzLOB0X7YOiiDv9kjDfoq+jqh+TRZDYOuES19F1ZkwgDTJGnwUO0HoMIswiiTy45Royw==", "license": "Apache-2.0", "dependencies": { "cordova-app-hello-world": "^6.0.0", @@ -4358,6 +4885,8 @@ }, "node_modules/cordova-create/node_modules/isobject": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -4365,6 +4894,8 @@ }, "node_modules/cordova-fetch": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cordova-fetch/-/cordova-fetch-4.0.0.tgz", + "integrity": "sha512-aymq5lEwv6Y1n+FYoeRK/fCsyrMP2CBh5lo2o8NUO4MG68ws2QC+C5Xwju9kezQzEatg+9Gg2wrw5kGI+nmhXA==", "license": "Apache-2.0", "dependencies": { "@npmcli/arborist": "^6.2.5", @@ -4395,6 +4926,8 @@ }, "node_modules/cordova-fetch/node_modules/pify": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", "license": "MIT", "engines": { "node": ">=10" @@ -4418,6 +4951,8 @@ }, "node_modules/cordova-fetch/node_modules/which": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -4431,6 +4966,8 @@ }, "node_modules/cordova-fetch/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/cordova-lib": { @@ -4470,6 +5007,8 @@ }, "node_modules/cordova-lib/node_modules/pify": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", "license": "MIT", "engines": { "node": ">=10" @@ -4503,6 +5042,8 @@ }, "node_modules/cordova-lib/node_modules/write-file-atomic": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", @@ -4514,6 +5055,8 @@ }, "node_modules/cordova-lib/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/cordova-plugin-advanced-http": { @@ -4535,6 +5078,8 @@ }, "node_modules/cordova-plugin-buildinfo": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-buildinfo/-/cordova-plugin-buildinfo-4.0.0.tgz", + "integrity": "sha512-2Sl4sgr9L0vXryd6ZTWecs0+w3SlYM5iQPUPMwpkryaEo9MIbYvQoiVTosKpzHAyKSho4uTSQT9d2acosVVnFw==", "dev": true, "license": "MIT", "engines": { @@ -4573,6 +5118,8 @@ }, "node_modules/cordova-plugin-device": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-device/-/cordova-plugin-device-2.1.0.tgz", + "integrity": "sha512-FU0Lw1jZpuKOgG4v80LrfMAOIMCGfAVPumn7AwaX9S1iU/X3OPZUyoKUgP09q4bxL35IeNPkqNWVKYduAXZ1sg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4632,6 +5179,8 @@ }, "node_modules/cordova-serve": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cordova-serve/-/cordova-serve-4.0.1.tgz", + "integrity": "sha512-YbfXaZ60yr5dkqmDFQgrU7TSKnzCqYsxHgIUzDeX8RggZb6mz1F9jMfUBbaYyaU7JjcuJ0aoRPYLvwSGQVhGkw==", "license": "Apache-2.0", "dependencies": { "chalk": "^3.0.0", @@ -4647,6 +5196,8 @@ }, "node_modules/cordova-serve/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -4660,6 +5211,8 @@ }, "node_modules/cordova-serve/node_modules/chalk": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -4671,6 +5224,8 @@ }, "node_modules/cordova-serve/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -4681,10 +5236,14 @@ }, "node_modules/cordova-serve/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/cordova-serve/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -4692,6 +5251,8 @@ }, "node_modules/cordova-serve/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -4700,6 +5261,23 @@ "node": ">=8" } }, + "node_modules/cordova-sqlite-storage": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cordova-sqlite-storage/-/cordova-sqlite-storage-7.0.0.tgz", + "integrity": "sha512-BV1KCNtHnFD37ZQmhztStKsaNxniGlLcUSiQ9wieWH2PpZ0gH/tuWeINrrXGKIt9teTukYRnxFyerQ/Lc9x41A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cordova-sqlite-storage-dependencies": "5.0.0" + } + }, + "node_modules/cordova-sqlite-storage-dependencies": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cordova-sqlite-storage-dependencies/-/cordova-sqlite-storage-dependencies-5.0.0.tgz", + "integrity": "sha512-WjWm1QX+2JyLxjaNmYX2kNzmhrRk8q6n4GQ1PkUc79xR2bmJeO/m3koSuPemnWJdLdlsqDz8dCEHmgQSxhYjcg==", + "dev": true, + "license": "MIT" + }, "node_modules/cordova/node_modules/lru-cache": { "version": "6.0.0", "license": "ISC", @@ -4725,6 +5303,8 @@ }, "node_modules/cordova/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/core-js": { @@ -4764,6 +5344,8 @@ }, "node_modules/core-util-is": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, "node_modules/cosmiconfig": { @@ -4812,6 +5394,8 @@ }, "node_modules/crypto-random-string": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "license": "MIT", "engines": { "node": ">=8" @@ -4880,11 +5464,15 @@ }, "node_modules/css-loader/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "license": "ISC" }, "node_modules/cssesc": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "license": "MIT", "bin": { "cssesc": "bin/cssesc" @@ -4895,6 +5483,8 @@ }, "node_modules/currently-unhandled": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", "license": "MIT", "dependencies": { "array-find-index": "^1.0.1" @@ -4905,6 +5495,8 @@ }, "node_modules/dashdash": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" @@ -4915,6 +5507,8 @@ }, "node_modules/debounce-fn": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", "license": "MIT", "dependencies": { "mimic-fn": "^3.0.0" @@ -4928,6 +5522,8 @@ }, "node_modules/debounce-fn/node_modules/mimic-fn": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", "license": "MIT", "engines": { "node": ">=8" @@ -4948,8 +5544,19 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/dedent": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "license": "MIT" }, "node_modules/define-data-property": { @@ -4970,6 +5577,8 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", "engines": { "node": ">=0.4.0" @@ -4977,19 +5586,27 @@ }, "node_modules/delegates": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "license": "MIT" }, "node_modules/dep-graph": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dep-graph/-/dep-graph-1.1.0.tgz", + "integrity": "sha512-/6yUWlSH0Uevjj6HWvO86rDeFzuYfzbaKDqifTEemwfwEPyBrODTb3ox/jFzqmc2+UmgJ3IDMS88BKEBh1Nm2Q==", "dependencies": { "underscore": "1.2.1" } }, "node_modules/dep-graph/node_modules/underscore": { - "version": "1.2.1" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.2.1.tgz", + "integrity": "sha512-HRhh6FYh5I5/zTt7L9MnHRA/nlSFPiwymMCXEremmzT7tHR+8CNP0FXHPaUpafAPwvAlNrvZiH91kQwoo/CqUA==" }, "node_modules/depd": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5006,6 +5623,8 @@ }, "node_modules/detect-indent": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "license": "MIT", "engines": { "node": ">=8" @@ -5013,6 +5632,8 @@ }, "node_modules/detect-newline": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "license": "MIT", "engines": { "node": ">=8" @@ -5020,6 +5641,8 @@ }, "node_modules/dir-glob": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "license": "MIT", "dependencies": { "path-type": "^4.0.0" @@ -5039,6 +5662,8 @@ }, "node_modules/dot-prop": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "license": "MIT", "dependencies": { "is-obj": "^2.0.0" @@ -5047,12 +5672,30 @@ "node": ">=8" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, "node_modules/ecc-jsbn": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "license": "MIT", "dependencies": { "jsbn": "~0.1.0", @@ -5061,6 +5704,8 @@ }, "node_modules/editor": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/editor/-/editor-1.0.0.tgz", + "integrity": "sha512-SoRmbGStwNYHgKfjOrX2L0mUvp9bUVv0uPppZSOMAntEbcFtoC3MKF5b3T6HQPXKIV+QGY3xPO3JK5it5lVkuw==", "license": "MIT" }, "node_modules/ee-first": { @@ -5076,6 +5721,8 @@ }, "node_modules/elementtree": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", "license": "Apache-2.0", "dependencies": { "sax": "1.1.4" @@ -5086,10 +5733,14 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, "license": "MIT", "engines": { @@ -5106,6 +5757,8 @@ }, "node_modules/encoding": { "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "license": "MIT", "optional": true, "dependencies": { @@ -5114,6 +5767,8 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "license": "MIT", "dependencies": { "once": "^1.4.0" @@ -5121,6 +5776,8 @@ }, "node_modules/endent": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", + "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==", "license": "MIT", "dependencies": { "dedent": "^0.7.0", @@ -5154,6 +5811,8 @@ }, "node_modules/env-paths": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "license": "MIT", "engines": { "node": ">=6" @@ -5172,6 +5831,8 @@ }, "node_modules/err-code": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "license": "MIT" }, "node_modules/error-ex": { @@ -5184,12 +5845,10 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -5207,6 +5866,33 @@ "dev": true, "license": "MIT" }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escalade": { "version": "3.1.1", "license": "MIT", @@ -5221,6 +5907,8 @@ }, "node_modules/escape-string-regexp": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "license": "MIT", "engines": { "node": ">=12" @@ -5231,6 +5919,8 @@ }, "node_modules/eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5243,6 +5933,8 @@ }, "node_modules/esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -5254,6 +5946,8 @@ }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5265,6 +5959,8 @@ }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -5273,6 +5969,8 @@ }, "node_modules/estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -5281,6 +5979,8 @@ }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -5297,13 +5997,23 @@ }, "node_modules/event-target-shim": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, "node_modules/events": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", "engines": { "node": ">=0.8.x" @@ -5311,6 +6021,8 @@ }, "node_modules/execa": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", @@ -5381,6 +6093,8 @@ }, "node_modules/express/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -5388,10 +6102,14 @@ }, "node_modules/express/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -5410,10 +6128,14 @@ }, "node_modules/extend": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, "node_modules/external-editor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "license": "MIT", "dependencies": { "chardet": "^0.7.0", @@ -5426,6 +6148,8 @@ }, "node_modules/external-editor/node_modules/iconv-lite": { "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -5436,6 +6160,8 @@ }, "node_modules/external-editor/node_modules/tmp": { "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" @@ -5446,6 +6172,8 @@ }, "node_modules/extsprintf": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", "engines": [ "node >=0.6.0" ], @@ -5453,6 +6181,8 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-glob": { @@ -5473,14 +6203,20 @@ }, "node_modules/fast-json-parse": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", + "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==", "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, "license": "MIT", "engines": { @@ -5496,6 +6232,8 @@ }, "node_modules/figures": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" @@ -5506,6 +6244,8 @@ }, "node_modules/figures/node_modules/escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -5664,6 +6404,8 @@ }, "node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -5700,6 +6442,8 @@ }, "node_modules/forever-agent": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "license": "Apache-2.0", "engines": { "node": "*" @@ -5707,6 +6451,8 @@ }, "node_modules/form-data": { "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -5717,8 +6463,29 @@ "node": ">= 0.12" } }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", + "license": "MIT" + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "license": "MIT", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, "node_modules/forwarded": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5771,11 +6538,15 @@ }, "node_modules/fs-readdir-recursive": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true, "license": "MIT" }, "node_modules/fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "license": "ISC" }, "node_modules/fsevents": { @@ -5827,6 +6598,8 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", "engines": { @@ -5835,21 +6608,29 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -5858,8 +6639,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "license": "MIT", "engines": { "node": ">=10" @@ -5870,6 +6666,8 @@ }, "node_modules/getpass": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" @@ -5877,6 +6675,8 @@ }, "node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -5895,6 +6695,8 @@ }, "node_modules/glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -5912,6 +6714,8 @@ }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -5920,6 +6724,8 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -5940,6 +6746,8 @@ }, "node_modules/globby": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "license": "MIT", "dependencies": { "array-union": "^2.1.0", @@ -5958,17 +6766,20 @@ }, "node_modules/globby/node_modules/slash": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5982,6 +6793,8 @@ }, "node_modules/har-schema": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "license": "ISC", "engines": { "node": ">=4" @@ -5989,6 +6802,8 @@ }, "node_modules/har-validator": { "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "license": "MIT", "dependencies": { "ajv": "^6.12.3", @@ -6000,6 +6815,8 @@ }, "node_modules/har-validator/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -6014,6 +6831,8 @@ }, "node_modules/har-validator/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, "node_modules/has": { @@ -6028,6 +6847,8 @@ }, "node_modules/has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "license": "MIT", "engines": { "node": ">=4" @@ -6044,10 +6865,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6055,10 +6877,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -6068,6 +6894,8 @@ }, "node_modules/has-unicode": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "license": "ISC" }, "node_modules/hasown": { @@ -6093,6 +6921,8 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "license": "ISC", "engines": { "node": ">=12" @@ -6125,6 +6955,8 @@ }, "node_modules/http-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "license": "MIT", "dependencies": { "@tootallnate/once": "2", @@ -6137,6 +6969,8 @@ }, "node_modules/http-signature": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", @@ -6150,6 +6984,8 @@ }, "node_modules/https-proxy-agent": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "license": "MIT", "dependencies": { "agent-base": "6", @@ -6161,6 +6997,8 @@ }, "node_modules/human-signals": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "license": "Apache-2.0", "engines": { "node": ">=10.17.0" @@ -6168,6 +7006,8 @@ }, "node_modules/humanize-ms": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "license": "MIT", "dependencies": { "ms": "^2.0.0" @@ -6175,6 +7015,8 @@ }, "node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "optional": true, "dependencies": { @@ -6186,6 +7028,8 @@ }, "node_modules/icss-utils": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, "license": "ISC", "engines": { @@ -6232,6 +7076,8 @@ }, "node_modules/immediate": { "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "license": "MIT" }, "node_modules/immutable": { @@ -6273,6 +7119,8 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "license": "MIT", "engines": { "node": ">=0.8.19" @@ -6280,6 +7128,8 @@ }, "node_modules/indent-string": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "license": "MIT", "engines": { "node": ">=8" @@ -6287,6 +7137,8 @@ }, "node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -6295,6 +7147,8 @@ }, "node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/init-package-json": { @@ -6338,10 +7192,14 @@ }, "node_modules/init-package-json/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/inquirer": { "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "license": "MIT", "dependencies": { "ansi-escapes": "^3.2.0", @@ -6364,6 +7222,8 @@ }, "node_modules/inquirer/node_modules/ansi-regex": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "license": "MIT", "engines": { "node": ">=6" @@ -6371,6 +7231,8 @@ }, "node_modules/inquirer/node_modules/is-fullwidth-code-point": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "license": "MIT", "engines": { "node": ">=4" @@ -6378,6 +7240,8 @@ }, "node_modules/inquirer/node_modules/string-width": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "license": "MIT", "dependencies": { "is-fullwidth-code-point": "^2.0.0", @@ -6389,6 +7253,8 @@ }, "node_modules/inquirer/node_modules/string-width/node_modules/ansi-regex": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "license": "MIT", "engines": { "node": ">=4" @@ -6396,6 +7262,8 @@ }, "node_modules/inquirer/node_modules/string-width/node_modules/strip-ansi": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "license": "MIT", "dependencies": { "ansi-regex": "^3.0.0" @@ -6406,6 +7274,8 @@ }, "node_modules/inquirer/node_modules/strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "license": "MIT", "dependencies": { "ansi-regex": "^4.1.0" @@ -6416,6 +7286,8 @@ }, "node_modules/insight": { "version": "0.11.1", + "resolved": "https://registry.npmjs.org/insight/-/insight-0.11.1.tgz", + "integrity": "sha512-TBcZ0qC9dgdmcxL93OoqkY/RZXJtIi0i07phX/QyYk2ysmJtZex59dgTj4Doq50N9CG9dLRe/RIudc/5CCoFNw==", "license": "BSD-2-Clause", "dependencies": { "async": "^2.6.2", @@ -6434,6 +7306,8 @@ }, "node_modules/insight/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -6447,6 +7321,8 @@ }, "node_modules/insight/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -6461,6 +7337,8 @@ }, "node_modules/insight/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -6471,10 +7349,14 @@ }, "node_modules/insight/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/insight/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -6482,6 +7364,8 @@ }, "node_modules/insight/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -6492,6 +7376,8 @@ }, "node_modules/interpret": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, "license": "MIT", "engines": { @@ -6505,6 +7391,8 @@ }, "node_modules/ipaddr.js": { "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -6518,6 +7406,8 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", "dependencies": { @@ -6539,6 +7429,8 @@ }, "node_modules/is-docker": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "license": "MIT", "bin": { "is-docker": "cli.js" @@ -6552,6 +7444,8 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6559,6 +7453,8 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "engines": { "node": ">=8" @@ -6566,6 +7462,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -6576,6 +7474,8 @@ }, "node_modules/is-lambda": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "license": "MIT" }, "node_modules/is-number": { @@ -6588,6 +7488,8 @@ }, "node_modules/is-obj": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "license": "MIT", "engines": { "node": ">=8" @@ -6605,6 +7507,8 @@ }, "node_modules/is-plain-object": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "license": "MIT", "dependencies": { @@ -6616,6 +7520,8 @@ }, "node_modules/is-stream": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", "engines": { "node": ">=8" @@ -6626,10 +7532,14 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "license": "MIT" }, "node_modules/is-wsl": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "license": "MIT", "dependencies": { "is-docker": "^2.0.0" @@ -6640,14 +7550,20 @@ }, "node_modules/isarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "license": "MIT", "engines": { @@ -6656,6 +7572,8 @@ }, "node_modules/isstream": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "license": "MIT" }, "node_modules/jackspeak": { @@ -6737,6 +7655,15 @@ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==" }, + "node_modules/js-tiktoken": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.20.tgz", + "integrity": "sha512-Xlaqhhs8VfCd6Sh7a1cFkZHQbYTLCwVJJWiHVxBYzLPxW0XsoxBy1hitmjkdIjD3Aon5BXLHFwU5O8WUx6HH+A==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.5.1" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -6748,7 +7675,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -6758,6 +7684,8 @@ }, "node_modules/jsbn": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "license": "MIT" }, "node_modules/jsesc": { @@ -6775,23 +7703,33 @@ }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, "license": "MIT" }, "node_modules/json-schema": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "license": "(AFL-2.1 OR BSD-3-Clause)" }, "node_modules/json-schema-traverse": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, "node_modules/json-schema-typed": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==", "license": "BSD-2-Clause" }, "node_modules/json-stringify-nice": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", "license": "ISC", "funding": { "url": "https://github.com/sponsors/isaacs" @@ -6799,10 +7737,14 @@ }, "node_modules/json-stringify-safe": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "license": "ISC" }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { @@ -6814,6 +7756,8 @@ }, "node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -6824,13 +7768,26 @@ }, "node_modules/jsonparse": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "engines": [ "node >= 0.2.0" ], "license": "MIT" }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jsprim": { "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "license": "MIT", "dependencies": { "assert-plus": "1.0.0", @@ -6844,6 +7801,8 @@ }, "node_modules/jsprim/node_modules/extsprintf": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "engines": [ "node >=0.6.0" ], @@ -6851,6 +7810,8 @@ }, "node_modules/jszip": { "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "license": "(MIT OR GPL-3.0-or-later)", "dependencies": { "lie": "~3.3.0", @@ -6861,22 +7822,257 @@ }, "node_modules/just-diff": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", + "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", "license": "MIT" }, "node_modules/just-diff-apply": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", + "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", "license": "MIT" }, "node_modules/kind-of": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/langchain": { + "version": "0.3.27", + "resolved": "https://registry.npmjs.org/langchain/-/langchain-0.3.27.tgz", + "integrity": "sha512-XfOuXetMSpkS11Mt6YJkDmvuSGTMPUsks5DJz4RCZ3y2dcbLkOe5kecjx2SWVJYqQIqcMMwsjsve3/ZjnRe7rQ==", + "license": "MIT", + "dependencies": { + "@langchain/openai": ">=0.1.0 <0.6.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.3.29", + "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" + }, + "engines": { + "node": ">=18" + }, + "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": "*" + }, + "peerDependenciesMeta": { + "@langchain/anthropic": { + "optional": true + }, + "@langchain/aws": { + "optional": true + }, + "@langchain/cerebras": { + "optional": true + }, + "@langchain/cohere": { + "optional": true + }, + "@langchain/deepseek": { + "optional": true + }, + "@langchain/google-genai": { + "optional": true + }, + "@langchain/google-vertexai": { + "optional": true + }, + "@langchain/google-vertexai-web": { + "optional": true + }, + "@langchain/groq": { + "optional": true + }, + "@langchain/mistralai": { + "optional": true + }, + "@langchain/ollama": { + "optional": true + }, + "@langchain/xai": { + "optional": true + }, + "axios": { + "optional": true + }, + "cheerio": { + "optional": true + }, + "handlebars": { + "optional": true + }, + "peggy": { + "optional": true + }, + "typeorm": { + "optional": true + } + } + }, + "node_modules/langchain/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/langsmith": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.3.29.tgz", + "integrity": "sha512-JPF2B339qpYy9FyuY4Yz1aWYtgPlFc/a+VTj3L/JcFLHCiMP7+Ig8I9jO+o1QwVa+JU3iugL1RS0wwc+Glw0zA==", + "license": "MIT", + "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": "*" + }, + "peerDependenciesMeta": { + "openai": { + "optional": true + } + } + }, + "node_modules/langsmith/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/langsmith/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/langsmith/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/langsmith/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/langsmith/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/langsmith/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/langsmith/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/langsmith/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/lie": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "license": "MIT", "dependencies": { "immediate": "~3.0.5" @@ -6898,6 +8094,8 @@ }, "node_modules/loader-runner": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, "license": "MIT", "engines": { @@ -6906,6 +8104,8 @@ }, "node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "license": "MIT", "dependencies": { @@ -6919,6 +8119,8 @@ }, "node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -6930,6 +8132,8 @@ }, "node_modules/lodash": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, "node_modules/lodash-es": { @@ -6940,14 +8144,20 @@ }, "node_modules/lodash.debounce": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "license": "MIT" }, "node_modules/lodash.zip": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", "license": "MIT" }, "node_modules/loud-rejection": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-2.2.0.tgz", + "integrity": "sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ==", "license": "MIT", "dependencies": { "currently-unhandled": "^0.4.1", @@ -6969,6 +8179,8 @@ }, "node_modules/macos-release": { "version": "2.5.1", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", + "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", "license": "MIT", "engines": { "node": ">=6" @@ -6979,6 +8191,8 @@ }, "node_modules/make-dir": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "license": "MIT", "dependencies": { @@ -6991,6 +8205,8 @@ }, "node_modules/make-dir/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "license": "ISC", "bin": { @@ -6999,6 +8215,8 @@ }, "node_modules/make-fetch-happen": { "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", @@ -7023,6 +8241,8 @@ }, "node_modules/make-fetch-happen/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "license": "ISC", "engines": { "node": ">=12" @@ -7073,8 +8293,19 @@ "integrity": "sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==", "license": "ISC" }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/md5-file": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz", + "integrity": "sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw==", "license": "MIT", "bin": { "md5-file": "cli.js" @@ -7106,10 +8337,14 @@ }, "node_modules/merge-stream": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "license": "MIT", "engines": { "node": ">= 8" @@ -7117,6 +8352,8 @@ }, "node_modules/methods": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -7148,6 +8385,8 @@ }, "node_modules/mime-db": { "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -7155,6 +8394,8 @@ }, "node_modules/mime-types": { "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -7165,6 +8406,8 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", "engines": { "node": ">=6" @@ -7208,6 +8451,8 @@ }, "node_modules/minipass": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "license": "ISC", "engines": { "node": ">=8" @@ -7215,6 +8460,8 @@ }, "node_modules/minipass-collect": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -7225,6 +8472,8 @@ }, "node_modules/minipass-collect/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -7235,6 +8484,8 @@ }, "node_modules/minipass-collect/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/minipass-fetch": { @@ -7254,6 +8505,8 @@ }, "node_modules/minipass-flush": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -7264,6 +8517,8 @@ }, "node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -7274,6 +8529,8 @@ }, "node_modules/minipass-flush/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/minipass-json-stream": { @@ -7286,6 +8543,8 @@ }, "node_modules/minipass-json-stream/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -7296,10 +8555,14 @@ }, "node_modules/minipass-json-stream/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/minipass-pipeline": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -7310,6 +8573,8 @@ }, "node_modules/minipass-pipeline/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -7320,10 +8585,14 @@ }, "node_modules/minipass-pipeline/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/minipass-sized": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -7334,6 +8603,8 @@ }, "node_modules/minipass-sized/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -7344,10 +8615,14 @@ }, "node_modules/minipass-sized/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/minizlib": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "license": "MIT", "dependencies": { "minipass": "^3.0.0", @@ -7359,6 +8634,8 @@ }, "node_modules/minizlib/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -7369,10 +8646,14 @@ }, "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" @@ -7387,6 +8668,8 @@ }, "node_modules/mustache": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", "license": "MIT", "bin": { "mustache": "bin/mustache" @@ -7394,6 +8677,8 @@ }, "node_modules/mute-stream": { "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", "license": "ISC" }, "node_modules/nanoid": { @@ -7416,6 +8701,8 @@ }, "node_modules/negotiator": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -7423,9 +8710,51 @@ }, "node_modules/neo-async": { "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true, "license": "MIT" }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-gyp": { "version": "9.4.0", "license": "MIT", @@ -7451,6 +8780,8 @@ }, "node_modules/node-gyp/node_modules/are-we-there-yet": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "license": "ISC", "dependencies": { "delegates": "^1.0.0", @@ -7462,6 +8793,8 @@ }, "node_modules/node-gyp/node_modules/gauge": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", @@ -7489,6 +8822,8 @@ }, "node_modules/node-gyp/node_modules/nopt": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "license": "ISC", "dependencies": { "abbrev": "^1.0.0" @@ -7502,6 +8837,8 @@ }, "node_modules/node-gyp/node_modules/npmlog": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "license": "ISC", "dependencies": { "are-we-there-yet": "^3.0.0", @@ -7515,6 +8852,8 @@ }, "node_modules/node-gyp/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -7540,6 +8879,8 @@ }, "node_modules/node-gyp/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/node-releases": { @@ -7565,6 +8906,8 @@ }, "node_modules/nopt/node_modules/abbrev": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -7572,6 +8915,8 @@ }, "node_modules/normalize-package-data": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^6.0.0", @@ -7608,10 +8953,14 @@ }, "node_modules/normalize-package-data/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/normalize-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "license": "MIT", "engines": { @@ -7620,6 +8969,8 @@ }, "node_modules/normalize-range": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, "license": "MIT", "engines": { @@ -7671,10 +9022,14 @@ }, "node_modules/npm-install-checks/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/npm-normalize-package-bin": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -7682,6 +9037,8 @@ }, "node_modules/npm-package-arg": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", "license": "ISC", "dependencies": { "hosted-git-info": "^6.0.0", @@ -7718,10 +9075,14 @@ }, "node_modules/npm-package-arg/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/npm-packlist": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", "license": "ISC", "dependencies": { "ignore-walk": "^6.0.0" @@ -7768,10 +9129,14 @@ }, "node_modules/npm-pick-manifest/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/npm-registry-fetch": { "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "license": "ISC", "dependencies": { "make-fetch-happen": "^11.0.0", @@ -7788,6 +9153,8 @@ }, "node_modules/npm-run-path": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "license": "MIT", "dependencies": { "path-key": "^3.0.0" @@ -7798,6 +9165,8 @@ }, "node_modules/npmlog": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-7.0.1.tgz", + "integrity": "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==", "license": "ISC", "dependencies": { "are-we-there-yet": "^4.0.0", @@ -7811,6 +9180,8 @@ }, "node_modules/oauth-sign": { "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "license": "Apache-2.0", "engines": { "node": "*" @@ -7829,6 +9200,8 @@ }, "node_modules/objectorarray": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz", + "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==", "license": "ISC" }, "node_modules/on-finished": { @@ -7844,6 +9217,8 @@ }, "node_modules/on-headers": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -7851,6 +9226,8 @@ }, "node_modules/once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -7858,6 +9235,8 @@ }, "node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" @@ -7871,6 +9250,8 @@ }, "node_modules/open": { "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "license": "MIT", "dependencies": { "is-docker": "^2.0.0", @@ -7883,8 +9264,55 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openai": { + "version": "4.104.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.104.0.tgz", + "integrity": "sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==", + "license": "Apache-2.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" + }, + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/openai/node_modules/@types/node": { + "version": "18.19.108", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.108.tgz", + "integrity": "sha512-JZv9uwGYYtfcsO7B99KszTlNhvrIWqsRy7Xjp5Hr7ZFj7DSlsxIi0zJfibe/1xtPn6kEEbfMjH2lbsubwa81pQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "license": "MIT" + }, "node_modules/os-name": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", + "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", "license": "MIT", "dependencies": { "macos-release": "^2.5.0", @@ -7899,6 +9327,8 @@ }, "node_modules/os-tmpdir": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7906,6 +9336,8 @@ }, "node_modules/p-finally": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "license": "MIT", "engines": { "node": ">=4" @@ -7913,6 +9345,8 @@ }, "node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "license": "MIT", "dependencies": { "p-try": "^2.0.0" @@ -7926,6 +9360,8 @@ }, "node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -7937,6 +9373,8 @@ }, "node_modules/p-map": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" @@ -7948,8 +9386,60 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "license": "MIT", "engines": { "node": ">=6" @@ -7957,6 +9447,8 @@ }, "node_modules/pacote": { "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", "license": "ISC", "dependencies": { "@npmcli/git": "^4.0.0", @@ -7987,10 +9479,14 @@ }, "node_modules/pako": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -8001,6 +9497,8 @@ }, "node_modules/parse-conflict-json": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", + "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", "license": "ISC", "dependencies": { "json-parse-even-better-errors": "^3.0.0", @@ -8046,11 +9544,15 @@ }, "node_modules/path-browserify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "dev": true, "license": "MIT" }, "node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -8059,6 +9561,8 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8066,10 +9570,14 @@ }, "node_modules/path-is-inside": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", "license": "(WTFPL OR MIT)" }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", "engines": { "node": ">=8" @@ -8077,6 +9585,8 @@ }, "node_modules/path-parse": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, "node_modules/path-scurry": { @@ -8107,6 +9617,8 @@ }, "node_modules/path-type": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "license": "MIT", "engines": { "node": ">=8" @@ -8114,6 +9626,8 @@ }, "node_modules/performance-now": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "license": "MIT" }, "node_modules/picocolors": { @@ -8123,6 +9637,8 @@ }, "node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -8133,6 +9649,8 @@ }, "node_modules/pify": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "license": "MIT", "engines": { "node": ">=6" @@ -8140,6 +9658,8 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8151,6 +9671,8 @@ }, "node_modules/pkg-up": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "license": "MIT", "dependencies": { "find-up": "^3.0.0" @@ -8161,6 +9683,8 @@ }, "node_modules/pkg-up/node_modules/find-up": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "license": "MIT", "dependencies": { "locate-path": "^3.0.0" @@ -8171,6 +9695,8 @@ }, "node_modules/pkg-up/node_modules/locate-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "license": "MIT", "dependencies": { "p-locate": "^3.0.0", @@ -8182,6 +9708,8 @@ }, "node_modules/pkg-up/node_modules/p-locate": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "license": "MIT", "dependencies": { "p-limit": "^2.0.0" @@ -8192,6 +9720,8 @@ }, "node_modules/pkg-up/node_modules/path-exists": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "license": "MIT", "engines": { "node": ">=4" @@ -8297,6 +9827,8 @@ }, "node_modules/postcss-loader/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "license": "ISC" }, @@ -8349,6 +9881,8 @@ }, "node_modules/postcss-modules-values": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, "license": "ISC", "dependencies": { @@ -8374,6 +9908,8 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true, "license": "MIT" }, @@ -8405,6 +9941,8 @@ }, "node_modules/proc-log": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -8419,10 +9957,14 @@ }, "node_modules/process-nextick-args": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "license": "MIT" }, "node_modules/promise-all-reject-late": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", + "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", "license": "ISC", "funding": { "url": "https://github.com/sponsors/isaacs" @@ -8430,6 +9972,8 @@ }, "node_modules/promise-call-limit": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.2.tgz", + "integrity": "sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==", "license": "ISC", "funding": { "url": "https://github.com/sponsors/isaacs" @@ -8437,10 +9981,14 @@ }, "node_modules/promise-inflight": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "license": "ISC" }, "node_modules/promise-retry": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "license": "MIT", "dependencies": { "err-code": "^2.0.2", @@ -8472,6 +10020,8 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -8510,6 +10060,8 @@ }, "node_modules/q": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", "license": "MIT", "engines": { "node": ">=0.6.0", @@ -8532,10 +10084,14 @@ }, "node_modules/querystringify": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -8604,6 +10160,8 @@ }, "node_modules/raw-loader": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", "dev": true, "license": "MIT", "dependencies": { @@ -8623,6 +10181,8 @@ }, "node_modules/raw-loader/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -8638,6 +10198,8 @@ }, "node_modules/raw-loader/node_modules/ajv-keywords": { "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -8646,6 +10208,8 @@ }, "node_modules/raw-loader/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, @@ -8678,6 +10242,8 @@ }, "node_modules/read-chunk": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz", + "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==", "license": "MIT", "dependencies": { "pify": "^4.0.1", @@ -8689,6 +10255,8 @@ }, "node_modules/read-cmd-shim": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", + "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -8696,6 +10264,8 @@ }, "node_modules/read-package-json": { "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", "license": "ISC", "dependencies": { "glob": "^10.2.2", @@ -8709,6 +10279,8 @@ }, "node_modules/read-package-json-fast": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "license": "ISC", "dependencies": { "json-parse-even-better-errors": "^3.0.0", @@ -8774,6 +10346,8 @@ }, "node_modules/readdirp": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", "dependencies": { @@ -8785,6 +10359,8 @@ }, "node_modules/rechoir": { "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8796,6 +10372,8 @@ }, "node_modules/regenerate": { "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true, "license": "MIT" }, @@ -8861,6 +10439,8 @@ }, "node_modules/request": { "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "license": "Apache-2.0", "dependencies": { "aws-sign2": "~0.7.0", @@ -8890,6 +10470,8 @@ }, "node_modules/request/node_modules/qs": { "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.6" @@ -8897,6 +10479,8 @@ }, "node_modules/request/node_modules/tough-cookie": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.28", @@ -8908,6 +10492,8 @@ }, "node_modules/request/node_modules/uuid": { "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "license": "MIT", "bin": { "uuid": "bin/uuid" @@ -8915,6 +10501,8 @@ }, "node_modules/require-directory": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8922,6 +10510,8 @@ }, "node_modules/require-from-string": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8929,6 +10519,8 @@ }, "node_modules/requires-port": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "license": "MIT" }, "node_modules/resolve": { @@ -8948,6 +10540,8 @@ }, "node_modules/resolve-cwd": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "license": "MIT", "dependencies": { @@ -8959,6 +10553,8 @@ }, "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { @@ -8967,6 +10563,8 @@ }, "node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "license": "MIT", "engines": { "node": ">=4" @@ -8974,6 +10572,8 @@ }, "node_modules/restore-cursor": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "license": "MIT", "dependencies": { "onetime": "^2.0.0", @@ -8985,6 +10585,8 @@ }, "node_modules/restore-cursor/node_modules/mimic-fn": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "license": "MIT", "engines": { "node": ">=4" @@ -8992,6 +10594,8 @@ }, "node_modules/restore-cursor/node_modules/onetime": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "license": "MIT", "dependencies": { "mimic-fn": "^1.0.0" @@ -9002,6 +10606,8 @@ }, "node_modules/retry": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "license": "MIT", "engines": { "node": ">= 4" @@ -9017,6 +10623,8 @@ }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -9030,6 +10638,8 @@ }, "node_modules/run-async": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "license": "MIT", "engines": { "node": ">=0.12.0" @@ -9037,6 +10647,8 @@ }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", @@ -9058,6 +10670,8 @@ }, "node_modules/rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" @@ -9068,10 +10682,14 @@ }, "node_modules/safe-buffer": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/sass": { @@ -9135,6 +10753,8 @@ }, "node_modules/sax": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", "license": "ISC" }, "node_modules/schema-utils": { @@ -9157,6 +10777,8 @@ }, "node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -9236,6 +10858,8 @@ }, "node_modules/set-blocking": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "license": "ISC" }, "node_modules/set-function-length": { @@ -9256,6 +10880,8 @@ }, "node_modules/setimmediate": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "license": "MIT" }, "node_modules/setprototypeof": { @@ -9265,6 +10891,8 @@ }, "node_modules/shallow-clone": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, "license": "MIT", "dependencies": { @@ -9276,6 +10904,8 @@ }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -9286,6 +10916,8 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { "node": ">=8" @@ -9310,6 +10942,8 @@ }, "node_modules/signal-exit": { "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, "node_modules/sigstore": { @@ -9328,8 +10962,16 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/simple-wcswidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-wcswidth/-/simple-wcswidth-1.0.1.tgz", + "integrity": "sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==", + "license": "MIT" + }, "node_modules/slash": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true, "license": "MIT", "engines": { @@ -9338,6 +10980,8 @@ }, "node_modules/smart-buffer": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "license": "MIT", "engines": { "node": ">= 6.0.0", @@ -9358,6 +11002,8 @@ }, "node_modules/socks-proxy-agent": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "license": "MIT", "dependencies": { "agent-base": "^6.0.2", @@ -9397,6 +11043,8 @@ }, "node_modules/spdx-correct": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", @@ -9409,6 +11057,8 @@ }, "node_modules/spdx-expression-parse": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", @@ -9462,6 +11112,8 @@ }, "node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -9479,6 +11131,8 @@ }, "node_modules/string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -9492,6 +11146,8 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -9504,10 +11160,14 @@ }, "node_modules/stringify-package": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", + "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", "license": "ISC" }, "node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -9519,6 +11179,8 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -9529,6 +11191,8 @@ }, "node_modules/strip-bom": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "license": "MIT", "engines": { "node": ">=8" @@ -9536,6 +11200,8 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "license": "MIT", "engines": { "node": ">=6" @@ -9560,6 +11226,8 @@ }, "node_modules/supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "license": "MIT", "dependencies": { "has-flag": "^3.0.0" @@ -9570,6 +11238,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -9629,6 +11299,8 @@ }, "node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -9639,6 +11311,8 @@ }, "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -9649,6 +11323,8 @@ }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/terser": { @@ -9760,6 +11436,8 @@ }, "node_modules/through": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "license": "MIT" }, "node_modules/tmp": { @@ -9814,13 +11492,23 @@ }, "node_modules/tough-cookie/node_modules/universalify": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "license": "MIT", "engines": { "node": ">= 4.0.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/treeverse": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", + "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -9828,6 +11516,8 @@ }, "node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, "node_modules/tuf-js": { @@ -9844,6 +11534,8 @@ }, "node_modules/tunnel-agent": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" @@ -9854,6 +11546,8 @@ }, "node_modules/tweetnacl": { "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "license": "Unlicense" }, "node_modules/type-is": { @@ -9870,6 +11564,8 @@ }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" @@ -9883,8 +11579,7 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -9896,6 +11591,8 @@ }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9916,6 +11613,8 @@ }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, "license": "MIT", "engines": { @@ -9924,6 +11623,8 @@ }, "node_modules/unique-filename": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "license": "ISC", "dependencies": { "unique-slug": "^4.0.0" @@ -9934,6 +11635,8 @@ }, "node_modules/unique-slug": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" @@ -9944,6 +11647,8 @@ }, "node_modules/unique-string": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "license": "MIT", "dependencies": { "crypto-random-string": "^2.0.0" @@ -10008,6 +11713,8 @@ }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -10015,6 +11722,8 @@ }, "node_modules/url-parse": { "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "license": "MIT", "dependencies": { "querystringify": "^2.1.1", @@ -10023,10 +11732,14 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "license": "MIT", "engines": { "node": ">= 0.4.0" @@ -10034,6 +11747,8 @@ }, "node_modules/uuid": { "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -10041,10 +11756,14 @@ }, "node_modules/valid-identifier": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/valid-identifier/-/valid-identifier-0.0.2.tgz", + "integrity": "sha512-zaSmOW6ykXwrkX0YTuFUSoALNEKGaQHpxBJQLb3TXspRNDpBwbfrIQCZqAQ0LKBlKuyn2YOq7NNd6415hvZ33g==", "license": "Apache-2.0" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", @@ -10072,6 +11791,8 @@ }, "node_modules/vary": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -10079,6 +11800,8 @@ }, "node_modules/verror": { "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "engines": [ "node >=0.6.0" ], @@ -10091,10 +11814,14 @@ }, "node_modules/verror/node_modules/core-util-is": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "license": "MIT" }, "node_modules/walk-up-path": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", "license": "ISC" }, "node_modules/watchpack": { @@ -10111,6 +11838,21 @@ "node": ">=10.13.0" } }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, "node_modules/webpack": { "version": "5.94.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", @@ -10159,6 +11901,8 @@ }, "node_modules/webpack-cli": { "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, "license": "MIT", "dependencies": { @@ -10203,6 +11947,8 @@ }, "node_modules/webpack-cli/node_modules/commander": { "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, "license": "MIT", "engines": { @@ -10231,6 +11977,8 @@ }, "node_modules/webpack/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -10246,6 +11994,8 @@ }, "node_modules/webpack/node_modules/ajv-keywords": { "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -10254,6 +12004,8 @@ }, "node_modules/webpack/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, @@ -10274,8 +12026,20 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -10289,6 +12053,8 @@ }, "node_modules/wide-align": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "license": "ISC", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" @@ -10301,6 +12067,8 @@ }, "node_modules/windows-release": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", + "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", "license": "MIT", "dependencies": { "execa": "^4.0.2" @@ -10314,6 +12082,8 @@ }, "node_modules/windows-release/node_modules/execa": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.0", @@ -10335,6 +12105,8 @@ }, "node_modules/windows-release/node_modules/get-stream": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "license": "MIT", "dependencies": { "pump": "^3.0.0" @@ -10348,6 +12120,8 @@ }, "node_modules/windows-release/node_modules/human-signals": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "license": "Apache-2.0", "engines": { "node": ">=8.12.0" @@ -10355,6 +12129,8 @@ }, "node_modules/with-open-file": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz", + "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==", "license": "MIT", "dependencies": { "p-finally": "^1.0.0", @@ -10367,6 +12143,8 @@ }, "node_modules/wrap-ansi": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -10383,6 +12161,8 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -10398,6 +12178,8 @@ }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -10411,6 +12193,8 @@ }, "node_modules/wrap-ansi-cjs/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -10421,10 +12205,14 @@ }, "node_modules/wrap-ansi-cjs/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -10438,6 +12226,8 @@ }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -10448,14 +12238,20 @@ }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/write-file-atomic": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", @@ -10466,6 +12262,8 @@ }, "node_modules/xdg-basedir": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "license": "MIT", "engines": { "node": ">=8" @@ -10482,6 +12280,8 @@ }, "node_modules/y18n": { "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", "engines": { "node": ">=10" @@ -10494,8 +12294,22 @@ "dev": true, "license": "ISC" }, + "node_modules/yaml": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, "node_modules/yargs": { "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "license": "MIT", "dependencies": { "cliui": "^8.0.1", @@ -10512,6 +12326,8 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "license": "ISC", "engines": { "node": ">=12" @@ -10529,6 +12345,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "3.25.42", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.42.tgz", + "integrity": "sha512-PcALTLskaucbeHc41tU/xfjfhcz8z0GdhhDcSgrCTmSazUuqnYqiXO63M0QUBVwpBlsLsNVn5qHSC5Dw3KZvaQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, "src/plugins/browser": { "name": "cordova-plugin-browser", "version": "1.0.0", diff --git a/package.json b/package.json index 9be678a28..0786713d9 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,8 @@ "cordova-plugin-system": {}, "cordova-plugin-advanced-http": { "ANDROIDBLACKLISTSECURESOCKETPROTOCOLS": "SSLv3,TLSv1" - } + }, + "cordova-sqlite-storage": {} }, "platforms": [ "android" @@ -74,6 +75,7 @@ "cordova-plugin-server": "file:src/plugins/server", "cordova-plugin-sftp": "file:src/plugins/sftp", "cordova-plugin-system": "file:src/plugins/system", + "cordova-sqlite-storage": "^7.0.0", "css-loader": "^7.1.2", "mini-css-extract-plugin": "^2.9.0", "path-browserify": "^1.0.1", @@ -92,6 +94,7 @@ "@langchain/core": "^0.3.57", "@langchain/google-genai": "^0.2.10", "@langchain/langgraph": "^0.2.74", + "@langchain/langgraph-swarm": "^0.0.3", "@ungap/custom-elements": "^1.3.0", "autosize": "^6.0.1", "cordova": "12.0.0", @@ -101,9 +104,11 @@ "escape-string-regexp": "^5.0.0", "esprima": "^4.0.1", "filesize": "^10.1.2", + "he": "^1.2.0", "html-tag-js": "^1.5.1", "js-base64": "^3.7.7", "jszip": "^3.10.1", + "langchain": "^0.3.27", "markdown-it": "^14.1.0", "markdown-it-anchor": "^9.2.0", "markdown-it-github-alerts": "^0.3.0", diff --git a/src/pages/aiAssistant/assistant.js b/src/pages/aiAssistant/assistant.js index 91d865ad6..8ad818bd6 100644 --- a/src/pages/aiAssistant/assistant.js +++ b/src/pages/aiAssistant/assistant.js @@ -1,566 +1,674 @@ -import { isAIMessageChunk } from "@langchain/core/messages"; -import { ChatGoogleGenerativeAI } from "@langchain/google-genai"; -import { createReactAgent } from "@langchain/langgraph/prebuilt"; +import { + isAIMessageChunk +} from "@langchain/core/messages"; +import { + ChatGoogleGenerativeAI +} from "@langchain/google-genai"; +import { + createReactAgent +} from "@langchain/langgraph/prebuilt"; import select from "dialogs/select"; import Ref from "html-tag-js/ref"; import EditorFile from "lib/editorFile"; import settings from "lib/settings"; import markdownIt from "markdown-it"; import styles from "./assistant.module.scss"; - -let aiTabInstance; +import { + addConversation, + getConversation, + getAllConversations, + updateConversation, + deleteConversation, + addMessageToDB, + getMessagesForConversation +} from './db'; +import { + MemorySaver +} from "@langchain/langgraph-checkpoint"; +import he from 'he'; export default function openAIAssistantPage() { - // References - const profileBtnRef = new Ref(); - const historySidebarRef = new Ref(); - const chatInputRef = new Ref(); - const sendBtnRef = new Ref(); - const messageContainerRef = new Ref(); - const stopBtnRef = new Ref(); - - // States - let currentProfile = "ask"; // Default to ask profile - - const model = new ChatGoogleGenerativeAI({ - model: "gemini-2.0-flash", - apiKey: "", - }); - const agent = createReactAgent({ llm: model, tools: [] }); - - /** - * Updates the profile button appearance and state - * @param {string} profile - Profile type ("ask" or "write") - */ - const handleProfileSwitch = (profile) => { - const iconEl = profileBtnRef.el.querySelector("i:first-child"); - const textEl = profileBtnRef.el.querySelector("span"); - - currentProfile = profile; - - // Update button appearance based on selected profile - if (profile === "ask") { - iconEl.className = "icon help"; - textEl.textContent = "Ask"; - } else { - iconEl.className = "icon edit"; - textEl.textContent = "Write"; - } - }; - - /** - * Shows profile selection menu - */ - const showProfileMenu = async (e) => { - e.preventDefault(); - const profile = await select("Select Profile", [ - { value: "ask", text: "Ask", icon: "help" }, - { value: "write", text: "Write", icon: "edit" }, - ]); - handleProfileSwitch(profile); - }; - - const toggleHistorySidebar = () => { - historySidebarRef.classList.toggle("hidden"); - }; - - const handleChatInput = () => { - sendBtnRef.el.disabled = chatInputRef.value.trim().length === 0; - chatInputRef.el.style.height = "auto"; - chatInputRef.el.style.height = - Math.min(chatInputRef.el.scrollHeight, 120) + `px`; - }; - - const scrollToBottom = () => { - messageContainerRef.el.scrollTop = messageContainerRef.el.scrollHeight; - }; - - const showLoading = () => { - const loadingEl = tag("div", { - className: "ai_loading", - id: "loading-indicator", - }); - const loadingDots = tag("div", { - className: "loading-dots", - }); - - for (let i = 0; i < 3; i++) { - const dot = tag("div", { - className: "loading-dot", - }); - loadingDots.appendChild(dot); - } - - const text = tag("span", { - textContent: "AI is thinking...", - }); - - loadingEl.appendChild(loadingDots); - loadingEl.appendChild(text); - - messageContainerRef.el.appendChild(loadingEl); - scrollToBottom(); - }; - - const removeLoading = () => { - const loadingEl = - messageContainerRef.el.querySelector("#loading-indicator"); - if (loadingEl) { - messageContainerRef.el.removeChild(loadingEl); - } - }; - - const formatTime = (timestamp) => { - const date = new Date(timestamp); - return date.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }); - }; - - const copyToClipboard = (text) => { - const { clipboard } = cordova.plugins; - clipboard.copy(text || ""); - }; - - const addMessage = (message) => { - const messageEl = tag("div", { - className: `message ${message.role === "user" ? "user" : ""}`, - id: `message-${message.id}`, - }); - const messageHeader = tag("div", { className: "message-header" }); - const messageSender = tag("div", { - className: `message-sender ${message.role === "user" ? "user" : "ai"}`, - textContent: message.role === "user" ? "You" : "AI", - }); - const messageActions = tag("div", { - className: "message-actions", - }); - const messageTime = tag("div", { - className: "message-time", - textContent: formatTime(message.timestamp), - }); - messageActions.appendChild(messageTime); - - if (message.role === "assistant") { - const copyBtn = tag("button", { - className: "btn btn-icon", - title: "Copy message", - child: tag("i", { className: "icon copy" }), - onclick: () => copyToClipboard(message.content), - }); - messageActions.appendChild(copyBtn); - } - - if (message.role === "user") { - const editBtn = tag("button", { - className: "btn btn-icon", - title: "Edit message", - child: tag("i", { className: "icon edit" }), - // TODO: Implement edit functionality - //onclick: () => editMessage(message.id), - }); - messageActions.appendChild(editBtn); - } - - messageHeader.appendChild(messageSender); - messageHeader.appendChild(messageActions); - - const messageContent = tag("div", { - className: "message-content md", - }); - - if (message.role === "user") { - messageContent.textContent = message.content; - } else { - messageContent.innerHTML = markdownIt().render(message.content); - } - - messageEl.appendChild(messageHeader); - messageEl.appendChild(messageContent); - messageContainerRef.el.appendChild(messageEl); - scrollToBottom(); - }; - - // Generate a unique id for each message - const generateMessageId = (() => { - let counter = 0; - return () => { - counter += 1; - return `msg_${Date.now()}_${counter}`; - }; - })(); - - // Store chat history in memory for this session - let chatHistory = []; - let currentController = null; - - const handleSendBtn = async () => { - const userInput = chatInputRef.value.trim(); - if (!userInput) return; - - // Add user message to UI and history - const userMsgId = generateMessageId(); - const userMessage = { - id: userMsgId, - role: "user", - content: userInput, - timestamp: Date.now(), - }; - addMessage(userMessage); - chatHistory.push({ role: "user", content: userInput }); - - // Clear input - chatInputRef.value = ""; - chatInputRef.style.height = "auto"; - - // Show loading indicator - showLoading(); - - // Prepare inputs for agent - let inputs = { messages: [...chatHistory] }; - currentController = new AbortController(); - - sendBtnRef.el.style.display = "none"; - stopBtnRef.el.style.display = "block"; - - const assistantMsgId = generateMessageId(); - - try { - const stream = await agent.stream(inputs, { - streamMode: "messages", - signal: currentController.signal, - }); - - // Remove loading indicator - removeLoading(); - - // Add assistant message placeholder - const assistantMessage = { - id: assistantMsgId, - role: "assistant", - content: "", - timestamp: Date.now(), - }; - addMessage(assistantMessage); - - const messageEl = messageContainerRef.el.querySelector( - `#message-${assistantMsgId} .message-content`, - ); - let streamedContent = ""; - - for await (const [message, _metadata] of stream) { - if (isAIMessageChunk(message) && message.tool_call_chunks?.length) { - streamedContent += message.tool_call_chunks[0].args; - } else { - streamedContent += message.content; - } - - if (messageEl) { - messageEl.innerHTML = markdownIt().render(streamedContent); - scrollToBottom(); - } - } - - // After streaming, update chat history with assistant message - chatHistory.push({ role: "assistant", content: streamedContent }); - - const timeEl = messageContainerRef.el.querySelector( - `#message-${assistantMsgId} .message-actions > div`, - ); - if (timeEl) { - timeEl.textContent = formatTime(Date.now()); - } - } catch (err) { - removeLoading(); - if (/abort/i.test(err.message)) { - const messageEl = messageContainerRef.el.querySelector( - `#message-${assistantMsgId} .message-content`, - ); - if (messageEl) { - messageEl.innerHTML += `
Cancelled by user.
`; - } - } else { - const messageEl = messageContainerRef.el.querySelector( - `#message-${assistantMsgId} .message-content`, - ); - if (messageEl) { - messageEl.innerHTML += markdownIt().render(`Error: ${err.message}`); - } - } - } finally { - // add custom code blocks with syntax highlighting - const messageContent = messageContainerRef.el.querySelector( - `#message-${assistantMsgId} .message-content`, - ); - - // Replace markdown code blocks with custom components - messageContent.innerHTML = messageContent.innerHTML.replace( - /
([\s\S]*?)<\/code><\/pre>/g,
-				(match, language, code) => {
-					language = language || "plaintext";
-
-					return `
-					
-
-
- - ${language} -
-
- -
-
-
-
${code}
-
-
- - Show more -
-
- `; - }, - ); - - // Process all code blocks - const codeBlocks = messageContent.querySelectorAll(".code-block"); - codeBlocks.forEach((codeBlock) => { - const codeContent = codeBlock.querySelector(".code-content"); - const codeElement = codeBlock.querySelector("code"); - const copyButton = codeBlock.querySelector(".code-copy"); - const expandButton = codeBlock.querySelector(".code-expand"); - - // Apply Ace highlighting - if (codeElement) { - const langMatch = codeElement.className.match(/language-(\w+)/); - if (langMatch) { - const langMap = { - bash: "sh", - shell: "sh", - }; - const lang = langMatch[1]; - const mappedLang = langMap[lang] || lang; - const highlight = ace.require("ace/ext/static_highlight"); - highlight.render( - codeElement.textContent, - `ace/mode/${mappedLang}`, - settings.value.editorTheme.startsWith("ace/theme/") - ? settings.value.editorTheme - : "ace/theme/" + settings.value.editorTheme, - 1, - true, - (highlighted) => { - aiTabInstance?.addStyle(highlighted.css); - codeElement.innerHTML = highlighted.html; - }, - ); - } - } - - // copy functionality - copyButton.addEventListener("click", async () => { - const code = codeElement?.textContent || ""; - try { - cordova.plugins.clipboard.copy(code); - copyButton.querySelector("i").className = "icon check"; - setTimeout(() => { - copyButton.querySelector("i").className = "icon copy"; - }, 2000); - } catch (err) { - copyButton.querySelector("i").className = - "icon warningreport_problem"; - setTimeout(() => { - copyButton.querySelector("i").className = "icon copy"; - }, 2000); - } - }); - - // expand/collapse functionality - expandButton.addEventListener("click", () => { - const isExpanded = codeContent.classList.contains("expanded"); - codeContent.classList.toggle("expanded", !isExpanded); - expandButton.innerHTML = isExpanded - ? ` Show more` - : ` Show less`; - }); - - // Only show expand button if content overflows - if (codeContent.scrollHeight <= codeContent.clientHeight) { - expandButton.style.display = "none"; - } - }); - - currentController = null; - sendBtnRef.el.style.display = "block"; - stopBtnRef.el.style.display = "none"; - } - }; - - const handleStopBtn = () => { - if (currentController) { - currentController?.abort(); - currentController = null; - stopBtnRef.el.style.display = "none"; - sendBtnRef.el.style.display = "block"; - } - }; - - const aiAssistantContainer = ( -
- {/* Header */} -
-
- -
- -
-
- -
-
-
- -
-
- - {/* Main content */} -
- {/* Chat history sidebar */} -
-
-

CHAT HISTORY

- -
-
-
-
- -
-
File upload component
-
-
-
- -
-
Authentication implementation
-
-
-
- -
-
React state management
-
-
-
- - {/* Messages area */} -
-
- {/* Messages will be added here dynamically */} -
-
-
- - {/* Input area */} -
-
- - -
- - -
-
-
-
- ); - - chatInputRef.el.addEventListener("input", handleChatInput); - - const uri = "ai://assistant"; - - // Check if the tab is already open - const existingFile = editorManager.getFile(uri, "uri"); - - if (existingFile) { - existingFile.makeActive(); - return; - } - - // Create a new EditorFile instance for the AI Assistant tab - aiTabInstance = new EditorFile("AI Assistant", { - uri: uri, - type: "page", - tabIcon: "file file_type_assistant", - content: aiAssistantContainer, - render: true, - stylesheets: styles, - hideQuickTools: true, - }); -} + // References + const profileBtnRef = new Ref(); + const historySidebarRef = new Ref(); + const chatInputRef = new Ref(); + const sendBtnRef = new Ref(); + const messageContainerRef = new Ref(); + const stopBtnRef = new Ref(); + + let currentProfile = "ask"; + let currentConversationId = null; + let currentConversation = null; + let chatHistory = []; + let currentController = null; + let aiTabInstance; + + const GEMINI_API_KEY = ""; // Replace + const agentCheckpointer = new MemorySaver(); + const model = new ChatGoogleGenerativeAI( { + model: "gemini-2.0-flash", + apiKey: GEMINI_API_KEY, + }); + const agent = createReactAgent( { + llm: model, + tools: [], + checkpointSaver: agentCheckpointer + }); + + const generateConversationId = () => `conv_${Date.now()}_${Math.random().toString(36).substring(2, 7)}`; + const generateMessageId = (() => { + let counter = 0; + return () => `msg_${Date.now()}_${++counter}`; + })(); + + const formatTime = (timestamp) => new Date(timestamp).toLocaleTimeString([], { + hour: "2-digit", minute: "2-digit" + }); + + const copyToClipboard = (text) => { + cordova.plugins.clipboard.copy(text || ""); + }; + + const scrollToBottom = () => { + messageContainerRef.el.scrollTop = messageContainerRef.el.scrollHeight; + }; + + const addMessage = (message) => { + const messageEl = tag("div", { + className: `message ${message.role === "user" ? "user": ""}`, + id: `message-${message.id}`, + }); + const messageHeader = tag("div", { + className: "message-header" + }); + const messageSender = tag("div", { + className: `message-sender ${message.role === "user" ? "user": "ai"}`, + textContent: message.role === "user" ? "You": "AI", + }); + const messageActions = tag("div", { + className: "message-actions", + }); + const messageTime = tag("div", { + className: "message-time", + textContent: formatTime(message.timestamp), + }); + messageActions.appendChild(messageTime); + + if (message.role === "assistant") { + const copyBtn = tag("button", { + className: "btn btn-icon", + title: "Copy message", + child: tag("i", { + className: "icon copy" + }), + onclick: () => copyToClipboard(message.content), + }); + messageActions.appendChild(copyBtn); + } + + if (message.role === "user") { + const editBtn = tag("button", { + className: "btn btn-icon", + title: "Edit message", + child: tag("i", { + className: "icon edit" + }), + // TODO: Implement edit functionality + //onclick: () => editMessage(message.id), + }); + messageActions.appendChild(editBtn); + } + + messageHeader.appendChild(messageSender); + messageHeader.appendChild(messageActions); + + const messageContent = tag("div", { + className: "message-content md", + }); + + if (message.role === "user") { + messageContent.textContent = message.content; + } else { + messageContent.innerHTML = markdownIt().render(message.content); + } + + messageEl.appendChild(messageHeader); + messageEl.appendChild(messageContent); + messageContainerRef.el.appendChild(messageEl); + scrollToBottom(); + }; + + /** + * Updates the profile button appearance and state + * @param {string} profile - Profile type ("ask" or "write") + */ + const handleProfileSwitch = (profile) => { + const iconEl = profileBtnRef.el.querySelector("i:first-child"); + const textEl = profileBtnRef.el.querySelector("span"); + + currentProfile = profile; + + // Update button appearance based on selected profile + if (profile === "ask") { + iconEl.className = "icon help"; + textEl.textContent = "Ask"; + } else { + iconEl.className = "icon edit"; + textEl.textContent = "Write"; + } + }; + + /** + * Shows profile selection menu + */ + const showProfileMenu = async (e) => { + e.preventDefault(); + const profile = await select("Select Profile", [{ + value: "ask", text: "Ask", icon: "help" + }, + { + value: "write", text: "Write", icon: "edit" + }, + ]); + handleProfileSwitch(profile); + }; + const toggleHistorySidebar = () => { + historySidebarRef.classList.toggle("hidden"); + }; + + const showLoading = () => { + const loadingEl = tag("div", { + className: "ai_loading", + id: "loading-indicator", + }); + const loadingDots = tag("div", { + className: "loading-dots", + }); + + for (let i = 0; i < 3; i++) { + const dot = tag("div", { + className: "loading-dot", + }); + loadingDots.appendChild(dot); + } + + const text = tag("span", { + textContent: "AI is thinking...", + }); + + loadingEl.appendChild(loadingDots); + loadingEl.appendChild(text); + + messageContainerRef.el.appendChild(loadingEl); + scrollToBottom(); + }; + + const removeLoading = () => { + const loadingEl = + messageContainerRef.el.querySelector("#loading-indicator"); + if (loadingEl) { + messageContainerRef.el.removeChild(loadingEl); + } + }; + + const handleChatInput = () => { + sendBtnRef.el.disabled = chatInputRef.value.trim().length === 0; + chatInputRef.el.style.height = "auto"; + chatInputRef.el.style.height = + Math.min(chatInputRef.el.scrollHeight, 120) + `px`; + }; + + async function updateHistorySidebar() { + if (!historySidebarRef.el) return; + const conversations = await getAllConversations(); + const historyItemsContainer = historySidebarRef.el.querySelector(".chat-history"); + if (!historyItemsContainer) return; + historyItemsContainer.innerHTML = ''; + conversations.forEach(conv => { + const item = document.createElement('div'); + item.className = `history-item ${conv.id === currentConversationId ? 'active': ''}`; + item.onclick = () => { + if (conv.id !== currentConversationId) loadOrCreateConversation(conv.id); + }; + + const iconWrapper = document.createElement('div'); + iconWrapper.className = "history-icon"; + const icon = document.createElement('i'); + icon.className = `icon ${conv.profile === 'write' ? 'edit': 'chat_bubble'}`; + iconWrapper.appendChild(icon); + + const text = document.createElement('div'); + text.className = 'history-text'; + text.textContent = conv.title || "Untitled Chat"; + + item.append(iconWrapper, text); + historyItemsContainer.appendChild(item); + }); + } + + async function loadOrCreateConversation(conversationIdToLoad) { + if (currentController) currentController.abort(); + currentController = null; + + if (conversationIdToLoad) { + const conversation = await getConversation(conversationIdToLoad); + if (conversation) { + currentConversation = conversation; + currentConversationId = conversation.id; + handleProfileSwitch(currentConversation.profile || "ask"); + const messagesFromDB = await getMessagesForConversation(currentConversationId); + if (messageContainerRef.el) messageContainerRef.el.innerHTML = ''; + chatHistory = []; + messagesFromDB.forEach(msg => { + addMessage(msg); + chatHistory.push({ + role: msg.role, content: msg.content + }); + }); + } else { + console.warn(`Conversation ${conversationIdToLoad} not found. Starting new one.`); + conversationIdToLoad = null; + } + } + + if (!conversationIdToLoad) { + currentConversationId = generateConversationId(); + const now = Date.now(); + currentConversation = { + id: currentConversationId, + title: "New Chat", + createdAt: now, + lastModifiedAt: now, + profile: currentProfile, + }; + await addConversation(currentConversation); + chatHistory = []; + if (messageContainerRef.el) messageContainerRef.el.innerHTML = ''; + } + updateHistorySidebar(); + if (chatInputRef.el) chatInputRef.el.focus(); + } + + async function saveUserMessageAndUpdateConversation(userMessage, currentConv, isFirstUIMessage) { + if (isFirstUIMessage && currentConv && currentConv.title === "New Chat") { + currentConv.title = userMessage.content.substring(0, 30) + (userMessage.content.length > 30 ? "...": ""); + } + if (currentConv) { + currentConv.lastModifiedAt = Date.now(); + await updateConversation(currentConv); + } + await addMessageToDB(userMessage); + } + + const handleSendBtn = async () => { + const userInput = chatInputRef.value.trim(); + + if (!userInput) + return; + if (!currentConversationId) { + alert("Error: No active conversation. Please start a new chat."); + return; + } + + const userMsgId = { + id: generateMessageId(), + conversationId: currentConversationId, + role: "user", + content: userInput, + timestamp: Date.now(), + }; + addMessage(userMsgId); + + const userMessageForAgent = { + role: "user", + content: userInput + }; + chatHistory.push(userMessageForAgent); + + chatInputRef.el.value = ""; + handleChatInput(); + saveUserMessageAndUpdateConversation(userMsgId, currentConversation, chatHistory.filter(msg => msg.role === 'user').length === 1); + + showLoading(); + + let messagesForAgentTurn; + const systemPrompt = { + role: "system", + content: `You are an AI assistant in Acode code editor. Profile: ${currentProfile}. Be helpful and concise.` + }; + //Gemini Api expects system prompt as first message + if (chatHistory.filter(msg => msg.role === 'user').length === 1) { + messagesForAgentTurn = [systemPrompt, + userMessageForAgent]; + } else { + messagesForAgentTurn = [userMessageForAgent]; + } + + currentController = new AbortController(); + sendBtnRef.el.style.display = "none"; + stopBtnRef.el.style.display = "block"; + + const assistantMsgId = generateMessageId(); + let streamedContent = ""; + let wasError = false; + let finalTimestamp = Date.now(); + const md = markdownIt( { + html: true, linkify: true, typographer: true + }); + + try { + const assistantPlaceholderMsg = { + id: assistantMsgId, + conversationId: currentConversationId, + role: "assistant", + content: "▌", + timestamp: Date.now(), + }; + addMessage(assistantPlaceholderMsg); + + const messageElContent = messageContainerRef.el.querySelector(`#message-${assistantMsgId} .message-content`); + removeLoading(); + + + //Chat history not passed anymore, memory saver and checkpoint will handle context + const inputsForAgent = { + messages: messagesForAgentTurn + }; + + const stream = await agent.stream(inputsForAgent, { + streamMode: "messages", signal: currentController.signal, + //thread_id is the checkpoint marker + configurable: { + thread_id: currentConversationId + } + }); + + for await (const eventData of stream) { + let messageChunkPayload = null; + if (Array.isArray(eventData) && eventData.length > 0 && eventData[0] && typeof eventData[0].content !== 'undefined') { + messageChunkPayload = eventData[0]; + } else if (eventData && typeof eventData.content !== 'undefined') { + messageChunkPayload = eventData; + } + + let chunkText = ""; + if (messageChunkPayload) { + if (isAIMessageChunk(messageChunkPayload) && messageChunkPayload.tool_call_chunks?.length) { + chunkText = messageChunkPayload.tool_call_chunks.map(tc => tc.args ? JSON.stringify(tc.args): "").join("\n"); + } else if (typeof messageChunkPayload.content === 'string') { + chunkText = messageChunkPayload.content; + } else if (typeof messageChunkPayload === 'string') { + chunkText = messageChunkPayload; + } + } + + if (chunkText) { + streamedContent += chunkText; + if (messageElContent) { + messageElContent.innerHTML = md.render(streamedContent + " ▌"); + scrollToBottom(); + } + } + } + finalTimestamp = Date.now(); + if (messageElContent) { + messageElContent.innerHTML = md.render(streamedContent); + } + } catch (err) { + removeLoading(); + wasError = true; + finalTimestamp = Date.now(); + const isAbort = err.name === 'AbortError' || (err.message && /abort/i.test(err.message)); + streamedContent = isAbort ? "Streaming cancelled by user.": `Error: ${err.message || 'Unknown error.'}`; + + const targetMessageElContent = messageContainerRef.el.querySelector(`#message-${assistantMsgId} .message-content`); + if (targetMessageElContent) { + const errorColor = isAbort ? 'var(--warning-text-color)': 'var(--error-text-color)'; + targetMessageElContent.innerHTML = `${isAbort ? streamedContent: md.render(streamedContent)}`; + } + } finally { + currentController = null; + if (sendBtnRef.el) sendBtnRef.el.style.display = "block"; + if (stopBtnRef.el) stopBtnRef.el.style.display = "none"; + handleChatInput(); + + const assistantFinalData = { + id: assistantMsgId, + conversationId: currentConversationId, + role: "assistant", + content: streamedContent, + timestamp: finalTimestamp, + }; + await addMessageToDB(assistantFinalData); + if (currentConversation && !wasError) { + currentConversation.lastModifiedAt = finalTimestamp; + await updateConversation(currentConversation); + } + + if (!wasError) { + chatHistory.push({ + role: "assistant", content: streamedContent + }); + } + updateHistorySidebar(); + + const messageContentElToFinalize = messageContainerRef.el?.querySelector(`#message-${assistantMsgId} .message-content`); + if (messageContentElToFinalize && !wasError) { + const timeEl = messageContainerRef.el.querySelector(`#message-${assistantMsgId} .message-actions .message-time`); + if (timeEl) timeEl.textContent = formatTime(finalTimestamp); + + messageContentElToFinalize.innerHTML = messageContentElToFinalize.innerHTML.replace( + /
([\s\S]*?)<\/code><\/pre>/g,
+          (match, language, code) => {
+            language = language || "plaintext";
+            code = he.decode(code);
+            return `
+            
+
+
${language}
+
+
+
${code}
+
Show more
+
`; + } + ); + + messageContentElToFinalize.querySelectorAll(".code-block").forEach(codeBlock => { + const codeContent = codeBlock.querySelector(".code-content"); + const codeElement = codeBlock.querySelector("pre code"); + const copyButton = codeBlock.querySelector(".code-copy"); + const expandButton = codeBlock.querySelector(".code-expand"); + // expand/collapse functionality + expandButton.addEventListener("click", () => { + const isExpanded = codeContent.classList.contains("expanded"); + codeContent.classList.toggle("expanded", !isExpanded); + expandButton.innerHTML = isExpanded + ? ` Show more`: ` Show less`; + }); + + // Only show expand button if content overflows + if (codeContent.scrollHeight <= codeContent.clientHeight) { + expandButton.style.display = "none"; + } + + }); + } + } + }; + + const handleStopBtn = () => { + if (currentController) { + currentController?.abort(); + currentController = null; + stopBtnRef.el.style.display = "none"; + sendBtnRef.el.style.display = "block"; + } + }; + + + const aiAssistantContainer = ( +
+ {/* Header */} +
+
+ +
+ +
+
+ +
+
+
+ +
+
+ + {/* Main content */} +
+
+
+

CHAT HISTORY

+ +
+
+ {/* Populated by updateHistorySidebar */} +
+
+ +
+
+ {/* Messages are added by addMessage function */} +
+
+
+ + {/* Input area */} +
+
+ + +
+ + +
+
+
+
+ ); + + (async () => { + try { + const conversations = await getAllConversations(); + if (conversations.length > 0) { + await loadOrCreateConversation(conversations[0].id); + } else { + await loadOrCreateConversation(null); + } + } catch (error) { + console.error("Failed to initialize AI Assistant page or database:", error); + const errDiv = `
Failed to initialize AI Assistant: ${error.message}. Ensure SQLite plugin is functional.
`; + if (messageContainerRef.el) { + // Check after potential rendering by EditorFile + messageContainerRef.el.innerHTML = errDiv; + } else { + + alert(`Critical Error: AI Assistant failed to initialize. ${error.message}`); + } + } + })(); + + const uri = "ai://assistant"; + const existingFile = window.editorManager.getFile(uri, + "uri"); + if (existingFile) { + existingFile.makeActive(); + return; + } + + aiTabInstance = new EditorFile("AI Assistant", { + uri: uri, type: "page", tabIcon: "file file_type_assistant", + content: aiAssistantContainer, + render: true, + stylesheets: [styles], + hideQuickTools: true, + }); +} \ No newline at end of file diff --git a/src/pages/aiAssistant/db.js b/src/pages/aiAssistant/db.js new file mode 100644 index 000000000..bb96a3447 --- /dev/null +++ b/src/pages/aiAssistant/db.js @@ -0,0 +1,215 @@ +// src/pages/aiAssistant/db.js (or a more general lib folder) + +const DB_NAME = "AIAssistant.db"; // SQLite convention for .db extension +const DB_LOCATION = "default"; // Standard location + +let db = null; + +// Function to open or create the database +function openDB() { + return new Promise((resolve, reject) => { + if (db) { + return resolve(db); + } + if (!window.sqlitePlugin) { + const msg = "SQLite plugin is not available. Make sure cordova-sqlite-storage is installed and deviceready has fired."; + console.error(msg); + // TODO: Maybe want to queue DB operations or show an error to the user + return reject(new Error(msg)); + } + + db = window.sqlitePlugin.openDatabase( + { name: DB_NAME, location: DB_LOCATION }, + (openedDb) => { + console.log("SQLite DB opened successfully"); + db = openedDb; // Assign the opened DB instance + initializeTables().then(() => resolve(db)).catch(reject); + }, + (error) => { + console.error("Error opening SQLite DB:", JSON.stringify(error)); + reject(error); + } + ); + }); +} + +// Function to initialize tables if they don't exist +function initializeTables() { + return new Promise((resolve, reject) => { + if (!db) return reject(new Error("DB not open for table initialization")); + db.transaction((tx) => { + tx.executeSql(` + CREATE TABLE IF NOT EXISTS conversations ( + id TEXT PRIMARY KEY, + title TEXT, + createdAt INTEGER, + lastModifiedAt INTEGER, + profile TEXT + ) + `); + tx.executeSql(` + CREATE TABLE IF NOT EXISTS messages ( + id TEXT PRIMARY KEY, + conversationId TEXT, + role TEXT, + content TEXT, + timestamp INTEGER, + FOREIGN KEY (conversationId) REFERENCES conversations(id) ON DELETE CASCADE + ) + `); + // Index for faster querying of messages by conversationId and sorting + tx.executeSql(`CREATE INDEX IF NOT EXISTS idx_messages_conversationId_timestamp ON messages (conversationId, timestamp)`); + tx.executeSql(`CREATE INDEX IF NOT EXISTS idx_conversations_lastModifiedAt ON conversations (lastModifiedAt)`); + + }, (error) => { + console.error("Transaction error during table initialization:", JSON.stringify(error)); + reject(error); + }, () => { + console.log("Tables initialized (or already exist)."); + resolve(); + }); + }); +} + +// --- Helper for executing SQL --- +function executeSqlAsync(transaction, sql, params = []) { + return new Promise((resolve, reject) => { + transaction.executeSql(sql, params, + (tx, resultSet) => resolve(resultSet), + (tx, error) => { + console.error("SQL Error:", error.message, "Query:", sql, "Params:", params); + reject(error); + } + ); + }); +} + + +// --- Conversation Functions --- +export async function addConversation(conversation) { + await openDB(); + return new Promise((resolve, reject) => { + db.transaction(async (tx) => { + try { + await executeSqlAsync(tx, + "INSERT INTO conversations (id, title, createdAt, lastModifiedAt, profile) VALUES (?, ?, ?, ?, ?)", + [conversation.id, conversation.title, conversation.createdAt, conversation.lastModifiedAt, conversation.profile] + ); + resolve(conversation.id); + } catch (error) { + reject(error); + } + }); + }); +} + +export async function getConversation(id) { + await openDB(); + return new Promise((resolve, reject) => { + db.readTransaction(async (tx) => { // Use readTransaction for reads + try { + const resultSet = await executeSqlAsync(tx, "SELECT * FROM conversations WHERE id = ?", [id]); + if (resultSet.rows.length > 0) { + resolve(resultSet.rows.item(0)); + } else { + resolve(null); // Or undefined, consistent with IndexedDB version + } + } catch (error) { + reject(error); + } + }); + }); +} + +export async function getAllConversations() { + await openDB(); + return new Promise((resolve, reject) => { + db.readTransaction(async (tx) => { + try { + const resultSet = await executeSqlAsync(tx, "SELECT * FROM conversations ORDER BY lastModifiedAt DESC"); + const conversations = []; + for (let i = 0; i < resultSet.rows.length; i++) { + conversations.push(resultSet.rows.item(i)); + } + resolve(conversations); + } catch (error) { + reject(error); + } + }); + }); +} + +export async function updateConversation(conversation) { + await openDB(); + return new Promise((resolve, reject) => { + db.transaction(async (tx) => { + try { + await executeSqlAsync(tx, + "UPDATE conversations SET title = ?, lastModifiedAt = ?, profile = ? WHERE id = ?", + [conversation.title, conversation.lastModifiedAt, conversation.profile, conversation.id] + ); + resolve(conversation.id); + } catch (error) { + reject(error); + } + }); + }); +} + +// --- Message Functions --- +export async function addMessageToDB(message) { + await openDB(); + return new Promise((resolve, reject) => { + db.transaction(async (tx) => { + try { + await executeSqlAsync(tx, + "INSERT INTO messages (id, conversationId, role, content, timestamp) VALUES (?, ?, ?, ?, ?)", + [message.id, message.conversationId, message.role, message.content, message.timestamp] + ); + resolve(message.id); + } catch (error) { + reject(error); + } + }); + }); +} + +export async function getMessagesForConversation(conversationId) { + await openDB(); + return new Promise((resolve, reject) => { + db.readTransaction(async (tx) => { + try { + const resultSet = await executeSqlAsync(tx, + "SELECT * FROM messages WHERE conversationId = ? ORDER BY timestamp ASC", + [conversationId] + ); + const messages = []; + for (let i = 0; i < resultSet.rows.length; i++) { + messages.push(resultSet.rows.item(i)); + } + resolve(messages); + } catch (error) { + reject(error); + } + }); + }); +} + +// --- Deletion functions (example) --- +export async function deleteConversation(conversationId) { + await openDB(); + return new Promise((resolve, reject) => { + db.transaction(async (tx) => { + try { + // CASCADE DELETE on messages table should handle associated messages + await executeSqlAsync(tx, "DELETE FROM conversations WHERE id = ?", [conversationId]); + console.log(`Conversation ${conversationId} and its messages deleted.`); + resolve(); + } catch (error) { + reject(error); + } + }); + }); +} + +// Ensure DB is opened and tables initialized when module loads or on first call \ No newline at end of file From 2d536be86cd4d67f190f591e9be93619175792a9 Mon Sep 17 00:00:00 2001 From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com> Date: Sun, 1 Jun 2025 09:45:39 +0530 Subject: [PATCH 08/26] fix: formatting --- src/pages/aiAssistant/assistant.js | 1376 +++++++++++++++------------- src/pages/aiAssistant/db.js | 360 ++++---- 2 files changed, 925 insertions(+), 811 deletions(-) diff --git a/src/pages/aiAssistant/assistant.js b/src/pages/aiAssistant/assistant.js index 8ad818bd6..6f04f1d02 100644 --- a/src/pages/aiAssistant/assistant.js +++ b/src/pages/aiAssistant/assistant.js @@ -1,468 +1,511 @@ -import { - isAIMessageChunk -} from "@langchain/core/messages"; -import { - ChatGoogleGenerativeAI -} from "@langchain/google-genai"; -import { - createReactAgent -} from "@langchain/langgraph/prebuilt"; +import { isAIMessageChunk } from "@langchain/core/messages"; +import { ChatGoogleGenerativeAI } from "@langchain/google-genai"; +import { MemorySaver } from "@langchain/langgraph-checkpoint"; +import { createReactAgent } from "@langchain/langgraph/prebuilt"; import select from "dialogs/select"; +import he from "he"; import Ref from "html-tag-js/ref"; import EditorFile from "lib/editorFile"; import settings from "lib/settings"; import markdownIt from "markdown-it"; import styles from "./assistant.module.scss"; import { - addConversation, - getConversation, - getAllConversations, - updateConversation, - deleteConversation, - addMessageToDB, - getMessagesForConversation -} from './db'; -import { - MemorySaver -} from "@langchain/langgraph-checkpoint"; -import he from 'he'; + addConversation, + addMessageToDB, + deleteConversation, + getAllConversations, + getConversation, + getMessagesForConversation, + updateConversation, +} from "./db"; export default function openAIAssistantPage() { - // References - const profileBtnRef = new Ref(); - const historySidebarRef = new Ref(); - const chatInputRef = new Ref(); - const sendBtnRef = new Ref(); - const messageContainerRef = new Ref(); - const stopBtnRef = new Ref(); - - let currentProfile = "ask"; - let currentConversationId = null; - let currentConversation = null; - let chatHistory = []; - let currentController = null; - let aiTabInstance; - - const GEMINI_API_KEY = ""; // Replace - const agentCheckpointer = new MemorySaver(); - const model = new ChatGoogleGenerativeAI( { - model: "gemini-2.0-flash", - apiKey: GEMINI_API_KEY, - }); - const agent = createReactAgent( { - llm: model, - tools: [], - checkpointSaver: agentCheckpointer - }); - - const generateConversationId = () => `conv_${Date.now()}_${Math.random().toString(36).substring(2, 7)}`; - const generateMessageId = (() => { - let counter = 0; - return () => `msg_${Date.now()}_${++counter}`; - })(); - - const formatTime = (timestamp) => new Date(timestamp).toLocaleTimeString([], { - hour: "2-digit", minute: "2-digit" - }); - - const copyToClipboard = (text) => { - cordova.plugins.clipboard.copy(text || ""); - }; - - const scrollToBottom = () => { - messageContainerRef.el.scrollTop = messageContainerRef.el.scrollHeight; - }; - - const addMessage = (message) => { - const messageEl = tag("div", { - className: `message ${message.role === "user" ? "user": ""}`, - id: `message-${message.id}`, - }); - const messageHeader = tag("div", { - className: "message-header" - }); - const messageSender = tag("div", { - className: `message-sender ${message.role === "user" ? "user": "ai"}`, - textContent: message.role === "user" ? "You": "AI", - }); - const messageActions = tag("div", { - className: "message-actions", - }); - const messageTime = tag("div", { - className: "message-time", - textContent: formatTime(message.timestamp), - }); - messageActions.appendChild(messageTime); - - if (message.role === "assistant") { - const copyBtn = tag("button", { - className: "btn btn-icon", - title: "Copy message", - child: tag("i", { - className: "icon copy" - }), - onclick: () => copyToClipboard(message.content), - }); - messageActions.appendChild(copyBtn); - } - - if (message.role === "user") { - const editBtn = tag("button", { - className: "btn btn-icon", - title: "Edit message", - child: tag("i", { - className: "icon edit" - }), - // TODO: Implement edit functionality - //onclick: () => editMessage(message.id), - }); - messageActions.appendChild(editBtn); - } - - messageHeader.appendChild(messageSender); - messageHeader.appendChild(messageActions); - - const messageContent = tag("div", { - className: "message-content md", - }); - - if (message.role === "user") { - messageContent.textContent = message.content; - } else { - messageContent.innerHTML = markdownIt().render(message.content); - } - - messageEl.appendChild(messageHeader); - messageEl.appendChild(messageContent); - messageContainerRef.el.appendChild(messageEl); - scrollToBottom(); - }; - - /** - * Updates the profile button appearance and state - * @param {string} profile - Profile type ("ask" or "write") - */ - const handleProfileSwitch = (profile) => { - const iconEl = profileBtnRef.el.querySelector("i:first-child"); - const textEl = profileBtnRef.el.querySelector("span"); - - currentProfile = profile; - - // Update button appearance based on selected profile - if (profile === "ask") { - iconEl.className = "icon help"; - textEl.textContent = "Ask"; - } else { - iconEl.className = "icon edit"; - textEl.textContent = "Write"; - } - }; - - /** - * Shows profile selection menu - */ - const showProfileMenu = async (e) => { - e.preventDefault(); - const profile = await select("Select Profile", [{ - value: "ask", text: "Ask", icon: "help" - }, - { - value: "write", text: "Write", icon: "edit" - }, - ]); - handleProfileSwitch(profile); - }; - const toggleHistorySidebar = () => { - historySidebarRef.classList.toggle("hidden"); - }; - - const showLoading = () => { - const loadingEl = tag("div", { - className: "ai_loading", - id: "loading-indicator", - }); - const loadingDots = tag("div", { - className: "loading-dots", - }); - - for (let i = 0; i < 3; i++) { - const dot = tag("div", { - className: "loading-dot", - }); - loadingDots.appendChild(dot); - } - - const text = tag("span", { - textContent: "AI is thinking...", - }); - - loadingEl.appendChild(loadingDots); - loadingEl.appendChild(text); - - messageContainerRef.el.appendChild(loadingEl); - scrollToBottom(); - }; - - const removeLoading = () => { - const loadingEl = - messageContainerRef.el.querySelector("#loading-indicator"); - if (loadingEl) { - messageContainerRef.el.removeChild(loadingEl); - } - }; - - const handleChatInput = () => { - sendBtnRef.el.disabled = chatInputRef.value.trim().length === 0; - chatInputRef.el.style.height = "auto"; - chatInputRef.el.style.height = - Math.min(chatInputRef.el.scrollHeight, 120) + `px`; - }; - - async function updateHistorySidebar() { - if (!historySidebarRef.el) return; - const conversations = await getAllConversations(); - const historyItemsContainer = historySidebarRef.el.querySelector(".chat-history"); - if (!historyItemsContainer) return; - historyItemsContainer.innerHTML = ''; - conversations.forEach(conv => { - const item = document.createElement('div'); - item.className = `history-item ${conv.id === currentConversationId ? 'active': ''}`; - item.onclick = () => { - if (conv.id !== currentConversationId) loadOrCreateConversation(conv.id); - }; - - const iconWrapper = document.createElement('div'); - iconWrapper.className = "history-icon"; - const icon = document.createElement('i'); - icon.className = `icon ${conv.profile === 'write' ? 'edit': 'chat_bubble'}`; - iconWrapper.appendChild(icon); - - const text = document.createElement('div'); - text.className = 'history-text'; - text.textContent = conv.title || "Untitled Chat"; - - item.append(iconWrapper, text); - historyItemsContainer.appendChild(item); - }); - } - - async function loadOrCreateConversation(conversationIdToLoad) { - if (currentController) currentController.abort(); - currentController = null; - - if (conversationIdToLoad) { - const conversation = await getConversation(conversationIdToLoad); - if (conversation) { - currentConversation = conversation; - currentConversationId = conversation.id; - handleProfileSwitch(currentConversation.profile || "ask"); - const messagesFromDB = await getMessagesForConversation(currentConversationId); - if (messageContainerRef.el) messageContainerRef.el.innerHTML = ''; - chatHistory = []; - messagesFromDB.forEach(msg => { - addMessage(msg); - chatHistory.push({ - role: msg.role, content: msg.content - }); - }); - } else { - console.warn(`Conversation ${conversationIdToLoad} not found. Starting new one.`); - conversationIdToLoad = null; - } - } - - if (!conversationIdToLoad) { - currentConversationId = generateConversationId(); - const now = Date.now(); - currentConversation = { - id: currentConversationId, - title: "New Chat", - createdAt: now, - lastModifiedAt: now, - profile: currentProfile, - }; - await addConversation(currentConversation); - chatHistory = []; - if (messageContainerRef.el) messageContainerRef.el.innerHTML = ''; - } - updateHistorySidebar(); - if (chatInputRef.el) chatInputRef.el.focus(); - } - - async function saveUserMessageAndUpdateConversation(userMessage, currentConv, isFirstUIMessage) { - if (isFirstUIMessage && currentConv && currentConv.title === "New Chat") { - currentConv.title = userMessage.content.substring(0, 30) + (userMessage.content.length > 30 ? "...": ""); - } - if (currentConv) { - currentConv.lastModifiedAt = Date.now(); - await updateConversation(currentConv); - } - await addMessageToDB(userMessage); - } - - const handleSendBtn = async () => { - const userInput = chatInputRef.value.trim(); - - if (!userInput) - return; - if (!currentConversationId) { - alert("Error: No active conversation. Please start a new chat."); - return; - } - - const userMsgId = { - id: generateMessageId(), - conversationId: currentConversationId, - role: "user", - content: userInput, - timestamp: Date.now(), - }; - addMessage(userMsgId); - - const userMessageForAgent = { - role: "user", - content: userInput - }; - chatHistory.push(userMessageForAgent); - - chatInputRef.el.value = ""; - handleChatInput(); - saveUserMessageAndUpdateConversation(userMsgId, currentConversation, chatHistory.filter(msg => msg.role === 'user').length === 1); - - showLoading(); - - let messagesForAgentTurn; - const systemPrompt = { - role: "system", - content: `You are an AI assistant in Acode code editor. Profile: ${currentProfile}. Be helpful and concise.` - }; - //Gemini Api expects system prompt as first message - if (chatHistory.filter(msg => msg.role === 'user').length === 1) { - messagesForAgentTurn = [systemPrompt, - userMessageForAgent]; - } else { - messagesForAgentTurn = [userMessageForAgent]; - } - - currentController = new AbortController(); - sendBtnRef.el.style.display = "none"; - stopBtnRef.el.style.display = "block"; - - const assistantMsgId = generateMessageId(); - let streamedContent = ""; - let wasError = false; - let finalTimestamp = Date.now(); - const md = markdownIt( { - html: true, linkify: true, typographer: true - }); - - try { - const assistantPlaceholderMsg = { - id: assistantMsgId, - conversationId: currentConversationId, - role: "assistant", - content: "▌", - timestamp: Date.now(), - }; - addMessage(assistantPlaceholderMsg); - - const messageElContent = messageContainerRef.el.querySelector(`#message-${assistantMsgId} .message-content`); - removeLoading(); - - - //Chat history not passed anymore, memory saver and checkpoint will handle context - const inputsForAgent = { - messages: messagesForAgentTurn - }; - - const stream = await agent.stream(inputsForAgent, { - streamMode: "messages", signal: currentController.signal, - //thread_id is the checkpoint marker - configurable: { - thread_id: currentConversationId - } - }); - - for await (const eventData of stream) { - let messageChunkPayload = null; - if (Array.isArray(eventData) && eventData.length > 0 && eventData[0] && typeof eventData[0].content !== 'undefined') { - messageChunkPayload = eventData[0]; - } else if (eventData && typeof eventData.content !== 'undefined') { - messageChunkPayload = eventData; - } - - let chunkText = ""; - if (messageChunkPayload) { - if (isAIMessageChunk(messageChunkPayload) && messageChunkPayload.tool_call_chunks?.length) { - chunkText = messageChunkPayload.tool_call_chunks.map(tc => tc.args ? JSON.stringify(tc.args): "").join("\n"); - } else if (typeof messageChunkPayload.content === 'string') { - chunkText = messageChunkPayload.content; - } else if (typeof messageChunkPayload === 'string') { - chunkText = messageChunkPayload; - } - } - - if (chunkText) { - streamedContent += chunkText; - if (messageElContent) { - messageElContent.innerHTML = md.render(streamedContent + " ▌"); - scrollToBottom(); - } - } - } - finalTimestamp = Date.now(); - if (messageElContent) { - messageElContent.innerHTML = md.render(streamedContent); - } - } catch (err) { - removeLoading(); - wasError = true; - finalTimestamp = Date.now(); - const isAbort = err.name === 'AbortError' || (err.message && /abort/i.test(err.message)); - streamedContent = isAbort ? "Streaming cancelled by user.": `Error: ${err.message || 'Unknown error.'}`; - - const targetMessageElContent = messageContainerRef.el.querySelector(`#message-${assistantMsgId} .message-content`); - if (targetMessageElContent) { - const errorColor = isAbort ? 'var(--warning-text-color)': 'var(--error-text-color)'; - targetMessageElContent.innerHTML = `${isAbort ? streamedContent: md.render(streamedContent)}`; - } - } finally { - currentController = null; - if (sendBtnRef.el) sendBtnRef.el.style.display = "block"; - if (stopBtnRef.el) stopBtnRef.el.style.display = "none"; - handleChatInput(); - - const assistantFinalData = { - id: assistantMsgId, - conversationId: currentConversationId, - role: "assistant", - content: streamedContent, - timestamp: finalTimestamp, - }; - await addMessageToDB(assistantFinalData); - if (currentConversation && !wasError) { - currentConversation.lastModifiedAt = finalTimestamp; - await updateConversation(currentConversation); - } - - if (!wasError) { - chatHistory.push({ - role: "assistant", content: streamedContent - }); - } - updateHistorySidebar(); - - const messageContentElToFinalize = messageContainerRef.el?.querySelector(`#message-${assistantMsgId} .message-content`); - if (messageContentElToFinalize && !wasError) { - const timeEl = messageContainerRef.el.querySelector(`#message-${assistantMsgId} .message-actions .message-time`); - if (timeEl) timeEl.textContent = formatTime(finalTimestamp); - - messageContentElToFinalize.innerHTML = messageContentElToFinalize.innerHTML.replace( - /
([\s\S]*?)<\/code><\/pre>/g,
-          (match, language, code) => {
-            language = language || "plaintext";
-            code = he.decode(code);
-            return `
+	// References
+	const profileBtnRef = new Ref();
+	const historySidebarRef = new Ref();
+	const chatInputRef = new Ref();
+	const sendBtnRef = new Ref();
+	const messageContainerRef = new Ref();
+	const stopBtnRef = new Ref();
+
+	let currentProfile = "ask";
+	let currentConversationId = null;
+	let currentConversation = null;
+	let chatHistory = [];
+	let currentController = null;
+	let aiTabInstance;
+
+	const GEMINI_API_KEY = ""; // Replace
+	const agentCheckpointer = new MemorySaver();
+	const model = new ChatGoogleGenerativeAI({
+		model: "gemini-2.0-flash",
+		apiKey: GEMINI_API_KEY,
+	});
+	const agent = createReactAgent({
+		llm: model,
+		tools: [],
+		checkpointSaver: agentCheckpointer,
+	});
+
+	const generateConversationId = () =>
+		`conv_${Date.now()}_${Math.random().toString(36).substring(2, 7)}`;
+	const generateMessageId = (() => {
+		let counter = 0;
+		return () => `msg_${Date.now()}_${++counter}`;
+	})();
+
+	const formatTime = (timestamp) =>
+		new Date(timestamp).toLocaleTimeString([], {
+			hour: "2-digit",
+			minute: "2-digit",
+		});
+
+	const copyToClipboard = (text) => {
+		cordova.plugins.clipboard.copy(text || "");
+	};
+
+	const scrollToBottom = () => {
+		messageContainerRef.el.scrollTop = messageContainerRef.el.scrollHeight;
+	};
+
+	const addMessage = (message) => {
+		const messageEl = tag("div", {
+			className: `message ${message.role === "user" ? "user" : ""}`,
+			id: `message-${message.id}`,
+		});
+		const messageHeader = tag("div", {
+			className: "message-header",
+		});
+		const messageSender = tag("div", {
+			className: `message-sender ${message.role === "user" ? "user" : "ai"}`,
+			textContent: message.role === "user" ? "You" : "AI",
+		});
+		const messageActions = tag("div", {
+			className: "message-actions",
+		});
+		const messageTime = tag("div", {
+			className: "message-time",
+			textContent: formatTime(message.timestamp),
+		});
+		messageActions.appendChild(messageTime);
+
+		if (message.role === "assistant") {
+			const copyBtn = tag("button", {
+				className: "btn btn-icon",
+				title: "Copy message",
+				child: tag("i", {
+					className: "icon copy",
+				}),
+				onclick: () => copyToClipboard(message.content),
+			});
+			messageActions.appendChild(copyBtn);
+		}
+
+		if (message.role === "user") {
+			const editBtn = tag("button", {
+				className: "btn btn-icon",
+				title: "Edit message",
+				child: tag("i", {
+					className: "icon edit",
+				}),
+				// TODO: Implement edit functionality
+				//onclick: () => editMessage(message.id),
+			});
+			messageActions.appendChild(editBtn);
+		}
+
+		messageHeader.appendChild(messageSender);
+		messageHeader.appendChild(messageActions);
+
+		const messageContent = tag("div", {
+			className: "message-content md",
+		});
+
+		if (message.role === "user") {
+			messageContent.textContent = message.content;
+		} else {
+			messageContent.innerHTML = markdownIt().render(message.content);
+		}
+
+		messageEl.appendChild(messageHeader);
+		messageEl.appendChild(messageContent);
+		messageContainerRef.el.appendChild(messageEl);
+		scrollToBottom();
+	};
+
+	/**
+	 * Updates the profile button appearance and state
+	 * @param {string} profile - Profile type ("ask" or "write")
+	 */
+	const handleProfileSwitch = (profile) => {
+		const iconEl = profileBtnRef.el.querySelector("i:first-child");
+		const textEl = profileBtnRef.el.querySelector("span");
+
+		currentProfile = profile;
+
+		// Update button appearance based on selected profile
+		if (profile === "ask") {
+			iconEl.className = "icon help";
+			textEl.textContent = "Ask";
+		} else {
+			iconEl.className = "icon edit";
+			textEl.textContent = "Write";
+		}
+	};
+
+	/**
+	 * Shows profile selection menu
+	 */
+	const showProfileMenu = async (e) => {
+		e.preventDefault();
+		const profile = await select("Select Profile", [
+			{
+				value: "ask",
+				text: "Ask",
+				icon: "help",
+			},
+			{
+				value: "write",
+				text: "Write",
+				icon: "edit",
+			},
+		]);
+		handleProfileSwitch(profile);
+	};
+	const toggleHistorySidebar = () => {
+		historySidebarRef.classList.toggle("hidden");
+	};
+
+	const showLoading = () => {
+		const loadingEl = tag("div", {
+			className: "ai_loading",
+			id: "loading-indicator",
+		});
+		const loadingDots = tag("div", {
+			className: "loading-dots",
+		});
+
+		for (let i = 0; i < 3; i++) {
+			const dot = tag("div", {
+				className: "loading-dot",
+			});
+			loadingDots.appendChild(dot);
+		}
+
+		const text = tag("span", {
+			textContent: "AI is thinking...",
+		});
+
+		loadingEl.appendChild(loadingDots);
+		loadingEl.appendChild(text);
+
+		messageContainerRef.el.appendChild(loadingEl);
+		scrollToBottom();
+	};
+
+	const removeLoading = () => {
+		const loadingEl =
+			messageContainerRef.el.querySelector("#loading-indicator");
+		if (loadingEl) {
+			messageContainerRef.el.removeChild(loadingEl);
+		}
+	};
+
+	const handleChatInput = () => {
+		sendBtnRef.el.disabled = chatInputRef.value.trim().length === 0;
+		chatInputRef.el.style.height = "auto";
+		chatInputRef.el.style.height =
+			Math.min(chatInputRef.el.scrollHeight, 120) + `px`;
+	};
+
+	async function updateHistorySidebar() {
+		if (!historySidebarRef.el) return;
+		const conversations = await getAllConversations();
+		const historyItemsContainer =
+			historySidebarRef.el.querySelector(".chat-history");
+		if (!historyItemsContainer) return;
+		historyItemsContainer.innerHTML = "";
+		conversations.forEach((conv) => {
+			const item = document.createElement("div");
+			item.className = `history-item ${conv.id === currentConversationId ? "active" : ""}`;
+			item.onclick = () => {
+				if (conv.id !== currentConversationId)
+					loadOrCreateConversation(conv.id);
+			};
+
+			const iconWrapper = document.createElement("div");
+			iconWrapper.className = "history-icon";
+			const icon = document.createElement("i");
+			icon.className = `icon ${conv.profile === "write" ? "edit" : "chat_bubble"}`;
+			iconWrapper.appendChild(icon);
+
+			const text = document.createElement("div");
+			text.className = "history-text";
+			text.textContent = conv.title || "Untitled Chat";
+
+			item.append(iconWrapper, text);
+			historyItemsContainer.appendChild(item);
+		});
+	}
+
+	async function loadOrCreateConversation(conversationIdToLoad) {
+		if (currentController) currentController.abort();
+		currentController = null;
+
+		if (conversationIdToLoad) {
+			const conversation = await getConversation(conversationIdToLoad);
+			if (conversation) {
+				currentConversation = conversation;
+				currentConversationId = conversation.id;
+				handleProfileSwitch(currentConversation.profile || "ask");
+				const messagesFromDB = await getMessagesForConversation(
+					currentConversationId,
+				);
+				if (messageContainerRef.el) messageContainerRef.el.innerHTML = "";
+				chatHistory = [];
+				messagesFromDB.forEach((msg) => {
+					addMessage(msg);
+					chatHistory.push({
+						role: msg.role,
+						content: msg.content,
+					});
+				});
+			} else {
+				console.warn(
+					`Conversation ${conversationIdToLoad} not found. Starting new one.`,
+				);
+				conversationIdToLoad = null;
+			}
+		}
+
+		if (!conversationIdToLoad) {
+			currentConversationId = generateConversationId();
+			const now = Date.now();
+			currentConversation = {
+				id: currentConversationId,
+				title: "New Chat",
+				createdAt: now,
+				lastModifiedAt: now,
+				profile: currentProfile,
+			};
+			await addConversation(currentConversation);
+			chatHistory = [];
+			if (messageContainerRef.el) messageContainerRef.el.innerHTML = "";
+		}
+		updateHistorySidebar();
+		if (chatInputRef.el) chatInputRef.el.focus();
+	}
+
+	async function saveUserMessageAndUpdateConversation(
+		userMessage,
+		currentConv,
+		isFirstUIMessage,
+	) {
+		if (isFirstUIMessage && currentConv && currentConv.title === "New Chat") {
+			currentConv.title =
+				userMessage.content.substring(0, 30) +
+				(userMessage.content.length > 30 ? "..." : "");
+		}
+		if (currentConv) {
+			currentConv.lastModifiedAt = Date.now();
+			await updateConversation(currentConv);
+		}
+		await addMessageToDB(userMessage);
+	}
+
+	const handleSendBtn = async () => {
+		const userInput = chatInputRef.value.trim();
+
+		if (!userInput) return;
+		if (!currentConversationId) {
+			alert("Error: No active conversation. Please start a new chat.");
+			return;
+		}
+
+		const userMsgId = {
+			id: generateMessageId(),
+			conversationId: currentConversationId,
+			role: "user",
+			content: userInput,
+			timestamp: Date.now(),
+		};
+		addMessage(userMsgId);
+
+		const userMessageForAgent = {
+			role: "user",
+			content: userInput,
+		};
+		chatHistory.push(userMessageForAgent);
+
+		chatInputRef.el.value = "";
+		handleChatInput();
+		saveUserMessageAndUpdateConversation(
+			userMsgId,
+			currentConversation,
+			chatHistory.filter((msg) => msg.role === "user").length === 1,
+		);
+
+		showLoading();
+
+		let messagesForAgentTurn;
+		const systemPrompt = {
+			role: "system",
+			content: `You are an AI assistant in Acode code editor. Profile: ${currentProfile}. Be helpful and concise.`,
+		};
+		//Gemini Api expects system prompt as first message
+		if (chatHistory.filter((msg) => msg.role === "user").length === 1) {
+			messagesForAgentTurn = [systemPrompt, userMessageForAgent];
+		} else {
+			messagesForAgentTurn = [userMessageForAgent];
+		}
+
+		currentController = new AbortController();
+		sendBtnRef.el.style.display = "none";
+		stopBtnRef.el.style.display = "block";
+
+		const assistantMsgId = generateMessageId();
+		let streamedContent = "";
+		let wasError = false;
+		let finalTimestamp = Date.now();
+		const md = markdownIt({
+			html: true,
+			linkify: true,
+			typographer: true,
+		});
+
+		try {
+			const assistantPlaceholderMsg = {
+				id: assistantMsgId,
+				conversationId: currentConversationId,
+				role: "assistant",
+				content: "▌",
+				timestamp: Date.now(),
+			};
+			addMessage(assistantPlaceholderMsg);
+
+			const messageElContent = messageContainerRef.el.querySelector(
+				`#message-${assistantMsgId} .message-content`,
+			);
+			removeLoading();
+
+			//Chat history not passed anymore, memory saver and checkpoint will handle context
+			const inputsForAgent = {
+				messages: messagesForAgentTurn,
+			};
+
+			const stream = await agent.stream(inputsForAgent, {
+				streamMode: "messages",
+				signal: currentController.signal,
+				//thread_id is the checkpoint marker
+				configurable: {
+					thread_id: currentConversationId,
+				},
+			});
+
+			for await (const eventData of stream) {
+				let messageChunkPayload = null;
+				if (
+					Array.isArray(eventData) &&
+					eventData.length > 0 &&
+					eventData[0] &&
+					typeof eventData[0].content !== "undefined"
+				) {
+					messageChunkPayload = eventData[0];
+				} else if (eventData && typeof eventData.content !== "undefined") {
+					messageChunkPayload = eventData;
+				}
+
+				let chunkText = "";
+				if (messageChunkPayload) {
+					if (
+						isAIMessageChunk(messageChunkPayload) &&
+						messageChunkPayload.tool_call_chunks?.length
+					) {
+						chunkText = messageChunkPayload.tool_call_chunks
+							.map((tc) => (tc.args ? JSON.stringify(tc.args) : ""))
+							.join("\n");
+					} else if (typeof messageChunkPayload.content === "string") {
+						chunkText = messageChunkPayload.content;
+					} else if (typeof messageChunkPayload === "string") {
+						chunkText = messageChunkPayload;
+					}
+				}
+
+				if (chunkText) {
+					streamedContent += chunkText;
+					if (messageElContent) {
+						messageElContent.innerHTML = md.render(streamedContent + " ▌");
+						scrollToBottom();
+					}
+				}
+			}
+			finalTimestamp = Date.now();
+			if (messageElContent) {
+				messageElContent.innerHTML = md.render(streamedContent);
+			}
+		} catch (err) {
+			removeLoading();
+			wasError = true;
+			finalTimestamp = Date.now();
+			const isAbort =
+				err.name === "AbortError" ||
+				(err.message && /abort/i.test(err.message));
+			streamedContent = isAbort
+				? "Streaming cancelled by user."
+				: `Error: ${err.message || "Unknown error."}`;
+
+			const targetMessageElContent = messageContainerRef.el.querySelector(
+				`#message-${assistantMsgId} .message-content`,
+			);
+			if (targetMessageElContent) {
+				const errorColor = isAbort
+					? "var(--warning-text-color)"
+					: "var(--error-text-color)";
+				targetMessageElContent.innerHTML = `${isAbort ? streamedContent : md.render(streamedContent)}`;
+			}
+		} finally {
+			currentController = null;
+			if (sendBtnRef.el) sendBtnRef.el.style.display = "block";
+			if (stopBtnRef.el) stopBtnRef.el.style.display = "none";
+			handleChatInput();
+
+			const assistantFinalData = {
+				id: assistantMsgId,
+				conversationId: currentConversationId,
+				role: "assistant",
+				content: streamedContent,
+				timestamp: finalTimestamp,
+			};
+			await addMessageToDB(assistantFinalData);
+			if (currentConversation && !wasError) {
+				currentConversation.lastModifiedAt = finalTimestamp;
+				await updateConversation(currentConversation);
+			}
+
+			if (!wasError) {
+				chatHistory.push({
+					role: "assistant",
+					content: streamedContent,
+				});
+			}
+			updateHistorySidebar();
+
+			const messageContentElToFinalize = messageContainerRef.el?.querySelector(
+				`#message-${assistantMsgId} .message-content`,
+			);
+			if (messageContentElToFinalize && !wasError) {
+				const timeEl = messageContainerRef.el.querySelector(
+					`#message-${assistantMsgId} .message-actions .message-time`,
+				);
+				if (timeEl) timeEl.textContent = formatTime(finalTimestamp);
+
+				messageContentElToFinalize.innerHTML =
+					messageContentElToFinalize.innerHTML.replace(
+						/
([\s\S]*?)<\/code><\/pre>/g,
+						(match, language, code) => {
+							language = language || "plaintext";
+							code = he.decode(code);
+							return `
             
${language}
@@ -471,204 +514,223 @@ export default function openAIAssistantPage() {
${code}
Show more
`; - } - ); - - messageContentElToFinalize.querySelectorAll(".code-block").forEach(codeBlock => { - const codeContent = codeBlock.querySelector(".code-content"); - const codeElement = codeBlock.querySelector("pre code"); - const copyButton = codeBlock.querySelector(".code-copy"); - const expandButton = codeBlock.querySelector(".code-expand"); - // expand/collapse functionality - expandButton.addEventListener("click", () => { - const isExpanded = codeContent.classList.contains("expanded"); - codeContent.classList.toggle("expanded", !isExpanded); - expandButton.innerHTML = isExpanded - ? ` Show more`: ` Show less`; - }); - - // Only show expand button if content overflows - if (codeContent.scrollHeight <= codeContent.clientHeight) { - expandButton.style.display = "none"; - } - - }); - } - } - }; - - const handleStopBtn = () => { - if (currentController) { - currentController?.abort(); - currentController = null; - stopBtnRef.el.style.display = "none"; - sendBtnRef.el.style.display = "block"; - } - }; - - - const aiAssistantContainer = ( -
- {/* Header */} -
-
- -
- -
-
- -
-
-
- -
-
- - {/* Main content */} -
-
-
-

CHAT HISTORY

- -
-
- {/* Populated by updateHistorySidebar */} -
-
- -
-
- {/* Messages are added by addMessage function */} -
-
-
- - {/* Input area */} -
-
- - -
- - -
-
-
-
- ); - - (async () => { - try { - const conversations = await getAllConversations(); - if (conversations.length > 0) { - await loadOrCreateConversation(conversations[0].id); - } else { - await loadOrCreateConversation(null); - } - } catch (error) { - console.error("Failed to initialize AI Assistant page or database:", error); - const errDiv = `
Failed to initialize AI Assistant: ${error.message}. Ensure SQLite plugin is functional.
`; - if (messageContainerRef.el) { - // Check after potential rendering by EditorFile - messageContainerRef.el.innerHTML = errDiv; - } else { - - alert(`Critical Error: AI Assistant failed to initialize. ${error.message}`); - } - } - })(); - - const uri = "ai://assistant"; - const existingFile = window.editorManager.getFile(uri, - "uri"); - if (existingFile) { - existingFile.makeActive(); - return; - } - - aiTabInstance = new EditorFile("AI Assistant", { - uri: uri, type: "page", tabIcon: "file file_type_assistant", - content: aiAssistantContainer, - render: true, - stylesheets: [styles], - hideQuickTools: true, - }); -} \ No newline at end of file + }, + ); + + messageContentElToFinalize + .querySelectorAll(".code-block") + .forEach((codeBlock) => { + const codeContent = codeBlock.querySelector(".code-content"); + const codeElement = codeBlock.querySelector("pre code"); + const copyButton = codeBlock.querySelector(".code-copy"); + const expandButton = codeBlock.querySelector(".code-expand"); + // expand/collapse functionality + expandButton.addEventListener("click", () => { + const isExpanded = codeContent.classList.contains("expanded"); + codeContent.classList.toggle("expanded", !isExpanded); + expandButton.innerHTML = isExpanded + ? ` Show more` + : ` Show less`; + }); + + // Only show expand button if content overflows + if (codeContent.scrollHeight <= codeContent.clientHeight) { + expandButton.style.display = "none"; + } + }); + } + } + }; + + const handleStopBtn = () => { + if (currentController) { + currentController?.abort(); + currentController = null; + stopBtnRef.el.style.display = "none"; + sendBtnRef.el.style.display = "block"; + } + }; + + const aiAssistantContainer = ( +
+ {/* Header */} +
+
+ +
+ +
+
+ +
+
+
+ +
+
+ + {/* Main content */} +
+
+
+

CHAT HISTORY

+ +
+
+ {/* Populated by updateHistorySidebar */} +
+
+ +
+
+ {/* Messages are added by addMessage function */} +
+
+
+ + {/* Input area */} +
+
+ + +
+ + +
+
+
+
+ ); + + (async () => { + try { + const conversations = await getAllConversations(); + if (conversations.length > 0) { + await loadOrCreateConversation(conversations[0].id); + } else { + await loadOrCreateConversation(null); + } + } catch (error) { + console.error( + "Failed to initialize AI Assistant page or database:", + error, + ); + const errDiv = `
Failed to initialize AI Assistant: ${error.message}. Ensure SQLite plugin is functional.
`; + if (messageContainerRef.el) { + // Check after potential rendering by EditorFile + messageContainerRef.el.innerHTML = errDiv; + } else { + alert( + `Critical Error: AI Assistant failed to initialize. ${error.message}`, + ); + } + } + })(); + + const uri = "ai://assistant"; + const existingFile = window.editorManager.getFile(uri, "uri"); + if (existingFile) { + existingFile.makeActive(); + return; + } + + aiTabInstance = new EditorFile("AI Assistant", { + uri: uri, + type: "page", + tabIcon: "file file_type_assistant", + content: aiAssistantContainer, + render: true, + stylesheets: [styles], + hideQuickTools: true, + }); +} diff --git a/src/pages/aiAssistant/db.js b/src/pages/aiAssistant/db.js index bb96a3447..32e69f98f 100644 --- a/src/pages/aiAssistant/db.js +++ b/src/pages/aiAssistant/db.js @@ -7,38 +7,42 @@ let db = null; // Function to open or create the database function openDB() { - return new Promise((resolve, reject) => { - if (db) { - return resolve(db); - } - if (!window.sqlitePlugin) { - const msg = "SQLite plugin is not available. Make sure cordova-sqlite-storage is installed and deviceready has fired."; - console.error(msg); - // TODO: Maybe want to queue DB operations or show an error to the user - return reject(new Error(msg)); - } + return new Promise((resolve, reject) => { + if (db) { + return resolve(db); + } + if (!window.sqlitePlugin) { + const msg = + "SQLite plugin is not available. Make sure cordova-sqlite-storage is installed and deviceready has fired."; + console.error(msg); + // TODO: Maybe want to queue DB operations or show an error to the user + return reject(new Error(msg)); + } - db = window.sqlitePlugin.openDatabase( - { name: DB_NAME, location: DB_LOCATION }, - (openedDb) => { - console.log("SQLite DB opened successfully"); - db = openedDb; // Assign the opened DB instance - initializeTables().then(() => resolve(db)).catch(reject); - }, - (error) => { - console.error("Error opening SQLite DB:", JSON.stringify(error)); - reject(error); - } - ); - }); + db = window.sqlitePlugin.openDatabase( + { name: DB_NAME, location: DB_LOCATION }, + (openedDb) => { + console.log("SQLite DB opened successfully"); + db = openedDb; // Assign the opened DB instance + initializeTables() + .then(() => resolve(db)) + .catch(reject); + }, + (error) => { + console.error("Error opening SQLite DB:", JSON.stringify(error)); + reject(error); + }, + ); + }); } // Function to initialize tables if they don't exist function initializeTables() { - return new Promise((resolve, reject) => { - if (!db) return reject(new Error("DB not open for table initialization")); - db.transaction((tx) => { - tx.executeSql(` + return new Promise((resolve, reject) => { + if (!db) return reject(new Error("DB not open for table initialization")); + db.transaction( + (tx) => { + tx.executeSql(` CREATE TABLE IF NOT EXISTS conversations ( id TEXT PRIMARY KEY, title TEXT, @@ -47,7 +51,7 @@ function initializeTables() { profile TEXT ) `); - tx.executeSql(` + tx.executeSql(` CREATE TABLE IF NOT EXISTS messages ( id TEXT PRIMARY KEY, conversationId TEXT, @@ -57,159 +61,207 @@ function initializeTables() { FOREIGN KEY (conversationId) REFERENCES conversations(id) ON DELETE CASCADE ) `); - // Index for faster querying of messages by conversationId and sorting - tx.executeSql(`CREATE INDEX IF NOT EXISTS idx_messages_conversationId_timestamp ON messages (conversationId, timestamp)`); - tx.executeSql(`CREATE INDEX IF NOT EXISTS idx_conversations_lastModifiedAt ON conversations (lastModifiedAt)`); - - }, (error) => { - console.error("Transaction error during table initialization:", JSON.stringify(error)); - reject(error); - }, () => { - console.log("Tables initialized (or already exist)."); - resolve(); - }); - }); + // Index for faster querying of messages by conversationId and sorting + tx.executeSql( + `CREATE INDEX IF NOT EXISTS idx_messages_conversationId_timestamp ON messages (conversationId, timestamp)`, + ); + tx.executeSql( + `CREATE INDEX IF NOT EXISTS idx_conversations_lastModifiedAt ON conversations (lastModifiedAt)`, + ); + }, + (error) => { + console.error( + "Transaction error during table initialization:", + JSON.stringify(error), + ); + reject(error); + }, + () => { + console.log("Tables initialized (or already exist)."); + resolve(); + }, + ); + }); } // --- Helper for executing SQL --- function executeSqlAsync(transaction, sql, params = []) { - return new Promise((resolve, reject) => { - transaction.executeSql(sql, params, - (tx, resultSet) => resolve(resultSet), - (tx, error) => { - console.error("SQL Error:", error.message, "Query:", sql, "Params:", params); - reject(error); - } - ); - }); + return new Promise((resolve, reject) => { + transaction.executeSql( + sql, + params, + (tx, resultSet) => resolve(resultSet), + (tx, error) => { + console.error( + "SQL Error:", + error.message, + "Query:", + sql, + "Params:", + params, + ); + reject(error); + }, + ); + }); } - // --- Conversation Functions --- export async function addConversation(conversation) { - await openDB(); - return new Promise((resolve, reject) => { - db.transaction(async (tx) => { - try { - await executeSqlAsync(tx, - "INSERT INTO conversations (id, title, createdAt, lastModifiedAt, profile) VALUES (?, ?, ?, ?, ?)", - [conversation.id, conversation.title, conversation.createdAt, conversation.lastModifiedAt, conversation.profile] - ); - resolve(conversation.id); - } catch (error) { - reject(error); - } - }); - }); + await openDB(); + return new Promise((resolve, reject) => { + db.transaction(async (tx) => { + try { + await executeSqlAsync( + tx, + "INSERT INTO conversations (id, title, createdAt, lastModifiedAt, profile) VALUES (?, ?, ?, ?, ?)", + [ + conversation.id, + conversation.title, + conversation.createdAt, + conversation.lastModifiedAt, + conversation.profile, + ], + ); + resolve(conversation.id); + } catch (error) { + reject(error); + } + }); + }); } export async function getConversation(id) { - await openDB(); - return new Promise((resolve, reject) => { - db.readTransaction(async (tx) => { // Use readTransaction for reads - try { - const resultSet = await executeSqlAsync(tx, "SELECT * FROM conversations WHERE id = ?", [id]); - if (resultSet.rows.length > 0) { - resolve(resultSet.rows.item(0)); - } else { - resolve(null); // Or undefined, consistent with IndexedDB version - } - } catch (error) { - reject(error); - } - }); - }); + await openDB(); + return new Promise((resolve, reject) => { + db.readTransaction(async (tx) => { + // Use readTransaction for reads + try { + const resultSet = await executeSqlAsync( + tx, + "SELECT * FROM conversations WHERE id = ?", + [id], + ); + if (resultSet.rows.length > 0) { + resolve(resultSet.rows.item(0)); + } else { + resolve(null); // Or undefined, consistent with IndexedDB version + } + } catch (error) { + reject(error); + } + }); + }); } export async function getAllConversations() { - await openDB(); - return new Promise((resolve, reject) => { - db.readTransaction(async (tx) => { - try { - const resultSet = await executeSqlAsync(tx, "SELECT * FROM conversations ORDER BY lastModifiedAt DESC"); - const conversations = []; - for (let i = 0; i < resultSet.rows.length; i++) { - conversations.push(resultSet.rows.item(i)); - } - resolve(conversations); - } catch (error) { - reject(error); - } - }); - }); + await openDB(); + return new Promise((resolve, reject) => { + db.readTransaction(async (tx) => { + try { + const resultSet = await executeSqlAsync( + tx, + "SELECT * FROM conversations ORDER BY lastModifiedAt DESC", + ); + const conversations = []; + for (let i = 0; i < resultSet.rows.length; i++) { + conversations.push(resultSet.rows.item(i)); + } + resolve(conversations); + } catch (error) { + reject(error); + } + }); + }); } export async function updateConversation(conversation) { - await openDB(); - return new Promise((resolve, reject) => { - db.transaction(async (tx) => { - try { - await executeSqlAsync(tx, - "UPDATE conversations SET title = ?, lastModifiedAt = ?, profile = ? WHERE id = ?", - [conversation.title, conversation.lastModifiedAt, conversation.profile, conversation.id] - ); - resolve(conversation.id); - } catch (error) { - reject(error); - } - }); - }); + await openDB(); + return new Promise((resolve, reject) => { + db.transaction(async (tx) => { + try { + await executeSqlAsync( + tx, + "UPDATE conversations SET title = ?, lastModifiedAt = ?, profile = ? WHERE id = ?", + [ + conversation.title, + conversation.lastModifiedAt, + conversation.profile, + conversation.id, + ], + ); + resolve(conversation.id); + } catch (error) { + reject(error); + } + }); + }); } // --- Message Functions --- export async function addMessageToDB(message) { - await openDB(); - return new Promise((resolve, reject) => { - db.transaction(async (tx) => { - try { - await executeSqlAsync(tx, - "INSERT INTO messages (id, conversationId, role, content, timestamp) VALUES (?, ?, ?, ?, ?)", - [message.id, message.conversationId, message.role, message.content, message.timestamp] - ); - resolve(message.id); - } catch (error) { - reject(error); - } - }); - }); + await openDB(); + return new Promise((resolve, reject) => { + db.transaction(async (tx) => { + try { + await executeSqlAsync( + tx, + "INSERT INTO messages (id, conversationId, role, content, timestamp) VALUES (?, ?, ?, ?, ?)", + [ + message.id, + message.conversationId, + message.role, + message.content, + message.timestamp, + ], + ); + resolve(message.id); + } catch (error) { + reject(error); + } + }); + }); } export async function getMessagesForConversation(conversationId) { - await openDB(); - return new Promise((resolve, reject) => { - db.readTransaction(async (tx) => { - try { - const resultSet = await executeSqlAsync(tx, - "SELECT * FROM messages WHERE conversationId = ? ORDER BY timestamp ASC", - [conversationId] - ); - const messages = []; - for (let i = 0; i < resultSet.rows.length; i++) { - messages.push(resultSet.rows.item(i)); - } - resolve(messages); - } catch (error) { - reject(error); - } - }); - }); + await openDB(); + return new Promise((resolve, reject) => { + db.readTransaction(async (tx) => { + try { + const resultSet = await executeSqlAsync( + tx, + "SELECT * FROM messages WHERE conversationId = ? ORDER BY timestamp ASC", + [conversationId], + ); + const messages = []; + for (let i = 0; i < resultSet.rows.length; i++) { + messages.push(resultSet.rows.item(i)); + } + resolve(messages); + } catch (error) { + reject(error); + } + }); + }); } // --- Deletion functions (example) --- export async function deleteConversation(conversationId) { - await openDB(); - return new Promise((resolve, reject) => { - db.transaction(async (tx) => { - try { - // CASCADE DELETE on messages table should handle associated messages - await executeSqlAsync(tx, "DELETE FROM conversations WHERE id = ?", [conversationId]); - console.log(`Conversation ${conversationId} and its messages deleted.`); - resolve(); - } catch (error) { - reject(error); - } - }); - }); + await openDB(); + return new Promise((resolve, reject) => { + db.transaction(async (tx) => { + try { + // CASCADE DELETE on messages table should handle associated messages + await executeSqlAsync(tx, "DELETE FROM conversations WHERE id = ?", [ + conversationId, + ]); + console.log(`Conversation ${conversationId} and its messages deleted.`); + resolve(); + } catch (error) { + reject(error); + } + }); + }); } -// Ensure DB is opened and tables initialized when module loads or on first call \ No newline at end of file +// Ensure DB is opened and tables initialized when module loads or on first call From b8310482d098e29ef5b301af79f98531102d25bd Mon Sep 17 00:00:00 2001 From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com> Date: Sun, 1 Jun 2025 13:34:03 +0530 Subject: [PATCH 09/26] fix: highlighting, message sync, searchTool --- src/pages/aiAssistant/assistant.js | 214 ++++++++++++++------ src/pages/aiAssistant/assistant.module.scss | 3 + 2 files changed, 154 insertions(+), 63 deletions(-) diff --git a/src/pages/aiAssistant/assistant.js b/src/pages/aiAssistant/assistant.js index 6f04f1d02..4aafb185d 100644 --- a/src/pages/aiAssistant/assistant.js +++ b/src/pages/aiAssistant/assistant.js @@ -36,6 +36,10 @@ export default function openAIAssistantPage() { let aiTabInstance; const GEMINI_API_KEY = ""; // Replace + + const searchTool = { + googleSearch: {}, + }; const agentCheckpointer = new MemorySaver(); const model = new ChatGoogleGenerativeAI({ model: "gemini-2.0-flash", @@ -43,7 +47,7 @@ export default function openAIAssistantPage() { }); const agent = createReactAgent({ llm: model, - tools: [], + tools: [searchTool], checkpointSaver: agentCheckpointer, }); @@ -68,6 +72,115 @@ export default function openAIAssistantPage() { messageContainerRef.el.scrollTop = messageContainerRef.el.scrollHeight; }; + // Format code blocks with custom UI elements + const formatCodeBlocks = (contentElement, content) => { + if (!contentElement) return; + + const md = markdownIt({ + html: true, + linkify: true, + typographer: true, + }); + + contentElement.innerHTML = md.render(content); + + contentElement.innerHTML = contentElement.innerHTML.replace( + /
([\s\S]*?)<\/code><\/pre>/g,
+			(match, language, code) => {
+				language = language || "plaintext";
+				code = he.decode(code);
+				return `
+					
+
+
+ + ${language} +
+
+ +
+
+
+
${code}
+
+
+ + Show more +
+
+ `; + }, + ); + + contentElement.querySelectorAll(".code-block").forEach((codeBlock) => { + const codeContent = codeBlock.querySelector(".code-content"); + const codeElement = codeBlock.querySelector("pre code"); + const copyButton = codeBlock.querySelector(".code-copy"); + const expandButton = codeBlock.querySelector(".code-expand"); + + // Apply Ace highlighting + if (codeElement) { + const langMatch = codeElement.className.match(/language-(\w+)/); + if (langMatch) { + const langMap = { + bash: "sh", + shell: "sh", + }; + const lang = langMatch[1]; + const mappedLang = langMap[lang] || lang; + const highlight = ace.require("ace/ext/static_highlight"); + highlight.render( + codeElement.textContent, + `ace/mode/${mappedLang}`, + settings.value.editorTheme.startsWith("ace/theme/") + ? settings.value.editorTheme + : "ace/theme/" + settings.value.editorTheme, + 1, + true, + (highlighted) => { + aiTabInstance?.addStyle(highlighted.css); + codeElement.innerHTML = highlighted.html; + }, + ); + } + } + + // copy functionality + copyButton.addEventListener("click", async () => { + const code = codeElement?.textContent || ""; + try { + cordova.plugins.clipboard.copy(code); + copyButton.querySelector("i").className = "icon check"; + setTimeout(() => { + copyButton.querySelector("i").className = "icon copy"; + }, 2000); + } catch (err) { + copyButton.querySelector("i").className = + "icon warningreport_problem"; + setTimeout(() => { + copyButton.querySelector("i").className = "icon copy"; + }, 2000); + } + }); + + // expand/collapse functionality + expandButton.addEventListener("click", () => { + const isExpanded = codeContent.classList.contains("expanded"); + codeContent.classList.toggle("expanded", !isExpanded); + expandButton.innerHTML = isExpanded + ? ` Show more` + : ` Show less`; + }); + + // Only show expand button if content overflows + if (codeContent.scrollHeight <= codeContent.clientHeight) { + expandButton.style.display = "none"; + } + }); + }; + const addMessage = (message) => { const messageEl = tag("div", { className: `message ${message.role === "user" ? "user" : ""}`, @@ -124,7 +237,8 @@ export default function openAIAssistantPage() { if (message.role === "user") { messageContent.textContent = message.content; } else { - messageContent.innerHTML = markdownIt().render(message.content); + const md = markdownIt(); + messageContent.innerHTML = md.render(message.content); } messageEl.appendChild(messageHeader); @@ -229,8 +343,10 @@ export default function openAIAssistantPage() { const item = document.createElement("div"); item.className = `history-item ${conv.id === currentConversationId ? "active" : ""}`; item.onclick = () => { - if (conv.id !== currentConversationId) + if (conv.id !== currentConversationId) { loadOrCreateConversation(conv.id); + toggleHistorySidebar(); + } }; const iconWrapper = document.createElement("div"); @@ -265,6 +381,14 @@ export default function openAIAssistantPage() { chatHistory = []; messagesFromDB.forEach((msg) => { addMessage(msg); + if (msg.role === "assistant") { + formatCodeBlocks( + messageContainerRef.el.querySelector( + `#message-${msg.id} .message-content`, + ), + msg.content, + ); + } chatHistory.push({ role: msg.role, content: msg.content, @@ -374,20 +498,6 @@ export default function openAIAssistantPage() { }); try { - const assistantPlaceholderMsg = { - id: assistantMsgId, - conversationId: currentConversationId, - role: "assistant", - content: "▌", - timestamp: Date.now(), - }; - addMessage(assistantPlaceholderMsg); - - const messageElContent = messageContainerRef.el.querySelector( - `#message-${assistantMsgId} .message-content`, - ); - removeLoading(); - //Chat history not passed anymore, memory saver and checkpoint will handle context const inputsForAgent = { messages: messagesForAgentTurn, @@ -402,6 +512,22 @@ export default function openAIAssistantPage() { }, }); + // Remove loading indicator + removeLoading(); + + const assistantPlaceholderMsg = { + id: assistantMsgId, + conversationId: currentConversationId, + role: "assistant", + content: "▌", + timestamp: Date.now(), + }; + addMessage(assistantPlaceholderMsg); + + const messageElContent = messageContainerRef.el.querySelector( + `#message-${assistantMsgId} .message-content`, + ); + for await (const eventData of stream) { let messageChunkPayload = null; if ( @@ -450,18 +576,18 @@ export default function openAIAssistantPage() { const isAbort = err.name === "AbortError" || (err.message && /abort/i.test(err.message)); - streamedContent = isAbort - ? "Streaming cancelled by user." - : `Error: ${err.message || "Unknown error."}`; + + const errorContent = isAbort + ? `Streaming cancelled by user.` + : `Error: ${err.message || "Unknown error."}`; + + streamedContent += errorContent; const targetMessageElContent = messageContainerRef.el.querySelector( `#message-${assistantMsgId} .message-content`, ); if (targetMessageElContent) { - const errorColor = isAbort - ? "var(--warning-text-color)" - : "var(--error-text-color)"; - targetMessageElContent.innerHTML = `${isAbort ? streamedContent : md.render(streamedContent)}`; + targetMessageElContent.innerHTML += errorContent; } } finally { currentController = null; @@ -499,45 +625,7 @@ export default function openAIAssistantPage() { ); if (timeEl) timeEl.textContent = formatTime(finalTimestamp); - messageContentElToFinalize.innerHTML = - messageContentElToFinalize.innerHTML.replace( - /
([\s\S]*?)<\/code><\/pre>/g,
-						(match, language, code) => {
-							language = language || "plaintext";
-							code = he.decode(code);
-							return `
-            
-
-
${language}
-
-
-
${code}
-
Show more
-
`; - }, - ); - - messageContentElToFinalize - .querySelectorAll(".code-block") - .forEach((codeBlock) => { - const codeContent = codeBlock.querySelector(".code-content"); - const codeElement = codeBlock.querySelector("pre code"); - const copyButton = codeBlock.querySelector(".code-copy"); - const expandButton = codeBlock.querySelector(".code-expand"); - // expand/collapse functionality - expandButton.addEventListener("click", () => { - const isExpanded = codeContent.classList.contains("expanded"); - codeContent.classList.toggle("expanded", !isExpanded); - expandButton.innerHTML = isExpanded - ? ` Show more` - : ` Show less`; - }); - - // Only show expand button if content overflows - if (codeContent.scrollHeight <= codeContent.clientHeight) { - expandButton.style.display = "none"; - } - }); + formatCodeBlocks(messageContentElToFinalize, streamedContent); } } }; diff --git a/src/pages/aiAssistant/assistant.module.scss b/src/pages/aiAssistant/assistant.module.scss index c732137b9..a0a354afb 100644 --- a/src/pages/aiAssistant/assistant.module.scss +++ b/src/pages/aiAssistant/assistant.module.scss @@ -413,6 +413,9 @@ font-size: 0.625rem; font-weight: 500; margin-right: 0.25rem; + word-break: break-word; + overflow-wrap: break-word; + white-space: normal; } .badge-blue { From 863382bc1003fe97625bdb9ea382e3bea50e75ff Mon Sep 17 00:00:00 2001 From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com> Date: Sun, 1 Jun 2025 23:08:00 +0530 Subject: [PATCH 10/26] feat: add delete history button and improved few ui styling --- src/pages/aiAssistant/assistant.js | 67 ++++++++++++----- src/pages/aiAssistant/assistant.module.scss | 80 +++++++++++++++++++-- 2 files changed, 124 insertions(+), 23 deletions(-) diff --git a/src/pages/aiAssistant/assistant.js b/src/pages/aiAssistant/assistant.js index 4aafb185d..3b4cb21e5 100644 --- a/src/pages/aiAssistant/assistant.js +++ b/src/pages/aiAssistant/assistant.js @@ -2,6 +2,7 @@ import { isAIMessageChunk } from "@langchain/core/messages"; import { ChatGoogleGenerativeAI } from "@langchain/google-genai"; import { MemorySaver } from "@langchain/langgraph-checkpoint"; import { createReactAgent } from "@langchain/langgraph/prebuilt"; +import confirm from "dialogs/confirm"; import select from "dialogs/select"; import he from "he"; import Ref from "html-tag-js/ref"; @@ -340,26 +341,51 @@ export default function openAIAssistantPage() { if (!historyItemsContainer) return; historyItemsContainer.innerHTML = ""; conversations.forEach((conv) => { - const item = document.createElement("div"); - item.className = `history-item ${conv.id === currentConversationId ? "active" : ""}`; - item.onclick = () => { - if (conv.id !== currentConversationId) { - loadOrCreateConversation(conv.id); - toggleHistorySidebar(); - } - }; + const item = ( +
{ + if (conv.id !== currentConversationId) { + loadOrCreateConversation(conv.id); + toggleHistorySidebar(); + } + }} + /> + ); + + const iconWrapper = ( +
+ +
+ ); - const iconWrapper = document.createElement("div"); - iconWrapper.className = "history-icon"; - const icon = document.createElement("i"); - icon.className = `icon ${conv.profile === "write" ? "edit" : "chat_bubble"}`; - iconWrapper.appendChild(icon); + const text = ( +
{conv.title || "Untitled Chat"}
+ ); - const text = document.createElement("div"); - text.className = "history-text"; - text.textContent = conv.title || "Untitled Chat"; + const deleteBtn = ( + + ); + deleteBtn.onclick = async (e) => { + e.stopPropagation(); + const confirmation = await confirm( + "Delete Chat", + `Are you sure you want to delete "${conv.title || "Untitled Chat"}"? This action cannot be undone.`, + true, + ); + if (!confirmation) return; + await deleteConversation(conv.id); + if (conv.id === currentConversationId) { + await loadOrCreateConversation(null); + } + await updateHistorySidebar(); + }; - item.append(iconWrapper, text); + item.append(iconWrapper, text, deleteBtn); historyItemsContainer.appendChild(item); }); } @@ -696,9 +722,12 @@ export default function openAIAssistantPage() { >

CHAT HISTORY

-
diff --git a/src/pages/aiAssistant/assistant.module.scss b/src/pages/aiAssistant/assistant.module.scss index a0a354afb..548c37c85 100644 --- a/src/pages/aiAssistant/assistant.module.scss +++ b/src/pages/aiAssistant/assistant.module.scss @@ -92,20 +92,24 @@ cursor: pointer; margin-bottom: 0.25rem; transition: all 0.2s ease; + position: relative; &:hover { background-color: color-mix( in srgb, - var(--popup-background-color) 20%, - transparent + var(--popup-background-color) 70%, + white ); } + &:hover .history-delete { + opacity: 1; + } &.active { background-color: color-mix( in srgb, - var(--popup-background-color) 20%, - transparent + var(--popup-background-color) 70%, + white ); } @@ -123,6 +127,25 @@ overflow: hidden; text-overflow: ellipsis; } + + .history-delete { + opacity: 0; + transition: all 0.2s ease; + margin-left: auto; + width: 1.25rem; + height: 1.25rem; + padding: 0; + color: color-mix( + in srgb, + var(--secondary-text-color) 70%, + transparent + ); + + &:hover { + color: var(--error-text-color); + background-color: rgba(229, 62, 62, 0.1); + } + } } } @@ -138,6 +161,55 @@ width: calc(100% - 240px); } + .edit-container { + margin-top: 0.75rem; + padding: 0.75rem; + background-color: color-mix( + in srgb, + var(--popup-background-color) 20%, + transparent + ); + border-radius: 0.375rem; + border: 1px solid var(--border-color); + } + + .edit-textarea { + width: 100%; + min-height: 100px; + padding: 0.75rem; + background-color: var(--primary-color); + border: 1px solid var(--border-color); + border-radius: 0.375rem; + color: var(--primary-text-color); + font-size: 0.875rem; + resize: vertical; + transition: all 0.2s ease; + } + + .edit-textarea:focus { + outline: none; + border-color: var(--active-color); + box-shadow: 0 0 0 2px rgba(35, 116, 225, 0.1); + } + + .edit-actions { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: 0.75rem; + gap: 0.5rem; + } + + .edit-info { + font-size: 0.75rem; + color: color-mix(in srgb, var(--secondary-text-color) 70%, transparent); + } + + .edit-buttons { + display: flex; + gap: 0.5rem; + } + .messages-container { height: 100%; overflow-y: auto; From 4dbb288ec31e5da74a2087275cbcfd7f4296d850 Mon Sep 17 00:00:00 2001 From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com> Date: Sun, 1 Jun 2025 23:38:36 +0530 Subject: [PATCH 11/26] feat: system prompt and fix html rendering in codeblock --- src/pages/aiAssistant/assistant.js | 11 +++------- src/pages/aiAssistant/system_prompt.js | 29 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 src/pages/aiAssistant/system_prompt.js diff --git a/src/pages/aiAssistant/assistant.js b/src/pages/aiAssistant/assistant.js index 3b4cb21e5..1fd9b802d 100644 --- a/src/pages/aiAssistant/assistant.js +++ b/src/pages/aiAssistant/assistant.js @@ -4,7 +4,6 @@ import { MemorySaver } from "@langchain/langgraph-checkpoint"; import { createReactAgent } from "@langchain/langgraph/prebuilt"; import confirm from "dialogs/confirm"; import select from "dialogs/select"; -import he from "he"; import Ref from "html-tag-js/ref"; import EditorFile from "lib/editorFile"; import settings from "lib/settings"; @@ -19,6 +18,7 @@ import { getMessagesForConversation, updateConversation, } from "./db"; +import { SYSTEM_PROMPT } from "./system_prompt"; export default function openAIAssistantPage() { // References @@ -50,6 +50,7 @@ export default function openAIAssistantPage() { llm: model, tools: [searchTool], checkpointSaver: agentCheckpointer, + stateModifier: SYSTEM_PROMPT, }); const generateConversationId = () => @@ -89,7 +90,6 @@ export default function openAIAssistantPage() { /
([\s\S]*?)<\/code><\/pre>/g,
 			(match, language, code) => {
 				language = language || "plaintext";
-				code = he.decode(code);
 				return `
 					
@@ -498,13 +498,8 @@ export default function openAIAssistantPage() { showLoading(); let messagesForAgentTurn; - const systemPrompt = { - role: "system", - content: `You are an AI assistant in Acode code editor. Profile: ${currentProfile}. Be helpful and concise.`, - }; - //Gemini Api expects system prompt as first message if (chatHistory.filter((msg) => msg.role === "user").length === 1) { - messagesForAgentTurn = [systemPrompt, userMessageForAgent]; + messagesForAgentTurn = [userMessageForAgent]; } else { messagesForAgentTurn = [userMessageForAgent]; } diff --git a/src/pages/aiAssistant/system_prompt.js b/src/pages/aiAssistant/system_prompt.js new file mode 100644 index 000000000..9bec4bab5 --- /dev/null +++ b/src/pages/aiAssistant/system_prompt.js @@ -0,0 +1,29 @@ +export const SYSTEM_PROMPT = `You are a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. + +## Communication + +1. Be conversational but professional. +2. Refer to the user in the second person and yourself in the first person. +3. Format your responses in markdown. Use backticks to format file, directory, function, and class names. +4. NEVER lie or make things up. +5. Refrain from apologizing all the time when results are unexpected. Instead, just try your best to proceed or explain the circumstances to the user without apologizing. + +## Fixing Diagnostics + +1. Make 1-2 attempts at fixing diagnostics, then defer to the user. +2. Never simplify code you've written just to solve diagnostics. Complete, mostly correct code is more valuable than perfect code that doesn't solve the problem. + +## Debugging Guidelines + +When debugging, only make code changes if you are certain that you can solve the problem. +Otherwise, follow debugging best practices: +1. Address the root cause instead of the symptoms. +2. Add descriptive logging statements and error messages to track variable and code state. +3. Add test functions and statements to isolate the problem. + +## Calling External APIs + +1. Unless explicitly requested by the user, use the best suited external APIs and packages to solve the task. There is no need to ask the user for permission. +2. When selecting which version of an API or package to use, choose one that is compatible with the user's dependency management file(s). If no such file exists or if the package is not present, use the latest version that is in your training data. +3. If an external API requires an API Key, be sure to point this out to the user. Adhere to best security practices (e.g. DO NOT hardcode an API key in a place where it can be exposed) +`; From a1d34ce4068c6d39b9d6495ff6f01ea94737e117 Mon Sep 17 00:00:00 2001 From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com> Date: Mon, 2 Jun 2025 11:28:21 +0530 Subject: [PATCH 12/26] add edit ui(not the edit functionality) --- src/pages/aiAssistant/assistant.js | 78 ++++++++++++++++++++- src/pages/aiAssistant/assistant.module.scss | 13 ++-- 2 files changed, 82 insertions(+), 9 deletions(-) diff --git a/src/pages/aiAssistant/assistant.js b/src/pages/aiAssistant/assistant.js index 1fd9b802d..2d72e4381 100644 --- a/src/pages/aiAssistant/assistant.js +++ b/src/pages/aiAssistant/assistant.js @@ -222,8 +222,7 @@ export default function openAIAssistantPage() { child: tag("i", { className: "icon edit", }), - // TODO: Implement edit functionality - //onclick: () => editMessage(message.id), + onclick: () => editMessage(message.id), }); messageActions.appendChild(editBtn); } @@ -248,6 +247,74 @@ export default function openAIAssistantPage() { scrollToBottom(); }; + const editMessage = (messageId) => { + const message = chatHistory.find((msg) => msg.id === messageId); + if (!message) return; + + const messageEl = messageContainerRef.el.querySelector( + `#message-${message.id}`, + ); + const messageContent = messageEl.querySelector(".message-content"); + + const editContainer =
; + + const textarea = ( +