From 64a7f2de7c70f9fd2be4c1ce362b5c313e64ebcf Mon Sep 17 00:00:00 2001 From: Suresh Aski Date: Tue, 9 Dec 2025 09:57:48 +0000 Subject: [PATCH 01/26] feat: Add cq:template support and property validation (v2.0.0) Major Features: - Added automatic cq:template support for component initialization * Components with cq:template nodes now automatically apply their default structure * Recursively creates child nodes defined in templates * Merges template properties with provided properties * Ensures components like column controls initialize correctly - Implemented comprehensive property validation * Validates properties against component dialog definitions * Validates select/dropdown fields against available options * Validates checkbox fields for boolean values * Validates number fields for numeric values * Returns validation errors/warnings before applying changes Improvements: - Enhanced getComponentDefinition to extract detailed field definitions - Improved error messages for invalid property values - Better handling of component template structures Bug Fixes: - Fixed issue where components with cq:template were not initializing correctly - Fixed issue where invalid property values could cause component loading failures Documentation: - Updated API.md with new feature documentation - Updated CHANGELOG.md with v2.0.0 release notes - Updated package.json version to 2.0.0 - Updated repository URL to Netcentric/aem-mcp-server Build: - Project builds successfully with no compilation errors --- .editorconfig | 13 + .github/ISSUE_TEMPLATE.md | 15 + .github/PULL_REQUEST_TEMPLATE.md | 36 + .github/workflows/ci.yml | 31 + .github/workflows/codeql-analysis.yml | 43 + .github/workflows/manual-release.yml | 75 + .github/workflows/release.yml | 44 + .gitignore | 149 + .npmignore | 19 + .nvmrc | 1 + .releaserc | 20 + LICENSE | 22 + README.md | 125 + docs/API.md | 156 + docs/BULK_OPERATIONS.md | 149 + docs/CHANGELOG.md | 225 ++ docs/CODE_OF_CONDUCT.md | 74 + docs/CONTRIBUTING.md | 25 + docs/cursor.png | Bin 0 -> 177049 bytes package-lock.json | 3309 ++++++++++++++++++++++ package.json | 55 + src/aem/aem.auth.ts | 47 + src/aem/aem.config.ts | 82 + src/aem/aem.connector.ts | 3766 +++++++++++++++++++++++++ src/aem/aem.errors.ts | 168 ++ src/aem/aem.fetch.ts | 382 +++ src/cli.ts | 29 + src/config.ts | 8 + src/index.ts | 3 + src/mcp/mcp.aem-handler.ts | 151 + src/mcp/mcp.server-handler.ts | 91 + src/mcp/mcp.server.ts | 108 + src/mcp/mcp.tools.ts | 655 +++++ src/mcp/mcp.transports.ts | 5 + src/server/app.auth.ts | 32 + src/server/app.server.ts | 95 + src/types.ts | 8 + src/utils/logger.ts | 45 + tsconfig.json | 17 + 39 files changed, 10278 insertions(+) create mode 100644 .editorconfig create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/codeql-analysis.yml create mode 100644 .github/workflows/manual-release.yml create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 .npmignore create mode 100644 .nvmrc create mode 100644 .releaserc create mode 100644 LICENSE create mode 100644 README.md create mode 100644 docs/API.md create mode 100644 docs/BULK_OPERATIONS.md create mode 100644 docs/CHANGELOG.md create mode 100644 docs/CODE_OF_CONDUCT.md create mode 100644 docs/CONTRIBUTING.md create mode 100644 docs/cursor.png create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/aem/aem.auth.ts create mode 100644 src/aem/aem.config.ts create mode 100644 src/aem/aem.connector.ts create mode 100644 src/aem/aem.errors.ts create mode 100644 src/aem/aem.fetch.ts create mode 100644 src/cli.ts create mode 100644 src/config.ts create mode 100644 src/index.ts create mode 100644 src/mcp/mcp.aem-handler.ts create mode 100644 src/mcp/mcp.server-handler.ts create mode 100644 src/mcp/mcp.server.ts create mode 100644 src/mcp/mcp.tools.ts create mode 100644 src/mcp/mcp.transports.ts create mode 100644 src/server/app.auth.ts create mode 100644 src/server/app.server.ts create mode 100644 src/types.ts create mode 100644 src/utils/logger.ts create mode 100644 tsconfig.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..aaaa30d --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..dc79395 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,15 @@ + + +### Expected Behaviour + +### Actual Behaviour + +### Reproduce Scenario (including but not limited to) + +#### Steps to Reproduce + +#### Platform and Version + +#### Sample Code that illustrates the problem + +#### Logs taken while reproducing problem diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..856226c --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,36 @@ + + +## Description + + + +## Related Issue + + + + +Fixes # + +## Types of changes + + + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to change) + +## Checklist: + + + +- [ ] My code follows the code style of this project. +- [ ] I have read the **[CONTRIBUTING](docs/CONTRIBUTING.mnd)** document. +- [ ] All new and existing tests passed. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..66a86b3 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,31 @@ +name: CI + +on: + push: + branches: [ '**' ] + pull_request: + branches: [ $default-branch ] + +jobs: + build: + + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [ubuntu-latest] + node-version: [20.x] + + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + - name: Install dependencies + run: npm ci + - name: Build Library + run: npm run build --if-present + - name: Run Tests + run: npm test --if-present diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000..9bc6eab --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,43 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ main ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ main ] + schedule: + - cron: '20 12 * * 0' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + language: [ 'javascript' ] + steps: + - name: Checkout + uses: actions/checkout@v4 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/manual-release.yml b/.github/workflows/manual-release.yml new file mode 100644 index 0000000..64790bd --- /dev/null +++ b/.github/workflows/manual-release.yml @@ -0,0 +1,75 @@ +name: Manual Release +on: + workflow_dispatch: + inputs: + version: + description: 'Version' + type: choice + required: true + default: fix + options: + - fix + - feat + - BREAKING CHANGE + dryRun: + description: 'DryRun' + type: boolean + default: true +# ENV and Config +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + GIT_AUTHOR_NAME: github-actions + GIT_AUTHOR_EMAIL: github-actions@github.com + GIT_COMMITTER_NAME: github-actions + GIT_COMMITTER_EMAIL: github-actions@github.com + CI: true + CONFIG_NODE_VERSION: '["20.x"]' + CONFIG_OS: '["ubuntu-latest"]' +# Main Job +jobs: + config: + runs-on: ubuntu-latest + outputs: + NODE_VERSION: ${{ steps.set-config.outputs.CONFIG_NODE_VERSION }} + OS: ${{ steps.set-config.outputs.CONFIG_OS }} + steps: + - id: set-config + run: | + echo "CONFIG_NODE_VERSION=${{ toJSON(env.CONFIG_NODE_VERSION) }}" >> $GITHUB_OUTPUT + echo "CONFIG_OS=${{ toJSON(env.CONFIG_OS) }}" >> $GITHUB_OUTPUT + release: + name: Test, Build and force Release + needs: config + + runs-on: ${{ matrix.OS }} + strategy: + matrix: + OS: ${{ fromJSON(needs.config.outputs.OS) }} + NODE_VERSION: ${{ fromJSON(needs.config.outputs.NODE_VERSION) }} + + steps: + - name: Checkout repo + uses: actions/checkout@v4 + - name: Setup Node.js ${{ matrix.NODE_VERSION }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.NODE_VERSION }} + - name: Commit trigger + run: | + git commit --allow-empty -m "${{ github.event.inputs.version }}: Trigger Manual Release + + ${{ github.event.inputs.version }}:Forced Manual Release without code changes" + - name: Install dependencies + run: npm ci + - name: Build Library + run: npm run build --if-present + - name: Run Tests + run: npm test --if-present + - name: Publish npm package + uses: cycjimmy/semantic-release-action@v4 + with: + dry_run: ${{ github.event.inputs.dryRun == 'true' }} + extra_plugins: | + @semantic-release/changelog + @semantic-release/git diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..0999d40 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,44 @@ +name: Release + +on: + push: + branches: + - main + +jobs: + release: + name: Test, Build and Release + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ ubuntu-latest ] + node-version: [ 20.x ] + + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix['node-version'] }} + - name: Install dependencies + run: npm ci + - name: Build Library + run: npm run build --if-present + - name: Run Tests + run: npm test --if-present + - name: Release + uses: cycjimmy/semantic-release-action@v4 + with: + dry_run: false + extra_plugins: | + @semantic-release/changelog + @semantic-release/git + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + GIT_AUTHOR_NAME: github-actions + GIT_AUTHOR_EMAIL: github-actions@github.com + GIT_COMMITTER_NAME: github-actions + GIT_COMMITTER_EMAIL: github-actions@github.com + CI: true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9bd2e40 --- /dev/null +++ b/.gitignore @@ -0,0 +1,149 @@ +### Node template +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +/dist/* + +# IDE files +*.iml +.idea/ +.vscode/ +.cursor/ +*.swp +*.swo +*~ + +# AEM connection and auth files +.aem-connection.json +.aem-oauth-tokens.json + +# Backup directories +.backup/ diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..64c44d6 --- /dev/null +++ b/.npmignore @@ -0,0 +1,19 @@ +.eslintrc +.nyc_output +rollup.config.js +.prettierrc +.git +.prettierignore +**/.git/ +**/node_modules/ +yarn.lock +/docs +/public +/coverage +/.vscode +/tests +/temp +.idea +.github +.releaserc +.editorconfig diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..5b54067 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22.16.0 diff --git a/.releaserc b/.releaserc new file mode 100644 index 0000000..7c78d4c --- /dev/null +++ b/.releaserc @@ -0,0 +1,20 @@ +{ + "branches": ["main"], + "plugins": [ + "@semantic-release/commit-analyzer", + "@semantic-release/release-notes-generator", + [ + "@semantic-release/changelog", + { + "changelogFile": "docs/CHANGELOG.md" + } + ], + "@semantic-release/npm", + [ + "@semantic-release/git", + { + "assets": ["docs/CHANGELOG.md", "package.json"] + } + ] + ] +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..02feac7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2024 Venkatesh +Copyright (c) 2025 Indra + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ad427ba --- /dev/null +++ b/README.md @@ -0,0 +1,125 @@ +# AEM MCP Server (aem-mcp-server) + +[![Version](https://img.shields.io/npm/v/aem-mcp-server.svg)](https://npmjs.org/package/aem-mcp-server) +[![Release Status](https://github.com/easingthemes/aem-mcp-server/actions/workflows/release.yml/badge.svg)](https://github.com/easingthemes/aem-mcp-server/actions/workflows/release.yml) +[![CodeQL Analysis](https://github.com/easingthemes/aem-mcp-server/workflows/CodeQL/badge.svg?branch=main)](https://github.com/easingthemes/aem-mcp-server/actions) +[![semver: semantic-release](https://img.shields.io/badge/semver-semantic--release-blue.svg)](https://github.com/semantic-release/semantic-release) +[![MIT License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) + +AEM MCP Server is a full-featured Model Context Protocol (MCP) server for Adobe Experience Manager (AEM). +It provides a simple integration with any AI Agent. +This project is designed for non-technical persons who want to manage AEM via natural language. + +--- + +## Overview + +- **Chat with your AEM instance** for content, component, and asset operations. +- **AI IDEs integration** (Cursor, Copilot, Webstorm, VS Code, etc.) +- **Supports both AEMaaCS and self-hosted instances** +- **Modern, TypeScript-based AEM MCP server** +- **REST/JSON-RPC API** with latest MCP features. + +--- + +## Quick Start + +### Prerequisites +- Node.js 18+ +- Access to an AEM instance (local or remote) + +### Installation +```sh +npm install aem-mcp-server -g +``` + +### Start the Server +With default settings (admin:admin credentials for http://localhost:4502): +```sh +aem-mcp +``` + +### Configuration +``` +Options: + --version Show version number [boolean] + -H, --host [string] [default: "http://localhost:4502"] + -u, --user [string] [default: "admin"] + -p, --pass [string] [default: "admin"] + -i, --id clientId [string] [default: ""] + -s, --secret clientSecret [string] [default: ""] + -m, --mcpPort [number] [default: 8502] + -h, --help Show help [boolean] +``` + +For AEMaaCS, use the `clientId` and `clientSecret` for authentication. [More info](https://developer.adobe.com/developer-console/docs/guides/authentication/ServerToServerAuthentication/implementation). +For self-hosted AEM use user/pass. The default credentials are `admin:admin`. + +### Example Command +```sh +aem-mcp -u=user@domain.com -p=mypass -H=https://author-qa.domain.com +``` + +### Add AEM MCP to AI IDE +[![Install MCP Server](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en/install-mcp?name=AEM&config=eyJ1cmwiOiJodHRwOi8vMTI3LjAuMC4xOjg1MDIvbWNwIn0%3D) + +--- + +## Features + +- **AEM Page & Asset Management**: Create, update, delete, activate, deactivate, and replicate pages and assets +- **Component Operations**: Validate, update, scan, and manage AEM components (including Experience Fragments) +- **Advanced Search**: QueryBuilder, fulltext, fuzzy, and enhanced page search +- **Replication & Rollout**: Publish/unpublish content, roll out changes to language copies +- **Text & Image Extraction**: Extract all text and images from pages, including fragments +- **Template & Structure Discovery**: List templates, analyze page/component structure +- **JCR Node Access**: Legacy and modern node/content access +- **AI/LLM Integration**: Natural language interface for AEM via OpenAI, Anthropic, Ollama, or custom LLMs +- **Security**: Auth, environment-based config, and safe operation defaults + +--- + +## AI IDE Integration (Cursor, Copilot, etc.) + +AEM MCP Server is compatible with modern AI IDEs and code editors that support MCP protocol, such as **Cursor** and **Copilot** (eg in WebStorm or VS Code). + +### How to Connect: +1. **Install and run the AEM MCP Server** as described above. +2. **Configure your IDE** to connect to the MCP server: + - Open your IDE's MCP server settings. + - Add a new server with: + - **Type:** Custom MCP + - **url:** `http://127.0.0.1:8502/mcp` + +3. **Restart your IDE** if needed. The IDE will now be able to: + - List, search, and manage AEM content + - Run MCP methods (CRUD, search, rollout, etc.) + +Sample for AI-based code editors or custom clients: + +```json +{ + "mcpServers": { + "AEM": { + "url": "http://127.0.0.1:8502/mcp" + } + } +} +``` + +![cursor.png](docs/cursor.png) + +## Usage + +``` +List all components on MyPage +``` + +## API Documentation + +For detailed API documentation, please refer to the [API Docs](docs/API.md). + +## Similar Projects + +- https://github.com/indrasishbanerjee/aem-mcp-server (Used as a base for this project) +- https://www.npmjs.com/package/@myea/aem-mcp-handler (Looks like an original source of the above project) diff --git a/docs/API.md b/docs/API.md new file mode 100644 index 0000000..0893fdf --- /dev/null +++ b/docs/API.md @@ -0,0 +1,156 @@ +# AEM MCP Server API Reference + +## Component Operations + +| Method | Description | Parameters | +|--------|-------------|------------| +| `validateComponent` | Validate component changes before applying | `locale`, `page_path`, `component`, `props` | +| `updateComponent` | Update component properties. Validates properties against component dialog definitions (dropdown options, checkbox values, etc.). | `componentPath`, `properties` | +| `bulkUpdateComponents` | Update multiple components with validation | `updates[]`, `validateFirst`, `continueOnError` | +| `scanPageComponents` | Discover all components on a page | `pagePath` | +| `addComponent` | Add component to a page. Automatically applies `cq:template` structure if available. Validates properties against component dialog definitions. | `pagePath`, `resourceType`, `containerPath`, `name`, `properties` | +| `deleteComponent` | Delete a component | `componentPath`, `force` | +| `convertComponents` | Convert components on a single page | `pagePath`, `sourceResourceType`, `targetResourceType`, `requiredProperties`, `continueOnError` | +| `bulkConvertComponents` | Convert components across multiple pages | `sourceResourceType`, `targetResourceType`, `pagePaths[]` or `searchPath`, `depth`, `limit`, `requiredProperties`, `continueOnError` | +| `undoChanges` | Undo last component changes | `jobId` | + +## Page Operations + +| Method | Description | Parameters | +|--------|-------------|------------| +| `createPage` | Create a new page | `parentPath`, `title`, `template`, `name`, `properties` | +| `deletePage` | Delete a page | `pagePath`, `force` | +| `listPages` | List pages under a site root | `siteRoot`, `depth`, `limit` | +| `getPageProperties` | Get page properties | `pagePath` | +| `getPageContent` | Get all page content (XF, CF) | `pagePath` | +| `getAllTextContent` | Get all text content from page | `pagePath` | +| `getPageTextContent` | Get text content from page | `pagePath` | +| `getPageImages` | Get all images from page | `pagePath` | +| `enhancedPageSearch` | Intelligent page search with fallbacks | `searchTerm`, `basePath`, `includeAlternateLocales` | +| `activatePage` | Publish a page | `pagePath`, `activateTree` | +| `deactivatePage` | Unpublish a page | `pagePath`, `deactivateTree` | +| `unpublishContent` | Unpublish content | `contentPaths[]`, `unpublishTree` | + +## Site & Localization + +| Method | Description | Parameters | +|--------|-------------|------------| +| `fetchSites` | Get all available sites | - | +| `fetchLanguageMasters` | Get language masters for a site | `site` | +| `fetchAvailableLocales` | Get available locales | `site`, `languageMasterPath` | +| `replicateAndPublish` | Replicate and publish to locales | `selectedLocales[]`, `componentData`, `localizedOverrides` | + +## Assets + +| Method | Description | Parameters | +|--------|-------------|------------| +| `uploadAsset` | Upload asset to DAM | `parentPath`, `fileName`, `fileContent`, `mimeType`, `metadata` | +| `updateAsset` | Update existing asset | `assetPath`, `metadata`, `fileContent`, `mimeType` | +| `deleteAsset` | Delete asset | `assetPath`, `force` | +| `getAssetMetadata` | Get asset metadata | `assetPath` | +| `updateImagePath` | Update image component path | `componentPath`, `newImagePath` | + +## Templates + +| Method | Description | Parameters | +|--------|-------------|------------| +| `getTemplates` | Get available page templates | `sitePath` | +| `getTemplateStructure` | Get detailed template structure | `templatePath` | + +## Components & Metadata + +| Method | Description | Parameters | +|--------|-------------|------------| +| `getComponents` | Get all components from root path | - | + +## Search & Queries + +| Method | Description | Parameters | +|--------|-------------|------------| +| `searchContent` | Search using Query Builder | `type`, `fulltext`, `path`, `limit` | +| `executeJCRQuery` | Execute JCR query | `query`, `limit` | + +## Workflows + +| Method | Description | Parameters | +|--------|-------------|------------| +| `listWorkflowModels` | List all available workflow models with descriptions | - | +| `startWorkflow` | Start a workflow instance | `modelId`, `payload`, `payloadType` | +| `listWorkflowInstances` | List workflow instances (optionally filtered by state) | `state` (optional) | +| `getWorkflowInstance` | Get details of a specific workflow instance | `instanceId` | +| `updateWorkflowInstanceState` | Update workflow instance state | `instanceId`, `state` | +| `getInboxItems` | Get all work items in the inbox | - | +| `completeWorkItem` | Complete or advance a work item | `workItemPath`, `routeId` (optional), `comment` (optional) | +| `delegateWorkItem` | Delegate a work item to another user/group | `workItemPath`, `delegatee` | +| `getWorkItemRoutes` | Get available routes for a work item | `workItemPath` | + +### Common Workflow Models + +The following workflow models are commonly used in AEM: + +| Workflow ID | Description | Use Case | +|-------------|-------------|----------| +| `request_for_activation` | Publish/activate pages | Use to publish pages to the publish environment | +| `request_for_deactivation` | Unpublish/deactivate pages | Use to unpublish pages from the publish environment | +| `request_for_deletion` | Delete pages | Use to delete pages (with deactivation first) | +| `request_for_deletion_without_deactivation` | Delete pages without unpublishing | Use to delete pages without unpublishing first | +| `dam/update_asset` | Update DAM assets | Use to update digital assets | +| `dam/dam-update-language-copy` | Update language copies of assets | Use to update translated asset versions | +| `dam/dam-create-language-copy` | Create language copies of assets | Use to create translated asset versions | +| `wcm-translation/translate-language-copy` | Translate language copies | Use for page translation workflows | +| `wcm-translation/create_language_copy` | Create language copies | Use to create translated page versions | +| `wcm-translation/prepare_translation_project` | Prepare translation project | Use to set up translation projects | +| `wcm-translation/sync_translation_job` | Sync translation job | Use to synchronize translation jobs | +| `wcm-translation/update_language_copy` | Update language copy | Use to update translated page versions | +| `scheduled_activation` | Scheduled activation | Use for scheduled page publishing | +| `scheduled_deactivation` | Scheduled deactivation | Use for scheduled page unpublishing | + +**Example: Publishing a page using workflow** +```javascript +// Start activation workflow +startWorkflow({ + modelId: "request_for_activation", + payload: "/content/site/en/page", + payloadType: "JCR_PATH" +}) + +// Check inbox for work items +getInboxItems() + +// Complete the work item +completeWorkItem({ + workItemPath: "/var/workflow/instances/.../workItems/...", + comment: "Approved for publication" +}) +``` + +## Utilities + +| Method | Description | Parameters | +|--------|-------------|------------| +| `getNodeContent` | Get JCR node content (legacy) | `path`, `depth` | +| `listChildren` | List child nodes (legacy) | `path` | +| `getStatus` | Get workflow status | `workflowId` | +| `listMethods` | Get list of available methods | - | + +## Bulk Operations + +For detailed documentation on `bulkUpdateComponents` and `bulkConvertComponents`, see [BULK_OPERATIONS.md](./BULK_OPERATIONS.md). + +## Component Features + +### cq:template Support +When adding a component using `addComponent`, if the component has a `cq:template` node defined, the server will: +- Automatically fetch the template structure +- Merge template properties with provided properties +- Create all child nodes defined in the template +- This ensures components like column controls initialize with their default structure (e.g., columns) + +### Property Validation +Both `addComponent` and `updateComponent` now validate properties against the component's dialog definition: +- **Select/Dropdown fields**: Validates that provided values match available options +- **Checkbox fields**: Validates boolean values or 'true'/'false' strings +- **Number fields**: Validates numeric values +- Returns validation errors/warnings before applying changes to prevent component loading failures + +**Total Methods:** 46 diff --git a/docs/BULK_OPERATIONS.md b/docs/BULK_OPERATIONS.md new file mode 100644 index 0000000..40b3577 --- /dev/null +++ b/docs/BULK_OPERATIONS.md @@ -0,0 +1,149 @@ +# Bulk Operations Documentation + +## Overview + +The AEM MCP Server provides two powerful bulk operations for managing components across AEM pages: `bulkUpdateComponents` and `bulkConvertComponents`. These tools enable efficient batch processing of component updates and conversions with built-in validation and error handling. + +--- + +## bulkUpdateComponents + +### Purpose +Updates multiple components across different pages in a single operation with validation and error handling support. + +### How It Works + +1. **Validation Phase** (optional, enabled by default): + - Verifies all component paths exist before processing + - If `validateFirst=true` and a component is not found, the operation can either: + - Stop immediately if `continueOnError=false` + - Continue with remaining components if `continueOnError=true` + +2. **Update Phase**: + - Iterates through each component in the `updates` array + - Calls `updateComponent` for each component with its specified properties + - Tracks success/failure for each update + - Stops on first error if `continueOnError=false`, otherwise continues processing + +3. **Response**: + - Returns summary with total updates, successful updates, and failed updates + - Includes detailed results for each component update attempt + +### Parameters + +- **updates** (required): Array of objects with: + - `componentPath`: Full path to the component (e.g., `/content/site/en/page/jcr:content/root/container/component_123`) + - `properties`: Object containing properties to update +- **validateFirst** (optional, default: `true`): Validate component existence before updating +- **continueOnError** (optional, default: `false`): Continue processing remaining components if one fails + +### Example Use Case +Update text content across multiple components on different pages: +```json +{ + "updates": [ + { + "componentPath": "/content/site/en/page1/jcr:content/root/container/text1", + "properties": { "text": "Updated content 1" } + }, + { + "componentPath": "/content/site/en/page2/jcr:content/root/container/text2", + "properties": { "text": "Updated content 2" } + } + ], + "validateFirst": true, + "continueOnError": true +} +``` + +--- + +## bulkConvertComponents + +### Purpose +Converts components of one type to another type across multiple pages. Finds all matching source components, deletes them, and creates new target components at the same location. + +### How It Works + +1. **Page Discovery**: + - Option A: Uses provided `pagePaths` array for specific pages + - Option B: Uses `searchPath` to find all pages under a path (with optional `depth` and `limit`) + +2. **Component Conversion** (per page): + - Scans each page for components matching `sourceResourceType` + - For each matching component: + - Validates target component requirements (checks `cq:dialog` and `sling:resourceSuperType`) + - Deletes the source component + - Creates new target component at the same path with: + - Same `jcr:primaryType` + - New `sling:resourceType` + - Required properties from `requiredProperties` parameter + - Preserves component location and parent structure + +3. **Error Handling**: + - If `continueOnError=true`: Continues processing remaining pages even if one fails + - If `continueOnError=false`: Stops on first page error + - Returns detailed results per page with component counts + +4. **Response**: + - Summary of pages processed, succeeded, and failed + - Total components found, converted, and failed + - Per-page breakdown of conversion results + +### Parameters + +- **sourceResourceType** (required): Resource type to find and convert (e.g., `foundation/components/text`) +- **targetResourceType** (required): Resource type to convert to (e.g., `aemmcp/base/components/aemmcp-text/v1/aemmcp-text`) +- **pagePaths** (optional): Array of specific page paths to process +- **searchPath** (optional): Base path to search for pages (alternative to `pagePaths`) +- **depth** (optional, default: `2`): Depth to search when using `searchPath` +- **limit** (optional, default: `50`): Maximum pages to process when using `searchPath` +- **requiredProperties** (optional): Object with required property values for target component +- **continueOnError** (optional, default: `true`): Continue processing pages even if some fail + +### Example Use Case +Convert all legacy text components to new component type across a site section: +```json +{ + "sourceResourceType": "foundation/components/text", + "targetResourceType": "aemmcp/base/components/aemmcp-text/v1/aemmcp-text", + "searchPath": "/content/mysite/en", + "depth": 3, + "limit": 100, + "requiredProperties": { + "text": "Migrated from legacy component" + }, + "continueOnError": true +} +``` + +### Key Features + +- **Automatic Property Validation**: Checks target component's `cq:dialog` and `sling:resourceSuperType` to identify required properties +- **Location Preservation**: Maintains exact component location and hierarchy +- **Bulk Processing**: Handles multiple pages efficiently with progress tracking +- **Error Resilience**: Configurable error handling to balance safety vs. completion + +--- + +## Comparison + +| Feature | bulkUpdateComponents | bulkConvertComponents | +|---------|---------------------|----------------------| +| **Operation** | Updates properties | Changes component type | +| **Scope** | Specific component paths | Components across pages | +| **Discovery** | Manual (provide paths) | Automatic (scan pages) | +| **Component Deletion** | No | Yes (replaced) | +| **Component Creation** | No | Yes (new type) | +| **Use Case** | Property updates | Component migration | + +--- + +## Best Practices + +1. **Always use `validateFirst=true`** for `bulkUpdateComponents` to catch invalid paths early +2. **Use `continueOnError=true`** for large bulk operations to maximize completion +3. **Test on a small subset** before running bulk operations on production +4. **Provide `requiredProperties`** for `bulkConvertComponents` when target components have mandatory fields +5. **Monitor response results** to identify any failed operations for manual review + diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md new file mode 100644 index 0000000..d671f3a --- /dev/null +++ b/docs/CHANGELOG.md @@ -0,0 +1,225 @@ +## [2.0.0](https://github.com/Netcentric/aem-mcp-server/compare/v1.3.8...v2.0.0) (2025-01-XX) + +### Features + +* **cq:template Support**: Added automatic `cq:template` support for component initialization. When adding a component, if it has a `cq:template` node defined, the server will automatically fetch and apply the template structure, including all child nodes and default properties. This ensures components like column controls initialize with their default structure (e.g., columns) correctly. +* **Property Validation**: Implemented comprehensive property validation for `addComponent` and `updateComponent` operations. Properties are now validated against component dialog definitions: + - Select/dropdown fields: Validates that provided values match available options + - Checkbox fields: Validates boolean values or 'true'/'false' strings + - Number fields: Validates numeric values + - Returns validation errors/warnings before applying changes to prevent component loading failures + +### Improvements + +* Enhanced `getComponentDefinition` to extract detailed field definitions from component dialogs, including field types, required status, and available options +* Improved error messages for invalid property values +* Better handling of component template structures with recursive child node creation + +### Bug Fixes + +* Fixed issue where components with `cq:template` (like column controls) were not initializing with their default structure +* Fixed issue where invalid property values could be set, causing components to fail loading in AEM + +## [1.3.8](https://github.com/easingthemes/aem-mcp-server/compare/v1.3.7...v1.3.8) (2025-09-02) + + +### Bug Fixes + +* update page creation and templates info ([4b6863a](https://github.com/easingthemes/aem-mcp-server/commit/4b6863adf4233620665748c825f9236aa93ea7ee)) + +## [1.3.7](https://github.com/easingthemes/aem-mcp-server/compare/v1.3.6...v1.3.7) (2025-09-01) + + +### Bug Fixes + +* apply latest fixes ([2e3f9cf](https://github.com/easingthemes/aem-mcp-server/commit/2e3f9cf07c0f22a738d07306c0e9bf1f1c218347)) + +## [1.3.6](https://github.com/easingthemes/aem-mcp-server/compare/v1.3.5...v1.3.6) (2025-08-20) + + +### Bug Fixes + +* fix health check ([66dd8dc](https://github.com/easingthemes/aem-mcp-server/commit/66dd8dc3b7ed7acf47877109c41fb09fc1ac8534)) + +## [1.3.5](https://github.com/easingthemes/aem-mcp-server/compare/v1.3.4...v1.3.5) (2025-08-20) + + +### Bug Fixes + +* update test user path ([b53ffbb](https://github.com/easingthemes/aem-mcp-server/commit/b53ffbb97c1bcffb8db0835ceb2fcf4d76f6ca87)) + +## [1.3.4](https://github.com/easingthemes/aem-mcp-server/compare/v1.3.3...v1.3.4) (2025-08-20) + + +### Bug Fixes + +* add cli params description ([10e4314](https://github.com/easingthemes/aem-mcp-server/commit/10e431498b6d3197a47fb6e1764e2f8c38ac429f)) + +## [1.3.3](https://github.com/easingthemes/aem-mcp-server/compare/v1.3.2...v1.3.3) (2025-08-19) + + +### Bug Fixes + +* update dependencies ([821d42e](https://github.com/easingthemes/aem-mcp-server/commit/821d42e546e201110228727ba9741d7cfcbefc23)) + +## [1.3.2](https://github.com/easingthemes/aem-mcp-server/compare/v1.3.1...v1.3.2) (2025-08-19) + + +### Bug Fixes + +* exclude docs from npm to reduce size ([fdd81b2](https://github.com/easingthemes/aem-mcp-server/commit/fdd81b2025204e5fd043f7276ec36408d7476584)) + +## [1.3.1](https://github.com/easingthemes/aem-mcp-server/compare/v1.3.0...v1.3.1) (2025-08-19) + + +### Bug Fixes + +* add AEMaaCS auth params ([3b2cbbf](https://github.com/easingthemes/aem-mcp-server/commit/3b2cbbf9e5b6b6c827b497a3f184e8cd55bed452)) + +# [1.3.0](https://github.com/easingthemes/aem-mcp-server/compare/v1.2.0...v1.3.0) (2025-08-10) + + +### Features + +* add logger, change port ([f4ee48b](https://github.com/easingthemes/aem-mcp-server/commit/f4ee48b32fde2034b53f29fb2efa3aef9ba20f39)) + +# [1.2.0](https://github.com/easingthemes/aem-mcp-server/compare/v1.1.5...v1.2.0) (2025-08-10) + + +### Features + +* add AEMaaCS OAuth support, add fetch retry on 401 ([0f53d1a](https://github.com/easingthemes/aem-mcp-server/commit/0f53d1a4bc8bc622f018f68c021d95e4a0791e78)) + +## [1.1.5](https://github.com/easingthemes/aem-mcp-server/compare/v1.1.4...v1.1.5) (2025-08-08) + + +### Bug Fixes + +* remove invalid empty `prompts` ([92c64d3](https://github.com/easingthemes/aem-mcp-server/commit/92c64d3d2db3ff32ce0e2b651b22697940761dd0)) + +## [1.1.4](https://github.com/easingthemes/aem-mcp-server/compare/v1.1.3...v1.1.4) (2025-07-19) + + +### Bug Fixes + +* [docs] simplify Readme ([6e00bef](https://github.com/easingthemes/aem-mcp-server/commit/6e00bef7a498d872573549cc7d35206affe98bba)) + +## [1.1.3](https://github.com/easingthemes/aem-mcp-server/compare/v1.1.2...v1.1.3) (2025-07-19) + + +### Bug Fixes + +* [docs] simplify Readme ([12d6753](https://github.com/easingthemes/aem-mcp-server/commit/12d6753d214de6eb49451595025de95df170f66b)) + +## [1.1.2](https://github.com/easingthemes/aem-mcp-server/compare/v1.1.1...v1.1.2) (2025-07-19) + + +### Bug Fixes + +* [docs] simplify Readme ([c9af9e6](https://github.com/easingthemes/aem-mcp-server/commit/c9af9e67043ced9e54a6bbf83cd1527026ae0c69)) + +## [1.1.1](https://github.com/easingthemes/aem-mcp-server/compare/v1.1.0...v1.1.1) (2025-07-19) + + +### Bug Fixes + +* [docs] simplify Readme ([3d70ee2](https://github.com/easingthemes/aem-mcp-server/commit/3d70ee2acbdc7cdca291adc326bacf804fd7700c)) + +# [1.1.0](https://github.com/easingthemes/aem-mcp-server/compare/v1.0.12...v1.1.0) (2025-07-19) + + +### Features + +* [deps] remove swagger ([6cfa01a](https://github.com/easingthemes/aem-mcp-server/commit/6cfa01ac1d8336fb2a5de300cedcc5581726512f)) + +## [1.0.12](https://github.com/easingthemes/aem-mcp-server/compare/v1.0.11...v1.0.12) (2025-07-18) + + +### Bug Fixes + +* [aem] remove component type check ([6dbf89c](https://github.com/easingthemes/aem-mcp-server/commit/6dbf89c39f78b24e33b3e34992f886c761e6f572)) + +## [1.0.11](https://github.com/easingthemes/aem-mcp-server/compare/v1.0.10...v1.0.11) (2025-07-18) + + +### Bug Fixes + +* [build] minify ([4760bdc](https://github.com/easingthemes/aem-mcp-server/commit/4760bdcccf6c38b10df4f472c6900279bc09cacb)) + +## [1.0.10](https://github.com/easingthemes/aem-mcp-server/compare/v1.0.9...v1.0.10) (2025-07-18) + + +### Bug Fixes + +* [docs] add docs dir ([d8e6f04](https://github.com/easingthemes/aem-mcp-server/commit/d8e6f04dc8963d559d258d1491d5ea81e4b9d9e0)) + +## [1.0.9](https://github.com/easingthemes/aem-mcp-server/compare/v1.0.8...v1.0.9) (2025-07-18) + + +### Bug Fixes + +* [docs] add params info ([b4f128d](https://github.com/easingthemes/aem-mcp-server/commit/b4f128db6aed5d159cd18aa93692e2948c99ffb0)) + +## [1.0.8](https://github.com/easingthemes/aem-mcp-server/compare/v1.0.7...v1.0.8) (2025-07-18) + + +### Bug Fixes + +* [config] remove dotenv ([2c0ddcd](https://github.com/easingthemes/aem-mcp-server/commit/2c0ddcdb9b5b2c60bb27bfad8dcfeebe39275510)) + +## [1.0.7](https://github.com/easingthemes/aem-mcp-server/compare/v1.0.6...v1.0.7) (2025-07-18) + + +### Bug Fixes + +* [cli] npm pkg fix ([34dc243](https://github.com/easingthemes/aem-mcp-server/commit/34dc243d1064120b595bc0eb242e3c446bb4c54c)) + +## [1.0.6](https://github.com/easingthemes/aem-mcp-server/compare/v1.0.5...v1.0.6) (2025-07-18) + + +### Bug Fixes + +* [cli] add node bin ([50d73f4](https://github.com/easingthemes/aem-mcp-server/commit/50d73f4a1ee1ee037366aa8a0d42639c8602a2fe)) + +## [1.0.5](https://github.com/easingthemes/aem-mcp-server/compare/v1.0.4...v1.0.5) (2025-07-18) + + +### Bug Fixes + +* [cli] remove test script ([e9d2325](https://github.com/easingthemes/aem-mcp-server/commit/e9d2325e46976965df6fa4e04bfda2047a0927d5)) +* [cli] use es6 ([ef3327c](https://github.com/easingthemes/aem-mcp-server/commit/ef3327c9c6f78e459e756c0f41c13b6002c19193)) + +## [1.0.4](https://github.com/easingthemes/aem-mcp-server/compare/v1.0.3...v1.0.4) (2025-07-18) + + +### Bug Fixes + +* [cli] fix cli params ([6405d05](https://github.com/easingthemes/aem-mcp-server/commit/6405d0584586bf2e06c6333757ccee292dceac38)) + +## [1.0.3](https://github.com/easingthemes/aem-mcp-server/compare/v1.0.2...v1.0.3) (2025-07-18) + + +### Bug Fixes + +* [build] fix build path ([683b87f](https://github.com/easingthemes/aem-mcp-server/commit/683b87fb3cad42867baa851cce766ec956c1c637)) + +## [1.0.2](https://github.com/easingthemes/aem-mcp-server/compare/v1.0.1...v1.0.2) (2025-07-18) + + +### Bug Fixes + +* [cli] add cli params ([59c6a5e](https://github.com/easingthemes/aem-mcp-server/commit/59c6a5ef72ea2fe5f16278655af433b3a17843fc)) + +## [1.0.1](https://github.com/easingthemes/aem-mcp-server/compare/v1.0.0...v1.0.1) (2025-07-18) + + +### Bug Fixes + +* [cli] simplify usage ([3e5981c](https://github.com/easingthemes/aem-mcp-server/commit/3e5981c49a8a843eda16482f041a2c291051d68e)) + +# 1.0.0 (2025-07-17) + + +### Bug Fixes + +* [npm] enable npm release ([3165378](https://github.com/easingthemes/aem-mcp-server/commit/3165378659357d060c03e0798ad50eb44328d429)) diff --git a/docs/CODE_OF_CONDUCT.md b/docs/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..5e0d0d3 --- /dev/null +++ b/docs/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Netcentric Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at Grp-opensourceoffice@adobe.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: https://contributor-covenant.org +[version]: https://contributor-covenant.org/version/1/4/ diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 0000000..772f4c1 --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,25 @@ +# Contributing + +Thanks for choosing to contribute! + +The following are a set of guidelines to follow when contributing to this project. + +## Code Of Conduct + +This project adheres to the [code of conduct](CODE_OF_CONDUCT.md). By participating, +you are expected to uphold this code. + +## Have A Question? + +Start by filing an issue. The existing committers on this project work to reach +consensus around project direction and issue solutions within issue threads +(when appropriate). + +## Code Reviews + +All submissions should come in the form of pull requests and need to be reviewed +by project committers. Read [GitHub's pull request documentation](https://help.github.com/articles/about-pull-requests/) +for more information on sending pull requests. + +Lastly, please follow the [pull request template](../.github/PULL_REQUEST_TEMPLATE.md) when +submitting a pull request! diff --git a/docs/cursor.png b/docs/cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..e87df4666dde1b9042b13401e74dce4f505c3b52 GIT binary patch literal 177049 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�jUnDib{C8WvhzcMqoNVHE@b=_qYKLF1UFY* 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 utE=eEPxdmcv`ZPPO$p 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 z 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�_D79Lop- zPZw1d5!h{cJbEfpdJ6LUjN=?t8Kk`RWWpwq5ihg!!>4e@9H?n_OTQZLW1OR zRF^I8OV5YMkOmSU7-8K!h*+_C+K50Z4PjYv-}Ch02|D(?FCF70KB!&WH(pa>N|k1y zk6&o8<8(?k^Kad{+=Q2kPU!fK91ZKl&e`cRt+6($7Gh z?+CstQ*8p39F34z^#MWW(}ESMg-}xPUDOM!c(raASmvU*3z9nb{O-r3t86uj>NGzL zL12;cyU|Ipa8Ij%mVhs3W#1K?&3cQLdZG*r7uAYnlC;_3YVZc^u)s4Zt&s`mQMT67 zXyEtp^ostQ00*A3NZ#ir?%m~zanG2|s5h090x;R{DAihQU2ZxpKbGSKzkbg= zjDRPC7`>Cq-E%QB`)y}K0*Rt;Ovzlcfj1B()Foz%>OqmbL4 z{$@`k4>x4EKkN(148qw|y&8GZl;sjKm6arUJ+l#%ptTA~cE;DfcB&CWmn#QUVouMD z#sh1l)6ZX-h!1?EW4L99MpQ=StJ%LU%3)tb=G>`n(@x{tBiQ+A@eY9%*FYF`@h&kH zdV@_s1C`t>8#~r$clw3q?RdnUaalUcm5bw6adUn)EL5x*R8$1Gh|USCbYP}$;M93{ z(hUrtiiAuJ>Ac@=Gsg^Y<#5DKXx6}{;BRlReMxaZCewD4*CZt{&A8vr>l@|LxXc3< z8d3Rc1u*@7N3`9wD(_o^^32I|XgfEul(ETX1<=EwAf2dL2H2+rU>``c z};vl7L-7R+BPDDz;VyGh3FTlm{wq8F}U%xf2oT_9C>s( z2PL`RvK3pO{si|o@Z%#5urVv+;>3;jCcRWImc2x&#!*i=pZ1o#30!E`9=)>Du1$V$ zskJM>#4Rs3IG2l(J*@n363~d50+S4h20XW3!5i%o4cf4&Mvpj!3$t%!(21LmBmhoP z+jIt#Z+(jlm4_$&fwt6hKgR%W1@#B1s47tjX31;tmSdqy%dc2u##0DJ#{0q|yd7IF zyT&3OyM)(-RrsXB$gnI(&nxaR72^b1`#v(~%L2%PuIBd%X;&FqD_DzX;f~5JY==oK z%|SDZCHY#;ret#?2vY7hK}`5l{P?l^`E0KJ<#5cq8H={(f{)hWEQD!X(b+FF&QiTs zLTrZIGCv<-M(vR`*}^*(xxV$m3r8AeoD}G8qol_#_;s|(i)(?$gwsfx(w38_x#Fnu z@xsiHotga~vD{eQLyQ`M#TA;nxq1|~Zr)$_Mk|(HnWnTSFMJ<1%3b{6g}gX9GxOk( z&DuI+bEkNJi{-~UUxct(o^{f4s)Yo<#Q5%mmEOo=W~ql5r!cX;;p2%|EJx|jGVZ*O zY}jm`R#Tn%e2;;nvf)0IH7>e-c%SITN#g`!;b^TK-4dR*}YJV1f| zy`zI;YHS*exc@jYIex#6D>^vRz} z?^8t;UXwH@zbB27zIh>+^z_W9@_`rI( z(C4L?F)=NeFK3Yd{Oix(Yo|P{t1P1$qWblrYxzZ=U9wX@w-RaITh&2r5C{}|I#n7Nqi>+314t*ryp2{pAS@aM-GnT@Tja6&>t zEoaN-$*H1IXV}=?Epu~sXJb3^ER4bGURhb`vMCpTa8{D>#H3*OG@mgvG7>&G@*Z|q z#uq7{So`qd19CW2ob2~fIG$xsquKp^H%Af5ng?}Q>1YPK5Bpt+R!jPS97^KM)*&)& z0qvN=V3*U7Gt@n1-7R-=S*+u5@TLltrf}FH`<`%6-TCL&Yp{y6)rl`Adw_q>nb*?N zqJCXTG3WV@+p;s9U0gJe8Nr{(^5MU@!F)6Rqx=%XiL0nf$5c9Gja|@HrV`;V6=EMo z($Z4=<5oE6AD!_n;#g)yYF|RJ^YEp?f_D?QOuDMXZc8uHL zKl$L`?Nv&B??xIbNxXJ@wOfqU?K0275W7)1Wh1%kW^133W2Sa;>|USQ@=O?7H8qHOnFis35h7UQ|Gg@vxKRGs}hElVX-q;u?PVrDG;$fZ6!i!rc@9qLOjol?l zER5sL=hyf@k(Zjyv%k&u>#xU`6i9+65=4!OalGsNx*2tP8oS{Nwz!k`)`)|RZp1x> zaq?Q8!SO`y>&IO`ac@3zXRx~Gf-o>nUdtdhHd^r2^^@zqZUYl@X+s9%H@3 b@Ex9m!3@$jOUvdkz#m09RoPe4#=idxm=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.17.3.tgz", + "integrity": "sha512-JPwUKWSsbzx+DLFznf/QZ32Qa+ptfbUlHhRLrBQBAFu9iI1iYvizM4p+zhhRDceSsPutXp4z+R/HPVphlIiclg==", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.6", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz", + "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/node": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.10.0" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "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==", + "dev": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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==", + "engines": { + "node": ">= 0.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==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.3.tgz", + "integrity": "sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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==" + }, + "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==" + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "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", + "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" + }, + "funding": { + "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==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", + "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==", + "dev": true + }, + "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", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/image-size": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "dev": true, + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "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==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "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==" + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "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==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.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==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/pptxgenjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pptxgenjs/-/pptxgenjs-4.0.1.tgz", + "integrity": "sha512-TeJISr8wouAuXw4C1F/mC33xbZs/FuEG6nH9FG1Zj+nuPcGMP5YRHl6X+j3HSUnS1f3at6k75ZZXPMZlA5Lj9A==", + "dev": true, + "dependencies": { + "@types/node": "^22.8.1", + "https": "^1.0.0", + "image-size": "^1.2.1", + "jszip": "^3.10.1" + } + }, + "node_modules/pptxgenjs/node_modules/@types/node": { + "version": "22.19.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", + "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", + "dev": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/pptxgenjs/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/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==", + "dev": true + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "engines": { + "node": ">=16" + } + }, + "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", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "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==" + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/send/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "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==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "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==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/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==", + "dev": true + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.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==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "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==", + "dev": true + }, + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "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==" + }, + "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" + } + }, + "node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + } + }, + "dependencies": { + "@esbuild/aix-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "dev": true, + "optional": true + }, + "@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "dev": true, + "optional": true + }, + "@modelcontextprotocol/sdk": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.17.3.tgz", + "integrity": "sha512-JPwUKWSsbzx+DLFznf/QZ32Qa+ptfbUlHhRLrBQBAFu9iI1iYvizM4p+zhhRDceSsPutXp4z+R/HPVphlIiclg==", + "requires": { + "ajv": "^6.12.6", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "dependencies": { + "zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==" + }, + "zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "requires": {} + } + } + }, + "@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz", + "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true + }, + "@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "@types/node": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "dev": true, + "requires": { + "undici-types": "~7.10.0" + } + }, + "@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "dev": true, + "requires": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "requires": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "dependencies": { + "mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==" + }, + "mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "requires": { + "mime-db": "^1.54.0" + } + } + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "requires": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "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==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, + "call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + } + }, + "cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "requires": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + } + }, + "content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==" + }, + "cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==" + }, + "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==", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "requires": { + "ms": "^2.1.3" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" + }, + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" + }, + "es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "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==", + "requires": { + "es-errors": "^1.3.0" + } + }, + "esbuild": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "requires": { + "eventsource-parser": "^3.0.1" + } + }, + "eventsource-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.3.tgz", + "integrity": "sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==" + }, + "express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "requires": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "dependencies": { + "mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==" + }, + "mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "requires": { + "mime-db": "^1.54.0" + } + } + } + }, + "express-rate-limit": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "requires": {} + }, + "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==" + }, + "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==" + }, + "finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "requires": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==" + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "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==" + }, + "get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==" + }, + "get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "requires": { + "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", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + } + }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + } + }, + "gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + }, + "has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", + "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==", + "dev": true + }, + "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==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "image-size": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "dev": true, + "requires": { + "queue": "6.0.2" + } + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "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==" + }, + "is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "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==" + }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, + "media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==" + }, + "merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==" + }, + "pptxgenjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pptxgenjs/-/pptxgenjs-4.0.1.tgz", + "integrity": "sha512-TeJISr8wouAuXw4C1F/mC33xbZs/FuEG6nH9FG1Zj+nuPcGMP5YRHl6X+j3HSUnS1f3at6k75ZZXPMZlA5Lj9A==", + "dev": true, + "requires": { + "@types/node": "^22.8.1", + "https": "^1.0.0", + "image-size": "^1.2.1", + "jszip": "^3.10.1" + }, + "dependencies": { + "@types/node": { + "version": "22.19.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", + "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", + "dev": true, + "requires": { + "undici-types": "~6.21.0" + } + }, + "undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true + } + } + }, + "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==", + "dev": true + }, + "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==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + }, + "qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "requires": { + "side-channel": "^1.1.0" + } + }, + "queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dev": true, + "requires": { + "inherits": "~2.0.3" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "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==", + "dev": true + } + } + }, + "router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "requires": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "dependencies": { + "path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==" + } + } + }, + "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==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "requires": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "dependencies": { + "mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==" + }, + "mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "requires": { + "mime-db": "^1.54.0" + } + } + } + }, + "serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "requires": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + } + }, + "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==", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "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==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + } + }, + "side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + } + }, + "side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + } + }, + "side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "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==", + "dev": true + } + } + }, + "string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "requires": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "requires": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "dependencies": { + "mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==" + }, + "mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "requires": { + "mime-db": "^1.54.0" + } + } + } + }, + "typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "dev": true + }, + "undici-types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "requires": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "requires": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + } + }, + "yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..b9e7f4c --- /dev/null +++ b/package.json @@ -0,0 +1,55 @@ +{ + "name": "aem-mcp-server", + "version": "2.0.0", + "description": "AEM Model Context Protocol (MCP) server", + "private": false, + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Netcentric/aem-mcp-server.git" + }, + "keywords": [ + "AEM", + "MCP", + "Model Context Protocol", + "LLM", + "Adobe Experience Manager", + "TypeScript" + ], + "main": "dist/index.js", + "types": "dist/index.d.ts", + "bin": { + "aem-mcp": "dist/cli.js" + }, + "files": [ + "dist/**/*.js", + "README.md", + "LICENSE" + ], + "scripts": { + "build": "npm run build:types && npm run build:ts", + "build:ts": "esbuild src/**/*.ts src/*.ts --outdir=dist --platform=node --minify", + "build:types": "tsc --emitDeclarationOnly", + "start": "MCP_LOGGER=true node dist/cli.js", + "test:dev": "node ./dist/cli.js", + "test:npm": "npm pack && npm install -g ./aem-mcp-server-$npm_package_version.tgz && aem-mcp -e -H=http://localhost:5502" + }, + "dependencies": { + "@modelcontextprotocol/sdk": "^1.17.3", + "cors": "^2.8.5", + "express": "^5.1.0", + "yargs": "^18.0.0" + }, + "devDependencies": { + "@types/cors": "^2.8.19", + "@types/express": "^5.0.3", + "@types/node": "^24.3.0", + "@types/yargs": "^17.0.33", + "esbuild": "^0.25.9", + "pptxgenjs": "^4.0.1", + "typescript": "^5.9.2" + }, + "type": "module" +} diff --git a/src/aem/aem.auth.ts b/src/aem/aem.auth.ts new file mode 100644 index 0000000..8747aa1 --- /dev/null +++ b/src/aem/aem.auth.ts @@ -0,0 +1,47 @@ +const IMS_URL = "https://ims-na1.adobelogin.com/ims/token"; // Change region if needed +const SCOPES = "openid,AdobeID,read_organizations,additional_info.projectedProductContext,aem_author_read,aem_author_write"; + +type AccessTokenResponse = { + access_token: string; + expires_in: number; + refresh_token?: string; + token_type?: string; +} + +const getScopes = (scopes?: string | string[]): string => { + if (!scopes) { + return SCOPES; + } + if (Array.isArray(scopes)) { + return scopes.join(','); + } + return scopes; +} + +/** + * Get access token using client credentials (server-to-server OAuth) + */ +export async function getAccessToken(clientId: string, clientSecret: string, scopes?: string | string[]): Promise { + if (!clientId || !clientSecret) { + throw new Error("Client ID and Client Secret must be provided"); + } + const scope = getScopes(scopes); + const params = new URLSearchParams({ + client_id: clientId, + client_secret: clientSecret, + grant_type: "client_credentials", + scope, + }); + + const res = await fetch(IMS_URL, { + method: "POST", + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + body: params.toString(), + }); + + if (!res.ok) { + throw new Error(`IMS token request failed: ${res.status} ${await res.text()}`); + } + + return res.json(); +} diff --git a/src/aem/aem.config.ts b/src/aem/aem.config.ts new file mode 100644 index 0000000..0113fb9 --- /dev/null +++ b/src/aem/aem.config.ts @@ -0,0 +1,82 @@ +export interface AEMConfig { + contentPaths: { + sitesRoot: string; + assetsRoot: string; + templatesRoot: string; + experienceFragmentsRoot: string; + }; + replication: { + publisherUrls: string[]; + defaultReplicationAgent: string; + }; + components: { + defaultProperties: Record; + componentPaths?: { + projectRoot1?: string; + }; + }; + queries: { + maxLimit: number; + defaultLimit: number; + timeoutMs: number; + }; + validation: { + maxDepth: number; + allowedLocales: string[]; + }; +} + +export type AEMBaseConfig = { + AEM_PUBLISHER_URLS?: string; + AEM_ALLOWED_COMPONENTS?: string; + AEM_QUERY_MAX_LIMIT?: string; + AEM_QUERY_DEFAULT_LIMIT?: string; + AEM_QUERY_TIMEOUT?: string; + AEM_MAX_DEPTH?: string; + AEM_ALLOWED_LOCALES?: string; +} + +export function getAEMConfig(config: AEMBaseConfig): AEMConfig { + return { + contentPaths: { + sitesRoot: '/content', + assetsRoot: '/content/dam', + templatesRoot: '/conf', + experienceFragmentsRoot: '/content/experience-fragments', + }, + replication: { + publisherUrls: config.AEM_PUBLISHER_URLS?.split(',') || ['http://localhost:4503'], + defaultReplicationAgent: 'publish', + }, + components: { + defaultProperties: { + 'jcr:primaryType': 'nt:unstructured', + 'sling:resourceType': 'foundation/components/text' + }, + componentPaths: { + projectRoot1: '/apps/aemmcp/base/components' + } + }, + queries: { + maxLimit: parseInt(config.AEM_QUERY_MAX_LIMIT || '100'), + defaultLimit: parseInt(config.AEM_QUERY_DEFAULT_LIMIT || '20'), + timeoutMs: parseInt(config.AEM_QUERY_TIMEOUT || '30000'), + }, + validation: { + maxDepth: parseInt(config.AEM_MAX_DEPTH || '5'), + allowedLocales: config.AEM_ALLOWED_LOCALES?.split(',') || ['en'], + }, + }; +} + +export function isValidContentPath(path: string, config: AEMConfig): boolean { + const allowedRoots = Object.values(config.contentPaths); + return allowedRoots.some(root => path.startsWith(root)); +} + +export function isValidLocale(locale: string, config: AEMConfig): boolean { + if (!locale) return false; + const normalized = locale.toLowerCase(); + return config.validation.allowedLocales.some(l => l.toLowerCase() === normalized || + (normalized === 'en' && l.toLowerCase().startsWith('en'))); +} diff --git a/src/aem/aem.connector.ts b/src/aem/aem.connector.ts new file mode 100644 index 0000000..2e791df --- /dev/null +++ b/src/aem/aem.connector.ts @@ -0,0 +1,3766 @@ +import { AEMConfig, getAEMConfig, isValidContentPath, isValidLocale } from './aem.config.js'; +import { AEM_ERROR_CODES, createAEMError, createSuccessResponse, handleAEMHttpError, safeExecute, validateComponentOperation } from './aem.errors.js'; +import { CliParams } from '../types.js'; +import { AEMAuth, AEMFetch } from './aem.fetch.js'; +import { LOGGER } from '../utils/logger.js'; +import { exec } from 'child_process'; + +export interface AEMConnectorConfig { + aem: { + host: string; + author: string; + publish: string; + auth: AEMAuth; + endpoints: Record; + }; + mcp: { + name: string; + version: string; + }; +} + +interface FieldDefinition { + name: string; + type: string; // 'select', 'checkbox', 'textfield', 'textarea', etc. + required: boolean; + options?: string[]; // For select/dropdown fields + defaultValue?: any; + description?: string; +} + +export class AEMConnector { + isInitialized: boolean; + isAEMaaCS: boolean; + config: AEMConnectorConfig; + aemConfig: AEMConfig; + private readonly fetch: AEMFetch; + + constructor(params: CliParams) { + this.isInitialized = false; + this.config = this.loadConfig(params); + this.aemConfig = getAEMConfig({}); + this.isAEMaaCS = this.isConfigAEMaaCS(); + this.fetch = new AEMFetch({ + host: this.config.aem.host, + auth: this.config.aem.auth, + timeout: this.aemConfig.queries.timeoutMs, + }); + } + + async init() { + try { + await this.fetch.init(); + this.isInitialized = true; + } catch (error: any) { + this.isInitialized = false; + } + } + + isConfigAEMaaCS(): boolean { + return Boolean(this.config.aem.auth.clientId && this.config.aem.auth.clientSecret); + } + + loadConfig(params: CliParams = {}): AEMConnectorConfig { + let auth: AEMAuth; + + // OAuth Server-to-Server (client credentials) + if (params.id && params.secret) { + auth = { + clientId: params.id, + clientSecret: params.secret, + }; + } + // Basic Authentication + else { + auth = { + username: params.user || 'admin', + password: params.pass || 'admin', + }; + } + + return { + aem: { + host: params.host || 'http://localhost:4502', + author: params.host || 'http://localhost:4502', + publish: 'http://localhost:4503', + auth, + endpoints: { + content: '/content', + dam: '/content/dam', + query: '/bin/querybuilder.json', + crxde: '/crx/de', + jcr: '', + }, + }, + mcp: { + name: 'NAEM MCP Server', + version: '1.0.0', + }, + }; + } + + /** + * Preview a page in the browser by opening the preview URL. + * The preview URL format is: /.html?wcmmode=disabled + * + * @param pagePath - Path to the page (e.g., /content/site/en/page) + */ + private async previewPageInBrowser(pagePath: string): Promise { + try { + // Construct the preview URL + const host = this.config.aem.host; + const previewUrl = `${host}${pagePath}.html?wcmmode=disabled`; + + LOGGER.log(`🌐 Opening browser preview: ${previewUrl}`); + + // Open browser based on platform + const platform = process.platform; + let command: string; + + if (platform === 'darwin') { + // macOS - Try to open Chrome first (better light mode support), fallback to default browser + // Chrome respects system light mode preferences better + command = `open -a "Google Chrome" "${previewUrl}" 2>/dev/null || open -a "Chromium" "${previewUrl}" 2>/dev/null || open "${previewUrl}"`; + } else if (platform === 'win32') { + // Windows - Try Chrome first + command = `start chrome "${previewUrl}" 2>nul || start "" "${previewUrl}"`; + } else { + // Linux and other Unix-like systems - Try Chrome/Chromium first + command = `google-chrome "${previewUrl}" 2>/dev/null || chromium-browser "${previewUrl}" 2>/dev/null || xdg-open "${previewUrl}"`; + } + + exec(command, (error) => { + if (error) { + LOGGER.warn(`Could not open browser automatically: ${error.message}`); + LOGGER.log(`Please open this URL manually: ${previewUrl}`); + } else { + LOGGER.log(`✅ Browser opened successfully`); + } + }); + } catch (error: any) { + LOGGER.warn(`Error opening browser preview: ${error.message}`); + const previewUrl = `${this.config.aem.host}${pagePath}.html?wcmmode=disabled`; + LOGGER.log(`Please open this URL manually: ${previewUrl}`); + } + } + + async testConnection(): Promise<{ aem: boolean; auth: boolean }> { + const aem = await this.testAEMConnection(); + const auth = aem ? await this.testAuthConnection() : false; + return { aem, auth }; + } + + async testAEMConnection(): Promise { + try { + if (!this.isInitialized) { + await this.init(); + } + const url = `/libs/granite/core/content/login.html`; + LOGGER.log('Testing AEM connection to:', url); + const response = await this.fetch.get(url, undefined, undefined, 5000, true); + LOGGER.log('✅ AEM connection successful!'); + return true; + } catch (error: any) { + LOGGER.error('❌ AEM connection failed:', error.message); + return false; + } + } + + async testAuthConnection(): Promise { + try { + if (!this.isInitialized) { + await this.init(); + } + const url = `/libs/granite/security/currentuser.json`; + LOGGER.log('Testing AEM authentication connection to:', url); + const response = await this.fetch.get(url, undefined, undefined,5000); + LOGGER.log('✅ AEM authentication connection successful!'); + return true; + } catch (error: any) { + LOGGER.error('❌ AEM authentication connection failed:', error.message); + return false; + } + } + + async validateComponent(request: any): Promise { + return safeExecute(async () => { + const pagePath = request.pagePath || request.page_path; + const { locale, component, props } = request; + validateComponentOperation(locale, pagePath, component, props); + if (!isValidLocale(locale, this.aemConfig)) { + throw createAEMError(AEM_ERROR_CODES.INVALID_LOCALE, `Locale '${locale}' is not supported`, { locale, allowedLocales: this.aemConfig.validation.allowedLocales }); + } + if (!isValidContentPath(pagePath, this.aemConfig)) { + throw createAEMError(AEM_ERROR_CODES.INVALID_PATH, `Path '${pagePath}' is not within allowed content roots`, { path: pagePath, allowedRoots: Object.values(this.aemConfig.contentPaths) }); + } + const url = `${pagePath}.json`; + const response = await this.fetch.get(url, { + params: { ':depth': '2' }, + timeout: this.aemConfig.queries.timeoutMs, + }); + const validation = this.validateComponentProps(response.data, component, props); + return createSuccessResponse({ + message: 'Component validation completed successfully', + pageData: response.data, + component, + locale, + validation, + configUsed: { + allowedLocales: this.aemConfig.validation.allowedLocales, + }, + }, 'validateComponent'); + }, 'validateComponent'); + } + + validateComponentProps(pageData: any, componentType: string, props: any) { + const warnings: string[] = []; + const errors: string[] = []; + if (componentType === 'text' && !props.text && !props.richText) { + warnings.push('Text component should have text or richText property'); + } + if (componentType === 'image' && !props.fileReference && !props.src) { + errors.push('Image component requires fileReference or src property'); + } + return { + valid: errors.length === 0, + errors, + warnings, + componentType, + propsValidated: Object.keys(props).length, + }; + } + + async updateComponent(request: any): Promise { + return safeExecute(async () => { + if (!request.componentPath || typeof request.componentPath !== 'string') { + throw createAEMError(AEM_ERROR_CODES.INVALID_PARAMETERS, 'Component path is required and must be a string'); + } + if (!request.properties || typeof request.properties !== 'object') { + throw createAEMError(AEM_ERROR_CODES.INVALID_PARAMETERS, 'Properties are required and must be an object'); + } + // Validate path is within allowed content roots + if (!isValidContentPath(request.componentPath, this.aemConfig)) { + throw createAEMError(AEM_ERROR_CODES.INVALID_PATH, `Component path '${request.componentPath}' is not within allowed content roots`, { path: request.componentPath, allowedRoots: Object.values(this.aemConfig.contentPaths) }); + } + + // Check if component exists + const url = `${request.componentPath}.json`; + let existingComponent: any; + try { + existingComponent = await this.fetch.get(url); + if (!existingComponent || (typeof existingComponent === 'object' && Object.keys(existingComponent).length === 0)) { + throw createAEMError(AEM_ERROR_CODES.COMPONENT_NOT_FOUND, `Component not found at path: ${request.componentPath}`, { componentPath: request.componentPath }); + } + } catch (error: any) { + if (error.code === AEM_ERROR_CODES.COMPONENT_NOT_FOUND) { + throw error; + } + if (error.message?.includes('404') || error.response?.status === 404) { + throw createAEMError(AEM_ERROR_CODES.COMPONENT_NOT_FOUND, `Component not found at path: ${request.componentPath}`, { componentPath: request.componentPath }); + } + throw handleAEMHttpError(error, 'updateComponent'); + } + + // Get resourceType to validate properties against component dialog + const resourceType = existingComponent['sling:resourceType']; + if (resourceType) { + // Fetch component definition and validate property values + LOGGER.log(`Validating properties against component definition for: ${resourceType}`); + const componentDef = await this.getComponentDefinition(resourceType); + + if (Object.keys(componentDef.fieldDefinitions).length > 0) { + const validation = this.validateComponentProperties(request.properties, componentDef.fieldDefinitions); + + if (!validation.valid) { + const errorMessages = validation.errors.join('; '); + throw createAEMError( + AEM_ERROR_CODES.INVALID_PARAMETERS, + `Invalid property values for component ${resourceType}: ${errorMessages}`, + { + resourceType, + componentPath: componentDef.componentPath, + validationErrors: validation.errors, + invalidFields: validation.invalidFields, + providedProperties: request.properties, + } + ); + } + + if (validation.warnings.length > 0) { + LOGGER.warn(`Property validation warnings: ${validation.warnings.join('; ')}`); + } + + LOGGER.log(`Property values validated successfully against component dialog definitions`); + } + } + + // Use direct POST with form data to update component properties + // This works with SlingPostServlet - just POST the properties to the component path + const formData = new URLSearchParams(); + + // Include resourceType if it exists (required for some components) + if (resourceType) { + formData.append('sling:resourceType', resourceType); + } + + Object.entries(request.properties).forEach(([key, value]) => { + if (value === null || value === undefined) { + // Handle property deletion with @Delete + formData.append(`${key}@Delete`, ''); + } else if (Array.isArray(value)) { + // Handle array values - SlingPostServlet supports multiple values + value.forEach((item) => { + formData.append(`${key}`, item.toString()); + }); + } else if (typeof value === 'object') { + // Handle nested objects + formData.append(key, JSON.stringify(value)); + } else { + // Handle primitive values + formData.append(key, value.toString()); + } + }); + + // POST to component path - SlingPostServlet will modify existing resource + // Add Accept header to get JSON response instead of HTML + const response = await this.fetch.post(request.componentPath, formData, { + headers: { + 'Accept': 'application/json' + } + }); + + // Verify the update was successful + const verificationResponse = await this.fetch.get(`${request.componentPath}.json`); + + return createSuccessResponse({ + message: 'Component updated successfully', + path: request.componentPath, + properties: request.properties, + updatedProperties: verificationResponse, + response: response, + verification: { + success: true, + propertiesChanged: Object.keys(request.properties).length, + timestamp: new Date().toISOString(), + }, + }, 'updateComponent'); + }, 'updateComponent'); + } + + async undoChanges(request: any): Promise { + // Not implemented: AEM MCP does not support undo/rollback. Use AEM version history. + return createSuccessResponse({ + message: 'undoChanges is not implemented. Please use AEM version history for undo/rollback.', + request, + timestamp: new Date().toISOString(), + }, 'undoChanges'); + } + + async scanPageComponents(pagePath: string): Promise { + return safeExecute(async () => { + const url = `${pagePath}.infinity.json`; + const response = await this.fetch.get(url); + // Extraction logic as in the original JS + const components: any[] = []; + const processNode = (node: any, nodePath: string) => { + if (!node || typeof node !== 'object') return; + if (node['sling:resourceType']) { + components.push({ + path: nodePath, + resourceType: node['sling:resourceType'], + properties: { ...node }, + }); + } + Object.entries(node).forEach(([key, value]) => { + if (typeof value === 'object' && value !== null && !key.startsWith('rep:') && !key.startsWith('oak:')) { + const childPath = nodePath ? `${nodePath}/${key}` : key; + processNode(value, childPath); + } + }); + }; + if (response['jcr:content']) { + processNode(response['jcr:content'], 'jcr:content'); + } else { + processNode(response, pagePath); + } + return createSuccessResponse({ + pagePath, + components, + totalComponents: components.length, + }, 'scanPageComponents'); + }, 'scanPageComponents'); + } + + async fetchSites(): Promise { + return safeExecute(async () => { + const url = '/content.2.json'; + const data = await this.fetch.get(url, { ':depth': '2' }); + const sites: any[] = []; + Object.entries(data).forEach(([key, value]: [string, any]) => { + if (key.startsWith('jcr:') || key.startsWith('sling:')) return; + if (value && typeof value === 'object' && value['jcr:content']) { + sites.push({ + name: key, + path: `/content/${key}`, + title: value['jcr:content']['jcr:title'] || key, + template: value['jcr:content']['cq:template'], + lastModified: value['jcr:content']['cq:lastModified'], + }); + } + }); + return createSuccessResponse({ + sites, + totalCount: sites.length, + }, 'fetchSites'); + }, 'fetchSites'); + } + + async fetchLanguageMasters(site: string): Promise { + return safeExecute(async () => { + const url = `/content/${site}.2.json`; + const data = await this.fetch.get(url, { ':depth': '3' }); + const masters: any[] = []; + Object.entries(data).forEach(([key, value]: [string, any]) => { + if (key.startsWith('jcr:') || key.startsWith('sling:')) return; + if (value && typeof value === 'object' && value['jcr:content']) { + // Only include nodes named 'master', 'language-masters', or with jcr:language property + } + }); + return createSuccessResponse({ + site, + languageMasters: masters, + }, 'fetchLanguageMasters'); + }, 'fetchLanguageMasters'); + } + + async fetchAvailableLocales(site: string, languageMasterPath: string): Promise { + return safeExecute(async () => { + const url = `${languageMasterPath}.json`; + const data = await this.fetch.get(url, { ':depth': '2' }); + const locales: any[] = []; + Object.entries(data).forEach(([key, value]: [string, any]) => { + if (key.startsWith('jcr:') || key.startsWith('sling:')) return; + if (value && typeof value === 'object') { + locales.push({ + name: key, + title: value['jcr:content']?.['jcr:title'] || key, + language: value['jcr:content']?.['jcr:language'] || key, + }); + } + }); + return createSuccessResponse({ + site, + languageMasterPath, + availableLocales: locales, + }, 'fetchAvailableLocales'); + }, 'fetchAvailableLocales'); + } + + async replicateAndPublish(selectedLocales: any, componentData: any, localizedOverrides: any): Promise { + // Simulate replication logic for now + return safeExecute(async () => { + return createSuccessResponse({ + message: 'Replication simulated', + selectedLocales, + componentData, + localizedOverrides, + }, 'replicateAndPublish'); + }, 'replicateAndPublish'); + } + + async getAllTextContent(pagePath: string): Promise { + return safeExecute(async () => { + let data: any; + // Try infinity.json first, then fallback to depth-based approach if it redirects + try { + const url = `${pagePath}.infinity.json`; + data = await this.fetch.get(url); + } catch (error: any) { + // If infinity.json fails (e.g., 300 redirect), try with depth parameter + if (error.message?.includes('300') || error.message?.includes('redirect')) { + LOGGER.warn(`infinity.json failed for ${pagePath}, trying depth-based approach`); + try { + // Try with a deep depth parameter + data = await this.fetch.get(`${pagePath}.5.json`); + } catch (depthError: any) { + // If that fails, try with jcr:content path + try { + data = await this.fetch.get(`${pagePath}/jcr:content.5.json`); + } catch (jcrError: any) { + throw handleAEMHttpError(error, 'getAllTextContent'); + } + } + } else { + throw handleAEMHttpError(error, 'getAllTextContent'); + } + } + + const textContent: any[] = []; + const processNode = (node: any, nodePath: string) => { + if (!node || typeof node !== 'object') return; + if (node['text'] || node['jcr:title'] || node['jcr:description']) { + textContent.push({ + path: nodePath, + title: node['jcr:title'], + text: node['text'], + description: node['jcr:description'], + }); + } + Object.entries(node).forEach(([key, value]) => { + if (typeof value === 'object' && value !== null && !key.startsWith('rep:') && !key.startsWith('oak:')) { + const childPath = nodePath ? `${nodePath}/${key}` : key; + processNode(value, childPath); + } + }); + }; + if (data['jcr:content']) { + processNode(data['jcr:content'], 'jcr:content'); + } else { + processNode(data, pagePath); + } + return createSuccessResponse({ + pagePath, + textContent, + }, 'getAllTextContent'); + }, 'getAllTextContent'); + } + + async getPageTextContent(pagePath: string): Promise { + return safeExecute(async () => { + return this.getAllTextContent(pagePath); // Alias for now + }, 'getPageTextContent'); + } + + async getPageImages(pagePath: string): Promise { + return safeExecute(async () => { + const url = `${pagePath}.infinity.json`; + const data = await this.fetch.get(url); + const images: any[] = []; + const processNode = (node: any, nodePath: string) => { + if (!node || typeof node !== 'object') return; + if (node['fileReference'] || node['src']) { + images.push({ + path: nodePath, + fileReference: node['fileReference'], + src: node['src'], + alt: node['alt'] || node['altText'], + title: node['jcr:title'] || node['title'], + }); + } + Object.entries(node).forEach(([key, value]) => { + if (typeof value === 'object' && value !== null && !key.startsWith('rep:') && !key.startsWith('oak:')) { + const childPath = nodePath ? `${nodePath}/${key}` : key; + processNode(value, childPath); + } + }); + }; + if (data['jcr:content']) { + processNode(data['jcr:content'], 'jcr:content'); + } else { + processNode(data, pagePath); + } + return createSuccessResponse({ + pagePath, + images, + }, 'getPageImages'); + }, 'getPageImages'); + } + + async updateImagePath(componentPath: string, newImagePath: string): Promise { + return safeExecute(async () => { + return this.updateComponent({ componentPath, properties: { fileReference: newImagePath } }); + }, 'updateImagePath'); + } + + async getPageContent(pagePath: string): Promise { + return safeExecute(async () => { + const url = `${pagePath}.infinity.json`; + const data = await this.fetch.get(url); + return createSuccessResponse({ + pagePath, + content: data, + }, 'getPageContent'); + }, 'getPageContent'); + } + + /** + * List direct children under a path using AEM JSON API. + * Returns array of { name, path, primaryType, title }. + */ + async listChildren(path: string, depth: number = 1): Promise { + return safeExecute(async () => { + // First try direct JSON API approach + try { + const data = await this.fetch.get(`${path}.${depth}.json`); + const children: any[] = []; + if (data && typeof data === 'object') { + Object.entries(data).forEach(([key, value]: [string, any]) => { + // Skip JCR system properties and metadata + if (key.startsWith('jcr:') || key.startsWith('sling:') || key.startsWith('cq:') || + key.startsWith('rep:') || key.startsWith('oak:') || key === 'jcr:content') { + return; + } + if (value && typeof value === 'object') { + const childPath = `${path}/${key}`; + children.push({ + name: key, + path: childPath, + primaryType: value['jcr:primaryType'] || 'nt:unstructured', + title: value['jcr:content']?.['jcr:title'] || + value['jcr:title'] || + key, + lastModified: value['jcr:content']?.['cq:lastModified'] || + value['cq:lastModified'], + resourceType: value['jcr:content']?.['sling:resourceType'] || + value['sling:resourceType'] + }); + } + }); + } + return children; + } catch (error: any) { + // Fallback to QueryBuilder for cq:Page nodes specifically + if (error.response?.status === 404 || error.response?.status === 403) { + const data = await this.fetch.get('/bin/querybuilder.json', { + path: path, + type: 'cq:Page', + 'p.nodedepth': '1', + 'p.limit': '1000', + 'p.hits': 'full' + }); + return (data.hits || []).map((hit: any) => ({ + name: hit.name || hit.path?.split('/').pop(), + path: hit.path, + primaryType: hit['jcr:primaryType'] || 'cq:Page', + title: hit['jcr:content/jcr:title'] || hit.title || hit.name, + lastModified: hit['jcr:content/cq:lastModified'], + resourceType: hit['jcr:content/sling:resourceType'] + })); + } + throw error; + } + }, 'listChildren'); + } + + /** + * List all cq:Page nodes under a site root, up to a given depth and limit. + */ + async listPages(siteRoot: string, depth: number = 1, limit: number = 20): Promise { + return safeExecute(async () => { + // First try direct JSON API approach for better performance + try { + const data = await this.fetch.get(`${siteRoot}.${depth}.json`); + const pages: any[] = []; + const processNode = (node: any, currentPath: string, currentDepth: number) => { + if (currentDepth > depth || pages.length >= limit) return; + Object.entries(node).forEach(([key, value]: [string, any]) => { + if (pages.length >= limit) return; + // Skip JCR system properties + if (key.startsWith('jcr:') || key.startsWith('sling:') || key.startsWith('cq:') || + key.startsWith('rep:') || key.startsWith('oak:')) { + return; + } + if (value && typeof value === 'object') { + const childPath = `${currentPath}/${key}`; + const primaryType = value['jcr:primaryType']; + // Only include cq:Page nodes + if (primaryType === 'cq:Page') { + pages.push({ + name: key, + path: childPath, + primaryType: 'cq:Page', + title: value['jcr:content']?.['jcr:title'] || key, + template: value['jcr:content']?.['cq:template'], + lastModified: value['jcr:content']?.['cq:lastModified'], + lastModifiedBy: value['jcr:content']?.['cq:lastModifiedBy'], + resourceType: value['jcr:content']?.['sling:resourceType'], + type: 'page' + }); + } + // Recursively process child nodes if within depth limit + if (currentDepth < depth) { + processNode(value, childPath, currentDepth + 1); + } + } + }); + }; + if (data && typeof data === 'object') { + processNode(data, siteRoot, 0); + } + return createSuccessResponse({ + siteRoot, + pages, + pageCount: pages.length, + depth, + limit, + totalChildrenScanned: pages.length + }, 'listPages'); + } catch (error: any) { + LOGGER.warn('JSON API failed, falling back to QueryBuilder:', error.message); + // Fallback to QueryBuilder if JSON API fails + if (error.response?.status === 404 || error.response?.status === 403) { + const data = await this.fetch.get('/bin/querybuilder.json', { + path: siteRoot, + type: 'cq:Page', + 'p.nodedepth': depth.toString(), + 'p.limit': limit.toString(), + 'p.hits': 'full' + }); + const pages = (data.hits || []).map((hit: any) => ({ + name: hit.name || hit.path?.split('/').pop(), + path: hit.path, + primaryType: 'cq:Page', + title: hit['jcr:content/jcr:title'] || hit.title || hit.name, + template: hit['jcr:content/cq:template'], + lastModified: hit['jcr:content/cq:lastModified'], + lastModifiedBy: hit['jcr:content/cq:lastModifiedBy'], + resourceType: hit['jcr:content/sling:resourceType'], + type: 'page' + })); + return createSuccessResponse({ + siteRoot, + pages, + pageCount: pages.length, + depth, + limit, + totalChildrenScanned: data.total || pages.length, + fallbackUsed: 'QueryBuilder' + }, 'listPages'); + } + throw error; + } + }, 'listPages'); + } + + /** + * Execute a QueryBuilder fulltext search for cq:Page nodes, with security validation. + * Note: This is NOT a true JCR SQL2 executor. It wraps QueryBuilder and only supports fulltext queries. + */ + async executeJCRQuery(query: string, limit: number = 20): Promise { + return safeExecute(async () => { + if (!query || query.trim().length === 0) { + throw new Error('Query is required and must be a non-empty string. Note: Only QueryBuilder fulltext is supported, not JCR SQL2.'); + } + // Basic security validation + const lower = query.toLowerCase(); + if (/drop|delete|update|insert|exec|script|\.|