From 6c647f16210786427d829cc8dcfe2d082b39762d Mon Sep 17 00:00:00 2001 From: "Michael B. Klein" Date: Wed, 11 Mar 2026 21:47:06 +0000 Subject: [PATCH] Add stateless MCP server to API Use @nulib/clover-mcp for MCP UI resource Add view-search-results tool Combine search and semantic-search tools Add source maps to MCP Add MCP tests Update to use new visibility / auth filtering in DCAPI --- .github/workflows/test-node.yml | 27 +- .tool-versions | 8 +- Makefile | 10 +- api/src/package-lock.json | 5 + api/template.yaml | 46 +- av-download/lambdas/package-lock.json | 2 + mcp/Makefile | 7 + mcp/README.md | 97 + mcp/apps/mcp/api-schema.d.ts | 1292 +++ mcp/apps/mcp/common/constants.ts | 43 + mcp/apps/mcp/common/functions.ts | 56 + mcp/apps/mcp/common/schemas.ts | 221 + mcp/apps/mcp/common/works.ts | 168 + mcp/apps/mcp/config.ts | 81 + mcp/apps/mcp/dc-api.ts | 152 + mcp/apps/mcp/handlers/lambda.ts | 5 + mcp/apps/mcp/handlers/lambdaStreamableHttp.ts | 68 + mcp/apps/mcp/handlers/main.ts | 93 + mcp/apps/mcp/package.json | 5 + mcp/apps/mcp/server.ts | 80 + mcp/apps/mcp/tools/get-work.ts | 38 + mcp/apps/mcp/tools/list-collections.ts | 49 + mcp/apps/mcp/tools/search-works.ts | 42 + mcp/apps/mcp/tools/similarity-search.ts | 44 + mcp/apps/mcp/tools/view-collection.ts | 39 + mcp/apps/mcp/tools/view-search-results.ts | 41 + mcp/apps/mcp/tools/view-similar-works.ts | 43 + mcp/apps/mcp/tools/view-work.ts | 41 + mcp/apps/mcp/tsconfig.json | 12 + mcp/apps/mcp/vite.config.ts | 30 + mcp/bin/run.sh | 12 + mcp/package-lock.json | 8213 +++++++++++++++++ mcp/package.json | 56 + mcp/test/.gitkeep | 2 + mcp/test/fixtures/interactions.har | 1495 +++ mcp/test/integration.test.ts | 333 + mcp/test/support/mcp-harness.ts | 44 + mcp/test/support/redact.py | 25 + mcp/test/support/setup.ts | 39 + mcp/test/unit.test.ts | 290 + mcp/vitest.config.ts | 29 + 41 files changed, 13360 insertions(+), 23 deletions(-) create mode 100644 mcp/Makefile create mode 100644 mcp/README.md create mode 100644 mcp/apps/mcp/api-schema.d.ts create mode 100644 mcp/apps/mcp/common/constants.ts create mode 100644 mcp/apps/mcp/common/functions.ts create mode 100644 mcp/apps/mcp/common/schemas.ts create mode 100644 mcp/apps/mcp/common/works.ts create mode 100644 mcp/apps/mcp/config.ts create mode 100644 mcp/apps/mcp/dc-api.ts create mode 100644 mcp/apps/mcp/handlers/lambda.ts create mode 100644 mcp/apps/mcp/handlers/lambdaStreamableHttp.ts create mode 100644 mcp/apps/mcp/handlers/main.ts create mode 100644 mcp/apps/mcp/package.json create mode 100644 mcp/apps/mcp/server.ts create mode 100644 mcp/apps/mcp/tools/get-work.ts create mode 100644 mcp/apps/mcp/tools/list-collections.ts create mode 100644 mcp/apps/mcp/tools/search-works.ts create mode 100644 mcp/apps/mcp/tools/similarity-search.ts create mode 100644 mcp/apps/mcp/tools/view-collection.ts create mode 100644 mcp/apps/mcp/tools/view-search-results.ts create mode 100644 mcp/apps/mcp/tools/view-similar-works.ts create mode 100644 mcp/apps/mcp/tools/view-work.ts create mode 100644 mcp/apps/mcp/tsconfig.json create mode 100644 mcp/apps/mcp/vite.config.ts create mode 100755 mcp/bin/run.sh create mode 100644 mcp/package-lock.json create mode 100644 mcp/package.json create mode 100644 mcp/test/.gitkeep create mode 100644 mcp/test/fixtures/interactions.har create mode 100644 mcp/test/integration.test.ts create mode 100644 mcp/test/support/mcp-harness.ts create mode 100644 mcp/test/support/redact.py create mode 100644 mcp/test/support/setup.ts create mode 100644 mcp/test/unit.test.ts create mode 100644 mcp/vitest.config.ts diff --git a/.github/workflows/test-node.yml b/.github/workflows/test-node.yml index 33e6a0c6..cc9bd454 100644 --- a/.github/workflows/test-node.yml +++ b/.github/workflows/test-node.yml @@ -5,12 +5,12 @@ on: - ".github/workflows/test-node.yml" - "api/**" workflow_dispatch: -defaults: - run: - working-directory: ./api jobs: - test: + test-api: runs-on: ubuntu-latest + defaults: + run: + working-directory: ./api env: AWS_ACCESS_KEY_ID: ci AWS_SECRET_ACCESS_KEY: ci @@ -18,9 +18,9 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 20.x + node-version: 24.x cache: "npm" - cache-dependency-path: 'api/package-lock.json' + cache-dependency-path: "api/package-lock.json" - run: npm ci - name: Check code style run: npm run lint && npm run prettier @@ -28,3 +28,18 @@ jobs: run: npm run test:coverage - name: Validate OpenAPI spec run: npm run validate-spec + test-mcp: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./mcp + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 24.x + cache: "npm" + cache-dependency-path: "mcp/package-lock.json" + - run: npm ci + - name: Run tests + run: npm run test:coverage diff --git a/.tool-versions b/.tool-versions index 5066ad7b..0571003a 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,5 +1,5 @@ -nodejs 20.15.0 -java corretto-19.0.1.10.1 +nodejs 24.11.1 +java corretto-19.0.1.10.1 aws-sam-cli 1.148.0 -python 3.12.2 -uv 0.9.5 \ No newline at end of file +python 3.12.2 +uv 0.9.5 diff --git a/Makefile b/Makefile index 4ab6030d..6b002614 100644 --- a/Makefile +++ b/Makefile @@ -28,6 +28,7 @@ help: echo "make serve-https | run the SAM server locally (HTTPS on port 3002)" echo "make style-node | run node code style check" echo "make style-python | run python code style check" + echo "make test-mcp | run mcp tests" echo "make test-node | run node tests" echo "make test-python | run python tests" echo "make cover-node | run node tests with coverage" @@ -68,7 +69,14 @@ deps-api: deps-av-download: cd av-download/lambdas ;\ npm list >/dev/null 2>&1 || npm ci -deps-node: deps-api deps-av-download +deps-mcp: + cd mcp ;\ + npm list >/dev/null 2>&1 ;\ + deps=$$? ;\ + test $$deps -eq 0 || npm ci +test-mcp: deps-mcp + cd mcp && npm test +deps-node: deps-api deps-av-download deps-mcp cover-node: deps-node cd api && npm run test:coverage style-node: deps-node diff --git a/api/src/package-lock.json b/api/src/package-lock.json index 93da1012..566fc896 100644 --- a/api/src/package-lock.json +++ b/api/src/package-lock.json @@ -658,6 +658,7 @@ "version": "3.686.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.686.0.tgz", "integrity": "sha512-bV8yw1tpEj9WOVEnIJTcHPmTqikGccvh9RCg9ohc5DVKLajt/pUF4b+8dDyqNrEijUqlpDDwpSnh1GFhfe298A==", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -710,6 +711,7 @@ "version": "3.686.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.686.0.tgz", "integrity": "sha512-WVyOYdK3w7RhK6UrA2MY8KPIbcZ88BGIoKmRhcOXdIUC8CLL1UIECgdRthFXOU+MBqDPFS+VeF+COk0CpRhE8Q==", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -2646,6 +2648,7 @@ "version": "3.677.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.677.0.tgz", "integrity": "sha512-2zgZkRIU7DsnUVOy+9bjfJ0IYMzi9ONWXQt/WqMa7HOnj4RfenfpipyhHYxGZR5kmehgv53EI79yvUu+SAfGNg==", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -2970,6 +2973,7 @@ "version": "3.677.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.677.0.tgz", "integrity": "sha512-N5fs1GLSthnwrs44b4IJI//dcShuIT42g4pM8FCUJZwbrWn9Sp9F876R1mvb8A9TAy2S4qCXi7TkHS0REnuicQ==", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -4919,6 +4923,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/@iiif/presentation-3/-/presentation-3-1.1.3.tgz", "integrity": "sha512-Ek+25nkQouo0pXAqCsWYbAeS4jLDEBQA7iul2jzgnvoJrucxDQN2lXyNLgOUDRqpTdSqJ69iz5lm6DLaxil+Nw==", + "peer": true, "dependencies": { "@types/geojson": "^7946.0.7" } diff --git a/api/template.yaml b/api/template.yaml index 3d7c317b..d69a27bb 100644 --- a/api/template.yaml +++ b/api/template.yaml @@ -13,7 +13,7 @@ Description: dc-api-v2 API Globals: Function: CodeUri: ./src - Runtime: nodejs20.x + Runtime: nodejs24.x Architectures: - x86_64 MemorySize: 128 @@ -118,9 +118,9 @@ Parameters: Conditions: CustomConfigSecret: Fn::Not: - - Fn::Equals: - - !Ref ApiConfigPrefix - - "" + - Fn::Equals: + - !Ref ApiConfigPrefix + - "" DeployAPI: Fn::Equals: [!Ref DeployAPI, "true"] DeployAVDownload: @@ -129,8 +129,8 @@ Conditions: Fn::Equals: [!Ref DeployChat, "true"] WriteSecret: Fn::Equals: - - !Ref WriteConfigSecret - - true + - !Ref WriteConfigSecret + - true Resources: #* apiDependencies: #* Type: AWS::Serverless::LayerVersion @@ -148,7 +148,7 @@ Resources: Type: AWS::SecretsManager::Secret Condition: WriteSecret Properties: - Name: + Name: Fn::If: - CustomConfigSecret - !Sub "${ApiConfigPrefix}/config/dcapi" @@ -471,10 +471,10 @@ Resources: Type: AWS::Serverless::Function Properties: Handler: handlers/get-provider-capabilities.handler - Description: boolean to indicate whether auth provider currently supports feature + Description: boolean to indicate whether auth provider currently supports feature #* Layers: #* - !Ref apiDependencies - Environment: + Environment: Variables: PROVIDER_CAPABILITIES: !Ref ProviderCapabilities Policies: @@ -740,6 +740,28 @@ Resources: ApiId: !Ref dcApi Path: /oai Method: POST + mcpFunction: + Type: AWS::Serverless::Function + Properties: + CodeUri: ../mcp + Handler: mcp/lambda.handler + Runtime: nodejs24.x + Environment: + Variables: + SECRETS_PATH: !Ref SecretsPath + Timeout: 30 + MemorySize: 256 + Policies: + - !Ref SecretsPolicy + Events: + ApiEvent: + Type: HttpApi + Properties: + ApiId: !Ref dcApi + Path: /mcp + Method: any + Metadata: + BuildMethod: makefile chatWebsocketEndpoint: Type: AWS::Serverless::Function Condition: DeployChat @@ -749,8 +771,8 @@ Resources: #* Layers: #* - !Ref apiDependencies Environment: - Variables: - WEBSOCKET_URI: !Ref ChatWebSocketURI + Variables: + WEBSOCKET_URI: !Ref ChatWebSocketURI Policies: - !Ref SecretsPolicy Events: @@ -794,7 +816,7 @@ Resources: Path: /chat/feedback Method: POST chatFeedbackBucket: - Type: 'AWS::S3::Bucket' + Type: "AWS::S3::Bucket" chatFeedbackTopic: Type: AWS::SNS::Topic Properties: diff --git a/av-download/lambdas/package-lock.json b/av-download/lambdas/package-lock.json index ae703108..cac0e2dd 100644 --- a/av-download/lambdas/package-lock.json +++ b/av-download/lambdas/package-lock.json @@ -1384,6 +1384,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.677.0.tgz", "integrity": "sha512-2zgZkRIU7DsnUVOy+9bjfJ0IYMzi9ONWXQt/WqMa7HOnj4RfenfpipyhHYxGZR5kmehgv53EI79yvUu+SAfGNg==", "dev": true, + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -1437,6 +1438,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.677.0.tgz", "integrity": "sha512-N5fs1GLSthnwrs44b4IJI//dcShuIT42g4pM8FCUJZwbrWn9Sp9F876R1mvb8A9TAy2S4qCXi7TkHS0REnuicQ==", "dev": true, + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", diff --git a/mcp/Makefile b/mcp/Makefile new file mode 100644 index 00000000..b60ec482 --- /dev/null +++ b/mcp/Makefile @@ -0,0 +1,7 @@ +build: + rm -rf node_modules + npm ci + npm run build + +build-mcpFunction: build + cp -r dist/apps/* apps/mcp/package.json $(ARTIFACTS_DIR) diff --git a/mcp/README.md b/mcp/README.md new file mode 100644 index 00000000..6055edc5 --- /dev/null +++ b/mcp/README.md @@ -0,0 +1,97 @@ +# dc-api-mcp + +A [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server that exposes Northwestern University Library's [Digital Collections API](https://api.dc.library.northwestern.edu/api/v2) as tools for AI assistants. + +## Requirements + +- Node.js 24+ (see [.tool-versions](.tool-versions)) +- [mise](https://mise.jdx.dev/) (used by `bin/run.sh` to activate the correct runtime) + +## Setup + +```bash +npm install +``` + +## Configuration + +The server reads the following environment variables: + +| Variable | Default | Description | +| -------------- | ------------------------------------------------- | -------------------------------------------------------------------- | +| `DC_API_BASE` | `https://api.dc.library.northwestern.edu/api/v2` | Base URL for the Digital Collections API | +| `DC_IIIF_BASE` | `https://iiif.dc.library.northwestern.edu/iiif/3` | Base URL for the Digital Collections API | +| `SECRETS_PATH` | _(none)_ | The base secrets path to load configuration from AWS Secrets Manager | + +## Running locally + +### stdio (for Claude Desktop / Claude Code) + +```bash +cd src +npm run stdio +``` + +Or via the wrapper script: + +```bash +bin/run.sh +``` + +### HTTP (Streamable HTTP transport, port 3000) + +```bash +cd src +npm run http +``` + +## Configuring Claude Desktop + +Add the following entry to your Claude Desktop configuration file. + +**macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json` +**Windows:** `%APPDATA%\Claude\claude_desktop_config.json` + +```json +{ + "mcpServers": { + "dc-api": { + "command": "/path/to/dc-api/mcp/bin/run.sh" + } + } +} +``` + +Replace `/path/to/dc-api/mcp` with the absolute path to this directory on your machine. + +If you need to override the API base URL or supply a semantic search model ID, pass them as environment variables: + +```json +{ + "mcpServers": { + "dc-api": { + "command": "/path/to/dc-api/mcp/bin/run.sh", + "env": { + "DC_API_BASE": "https://api.dc.library.northwestern.edu/api/v2", + "DC_IIIF_BASE": "https://iiif.dc.library.northwestern.edu/iiif/3" + } + } + } +} +``` + +After editing the file, restart Claude Desktop for the changes to take effect. You should see the `dc-api` server listed under the MCP tools panel. + +## Tests + +There are several ways to invoke the test suite: + +| Command | Result | +| ------------------- | ------------------------------------------------------------ | +| `npm run test` | Run the test suite | +| `npm test:watch` | Run the test suite, watching for changes | +| `npm test:coverage` | Run the test suite and calculate coverage | +| `npm test:record` | Run the test suite against live data and record new fixtures | + +- By default, the test suite uses pre-recorded HTTP fixtures. You can set `MSW_MODE=live` to run against live data. +- `npm test:record` will record new test fixtures (requires `mitmproxy`, which can be installed with `pip install mitmproxy`). diff --git a/mcp/apps/mcp/api-schema.d.ts b/mcp/apps/mcp/api-schema.d.ts new file mode 100644 index 00000000..a719c96f --- /dev/null +++ b/mcp/apps/mcp/api-schema.d.ts @@ -0,0 +1,1292 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + "/auth/login/{provider}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Initiate a user login */ + get: operations["getAuthLogin"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/auth/token": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Obtain a bearer auth token for the logged in user */ + get: operations["getAuthToken"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/auth/whoami": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Obtain information about the logged in user */ + get: operations["getAuthWhoami"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/collections": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getCollections"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/collections/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getCollectionById"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/collections/{id}/thumbnail": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getCollectionThumbnail"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/file-sets/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getFileSetById"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/file-sets/{id}/annotations": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getFileSetAnnotations"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/annotations/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getAnnotationById"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/file-sets/{id}/authorization": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getFileSetAuth"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/file-sets/{id}/download": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getFileSetDownload"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/works/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getWorkById"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/works/{id}/similar": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getSimilarWorks"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/works/{id}/thumbnail": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getWorkThumbnail"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/search": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getSearch"]; + put?: never; + post: operations["postSearch"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/search/{models}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getSearchWithModels"]; + put?: never; + post: operations["postSearchWithModels"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/oai": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["oaiGet"]; + put?: never; + post: operations["oaiPost"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + CollectionRepresentativeImage: { + /** Format: uuid */ + work_id: string | null; + /** Format: uri */ + url: string; + } | null; + /** + * @description The access level of the resource + * @enum {string|null} + */ + Visibility: "Private" | "Institution" | "Public" | null; + Collection: { + admin_email: string | null; + api_link: string; + api_model: string; + /** Format: date-time */ + create_date: string; + description: string | null; + featured: boolean; + /** Format: uri */ + finding_aid_url: string | null; + /** Format: uuuid */ + id: string; + /** Format: uri */ + iiif_collection: string | null; + /** Format: date-time */ + indexed_at: string | null; + keywords: string[]; + /** Format: date-time */ + modified_date: string; + published: boolean; + representative_image: components["schemas"]["CollectionRepresentativeImage"]; + /** Format: uri */ + thumbnail: string; + title: string; + visibility: components["schemas"]["Visibility"]; + }; + /** + * @description Role of the file set + * @enum {string|null} + */ + FileSetRole: + | "Access" + | "Auxiliary" + | "Preservation" + | "Supplemental" + | null; + FileSetBase: { + /** Format: uuid */ + id: string; + accession_number: string; + description: string | null; + download_url: string | null; + duration: number | null; + /** Format: uuid */ + group_with: string | null; + height: number | null; + label: string; + mime_type: string | null; + original_filename: string | null; + poster_offset: number | null; + rank: number; + /** Format: uri */ + representative_image_url: string | null; + role: components["schemas"]["FileSetRole"]; + /** Format: uri */ + streaming_url: string | null; + /** Format: uri */ + webvtt: string | null; + width: number | null; + }; + Annotation: { + /** Format: uuid */ + id: string; + type: string; + language: string[]; + content: string; + model: string; + }; + FileSet: components["schemas"]["FileSetBase"] & { + api_link: string; + api_model: string; + /** Format: date-time */ + create_date: string; + digests: { + [key: string]: string; + } | null; + annotations?: components["schemas"]["Annotation"][] | null; + extracted_metadata: Record | null; + indexed_at: string | null; + /** Format: date-time */ + modified_date: string; + published: boolean; + visibility: components["schemas"]["Visibility"]; + /** Format: uuid */ + work_id: string | null; + }; + ControlledTermWithRole: { + id: string; + facet: string; + label: string; + label_with_role: string; + role: string; + variants: string[]; + }; + ControlledTerm: { + id: string; + facet: string; + label: string; + variants: string[]; + }; + /** + * @description NUL Library Unit + * @enum {string|null} + */ + LibraryUnit: + | "Special Collections" + | "Faculty Collections" + | "Government and Geographic Information Collection" + | "Herskovits Library" + | "Music Library" + | "Transportation Library" + | "University Archives" + | "University Main Library" + | null; + GenericIdLabel: { + id: string; + label: string; + } | null; + NavPlaceEntry: { + /** @description Identifier for the place. */ + id: string | null; + /** @description Human-readable label for the place. */ + label: string; + /** @description Optional summary for the place. */ + summary: string | null; + /** @description Longitude/latitude coordinates. */ + coordinates: number[]; + }; + /** @description Geographic points for IIIF navPlace construction. */ + NavPlace: components["schemas"]["NavPlaceEntry"][]; + /** + * @description The type of the note + * @enum {string} + */ + NoteType: + | "Awards" + | "Bibliographical/Historical Note" + | "Creation/Production Credits" + | "General Note" + | "Lanugage Note" + | "Local Note" + | "Performers" + | "Statement of Responsibility" + | "Venue/Event Date"; + /** + * @description The preservation workflow applied to the resource + * @enum {string|null} + */ + PreservationLevel: "Level 1" | "Level 2" | "Level 3" | null; + /** + * @description Type of related resource + * @enum {string|null} + */ + RelatedUrlLabel: + | "Finding Aid" + | "Hathi Trust" + | "Related Information" + | "Resource Guide" + | null; + /** @description Information about the representative image for the resource */ + RepresentativeFileSet: { + aspect_ratio: number; + /** Format: uuid */ + id?: string | null; + /** Format: uri */ + url: string; + } | null; + /** + * @description Preservation status of the resource + * @enum {string|null} + */ + Status: "Not Started" | "In Progress" | "Done" | null; + /** + * @description The media type of the resource + * @enum {string|null} + */ + WorkType: "Audio" | "Image" | "Video" | null; + /** @description A single work response */ + Work: { + /** @description A summary of the resource */ + abstract: string[]; + /** @description Accession number for the work. Serves as basis for the filename. */ + accession_number: string; + alternate_title: string[]; + /** @description DC API url */ + api_link: string | null; + /** @description Type of resource. (Work, FileSet, Collection) */ + api_model: string | null; + /** @description Archival Resource Key (ARK) */ + ark: string; + /** @description Associated batch update operations */ + batch_ids: string[]; + /** @description The IIIF behavior of the resource */ + behavior: string | null; + /** @description Physical box name. Sometimes used with Distinctive Collections materials. */ + box_name: string[]; + /** @description Physical box number. Sometimes used with Distinctive Collections materials. */ + box_number: string[]; + /** @description The caption for a resource. */ + caption: string[]; + /** @description Alma bibliographic ID. */ + catalog_key: string[]; + /** @description The parent collection of the resource */ + collection: { + /** @description UUID of the collection */ + id: string; + /** @description Description of the collection */ + description?: string | null; + /** @description Title of the collection */ + title: string; + } | null; + /** @description An entity responsible for making contributions to the resource */ + contributor: components["schemas"]["ControlledTermWithRole"][]; + /** + * Format: date-time + * @description The creation date of the record in the repository. + */ + create_date: string; + /** @description An entity primarily responsible for making the resource */ + creator: components["schemas"]["ControlledTerm"][]; + /** @description Associated csv metadata update operations */ + csv_metadata_update_jobs: string[]; + /** @description The cultural context of the resource. */ + cultural_context: string[]; + /** @description A point or a period of time associatied with an event in the lifecycle of the resource. */ + date_created: string[]; + /** @description An account of the resource. */ + description: string[]; + /** @description Vector representation of the resource's location in the repository's semantic space. */ + embedding: number[]; + /** @description The name of the inference model used to generate the `embedding` from the resource's content. */ + embedding_model: string; + /** @description The length of the embedding text in bytes. */ + embedding_text_length: string; + /** @description File sets associated with the resource. */ + file_sets: components["schemas"]["FileSetBase"][]; + /** @description Name of the containing folder. */ + folder_name: string[]; + /** @description Number of the containing folder. */ + folder_number: string[]; + /** @description Describes what the original object is, not what it is about. */ + genre: components["schemas"]["ControlledTerm"][]; + /** + * Format: uuid + * @description UUID for the work record in the repository. + */ + id: string; + /** @description Identifiers for the object */ + identifier: string[]; + /** Format: uri */ + iiif_manifest: string | null; + /** Format: date-time */ + indexed_at: string | null; + /** @description Associated ingest project */ + ingest_project: { + /** Format: uuid */ + id: string; + title: string; + } | null; + /** @description Associated ingest sheet */ + ingest_sheet: { + /** Format: uuid */ + id: string; + title: string; + } | null; + /** @description Keywords or tags used to describe this content. */ + keywords: string[]; + /** @description A language of the resource. */ + language: components["schemas"]["ControlledTerm"][]; + /** @description PIDs from previous repository. */ + legacy_identifier: string[]; + library_unit: components["schemas"]["LibraryUnit"]; + /** @description Creative Commons licenses */ + license: components["schemas"]["GenericIdLabel"]; + /** @description Place of publication. */ + location: components["schemas"]["ControlledTerm"][]; + nav_place: components["schemas"]["NavPlace"]; + /** + * Format: date-time + * @description Date resource last modified in repository + */ + modified_date: string; + notes: { + note: string; + type: components["schemas"]["NoteType"]; + }[]; + /** @description The material or physical carrier of the resource. */ + physical_description_material: string[]; + /** @description The size or duration of the resource. */ + physical_description_size: string[]; + preservation_level: components["schemas"]["PreservationLevel"]; + /** @description Project related information */ + project: { + desc: string | null; + cycle: string | null; + manager: string | null; + name: string | null; + proposer: string | null; + task_number: string | null; + } | null; + /** @description Location of Physical Object // will also include messy dates. Information about the provenance, such as origin, ownership and custodial history (chain of custody), of a resource. */ + provenance: string[]; + /** @description Resource is available on Digital Collections. */ + published: boolean; + /** @description An entity responsible for making the resource available. */ + publisher: string[]; + /** @description URL of a related resource. */ + related_url: { + /** Format: uri */ + url: string; + label: components["schemas"]["RelatedUrlLabel"]; + }[]; + representative_file_set: components["schemas"]["RepresentativeFileSet"]; + /** @description A person or organization owning or managing rights over the resource. */ + rights_holder: string[]; + /** @description Expresses the copyright status of the resource. */ + rights_statement: components["schemas"]["GenericIdLabel"]; + /** @description Sometimes used with Distincitive Collections materials */ + scope_and_contents: string[]; + /** @description Sometimes used with Distincitive Collections materials. Used for archival series and subseries information. */ + series: string[]; + /** @description A related resource from which the described resource is derived. Source of digital object - book, journal, etc. Follow Chicago Manual of Style for citation. */ + source: string[]; + status: components["schemas"]["Status"]; + /** @description A defined style, historical period, group, school, dynasty, movement, etc. whose characteristics are represented in the work. */ + style_period: components["schemas"]["ControlledTerm"][]; + /** @description A defined style, historical period, group, school, dynasty, movement, etc. whose characteristics are represented in the work. */ + subject: components["schemas"]["ControlledTermWithRole"][]; + /** @description Used to provide the titles of separate works or parts of a resource. Information provided may also contain statements of responsibility or other sequential designations. */ + table_of_contents: string[]; + /** @description A defined style, historical period, group, school, dynasty, movement, etc. whose characteristics are represented in the work. */ + technique: components["schemas"]["ControlledTerm"][]; + /** @description Terms of use of resource. */ + terms_of_use: string | null; + /** + * Format: uri + * @description Url of thumbnail image. + */ + thumbnail: string | null; + /** @description A name given to the resource */ + title: string | null; + visibility: components["schemas"]["Visibility"]; + work_type: components["schemas"]["WorkType"]; + }; + /** @description A single index document */ + IndexDocument: + | components["schemas"]["Collection"] + | components["schemas"]["FileSet"] + | components["schemas"]["Work"]; + /** @description Pagination info for the current response. */ + PaginationInfo: { + /** @description Full URL to the next page of results */ + next_url?: string; + /** @description Full URL to the previous page of results */ + prev_url?: string; + /** @description Base URL to repeat this query for a given page */ + query_url?: string; + /** @description Tokenized query to use in subsequent GET requests */ + search_token?: string; + /** @description Index of current page of results */ + current_page?: number; + /** @description Number of results per page */ + limit?: number; + /** @description Starting index of first result on the current page */ + offset?: number; + /** @description Total number of results */ + total_hits?: number; + /** @description Total number of result pages */ + total_pages?: number; + }; + /** @description Additional Information */ + Info: { + description: string; + /** Format: date-time */ + link_expiration?: string | null; + name: string; + version: string; + }; + OpenSearchResponse: { + /** @description An array of response documents */ + data?: components["schemas"]["IndexDocument"][]; + pagination?: components["schemas"]["PaginationInfo"]; + info?: components["schemas"]["Info"]; + }; + /** @description A [IIIF Presentation v3.x](https://iiif.io/api/presentation/3.0/) Manifest */ + IiifPresentationManifest: Record; + }; + responses: { + /** @description A page of search results */ + SearchResponse: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": + | components["schemas"]["OpenSearchResponse"] + | components["schemas"]["IiifPresentationManifest"]; + }; + }; + /** @description A single document response */ + DocumentResponse: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + data?: + | components["schemas"]["IndexDocument"] + | components["schemas"]["IiifPresentationManifest"]; + info?: Record; + }; + }; + }; + /** @description Annotations for a FileSet */ + AnnotationsResponse: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + data?: components["schemas"]["Annotation"][] | null; + info?: components["schemas"]["Info"]; + }; + }; + }; + /** @description A single annotation response */ + AnnotationResponse: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + data?: components["schemas"]["Annotation"]; + info?: components["schemas"]["Info"]; + }; + }; + }; + }; + parameters: { + /** @description Desired output format */ + as: "iiif" | "opensearch"; + /** @description Page number of results to retrieve */ + page: number; + /** @description Maximum number of results per page */ + size: number; + /** @description Comma-delimited list of fields to sort search results (e.g. "create_date:asc,modified_date:desc") */ + sort: string; + /** @description Collection, FileSet, or Work ID */ + id: string; + /** @description Desired aspect ratio */ + thumbnailAspect: "full" | "square"; + /** @description Size of largest dimension */ + thumbnailSize: number; + /** @description Keyword query */ + query: string; + /** @description Search token from previous search response */ + searchToken: string; + /** @description Filter search results by visibility */ + visibility: ("public" | "institution" | "private")[]; + /** @description Comma-delimited list of models to search */ + models: ("collections" | "file-sets" | "works")[]; + }; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + getAuthLogin: { + parameters: { + query?: { + /** @description Email address to use for magic link login */ + email?: string; + /** @description URL to redirect to after login */ + goto?: string; + }; + header?: never; + path: { + /** @description The authentication provider to use */ + provider: "nusso" | "magic"; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A redirect to the login page */ + 302: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getAuthToken: { + parameters: { + query?: { + /** @description TTL in seconds for the token expiration */ + ttl?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Authentication token response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + token?: string; + /** Format: date-time */ + expires?: string; + }; + }; + }; + }; + }; + getAuthWhoami: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description User details */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + getCollections: { + parameters: { + query?: { + /** @description Desired output format */ + as?: components["parameters"]["as"]; + /** @description Page number of results to retrieve */ + page?: components["parameters"]["page"]; + /** @description Maximum number of results per page */ + size?: components["parameters"]["size"]; + /** @description Comma-delimited list of fields to sort search results (e.g. "create_date:asc,modified_date:desc") */ + sort?: components["parameters"]["sort"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["SearchResponse"]; + }; + }; + getCollectionById: { + parameters: { + query?: { + /** @description Desired output format */ + as?: components["parameters"]["as"]; + }; + header?: never; + path: { + /** @description Collection, FileSet, or Work ID */ + id: components["parameters"]["id"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["DocumentResponse"]; + }; + }; + getCollectionThumbnail: { + parameters: { + query?: { + /** @description Desired aspect ratio */ + aspect?: components["parameters"]["thumbnailAspect"]; + /** @description Size of largest dimension */ + size?: components["parameters"]["thumbnailSize"]; + }; + header?: never; + path: { + /** @description Collection, FileSet, or Work ID */ + id: components["parameters"]["id"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A thumbnail image for the given collection */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "image/jpeg": string; + }; + }; + }; + }; + getFileSetById: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Collection, FileSet, or Work ID */ + id: components["parameters"]["id"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["DocumentResponse"]; + }; + }; + getFileSetAnnotations: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Collection, FileSet, or Work ID */ + id: components["parameters"]["id"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["AnnotationsResponse"]; + }; + }; + getAnnotationById: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Collection, FileSet, or Work ID */ + id: components["parameters"]["id"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["AnnotationResponse"]; + }; + }; + getFileSetAuth: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Collection, FileSet, or Work ID */ + id: components["parameters"]["id"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The resource is authorized */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description The resource is not authorized */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getFileSetDownload: { + parameters: { + query: { + /** @description Email to send the download link to */ + email: string; + }; + header?: never; + path: { + /** @description Id of the file set */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The download is being created */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Method Not allowed for work type, file set role combo */ + 405: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getWorkById: { + parameters: { + query?: { + /** @description Desired output format */ + as?: components["parameters"]["as"]; + }; + header?: never; + path: { + /** @description Collection, FileSet, or Work ID */ + id: components["parameters"]["id"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["DocumentResponse"]; + }; + }; + getSimilarWorks: { + parameters: { + query?: { + /** @description Page number of results to retrieve */ + page?: components["parameters"]["page"]; + /** @description Maximum number of results per page */ + size?: components["parameters"]["size"]; + /** @description Comma-delimited list of fields to sort search results (e.g. "create_date:asc,modified_date:desc") */ + sort?: components["parameters"]["sort"]; + /** @description Desired output format */ + as?: components["parameters"]["as"]; + }; + header?: never; + path: { + /** @description Collection, FileSet, or Work ID */ + id: components["parameters"]["id"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["SearchResponse"]; + }; + }; + getWorkThumbnail: { + parameters: { + query?: { + /** @description Desired aspect ratio */ + aspect?: components["parameters"]["thumbnailAspect"]; + /** @description Size of largest dimension */ + size?: components["parameters"]["thumbnailSize"]; + }; + header?: never; + path: { + /** @description Collection, FileSet, or Work ID */ + id: components["parameters"]["id"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A thumbnail image for the given work */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "image/jpeg": string; + }; + }; + }; + }; + getSearch: { + parameters: { + query?: { + /** @description Keyword query */ + query?: components["parameters"]["query"]; + /** @description Search token from previous search response */ + searchToken?: components["parameters"]["searchToken"]; + /** @description Page number of results to retrieve */ + page?: components["parameters"]["page"]; + /** @description Maximum number of results per page */ + size?: components["parameters"]["size"]; + /** @description Comma-delimited list of fields to sort search results (e.g. "create_date:asc,modified_date:desc") */ + sort?: components["parameters"]["sort"]; + /** @description Desired output format */ + as?: components["parameters"]["as"]; + /** @description Filter search results by visibility */ + visibility?: components["parameters"]["visibility"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["SearchResponse"]; + }; + }; + postSearch: { + parameters: { + query?: { + /** @description Page number of results to retrieve */ + page?: components["parameters"]["page"]; + /** @description Maximum number of results per page */ + size?: components["parameters"]["size"]; + /** @description Comma-delimited list of fields to sort search results (e.g. "create_date:asc,modified_date:desc") */ + sort?: components["parameters"]["sort"]; + /** @description Desired output format */ + as?: components["parameters"]["as"]; + /** @description Filter search results by visibility */ + visibility?: components["parameters"]["visibility"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + 200: components["responses"]["SearchResponse"]; + }; + }; + getSearchWithModels: { + parameters: { + query?: { + /** @description Keyword query */ + query?: components["parameters"]["query"]; + /** @description Search token from previous search response */ + searchToken?: components["parameters"]["searchToken"]; + /** @description Page number of results to retrieve */ + page?: components["parameters"]["page"]; + /** @description Maximum number of results per page */ + size?: components["parameters"]["size"]; + /** @description Comma-delimited list of fields to sort search results (e.g. "create_date:asc,modified_date:desc") */ + sort?: components["parameters"]["sort"]; + /** @description Desired output format */ + as?: components["parameters"]["as"]; + /** @description Filter search results by visibility */ + visibility?: components["parameters"]["visibility"]; + }; + header?: never; + path: { + /** @description Comma-delimited list of models to search */ + models: components["parameters"]["models"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["SearchResponse"]; + }; + }; + postSearchWithModels: { + parameters: { + query?: { + /** @description Page number of results to retrieve */ + page?: components["parameters"]["page"]; + /** @description Maximum number of results per page */ + size?: components["parameters"]["size"]; + /** @description Comma-delimited list of fields to sort search results (e.g. "create_date:asc,modified_date:desc") */ + sort?: components["parameters"]["sort"]; + /** @description Desired output format */ + as?: components["parameters"]["as"]; + /** @description Filter search results by visibility */ + visibility?: components["parameters"]["visibility"]; + }; + header?: never; + path: { + /** @description Comma-delimited list of models to search */ + models: components["parameters"]["models"]; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + 200: components["responses"]["SearchResponse"]; + }; + }; + oaiGet: { + parameters: { + query: { + /** @description All OAI-PMH verbs are supported. */ + verb: + | "GetRecord" + | "Identify" + | "ListIdentifiers" + | "ListMetadataFormats" + | "ListRecords" + | "ListSets"; + /** + * @description Required for `GetRecord` requests + * @example d75a851f-b773-4bdf-baec-62a8ec974126 + */ + identifier?: string; + /** @description Required for `ListIdentifiers`, `ListRecords`, and `GetRecord` requests */ + metadataPrefix?: "oai_dc"; + /** + * @description Optional for `ListRecords` and `ListIdentifiers` requests, based on a record's modified date. Accepted formats `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ` + * @example 2023-01-01T08:12:23Z + */ + from?: string; + /** + * @description Optional for `ListRecords` and `ListIdentifiers` requests, based on a record's modified date. Accepted formats `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ` + * @example 2023-01-12T12:03:59Z + */ + until?: string; + /** + * @description Optional for `ListRecords` and `ListIdentifiers` requests, based on a collection id. + * @example c4f30015-88b5-4291-b3a6-8ac9b7c7069c + */ + set?: string; + /** @description Exclusive parameter for retrieving additional results */ + resumptionToken?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description An OAI-PMH response document */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/xml": Record; + }; + }; + }; + }; + oaiPost: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": { + /** @description All OAI-PMH verbs are supported */ + verb?: string; + /** @description Required for `GetRecord` requests */ + identifier?: string; + /** @description Required for `ListIdentifiers`, `ListRecords`, and `GetRecord` requests. The only supported value is `"oai_dc"` currently. */ + metadataPrefix?: string; + /** @description Exclusive parameter for retrieving additional results */ + resumptionToken?: string; + /** @description Optional for `ListRecords` and `ListIdentifiers` requests, based on a record's modified date. Accepted formats `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ` */ + from?: string; + /** @description Optional for `ListRecords` and `ListIdentifiers` requests, based on a record's modified date. Accepted formats `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ` */ + until?: string; + /** @description Optional for `ListRecords` and `ListIdentifiers` requests, based on a collection id. */ + set?: string; + }; + }; + }; + responses: { + /** @description An OAI-PMH response document */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/xml": Record; + }; + }; + }; + }; +} diff --git a/mcp/apps/mcp/common/constants.ts b/mcp/apps/mcp/common/constants.ts new file mode 100644 index 00000000..b56fdbc7 --- /dev/null +++ b/mcp/apps/mcp/common/constants.ts @@ -0,0 +1,43 @@ +export const LibraryUnits = [ + "Special Collections", + "Faculty Collections", + "Government and Geographic Information Collection", + "Herskovits Library", + "Music Library", + "Transportation Library", + "University Archives", + "University Main Library" +]; +export const Licenses = [ + "All rights reserved", + "Attribution 3.0 United States", + "Attribution 4.0 International", + "Attribution-NoDerivatives 4.0 International", + "Attribution-NoDerivs 3.0 United States", + "Attribution-NonCommercial 3.0 United States", + "Attribution-NonCommercial 4.0 International", + "Attribution-NonCommercial-NoDerivatives 4.0 International", + "Attribution-NonCommercial-NoDerivs 3.0 United States", + "Attribution-NonCommercial-ShareAlike 3.0 United States", + "Attribution-NonCommercial-ShareAlike 4.0 International", + "Attribution-ShareAlike 3.0 United States", + "Attribution-ShareAlike 4.0 International", + "CC0 1.0 Universal", + "Public Domain Mark 1.0" +]; +export const RightsStatements = [ + "Copyright Not Evaluated", + "Copyright Undetermined", + "In Copyright", + "In Copyright - Educational Use Permitted", + "In Copyright - EU Orphan Work", + "In Copyright - Non-Commercial Use Permitted", + "In Copyright - Rights-holder(s) Unlocatable or Unidentifiable", + "No Copyright - Contractual Restrictions", + "No Copyright - Non-Commercial Use Only ", + "No Copyright - Other Known Legal Restrictions", + "No Copyright - United States", + "No Known Copyright" +]; +export const Visibilities = ["Public", "Private", "Institution"]; +export const WorkTypes = ["Audio", "Image", "Video"]; diff --git a/mcp/apps/mcp/common/functions.ts b/mcp/apps/mcp/common/functions.ts new file mode 100644 index 00000000..2fc12447 --- /dev/null +++ b/mcp/apps/mcp/common/functions.ts @@ -0,0 +1,56 @@ +import * as z from "zod/v4"; +import { ErrorCode, McpError } from "@modelcontextprotocol/sdk/types"; +import { DC_API_BASE } from "../config.js"; +import { sharedResultSchema } from "./schemas.js"; +import * as lz from "lz-string"; +const { compressToEncodedURIComponent } = lz.default; + +const pluralize = (count: number, singular: string) => { + return `${count} ${singular}${count !== 1 ? "s" : ""}`; +}; + +export const summarizeResults = ( + results: z.infer +) => { + const { total_hits, total_pages, current_page, limit } = results.pagination; + return `The search returned ${pluralize(total_hits, "result")} across ${pluralize(total_pages, "page")}. The current page is ${current_page} with a limit of ${pluralize(limit, "result")} per page.`; +}; + +// Encoding logic cribbed from api/src/api/pagination.js +const encodeSearchToken = (queryObject: any) => { + const encodeFields = ["query", "size", "sort", "fields", "_source"]; + let token: any = { + body: { size: 10 }, + models: ["works"], + format: null, + options: {} + }; + for (const field in queryObject) { + if (encodeFields.includes(field)) { + token.body[field] = queryObject[field]; + } + } + return compressToEncodedURIComponent(JSON.stringify(token)); +}; + +export const buildIIIFSearchUrl = ( + queryObject: any, + options: { page: number; size: number; visibility?: string } +) => { + const searchToken = encodeSearchToken(queryObject); + const iiifUrl = new URL("search/works", DC_API_BASE); + iiifUrl.searchParams.set("searchToken", searchToken); + iiifUrl.searchParams.set("page", options.page.toString()); + iiifUrl.searchParams.set("size", options.size.toString()); + iiifUrl.searchParams.set("visibility", options.visibility || "public"); + iiifUrl.searchParams.set("as", "iiif"); + return iiifUrl.toString(); +}; + +export const handleToolError = (error: unknown) => { + console.error(error); + if (error instanceof z.ZodError) { + throw new McpError(ErrorCode.InvalidParams, z.prettifyError(error)); + } + throw new McpError(ErrorCode.InternalError, (error as Error).toString()); +}; diff --git a/mcp/apps/mcp/common/schemas.ts b/mcp/apps/mcp/common/schemas.ts new file mode 100644 index 00000000..cd146b54 --- /dev/null +++ b/mcp/apps/mcp/common/schemas.ts @@ -0,0 +1,221 @@ +import * as z from "zod/v4"; +import { + LibraryUnits, + Licenses, + RightsStatements, + Visibilities, + WorkTypes +} from "./constants.js"; + +export const searchLimiters = z.object({ + public_only: z + .boolean() + .describe("Only include publicly available works in search results") + .default(true), + max_results: z + .number() + .gte(1) + .lte(20) + .default(10) + .describe("The maximum number of search results to return per page"), + page: z + .number() + .gte(1) + .default(1) + .describe("The page of search results to return") +}); + +export const aggregation = z.array( + z.object({ + key: z.string().describe("The value of the aggregated field"), + doc_count: z + .number() + .describe("The number of documents matching this aggregated value") + }) +); + +export const sharedResultSchema = z.object({ + pagination: z + .object({ + current_page: z.number().describe("The current page of search results"), + limit: z + .number() + .describe("The maximum number of search results returned per page"), + total_hits: z.number().describe("The total number of search results"), + total_pages: z + .number() + .describe("The total number of pages of search results") + }) + .strip(), + info: z + .object({ + name: z.string().describe("The name of the API endpoint"), + description: z.string().describe("A description of the API endpoint"), + version: z.string().describe("The version of the API endpoint") + }) + .strip(), + aggregations: z + .object({ + collection: aggregation.describe( + "Aggregation of search results by collection" + ), + work_type: aggregation.describe( + "Aggregation of search results by work type" + ), + visibility: aggregation.describe( + "Aggregation of search results by visibility" + ) + }) + .strip() + .optional() +}); + +export const workSearchableFields = z + .object({ + abstract: z.string().optional().describe("A summary of the work"), + alternate_title: z + .string() + .optional() + .describe("Alternate titles for the work"), + caption: z.string().optional().describe("The caption for a work"), + collection: z + .string() + .optional() + .describe("The parent collection of the work"), + contributor: z + .string() + .optional() + .describe("An entity responsible for making contributions to the work"), + creator: z + .string() + .optional() + .describe("An entity primarily responsible for making the work"), + description: z.string().optional().describe("An account of the work"), + genre: z + .string() + .optional() + .describe("Describes what the original object is, not what it is about"), + keywords: z + .string() + .optional() + .describe("Keywords or tags used to describe this content"), + language: z.string().optional().describe("A language of the work"), + library_unit: z + .enum(LibraryUnits) + .optional() + .describe("The library unit responsible for the work"), + license: z + .enum(Licenses) + .optional() + .describe("The Creative Commons license for the work"), + location: z.string().optional().describe("Place of publication"), + notes: z.string().optional().describe("Notes associated with the work"), + publisher: z + .string() + .optional() + .describe("An entity responsible for making the work available"), + rights_statement: z + .enum(RightsStatements) + .optional() + .describe("The rights statement of the work"), + style_period: z + .string() + .optional() + .describe( + "A defined style, historical period, group, school, dynasty, movement, etc. whose characteristics are represented in the work." + ), + subject: z.string().optional().describe("The subject of the work"), + table_of_contents: z + .string() + .optional() + .describe( + "Used to provide the titles of separate works or parts of a resource. Information provided may also contain statements of responsibility or other sequential designations." + ), + technique: z + .string() + .optional() + .describe("The technique used in the creation of the work"), + title: z.string().optional().describe("The title of the work"), + work_type: z.enum(WorkTypes).optional().describe("The type of the work") + }) + .describe( + "Structured field search. Best when searching for specific known items or values, or for narrowing a search by specifying particular fields to search within." + ); + +export const workSearchSchema = z + .object({ + query: z + .string() + .optional() + .describe( + "A natural language query. Best for exploratory / conceptual searches." + ), + fields: workSearchableFields.optional(), + ...searchLimiters.shape + }) + .describe( + "Search for items in the Digital Collections using either a natural language query or specific field values. If both a natural language query and specific field values are provided, the search will return items that match the natural language query and have the specified field values." + ); + +export const workResultSchema = z.object({ + id: z.string().describe("The unique identifier for the search result item"), + title: z.string().describe("The title of the search result item"), + description: z + .array(z.string()) + .describe("A brief description of the search result item"), + thumbnail: z + .url() + .describe("A URL to a thumbnail image representing the search result item"), + collection: z.object({ + title: z + .string() + .describe("The title of the collection the search result item belongs to") + }), + iiif_manifest: z + .url() + .describe("A URL to the IIIF manifest for the search result item"), + visibility: z + .enum(Visibilities) + .describe("Whether the item is publicly accessible") +}); + +export const workResultsSchema = z.object({ + data: z + .array(workResultSchema) + .describe("The search results returned from the Digital Collections API"), + ...sharedResultSchema.shape +}); + +export const similaritySearchSchema = z.object({ + work_id: z.string().describe("ID of a work to find similar items for."), + ...searchLimiters.shape +}); + +export const collectionResultSchema = z.object({ + id: z.string().describe("The unique identifier for the search result item"), + title: z.string().describe("The title of the search result item"), + description: z + .string() + .describe("A brief description of the search result item"), + thumbnail: z + .url() + .describe("A URL to a thumbnail image representing the search result item"), + iiif_collection: z + .url() + .describe("A URL to the IIIF collection for the search result item"), + visibility: z + .enum(Visibilities) + .describe("Whether the item is publicly accessible") +}); + +export const collectionResultsSchema = z.object({ + data: z + .array(collectionResultSchema) + .describe("The search results returned from the Digital Collections API"), + ...sharedResultSchema.shape +}); + +export const isEnum = (field: any): boolean => { + if (field.def.innerType) return isEnum(field.def.innerType); + return field.def.type === "enum"; +}; diff --git a/mcp/apps/mcp/common/works.ts b/mcp/apps/mcp/common/works.ts new file mode 100644 index 00000000..2c445249 --- /dev/null +++ b/mcp/apps/mcp/common/works.ts @@ -0,0 +1,168 @@ +import * as z from "zod/v4"; +import { + searchLimiters, + workSearchSchema, + workSearchableFields, + isEnum +} from "./schemas.js"; + +const FieldOverrides = { + collection: "collection.title", + contributor: "contributor.label", + creator: "creator.label", + genre: "genre.label", + language: "language.label", + location: "location.label", + notes: "note.note", + style_period: "style_period.label", + subject: "subject.label", + technique: "technique.label" +}; + +const options = ({ + page, + max_results, + public_only +}: { + page: number; + max_results: number; + public_only: boolean; +}) => { + return { + page, + size: max_results, + visibility: public_only ? "public" : "institution,public" + }; +}; + +export const buildQuery = ({ + max_results, + page, + public_only, + query, + fields +}: z.infer) => { + let shoulds = []; + + for (const [field, value] of Object.entries(fields || {})) { + if (value) { + const property = + FieldOverrides[field as keyof typeof FieldOverrides] || field; + const should = isEnum( + workSearchableFields.shape[ + field as keyof typeof workSearchableFields.shape + ] + ) + ? { term: { [property]: { value } } } + : { match: { [property]: value } }; + shoulds.push(should); + } + } + + const fieldSearch: any = { + bool: {} + }; + + if (shoulds.length > 0) { + fieldSearch.bool.should = shoulds; + fieldSearch.bool.minimum_should_match = 1; + } + + const neuralSearch = { + neural: { + embedding: { + query_text: query, + k: 100 + } + } + }; + + let main; + + if (query && shoulds.length > 0) { + // hybrid search only if there's a query and at least one field + main = { + hybrid: { + queries: [fieldSearch, neuralSearch] + } + }; + } else if (query) { + // neural search only if there's a query and no fields + main = neuralSearch; + } else if (shoulds.length === 1) { + // if there's exactly one field, use it as the main query + main = shoulds[0]; + } else if (shoulds.length > 1) { + // if there are multiple fields but no query, the bool is the main query + main = fieldSearch; + } else { + // if there's no query and no fields, match all + main = { match_all: {} }; + } + + const result = { + query: main, + aggs: { + collection: { + terms: { + field: "collection.title.keyword", + size: 20 + } + }, + work_type: { + terms: { + field: "work_type", + size: 3 + } + }, + visibility: { + terms: { + field: "visibility", + size: 3 + } + } + } + }; + + return { + query: result, + options: options({ page, max_results, public_only }) + }; +}; + +export const similarityworkSearchSchema = z.object({ + work_id: z.string().describe("ID of a work to find similar items for."), + ...searchLimiters.shape +}); + +export const buildSimilaritySearchQuery = ( + input: z.infer +) => { + const query = { + query: { + more_like_this: { + fields: [ + "title", + "description", + "subject.label", + "genre.label", + "contributor.label", + "creator.label" + ], + like: [ + { + _id: input.work_id + } + ], + max_query_terms: 10, + min_doc_freq: 1, + min_term_freq: 1 + } + } + }; + + return { + query, + options: options(input) + }; +}; diff --git a/mcp/apps/mcp/config.ts b/mcp/apps/mcp/config.ts new file mode 100644 index 00000000..0a9fa445 --- /dev/null +++ b/mcp/apps/mcp/config.ts @@ -0,0 +1,81 @@ +/// +import { + GetSecretValueCommand, + SecretsManagerClient +} from "@aws-sdk/client-secrets-manager"; + +const getEnvVar = (key: string, ...defaults: string[]): string => { + const result = + process.env[key] || + process.env[`VITE_${key}`] || + import.meta?.env?.[key] || + import.meta?.env?.[`VITE_${key}`] || + defaults.find((d) => d !== undefined); + return result; +}; + +let Secrets: Record> = {}; +const SECRETS_PATH = getEnvVar("SECRETS_PATH"); + +const loadSecrets = async (secretIds: string[]) => { + if (!SECRETS_PATH) { + return; + } + const client = new SecretsManagerClient(); + for (const secretId of secretIds) { + if (!Secrets[secretId]) { + try { + const cmd = new GetSecretValueCommand({ + SecretId: `${SECRETS_PATH}/${secretId}` + }); + const secretsResponse = await client.send(cmd); + if (secretsResponse.SecretString) { + const secretKey = secretId.split("/").slice(-1)[0]; + Secrets[secretKey] = JSON.parse(secretsResponse.SecretString); + } + } catch (err) { + console.error(`Error loading ${secretId} from secrets manager`, err); + } + } + } +}; + +await loadSecrets(["infrastructure/iiif", "config/dcapi", "config/meadow"]); + +const ensureTrailingBackslash = (url: string) => + url.endsWith("/") ? url : url + "/"; + +export const DC_API_BASE = ensureTrailingBackslash( + getEnvVar( + "DC_API_BASE", + Secrets.dcapi?.base_url, + "https://api.dc.library.northwestern.edu/api/v2" + ) +); +export const DC_API_ORIGIN = new URL(DC_API_BASE).origin; +export const DC_IIIF_BASE = ensureTrailingBackslash( + getEnvVar( + "DC_IIIF_BASE", + Secrets.iiif?.v3, + "https://iiif.dc.library.northwestern.edu/iiif/3" + ) +); +export const DC_IIIF_ORIGIN = new URL(DC_IIIF_BASE).origin; + +export const DC_STREAMING_BASE = ensureTrailingBackslash( + getEnvVar( + "DC_STREAMING_BASE", + Secrets.meadow?.streaming?.base_url, + "https://meadow-streaming.rdc-staging.library.northwestern.edu/" + ) +); + +export const DC_STREAMING_ORIGIN = DC_STREAMING_BASE + ? new URL(DC_STREAMING_BASE).origin + : undefined; + +export const DC_RESOURCE_ORIGINS = [ + DC_API_ORIGIN, + DC_IIIF_ORIGIN, + DC_STREAMING_ORIGIN +].filter((origin): origin is string => !!origin); diff --git a/mcp/apps/mcp/dc-api.ts b/mcp/apps/mcp/dc-api.ts new file mode 100644 index 00000000..cc3c0b8b --- /dev/null +++ b/mcp/apps/mcp/dc-api.ts @@ -0,0 +1,152 @@ +import createClient from "openapi-fetch"; +import { DC_API_BASE } from "./config.js"; +import type { + components as sc, + operations as so, + paths as sp +} from "./api-schema.js"; + +const client = createClient({ baseUrl: DC_API_BASE }); + +const ExcludeFields = [ + "batch_ids", + "behavior", + "box_name", + "box_number", + "catalog_key", + "csv_metadata_update_jobs", + "embedding", + "embedding_model", + "embedding_text_length", + "folder_name", + "folder_number", + "ingest_project", + "ingest_sheet", + "legacy_identifier", + "preservation_level", + "project", + "status", + "terms_of_use", + "contributor.facet", + "creator.facet", + "genre.facet", + "language.facet", + "location.facet", + "style_period.facet", + "subject.facet", + "technique.facet", + "contributor.label_with_role", + "creator.label_with_role", + "genre.label_with_role", + "language.label_with_role", + "location.label_with_role", + "style_period.label_with_role", + "subject.label_with_role", + "technique.label_with_role", + "contributor.variants", + "creator.variants", + "genre.variants", + "language.variants", + "location.variants", + "style_period.variants", + "subject.variants", + "technique.variants" +]; + +const IncludeFields = [ + "id", + "title", + "thumbnail", + "collection.id", + "collection.title", + "description", + "iiif_collection", + "iiif_manifest", + "visibility" +]; + +type SearchOptions = { + models?: sc["parameters"]["models"]; +} & so["postSearchWithModels"]["parameters"]["query"]; + +const removeFields = (obj: any, fields: string[]) => { + for (const field of fields) { + const fieldPath = field.split("."); + removeAtPath(obj, fieldPath); + } +}; + +const removeAtPath = (current: any, path: string[]) => { + if (!current || typeof current !== "object") return; + + if (path.length === 1) { + if (Array.isArray(current)) { + for (const item of current) { + if (item && typeof item === "object") { + delete item[path[0]]; + } + } + } else { + delete current[path[0]]; + } + return; + } + + const [head, ...rest] = path; + const next = current[head]; + if (Array.isArray(next)) { + for (const item of next) { + removeAtPath(item, rest); + } + } else { + removeAtPath(next, rest); + } +}; + +export const getCollection = async (id: string) => { + const response = await client.GET("/collections/{id}", { + params: { path: { id } } + }); + return response.data; +}; + +export const getWork = async (id: string) => { + const response = await client.GET("/works/{id}", { + params: { path: { id } } + }); + removeFields(response.data?.data, ExcludeFields); + return response.data; +}; + +const normalizeAggregations = (response: any) => { + if (response?.aggregations) { + for (const key in response.aggregations) { + if (response.aggregations[key].buckets) { + response.aggregations[key] = response.aggregations[key].buckets; + } + } + } +}; + +export const visibilities = (public_only?: boolean) => { + return public_only ? "public" : "institution,public"; +}; + +export const search = async (query: object, options: SearchOptions = {}) => { + const { models, ...restOptions } = options; + const body = { + ...query, + _source: { includes: IncludeFields, excludes: ExcludeFields } + }; + const params = { + path: { models: models || ["works"] }, + query: restOptions + }; + + const response = await client.POST("/search/{models}", { + body, + params + }); + normalizeAggregations(response.data); + return response.data; +}; diff --git a/mcp/apps/mcp/handlers/lambda.ts b/mcp/apps/mcp/handlers/lambda.ts new file mode 100644 index 00000000..4b10b559 --- /dev/null +++ b/mcp/apps/mcp/handlers/lambda.ts @@ -0,0 +1,5 @@ +import { streamableHttpHandler } from "./lambdaStreamableHttp.js"; +import { createServer } from "../server.js"; +process.setSourceMapsEnabled?.(true); + +export const handler = streamableHttpHandler(createServer()); diff --git a/mcp/apps/mcp/handlers/lambdaStreamableHttp.ts b/mcp/apps/mcp/handlers/lambdaStreamableHttp.ts new file mode 100644 index 00000000..f6281ec8 --- /dev/null +++ b/mcp/apps/mcp/handlers/lambdaStreamableHttp.ts @@ -0,0 +1,68 @@ +import { + APIGatewayProxyEventV2, + APIGatewayProxyResultV2, + Context +} from "aws-lambda"; +import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js"; +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; + +function makeRequest(event: APIGatewayProxyEventV2): Request { + const headers = new Headers(); + if (event.headers) { + for (const [k, v] of Object.entries(event.headers)) { + if (v !== undefined) headers.set(k, v as string); + } + } + + const protocol = headers.get("x-forwarded-proto") ?? "https"; + const host = headers.get("host") ?? "localhost"; + + let url = `${protocol}://${host}${event.rawPath}`; + if (event?.rawQueryString !== "") { + url = `${url}?${event.rawQueryString}`; + } + + const request: RequestInit = { + method: event.requestContext.http.method, + headers, + body: null + }; + + if (request.method !== "GET" && request.method !== "HEAD") { + request.body = event.body + ? event.isBase64Encoded + ? Buffer.from(event.body, "base64") + : event.body + : undefined; + } + + return new Request(url, request); +} + +export const streamableHttpHandler = (server: McpServer) => { + return async ( + event: APIGatewayProxyEventV2, + _context: Context + ): Promise => { + const transport = new WebStandardStreamableHTTPServerTransport({ + sessionIdGenerator: undefined // stateless + }); + + try { + const req = makeRequest(event); + await server.connect(transport); + const res = await transport.handleRequest(req); + return { + statusCode: res.status, + headers: Object.fromEntries(res.headers.entries()), + body: await res.text() + }; + } catch (err) { + console.error(err); + throw err; + } finally { + transport.close(); + server.close(); + } + }; +}; diff --git a/mcp/apps/mcp/handlers/main.ts b/mcp/apps/mcp/handlers/main.ts new file mode 100644 index 00000000..9c3925bd --- /dev/null +++ b/mcp/apps/mcp/handlers/main.ts @@ -0,0 +1,93 @@ +/** + * Entry point for running the MCP server. + * Run with: npx @modelcontextprotocol/server-basic-react + * Or: node dist/index.js [--stdio] + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; +import { createServer } from "../server.js"; + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + */ +export async function startStreamableHTTPServer( + createServer: () => McpServer +): Promise { + const port = parseInt(process.env.PORT ?? "3001", 10); + + const app = createMcpExpressApp({ host: "0.0.0.0" }); + app.use(cors()); + + app.all("/mcp", async (req: Request, res: Response) => { + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined + }); + + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null + }); + } + } + }); + + const httpServer = app.listen(port, (err) => { + if (err) { + console.error("Failed to start server:", err); + process.exit(1); + } + console.log(`MCP server listening on http://localhost:${port}/mcp`); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} + +/** + * Starts an MCP server with stdio transport. + * + * @param createServer - Factory function that creates a new McpServer instance. + */ +export async function startStdioServer( + createServer: () => McpServer +): Promise { + await createServer().connect(new StdioServerTransport()); +} + +async function main() { + if (process.argv.includes("--stdio")) { + await startStdioServer(createServer); + } else { + await startStreamableHTTPServer(createServer); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/mcp/apps/mcp/package.json b/mcp/apps/mcp/package.json new file mode 100644 index 00000000..9abee131 --- /dev/null +++ b/mcp/apps/mcp/package.json @@ -0,0 +1,5 @@ +{ + "name": "mcp", + "version": "2.9.4", + "type": "module" +} diff --git a/mcp/apps/mcp/server.ts b/mcp/apps/mcp/server.ts new file mode 100644 index 00000000..8855af91 --- /dev/null +++ b/mcp/apps/mcp/server.ts @@ -0,0 +1,80 @@ +import { DC_RESOURCE_ORIGINS } from "./config.js"; +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import GetWorkTool from "./tools/get-work.js"; +import ListCollectionsTool from "./tools/list-collections.js"; +import SearchTool from "./tools/search-works.js"; +import SimilaritySearchTool from "./tools/similarity-search.js"; +import ViewCollectionTool from "./tools/view-collection.js"; +import ViewSearchResultsTool from "./tools/view-search-results.js"; +import ViewSimilarWorksTool from "./tools/view-similar-works.js"; +import ViewWorkTool from "./tools/view-work.js"; +import { CloverUIResource } from "@nulib/clover-mcp"; + +const CLOVER_RESOURCE_URI = "ui://clover-viewer/mcp-app.html"; + +export const createServer = () => { + const server = new McpServer({ + name: "dc-api-mcp", + description: "A MCP server for the Digital Collections API", + version: "2.9.4" + }); + + server.registerTool(SearchTool.name, SearchTool.config, SearchTool.handler); + + server.registerTool( + GetWorkTool.name, + GetWorkTool.config, + GetWorkTool.handler + ); + + server.registerTool( + ListCollectionsTool.name, + ListCollectionsTool.config, + ListCollectionsTool.handler + ); + + server.registerTool( + SimilaritySearchTool.name, + SimilaritySearchTool.config, + SimilaritySearchTool.handler + ); + + const uiResource = new CloverUIResource({ + resourceUri: CLOVER_RESOURCE_URI, + description: "UI resource for the View Work tool", + resourceDomains: DC_RESOURCE_ORIGINS, + connectDomains: DC_RESOURCE_ORIGINS + }); + + uiResource.registerTool( + server, + ViewWorkTool.name, + ViewWorkTool.config, + ViewWorkTool.handler + ); + + uiResource.registerTool( + server, + ViewCollectionTool.name, + ViewCollectionTool.config, + ViewCollectionTool.handler + ); + + uiResource.registerTool( + server, + ViewSearchResultsTool.name, + ViewSearchResultsTool.config, + ViewSearchResultsTool.handler + ); + + uiResource.registerTool( + server, + ViewSimilarWorksTool.name, + ViewSimilarWorksTool.config, + ViewSimilarWorksTool.handler + ); + + uiResource.registerResource(server); + + return server; +}; diff --git a/mcp/apps/mcp/tools/get-work.ts b/mcp/apps/mcp/tools/get-work.ts new file mode 100644 index 00000000..f8e912b6 --- /dev/null +++ b/mcp/apps/mcp/tools/get-work.ts @@ -0,0 +1,38 @@ +import * as z from "zod/v4"; +import { components } from "../api-schema.d.js"; +import { getWork } from "../dc-api.js"; + +export const name = "get-work"; +export const config = { + title: "Get Work", + description: + "Retrieve the full metadata for a work from the NUL Digital Collections.", + inputSchema: z.object({ + work_id: z.string().describe("The ID of the work to retrieve") + }), + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: false + } +}; + +export const handler = async ({ + work_id +}: z.infer) => { + const work = await getWork(work_id); + const structuredContent = work?.data as components["schemas"]["Work"]; + + return { + content: [ + { + type: "text" as const, + text: JSON.stringify(structuredContent) + } + ], + structuredContent + }; +}; + +export default { name, config, handler }; diff --git a/mcp/apps/mcp/tools/list-collections.ts b/mcp/apps/mcp/tools/list-collections.ts new file mode 100644 index 00000000..ad71340b --- /dev/null +++ b/mcp/apps/mcp/tools/list-collections.ts @@ -0,0 +1,49 @@ +import * as z from "zod/v4"; +import { search } from "../dc-api.js"; +import { handleToolError } from "../common/functions.js"; +import { collectionResultsSchema, searchLimiters } from "../common/schemas.js"; + +export const name = "list-collections"; + +export const config = { + title: "List Collections", + description: "List collection records from the NUL Digital Collections.", + inputSchema: searchLimiters, + outputSchema: collectionResultsSchema, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: false + } +}; + +export const handler = async (input: z.infer) => { + try { + const query = { + query: { match_all: {} }, + sort: [{ title: { order: "asc" } }] + }; + const options = { + models: ["collections"], + size: input.max_results, + page: input.page, + visibility: input.public_only ? "public" : "institution,public" + }; + const response: any = await search(query, options); + const structuredContent = collectionResultsSchema.parse(response); + return { + content: [ + { + type: "text" as const, + text: JSON.stringify(structuredContent) + } + ], + structuredContent + }; + } catch (error) { + handleToolError(error); + } +}; + +export default { name, config, handler }; diff --git a/mcp/apps/mcp/tools/search-works.ts b/mcp/apps/mcp/tools/search-works.ts new file mode 100644 index 00000000..1c89d00e --- /dev/null +++ b/mcp/apps/mcp/tools/search-works.ts @@ -0,0 +1,42 @@ +import * as z from "zod/v4"; +import { search } from "../dc-api.js"; +import { handleToolError } from "../common/functions.js"; +import { buildQuery } from "../common/works.js"; +import { workResultsSchema, workSearchSchema } from "../common/schemas.js"; + +export const name = "search"; + +export const config = { + title: "Search", + description: + "Search for works in the Digital Collections using field-based and/or natural language queries. The result will also include a list of aggregations that show how many results match different values for certain fields. For example, you could see how many results match each collection, work type, or visibility and use that information to refine your search. Perform an empty search to retrieve all works and their aggregations.", + inputSchema: workSearchSchema, + outputSchema: workResultsSchema, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: false + } +}; + +export const handler = async (input: z.infer) => { + try { + const { query, options } = buildQuery(workSearchSchema.parse(input)); + const response: any = await search(query, options); + const structuredContent = workResultsSchema.parse(response); + return { + content: [ + { + type: "text" as const, + text: JSON.stringify(structuredContent) + } + ], + structuredContent + }; + } catch (error) { + handleToolError(error); + } +}; + +export default { name, config, handler }; diff --git a/mcp/apps/mcp/tools/similarity-search.ts b/mcp/apps/mcp/tools/similarity-search.ts new file mode 100644 index 00000000..991ce573 --- /dev/null +++ b/mcp/apps/mcp/tools/similarity-search.ts @@ -0,0 +1,44 @@ +import * as z from "zod/v4"; +import { search } from "../dc-api.js"; +import { + workResultsSchema, + similaritySearchSchema +} from "../common/schemas.js"; +import { handleToolError } from "../common/functions.js"; +import { buildSimilaritySearchQuery } from "../common/works.js"; + +export const name = "similarity-search"; + +export const config = { + title: "Search for Similar Works", + description: "Find works similar to a given work.", + inputSchema: similaritySearchSchema, + outputSchema: workResultsSchema, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: false + } +}; + +export const handler = async (input: z.infer) => { + try { + const { query, options } = buildSimilaritySearchQuery(input); + const response: any = await search(query, options); + const structuredContent = workResultsSchema.parse(response); + return { + content: [ + { + type: "text" as const, + text: JSON.stringify(structuredContent) + } + ], + structuredContent + }; + } catch (error) { + handleToolError(error); + } +}; + +export default { name, config, handler }; diff --git a/mcp/apps/mcp/tools/view-collection.ts b/mcp/apps/mcp/tools/view-collection.ts new file mode 100644 index 00000000..5360bcf7 --- /dev/null +++ b/mcp/apps/mcp/tools/view-collection.ts @@ -0,0 +1,39 @@ +import * as z from "zod/v4"; +import { components } from "../api-schema.d.js"; +import { getCollection } from "../dc-api.js"; + +export const name = "view-collection"; +export const config = { + title: "View Collection", + description: + "View a collection from the NUL Digital Collections in an interactive viewer.", + inputSchema: z.object({ + collection_id: z.string().describe("The ID of the collection to view") + }), + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: false + } +}; + +export const handler = async ({ collection_id }: { collection_id: string }) => { + const collection = await getCollection(collection_id); + const { id, title, iiif_collection } = + collection?.data as components["schemas"]["Collection"]; + + return { + content: [ + { + type: "text" as const, + text: `${id} - "${title}"` + } + ], + structuredContent: { + iiifContentUrl: iiif_collection + } + }; +}; + +export default { name, config, handler }; diff --git a/mcp/apps/mcp/tools/view-search-results.ts b/mcp/apps/mcp/tools/view-search-results.ts new file mode 100644 index 00000000..c5c1be0b --- /dev/null +++ b/mcp/apps/mcp/tools/view-search-results.ts @@ -0,0 +1,41 @@ +import * as z from "zod/v4"; +import { buildIIIFSearchUrl, handleToolError } from "../common/functions.js"; +import { buildQuery } from "../common/works.js"; +import { workSearchSchema } from "../common/schemas.js"; + +export const name = "view-search-results"; +export const config = { + title: "View Search Results", + description: + "View results from the search-works tool in an interactive viewer.", + inputSchema: workSearchSchema, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: false + } +}; + +export const handler = async (input: z.infer) => { + try { + const { query, options } = buildQuery(workSearchSchema.parse(input)); + const iiifUrl = buildIIIFSearchUrl(query, options); + + return { + content: [ + { + type: "text" as const, + text: `NUL DC API Search Results` + } + ], + structuredContent: { + iiifContentUrl: iiifUrl.toString() + } + }; + } catch (error) { + handleToolError(error); + } +}; + +export default { name, config, handler }; diff --git a/mcp/apps/mcp/tools/view-similar-works.ts b/mcp/apps/mcp/tools/view-similar-works.ts new file mode 100644 index 00000000..b3c57468 --- /dev/null +++ b/mcp/apps/mcp/tools/view-similar-works.ts @@ -0,0 +1,43 @@ +import * as z from "zod/v4"; +import { buildIIIFSearchUrl, handleToolError } from "../common/functions.js"; +import { buildSimilaritySearchQuery } from "../common/works.js"; +import { similaritySearchSchema } from "../common/schemas.js"; + +export const name = "view-similar-works"; +export const config = { + title: "View Similar Works", + description: + "View results from the similarity-search tool in an interactive viewer.", + inputSchema: similaritySearchSchema, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: false + } +}; + +export const handler = async (input: z.infer) => { + try { + const { query, options } = buildSimilaritySearchQuery( + similaritySearchSchema.parse(input) + ); + const iiifUrl = buildIIIFSearchUrl(query, options); + + return { + content: [ + { + type: "text" as const, + text: `Works similar to ${input.work_id}` + } + ], + structuredContent: { + iiifContentUrl: iiifUrl.toString() + } + }; + } catch (error) { + handleToolError(error); + } +}; + +export default { name, config, handler }; diff --git a/mcp/apps/mcp/tools/view-work.ts b/mcp/apps/mcp/tools/view-work.ts new file mode 100644 index 00000000..f090ae5d --- /dev/null +++ b/mcp/apps/mcp/tools/view-work.ts @@ -0,0 +1,41 @@ +import * as z from "zod/v4"; +import { components } from "../api-schema.d.js"; +import { getWork } from "../dc-api.js"; + +export const name = "view-work"; +export const config = { + title: "View Work", + description: + "View a work from the NUL Digital Collections in an interactive viewer.", + inputSchema: z.object({ + work_id: z.string().describe("The ID of the work to view") + }), + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: false + } +}; + +export const handler = async ({ + work_id +}: z.infer) => { + const work = await getWork(work_id); + const { id, title, iiif_manifest } = + work?.data as components["schemas"]["Work"]; + + return { + content: [ + { + type: "text" as const, + text: `${id} - "${title}"` + } + ], + structuredContent: { + iiifContentUrl: iiif_manifest + } + }; +}; + +export default { name, config, handler }; diff --git a/mcp/apps/mcp/tsconfig.json b/mcp/apps/mcp/tsconfig.json new file mode 100644 index 00000000..b148f1f0 --- /dev/null +++ b/mcp/apps/mcp/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "esModuleInterop": true, + "strict": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "outDir": "../../dist/apps/mcp" + } +} diff --git a/mcp/apps/mcp/vite.config.ts b/mcp/apps/mcp/vite.config.ts new file mode 100644 index 00000000..d615f6db --- /dev/null +++ b/mcp/apps/mcp/vite.config.ts @@ -0,0 +1,30 @@ +import { defineConfig } from "vite"; +import path from "node:path"; + +export default defineConfig({ + root: path.resolve(__dirname), + define: { + "process.env": "process.env" // pass through as-is + }, + build: { + target: "es2022", + outDir: path.resolve(__dirname, "../../dist/apps/mcp"), + emptyOutDir: false, + sourcemap: true, + rollupOptions: { + external: [/^@aws-sdk\/.+/, /^node:.+/], + input: path.resolve(__dirname, "handlers/lambda.ts"), + preserveEntrySignatures: "exports-only", + output: { + format: "esm", // or "cjs" if you need require() + inlineDynamicImports: true, + manualChunks: undefined, + entryFileNames: "[name].js", + chunkFileNames: "[name].js", + assetFileNames: "[name].[ext]" + } + }, + assetsInlineLimit: 100000000, + cssCodeSplit: false + } +}); diff --git a/mcp/bin/run.sh b/mcp/bin/run.sh new file mode 100755 index 00000000..98f11b4e --- /dev/null +++ b/mcp/bin/run.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +cd "$(dirname "$0")/.." +ASDF_DATA_DIR="${ASDF_DATA_DIR:-$HOME/.asdf}" +if [ -e $HOME/.local/bin/mise ]; then + echo "Activating mise environment for bash" >&2 + eval "$($HOME/.local/bin/mise activate bash)" +elif [ -e ${ASDF_DATA_DIR}/shims ]; then + echo "Activating asdf environment for bash" >&2 + export PATH="${ASDF_DATA_DIR}/shims:$PATH" +fi +echo $PATH >&2 +exec npm run --silent stdio "$@" \ No newline at end of file diff --git a/mcp/package-lock.json b/mcp/package-lock.json new file mode 100644 index 00000000..167189fb --- /dev/null +++ b/mcp/package-lock.json @@ -0,0 +1,8213 @@ +{ + "name": "dc-api-mcp", + "version": "2.9.4", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dc-api-mcp", + "version": "2.9.4", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-secrets-manager": "^3.563.0", + "@modelcontextprotocol/ext-apps": "^1.2.0", + "@modelcontextprotocol/sdk": "^1.27.1", + "@nulib/dcapi-types": "^2.9.1", + "aws-lambda": "^1.0.7", + "cors": "^2.8.6", + "express": "^5.2.1", + "lz-string": "^1.5.0", + "openapi-fetch": "^0.17.0", + "zod": "^4.3.6" + }, + "devDependencies": { + "@msw/source": "^0.6.1", + "@nulib/clover-mcp": "^0.1.0", + "@types/aws-lambda": "^8.10.161", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.6", + "@types/node": "^25.3.5", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "@typescript-eslint/eslint-plugin": "^8.56.1", + "@typescript-eslint/parser": "^8.56.1", + "@vitejs/plugin-react": "^4.0.0", + "@vitest/coverage-v8": "^3.0.0", + "concurrently": "^9.2.1", + "cross-env": "^10.1.0", + "eslint": "^10.0.2", + "msw": "^2.12.13", + "openapi-typescript": "^7.13.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "tsx": "^4.21.0", + "typescript": "^5.9.3", + "undici": "^7.24.4", + "vite": "^7.3.1", + "vite-plugin-singlefile": "^2.3.0", + "vitest": "^3.0.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-secrets-manager": { + "version": "3.1009.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.1009.0.tgz", + "integrity": "sha512-8CaFVjwOotZAsWKEXXPe23wwb1hqJWmy1os8WYCcN90h5VGdje47HeLgh66VDUJDTV2iWx1QeTBtwihioUB90w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/credential-provider-node": "^3.972.21", + "@aws-sdk/middleware-host-header": "^3.972.8", + "@aws-sdk/middleware-logger": "^3.972.8", + "@aws-sdk/middleware-recursion-detection": "^3.972.8", + "@aws-sdk/middleware-user-agent": "^3.972.21", + "@aws-sdk/region-config-resolver": "^3.972.8", + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-endpoints": "^3.996.5", + "@aws-sdk/util-user-agent-browser": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.973.7", + "@smithy/config-resolver": "^4.4.11", + "@smithy/core": "^3.23.11", + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/hash-node": "^4.2.12", + "@smithy/invalid-dependency": "^4.2.12", + "@smithy/middleware-content-length": "^4.2.12", + "@smithy/middleware-endpoint": "^4.4.25", + "@smithy/middleware-retry": "^4.4.42", + "@smithy/middleware-serde": "^4.2.14", + "@smithy/middleware-stack": "^4.2.12", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/node-http-handler": "^4.4.16", + "@smithy/protocol-http": "^5.3.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-body-length-node": "^4.2.3", + "@smithy/util-defaults-mode-browser": "^4.3.41", + "@smithy/util-defaults-mode-node": "^4.2.44", + "@smithy/util-endpoints": "^3.3.3", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-retry": "^4.2.12", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.973.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.20.tgz", + "integrity": "sha512-i3GuX+lowD892F3IuJf8o6AbyDupMTdyTxQrCJGcn71ni5hTZ82L4nQhcdumxZ7XPJRJJVHS/CR3uYOIIs0PVA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/xml-builder": "^3.972.11", + "@smithy/core": "^3.23.11", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/signature-v4": "^5.3.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.18", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.18.tgz", + "integrity": "sha512-X0B8AlQY507i5DwjLByeU2Af4ARsl9Vr84koDcXCbAkplmU+1xBFWxEPrWRAoh56waBne/yJqEloSwvRf4x6XA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.20.tgz", + "integrity": "sha512-ey9Lelj001+oOfrbKmS6R2CJAiXX7QKY4Vj9VJv6L2eE6/VjD8DocHIoYqztTm70xDLR4E1jYPTKfIui+eRNDA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/types": "^3.973.6", + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/node-http-handler": "^4.4.16", + "@smithy/property-provider": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/util-stream": "^4.5.19", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.20.tgz", + "integrity": "sha512-5flXSnKHMloObNF+9N0cupKegnH1Z37cdVlpETVgx8/rAhCe+VNlkcZH3HDg2SDn9bI765S+rhNPXGDJJPfbtA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/credential-provider-env": "^3.972.18", + "@aws-sdk/credential-provider-http": "^3.972.20", + "@aws-sdk/credential-provider-login": "^3.972.20", + "@aws-sdk/credential-provider-process": "^3.972.18", + "@aws-sdk/credential-provider-sso": "^3.972.20", + "@aws-sdk/credential-provider-web-identity": "^3.972.20", + "@aws-sdk/nested-clients": "^3.996.10", + "@aws-sdk/types": "^3.973.6", + "@smithy/credential-provider-imds": "^4.2.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.20.tgz", + "integrity": "sha512-gEWo54nfqp2jABMu6HNsjVC4hDLpg9HC8IKSJnp0kqWtxIJYHTmiLSsIfI4ScQjxEwpB+jOOH8dOLax1+hy/Hw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/nested-clients": "^3.996.10", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.972.21", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.21.tgz", + "integrity": "sha512-hah8if3/B/Q+LBYN5FukyQ1Mym6PLPDsBOBsIgNEYD6wLyZg0UmUF/OKIVC3nX9XH8TfTPuITK+7N/jenVACWA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.18", + "@aws-sdk/credential-provider-http": "^3.972.20", + "@aws-sdk/credential-provider-ini": "^3.972.20", + "@aws-sdk/credential-provider-process": "^3.972.18", + "@aws-sdk/credential-provider-sso": "^3.972.20", + "@aws-sdk/credential-provider-web-identity": "^3.972.20", + "@aws-sdk/types": "^3.973.6", + "@smithy/credential-provider-imds": "^4.2.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.972.18", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.18.tgz", + "integrity": "sha512-Tpl7SRaPoOLT32jbTWchPsn52hYYgJ0kpiFgnwk8pxTANQdUymVSZkzFvv1+oOgZm1CrbQUP9MBeoMZ9IzLZjA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.20.tgz", + "integrity": "sha512-p+R+PYR5Z7Gjqf/6pvbCnzEHcqPCpLzR7Yf127HjJ6EAb4hUcD+qsNRnuww1sB/RmSeCLxyay8FMyqREw4p1RA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/nested-clients": "^3.996.10", + "@aws-sdk/token-providers": "3.1009.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.20.tgz", + "integrity": "sha512-rWCmh8o7QY4CsUj63qopzMzkDq/yPpkrpb+CnjBEFSOg/02T/we7sSTVg4QsDiVS9uwZ8VyONhq98qt+pIh3KA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/nested-clients": "^3.996.10", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", + "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz", + "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.8.tgz", + "integrity": "sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.972.21", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.21.tgz", + "integrity": "sha512-62XRl1GDYPpkt7cx1AX1SPy9wgNE9Iw/NPuurJu4lmhCWS7sGKO+kS53TQ8eRmIxy3skmvNInnk0ZbWrU5Dpyg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-endpoints": "^3.996.5", + "@smithy/core": "^3.23.11", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-retry": "^4.2.12", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.996.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.10.tgz", + "integrity": "sha512-SlDol5Z+C7Ivnc2rKGqiqfSUmUZzY1qHfVs9myt/nxVwswgfpjdKahyTzLTx802Zfq0NFRs7AejwKzzzl5Co2w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/middleware-host-header": "^3.972.8", + "@aws-sdk/middleware-logger": "^3.972.8", + "@aws-sdk/middleware-recursion-detection": "^3.972.8", + "@aws-sdk/middleware-user-agent": "^3.972.21", + "@aws-sdk/region-config-resolver": "^3.972.8", + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-endpoints": "^3.996.5", + "@aws-sdk/util-user-agent-browser": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.973.7", + "@smithy/config-resolver": "^4.4.11", + "@smithy/core": "^3.23.11", + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/hash-node": "^4.2.12", + "@smithy/invalid-dependency": "^4.2.12", + "@smithy/middleware-content-length": "^4.2.12", + "@smithy/middleware-endpoint": "^4.4.25", + "@smithy/middleware-retry": "^4.4.42", + "@smithy/middleware-serde": "^4.2.14", + "@smithy/middleware-stack": "^4.2.12", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/node-http-handler": "^4.4.16", + "@smithy/protocol-http": "^5.3.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-body-length-node": "^4.2.3", + "@smithy/util-defaults-mode-browser": "^4.3.41", + "@smithy/util-defaults-mode-node": "^4.2.44", + "@smithy/util-endpoints": "^3.3.3", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-retry": "^4.2.12", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz", + "integrity": "sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@smithy/config-resolver": "^4.4.11", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.1009.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1009.0.tgz", + "integrity": "sha512-KCPLuTqN9u0Rr38Arln78fRG9KXpzsPWmof+PZzfAHMMQq2QED6YjQrkrfiH7PDefLWEposY1o4/eGwrmKA4JA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.20", + "@aws-sdk/nested-clients": "^3.996.10", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.996.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.5.tgz", + "integrity": "sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-endpoints": "^3.3.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.965.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz", + "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz", + "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.973.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.7.tgz", + "integrity": "sha512-Hz6EZMUAEzqUd7e+vZ9LE7mn+5gMbxltXy18v+YSFY+9LBJz15wkNZvw5JqfX3z0FS9n3bgUtz3L5rAsfh4YlA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "^3.972.21", + "@aws-sdk/types": "^3.973.6", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-config-provider": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.11.tgz", + "integrity": "sha512-iitV/gZKQMvY9d7ovmyFnFuTHbBAtrmLnvaSb/3X8vOKyevwtpmEtyc8AdhVWZe0pI/1GsHxlEvQeOePFzy7KQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "fast-xml-parser": "5.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", + "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@epic-web/invariant": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.3", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz", + "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.3", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.3.tgz", + "integrity": "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.1.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", + "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz", + "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", + "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.1.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@faker-js/faker": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", + "integrity": "sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } + ], + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0", + "npm": ">=6.14.13" + } + }, + "node_modules/@hono/node-server": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.11.tgz", + "integrity": "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@modelcontextprotocol/ext-apps": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/ext-apps/-/ext-apps-1.2.2.tgz", + "integrity": "sha512-qMnhIKb8tyPesl+kZU76Xz9Bi9putCO+LcgvBJ00fDdIniiLZsnQbAeTKoq+sTiYH1rba2Fvj8NPAFxij+gyxw==", + "license": "MIT", + "workspaces": [ + "examples/*" + ], + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@modelcontextprotocol/sdk": "^1.24.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0", + "zod": "^3.25.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.27.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.27.1.tgz", + "integrity": "sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "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.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@msw/source": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@msw/source/-/source-0.6.1.tgz", + "integrity": "sha512-eKX3x85/Ejo2HoOgfilfB4cMqdzie58F+7vMvuKH2N0m4Hs3GhfqjLSLlWXkNx09O7NIUSilygmrlEeWOPDNUA==", + "dev": true, + "dependencies": { + "@mswjs/interceptors": "^0.40.0", + "@stoplight/json": "^3.21.7", + "@types/har-format": "^1.2.16", + "@yellow-ticket/seed-json-schema": "^0.1.7", + "openapi-types": "^12.1.3", + "outvariant": "^1.4.3", + "yaml": "^2.8.2" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "msw": "^2.10.0" + } + }, + "node_modules/@msw/source/node_modules/@mswjs/interceptors": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.40.0.tgz", + "integrity": "sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mswjs/interceptors": { + "version": "0.41.3", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.3.tgz", + "integrity": "sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@nulib/clover-mcp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nulib/clover-mcp/-/clover-mcp-0.1.0.tgz", + "integrity": "sha512-6rjBZ/GLZvzR+ZmiR9adiFwHIaP7g4XbZJwgOPbQFYdtF3gnBct8TODu4MfwZXMu7YlOk/CH7pSV4MORZRSMAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@modelcontextprotocol/ext-apps": "^1.2.0", + "@modelcontextprotocol/sdk": "^1.27.1" + } + }, + "node_modules/@nulib/dcapi-types": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@nulib/dcapi-types/-/dcapi-types-2.9.1.tgz", + "integrity": "sha512-XBM+a24rdi1D2jVZS/8c99dilfS4am620zq2CWDMYoqftPvCf/+tsw47gTF/XjgRz44ZGihSz6rC73HB0SYFug==", + "license": "Apache-2.0" + }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redocly/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js-replace": "^1.0.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@redocly/config": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.0.tgz", + "integrity": "sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@redocly/openapi-core": { + "version": "1.34.10", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.10.tgz", + "integrity": "sha512-XCBR/9WHJ0cpezuunHMZjuFMl4KqUo7eiFwzrQrvm7lTXt0EBd3No8UY+9OyzXpDfreGEMMtxmaLZ+ksVw378g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@redocly/ajv": "8.11.2", + "@redocly/config": "0.22.0", + "colorette": "1.4.0", + "https-proxy-agent": "7.0.6", + "js-levenshtein": "1.1.6", + "js-yaml": "4.1.1", + "minimatch": "5.1.9", + "pluralize": "8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=18.17.0", + "npm": ">=9.5.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/@redocly/openapi-core/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@redocly/openapi-core/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@redocly/openapi-core/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@smithy/abort-controller": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.12.tgz", + "integrity": "sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.11.tgz", + "integrity": "sha512-YxFiiG4YDAtX7WMN7RuhHZLeTmRRAOyCbr+zB8e3AQzHPnUhS8zXjB1+cniPVQI3xbWsQPM0X2aaIkO/ME0ymw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-config-provider": "^4.2.2", + "@smithy/util-endpoints": "^3.3.3", + "@smithy/util-middleware": "^4.2.12", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "3.23.11", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.11.tgz", + "integrity": "sha512-952rGf7hBRnhUIaeLp6q4MptKW8sPFe5VvkoZ5qIzFAtx6c/QZ/54FS3yootsyUSf9gJX/NBqEBNdNR7jMIlpQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-stream": "^4.5.19", + "@smithy/util-utf8": "^4.2.2", + "@smithy/uuid": "^1.1.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.12.tgz", + "integrity": "sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.3.15", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.15.tgz", + "integrity": "sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.12", + "@smithy/querystring-builder": "^4.2.12", + "@smithy/types": "^4.13.1", + "@smithy/util-base64": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.12.tgz", + "integrity": "sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.12.tgz", + "integrity": "sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz", + "integrity": "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.12.tgz", + "integrity": "sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "4.4.25", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.25.tgz", + "integrity": "sha512-dqjLwZs2eBxIUG6Qtw8/YZ4DvzHGIf0DA18wrgtfP6a50UIO7e2nY0FPdcbv5tVJKqWCCU5BmGMOUwT7Puan+A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.23.11", + "@smithy/middleware-serde": "^4.2.14", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-middleware": "^4.2.12", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "4.4.42", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.42.tgz", + "integrity": "sha512-vbwyqHRIpIZutNXZpLAozakzamcINaRCpEy1MYmK6xBeW3xN+TyPRA123GjXnuxZIjc9848MRRCugVMTXxC4Eg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/service-error-classification": "^4.2.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-retry": "^4.2.12", + "@smithy/uuid": "^1.1.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.14.tgz", + "integrity": "sha512-+CcaLoLa5apzSRtloOyG7lQvkUw2ZDml3hRh4QiG9WyEPfW5Ke/3tPOPiPjUneuT59Tpn8+c3RVaUvvkkwqZwg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.23.11", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.12.tgz", + "integrity": "sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.12.tgz", + "integrity": "sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.4.16", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.16.tgz", + "integrity": "sha512-ULC8UCS/HivdCB3jhi+kLFYe4B5gxH2gi9vHBfEIiRrT2jfKiZNiETJSlzRtE6B26XbBHjPtc8iZKSNqMol9bw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/querystring-builder": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.12.tgz", + "integrity": "sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "5.3.12", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.12.tgz", + "integrity": "sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.12.tgz", + "integrity": "sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "@smithy/util-uri-escape": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.12.tgz", + "integrity": "sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.12.tgz", + "integrity": "sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.7.tgz", + "integrity": "sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.3.12", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.12.tgz", + "integrity": "sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.2", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-hex-encoding": "^4.2.2", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-uri-escape": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.5.tgz", + "integrity": "sha512-UqwYawyqSr/aog8mnLnfbPurS0gi4G7IYDcD28cUIBhsvWs1+rQcL2IwkUQ+QZ7dibaoRzhNF99fAQ9AUcO00w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.23.11", + "@smithy/middleware-endpoint": "^4.4.25", + "@smithy/middleware-stack": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-stream": "^4.5.19", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.13.1.tgz", + "integrity": "sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.12.tgz", + "integrity": "sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.2.tgz", + "integrity": "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz", + "integrity": "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz", + "integrity": "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz", + "integrity": "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz", + "integrity": "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.41", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.41.tgz", + "integrity": "sha512-M1w1Ux0rSVvBOxIIiqbxvZvhnjQ+VUjJrugtORE90BbadSTH+jsQL279KRL3Hv0w69rE7EuYkV/4Lepz/NBW9g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.44", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.44.tgz", + "integrity": "sha512-YPze3/lD1KmWuZsl9JlfhcgGLX7AXhSoaCDtiPntUjNW5/YY0lOHjkcgxyE9x/h5vvS1fzDifMGjzqnNlNiqOQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.11", + "@smithy/credential-provider-imds": "^4.2.12", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.3.3.tgz", + "integrity": "sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz", + "integrity": "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.12.tgz", + "integrity": "sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.12.tgz", + "integrity": "sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "4.5.19", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.19.tgz", + "integrity": "sha512-v4sa+3xTweL1CLO2UP0p7tvIMH/Rq1X4KKOxd568mpe6LSLMQCnDHs4uv7m3ukpl3HvcN2JH6jiCS0SNRXKP/w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/node-http-handler": "^4.4.16", + "@smithy/types": "^4.13.1", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-hex-encoding": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz", + "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", + "integrity": "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/uuid": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz", + "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@stoplight/json": { + "version": "3.21.7", + "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.21.7.tgz", + "integrity": "sha512-xcJXgKFqv/uCEgtGlPxy3tPA+4I+ZI4vAuMJ885+ThkTHFVkC+0Fm58lA9NlsyjnkpxFh4YiQWpH+KefHdbA0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/ordered-object-literal": "^1.0.3", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^13.6.0", + "jsonc-parser": "~2.2.1", + "lodash": "^4.17.21", + "safe-stable-stringify": "^1.1" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/@stoplight/ordered-object-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.5.tgz", + "integrity": "sha512-COTiuCU5bgMUtbIFBuyyh2/yVVzlr5Om0v5utQDgBCuQUOPgU1DwoffkTfg4UBQOvByi5foF4w4T+H9CoRe5wg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/@stoplight/path": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@stoplight/path/-/path-1.3.2.tgz", + "integrity": "sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/@stoplight/types": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.20.0.tgz", + "integrity": "sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + } + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.161", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.161.tgz", + "integrity": "sha512-rUYdp+MQwSFocxIOcSsYSF3YYYC/uUpMbCY/mbO21vGqfrEYvNSoPyKYDj6RhXXpPfS0KstW9RwG3qXh9sL7FQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "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, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/har-format": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.16.tgz", + "integrity": "sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.0.tgz", + "integrity": "sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/type-utils": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.57.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.0.tgz", + "integrity": "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.0.tgz", + "integrity": "sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.57.0", + "@typescript-eslint/types": "^8.57.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.0.tgz", + "integrity": "sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.0.tgz", + "integrity": "sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.0.tgz", + "integrity": "sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.0.tgz", + "integrity": "sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.0.tgz", + "integrity": "sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.57.0", + "@typescript-eslint/tsconfig-utils": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.0.tgz", + "integrity": "sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.0.tgz", + "integrity": "sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@vitest/coverage-v8": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", + "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^1.0.2", + "ast-v8-to-istanbul": "^0.3.3", + "debug": "^4.4.1", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.17", + "magicast": "^0.3.5", + "std-env": "^3.9.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "3.2.4", + "vitest": "3.2.4" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@yellow-ticket/seed-json-schema": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@yellow-ticket/seed-json-schema/-/seed-json-schema-0.1.7.tgz", + "integrity": "sha512-OQkwqMt6VMMExa74b6ODrDwMyvTAQ4wXXodb0kJuQhI1DkhFm4PIUwj9D1foE5gZwfyGlogtTZsjhyQzhwkyyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@faker-js/faker": "^8.4.1", + "@types/json-schema": "^7.0.15", + "outvariant": "^1.4.2", + "randexp": "^0.5.3" + } + }, + "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/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-v8-to-istanbul": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.12.tgz", + "integrity": "sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^10.0.0" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-lambda": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/aws-lambda/-/aws-lambda-1.0.7.tgz", + "integrity": "sha512-9GNFMRrEMG5y3Jvv+V4azWvc+qNWdWLTjDdhf/zgMlz8haaaLWv0xeAIWxz9PuWUBawsVxy0zZotjCdR3Xq+2w==", + "license": "MIT", + "dependencies": { + "aws-sdk": "^2.814.0", + "commander": "^3.0.2", + "js-yaml": "^3.14.1", + "watchpack": "^2.0.0-beta.10" + }, + "bin": { + "lambda": "bin/lambda" + } + }, + "node_modules/aws-sdk": { + "version": "2.1693.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1693.0.tgz", + "integrity": "sha512-cJmb8xEnVLT+R6fBS5sn/EFJiX7tUnDaPtOPZ1vFbOJtd0fnZn/Ky2XGgsvvoeliWeH7mL3TWSX5zXXGSQV6gQ==", + "deprecated": "The AWS SDK for JavaScript (v2) has reached end-of-support, and no longer receives updates. Please migrate your code to use AWS SDK for JavaScript (v3). More info https://a.co/cUPnyil", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "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/baseline-browser-mapping": { + "version": "2.10.7", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.7.tgz", + "integrity": "sha512-1ghYO3HnxGec0TCGBXiDLVns4eCSx4zJpxnHrlqFQajmhfKMQBzUGDdkMK7fUW7PTHTeLf+j87aTuKuuwWzMGw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/bowser": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", + "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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/caniuse-lite": { + "version": "1.0.30001778", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001778.tgz", + "integrity": "sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "license": "MIT" + }, + "node_modules/concurrently": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "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/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-env": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", + "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" + }, + "bin": { + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/drange": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", + "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.313", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz", + "integrity": "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "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==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.0.3.tgz", + "integrity": "sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.3", + "@eslint/config-helpers": "^0.5.2", + "@eslint/core": "^1.1.1", + "@eslint/plugin-kit": "^0.6.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.1.1", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "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/eslint/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "license": "MIT", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "peer": true, + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.1.tgz", + "integrity": "sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw==", + "license": "MIT", + "dependencies": { + "ip-address": "10.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-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==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-xml-builder": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.3.tgz", + "integrity": "sha512-1o60KoFw2+LWKQu3IdcfcFlGTW4dpqEWmjhYec6H82AYZU2TVBXep6tMl8Z1Y+wM+ZrzCwe3BZ9Vyd9N2rIvmg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.1.3" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz", + "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "fast-xml-builder": "^1.0.0", + "strnum": "^2.1.2" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "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": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.1.tgz", + "integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "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==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", + "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphql": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.1.tgz", + "integrity": "sha512-gGgrVCoDKlIZ8fIqXBBb0pPKqDgki0Z/FSKNiQzSGj2uEYHr1tq5wmBegGwJx6QB5S5cM0khSBpi/JFHMCvsmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "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==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/hono": { + "version": "4.12.7", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.7.tgz", + "integrity": "sha512-jq9l1DM0zVIvsm3lv9Nw9nlJnMNPOcAtsbsgiUhWcFzPE99Gvo6yRTlszSLLYacMeQ6quHD6hMfId8crVHvexw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/index-to-position": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", + "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/jose": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.1.tgz", + "integrity": "sha512-jUaKr1yrbfaImV7R2TN/b3IcZzsw38/chqMpo2XJ7i2F8AfM/lA4G1goC3JVEwg0H7UldTmSt3P68nt31W7/mw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", + "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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/msw": { + "version": "2.12.13", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.12.13.tgz", + "integrity": "sha512-9CV2mXT9+z0J26MQDfEZZkj/psJ5Er/w0w+t95FWdaGH/DTlhNZBx8vBO5jSYv8AZEnl3ouX+AaTT68KXdAIag==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.41.2", + "@open-draft/deferred-promise": "^2.2.0", + "@types/statuses": "^2.0.6", + "cookie": "^1.0.2", + "graphql": "^16.12.0", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "rettime": "^0.10.1", + "statuses": "^2.0.2", + "strict-event-emitter": "^0.5.1", + "tough-cookie": "^6.0.0", + "type-fest": "^5.2.0", + "until-async": "^3.0.2", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/msw/node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/msw/node_modules/type-fest": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.4.tgz", + "integrity": "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "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/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/openapi-fetch": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.17.0.tgz", + "integrity": "sha512-PsbZR1wAPcG91eEthKhN+Zn92FMHxv+/faECIwjXdxfTODGSGegYv0sc1Olz+HYPvKOuoXfp+0pA2XVt2cI0Ig==", + "license": "MIT", + "dependencies": { + "openapi-typescript-helpers": "^0.1.0" + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/openapi-typescript": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.13.0.tgz", + "integrity": "sha512-EFP392gcqXS7ntPvbhBzbF8TyBA+baIYEm791Hy5YkjDYKTnk/Tn5OQeKm5BIZvJihpp8Zzr4hzx0Irde1LNGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@redocly/openapi-core": "^1.34.6", + "ansi-colors": "^4.1.3", + "change-case": "^5.4.4", + "parse-json": "^8.3.0", + "supports-color": "^10.2.2", + "yargs-parser": "^21.1.1" + }, + "bin": { + "openapi-typescript": "bin/cli.js" + }, + "peerDependencies": { + "typescript": "^5.x" + } + }, + "node_modules/openapi-typescript-helpers": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.1.0.tgz", + "integrity": "sha512-OKTGPthhivLw/fHz6c3OPtg72vi86qaMlqbJuVJ23qOvQ+53uw1n7HdmkJFibloF7QEjDrDkzJiOJuockM/ljw==", + "license": "MIT" + }, + "node_modules/openapi-typescript/node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true, + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-expression-matcher": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", + "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/randexp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", + "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "drange": "^1.0.2", + "ret": "^0.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "devOptional": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rettime": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.10.1.tgz", + "integrity": "sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw==", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "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/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", + "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", + "license": "ISC" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/strnum": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", + "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/test-exclude": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.2.tgz", + "integrity": "sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^10.2.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.0.26", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.26.tgz", + "integrity": "sha512-WiGwQjr0qYdNNG8KpMKlSvpxz652lqa3Rd+/hSaDcY4Uo6SKWZq2LAF+hsAhUewTtYhXlorBKgNF3Kk8hnjGoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.26" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.26", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.26.tgz", + "integrity": "sha512-5WJ2SqFsv4G2Dwi7ZFVRnz6b2H1od39QME1lc2y5Ew3eWiZMAeqOAfWpRP9jHvhUl881406QtZTODvjttJs+ew==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.4.tgz", + "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/until-async": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", + "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/kettanaito" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js-replace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", + "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "license": "MIT", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-plugin-singlefile": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vite-plugin-singlefile/-/vite-plugin-singlefile-2.3.0.tgz", + "integrity": "sha512-DAcHzYypM0CasNLSz/WG0VdKOCxGHErfrjOoyIPiNxTPTGmO6rRD/te93n1YL/s+miXq66ipF1brMBikf99c6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">18.0.0" + }, + "peerDependencies": { + "rollup": "^4.44.1", + "vite": "^5.4.11 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "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==", + "license": "ISC" + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + } + } +} diff --git a/mcp/package.json b/mcp/package.json new file mode 100644 index 00000000..704599e0 --- /dev/null +++ b/mcp/package.json @@ -0,0 +1,56 @@ +{ + "name": "dc-api-mcp", + "version": "2.9.4", + "private": true, + "scripts": { + "http": "tsx watch apps/mcp/handlers/main.ts", + "stdio": "tsx apps/mcp/handlers/main.ts --stdio", + "build": "vite build --config apps/mcp/vite.config.ts", + "test": "MSW_MODE=${MSW_MODE:-replay} vitest run", + "test:clear": "rm -rf test/fixtures/*.har", + "test:record": "concurrently --kill-others -n 'RECORD,TEST' 'mitmdump --set hardump=test/fixtures/interactions.har -s test/support/redact.py' 'MSW_MODE=record vitest run'", + "test:watch": "MSW_MODE=${MSW_MODE:-replay} vitest", + "test:coverage": "MSW_MODE=${MSW_MODE:-replay} vitest run --coverage" + }, + "dependencies": { + "@aws-sdk/client-secrets-manager": "^3.563.0", + "@modelcontextprotocol/ext-apps": "^1.2.0", + "@modelcontextprotocol/sdk": "^1.27.1", + "@nulib/dcapi-types": "^2.9.1", + "aws-lambda": "^1.0.7", + "cors": "^2.8.6", + "express": "^5.2.1", + "lz-string": "^1.5.0", + "openapi-fetch": "^0.17.0", + "zod": "^4.3.6" + }, + "devDependencies": { + "@msw/source": "^0.6.1", + "@nulib/clover-mcp": "^0.1.0", + "@types/aws-lambda": "^8.10.161", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.6", + "@types/node": "^25.3.5", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "@typescript-eslint/eslint-plugin": "^8.56.1", + "@typescript-eslint/parser": "^8.56.1", + "@vitejs/plugin-react": "^4.0.0", + "@vitest/coverage-v8": "^3.0.0", + "concurrently": "^9.2.1", + "cross-env": "^10.1.0", + "eslint": "^10.0.2", + "msw": "^2.12.13", + "openapi-typescript": "^7.13.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "tsx": "^4.21.0", + "typescript": "^5.9.3", + "undici": "^7.24.4", + "vite": "^7.3.1", + "vite-plugin-singlefile": "^2.3.0", + "vitest": "^3.0.0" + }, + "author": "nulib", + "license": "Apache-2.0" +} diff --git a/mcp/test/.gitkeep b/mcp/test/.gitkeep new file mode 100644 index 00000000..01fb9c59 --- /dev/null +++ b/mcp/test/.gitkeep @@ -0,0 +1,2 @@ +# Keep this directory in git +# Fixtures will be committed but are organized in the fixtures/ subdirectory diff --git a/mcp/test/fixtures/interactions.har b/mcp/test/fixtures/interactions.har new file mode 100644 index 00000000..d1cdd9cf --- /dev/null +++ b/mcp/test/fixtures/interactions.har @@ -0,0 +1,1495 @@ +{ + "log": { + "version": "1.2", + "creator": { + "name": "mitmproxy", + "version": "12.2.1", + "comment": "" + }, + "pages": [], + "entries": [ + { + "startedDateTime": "2026-03-19T21:42:28.721802+00:00", + "time": 411.56721115112305, + "request": { + "method": "POST", + "url": "https://api.dc.library.northwestern.edu/api/v2/search/works?page=1&size=5&visibility=public", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [ + { + "name": "host", + "value": "api.dc.library.northwestern.edu" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "accept", + "value": "*/*" + }, + { + "name": "accept-language", + "value": "*" + }, + { + "name": "sec-fetch-mode", + "value": "cors" + }, + { + "name": "user-agent", + "value": "node" + }, + { + "name": "accept-encoding", + "value": "br, gzip, deflate" + }, + { + "name": "content-length", + "value": "1228" + } + ], + "queryString": [ + { + "name": "page", + "value": "1" + }, + { + "name": "size", + "value": "5" + }, + { + "name": "visibility", + "value": "public" + } + ], + "headersSize": 305, + "bodySize": 1228, + "postData": { + "mimeType": "application/json", + "text": "{\"query\":{\"neural\":{\"embedding\":{\"query_text\":\"photographs of Chicago\",\"k\":100}}},\"aggs\":{\"collection\":{\"terms\":{\"field\":\"collection.title.keyword\",\"size\":20}},\"work_type\":{\"terms\":{\"field\":\"work_type\",\"size\":3}},\"visibility\":{\"terms\":{\"field\":\"visibility\",\"size\":3}}},\"_source\":{\"includes\":[\"id\",\"title\",\"thumbnail\",\"collection.id\",\"collection.title\",\"description\",\"iiif_collection\",\"iiif_manifest\",\"visibility\"],\"excludes\":[\"batch_ids\",\"behavior\",\"box_name\",\"box_number\",\"catalog_key\",\"csv_metadata_update_jobs\",\"embedding\",\"embedding_model\",\"embedding_text_length\",\"folder_name\",\"folder_number\",\"ingest_project\",\"ingest_sheet\",\"legacy_identifier\",\"preservation_level\",\"project\",\"status\",\"terms_of_use\",\"contributor.facet\",\"creator.facet\",\"genre.facet\",\"language.facet\",\"location.facet\",\"style_period.facet\",\"subject.facet\",\"technique.facet\",\"contributor.label_with_role\",\"creator.label_with_role\",\"genre.label_with_role\",\"language.label_with_role\",\"location.label_with_role\",\"style_period.label_with_role\",\"subject.label_with_role\",\"technique.label_with_role\",\"contributor.variants\",\"creator.variants\",\"genre.variants\",\"language.variants\",\"location.variants\",\"style_period.variants\",\"subject.variants\",\"technique.variants\"]}}", + "params": [] + } + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + { + "name": "REDACTED", + "value": null, + "path": "/", + "domain": "", + "httpOnly": false, + "secure": false + } + ], + "headers": [ + { + "name": "Date", + "value": "Thu, 19 Mar 2026 21:42:29 GMT" + }, + { + "name": "Content-Type", + "value": "application/json; charset=UTF-8" + }, + { + "name": "Content-Length", + "value": "6976" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "access-control-expose-headers", + "value": "Cache-Control, Content-Language, Content-Length, Content-Type, Date, ETag, Expires, Last-Modified, Pragma" + }, + { + "name": "access-control-max-age", + "value": "600" + }, + { + "name": "etag", + "value": "62c4b9dad98b088d7a43dbadd65e20a3" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "access-control-allow-headers", + "value": "Accept, Accept-Charset, Accept-Encoding, Accept-Language, Accept-Datetime, Authorization, Cache-Control, Content-Length, Content-Type, Cookie, Date, Expect, Host, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Origin, Pragma, Range, Referer, User-Agent, X-CSRF-Token, X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Port, X-Requested-With" + }, + { + "name": "access-control-allow-methods", + "value": "POST, GET, HEAD, OPTIONS" + }, + { + "name": "access-control-allow-credentials", + "value": "true" + }, + { + "name": "set-cookie", + "value": "REDACTED" + }, + { + "name": "Apigw-Requestid", + "value": "afYWzgjQIAMEPyg=" + } + ], + "content": { + "size": 6976, + "compression": 0, + "mimeType": "application/json; charset=UTF-8", + "text": "{\"data\":[{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/51ae8daf-5fe8-4f62-aa1d-f6941d037348/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/51ae8daf-5fe8-4f62-aa1d-f6941d037348?as=iiif\",\"description\":[\"Description of box : M.A. Seed Dry Plate Company ; packed by 8\"],\"id\":\"51ae8daf-5fe8-4f62-aa1d-f6941d037348\",\"collection\":{\"id\":\"450b857e-2e74-491e-9ef1-2c73e49f0c16\",\"title\":\"George Silas Duntley Photographs\"},\"title\":\"View from rooftop of buildings in Chicago\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/09e70ce7-525f-4c86-9e5b-8f2dcdf8b666/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/09e70ce7-525f-4c86-9e5b-8f2dcdf8b666?as=iiif\",\"description\":[\"3/4 view of CTA streetcar 9167 parked with other streetcars at North Avenue and Cicero Avenue in Chicago, Illinois.\"],\"id\":\"09e70ce7-525f-4c86-9e5b-8f2dcdf8b666\",\"collection\":{\"id\":\"0ba3a256-4952-44ea-b0d9-0772835ff137\",\"title\":\"Ronald J. Sullivan Photograph Collection\"},\"title\":\"9167, North & Cicero\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/e8470c87-f5eb-42f3-9eb2-70a0b09af13b/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/e8470c87-f5eb-42f3-9eb2-70a0b09af13b?as=iiif\",\"description\":[\"Photographs by Carl Smith\"],\"id\":\"e8470c87-f5eb-42f3-9eb2-70a0b09af13b\",\"collection\":{\"id\":\"a74462b0-5ab4-496a-97a8-b963bb19733c\",\"title\":\"Collection of Carl Smith\"},\"title\":\"Downtown Chicago View from Navy Pier\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/dcb7288a-d775-478b-a3f5-c31b1639c204/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/dcb7288a-d775-478b-a3f5-c31b1639c204?as=iiif\",\"description\":[\"Photographs by Carl Smith\"],\"id\":\"dcb7288a-d775-478b-a3f5-c31b1639c204\",\"collection\":{\"id\":\"a74462b0-5ab4-496a-97a8-b963bb19733c\",\"title\":\"Collection of Carl Smith\"},\"title\":\"Chicago Skyline and Lake Michigan Shoreline View north from Hancock Building\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/213397e4-289b-4963-a07f-0295d89d6f5d/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/213397e4-289b-4963-a07f-0295d89d6f5d?as=iiif\",\"description\":[\"Photographs by Carl Smith\"],\"id\":\"213397e4-289b-4963-a07f-0295d89d6f5d\",\"collection\":{\"id\":\"a74462b0-5ab4-496a-97a8-b963bb19733c\",\"title\":\"Collection of Carl Smith\"},\"title\":\"Chicago Skyline. Aerial view from John Hancock Building\"}],\"pagination\":{\"query_url\":\"https://api.dc.library.northwestern.edu/api/v2/search/works?searchToken=N4IgRg9gJgniBcoDOBLAXgUwQVgDQgEcBXDAJzkRADsMjSBDAGwVAwFswMooUqBzFoRLkA%2BgBcMADzEIQABwAWEMRD4NFSAAQQAZpoDCClAGN6fCCHwBrBAEYADPfw6UjCaUGQIzSi7dkEAG1QdzYkQTkiMEYUJAUuILFSEgBdAF803BCyMMEAN1iUMFcUMQpAkAAFKJjjEHS0hvw2aAxGERQoWQB5eyIACQA1bABRACE8gDEAVX7SHTHbAEE0AElpkAzMkBEkCDpjLEpeY0YiKAxw%2BArOyxAxUsYsfDEFIg4qelc7428n4weECoADpbvhfox-oCQQ8xE87hckMZSCg5NC7ihMToRBCoSggRisSI2PQqCgdJcZPgCqhijEyvV8FJTudLkFwPQxMYFB0oOF8JwFPQChAPAKIJIRJ82M9wBKpe9OGKQKYxExVCIrBg4OCkHliRg1VBOfQREQ5MaJCIAFYQMD8kDsTjcXgCJkcLg8fjE1rMd3Or18cRSMQiJ78V53HTeC6kKX0GVRmNkBUe5WuykiOSkCDWjAAjH8TNxDCGu5PPj0YwwXkYKgPFwBfDZy5kPKc-FUMMYPJtO7Z3P5qkgJBqsREB2hJAiXRmpCy371lFgIgqUjAnRVsvg0gYTmijdb4d8Ou7w%2BHYeMUl8IhmDDn7cgRgQVWdh-D0cwJ5Zsj4qDvu4kCiPMAQAl58wUMliHvTcLx%2BIEkiKVcDyvTh2gAd1KHkc3hHc9zXYFULaERMNeEQcNlE8qDPIiMKw8jvFlK9%2BFvE9CPoNCSPoijyxfDsgXYzjSOwxjALKb85F-aBBOI4SGNwkdgKHGS6LInjwO5KCSBUri1NE8EEOXZD13bFFSTEB1kXwg9TJQcyHSos9bPs8tr1Y%2B9nPrB1n1fATPIssSvwwH8UWk-yHSAsAQLEYFwruCRNJQaDYvoMyvPqDJml9K4KnQ0UrHCFJnFFEkZHgEALk3Ig3DuCA0U7K5QGg8gAGVEP4SpUoTQ0yEa%2BQ71kWxAPQI4QGwO4aSKEoGXKyJohMTYMiAA&page=1&size=5&visibility=public\",\"current_page\":1,\"limit\":5,\"offset\":0,\"total_hits\":500,\"total_pages\":100,\"format\":\"default\",\"next_url\":\"https://api.dc.library.northwestern.edu/api/v2/search/works?searchToken=N4IgRg9gJgniBcoDOBLAXgUwQVgDQgEcBXDAJzkRADsMjSBDAGwVAwFswMooUqBzFoRLkA%2BgBcMADzEIQABwAWEMRD4NFSAAQQAZpoDCClAGN6fCCHwBrBAEYADPfw6UjCaUGQIzSi7dkEAG1QdzYkQTkiMEYUJAUuILFSEgBdAF803BCyMMEAN1iUMFcUMQpAkAAFKJjjEHS0hvw2aAxGERQoWQB5eyIACQA1bABRACE8gDEAVX7SHTHbAEE0AElpkAzMkBEkCDpjLEpeY0YiKAxw%2BArOyxAxUsYsfDEFIg4qelc7428n4weECoADpbvhfox-oCQQ8xE87hckMZSCg5NC7ihMToRBCoSggRisSI2PQqCgdJcZPgCqhijEyvV8FJTudLkFwPQxMYFB0oOF8JwFPQChAPAKIJIRJ82M9wBKpe9OGKQKYxExVCIrBg4OCkHliRg1VBOfQREQ5MaJCIAFYQMD8kDsTjcXgCJkcLg8fjE1rMd3Or18cRSMQiJ78V53HTeC6kKX0GVRmNkBUe5WuykiOSkCDWjAAjH8TNxDCGu5PPj0YwwXkYKgPFwBfDZy5kPKc-FUMMYPJtO7Z3P5qkgJBqsREB2hJAiXRmpCy371lFgIgqUjAnRVsvg0gYTmijdb4d8Ou7w%2BHYeMUl8IhmDDn7cgRgQVWdh-D0cwJ5Zsj4qDvu4kCiPMAQAl58wUMliHvTcLx%2BIEkiKVcDyvTh2gAd1KHkc3hHc9zXYFULaERMNeEQcNlE8qDPIiMKw8jvFlK9%2BFvE9CPoNCSPoijyxfDsgXYzjSOwxjALKb85F-aBBOI4SGNwkdgKHGS6LInjwO5KCSBUri1NE8EEOXZD13bFFSTEB1kXwg9TJQcyHSos9bPs8tr1Y%2B9nPrB1n1fATPIssSvwwH8UWk-yHSAsAQLEYFwruCRNJQaDYvoMyvPqDJml9K4KnQ0UrHCFJnFFEkZHgEALk3Ig3DuCA0U7K5QGg8gAGVEP4SpUoTQ0yEa%2BQ71kWxAPQI4QGwO4aSKEoGXKyJohMTYMiAA&page=2&size=5&visibility=public\",\"search_token\":\"N4IgRg9gJgniBcoDOBLAXgUwQVgDQgEcBXDAJzkRADsMjSBDAGwVAwFswMooUqBzFoRLkA+gBcMADzEIQABwAWEMRD4NFSAAQQAZpoDCClAGN6fCCHwBrBAEYADPfw6UjCaUGQIzSi7dkEAG1QdzYkQTkiMEYUJAUuILFSEgBdAF803BCyMMEAN1iUMFcUMQpAkAAFKJjjEHS0hvw2aAxGERQoWQB5eyIACQA1bABRACE8gDEAVX7SHTHbAEE0AElpkAzMkBEkCDpjLEpeY0YiKAxw+ArOyxAxUsYsfDEFIg4qelc7428n4weECoADpbvhfox-oCQQ8xE87hckMZSCg5NC7ihMToRBCoSggRisSI2PQqCgdJcZPgCqhijEyvV8FJTudLkFwPQxMYFB0oOF8JwFPQChAPAKIJIRJ82M9wBKpe9OGKQKYxExVCIrBg4OCkHliRg1VBOfQREQ5MaJCIAFYQMD8kDsTjcXgCJkcLg8fjE1rMd3Or18cRSMQiJ78V53HTeC6kKX0GVRmNkBUe5WuykiOSkCDWjAAjH8TNxDCGu5PPj0YwwXkYKgPFwBfDZy5kPKc-FUMMYPJtO7Z3P5qkgJBqsREB2hJAiXRmpCy371lFgIgqUjAnRVsvg0gYTmijdb4d8Ou7w+HYeMUl8IhmDDn7cgRgQVWdh-D0cwJ5Zsj4qDvu4kCiPMAQAl58wUMliHvTcLx+IEkiKVcDyvTh2gAd1KHkc3hHc9zXYFULaERMNeEQcNlE8qDPIiMKw8jvFlK9+FvE9CPoNCSPoijyxfDsgXYzjSOwxjALKb85F-aBBOI4SGNwkdgKHGS6LInjwO5KCSBUri1NE8EEOXZD13bFFSTEB1kXwg9TJQcyHSos9bPs8tr1Y+9nPrB1n1fATPIssSvwwH8UWk-yHSAsAQLEYFwruCRNJQaDYvoMyvPqDJml9K4KnQ0UrHCFJnFFEkZHgEALk3Ig3DuCA0U7K5QGg8gAGVEP4SpUoTQ0yEa+Q71kWxAPQI4QGwO4aSKEoGXKyJohMTYMiAA\"},\"info\":{\"name\":\"dc-api\",\"description\":\"NUL Digital Collections API\",\"version\":\"2.9.4\",\"link_expiration\":null},\"aggregations\":{\"visibility\":{\"doc_count_error_upper_bound\":0,\"sum_other_doc_count\":0,\"buckets\":[{\"key\":\"Public\",\"doc_count\":500}]},\"work_type\":{\"doc_count_error_upper_bound\":0,\"sum_other_doc_count\":0,\"buckets\":[{\"key\":\"Image\",\"doc_count\":500}]},\"collection\":{\"doc_count_error_upper_bound\":0,\"sum_other_doc_count\":0,\"buckets\":[{\"key\":\"Ronald J. Sullivan Photograph Collection\",\"doc_count\":399},{\"key\":\"Jim Roberts Photographs\",\"doc_count\":71},{\"key\":\"Collection of Carl Smith\",\"doc_count\":21},{\"key\":\"George Silas Duntley Photographs\",\"doc_count\":6},{\"key\":\"Holly Clayson Slide Collection\",\"doc_count\":1},{\"key\":\"Map and Atlas Collection\",\"doc_count\":1},{\"key\":\"University Archives Postcards\",\"doc_count\":1}]}}}" + }, + "redirectURL": "", + "headersSize": 1030, + "bodySize": 6976 + }, + "cache": {}, + "timings": { + "connect": 6.559133529663086, + "ssl": 28.94425392150879, + "send": 0.6041526794433594, + "receive": 0.6787776947021484, + "wait": 374.78089332580566 + }, + "serverIPAddress": "52.86.120.219" + }, + { + "startedDateTime": "2026-03-19T21:42:29.158249+00:00", + "time": 138.29994201660156, + "request": { + "method": "POST", + "url": "https://api.dc.library.northwestern.edu/api/v2/search/works?page=1&size=10&visibility=public", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [ + { + "name": "host", + "value": "api.dc.library.northwestern.edu" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "accept", + "value": "*/*" + }, + { + "name": "accept-language", + "value": "*" + }, + { + "name": "sec-fetch-mode", + "value": "cors" + }, + { + "name": "user-agent", + "value": "node" + }, + { + "name": "accept-encoding", + "value": "br, gzip, deflate" + }, + { + "name": "content-length", + "value": "1286" + } + ], + "queryString": [ + { + "name": "page", + "value": "1" + }, + { + "name": "size", + "value": "10" + }, + { + "name": "visibility", + "value": "public" + } + ], + "headersSize": 305, + "bodySize": 1286, + "postData": { + "mimeType": "application/json", + "text": "{\"query\":{\"bool\":{\"should\":[{\"match\":{\"subject.label\":\"Architecture\"}},{\"term\":{\"work_type\":{\"value\":\"Image\"}}}],\"minimum_should_match\":1}},\"aggs\":{\"collection\":{\"terms\":{\"field\":\"collection.title.keyword\",\"size\":20}},\"work_type\":{\"terms\":{\"field\":\"work_type\",\"size\":3}},\"visibility\":{\"terms\":{\"field\":\"visibility\",\"size\":3}}},\"_source\":{\"includes\":[\"id\",\"title\",\"thumbnail\",\"collection.id\",\"collection.title\",\"description\",\"iiif_collection\",\"iiif_manifest\",\"visibility\"],\"excludes\":[\"batch_ids\",\"behavior\",\"box_name\",\"box_number\",\"catalog_key\",\"csv_metadata_update_jobs\",\"embedding\",\"embedding_model\",\"embedding_text_length\",\"folder_name\",\"folder_number\",\"ingest_project\",\"ingest_sheet\",\"legacy_identifier\",\"preservation_level\",\"project\",\"status\",\"terms_of_use\",\"contributor.facet\",\"creator.facet\",\"genre.facet\",\"language.facet\",\"location.facet\",\"style_period.facet\",\"subject.facet\",\"technique.facet\",\"contributor.label_with_role\",\"creator.label_with_role\",\"genre.label_with_role\",\"language.label_with_role\",\"location.label_with_role\",\"style_period.label_with_role\",\"subject.label_with_role\",\"technique.label_with_role\",\"contributor.variants\",\"creator.variants\",\"genre.variants\",\"language.variants\",\"location.variants\",\"style_period.variants\",\"subject.variants\",\"technique.variants\"]}}", + "params": [] + } + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + { + "name": "REDACTED", + "value": null, + "path": "/", + "domain": "", + "httpOnly": false, + "secure": false + } + ], + "headers": [ + { + "name": "Date", + "value": "Thu, 19 Mar 2026 21:42:29 GMT" + }, + { + "name": "Content-Type", + "value": "application/json; charset=UTF-8" + }, + { + "name": "Content-Length", + "value": "10416" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "access-control-allow-headers", + "value": "Accept, Accept-Charset, Accept-Encoding, Accept-Language, Accept-Datetime, Authorization, Cache-Control, Content-Length, Content-Type, Cookie, Date, Expect, Host, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Origin, Pragma, Range, Referer, User-Agent, X-CSRF-Token, X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Port, X-Requested-With" + }, + { + "name": "access-control-allow-methods", + "value": "POST, GET, HEAD, OPTIONS" + }, + { + "name": "access-control-allow-credentials", + "value": "true" + }, + { + "name": "access-control-expose-headers", + "value": "Cache-Control, Content-Language, Content-Length, Content-Type, Date, ETag, Expires, Last-Modified, Pragma" + }, + { + "name": "access-control-max-age", + "value": "600" + }, + { + "name": "etag", + "value": "9dc7c2fea271cbe8d9057901049fba88" + }, + { + "name": "set-cookie", + "value": "REDACTED" + }, + { + "name": "Apigw-Requestid", + "value": "afYW3jjNIAMEZ5A=" + } + ], + "content": { + "size": 10416, + "compression": 0, + "mimeType": "application/json; charset=UTF-8", + "text": "{\"data\":[{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/0703c414-394b-4572-bd02-a6fc83542800/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/0703c414-394b-4572-bd02-a6fc83542800?as=iiif\",\"description\":[],\"id\":\"0703c414-394b-4572-bd02-a6fc83542800\",\"collection\":{\"id\":\"6f58c85f-f1fc-43c1-be52-678867659ff6\",\"title\":\"The Humphrey Winterton Collection of East African Photographs: 1860-1960\"},\"title\":\"Zanzibar, native women cooking\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/1775d99b-b6da-4a01-a94d-7eff245c0a64/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/1775d99b-b6da-4a01-a94d-7eff245c0a64?as=iiif\",\"description\":[],\"id\":\"1775d99b-b6da-4a01-a94d-7eff245c0a64\",\"collection\":{\"id\":\"533738fc-d680-4a43-9797-66240ba6f43d\",\"title\":\"David Van Zanten Slide Collection\"},\"title\":\"Fairies Feeding the Herons\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/185b6fef-1f19-45da-b350-b4315b4ac2f5/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/185b6fef-1f19-45da-b350-b4315b4ac2f5?as=iiif\",\"description\":[],\"id\":\"185b6fef-1f19-45da-b350-b4315b4ac2f5\",\"collection\":{\"id\":\"e1d753c7-789b-46f2-bb0e-89c6a38e3a1b\",\"title\":\"Holly Clayson Slide Collection\"},\"title\":\"St. Trophime, Arles, newly cleaned. Full view of ornate arched portal, three columns at each side forming part of carved ornament\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/6aba16f9-2f88-4e7b-beae-52de96fb3275/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/6aba16f9-2f88-4e7b-beae-52de96fb3275?as=iiif\",\"description\":[],\"id\":\"6aba16f9-2f88-4e7b-beae-52de96fb3275\",\"collection\":{\"id\":\"a74462b0-5ab4-496a-97a8-b963bb19733c\",\"title\":\"Collection of Carl Smith\"},\"title\":\"House in rural Iowa\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/2d821eec-c541-4fe0-869d-0afb8a4fd2cf/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/2d821eec-c541-4fe0-869d-0afb8a4fd2cf?as=iiif\",\"description\":[],\"id\":\"2d821eec-c541-4fe0-869d-0afb8a4fd2cf\",\"collection\":{\"id\":\"e1d753c7-789b-46f2-bb0e-89c6a38e3a1b\",\"title\":\"Holly Clayson Slide Collection\"},\"title\":\"Chapelle du Rosaire Vence The base of the main altar\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/37f7951f-209b-4a5d-ad71-ffffbe55c5bf/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/37f7951f-209b-4a5d-ad71-ffffbe55c5bf?as=iiif\",\"description\":[],\"id\":\"37f7951f-209b-4a5d-ad71-ffffbe55c5bf\",\"collection\":{\"id\":\"6f58c85f-f1fc-43c1-be52-678867659ff6\",\"title\":\"The Humphrey Winterton Collection of East African Photographs: 1860-1960\"},\"title\":\"A coffee tree, Uganda\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/47c99db9-8048-4e9d-8a1f-80ecef1698e7/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/47c99db9-8048-4e9d-8a1f-80ecef1698e7?as=iiif\",\"description\":[],\"id\":\"47c99db9-8048-4e9d-8a1f-80ecef1698e7\",\"collection\":{\"id\":\"e1d753c7-789b-46f2-bb0e-89c6a38e3a1b\",\"title\":\"Holly Clayson Slide Collection\"},\"title\":\"Abbaye de Ganagobie. Interior--arched doorway, paired columns in niche\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/89d2b502-8cfc-4c0a-9711-f61c9f0b47e5/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/89d2b502-8cfc-4c0a-9711-f61c9f0b47e5?as=iiif\",\"description\":[\"This is a replica of the Langlois Bridge that Van Gogh painted in 1888, which was replaced by a concrete structure in 1930, which was destroyed by retreating Germans in 1944.\"],\"id\":\"89d2b502-8cfc-4c0a-9711-f61c9f0b47e5\",\"collection\":{\"id\":\"e1d753c7-789b-46f2-bb0e-89c6a38e3a1b\",\"title\":\"Holly Clayson Slide Collection\"},\"title\":\"Arles. Stream, concrete waterfront wall, angled boards (drawbridge) reflecting in water, tree leaves in top foreground\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/82e82e90-6651-438b-84ad-1e70fec8adbc/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/82e82e90-6651-438b-84ad-1e70fec8adbc?as=iiif\",\"description\":[\"Other annotation on slide: '67.\"],\"id\":\"82e82e90-6651-438b-84ad-1e70fec8adbc\",\"collection\":{\"id\":\"e1d753c7-789b-46f2-bb0e-89c6a38e3a1b\",\"title\":\"Holly Clayson Slide Collection\"},\"title\":\"Parthenon, west facade. Close view of west facade ; two people between columns, woman below ;\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/9397cbbc-c02d-490a-8898-2e6136f528fe/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/9397cbbc-c02d-490a-8898-2e6136f528fe?as=iiif\",\"description\":[],\"id\":\"9397cbbc-c02d-490a-8898-2e6136f528fe\",\"collection\":{\"id\":\"6f58c85f-f1fc-43c1-be52-678867659ff6\",\"title\":\"The Humphrey Winterton Collection of East African Photographs: 1860-1960\"},\"title\":\"Zanzibar, H.H. the Sultan of Zanzibar\"}],\"pagination\":{\"query_url\":\"https://api.dc.library.northwestern.edu/api/v2/search/works?searchToken=N4IgRg9gJgniBcoDOBLAXgUwQRgAwBoQBHAVwwCc5FwIIAbBZACwhLqgQG1QBbAQwAuAYyaMQSEmABWGIQIB0dPmAwN4IAILkRKAbIElyWAL7H8oPeR5iA7hHIBrAPoCYAByzUAbnzpkEIACS-ADmJqYAuoQ8KAB2KDwkPE5ILGxQTvzCovDYhABmKHSWXBYUPEhibpJ0KKkYHPCcAuRkEabmIJYVYl51KGBFulScIAAKNShCIO3Gs4QprNqeoHFCflAYlU0gKByEArp0WAdMSWCxfEUghEL0x3IoELHyezcgd3QPh8-yhwLHd6bJBCcgoNw-WLvFAw-JOT7fJ5QwgwlBw-jxfJbATvPqoQa1VwzQgYAAe6xIwK44EEIice0qhBUTD4fXs70gpKclx4JxoXNi5wo7yEgl8EBCTgcGDgtyQXkyGAEfCgYqcJDcqr0TikEDAjJAGB4KigUDiIXeRpNZtikp40FUluNDRtkr0pIETmOtoEogK9E25G5fF573yAYo3KF5GhtuxTjc5AgMjksbCSE99SV72OIT4Qhg9M2sUOhWFhETWwoPkhXowXkdFaTKZxhAzghIBu6SCcEDhnb5dxLYLAJAE9nk%2BXz2duRkEE6nQhnIDCsSMk%2BnrZASltJD4YQ3S63dAgoshh%2BXGZgxwTFCeUAvW4k0n0j-eehE8VIGDft2eLQGMcJyUFQ6CcGxdCYJwk0BWcMHnchFGUVRwMg6D6D5Vd1xAlCIN9dDYO3Phd33H8cLAvCoJgvkTzPJEkNA1D8Oo94rxvDwwWgBjcLQli20kFtuIo3iMPfWQmC-MghKYqjRL-YdAPHRCfDBYiBANUF4KU%2BQVJQNSDSwn9dP0nNiJCPcD2MksDVowR6Ks9TWNcdi7y4hyDWfQT3LEz8UG-HS%2BFU6yZg6EB7U2OhtlGOxHEqKIQHDKxBACTYpzYLcIAhJFtlAb9KAAZQA20xkCkMlQoHKQDcUiAmwVj0E8EA8FxfoCWGAJqjAWpplMYwgA&page=1&size=10&visibility=public\",\"current_page\":1,\"limit\":10,\"offset\":0,\"total_hits\":96020,\"total_pages\":9602,\"format\":\"default\",\"next_url\":\"https://api.dc.library.northwestern.edu/api/v2/search/works?searchToken=N4IgRg9gJgniBcoDOBLAXgUwQRgAwBoQBHAVwwCc5FwIIAbBZACwhLqgQG1QBbAQwAuAYyaMQSEmABWGIQIB0dPmAwN4IAILkRKAbIElyWAL7H8oPeR5iA7hHIBrAPoCYAByzUAbnzpkEIACS-ADmJqYAuoQ8KAB2KDwkPE5ILGxQTvzCovDYhABmKHSWXBYUPEhibpJ0KKkYHPCcAuRkEabmIJYVYl51KGBFulScIAAKNShCIO3Gs4QprNqeoHFCflAYlU0gKByEArp0WAdMSWCxfEUghEL0x3IoELHyezcgd3QPh8-yhwLHd6bJBCcgoNw-WLvFAw-JOT7fJ5QwgwlBw-jxfJbATvPqoQa1VwzQgYAAe6xIwK44EEIice0qhBUTD4fXs70gpKclx4JxoXNi5wo7yEgl8EBCTgcGDgtyQXkyGAEfCgYqcJDcqr0TikEDAjJAGB4KigUDiIXeRpNZtikp40FUluNDRtkr0pIETmOtoEogK9E25G5fF573yAYo3KF5GhtuxTjc5AgMjksbCSE99SV72OIT4Qhg9M2sUOhWFhETWwoPkhXowXkdFaTKZxhAzghIBu6SCcEDhnb5dxLYLAJAE9nk%2BXz2duRkEE6nQhnIDCsSMk%2BnrZASltJD4YQ3S63dAgoshh%2BXGZgxwTFCeUAvW4k0n0j-eehE8VIGDft2eLQGMcJyUFQ6CcGxdCYJwk0BWcMHnchFGUVRwMg6D6D5Vd1xAlCIN9dDYO3Phd33H8cLAvCoJgvkTzPJEkNA1D8Oo94rxvDwwWgBjcLQli20kFtuIo3iMPfWQmC-MghKYqjRL-YdAPHRCfDBYiBANUF4KU%2BQVJQNSDSwn9dP0nNiJCPcD2MksDVowR6Ks9TWNcdi7y4hyDWfQT3LEz8UG-HS%2BFU6yZg6EB7U2OhtlGOxHEqKIQHDKxBACTYpzYLcIAhJFtlAb9KAAZQA20xkCkMlQoHKQDcUiAmwVj0E8EA8FxfoCWGAJqjAWpplMYwgA&page=2&size=10&visibility=public\",\"search_token\":\"N4IgRg9gJgniBcoDOBLAXgUwQRgAwBoQBHAVwwCc5FwIIAbBZACwhLqgQG1QBbAQwAuAYyaMQSEmABWGIQIB0dPmAwN4IAILkRKAbIElyWAL7H8oPeR5iA7hHIBrAPoCYAByzUAbnzpkEIACS-ADmJqYAuoQ8KAB2KDwkPE5ILGxQTvzCovDYhABmKHSWXBYUPEhibpJ0KKkYHPCcAuRkEabmIJYVYl51KGBFulScIAAKNShCIO3Gs4QprNqeoHFCflAYlU0gKByEArp0WAdMSWCxfEUghEL0x3IoELHyezcgd3QPh8-yhwLHd6bJBCcgoNw-WLvFAw-JOT7fJ5QwgwlBw-jxfJbATvPqoQa1VwzQgYAAe6xIwK44EEIice0qhBUTD4fXs70gpKclx4JxoXNi5wo7yEgl8EBCTgcGDgtyQXkyGAEfCgYqcJDcqr0TikEDAjJAGB4KigUDiIXeRpNZtikp40FUluNDRtkr0pIETmOtoEogK9E25G5fF573yAYo3KF5GhtuxTjc5AgMjksbCSE99SV72OIT4Qhg9M2sUOhWFhETWwoPkhXowXkdFaTKZxhAzghIBu6SCcEDhnb5dxLYLAJAE9nk+Xz2duRkEE6nQhnIDCsSMk+nrZASltJD4YQ3S63dAgoshh+XGZgxwTFCeUAvW4k0n0j-eehE8VIGDft2eLQGMcJyUFQ6CcGxdCYJwk0BWcMHnchFGUVRwMg6D6D5Vd1xAlCIN9dDYO3Phd33H8cLAvCoJgvkTzPJEkNA1D8Oo94rxvDwwWgBjcLQli20kFtuIo3iMPfWQmC-MghKYqjRL-YdAPHRCfDBYiBANUF4KU+QVJQNSDSwn9dP0nNiJCPcD2MksDVowR6Ks9TWNcdi7y4hyDWfQT3LEz8UG-HS+FU6yZg6EB7U2OhtlGOxHEqKIQHDKxBACTYpzYLcIAhJFtlAb9KAAZQA20xkCkMlQoHKQDcUiAmwVj0E8EA8FxfoCWGAJqjAWpplMYwgA\"},\"info\":{\"name\":\"dc-api\",\"description\":\"NUL Digital Collections API\",\"version\":\"2.9.4\",\"link_expiration\":null},\"aggregations\":{\"visibility\":{\"doc_count_error_upper_bound\":0,\"sum_other_doc_count\":0,\"buckets\":[{\"key\":\"Public\",\"doc_count\":96020}]},\"work_type\":{\"doc_count_error_upper_bound\":0,\"sum_other_doc_count\":0,\"buckets\":[{\"key\":\"Image\",\"doc_count\":96020}]},\"collection\":{\"doc_count_error_upper_bound\":244,\"sum_other_doc_count\":12385,\"buckets\":[{\"key\":\"Berkeley Folk Music Festival\",\"doc_count\":33354},{\"key\":\"E. H. Duckworth Photograph Collection\",\"doc_count\":12540},{\"key\":\"Rob Linrothe Image Collection\",\"doc_count\":8581},{\"key\":\"Jim Roberts Photographs\",\"doc_count\":3562},{\"key\":\"Posters from the Herskovits Library\",\"doc_count\":2530},{\"key\":\"Edward S. Curtis's The North American Indian\",\"doc_count\":2336},{\"key\":\"Ann C. Gunter Slide Collection\",\"doc_count\":2159},{\"key\":\"Collection of Carl Smith\",\"doc_count\":1990},{\"key\":\"University Theatre Study Photographs Collection\",\"doc_count\":1933},{\"key\":\"University Archives Nitrate Negative Collection\",\"doc_count\":1866},{\"key\":\"United States Army Base Hospital Number 12 World War I and II Records\",\"doc_count\":1775},{\"key\":\"George M. Foster Timetable Collection\",\"doc_count\":1764},{\"key\":\"Justine Cordwell Collection\",\"doc_count\":1394},{\"key\":\"Maher Ahmad (1950- ) Papers \",\"doc_count\":1367},{\"key\":\"The Humphrey Winterton Collection of East African Photographs: 1860-1960\",\"doc_count\":1153},{\"key\":\"Vernon McKay Photographs\",\"doc_count\":1138},{\"key\":\"Records of Northwestern University Black Alumni Association (NUBAA) \",\"doc_count\":1114},{\"key\":\"Ronald J. Sullivan Photograph Collection\",\"doc_count\":1113},{\"key\":\"Holly Clayson Slide Collection\",\"doc_count\":1002},{\"key\":\"Transportation Library Menu Collection\",\"doc_count\":964}]}}}" + }, + "redirectURL": "", + "headersSize": 1031, + "bodySize": 10416 + }, + "cache": {}, + "timings": { + "connect": 4.473447799682617, + "ssl": 14.492988586425781, + "send": 1.0263919830322266, + "receive": 0.6165504455566406, + "wait": 117.6905632019043 + }, + "serverIPAddress": "52.86.120.219" + }, + { + "startedDateTime": "2026-03-19T21:42:29.285633+00:00", + "time": 1360.9905242919922, + "request": { + "method": "POST", + "url": "https://api.dc.library.northwestern.edu/api/v2/search/works?page=1&size=5&visibility=public", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [ + { + "name": "host", + "value": "api.dc.library.northwestern.edu" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "accept", + "value": "*/*" + }, + { + "name": "accept-language", + "value": "*" + }, + { + "name": "sec-fetch-mode", + "value": "cors" + }, + { + "name": "user-agent", + "value": "node" + }, + { + "name": "accept-encoding", + "value": "br, gzip, deflate" + }, + { + "name": "content-length", + "value": "1328" + } + ], + "queryString": [ + { + "name": "page", + "value": "1" + }, + { + "name": "size", + "value": "5" + }, + { + "name": "visibility", + "value": "public" + } + ], + "headersSize": 305, + "bodySize": 1328, + "postData": { + "mimeType": "application/json", + "text": "{\"query\":{\"hybrid\":{\"queries\":[{\"bool\":{\"should\":[{\"term\":{\"work_type\":{\"value\":\"Image\"}}}],\"minimum_should_match\":1}},{\"neural\":{\"embedding\":{\"query_text\":\"landscape\",\"k\":100}}}]}},\"aggs\":{\"collection\":{\"terms\":{\"field\":\"collection.title.keyword\",\"size\":20}},\"work_type\":{\"terms\":{\"field\":\"work_type\",\"size\":3}},\"visibility\":{\"terms\":{\"field\":\"visibility\",\"size\":3}}},\"_source\":{\"includes\":[\"id\",\"title\",\"thumbnail\",\"collection.id\",\"collection.title\",\"description\",\"iiif_collection\",\"iiif_manifest\",\"visibility\"],\"excludes\":[\"batch_ids\",\"behavior\",\"box_name\",\"box_number\",\"catalog_key\",\"csv_metadata_update_jobs\",\"embedding\",\"embedding_model\",\"embedding_text_length\",\"folder_name\",\"folder_number\",\"ingest_project\",\"ingest_sheet\",\"legacy_identifier\",\"preservation_level\",\"project\",\"status\",\"terms_of_use\",\"contributor.facet\",\"creator.facet\",\"genre.facet\",\"language.facet\",\"location.facet\",\"style_period.facet\",\"subject.facet\",\"technique.facet\",\"contributor.label_with_role\",\"creator.label_with_role\",\"genre.label_with_role\",\"language.label_with_role\",\"location.label_with_role\",\"style_period.label_with_role\",\"subject.label_with_role\",\"technique.label_with_role\",\"contributor.variants\",\"creator.variants\",\"genre.variants\",\"language.variants\",\"location.variants\",\"style_period.variants\",\"subject.variants\",\"technique.variants\"]}}", + "params": [] + } + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + { + "name": "REDACTED", + "value": null, + "path": "/", + "domain": "", + "httpOnly": false, + "secure": false + } + ], + "headers": [ + { + "name": "Date", + "value": "Thu, 19 Mar 2026 21:42:30 GMT" + }, + { + "name": "Content-Type", + "value": "application/json; charset=UTF-8" + }, + { + "name": "Content-Length", + "value": "8195" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "access-control-allow-credentials", + "value": "true" + }, + { + "name": "access-control-expose-headers", + "value": "Cache-Control, Content-Language, Content-Length, Content-Type, Date, ETag, Expires, Last-Modified, Pragma" + }, + { + "name": "access-control-max-age", + "value": "600" + }, + { + "name": "etag", + "value": "6b8dfc1061d9746c2b1f50dfe9cd491b" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "access-control-allow-headers", + "value": "Accept, Accept-Charset, Accept-Encoding, Accept-Language, Accept-Datetime, Authorization, Cache-Control, Content-Length, Content-Type, Cookie, Date, Expect, Host, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Origin, Pragma, Range, Referer, User-Agent, X-CSRF-Token, X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Port, X-Requested-With" + }, + { + "name": "access-control-allow-methods", + "value": "POST, GET, HEAD, OPTIONS" + }, + { + "name": "set-cookie", + "value": "REDACTED" + }, + { + "name": "Apigw-Requestid", + "value": "afYW4hYHIAMEPxQ=" + } + ], + "content": { + "size": 8195, + "compression": 0, + "mimeType": "application/json; charset=UTF-8", + "text": "{\"data\":[{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/0b870149-ae30-44b8-b37e-cf52d3fda05e/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/0b870149-ae30-44b8-b37e-cf52d3fda05e?as=iiif\",\"description\":[],\"id\":\"0b870149-ae30-44b8-b37e-cf52d3fda05e\",\"collection\":{\"id\":\"76d3e313-531b-48b2-aa3f-96680569e50f\",\"title\":\"Glass Lantern Slides, Records of the Art History Department\"},\"title\":\"Dessau, Germany. Housing with balcony.\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/0b870149-ae30-44b8-b37e-cf52d3fda05e/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/0b870149-ae30-44b8-b37e-cf52d3fda05e?as=iiif\",\"description\":[],\"id\":\"0b870149-ae30-44b8-b37e-cf52d3fda05e\",\"collection\":{\"id\":\"76d3e313-531b-48b2-aa3f-96680569e50f\",\"title\":\"Glass Lantern Slides, Records of the Art History Department\"},\"title\":\"Dessau, Germany. Housing with balcony.\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/0b870149-ae30-44b8-b37e-cf52d3fda05e/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/0b870149-ae30-44b8-b37e-cf52d3fda05e?as=iiif\",\"description\":[],\"id\":\"0b870149-ae30-44b8-b37e-cf52d3fda05e\",\"collection\":{\"id\":\"76d3e313-531b-48b2-aa3f-96680569e50f\",\"title\":\"Glass Lantern Slides, Records of the Art History Department\"},\"title\":\"Dessau, Germany. Housing with balcony.\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/dd16397f-c5c6-4091-936e-ac697cf885a6/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/dd16397f-c5c6-4091-936e-ac697cf885a6?as=iiif\",\"description\":[],\"id\":\"dd16397f-c5c6-4091-936e-ac697cf885a6\",\"collection\":{\"id\":\"76d3e313-531b-48b2-aa3f-96680569e50f\",\"title\":\"Glass Lantern Slides, Records of the Art History Department\"},\"title\":\"Lomma, Sweden. Power lines. Northwestern faculty William Charles Bauer.\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/6621bc9a-5ea7-4ed5-b5a2-bc9ef036d32e/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/6621bc9a-5ea7-4ed5-b5a2-bc9ef036d32e?as=iiif\",\"description\":[],\"id\":\"6621bc9a-5ea7-4ed5-b5a2-bc9ef036d32e\",\"collection\":{\"id\":\"76d3e313-531b-48b2-aa3f-96680569e50f\",\"title\":\"Glass Lantern Slides, Records of the Art History Department\"},\"title\":\"Tangier, Morocco. Street scene.\"}],\"pagination\":{\"query_url\":\"https://api.dc.library.northwestern.edu/api/v2/search/works?searchToken=N4IgRg9gJgniBcoDOBLAXgUwQVgDQgEcBXDAJzkRAAsYxSUoFRiyUMkEBtUSCAGyYgkVCET6N43EABcyAW0EB3CKQDWAfWkwADlkoA3AIZ8SCEAEk5hgOZYAvg4C6%2BOSgB2KOUTnrho8epW0gDGVAgAjPgAZih8sqRcoPFyHJTaRGB8KMIYEpzSpCSODrhJ8qmg%2BtkoYLEoWlwgAAoZWcEgxXadpSBuGESkxoIYcmC5UO7WgizkmhgAHtJmfIZuUEjBhrog%2BKoRAAz70bHxgrwClDFxZIky5YLpmdlUuVwFRSVlpCmCVai1WQakmarRQ7U63RAcmgGD46gYZgA8vsiAAJABq2AAogAhfQAMQAqqjSFEceEAIJocyEkAOLolEC%2BUSkYJ6UDuYImKDsRoI-DSep8LACqjeMBuQyxHYgYL8YXBQUQNwAOn5svlGEVKGVKsF0mFMp5G3o2iVbhlKCtUXUcr4CvNlutgVWKCi7CW%2BD%2BNTqDWcIAWXKIxsaYEMISo8PWMrGVEMVRUMYg83UkrkIvAydT4pu%2BE20mMEGs6lUGDgeaQ%2BkCGALUHDhnURG0ddk6gAVhAwBx8CMxlAJm4pj3RuNJoEYQJh32B8XZIt1MLB9IwtF%2BDzSKnDOmZVE12RsyOEvhJh71NpSBA21rPSAT0hpL4XjWZcLrIZgjAoxg3IKYrmQOe7BkEY5oLhg%2BiwjK56XteMr3uGRDdnc3xIOoEA2ohGZyj%2B9BgEQ0gqCqUTvs%2BeakBg4aEcRbI3rYbjkURJE3isg5EDYGCMTRL4QPmOqqtRpFCFowpnqw0CcYJSAZFeioSTesihB4LByTK2EFDU%2BGESsYxwoo9SRhehpkRRBGkCq2mwuoenLuohkZnRDEWbp%2Bm2fwGYsdYbG2OZhg6VZLl2dxvG6k5-k2YF%2BD3jAIm6PQ4mhdZBluXB0nXj5fmJa5Rl3IpKDKQlAXJXmyrqXhpkqkY9CrNISHBORlFmZVKDVUhDkcU1LUvqsnnsRVhhVT%2BSF8Dx4Z8X1A01XBwkYKJcVQONzWDSlYAydIC2dQKWpUEpJDrUtkLQjyfCpJwIDKGoHD%2Bru3zhmYPLEWIN4QGafEVIQJDkAAyupg5NP1W41mQb3aOxZjhHB6B6CA2Ayt6AL1BQAGgu09JAA&page=1&size=5&visibility=public\",\"current_page\":1,\"limit\":5,\"offset\":0,\"total_hits\":96020,\"total_pages\":19204,\"format\":\"default\",\"next_url\":\"https://api.dc.library.northwestern.edu/api/v2/search/works?searchToken=N4IgRg9gJgniBcoDOBLAXgUwQVgDQgEcBXDAJzkRAAsYxSUoFRiyUMkEBtUSCAGyYgkVCET6N43EABcyAW0EB3CKQDWAfWkwADlkoA3AIZ8SCEAEk5hgOZYAvg4C6%2BOSgB2KOUTnrho8epW0gDGVAgAjPgAZih8sqRcoPFyHJTaRGB8KMIYEpzSpCSODrhJ8qmg%2BtkoYLEoWlwgAAoZWcEgxXadpSBuGESkxoIYcmC5UO7WgizkmhgAHtJmfIZuUEjBhrog%2BKoRAAz70bHxgrwClDFxZIky5YLpmdlUuVwFRSVlpCmCVai1WQakmarRQ7U63RAcmgGD46gYZgA8vsiAAJABq2AAogAhfQAMQAqqjSFEceEAIJocyEkAOLolEC%2BUSkYJ6UDuYImKDsRoI-DSep8LACqjeMBuQyxHYgYL8YXBQUQNwAOn5svlGEVKGVKsF0mFMp5G3o2iVbhlKCtUXUcr4CvNlutgVWKCi7CW%2BD%2BNTqDWcIAWXKIxsaYEMISo8PWMrGVEMVRUMYg83UkrkIvAydT4pu%2BE20mMEGs6lUGDgeaQ%2BkCGALUHDhnURG0ddk6gAVhAwBx8CMxlAJm4pj3RuNJoEYQJh32B8XZIt1MLB9IwtF%2BDzSKnDOmZVE12RsyOEvhJh71NpSBA21rPSAT0hpL4XjWZcLrIZgjAoxg3IKYrmQOe7BkEY5oLhg%2BiwjK56XteMr3uGRDdnc3xIOoEA2ohGZyj%2B9BgEQ0gqCqUTvs%2BeakBg4aEcRbI3rYbjkURJE3isg5EDYGCMTRL4QPmOqqtRpFCFowpnqw0CcYJSAZFeioSTesihB4LByTK2EFDU%2BGESsYxwoo9SRhehpkRRBGkCq2mwuoenLuohkZnRDEWbp%2Bm2fwGYsdYbG2OZhg6VZLl2dxvG6k5-k2YF%2BD3jAIm6PQ4mhdZBluXB0nXj5fmJa5Rl3IpKDKQlAXJXmyrqXhpkqkY9CrNISHBORlFmZVKDVUhDkcU1LUvqsnnsRVhhVT%2BSF8Dx4Z8X1A01XBwkYKJcVQONzWDSlYAydIC2dQKWpUEpJDrUtkLQjyfCpJwIDKGoHD%2Bru3zhmYPLEWIN4QGafEVIQJDkAAyupg5NP1W41mQb3aOxZjhHB6B6CA2Ayt6AL1BQAGgu09JAA&page=2&size=5&visibility=public\",\"search_token\":\"N4IgRg9gJgniBcoDOBLAXgUwQVgDQgEcBXDAJzkRAAsYxSUoFRiyUMkEBtUSCAGyYgkVCET6N43EABcyAW0EB3CKQDWAfWkwADlkoA3AIZ8SCEAEk5hgOZYAvg4C6+OSgB2KOUTnrho8epW0gDGVAgAjPgAZih8sqRcoPFyHJTaRGB8KMIYEpzSpCSODrhJ8qmg+tkoYLEoWlwgAAoZWcEgxXadpSBuGESkxoIYcmC5UO7WgizkmhgAHtJmfIZuUEjBhrog+KoRAAz70bHxgrwClDFxZIky5YLpmdlUuVwFRSVlpCmCVai1WQakmarRQ7U63RAcmgGD46gYZgA8vsiAAJABq2AAogAhfQAMQAqqjSFEceEAIJocyEkAOLolEC+USkYJ6UDuYImKDsRoI-DSep8LACqjeMBuQyxHYgYL8YXBQUQNwAOn5svlGEVKGVKsF0mFMp5G3o2iVbhlKCtUXUcr4CvNlutgVWKCi7CW+D+NTqDWcIAWXKIxsaYEMISo8PWMrGVEMVRUMYg83UkrkIvAydT4pu+E20mMEGs6lUGDgeaQ+kCGALUHDhnURG0ddk6gAVhAwBx8CMxlAJm4pj3RuNJoEYQJh32B8XZIt1MLB9IwtF+DzSKnDOmZVE12RsyOEvhJh71NpSBA21rPSAT0hpL4XjWZcLrIZgjAoxg3IKYrmQOe7BkEY5oLhg+iwjK56XteMr3uGRDdnc3xIOoEA2ohGZyj+9BgEQ0gqCqUTvs+eakBg4aEcRbI3rYbjkURJE3isg5EDYGCMTRL4QPmOqqtRpFCFowpnqw0CcYJSAZFeioSTesihB4LByTK2EFDU+GESsYxwoo9SRhehpkRRBGkCq2mwuoenLuohkZnRDEWbp+m2fwGYsdYbG2OZhg6VZLl2dxvG6k5-k2YF+D3jAIm6PQ4mhdZBluXB0nXj5fmJa5Rl3IpKDKQlAXJXmyrqXhpkqkY9CrNISHBORlFmZVKDVUhDkcU1LUvqsnnsRVhhVT+SF8Dx4Z8X1A01XBwkYKJcVQONzWDSlYAydIC2dQKWpUEpJDrUtkLQjyfCpJwIDKGoHD+ru3zhmYPLEWIN4QGafEVIQJDkAAyupg5NP1W41mQb3aOxZjhHB6B6CA2Ayt6AL1BQAGgu09JAA\"},\"info\":{\"name\":\"dc-api\",\"description\":\"NUL Digital Collections API\",\"version\":\"2.9.4\",\"link_expiration\":null},\"aggregations\":{\"visibility\":{\"doc_count_error_upper_bound\":0,\"sum_other_doc_count\":0,\"buckets\":[{\"key\":\"Public\",\"doc_count\":96020}]},\"work_type\":{\"doc_count_error_upper_bound\":0,\"sum_other_doc_count\":0,\"buckets\":[{\"key\":\"Image\",\"doc_count\":96020}]},\"collection\":{\"doc_count_error_upper_bound\":244,\"sum_other_doc_count\":12385,\"buckets\":[{\"key\":\"Berkeley Folk Music Festival\",\"doc_count\":33354},{\"key\":\"E. H. Duckworth Photograph Collection\",\"doc_count\":12540},{\"key\":\"Rob Linrothe Image Collection\",\"doc_count\":8581},{\"key\":\"Jim Roberts Photographs\",\"doc_count\":3562},{\"key\":\"Posters from the Herskovits Library\",\"doc_count\":2530},{\"key\":\"Edward S. Curtis's The North American Indian\",\"doc_count\":2336},{\"key\":\"Ann C. Gunter Slide Collection\",\"doc_count\":2159},{\"key\":\"Collection of Carl Smith\",\"doc_count\":1990},{\"key\":\"University Theatre Study Photographs Collection\",\"doc_count\":1933},{\"key\":\"University Archives Nitrate Negative Collection\",\"doc_count\":1866},{\"key\":\"United States Army Base Hospital Number 12 World War I and II Records\",\"doc_count\":1775},{\"key\":\"George M. Foster Timetable Collection\",\"doc_count\":1764},{\"key\":\"Justine Cordwell Collection\",\"doc_count\":1394},{\"key\":\"Maher Ahmad (1950- ) Papers \",\"doc_count\":1367},{\"key\":\"The Humphrey Winterton Collection of East African Photographs: 1860-1960\",\"doc_count\":1153},{\"key\":\"Vernon McKay Photographs\",\"doc_count\":1138},{\"key\":\"Records of Northwestern University Black Alumni Association (NUBAA) \",\"doc_count\":1114},{\"key\":\"Ronald J. Sullivan Photograph Collection\",\"doc_count\":1113},{\"key\":\"Holly Clayson Slide Collection\",\"doc_count\":1002},{\"key\":\"Transportation Library Menu Collection\",\"doc_count\":964}]}}}" + }, + "redirectURL": "", + "headersSize": 1030, + "bodySize": 8195 + }, + "cache": {}, + "timings": { + "connect": -1.0, + "ssl": -1.0, + "send": 0.6651878356933594, + "receive": 0.6814002990722656, + "wait": 1359.6439361572266 + }, + "serverIPAddress": "52.86.120.219" + }, + { + "startedDateTime": "2026-03-19T21:42:30.653338+00:00", + "time": 106.00042343139648, + "request": { + "method": "POST", + "url": "https://api.dc.library.northwestern.edu/api/v2/search/works?page=1&size=5&visibility=public", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [ + { + "name": "host", + "value": "api.dc.library.northwestern.edu" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "accept", + "value": "*/*" + }, + { + "name": "accept-language", + "value": "*" + }, + { + "name": "sec-fetch-mode", + "value": "cors" + }, + { + "name": "user-agent", + "value": "node" + }, + { + "name": "accept-encoding", + "value": "br, gzip, deflate" + }, + { + "name": "content-length", + "value": "1172" + } + ], + "queryString": [ + { + "name": "page", + "value": "1" + }, + { + "name": "size", + "value": "5" + }, + { + "name": "visibility", + "value": "public" + } + ], + "headersSize": 305, + "bodySize": 1172, + "postData": { + "mimeType": "application/json", + "text": "{\"query\":{\"match_all\":{}},\"aggs\":{\"collection\":{\"terms\":{\"field\":\"collection.title.keyword\",\"size\":20}},\"work_type\":{\"terms\":{\"field\":\"work_type\",\"size\":3}},\"visibility\":{\"terms\":{\"field\":\"visibility\",\"size\":3}}},\"_source\":{\"includes\":[\"id\",\"title\",\"thumbnail\",\"collection.id\",\"collection.title\",\"description\",\"iiif_collection\",\"iiif_manifest\",\"visibility\"],\"excludes\":[\"batch_ids\",\"behavior\",\"box_name\",\"box_number\",\"catalog_key\",\"csv_metadata_update_jobs\",\"embedding\",\"embedding_model\",\"embedding_text_length\",\"folder_name\",\"folder_number\",\"ingest_project\",\"ingest_sheet\",\"legacy_identifier\",\"preservation_level\",\"project\",\"status\",\"terms_of_use\",\"contributor.facet\",\"creator.facet\",\"genre.facet\",\"language.facet\",\"location.facet\",\"style_period.facet\",\"subject.facet\",\"technique.facet\",\"contributor.label_with_role\",\"creator.label_with_role\",\"genre.label_with_role\",\"language.label_with_role\",\"location.label_with_role\",\"style_period.label_with_role\",\"subject.label_with_role\",\"technique.label_with_role\",\"contributor.variants\",\"creator.variants\",\"genre.variants\",\"language.variants\",\"location.variants\",\"style_period.variants\",\"subject.variants\",\"technique.variants\"]}}", + "params": [] + } + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + { + "name": "REDACTED", + "value": null, + "path": "/", + "domain": "", + "httpOnly": false, + "secure": false + } + ], + "headers": [ + { + "name": "Date", + "value": "Thu, 19 Mar 2026 21:42:30 GMT" + }, + { + "name": "Content-Type", + "value": "application/json; charset=UTF-8" + }, + { + "name": "Content-Length", + "value": "7364" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "access-control-allow-credentials", + "value": "true" + }, + { + "name": "access-control-expose-headers", + "value": "Cache-Control, Content-Language, Content-Length, Content-Type, Date, ETag, Expires, Last-Modified, Pragma" + }, + { + "name": "access-control-max-age", + "value": "600" + }, + { + "name": "etag", + "value": "5b5ea51fd709864155f12407804b114b" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "access-control-allow-headers", + "value": "Accept, Accept-Charset, Accept-Encoding, Accept-Language, Accept-Datetime, Authorization, Cache-Control, Content-Length, Content-Type, Cookie, Date, Expect, Host, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Origin, Pragma, Range, Referer, User-Agent, X-CSRF-Token, X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Port, X-Requested-With" + }, + { + "name": "access-control-allow-methods", + "value": "POST, GET, HEAD, OPTIONS" + }, + { + "name": "set-cookie", + "value": "REDACTED" + }, + { + "name": "Apigw-Requestid", + "value": "afYXGiU9oAMEPNg=" + } + ], + "content": { + "size": 7364, + "compression": 0, + "mimeType": "application/json; charset=UTF-8", + "text": "{\"data\":[{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/0b870149-ae30-44b8-b37e-cf52d3fda05e/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/0b870149-ae30-44b8-b37e-cf52d3fda05e?as=iiif\",\"description\":[],\"id\":\"0b870149-ae30-44b8-b37e-cf52d3fda05e\",\"collection\":{\"id\":\"76d3e313-531b-48b2-aa3f-96680569e50f\",\"title\":\"Glass Lantern Slides, Records of the Art History Department\"},\"title\":\"Dessau, Germany. Housing with balcony.\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/dd16397f-c5c6-4091-936e-ac697cf885a6/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/dd16397f-c5c6-4091-936e-ac697cf885a6?as=iiif\",\"description\":[],\"id\":\"dd16397f-c5c6-4091-936e-ac697cf885a6\",\"collection\":{\"id\":\"76d3e313-531b-48b2-aa3f-96680569e50f\",\"title\":\"Glass Lantern Slides, Records of the Art History Department\"},\"title\":\"Lomma, Sweden. Power lines. Northwestern faculty William Charles Bauer.\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/6621bc9a-5ea7-4ed5-b5a2-bc9ef036d32e/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/6621bc9a-5ea7-4ed5-b5a2-bc9ef036d32e?as=iiif\",\"description\":[],\"id\":\"6621bc9a-5ea7-4ed5-b5a2-bc9ef036d32e\",\"collection\":{\"id\":\"76d3e313-531b-48b2-aa3f-96680569e50f\",\"title\":\"Glass Lantern Slides, Records of the Art History Department\"},\"title\":\"Tangier, Morocco. Street scene.\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/c0856b75-02d1-4039-99f7-6a4415a00a0c/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/c0856b75-02d1-4039-99f7-6a4415a00a0c?as=iiif\",\"description\":[],\"id\":\"c0856b75-02d1-4039-99f7-6a4415a00a0c\",\"collection\":{\"id\":\"55ff2504-dd53-4943-b2cb-aeea46e77bc3\",\"title\":\"Edward S. Curtis's The North American Indian\"},\"title\":\"In Memory of Mr. J. Pierpont Morgan\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/04257934-6a45-4842-9d07-fb7c2c1f98bb/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/04257934-6a45-4842-9d07-fb7c2c1f98bb?as=iiif\",\"description\":[],\"id\":\"04257934-6a45-4842-9d07-fb7c2c1f98bb\",\"collection\":{\"id\":\"4e9ed062-fc73-40ba-9514-2537eeae4c38\",\"title\":\"La Caricature (1880-1893, 1899; Albert Robida, founding editor)\"},\"title\":\"La Caricature, no 23 (5 juin 1880), cover\"}],\"pagination\":{\"query_url\":\"https://api.dc.library.northwestern.edu/api/v2/search/works?searchToken=N4IgRg9gJgniBcoDOBLAXgUwQVgDQgEcBXDAJzkRAFsBDAFwGMALAfRoBt2FgBfH-FkghFSDLJRQA7BuyJQMSBAG0QKKCHx0Uddlk1MiVMJJoou%2BBhE4YGWiJIB0ajSEvXbKew6069IeUgMpCgADnaSLihRAGYsbroe9pExLLSSKNEKdC4AbiioYGbacAC6%2BBgAHjJyCsrg9Mwsaor4YBhMNHkQpC6QFSwmVH59A4ZtPRb0HBAA5iwA1hhwFkg5qRh0NFBTLEQh23QYLABWEGAtIBhGGFBQUjMuV22396nQGOaX1y%2BSc4cVdBYul%2BdCYLmiVnkpAGNCG4MhZFG1wmql%2BWRYIVIEGONmy%2BHu6KQTAwGxcuhmNAYMCa8kkWmiKDILkxCjIOXonkkQIwOQ%2BzKxONsLiQmzoRAuh1IVCQLAgsXFfksdOCYCIdG6DmilNJFlIGHoGq1YjxIBmGEkes12pN7BovyINDNVuNZIgDA5XiNOpAIpgugxZE8UGd3qQRDAgroIZNh2Y6WIGGjLiVdBVao1tra7BYAHdtKwsbpk3qDaQHJmPrn8yxC34zRbExXs3nQTWrH5bfbHY2aFmq63a673eFy73Ky2C%2B3hXQ-UcQoHoKO%2BxO20X8GGI7il%2BPq4PNDYmPGSNvm7upxZ7KmUKr1WX2cE7XQLkF9beHPeUI%2BLvXLR%2Bv2S7RmB0nT-OkLnYN0PUcUCn2nWcA2CRcYIuDdI3fGgHzAlxY0PFAE3QzDYJKPh8Cod52EUeAVBzbp5kUMoQAhKV6AQfwMC1Ih2BNCAwk5SjQATcgAGUr1%2BAAFDDYQ2Mh%2BJAEJu1YgBGYV0HEEBsFyfJryKGdWJCcN2BQBgQD4HggA&page=1&size=5&visibility=public\",\"current_page\":1,\"limit\":5,\"offset\":0,\"total_hits\":97604,\"total_pages\":19521,\"format\":\"default\",\"next_url\":\"https://api.dc.library.northwestern.edu/api/v2/search/works?searchToken=N4IgRg9gJgniBcoDOBLAXgUwQVgDQgEcBXDAJzkRAFsBDAFwGMALAfRoBt2FgBfH-FkghFSDLJRQA7BuyJQMSBAG0QKKCHx0Uddlk1MiVMJJoou%2BBhE4YGWiJIB0ajSEvXbKew6069IeUgMpCgADnaSLihRAGYsbroe9pExLLSSKNEKdC4AbiioYGbacAC6%2BBgAHjJyCsrg9Mwsaor4YBhMNHkQpC6QFSwmVH59A4ZtPRb0HBAA5iwA1hhwFkg5qRh0NFBTLEQh23QYLABWEGAtIBhGGFBQUjMuV22396nQGOaX1y%2BSc4cVdBYul%2BdCYLmiVnkpAGNCG4MhZFG1wmql%2BWRYIVIEGONmy%2BHu6KQTAwGxcuhmNAYMCa8kkWmiKDILkxCjIOXonkkQIwOQ%2BzKxONsLiQmzoRAuh1IVCQLAgsXFfksdOCYCIdG6DmilNJFlIGHoGq1YjxIBmGEkes12pN7BovyINDNVuNZIgDA5XiNOpAIpgugxZE8UGd3qQRDAgroIZNh2Y6WIGGjLiVdBVao1tra7BYAHdtKwsbpk3qDaQHJmPrn8yxC34zRbExXs3nQTWrH5bfbHY2aFmq63a673eFy73Ky2C%2B3hXQ-UcQoHoKO%2BxO20X8GGI7il%2BPq4PNDYmPGSNvm7upxZ7KmUKr1WX2cE7XQLkF9beHPeUI%2BLvXLR%2Bv2S7RmB0nT-OkLnYN0PUcUCn2nWcA2CRcYIuDdI3fGgHzAlxY0PFAE3QzDYJKPh8Cod52EUeAVBzbp5kUMoQAhKV6AQfwMC1Ih2BNCAwk5SjQATcgAGUr1%2BAAFDDYQ2Mh%2BJAEJu1YgBGYV0HEEBsFyfJryKGdWJCcN2BQBgQD4HggA&page=2&size=5&visibility=public\",\"search_token\":\"N4IgRg9gJgniBcoDOBLAXgUwQVgDQgEcBXDAJzkRAFsBDAFwGMALAfRoBt2FgBfH-FkghFSDLJRQA7BuyJQMSBAG0QKKCHx0Uddlk1MiVMJJoou+BhE4YGWiJIB0ajSEvXbKew6069IeUgMpCgADnaSLihRAGYsbroe9pExLLSSKNEKdC4AbiioYGbacAC6+BgAHjJyCsrg9Mwsaor4YBhMNHkQpC6QFSwmVH59A4ZtPRb0HBAA5iwA1hhwFkg5qRh0NFBTLEQh23QYLABWEGAtIBhGGFBQUjMuV22396nQGOaX1y+Sc4cVdBYul+dCYLmiVnkpAGNCG4MhZFG1wmql+WRYIVIEGONmy+Hu6KQTAwGxcuhmNAYMCa8kkWmiKDILkxCjIOXonkkQIwOQ+zKxONsLiQmzoRAuh1IVCQLAgsXFfksdOCYCIdG6DmilNJFlIGHoGq1YjxIBmGEkes12pN7BovyINDNVuNZIgDA5XiNOpAIpgugxZE8UGd3qQRDAgroIZNh2Y6WIGGjLiVdBVao1tra7BYAHdtKwsbpk3qDaQHJmPrn8yxC34zRbExXs3nQTWrH5bfbHY2aFmq63a673eFy73Ky2C+3hXQ-UcQoHoKO+xO20X8GGI7il+Pq4PNDYmPGSNvm7upxZ7KmUKr1WX2cE7XQLkF9beHPeUI+LvXLR+v2S7RmB0nT-OkLnYN0PUcUCn2nWcA2CRcYIuDdI3fGgHzAlxY0PFAE3QzDYJKPh8Cod52EUeAVBzbp5kUMoQAhKV6AQfwMC1Ih2BNCAwk5SjQATcgAGUr1+AAFDDYQ2Mh+JAEJu1YgBGYV0HEEBsFyfJryKGdWJCcN2BQBgQD4HggA\"},\"info\":{\"name\":\"dc-api\",\"description\":\"NUL Digital Collections API\",\"version\":\"2.9.4\",\"link_expiration\":null},\"aggregations\":{\"visibility\":{\"doc_count_error_upper_bound\":0,\"sum_other_doc_count\":0,\"buckets\":[{\"key\":\"Public\",\"doc_count\":97604}]},\"work_type\":{\"doc_count_error_upper_bound\":0,\"sum_other_doc_count\":0,\"buckets\":[{\"key\":\"Image\",\"doc_count\":96020},{\"key\":\"Audio\",\"doc_count\":1144},{\"key\":\"Video\",\"doc_count\":440}]},\"collection\":{\"doc_count_error_upper_bound\":276,\"sum_other_doc_count\":13942,\"buckets\":[{\"key\":\"Berkeley Folk Music Festival\",\"doc_count\":33381},{\"key\":\"E. H. Duckworth Photograph Collection\",\"doc_count\":12540},{\"key\":\"Rob Linrothe Image Collection\",\"doc_count\":8581},{\"key\":\"Jim Roberts Photographs\",\"doc_count\":3562},{\"key\":\"Posters from the Herskovits Library\",\"doc_count\":2530},{\"key\":\"Edward S. Curtis's The North American Indian\",\"doc_count\":2336},{\"key\":\"Ann C. Gunter Slide Collection\",\"doc_count\":2159},{\"key\":\"Collection of Carl Smith\",\"doc_count\":1990},{\"key\":\"University Theatre Study Photographs Collection\",\"doc_count\":1933},{\"key\":\"University Archives Nitrate Negative Collection\",\"doc_count\":1866},{\"key\":\"United States Army Base Hospital Number 12 World War I and II Records\",\"doc_count\":1775},{\"key\":\"George M. Foster Timetable Collection\",\"doc_count\":1764},{\"key\":\"Justine Cordwell Collection\",\"doc_count\":1394},{\"key\":\"Maher Ahmad (1950- ) Papers \",\"doc_count\":1367},{\"key\":\"The Humphrey Winterton Collection of East African Photographs: 1860-1960\",\"doc_count\":1153},{\"key\":\"Vernon McKay Photographs\",\"doc_count\":1138},{\"key\":\"Records of Northwestern University Black Alumni Association (NUBAA) \",\"doc_count\":1114},{\"key\":\"Ronald J. Sullivan Photograph Collection\",\"doc_count\":1113},{\"key\":\"Holly Clayson Slide Collection\",\"doc_count\":1002},{\"key\":\"Transportation Library Menu Collection\",\"doc_count\":964}]}}}" + }, + "redirectURL": "", + "headersSize": 1030, + "bodySize": 7364 + }, + "cache": {}, + "timings": { + "connect": -1.0, + "ssl": -1.0, + "send": 0.6945133209228516, + "receive": 1.7075538635253906, + "wait": 103.59835624694824 + }, + "serverIPAddress": "52.86.120.219" + }, + { + "startedDateTime": "2026-03-19T21:42:30.765555+00:00", + "time": 1811.8531703948975, + "request": { + "method": "POST", + "url": "https://api.dc.library.northwestern.edu/api/v2/search/works?page=1&size=1&visibility=public", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [ + { + "name": "host", + "value": "api.dc.library.northwestern.edu" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "accept", + "value": "*/*" + }, + { + "name": "accept-language", + "value": "*" + }, + { + "name": "sec-fetch-mode", + "value": "cors" + }, + { + "name": "user-agent", + "value": "node" + }, + { + "name": "accept-encoding", + "value": "br, gzip, deflate" + }, + { + "name": "content-length", + "value": "1218" + } + ], + "queryString": [ + { + "name": "page", + "value": "1" + }, + { + "name": "size", + "value": "1" + }, + { + "name": "visibility", + "value": "public" + } + ], + "headersSize": 305, + "bodySize": 1218, + "postData": { + "mimeType": "application/json", + "text": "{\"query\":{\"neural\":{\"embedding\":{\"query_text\":\"Northwestern\",\"k\":100}}},\"aggs\":{\"collection\":{\"terms\":{\"field\":\"collection.title.keyword\",\"size\":20}},\"work_type\":{\"terms\":{\"field\":\"work_type\",\"size\":3}},\"visibility\":{\"terms\":{\"field\":\"visibility\",\"size\":3}}},\"_source\":{\"includes\":[\"id\",\"title\",\"thumbnail\",\"collection.id\",\"collection.title\",\"description\",\"iiif_collection\",\"iiif_manifest\",\"visibility\"],\"excludes\":[\"batch_ids\",\"behavior\",\"box_name\",\"box_number\",\"catalog_key\",\"csv_metadata_update_jobs\",\"embedding\",\"embedding_model\",\"embedding_text_length\",\"folder_name\",\"folder_number\",\"ingest_project\",\"ingest_sheet\",\"legacy_identifier\",\"preservation_level\",\"project\",\"status\",\"terms_of_use\",\"contributor.facet\",\"creator.facet\",\"genre.facet\",\"language.facet\",\"location.facet\",\"style_period.facet\",\"subject.facet\",\"technique.facet\",\"contributor.label_with_role\",\"creator.label_with_role\",\"genre.label_with_role\",\"language.label_with_role\",\"location.label_with_role\",\"style_period.label_with_role\",\"subject.label_with_role\",\"technique.label_with_role\",\"contributor.variants\",\"creator.variants\",\"genre.variants\",\"language.variants\",\"location.variants\",\"style_period.variants\",\"subject.variants\",\"technique.variants\"]}}", + "params": [] + } + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + { + "name": "REDACTED", + "value": null, + "path": "/", + "domain": "", + "httpOnly": false, + "secure": false + } + ], + "headers": [ + { + "name": "Date", + "value": "Thu, 19 Mar 2026 21:42:32 GMT" + }, + { + "name": "Content-Type", + "value": "application/json; charset=UTF-8" + }, + { + "name": "Content-Length", + "value": "5373" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "access-control-allow-credentials", + "value": "true" + }, + { + "name": "access-control-expose-headers", + "value": "Cache-Control, Content-Language, Content-Length, Content-Type, Date, ETag, Expires, Last-Modified, Pragma" + }, + { + "name": "access-control-max-age", + "value": "600" + }, + { + "name": "etag", + "value": "df38d3894d23764cd4cc82b6c17bd93e" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "access-control-allow-headers", + "value": "Accept, Accept-Charset, Accept-Encoding, Accept-Language, Accept-Datetime, Authorization, Cache-Control, Content-Length, Content-Type, Cookie, Date, Expect, Host, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Origin, Pragma, Range, Referer, User-Agent, X-CSRF-Token, X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Port, X-Requested-With" + }, + { + "name": "access-control-allow-methods", + "value": "POST, GET, HEAD, OPTIONS" + }, + { + "name": "set-cookie", + "value": "REDACTED" + }, + { + "name": "Apigw-Requestid", + "value": "afYXHiuOoAMEPpg=" + } + ], + "content": { + "size": 5373, + "compression": 0, + "mimeType": "application/json; charset=UTF-8", + "text": "{\"data\":[{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/c423c63f-290d-4fdb-879b-8b5813b1f94c/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/c423c63f-290d-4fdb-879b-8b5813b1f94c?as=iiif\",\"description\":[\"Northwestern University Marching Band performs at the Northwestern Wildcats' game against the Ohio State Buckeyes Gophers in Columbus, Ohio. The pregame performances include the Ohio State Fight Song and \\\"Go U Northwestern.\\\" Halftime performances include \\\"William Tell Overture (Theme from the Lone Ranger),\\\" \\\"April in Paris,\\\" \\\"Maxwell's Silver Hammer,\\\" and \\\"I've Got Rhythm.\\\"\"],\"id\":\"c423c63f-290d-4fdb-879b-8b5813b1f94c\",\"collection\":{\"id\":\"46f5d57a-bb83-4b58-bdc7-befa4b2498a9\",\"title\":\"Northwestern University Marching Band\"},\"title\":\"Northwestern vs. Ohio State\"}],\"pagination\":{\"query_url\":\"https://api.dc.library.northwestern.edu/api/v2/search/works?searchToken=N4IgRg9gJgniBcoDOBLAXgUwQRgDQgEcBXDAJzkRADsMjSBDAGwVAwFswMooUqBzFoRLkA%2BgBcMADzEIQAOQikxACwDuGJBNJUQ%2BANY4ADIfwAzFIy2DIEZpXOWyCANqgtbJIIAORMIxRIylwuYqQkALoAvpG4bmQeggBuAShgFihiFM4gAAq%2B-gDGIFGRJfhs0BiMIihQsgDyhkQAEgBqAKwAogBCiQBiAKrNpKbd2ACCaACSAyDRMSAiSBB0BViUvAWMRFAaLiC1uiBiGYxY%2BCpEHFT0FkcFtmcFJxBUAHSH%2BA%2BMTy-vJ2IzkddkgCqQUF4-kcUDDTCJvr8UK9obCRGx6FQUKYNDJ8MlUGl-JlivgpFsdnt4NkwPQxAVlDUoJ58JxlPRkoojpBJCIbmxzuAIDyqFdOKR7rSmBA%2BCI9Bg4F8kIk0RgxPQoJKREQvBqJCIAFYQMDMkDsTjcXgCUkcLg8fhoyrMa3mu0yiTSERnfgqI6mWy7Ui8%2Bj833%2Bsi80VOfCWnEiLykCD6jDPaH8WOBDCqo5nPj0AowRkYKgncxRkDxjRkRK0pFUT0YRJVI7xxPJ3EgTS0ogm9xIEQQOHdgUPYvgsBEMSKN6mPNZr6kDC0qcztbtvhFhfT2ftxgYvhEejrrer7MQAo117HucdzJnONkJFQK-tpC%2BJPPZ9HCT0zHEDCfr5XlCVIJynXdOGqVQMgZBMgXnRdJ1IN5wKqEQoJUERYIFdcqE3FDIOgzDbAFXd%2BAPI98LQwisNPc8-mQ%2BgIKojCaPwTQYDvLwH2gBimPQmDiKOV8wHfMReNQ-iiLg45k2UX8SHEgiWMEwDRxAxC3mrcEMTEE0wQQqctJQHSTRwzcjJM7M93I-8LOLE1GDPC93js3ShNvDB73BHjXJNYTRM0%2BhtPsr9ZPk2yguMkKyhACpdkYTwqRAVRFD0TxwjMRR0RkeAQF2GciEsI4IEhWtEtAP9yAAZWA-gciC4NVTIcry0PdYQGwIT0Hazq8RSQkMgoct8hQIp5iAA&page=1&size=1&visibility=public\",\"current_page\":1,\"limit\":1,\"offset\":0,\"total_hits\":500,\"total_pages\":500,\"format\":\"default\",\"next_url\":\"https://api.dc.library.northwestern.edu/api/v2/search/works?searchToken=N4IgRg9gJgniBcoDOBLAXgUwQRgDQgEcBXDAJzkRADsMjSBDAGwVAwFswMooUqBzFoRLkA%2BgBcMADzEIQAOQikxACwDuGJBNJUQ%2BANY4ADIfwAzFIy2DIEZpXOWyCANqgtbJIIAORMIxRIylwuYqQkALoAvpG4bmQeggBuAShgFihiFM4gAAq%2B-gDGIFGRJfhs0BiMIihQsgDyhkQAEgBqAKwAogBCiQBiAKrNpKbd2ACCaACSAyDRMSAiSBB0BViUvAWMRFAaLiC1uiBiGYxY%2BCpEHFT0FkcFtmcFJxBUAHSH%2BA%2BMTy-vJ2IzkddkgCqQUF4-kcUDDTCJvr8UK9obCRGx6FQUKYNDJ8MlUGl-JlivgpFsdnt4NkwPQxAVlDUoJ58JxlPRkoojpBJCIbmxzuAIDyqFdOKR7rSmBA%2BCI9Bg4F8kIk0RgxPQoJKREQvBqJCIAFYQMDMkDsTjcXgCUkcLg8fhoyrMa3mu0yiTSERnfgqI6mWy7Ui8%2Bj833%2Bsi80VOfCWnEiLykCD6jDPaH8WOBDCqo5nPj0AowRkYKgncxRkDxjRkRK0pFUT0YRJVI7xxPJ3EgTS0ogm9xIEQQOHdgUPYvgsBEMSKN6mPNZr6kDC0qcztbtvhFhfT2ftxgYvhEejrrer7MQAo117HucdzJnONkJFQK-tpC%2BJPPZ9HCT0zHEDCfr5XlCVIJynXdOGqVQMgZBMgXnRdJ1IN5wKqEQoJUERYIFdcqE3FDIOgzDbAFXd%2BAPI98LQwisNPc8-mQ%2BgIKojCaPwTQYDvLwH2gBimPQmDiKOV8wHfMReNQ-iiLg45k2UX8SHEgiWMEwDRxAxC3mrcEMTEE0wQQqctJQHSTRwzcjJM7M93I-8LOLE1GDPC93js3ShNvDB73BHjXJNYTRM0%2BhtPsr9ZPk2yguMkKyhACpdkYTwqRAVRFD0TxwjMRR0RkeAQF2GciEsI4IEhWtEtAP9yAAZWA-gciC4NVTIcry0PdYQGwIT0Hazq8RSQkMgoct8hQIp5iAA&page=2&size=1&visibility=public\",\"search_token\":\"N4IgRg9gJgniBcoDOBLAXgUwQRgDQgEcBXDAJzkRADsMjSBDAGwVAwFswMooUqBzFoRLkA+gBcMADzEIQAOQikxACwDuGJBNJUQ+ANY4ADIfwAzFIy2DIEZpXOWyCANqgtbJIIAORMIxRIylwuYqQkALoAvpG4bmQeggBuAShgFihiFM4gAAq+-gDGIFGRJfhs0BiMIihQsgDyhkQAEgBqAKwAogBCiQBiAKrNpKbd2ACCaACSAyDRMSAiSBB0BViUvAWMRFAaLiC1uiBiGYxY+CpEHFT0FkcFtmcFJxBUAHSH+A+MTy-vJ2IzkddkgCqQUF4-kcUDDTCJvr8UK9obCRGx6FQUKYNDJ8MlUGl-JlivgpFsdnt4NkwPQxAVlDUoJ58JxlPRkoojpBJCIbmxzuAIDyqFdOKR7rSmBA+CI9Bg4F8kIk0RgxPQoJKREQvBqJCIAFYQMDMkDsTjcXgCUkcLg8fhoyrMa3mu0yiTSERnfgqI6mWy7Ui8+j833+si80VOfCWnEiLykCD6jDPaH8WOBDCqo5nPj0AowRkYKgncxRkDxjRkRK0pFUT0YRJVI7xxPJ3EgTS0ogm9xIEQQOHdgUPYvgsBEMSKN6mPNZr6kDC0qcztbtvhFhfT2ftxgYvhEejrrer7MQAo117HucdzJnONkJFQK-tpC+JPPZ9HCT0zHEDCfr5XlCVIJynXdOGqVQMgZBMgXnRdJ1IN5wKqEQoJUERYIFdcqE3FDIOgzDbAFXd+API98LQwisNPc8-mQ+gIKojCaPwTQYDvLwH2gBimPQmDiKOV8wHfMReNQ-iiLg45k2UX8SHEgiWMEwDRxAxC3mrcEMTEE0wQQqctJQHSTRwzcjJM7M93I-8LOLE1GDPC93js3ShNvDB73BHjXJNYTRM0+htPsr9ZPk2yguMkKyhACpdkYTwqRAVRFD0TxwjMRR0RkeAQF2GciEsI4IEhWtEtAP9yAAZWA-gciC4NVTIcry0PdYQGwIT0Hazq8RSQkMgoct8hQIp5iAA\"},\"info\":{\"name\":\"dc-api\",\"description\":\"NUL Digital Collections API\",\"version\":\"2.9.4\",\"link_expiration\":null},\"aggregations\":{\"visibility\":{\"doc_count_error_upper_bound\":0,\"sum_other_doc_count\":0,\"buckets\":[{\"key\":\"Public\",\"doc_count\":500}]},\"work_type\":{\"doc_count_error_upper_bound\":0,\"sum_other_doc_count\":0,\"buckets\":[{\"key\":\"Image\",\"doc_count\":447},{\"key\":\"Video\",\"doc_count\":52},{\"key\":\"Audio\",\"doc_count\":1}]},\"collection\":{\"doc_count_error_upper_bound\":0,\"sum_other_doc_count\":0,\"buckets\":[{\"key\":\"University Archives Nitrate Negative Collection\",\"doc_count\":388},{\"key\":\"Jim Roberts Photographs\",\"doc_count\":42},{\"key\":\"Northwestern University Marching Band\",\"doc_count\":37},{\"key\":\"Athletic Department Football Films\",\"doc_count\":15},{\"key\":\"Northwestern Community Ensemble (NCE)\",\"doc_count\":9},{\"key\":\"Records of Northwestern University Black Alumni Association (NUBAA) \",\"doc_count\":7},{\"key\":\"Northwestern University Libraries\",\"doc_count\":1},{\"key\":\"University Archives Postcards\",\"doc_count\":1}]}}}" + }, + "redirectURL": "", + "headersSize": 1030, + "bodySize": 5373 + }, + "cache": {}, + "timings": { + "connect": -1.0, + "ssl": -1.0, + "send": 0.6196498870849609, + "receive": 0.6399154663085938, + "wait": 1810.593605041504 + }, + "serverIPAddress": "52.86.120.219" + }, + { + "startedDateTime": "2026-03-19T21:42:32.588389+00:00", + "time": 129.4419765472412, + "request": { + "method": "GET", + "url": "https://api.dc.library.northwestern.edu/api/v2/works/6464c86a-29e0-4aeb-ac5c-8e1c9bb0dfc2", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [ + { + "name": "host", + "value": "api.dc.library.northwestern.edu" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "name": "accept", + "value": "*/*" + }, + { + "name": "accept-language", + "value": "*" + }, + { + "name": "sec-fetch-mode", + "value": "cors" + }, + { + "name": "user-agent", + "value": "node" + }, + { + "name": "accept-encoding", + "value": "br, gzip, deflate" + } + ], + "queryString": [], + "headersSize": 235, + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + { + "name": "REDACTED", + "value": null, + "path": "/", + "domain": "", + "httpOnly": false, + "secure": false + } + ], + "headers": [ + { + "name": "Date", + "value": "Thu, 19 Mar 2026 21:42:32 GMT" + }, + { + "name": "Content-Type", + "value": "application/json; charset=UTF-8" + }, + { + "name": "Content-Length", + "value": "18501" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "etag", + "value": "749d24496c24ff5ddff22a8b7ef550ef" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "access-control-allow-headers", + "value": "Accept, Accept-Charset, Accept-Encoding, Accept-Language, Accept-Datetime, Authorization, Cache-Control, Content-Length, Content-Type, Cookie, Date, Expect, Host, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Origin, Pragma, Range, Referer, User-Agent, X-CSRF-Token, X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Port, X-Requested-With" + }, + { + "name": "access-control-allow-methods", + "value": "POST, GET, HEAD, OPTIONS" + }, + { + "name": "access-control-allow-credentials", + "value": "true" + }, + { + "name": "access-control-expose-headers", + "value": "Cache-Control, Content-Language, Content-Length, Content-Type, Date, ETag, Expires, Last-Modified, Pragma" + }, + { + "name": "access-control-max-age", + "value": "600" + }, + { + "name": "set-cookie", + "value": "REDACTED" + }, + { + "name": "Apigw-Requestid", + "value": "afYXZjMwoAMEZsA=" + } + ], + "content": { + "size": 18501, + "compression": 0, + "mimeType": "application/json; charset=UTF-8", + "text": "{\"data\":{\"notes\":[{\"type\":\"General Note\",\"note\":\"Courtesy of Northwestern University Archives, George S. Duntley Photographs\"}],\"keywords\":[\"CCC\"],\"subject\":[{\"variants\":[\"Estado de Illinois\",\"\u02bbIlinoe\",\"Ilinoi\",\"Ilino\u012ds\",\"Ilinojso\",\"Il\u012bn\u016by\",\"Illinoi\",\"Illinoi-ju\",\"Illinoiju\",\"Illinois suyu\",\"Illinoys\",\"Ill\u012bn\u016by\",\"Politeia tou Ilinoi\",\"Shtat Ilino\u012ds\",\"State of Illinois\",\"T\u00f3 Nitsaa N\u00edl\u012f\u0301b\u0105\u0105h Hahoodzo\",\"Y\u00ee-li-n\u00f2\"],\"label\":\"Illinois\",\"id\":\"http://id.worldcat.org/fast/1205143\",\"role\":\"Geographical\",\"facet\":\"http://id.worldcat.org/fast/1205143|GEOGRAPHICAL|Illinois (Geographical)\",\"label_with_role\":\"Illinois (Geographical)\"}],\"related_url\":[{\"url\":\"https://findingaids.library.northwestern.edu/repositories/6/resources/1245\",\"label\":\"Finding Aid\"}],\"caption\":[],\"project\":{\"manager\":\"Nicole Finzer\",\"proposer\":\"Kevin Leonard\",\"name\":\"Duntley Photographs\",\"task_number\":\"Job:11795\",\"cycle\":\"2016\",\"desc\":null},\"language\":[],\"source\":[],\"terms_of_use\":\"The images on this web site are from material in the collections of the University Archives of Northwestern University Libraries, are provided for use by its students, faculty and staff, and by other researchers visiting this site, for research consultation and scholarly purposes only. Further distribution and/or any commercial use of the images from this site is not permitted.\",\"ingest_sheet\":null,\"library_unit\":\"University Archives\",\"indexed_at\":\"2026-01-30T19:49:17.397087\",\"rights_statement\":{\"label\":\"In Copyright - Rights-holder(s) Unlocatable or Unidentifiable\",\"id\":\"http://rightsstatements.org/vocab/InC-RUU/1.0/\"},\"id\":\"6464c86a-29e0-4aeb-ac5c-8e1c9bb0dfc2\",\"create_date\":\"2021-03-16T03:00:22.136819Z\",\"batch_ids\":[\"03244047-83f3-41e2-bc9f-200feb1ee027\",\"12a489f9-65af-4e28-8a24-b88ec94cd329\",\"53ef99bb-37d6-415f-a37a-b5e380239ff4\"],\"identifier\":[\"Item:377\",\"75/31/30\"],\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/6464c86a-29e0-4aeb-ac5c-8e1c9bb0dfc2/thumbnail\",\"style_period\":[],\"box_number\":[\"8\"],\"visibility\":\"Public\",\"ingest_project\":null,\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/6464c86a-29e0-4aeb-ac5c-8e1c9bb0dfc2?as=iiif\",\"work_type\":\"Image\",\"folder_name\":[],\"collection\":{\"description\":\"The photographs of George S. Duntley fill 8 boxes and cover the years from approximately 1899-1918. The collection consists of dry plate negatives and record Duntley\u2019s years in Chicago and Evanston while he was attending Northwestern University Medical School. Also included are photographs taken in Bushnell, Illinois, his home town and surrounding areas.\",\"id\":\"450b857e-2e74-491e-9ef1-2c73e49f0c16\",\"title\":\"George Silas Duntley Photographs\"},\"published\":true,\"modified_date\":\"2024-05-15T16:12:51.126967Z\",\"accession_number\":\"Accession:duntley35835\",\"license\":null,\"date_created_edtf\":[\"1899/1918\"],\"physical_description_size\":[\"4 x 5 inches\"],\"publisher\":[],\"nav_place\":[],\"file_sets\":[{\"role\":\"Access\",\"streaming_url\":null,\"description\":null,\"label\":\"inu-dil-73e55658-2cd3-496b-83e7-a7231b521799.tif\",\"webvtt\":null,\"poster_offset\":null,\"duration\":null,\"accession_number\":\"Accession:duntley35835_donut_01\",\"original_filename\":\"inu-dil-73e55658-2cd3-496b-83e7-a7231b521799.tif\",\"group_with\":null,\"mime_type\":\"image/tiff\",\"download_url\":\"https://api.dc.library.northwestern.edu/api/v2/file-sets/4d083fe4-6267-4b7d-97db-65f77bace3a2/download\",\"width\":9569,\"rank\":0,\"id\":\"4d083fe4-6267-4b7d-97db-65f77bace3a2\",\"representative_image_url\":\"https://iiif.dc.library.northwestern.edu/iiif/3/4d083fe4-6267-4b7d-97db-65f77bace3a2\",\"height\":7642}],\"status\":\"Done\",\"catalog_key\":[],\"box_name\":[],\"embedding_model\":\"cohere.embed-multilingual-v3\",\"technique\":[],\"description\":[\"Description of box : Large cardboard box\"],\"csv_metadata_update_jobs\":[],\"title\":\"Unidentified men on baseball team with 'B' on uniforms standing or kneeling in field\",\"legacy_identifier\":[\"inu:dil-73e55658-2cd3-496b-83e7-a7231b521799\"],\"folder_number\":[],\"cultural_context\":[],\"embedding_text_length\":468,\"contributor\":[{\"variants\":[],\"label\":\"Duntley, George Silas\",\"id\":\"http://id.loc.gov/authorities/names/no2016168978\",\"role\":\"Photographer\",\"facet\":\"http://id.loc.gov/authorities/names/no2016168978|pht|Duntley, George Silas (Photographer)\",\"label_with_role\":\"Duntley, George Silas (Photographer)\"}],\"provenance\":[],\"genre\":[{\"variants\":[\"dry-plate negatives (gelatin silver negatives)\",\"placa seca (negativo)\",\"gelatin dry plate negative\",\"gelatin dry-plate negatives\",\"dry plate negatives, gelatin\",\"negatives, gelatin dry plate\",\"plate negatives, gelatin dry\",\"gelatin dry plate photonegatives\",\"gelatin dry-plate photonegatives\",\"gelatineplaatnegatief\",\"lastre alla gelatina secca\",\"negativi su lastra alla gelatina\",\"negativo de gelatina en placa seca\"],\"label\":\"gelatin dry plate negatives\",\"id\":\"http://vocab.getty.edu/aat/300134920\",\"facet\":\"http://vocab.getty.edu/aat/300134920||gelatin dry plate negatives\"}],\"api_link\":\"https://api.dc.library.northwestern.edu/api/v2/works/6464c86a-29e0-4aeb-ac5c-8e1c9bb0dfc2\",\"ark\":\"ark:/81985/n2ws8hv2s\",\"embedding\":[-0.015281677,-0.0039596558,-0.070251465,0.043395996,0.015716553,-0.011795044,0.04446411,-0.023239136,-0.0079422,0.013694763,0.022888184,-0.004360199,0.005241394,-0.018051147,0.011550903,-0.0024337769,-0.05429077,0.013755798,-0.0007805824,0.04550171,0.052124023,0.030822754,-0.048858643,0.014945984,-0.021850586,0.041931152,-0.011436462,-0.0072784424,0.010787964,-0.05392456,-0.013870239,-0.0021972656,0.07672119,0.042510986,-0.040527344,0.001660347,-0.015991211,-0.013137817,0.012573242,0.026367188,0.04058838,-0.0046157837,-0.05065918,0.00041866302,-0.078186035,0.023788452,0.039001465,0.052368164,0.033569336,0.026611328,0.0044288635,-0.027908325,0.018615723,-0.00012719631,0.025390625,-0.005519867,0.0012254715,0.024719238,0.055999756,0.012084961,0.021972656,0.015419006,-0.0116119385,0.0042152405,-0.0068130493,0.014381409,0.03314209,-0.023529053,0.038330078,0.014961243,-0.036987305,0.0046958923,0.0692749,0.024368286,0.08081055,-0.028518677,-0.016479492,0.011894226,0.0060653687,0.008087158,-0.018844604,0.021392822,-0.008285522,-0.0048065186,0.0385437,0.018295288,-0.0047950745,0.006252289,-0.017730713,0.08917236,-0.023864746,0.04269409,0.1149292,-0.024398804,0.0012264252,0.014350891,-0.010826111,0.011619568,0.0035209656,-0.0012111664,0.0033855438,-0.03567505,-0.017242432,0.01550293,0.09295654,0.03869629,0.050689697,-0.0067443848,-0.041503906,0.002937317,-0.009277344,-0.0038852692,0.023956299,0.0025138855,0.010482788,-0.008811951,-0.02973938,-0.0128479,-0.049072266,-0.02558899,-0.04296875,-0.018676758,0.008087158,0.020202637,0.00983429,-0.043945312,0.02319336,-0.029678345,-0.03250122,-0.031158447,-0.042907715,-0.034210205,-0.013725281,0.020355225,0.045135498,-0.044189453,0.042236328,-0.04940796,0.05166626,0.056121826,-0.03543091,0.011711121,-0.02178955,-0.03857422,-0.03189087,-0.014961243,0.050872803,0.017166138,0.032836914,-0.008972168,-0.020874023,0.047912598,0.008224487,-0.06500244,-0.0071868896,0.014167786,-0.017684937,0.020599365,0.019332886,-0.070129395,-0.028686523,-0.049438477,0.028060913,-0.03552246,0.0018959045,-0.033996582,0.025161743,0.005176544,0.0135650635,-0.01838684,0.032226562,-0.005859375,0.018203735,0.008964539,-0.014122009,-0.018951416,0.019714355,0.061187744,0.041259766,-0.011779785,0.032440186,-0.002866745,-0.0031528473,0.0019264221,0.021026611,-0.024749756,-0.010139465,0.0014953613,0.026885986,0.03414917,-0.044921875,0.006263733,-0.00983429,-0.04333496,-0.02999878,0.014953613,0.02394104,-0.008331299,-0.013336182,0.009689331,0.02897644,0.009796143,0.00030827522,0.020904541,-0.015411377,0.0013790131,0.030563354,0.031402588,-0.008422852,0.013999939,-0.009544373,0.006439209,0.011749268,-0.009490967,-0.00090265274,-0.0040512085,-0.006298065,-0.085632324,0.00037264824,-0.019744873,0.02909851,-0.013450623,0.026779175,0.055023193,-0.01360321,0.038970947,-0.013420105,-0.01927185,0.025512695,0.0008764267,0.012359619,0.020889282,0.06341553,-0.01473999,-0.0074310303,-0.020065308,-0.023239136,-0.042541504,-0.0059661865,-0.007129669,0.011253357,0.042053223,-0.002538681,-0.025390625,-0.040893555,-0.016448975,-0.039276123,-0.06994629,0.017913818,-0.0335083,0.010093689,0.019424438,-0.015777588,-0.003118515,0.04550171,0.010681152,0.02519226,0.0027923584,-0.0034046173,0.0008277893,-0.04257202,-0.040130615,0.018844604,0.008346558,0.0018482208,-0.0036182404,-0.011268616,-0.013549805,0.039215088,-0.012741089,-0.023223877,0.0046920776,-0.025848389,0.04324341,-0.018203735,0.004295349,-0.031311035,0.014625549,-0.04727173,0.044708252,0.011360168,0.016479492,0.018508911,-0.023498535,-0.03152466,-0.0033683777,0.037628174,0.016586304,0.01675415,-0.011810303,-0.060638428,-0.013290405,-0.04437256,0.046936035,0.0013713837,-0.007457733,0.0019426346,-0.0236969,-0.015464783,-0.0064888,0.011222839,-0.013305664,0.005935669,-0.030548096,-0.024398804,0.03677368,0.036499023,0.009002686,0.03289795,0.018859863,0.0014295578,0.013168335,-0.0030097961,-0.012718201,-0.00029063225,-0.042144775,0.01576233,-0.01889038,-0.0020942688,0.0317688,0.029403687,-0.05606079,-0.0070343018,-0.050201416,-0.011703491,0.07733154,-0.014434814,-0.0039520264,0.011566162,0.033569336,-0.001414299,-0.0071144104,0.0044517517,-0.01386261,0.0025138855,0.0012969971,0.010719299,-0.00066280365,0.040283203,-0.014411926,0.009971619,0.012550354,-0.015289307,-0.018585205,-0.015426636,0.016418457,0.021972656,-0.006164551,-0.015625,0.019500732,0.01525116,0.048797607,0.04196167,-0.052124023,0.04006958,-0.07434082,0.04547119,-0.0068206787,-0.014404297,0.039276123,0.0010414124,0.01737976,-0.025299072,0.06628418,0.00349617,-0.010910034,-0.044433594,-0.016662598,-0.0065841675,0.030212402,0.0025615692,-0.00007599592,0.031143188,0.0026168823,-0.028533936,0.027954102,-0.0034427643,0.001578331,-0.02949524,0.046081543,-0.024246216,0.011650085,-0.052764893,0.025772095,0.09503174,-0.018585205,-0.039764404,-0.009857178,0.092285156,0.07373047,0.0791626,0.04522705,0.01902771,-0.015174866,-0.009643555,-0.014709473,-0.041229248,0.002796173,-0.036956787,-0.030975342,0.097473145,-0.08483887,0.016784668,-0.05822754,0.02458191,0.054626465,-0.003545761,-0.014884949,-0.052856445,-0.048736572,0.00957489,0.026550293,-0.037902832,0.03652954,-0.064331055,0.026123047,-0.008628845,-0.011276245,-0.049560547,-0.005126953,-0.047180176,-0.087402344,-0.024597168,0.024261475,0.027755737,-0.013549805,0.025558472,0.034088135,0.04171753,0.019088745,-0.010040283,0.0003077984,-0.013626099,-0.02696228,-0.017120361,-0.014984131,0.0067443848,0.04776001,0.048583984,-0.059326172,0.019622803,0.05001831,-0.0061950684,0.0040512085,0.0096206665,0.010810852,0.046051025,0.038360596,0.028762817,0.016235352,0.008026123,0.0206604,0.019119263,-0.015945435,0.008605957,-0.021438599,-0.075805664,-0.046844482,-0.019592285,-0.012718201,-0.013572693,-0.0001257658,-0.0029754639,0.021957397,-0.032714844,0.0025577545,-0.026901245,-0.00064373016,0.003446579,-0.020065308,0.002981186,0.028320312,0.057556152,0.014694214,-0.0004196167,-0.08502197,-0.0211792,-0.010299683,-0.020355225,0.05847168,-0.050933838,-0.012161255,0.056793213,-0.012252808,-0.026184082,0.030899048,0.051971436,0.01423645,0.06060791,-0.07434082,-0.103881836,0.019104004,-0.036071777,0.030380249,-0.002231598,-0.020843506,0.011672974,-0.00881958,-0.006904602,-0.03387451,0.026275635,-0.0026931763,0.020263672,-0.011016846,-0.009895325,-0.019454956,-0.017959595,-0.033843994,0.0003502369,-0.047424316,0.0076026917,0.07421875,0.021881104,0.021148682,-0.0030174255,0.0025348663,0.027557373,-0.06707764,0.053771973,-0.06549072,0.02357483,0.04937744,0.017532349,0.01285553,-0.02432251,-0.008674622,0.00059747696,0.023468018,-0.07885742,0.010505676,-0.031066895,-0.03111267,-0.002325058,-0.019088745,-0.027008057,-0.11035156,0.025878906,0.041809082,0.029510498,0.02041626,0.045166016,0.0067253113,0.044006348,0.022476196,0.0059432983,-0.0003349781,-0.028259277,0.0021514893,-0.0143585205,0.02720642,-0.009307861,0.014350891,-0.01776123,-0.020721436,0.025543213,0.010185242,-0.0077590942,-0.006904602,0.00040960312,0.04107666,0.05316162,0.01474762,-0.014923096,0.06008911,0.018722534,-0.0552063,-0.00066280365,0.0034866333,0.013626099,-0.033477783,0.035614014,0.03012085,0.027267456,-0.00036621094,-0.0039100647,-0.0075950623,0.078063965,-0.016921997,-0.01940918,-0.026290894,0.006450653,-0.0063667297,0.014984131,-0.006313324,-0.01928711,-0.010528564,-0.01071167,-0.014862061,0.013908386,0.009857178,0.017303467,-0.02003479,-0.026748657,-0.015579224,-0.063964844,0.06463623,0.01965332,0.009864807,0.0036392212,0.007987976,-0.00080156326,0.02519226,-0.008796692,0.013656616,-0.00381279,0.010932922,0.046936035,-0.013374329,-0.0060310364,-0.04876709,0.0209198,-0.013320923,0.018112183,0.023864746,0.0068626404,-0.01965332,0.027130127,-0.004085541,0.037139893,-0.01676941,0.016159058,-0.08331299,0.017440796,0.045776367,0.020111084,-0.021270752,-0.055877686,-0.0003285408,-0.020477295,-0.020431519,-0.05709839,-0.000729084,0.01109314,-0.029968262,-0.02671814,-0.04748535,-0.0064048767,-0.035095215,0.004699707,-0.011024475,0.014701843,0.021240234,0.02381897,0.002866745,-0.019515991,-0.005241394,-0.022216797,-0.0013713837,0.011245728,0.07019043,-0.0519104,0.07006836,0.10961914,-0.09649658,0.050933838,-0.025863647,-0.008163452,-0.019973755,0.012756348,-0.009590149,0.013008118,-0.0064697266,-0.015007019,-0.041381836,0.007183075,-0.0025024414,-0.025909424,0.0031394958,0.016525269,-0.045684814,0.025299072,-0.012031555,0.0143585205,0.03781128,0.072631836,0.0082092285,-0.055633545,0.050842285,-0.017959595,0.0057373047,0.028366089,0.03302002,-0.007949829,-0.025817871,0.030700684,0.015838623,0.009819031,0.050842285,-0.011703491,-0.009155273,-0.004005432,0.032836914,0.028793335,-0.0016317368,-0.002779007,0.03387451,0.007926941,-0.047424316,-0.031982422,0.035217285,-0.06311035,0.07141113,0.03729248,0.015205383,-0.012535095,-0.016983032,0.039123535,-0.022720337,-0.010971069,0.010902405,0.014831543,-0.0036087036,-0.020599365,-0.0015773773,0.009101868,-0.0015106201,0.001329422,0.01184845,-0.02418518,0.024993896,0.028915405,-0.015853882,-0.022018433,-0.033996582,0.016662598,0.010314941,0.029922485,0.00019681454,-0.0519104,-0.008598328,-0.061462402,-0.008293152,-0.01083374,-0.016448975,-0.045715332,-0.008140564,-0.0025348663,-0.014511108,0.040008545,0.014099121,0.0068740845,0.00957489,-0.04232788,-0.032592773,-0.011306763,0.0079956055,-0.010810852,0.016921997,-0.042266846,-0.0019721985,0.0049362183,0.0340271,-0.007160187,-0.0027236938,-0.007865906,-0.014038086,0.026443481,0.008529663,-0.037322998,0.0039100647,-0.006702423,0.032287598,0.04547119,-0.039794922,0.028335571,0.025314331,0.020339966,0.038208008,-0.029464722,0.020645142,0.0009832382,-0.007972717,0.023269653,-0.01802063,-0.08288574,-0.026351929,-0.06817627,0.023773193,-0.014305115,0.025314331,0.01574707,-0.0064468384,0.025100708,0.0020503998,-0.02279663,-0.0033340454,0.011802673,-0.008285522,0.05154419,0.024154663,-0.04156494,-0.035736084,-0.0016679764,-0.027740479,-0.028762817,0.00674057,0.027755737,-0.05090332,0.009475708,-0.068603516,0.04623413,-0.021011353,-0.0206604,-0.011123657,-0.0033798218,-0.023071289,-0.060394287,0.05718994,-0.018218994,0.010856628,-0.018951416,0.01083374,0.013259888,0.03918457,0.016998291,0.0184021,0.07714844,0.05105591,-0.005859375,0.017837524,-0.0077209473,0.02458191,0.0039367676,0.049987793,-0.039916992,0.015327454,-0.025436401,-0.064697266,-0.020431519,0.06555176,-0.08306885,-0.0206604,0.007965088,-0.03338623,0.02859497,0.005191803,0.005695343,0.017211914,0.017974854,-0.019958496,0.03189087,0.0012388229,0.012008667,0.018066406,-0.028793335,0.00843811,-0.0670166,0.0021419525,-0.0014762878,0.050598145,-0.008422852,0.05307007,0.0126571655,-0.018218994,-0.015464783,0.015670776,0.011360168,-0.018051147,0.015457153,-0.0041236877,-0.0546875,0.016174316,-0.053375244,0.010414124,-0.008255005,-0.019485474,-0.05822754,0.003232956,-0.023010254,-0.046875,-0.03564453,0.029907227,-0.053619385,-0.026321411,0.033050537,0.020111084,0.024795532,0.01939392,0.01247406,0.057769775,0.06817627,-0.02798462,-0.034057617,-0.019363403,-0.03326416,-0.03387451,0.016937256,0.0473938,0.007423401,-0.066467285,0.033172607,0.01574707,0.012138367,0.010398865,-0.016845703,0.0020008087,0.059661865,0.0006251335,-0.048583984,-0.019714355,-0.024642944,-0.0071868896,0.027572632,0.017623901,-0.016601562,0.004108429,0.052490234,0.014732361,-0.014030457,0.022750854,-0.034729004,0.0154418945,-0.0022201538,0.031463623,-0.016342163,0.0385437,0.0037288666,-0.022033691,0.015655518,0.018722534,-0.0035190582,0.02230835,-0.021514893,0.02859497,0.020202637,-0.017456055,0.028320312,0.047607422,-0.016738892,-0.044647217,-0.009468079,0.046966553,0.016662598,0.00030303,-0.06341553,-0.031585693,0.0118255615,-0.015777588,0.024658203,-0.024398804,0.00554657,0.0007791519,-0.03111267,-0.015151978,0.031158447,0.03805542,-0.018157959,-0.03338623,-0.0024261475,-0.016021729,0.043518066,0.022094727,0.023040771,-0.005619049,-0.045013428,0.010482788,-0.022201538,0.016555786,0.019546509,-0.046569824,-0.01687622,0.0039520264,0.014961243,-0.014854431,-0.05569458,0.005077362,0.041778564,-0.024536133,-0.026931763,-0.009841919,-0.010513306,-0.049560547,-0.026107788,0.0071983337,-0.023895264,0.017089844,0.041534424,-0.023132324,0.015022278,0.011947632,-0.028320312,0.025878906,-0.03277588,0.045074463,0.013214111,0.0019435883,0.0440979,-0.01171875,0.004585266,-0.024932861,-0.02796936,-0.010116577,-0.01727295,-0.0070648193,-0.009490967,-0.026245117,-0.005794525,-0.020751953,0.0022697449,0.019073486,0.050842285,0.057006836,-0.0014801025,0.014663696,-0.0026569366,0.06335449,0.014862061,0.02659607,-0.017913818,0.022979736,0.037231445,-0.021865845,0.049346924,-0.020355225,-0.020187378,-0.021636963,-0.012145996,-0.017684937,0.023147583,-0.006717682,0.013587952,0.036895752,-0.008384705,-0.012275696],\"behavior\":null,\"alternate_title\":[],\"creator\":[],\"related_material\":[],\"date_created\":[\"1899 to 1918\"],\"abstract\":[],\"representative_file_set\":{\"aspect_ratio\":1.25215,\"id\":\"4d083fe4-6267-4b7d-97db-65f77bace3a2\",\"url\":\"https://iiif.dc.library.northwestern.edu/iiif/3/4d083fe4-6267-4b7d-97db-65f77bace3a2\"},\"api_model\":\"Work\",\"series\":[],\"physical_description_material\":[\"glass plate negative\"],\"canonical_link\":\"https://dc.library.northwestern.edu/items/6464c86a-29e0-4aeb-ac5c-8e1c9bb0dfc2\",\"location\":[],\"rights_holder\":[],\"table_of_contents\":[],\"scope_and_contents\":[],\"preservation_level\":\"Level 1\"},\"info\":{\"name\":\"dc-api\",\"description\":\"NUL Digital Collections API\",\"version\":\"2.9.4\",\"link_expiration\":null}}" + }, + "redirectURL": "", + "headersSize": 1031, + "bodySize": 18501 + }, + "cache": {}, + "timings": { + "connect": -1.0, + "ssl": -1.0, + "send": 0.5431175231933594, + "receive": 0.5979537963867188, + "wait": 128.30090522766113 + }, + "serverIPAddress": "52.86.120.219" + }, + { + "startedDateTime": "2026-03-19T21:42:32.723317+00:00", + "time": 273.52142333984375, + "request": { + "method": "GET", + "url": "https://api.dc.library.northwestern.edu/api/v2/works/6464c86a-29e0-4aeb-ac5c-8e1c9bb0dfc2", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [ + { + "name": "host", + "value": "api.dc.library.northwestern.edu" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "name": "accept", + "value": "*/*" + }, + { + "name": "accept-language", + "value": "*" + }, + { + "name": "sec-fetch-mode", + "value": "cors" + }, + { + "name": "user-agent", + "value": "node" + }, + { + "name": "accept-encoding", + "value": "br, gzip, deflate" + } + ], + "queryString": [], + "headersSize": 235, + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + { + "name": "REDACTED", + "value": null, + "path": "/", + "domain": "", + "httpOnly": false, + "secure": false + } + ], + "headers": [ + { + "name": "Date", + "value": "Thu, 19 Mar 2026 21:42:32 GMT" + }, + { + "name": "Content-Type", + "value": "application/json; charset=UTF-8" + }, + { + "name": "Content-Length", + "value": "18501" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "etag", + "value": "749d24496c24ff5ddff22a8b7ef550ef" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "access-control-allow-headers", + "value": "Accept, Accept-Charset, Accept-Encoding, Accept-Language, Accept-Datetime, Authorization, Cache-Control, Content-Length, Content-Type, Cookie, Date, Expect, Host, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Origin, Pragma, Range, Referer, User-Agent, X-CSRF-Token, X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Port, X-Requested-With" + }, + { + "name": "access-control-allow-methods", + "value": "POST, GET, HEAD, OPTIONS" + }, + { + "name": "access-control-allow-credentials", + "value": "true" + }, + { + "name": "access-control-expose-headers", + "value": "Cache-Control, Content-Language, Content-Length, Content-Type, Date, ETag, Expires, Last-Modified, Pragma" + }, + { + "name": "access-control-max-age", + "value": "600" + }, + { + "name": "set-cookie", + "value": "REDACTED" + }, + { + "name": "Apigw-Requestid", + "value": "afYXbgAaIAMEP4w=" + } + ], + "content": { + "size": 18501, + "compression": 0, + "mimeType": "application/json; charset=UTF-8", + "text": "{\"data\":{\"notes\":[{\"type\":\"General Note\",\"note\":\"Courtesy of Northwestern University Archives, George S. Duntley Photographs\"}],\"keywords\":[\"CCC\"],\"subject\":[{\"variants\":[\"Estado de Illinois\",\"\u02bbIlinoe\",\"Ilinoi\",\"Ilino\u012ds\",\"Ilinojso\",\"Il\u012bn\u016by\",\"Illinoi\",\"Illinoi-ju\",\"Illinoiju\",\"Illinois suyu\",\"Illinoys\",\"Ill\u012bn\u016by\",\"Politeia tou Ilinoi\",\"Shtat Ilino\u012ds\",\"State of Illinois\",\"T\u00f3 Nitsaa N\u00edl\u012f\u0301b\u0105\u0105h Hahoodzo\",\"Y\u00ee-li-n\u00f2\"],\"label\":\"Illinois\",\"id\":\"http://id.worldcat.org/fast/1205143\",\"role\":\"Geographical\",\"facet\":\"http://id.worldcat.org/fast/1205143|GEOGRAPHICAL|Illinois (Geographical)\",\"label_with_role\":\"Illinois (Geographical)\"}],\"related_url\":[{\"url\":\"https://findingaids.library.northwestern.edu/repositories/6/resources/1245\",\"label\":\"Finding Aid\"}],\"caption\":[],\"project\":{\"manager\":\"Nicole Finzer\",\"proposer\":\"Kevin Leonard\",\"name\":\"Duntley Photographs\",\"task_number\":\"Job:11795\",\"cycle\":\"2016\",\"desc\":null},\"language\":[],\"source\":[],\"terms_of_use\":\"The images on this web site are from material in the collections of the University Archives of Northwestern University Libraries, are provided for use by its students, faculty and staff, and by other researchers visiting this site, for research consultation and scholarly purposes only. Further distribution and/or any commercial use of the images from this site is not permitted.\",\"ingest_sheet\":null,\"library_unit\":\"University Archives\",\"indexed_at\":\"2026-01-30T19:49:17.397087\",\"rights_statement\":{\"label\":\"In Copyright - Rights-holder(s) Unlocatable or Unidentifiable\",\"id\":\"http://rightsstatements.org/vocab/InC-RUU/1.0/\"},\"id\":\"6464c86a-29e0-4aeb-ac5c-8e1c9bb0dfc2\",\"create_date\":\"2021-03-16T03:00:22.136819Z\",\"batch_ids\":[\"03244047-83f3-41e2-bc9f-200feb1ee027\",\"12a489f9-65af-4e28-8a24-b88ec94cd329\",\"53ef99bb-37d6-415f-a37a-b5e380239ff4\"],\"identifier\":[\"Item:377\",\"75/31/30\"],\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/6464c86a-29e0-4aeb-ac5c-8e1c9bb0dfc2/thumbnail\",\"style_period\":[],\"box_number\":[\"8\"],\"visibility\":\"Public\",\"ingest_project\":null,\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/6464c86a-29e0-4aeb-ac5c-8e1c9bb0dfc2?as=iiif\",\"work_type\":\"Image\",\"folder_name\":[],\"collection\":{\"description\":\"The photographs of George S. Duntley fill 8 boxes and cover the years from approximately 1899-1918. The collection consists of dry plate negatives and record Duntley\u2019s years in Chicago and Evanston while he was attending Northwestern University Medical School. Also included are photographs taken in Bushnell, Illinois, his home town and surrounding areas.\",\"id\":\"450b857e-2e74-491e-9ef1-2c73e49f0c16\",\"title\":\"George Silas Duntley Photographs\"},\"published\":true,\"modified_date\":\"2024-05-15T16:12:51.126967Z\",\"accession_number\":\"Accession:duntley35835\",\"license\":null,\"date_created_edtf\":[\"1899/1918\"],\"physical_description_size\":[\"4 x 5 inches\"],\"publisher\":[],\"nav_place\":[],\"file_sets\":[{\"role\":\"Access\",\"streaming_url\":null,\"description\":null,\"label\":\"inu-dil-73e55658-2cd3-496b-83e7-a7231b521799.tif\",\"webvtt\":null,\"poster_offset\":null,\"duration\":null,\"accession_number\":\"Accession:duntley35835_donut_01\",\"original_filename\":\"inu-dil-73e55658-2cd3-496b-83e7-a7231b521799.tif\",\"group_with\":null,\"mime_type\":\"image/tiff\",\"download_url\":\"https://api.dc.library.northwestern.edu/api/v2/file-sets/4d083fe4-6267-4b7d-97db-65f77bace3a2/download\",\"width\":9569,\"rank\":0,\"id\":\"4d083fe4-6267-4b7d-97db-65f77bace3a2\",\"representative_image_url\":\"https://iiif.dc.library.northwestern.edu/iiif/3/4d083fe4-6267-4b7d-97db-65f77bace3a2\",\"height\":7642}],\"status\":\"Done\",\"catalog_key\":[],\"box_name\":[],\"embedding_model\":\"cohere.embed-multilingual-v3\",\"technique\":[],\"description\":[\"Description of box : Large cardboard box\"],\"csv_metadata_update_jobs\":[],\"title\":\"Unidentified men on baseball team with 'B' on uniforms standing or kneeling in field\",\"legacy_identifier\":[\"inu:dil-73e55658-2cd3-496b-83e7-a7231b521799\"],\"folder_number\":[],\"cultural_context\":[],\"embedding_text_length\":468,\"contributor\":[{\"variants\":[],\"label\":\"Duntley, George Silas\",\"id\":\"http://id.loc.gov/authorities/names/no2016168978\",\"role\":\"Photographer\",\"facet\":\"http://id.loc.gov/authorities/names/no2016168978|pht|Duntley, George Silas (Photographer)\",\"label_with_role\":\"Duntley, George Silas (Photographer)\"}],\"provenance\":[],\"genre\":[{\"variants\":[\"dry-plate negatives (gelatin silver negatives)\",\"placa seca (negativo)\",\"gelatin dry plate negative\",\"gelatin dry-plate negatives\",\"dry plate negatives, gelatin\",\"negatives, gelatin dry plate\",\"plate negatives, gelatin dry\",\"gelatin dry plate photonegatives\",\"gelatin dry-plate photonegatives\",\"gelatineplaatnegatief\",\"lastre alla gelatina secca\",\"negativi su lastra alla gelatina\",\"negativo de gelatina en placa seca\"],\"label\":\"gelatin dry plate negatives\",\"id\":\"http://vocab.getty.edu/aat/300134920\",\"facet\":\"http://vocab.getty.edu/aat/300134920||gelatin dry plate negatives\"}],\"api_link\":\"https://api.dc.library.northwestern.edu/api/v2/works/6464c86a-29e0-4aeb-ac5c-8e1c9bb0dfc2\",\"ark\":\"ark:/81985/n2ws8hv2s\",\"embedding\":[-0.015281677,-0.0039596558,-0.070251465,0.043395996,0.015716553,-0.011795044,0.04446411,-0.023239136,-0.0079422,0.013694763,0.022888184,-0.004360199,0.005241394,-0.018051147,0.011550903,-0.0024337769,-0.05429077,0.013755798,-0.0007805824,0.04550171,0.052124023,0.030822754,-0.048858643,0.014945984,-0.021850586,0.041931152,-0.011436462,-0.0072784424,0.010787964,-0.05392456,-0.013870239,-0.0021972656,0.07672119,0.042510986,-0.040527344,0.001660347,-0.015991211,-0.013137817,0.012573242,0.026367188,0.04058838,-0.0046157837,-0.05065918,0.00041866302,-0.078186035,0.023788452,0.039001465,0.052368164,0.033569336,0.026611328,0.0044288635,-0.027908325,0.018615723,-0.00012719631,0.025390625,-0.005519867,0.0012254715,0.024719238,0.055999756,0.012084961,0.021972656,0.015419006,-0.0116119385,0.0042152405,-0.0068130493,0.014381409,0.03314209,-0.023529053,0.038330078,0.014961243,-0.036987305,0.0046958923,0.0692749,0.024368286,0.08081055,-0.028518677,-0.016479492,0.011894226,0.0060653687,0.008087158,-0.018844604,0.021392822,-0.008285522,-0.0048065186,0.0385437,0.018295288,-0.0047950745,0.006252289,-0.017730713,0.08917236,-0.023864746,0.04269409,0.1149292,-0.024398804,0.0012264252,0.014350891,-0.010826111,0.011619568,0.0035209656,-0.0012111664,0.0033855438,-0.03567505,-0.017242432,0.01550293,0.09295654,0.03869629,0.050689697,-0.0067443848,-0.041503906,0.002937317,-0.009277344,-0.0038852692,0.023956299,0.0025138855,0.010482788,-0.008811951,-0.02973938,-0.0128479,-0.049072266,-0.02558899,-0.04296875,-0.018676758,0.008087158,0.020202637,0.00983429,-0.043945312,0.02319336,-0.029678345,-0.03250122,-0.031158447,-0.042907715,-0.034210205,-0.013725281,0.020355225,0.045135498,-0.044189453,0.042236328,-0.04940796,0.05166626,0.056121826,-0.03543091,0.011711121,-0.02178955,-0.03857422,-0.03189087,-0.014961243,0.050872803,0.017166138,0.032836914,-0.008972168,-0.020874023,0.047912598,0.008224487,-0.06500244,-0.0071868896,0.014167786,-0.017684937,0.020599365,0.019332886,-0.070129395,-0.028686523,-0.049438477,0.028060913,-0.03552246,0.0018959045,-0.033996582,0.025161743,0.005176544,0.0135650635,-0.01838684,0.032226562,-0.005859375,0.018203735,0.008964539,-0.014122009,-0.018951416,0.019714355,0.061187744,0.041259766,-0.011779785,0.032440186,-0.002866745,-0.0031528473,0.0019264221,0.021026611,-0.024749756,-0.010139465,0.0014953613,0.026885986,0.03414917,-0.044921875,0.006263733,-0.00983429,-0.04333496,-0.02999878,0.014953613,0.02394104,-0.008331299,-0.013336182,0.009689331,0.02897644,0.009796143,0.00030827522,0.020904541,-0.015411377,0.0013790131,0.030563354,0.031402588,-0.008422852,0.013999939,-0.009544373,0.006439209,0.011749268,-0.009490967,-0.00090265274,-0.0040512085,-0.006298065,-0.085632324,0.00037264824,-0.019744873,0.02909851,-0.013450623,0.026779175,0.055023193,-0.01360321,0.038970947,-0.013420105,-0.01927185,0.025512695,0.0008764267,0.012359619,0.020889282,0.06341553,-0.01473999,-0.0074310303,-0.020065308,-0.023239136,-0.042541504,-0.0059661865,-0.007129669,0.011253357,0.042053223,-0.002538681,-0.025390625,-0.040893555,-0.016448975,-0.039276123,-0.06994629,0.017913818,-0.0335083,0.010093689,0.019424438,-0.015777588,-0.003118515,0.04550171,0.010681152,0.02519226,0.0027923584,-0.0034046173,0.0008277893,-0.04257202,-0.040130615,0.018844604,0.008346558,0.0018482208,-0.0036182404,-0.011268616,-0.013549805,0.039215088,-0.012741089,-0.023223877,0.0046920776,-0.025848389,0.04324341,-0.018203735,0.004295349,-0.031311035,0.014625549,-0.04727173,0.044708252,0.011360168,0.016479492,0.018508911,-0.023498535,-0.03152466,-0.0033683777,0.037628174,0.016586304,0.01675415,-0.011810303,-0.060638428,-0.013290405,-0.04437256,0.046936035,0.0013713837,-0.007457733,0.0019426346,-0.0236969,-0.015464783,-0.0064888,0.011222839,-0.013305664,0.005935669,-0.030548096,-0.024398804,0.03677368,0.036499023,0.009002686,0.03289795,0.018859863,0.0014295578,0.013168335,-0.0030097961,-0.012718201,-0.00029063225,-0.042144775,0.01576233,-0.01889038,-0.0020942688,0.0317688,0.029403687,-0.05606079,-0.0070343018,-0.050201416,-0.011703491,0.07733154,-0.014434814,-0.0039520264,0.011566162,0.033569336,-0.001414299,-0.0071144104,0.0044517517,-0.01386261,0.0025138855,0.0012969971,0.010719299,-0.00066280365,0.040283203,-0.014411926,0.009971619,0.012550354,-0.015289307,-0.018585205,-0.015426636,0.016418457,0.021972656,-0.006164551,-0.015625,0.019500732,0.01525116,0.048797607,0.04196167,-0.052124023,0.04006958,-0.07434082,0.04547119,-0.0068206787,-0.014404297,0.039276123,0.0010414124,0.01737976,-0.025299072,0.06628418,0.00349617,-0.010910034,-0.044433594,-0.016662598,-0.0065841675,0.030212402,0.0025615692,-0.00007599592,0.031143188,0.0026168823,-0.028533936,0.027954102,-0.0034427643,0.001578331,-0.02949524,0.046081543,-0.024246216,0.011650085,-0.052764893,0.025772095,0.09503174,-0.018585205,-0.039764404,-0.009857178,0.092285156,0.07373047,0.0791626,0.04522705,0.01902771,-0.015174866,-0.009643555,-0.014709473,-0.041229248,0.002796173,-0.036956787,-0.030975342,0.097473145,-0.08483887,0.016784668,-0.05822754,0.02458191,0.054626465,-0.003545761,-0.014884949,-0.052856445,-0.048736572,0.00957489,0.026550293,-0.037902832,0.03652954,-0.064331055,0.026123047,-0.008628845,-0.011276245,-0.049560547,-0.005126953,-0.047180176,-0.087402344,-0.024597168,0.024261475,0.027755737,-0.013549805,0.025558472,0.034088135,0.04171753,0.019088745,-0.010040283,0.0003077984,-0.013626099,-0.02696228,-0.017120361,-0.014984131,0.0067443848,0.04776001,0.048583984,-0.059326172,0.019622803,0.05001831,-0.0061950684,0.0040512085,0.0096206665,0.010810852,0.046051025,0.038360596,0.028762817,0.016235352,0.008026123,0.0206604,0.019119263,-0.015945435,0.008605957,-0.021438599,-0.075805664,-0.046844482,-0.019592285,-0.012718201,-0.013572693,-0.0001257658,-0.0029754639,0.021957397,-0.032714844,0.0025577545,-0.026901245,-0.00064373016,0.003446579,-0.020065308,0.002981186,0.028320312,0.057556152,0.014694214,-0.0004196167,-0.08502197,-0.0211792,-0.010299683,-0.020355225,0.05847168,-0.050933838,-0.012161255,0.056793213,-0.012252808,-0.026184082,0.030899048,0.051971436,0.01423645,0.06060791,-0.07434082,-0.103881836,0.019104004,-0.036071777,0.030380249,-0.002231598,-0.020843506,0.011672974,-0.00881958,-0.006904602,-0.03387451,0.026275635,-0.0026931763,0.020263672,-0.011016846,-0.009895325,-0.019454956,-0.017959595,-0.033843994,0.0003502369,-0.047424316,0.0076026917,0.07421875,0.021881104,0.021148682,-0.0030174255,0.0025348663,0.027557373,-0.06707764,0.053771973,-0.06549072,0.02357483,0.04937744,0.017532349,0.01285553,-0.02432251,-0.008674622,0.00059747696,0.023468018,-0.07885742,0.010505676,-0.031066895,-0.03111267,-0.002325058,-0.019088745,-0.027008057,-0.11035156,0.025878906,0.041809082,0.029510498,0.02041626,0.045166016,0.0067253113,0.044006348,0.022476196,0.0059432983,-0.0003349781,-0.028259277,0.0021514893,-0.0143585205,0.02720642,-0.009307861,0.014350891,-0.01776123,-0.020721436,0.025543213,0.010185242,-0.0077590942,-0.006904602,0.00040960312,0.04107666,0.05316162,0.01474762,-0.014923096,0.06008911,0.018722534,-0.0552063,-0.00066280365,0.0034866333,0.013626099,-0.033477783,0.035614014,0.03012085,0.027267456,-0.00036621094,-0.0039100647,-0.0075950623,0.078063965,-0.016921997,-0.01940918,-0.026290894,0.006450653,-0.0063667297,0.014984131,-0.006313324,-0.01928711,-0.010528564,-0.01071167,-0.014862061,0.013908386,0.009857178,0.017303467,-0.02003479,-0.026748657,-0.015579224,-0.063964844,0.06463623,0.01965332,0.009864807,0.0036392212,0.007987976,-0.00080156326,0.02519226,-0.008796692,0.013656616,-0.00381279,0.010932922,0.046936035,-0.013374329,-0.0060310364,-0.04876709,0.0209198,-0.013320923,0.018112183,0.023864746,0.0068626404,-0.01965332,0.027130127,-0.004085541,0.037139893,-0.01676941,0.016159058,-0.08331299,0.017440796,0.045776367,0.020111084,-0.021270752,-0.055877686,-0.0003285408,-0.020477295,-0.020431519,-0.05709839,-0.000729084,0.01109314,-0.029968262,-0.02671814,-0.04748535,-0.0064048767,-0.035095215,0.004699707,-0.011024475,0.014701843,0.021240234,0.02381897,0.002866745,-0.019515991,-0.005241394,-0.022216797,-0.0013713837,0.011245728,0.07019043,-0.0519104,0.07006836,0.10961914,-0.09649658,0.050933838,-0.025863647,-0.008163452,-0.019973755,0.012756348,-0.009590149,0.013008118,-0.0064697266,-0.015007019,-0.041381836,0.007183075,-0.0025024414,-0.025909424,0.0031394958,0.016525269,-0.045684814,0.025299072,-0.012031555,0.0143585205,0.03781128,0.072631836,0.0082092285,-0.055633545,0.050842285,-0.017959595,0.0057373047,0.028366089,0.03302002,-0.007949829,-0.025817871,0.030700684,0.015838623,0.009819031,0.050842285,-0.011703491,-0.009155273,-0.004005432,0.032836914,0.028793335,-0.0016317368,-0.002779007,0.03387451,0.007926941,-0.047424316,-0.031982422,0.035217285,-0.06311035,0.07141113,0.03729248,0.015205383,-0.012535095,-0.016983032,0.039123535,-0.022720337,-0.010971069,0.010902405,0.014831543,-0.0036087036,-0.020599365,-0.0015773773,0.009101868,-0.0015106201,0.001329422,0.01184845,-0.02418518,0.024993896,0.028915405,-0.015853882,-0.022018433,-0.033996582,0.016662598,0.010314941,0.029922485,0.00019681454,-0.0519104,-0.008598328,-0.061462402,-0.008293152,-0.01083374,-0.016448975,-0.045715332,-0.008140564,-0.0025348663,-0.014511108,0.040008545,0.014099121,0.0068740845,0.00957489,-0.04232788,-0.032592773,-0.011306763,0.0079956055,-0.010810852,0.016921997,-0.042266846,-0.0019721985,0.0049362183,0.0340271,-0.007160187,-0.0027236938,-0.007865906,-0.014038086,0.026443481,0.008529663,-0.037322998,0.0039100647,-0.006702423,0.032287598,0.04547119,-0.039794922,0.028335571,0.025314331,0.020339966,0.038208008,-0.029464722,0.020645142,0.0009832382,-0.007972717,0.023269653,-0.01802063,-0.08288574,-0.026351929,-0.06817627,0.023773193,-0.014305115,0.025314331,0.01574707,-0.0064468384,0.025100708,0.0020503998,-0.02279663,-0.0033340454,0.011802673,-0.008285522,0.05154419,0.024154663,-0.04156494,-0.035736084,-0.0016679764,-0.027740479,-0.028762817,0.00674057,0.027755737,-0.05090332,0.009475708,-0.068603516,0.04623413,-0.021011353,-0.0206604,-0.011123657,-0.0033798218,-0.023071289,-0.060394287,0.05718994,-0.018218994,0.010856628,-0.018951416,0.01083374,0.013259888,0.03918457,0.016998291,0.0184021,0.07714844,0.05105591,-0.005859375,0.017837524,-0.0077209473,0.02458191,0.0039367676,0.049987793,-0.039916992,0.015327454,-0.025436401,-0.064697266,-0.020431519,0.06555176,-0.08306885,-0.0206604,0.007965088,-0.03338623,0.02859497,0.005191803,0.005695343,0.017211914,0.017974854,-0.019958496,0.03189087,0.0012388229,0.012008667,0.018066406,-0.028793335,0.00843811,-0.0670166,0.0021419525,-0.0014762878,0.050598145,-0.008422852,0.05307007,0.0126571655,-0.018218994,-0.015464783,0.015670776,0.011360168,-0.018051147,0.015457153,-0.0041236877,-0.0546875,0.016174316,-0.053375244,0.010414124,-0.008255005,-0.019485474,-0.05822754,0.003232956,-0.023010254,-0.046875,-0.03564453,0.029907227,-0.053619385,-0.026321411,0.033050537,0.020111084,0.024795532,0.01939392,0.01247406,0.057769775,0.06817627,-0.02798462,-0.034057617,-0.019363403,-0.03326416,-0.03387451,0.016937256,0.0473938,0.007423401,-0.066467285,0.033172607,0.01574707,0.012138367,0.010398865,-0.016845703,0.0020008087,0.059661865,0.0006251335,-0.048583984,-0.019714355,-0.024642944,-0.0071868896,0.027572632,0.017623901,-0.016601562,0.004108429,0.052490234,0.014732361,-0.014030457,0.022750854,-0.034729004,0.0154418945,-0.0022201538,0.031463623,-0.016342163,0.0385437,0.0037288666,-0.022033691,0.015655518,0.018722534,-0.0035190582,0.02230835,-0.021514893,0.02859497,0.020202637,-0.017456055,0.028320312,0.047607422,-0.016738892,-0.044647217,-0.009468079,0.046966553,0.016662598,0.00030303,-0.06341553,-0.031585693,0.0118255615,-0.015777588,0.024658203,-0.024398804,0.00554657,0.0007791519,-0.03111267,-0.015151978,0.031158447,0.03805542,-0.018157959,-0.03338623,-0.0024261475,-0.016021729,0.043518066,0.022094727,0.023040771,-0.005619049,-0.045013428,0.010482788,-0.022201538,0.016555786,0.019546509,-0.046569824,-0.01687622,0.0039520264,0.014961243,-0.014854431,-0.05569458,0.005077362,0.041778564,-0.024536133,-0.026931763,-0.009841919,-0.010513306,-0.049560547,-0.026107788,0.0071983337,-0.023895264,0.017089844,0.041534424,-0.023132324,0.015022278,0.011947632,-0.028320312,0.025878906,-0.03277588,0.045074463,0.013214111,0.0019435883,0.0440979,-0.01171875,0.004585266,-0.024932861,-0.02796936,-0.010116577,-0.01727295,-0.0070648193,-0.009490967,-0.026245117,-0.005794525,-0.020751953,0.0022697449,0.019073486,0.050842285,0.057006836,-0.0014801025,0.014663696,-0.0026569366,0.06335449,0.014862061,0.02659607,-0.017913818,0.022979736,0.037231445,-0.021865845,0.049346924,-0.020355225,-0.020187378,-0.021636963,-0.012145996,-0.017684937,0.023147583,-0.006717682,0.013587952,0.036895752,-0.008384705,-0.012275696],\"behavior\":null,\"alternate_title\":[],\"creator\":[],\"related_material\":[],\"date_created\":[\"1899 to 1918\"],\"abstract\":[],\"representative_file_set\":{\"aspect_ratio\":1.25215,\"id\":\"4d083fe4-6267-4b7d-97db-65f77bace3a2\",\"url\":\"https://iiif.dc.library.northwestern.edu/iiif/3/4d083fe4-6267-4b7d-97db-65f77bace3a2\"},\"api_model\":\"Work\",\"series\":[],\"physical_description_material\":[\"glass plate negative\"],\"canonical_link\":\"https://dc.library.northwestern.edu/items/6464c86a-29e0-4aeb-ac5c-8e1c9bb0dfc2\",\"location\":[],\"rights_holder\":[],\"table_of_contents\":[],\"scope_and_contents\":[],\"preservation_level\":\"Level 1\"},\"info\":{\"name\":\"dc-api\",\"description\":\"NUL Digital Collections API\",\"version\":\"2.9.4\",\"link_expiration\":null}}" + }, + "redirectURL": "", + "headersSize": 1031, + "bodySize": 18501 + }, + "cache": {}, + "timings": { + "connect": -1.0, + "ssl": -1.0, + "send": 0.5249977111816406, + "receive": 0.7467269897460938, + "wait": 272.249698638916 + }, + "serverIPAddress": "52.86.120.219" + }, + { + "startedDateTime": "2026-03-19T21:42:33.007283+00:00", + "time": 143.9077854156494, + "request": { + "method": "GET", + "url": "https://api.dc.library.northwestern.edu/api/v2/collections/18ec4c6b-192a-4ab8-9903-ea0f393c35f7", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [ + { + "name": "host", + "value": "api.dc.library.northwestern.edu" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "name": "accept", + "value": "*/*" + }, + { + "name": "accept-language", + "value": "*" + }, + { + "name": "sec-fetch-mode", + "value": "cors" + }, + { + "name": "user-agent", + "value": "node" + }, + { + "name": "accept-encoding", + "value": "br, gzip, deflate" + } + ], + "queryString": [], + "headersSize": 235, + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + { + "name": "REDACTED", + "value": null, + "path": "/", + "domain": "", + "httpOnly": false, + "secure": false + } + ], + "headers": [ + { + "name": "Date", + "value": "Thu, 19 Mar 2026 21:42:33 GMT" + }, + { + "name": "Content-Type", + "value": "application/json; charset=UTF-8" + }, + { + "name": "Content-Length", + "value": "1818" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "access-control-allow-headers", + "value": "Accept, Accept-Charset, Accept-Encoding, Accept-Language, Accept-Datetime, Authorization, Cache-Control, Content-Length, Content-Type, Cookie, Date, Expect, Host, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Origin, Pragma, Range, Referer, User-Agent, X-CSRF-Token, X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Port, X-Requested-With" + }, + { + "name": "access-control-allow-methods", + "value": "POST, GET, HEAD, OPTIONS" + }, + { + "name": "access-control-allow-credentials", + "value": "true" + }, + { + "name": "access-control-expose-headers", + "value": "Cache-Control, Content-Language, Content-Length, Content-Type, Date, ETag, Expires, Last-Modified, Pragma" + }, + { + "name": "access-control-max-age", + "value": "600" + }, + { + "name": "etag", + "value": "423aec87857c743cee31014789d4dba4" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "set-cookie", + "value": "REDACTED" + }, + { + "name": "Apigw-Requestid", + "value": "afYXejwCoAMEZ5A=" + } + ], + "content": { + "size": 1818, + "compression": 0, + "mimeType": "application/json; charset=UTF-8", + "text": "{\"data\":{\"id\":\"18ec4c6b-192a-4ab8-9903-ea0f393c35f7\",\"description\":\"The Berkeley Folk Music Festival Archive consists of roughly 33,500 items, including photographs of folk artists and groups, posters, flyers, press clippings, correspondence, publicity information, audio, video, and more about the Festival and the folk music revival as a whole. A digital exhibit, The Berkeley Folk Music Festival & the Folk Revival on the US West Coast\u2014An Introduction, can be found at https://sites.northwestern.edu/bfmf. We welcome your input and comments to help us continue to improve the accuracy of this rich, wide-ranging collection of materials at https://sites.northwestern.edu/bfmf/contact-us/.\",\"title\":\"Berkeley Folk Music Festival\",\"keywords\":[\"featured\"],\"representative_image\":{\"url\":\"https://iiif.dc.library.northwestern.edu/iiif/3/944ea189-c390-4771-be78-6ce65341c632\",\"work_id\":\"f64d949b-b385-4120-84c0-4a87297e08cf\"},\"published\":true,\"visibility\":\"Public\",\"admin_email\":null,\"featured\":true,\"finding_aid_url\":\"https://findingaids.library.northwestern.edu/repositories/7/resources/1285\",\"indexed_at\":\"2026-01-30T19:06:14.479523\",\"api_link\":\"https://api.dc.library.northwestern.edu/api/v2/collections/18ec4c6b-192a-4ab8-9903-ea0f393c35f7\",\"api_model\":\"Collection\",\"canonical_link\":\"https://dc.library.northwestern.edu/collections/18ec4c6b-192a-4ab8-9903-ea0f393c35f7\",\"create_date\":\"2021-03-12T02:11:32.456787Z\",\"iiif_collection\":\"https://api.dc.library.northwestern.edu/api/v2/collections/18ec4c6b-192a-4ab8-9903-ea0f393c35f7?as=iiif\",\"modified_date\":\"2025-03-25T16:11:05.057600Z\",\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/collections/18ec4c6b-192a-4ab8-9903-ea0f393c35f7/thumbnail\"},\"info\":{\"name\":\"dc-api\",\"description\":\"NUL Digital Collections API\",\"version\":\"2.9.4\",\"link_expiration\":null}}" + }, + "redirectURL": "", + "headersSize": 1030, + "bodySize": 1818 + }, + "cache": {}, + "timings": { + "connect": -1.0, + "ssl": -1.0, + "send": 0.7488727569580078, + "receive": 0.6046295166015625, + "wait": 142.55428314208984 + }, + "serverIPAddress": "52.86.120.219" + }, + { + "startedDateTime": "2026-03-19T21:42:33.156811+00:00", + "time": 161.64541244506836, + "request": { + "method": "POST", + "url": "https://api.dc.library.northwestern.edu/api/v2/search/collections?size=10&page=1&visibility=public", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [ + { + "name": "host", + "value": "api.dc.library.northwestern.edu" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "accept", + "value": "*/*" + }, + { + "name": "accept-language", + "value": "*" + }, + { + "name": "sec-fetch-mode", + "value": "cors" + }, + { + "name": "user-agent", + "value": "node" + }, + { + "name": "accept-encoding", + "value": "br, gzip, deflate" + }, + { + "name": "content-length", + "value": "1020" + } + ], + "queryString": [ + { + "name": "size", + "value": "10" + }, + { + "name": "page", + "value": "1" + }, + { + "name": "visibility", + "value": "public" + } + ], + "headersSize": 305, + "bodySize": 1020, + "postData": { + "mimeType": "application/json", + "text": "{\"query\":{\"match_all\":{}},\"sort\":[{\"title\":{\"order\":\"asc\"}}],\"_source\":{\"includes\":[\"id\",\"title\",\"thumbnail\",\"collection.id\",\"collection.title\",\"description\",\"iiif_collection\",\"iiif_manifest\",\"visibility\"],\"excludes\":[\"batch_ids\",\"behavior\",\"box_name\",\"box_number\",\"catalog_key\",\"csv_metadata_update_jobs\",\"embedding\",\"embedding_model\",\"embedding_text_length\",\"folder_name\",\"folder_number\",\"ingest_project\",\"ingest_sheet\",\"legacy_identifier\",\"preservation_level\",\"project\",\"status\",\"terms_of_use\",\"contributor.facet\",\"creator.facet\",\"genre.facet\",\"language.facet\",\"location.facet\",\"style_period.facet\",\"subject.facet\",\"technique.facet\",\"contributor.label_with_role\",\"creator.label_with_role\",\"genre.label_with_role\",\"language.label_with_role\",\"location.label_with_role\",\"style_period.label_with_role\",\"subject.label_with_role\",\"technique.label_with_role\",\"contributor.variants\",\"creator.variants\",\"genre.variants\",\"language.variants\",\"location.variants\",\"style_period.variants\",\"subject.variants\",\"technique.variants\"]}}", + "params": [] + } + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + { + "name": "REDACTED", + "value": null, + "path": "/", + "domain": "", + "httpOnly": false, + "secure": false + } + ], + "headers": [ + { + "name": "Date", + "value": "Thu, 19 Mar 2026 21:42:33 GMT" + }, + { + "name": "Content-Type", + "value": "application/json; charset=UTF-8" + }, + { + "name": "Content-Length", + "value": "10832" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "access-control-allow-methods", + "value": "POST, GET, HEAD, OPTIONS" + }, + { + "name": "access-control-allow-credentials", + "value": "true" + }, + { + "name": "access-control-expose-headers", + "value": "Cache-Control, Content-Language, Content-Length, Content-Type, Date, ETag, Expires, Last-Modified, Pragma" + }, + { + "name": "access-control-max-age", + "value": "600" + }, + { + "name": "etag", + "value": "9f87a0e5683cde3cc5aa3ccbec584326" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "access-control-allow-headers", + "value": "Accept, Accept-Charset, Accept-Encoding, Accept-Language, Accept-Datetime, Authorization, Cache-Control, Content-Length, Content-Type, Cookie, Date, Expect, Host, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Origin, Pragma, Range, Referer, User-Agent, X-CSRF-Token, X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Port, X-Requested-With" + }, + { + "name": "set-cookie", + "value": "REDACTED" + }, + { + "name": "Apigw-Requestid", + "value": "afYXfgZtIAMEPkw=" + } + ], + "content": { + "size": 10832, + "compression": 0, + "mimeType": "application/json; charset=UTF-8", + "text": "{\"data\":[{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/collections/ecacd539-fe38-40ec-bbc0-590acee3d4f2/thumbnail\",\"visibility\":\"Public\",\"description\":\"This collection documents the extraordinary cultural outpouring of celebratory materials from across the continent of Africa. They represent Africa\u2019s pride in, ownership of and hopefulness for the candidacy and presidency of Barack Obama. \",\"id\":\"ecacd539-fe38-40ec-bbc0-590acee3d4f2\",\"title\":\"Africa Embracing Obama\",\"iiif_collection\":\"https://api.dc.library.northwestern.edu/api/v2/collections/ecacd539-fe38-40ec-bbc0-590acee3d4f2?as=iiif\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/collections/3121f8ee-5265-4b19-bae3-59f96e9ac01a/thumbnail\",\"visibility\":\"Public\",\"description\":\"The Aldridge Collection consists of materials relating to 19th century African-American tragedian Ira Frederick Aldridge (1807-1867), and his musician daughters Amanda Aldridge (1866-1956) and Luranah Aldridge (1860-1932). The bulk of the material relating to the daughters is related to Amanda Aldridge, an opera singer who also composed music, sometimes under the pseudonym Montague Ring. Luranah was also a successful opera singer. \",\"id\":\"3121f8ee-5265-4b19-bae3-59f96e9ac01a\",\"title\":\"Aldridge Collection\",\"iiif_collection\":\"https://api.dc.library.northwestern.edu/api/v2/collections/3121f8ee-5265-4b19-bae3-59f96e9ac01a?as=iiif\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/collections/c4f30015-88b5-4291-b3a6-8ac9b7c7069c/thumbnail\",\"visibility\":\"Public\",\"description\":\"Over 150 photographic prints (mostly 4x6 cabinet size, mounted on cardstock) taken by noted Evanston photographer Alexander Hesler, dating circa 1870-1887 and depicting Northwestern University faculty, students, and buildings. Includes 2 copies of published volume \\\"Photographic Views of Picturesque Evanston\\\" (1887).\",\"id\":\"c4f30015-88b5-4291-b3a6-8ac9b7c7069c\",\"title\":\"Alexander Hesler Photograph Collection\",\"iiif_collection\":\"https://api.dc.library.northwestern.edu/api/v2/collections/c4f30015-88b5-4291-b3a6-8ac9b7c7069c?as=iiif\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/collections/30d59215-8f2b-470d-967b-5a721fa366b7/thumbnail\",\"visibility\":\"Public\",\"description\":\"Ann C. Gunter is Bertha and Max Dressler Professor in the Humanities at Northwestern University. Her work addresses the visual and material cultural of the ancient Near East and its Eastern Mediterranean neighbors. These images are from her personal slide collection and not retained by Northwestern University Libraries.\",\"id\":\"30d59215-8f2b-470d-967b-5a721fa366b7\",\"title\":\"Ann C. Gunter Slide Collection\",\"iiif_collection\":\"https://api.dc.library.northwestern.edu/api/v2/collections/30d59215-8f2b-470d-967b-5a721fa366b7?as=iiif\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/collections/59ec43f9-a96c-4314-9b44-9923790b371c/thumbnail\",\"visibility\":\"Public\",\"description\":\"This rare collection of manuscripts dates back to the 19th and 20th centuries and come from mainly northern Nigeria (Kano in particular) but also includes items from Ghana, Senegal and Mali. Mostly handwritten in Arabic and Ajami scripts, these manuscripts cover a wide range of subjects from Arabic grammar, history, theology, law and astronomy to name a few, with particular strength in Tij\u00e2niyya Sufi order and Hausa poetry. Comprised of 5,000 items, the manuscripts are split across four separate collections and serve as an excellent example of West African literacy in Arabic: The 'Umar Falke Collection, The John Paden Collection, The John Hunwick Collection, The University of Ghana Collection\",\"id\":\"59ec43f9-a96c-4314-9b44-9923790b371c\",\"title\":\"Arabic Manuscripts from West Africa\",\"iiif_collection\":\"https://api.dc.library.northwestern.edu/api/v2/collections/59ec43f9-a96c-4314-9b44-9923790b371c?as=iiif\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/collections/fbe609ee-0fab-472d-bc98-51dce3077167/thumbnail\",\"visibility\":\"Public\",\"description\":\"Audio recordings of Arnold Jacobs (low brass) from the 1970s - early 1980s. \",\"id\":\"fbe609ee-0fab-472d-bc98-51dce3077167\",\"title\":\"Arnold Jacobs Master Class Audio Archives\",\"iiif_collection\":\"https://api.dc.library.northwestern.edu/api/v2/collections/fbe609ee-0fab-472d-bc98-51dce3077167?as=iiif\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/collections/f65b3ae2-e4a9-40b7-b0a0-b48416eae767/thumbnail\",\"visibility\":\"Public\",\"description\":\"The Asher Golden Collection contains 29 audiocassette recordings and a small amount of paper documents from Northwestern University\u2019s 1995-1997 football seasons. A sports reporter for Northwestern\u2019s WNUR radio station, Golden covered Wildcat football between 1995 and the January 1, 1997 Citrus Bowl.\",\"id\":\"f65b3ae2-e4a9-40b7-b0a0-b48416eae767\",\"title\":\"Asher Golden Collection\",\"iiif_collection\":\"https://api.dc.library.northwestern.edu/api/v2/collections/f65b3ae2-e4a9-40b7-b0a0-b48416eae767?as=iiif\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/collections/8cdf83c9-3831-4211-acd7-122bca9b89da/thumbnail\",\"visibility\":\"Public\",\"description\":\"This collection of Northwestern University football films dates between 1929 and 1984 with a gap for the period 1932\u20131934. The films record actual intercollegiate games although for many seasons not all contests are represented. The films are most complete for football seasons from the 1950s through the 1980s; beginning in the late 1950s, practice, junior varsity, and freshman team game films often are included. Northwestern team and Big Ten Conference football highlight films are scattered across the collection from the 1930s through the 1970s.\",\"id\":\"8cdf83c9-3831-4211-acd7-122bca9b89da\",\"title\":\"Athletic Department Football Films\",\"iiif_collection\":\"https://api.dc.library.northwestern.edu/api/v2/collections/8cdf83c9-3831-4211-acd7-122bca9b89da?as=iiif\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/collections/18ec4c6b-192a-4ab8-9903-ea0f393c35f7/thumbnail\",\"visibility\":\"Public\",\"description\":\"The Berkeley Folk Music Festival Archive consists of roughly 33,500 items, including photographs of folk artists and groups, posters, flyers, press clippings, correspondence, publicity information, audio, video, and more about the Festival and the folk music revival as a whole. A digital exhibit, The Berkeley Folk Music Festival & the Folk Revival on the US West Coast\u2014An Introduction, can be found at https://sites.northwestern.edu/bfmf. We welcome your input and comments to help us continue to improve the accuracy of this rich, wide-ranging collection of materials at https://sites.northwestern.edu/bfmf/contact-us/.\",\"id\":\"18ec4c6b-192a-4ab8-9903-ea0f393c35f7\",\"title\":\"Berkeley Folk Music Festival\",\"iiif_collection\":\"https://api.dc.library.northwestern.edu/api/v2/collections/18ec4c6b-192a-4ab8-9903-ea0f393c35f7?as=iiif\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/collections/5ee1e08a-fa13-472e-afad-8400da36b9b9/thumbnail\",\"visibility\":\"Public\",\"description\":\"Collection contains oral histories pertaining to the Black Experience at Northwestern University, and is divided into three separate projects: The Takeover Documentary Oral History Project, The Northwestern Community Ensemble (NCE) Oral History Project, and The Black (Student) Experiences at Northwestern University Oral History Project.\",\"id\":\"5ee1e08a-fa13-472e-afad-8400da36b9b9\",\"title\":\"Black Experience at Northwestern University Oral Histories \",\"iiif_collection\":\"https://api.dc.library.northwestern.edu/api/v2/collections/5ee1e08a-fa13-472e-afad-8400da36b9b9?as=iiif\"}],\"pagination\":{\"query_url\":\"https://api.dc.library.northwestern.edu/api/v2/search/collections?searchToken=N4IgRg9gJgniBcoDOBLAXgUwQRgAwBoQBHAVwwCc5EQBbAQwBcBjACwH06AbThYAXz6EkEcgwQBtUAxQNOWaiKgUEIOkiYgBAXUJthJck3mgUAOyacSSpBJAooIQtNlYnLEjTCm6KHoSYQ3BhM0hCmAHT2jiABQSEoYeHOctHWTOQoAA6hptEo%2BQBmbLFy8WF5hWz0pigFGEhihABuKKhgvjJwOiAYAB4WVvW2YIysbPY2hGAYLHQtItGQvWzeNK7gEMumHtPk0UyMXBAA5mwA1hhw-khNVRgMdFCHbCSZTwwYbABWEGCTPZ4MFAoGZjtEMIDgaCqtAMH4AdMoaZTh9egw2HJkQwWNECoElOQVnQ1rj8RQVjtlIRQfV0ZlyBAvsFGnZkbS9CwMPdonJjnQmDBxkpTNICigqSB6fUKE1GAlTBiME04dF6YzmdEGowSP8PuQaEg2BAijr1gERRkwCQGCJwgV%2Bdz-OQMIxbfajCzjhhTM67Q6WZw6MiSHQvX6PTyIAccuHHSAGjA5GxMhQElBYyykCQwEyQhnoh9WDVSBh8-4wgxLdbbYHppw2AB3GTsBkpJ0um3kcK1uGN5tsVvrL0%2B0s9%2BtN7EDwLrQPB0Ojuh1vuTweR6Py7uL3sTlvTzUMROfFMZaCbpc7qdt%2BPZ3MMM-b-urpzBFjFsj38ePvfli0oK2d8JZQyIMGH%2BdIO1tICUBA-5h19KCYJ5INjhDMMEJFf5OCjOVEnQ0D90PZNU1PPD-izHNmUAuhgIwgsXzfUtSJALQBEIGhYU4Gx4HEGJAlKHIbG6PF9UYFQlHtEhOBZCBsnlLjQBLSgAGVK1BAAFajiXuCh5MlecVGwTV0HkEA8GiFo2g6A8VEybNOBQDQBD4IA&page=1&size=10&visibility=public\",\"current_page\":1,\"limit\":10,\"offset\":0,\"total_hits\":108,\"total_pages\":11,\"format\":\"default\",\"next_url\":\"https://api.dc.library.northwestern.edu/api/v2/search/collections?searchToken=N4IgRg9gJgniBcoDOBLAXgUwQRgAwBoQBHAVwwCc5EQBbAQwBcBjACwH06AbThYAXz6EkEcgwQBtUAxQNOWaiKgUEIOkiYgBAXUJthJck3mgUAOyacSSpBJAooIQtNlYnLEjTCm6KHoSYQ3BhM0hCmAHT2jiABQSEoYeHOctHWTOQoAA6hptEo%2BQBmbLFy8WF5hWz0pigFGEhihABuKKhgvjJwOiAYAB4WVvW2YIysbPY2hGAYLHQtItGQvWzeNK7gEMumHtPk0UyMXBAA5mwA1hhw-khNVRgMdFCHbCSZTwwYbABWEGCTPZ4MFAoGZjtEMIDgaCqtAMH4AdMoaZTh9egw2HJkQwWNECoElOQVnQ1rj8RQVjtlIRQfV0ZlyBAvsFGnZkbS9CwMPdonJjnQmDBxkpTNICigqSB6fUKE1GAlTBiME04dF6YzmdEGowSP8PuQaEg2BAijr1gERRkwCQGCJwgV%2Bdz-OQMIxbfajCzjhhTM67Q6WZw6MiSHQvX6PTyIAccuHHSAGjA5GxMhQElBYyykCQwEyQhnoh9WDVSBh8-4wgxLdbbYHppw2AB3GTsBkpJ0um3kcK1uGN5tsVvrL0%2B0s9%2BtN7EDwLrQPB0Ojuh1vuTweR6Py7uL3sTlvTzUMROfFMZaCbpc7qdt%2BPZ3MMM-b-urpzBFjFsj38ePvfli0oK2d8JZQyIMGH%2BdIO1tICUBA-5h19KCYJ5INjhDMMEJFf5OCjOVEnQ0D90PZNU1PPD-izHNmUAuhgIwgsXzfUtSJALQBEIGhYU4Gx4HEGJAlKHIbG6PF9UYFQlHtEhOBZCBsnlLjQBLSgAGVK1BAAFajiXuCh5MlecVGwTV0HkEA8GiFo2g6A8VEybNOBQDQBD4IA&page=2&size=10&visibility=public\",\"search_token\":\"N4IgRg9gJgniBcoDOBLAXgUwQRgAwBoQBHAVwwCc5EQBbAQwBcBjACwH06AbThYAXz6EkEcgwQBtUAxQNOWaiKgUEIOkiYgBAXUJthJck3mgUAOyacSSpBJAooIQtNlYnLEjTCm6KHoSYQ3BhM0hCmAHT2jiABQSEoYeHOctHWTOQoAA6hptEo+QBmbLFy8WF5hWz0pigFGEhihABuKKhgvjJwOiAYAB4WVvW2YIysbPY2hGAYLHQtItGQvWzeNK7gEMumHtPk0UyMXBAA5mwA1hhw-khNVRgMdFCHbCSZTwwYbABWEGCTPZ4MFAoGZjtEMIDgaCqtAMH4AdMoaZTh9egw2HJkQwWNECoElOQVnQ1rj8RQVjtlIRQfV0ZlyBAvsFGnZkbS9CwMPdonJjnQmDBxkpTNICigqSB6fUKE1GAlTBiME04dF6YzmdEGowSP8PuQaEg2BAijr1gERRkwCQGCJwgV+dz-OQMIxbfajCzjhhTM67Q6WZw6MiSHQvX6PTyIAccuHHSAGjA5GxMhQElBYyykCQwEyQhnoh9WDVSBh8-4wgxLdbbYHppw2AB3GTsBkpJ0um3kcK1uGN5tsVvrL0+0s9+tN7EDwLrQPB0Ojuh1vuTweR6Py7uL3sTlvTzUMROfFMZaCbpc7qdt+PZ3MMM-b-urpzBFjFsj38ePvfli0oK2d8JZQyIMGH+dIO1tICUBA-5h19KCYJ5INjhDMMEJFf5OCjOVEnQ0D90PZNU1PPD-izHNmUAuhgIwgsXzfUtSJALQBEIGhYU4Gx4HEGJAlKHIbG6PF9UYFQlHtEhOBZCBsnlLjQBLSgAGVK1BAAFajiXuCh5MlecVGwTV0HkEA8GiFo2g6A8VEybNOBQDQBD4IA\"},\"info\":{\"name\":\"dc-api\",\"description\":\"NUL Digital Collections API\",\"version\":\"2.9.4\",\"link_expiration\":null}}" + }, + "redirectURL": "", + "headersSize": 1031, + "bodySize": 10832 + }, + "cache": {}, + "timings": { + "connect": -1.0, + "ssl": -1.0, + "send": 0.6444454193115234, + "receive": 0.5686283111572266, + "wait": 160.4323387145996 + }, + "serverIPAddress": "52.86.120.219" + }, + { + "startedDateTime": "2026-03-19T21:42:33.325393+00:00", + "time": 1790.9190654754639, + "request": { + "method": "POST", + "url": "https://api.dc.library.northwestern.edu/api/v2/search/works?page=1&size=5&visibility=public", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [ + { + "name": "host", + "value": "api.dc.library.northwestern.edu" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "accept", + "value": "*/*" + }, + { + "name": "accept-language", + "value": "*" + }, + { + "name": "sec-fetch-mode", + "value": "cors" + }, + { + "name": "user-agent", + "value": "node" + }, + { + "name": "accept-encoding", + "value": "br, gzip, deflate" + }, + { + "name": "content-length", + "value": "1200" + } + ], + "queryString": [ + { + "name": "page", + "value": "1" + }, + { + "name": "size", + "value": "5" + }, + { + "name": "visibility", + "value": "public" + } + ], + "headersSize": 305, + "bodySize": 1200, + "postData": { + "mimeType": "application/json", + "text": "{\"query\":{\"more_like_this\":{\"fields\":[\"title\",\"description\",\"subject.label\",\"genre.label\",\"contributor.label\",\"creator.label\"],\"like\":[{\"_id\":\"6464c86a-29e0-4aeb-ac5c-8e1c9bb0dfc2\"}],\"max_query_terms\":10,\"min_doc_freq\":1,\"min_term_freq\":1}},\"_source\":{\"includes\":[\"id\",\"title\",\"thumbnail\",\"collection.id\",\"collection.title\",\"description\",\"iiif_collection\",\"iiif_manifest\",\"visibility\"],\"excludes\":[\"batch_ids\",\"behavior\",\"box_name\",\"box_number\",\"catalog_key\",\"csv_metadata_update_jobs\",\"embedding\",\"embedding_model\",\"embedding_text_length\",\"folder_name\",\"folder_number\",\"ingest_project\",\"ingest_sheet\",\"legacy_identifier\",\"preservation_level\",\"project\",\"status\",\"terms_of_use\",\"contributor.facet\",\"creator.facet\",\"genre.facet\",\"language.facet\",\"location.facet\",\"style_period.facet\",\"subject.facet\",\"technique.facet\",\"contributor.label_with_role\",\"creator.label_with_role\",\"genre.label_with_role\",\"language.label_with_role\",\"location.label_with_role\",\"style_period.label_with_role\",\"subject.label_with_role\",\"technique.label_with_role\",\"contributor.variants\",\"creator.variants\",\"genre.variants\",\"language.variants\",\"location.variants\",\"style_period.variants\",\"subject.variants\",\"technique.variants\"]}}", + "params": [] + } + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + { + "name": "REDACTED", + "value": null, + "path": "/", + "domain": "", + "httpOnly": false, + "secure": false + } + ], + "headers": [ + { + "name": "Date", + "value": "Thu, 19 Mar 2026 21:42:35 GMT" + }, + { + "name": "Content-Type", + "value": "application/json; charset=UTF-8" + }, + { + "name": "Content-Length", + "value": "6298" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "access-control-allow-methods", + "value": "POST, GET, HEAD, OPTIONS" + }, + { + "name": "access-control-allow-credentials", + "value": "true" + }, + { + "name": "access-control-expose-headers", + "value": "Cache-Control, Content-Language, Content-Length, Content-Type, Date, ETag, Expires, Last-Modified, Pragma" + }, + { + "name": "access-control-max-age", + "value": "600" + }, + { + "name": "etag", + "value": "b6049b38e5f617c90eb2df6a6453edee" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "access-control-allow-headers", + "value": "Accept, Accept-Charset, Accept-Encoding, Accept-Language, Accept-Datetime, Authorization, Cache-Control, Content-Length, Content-Type, Cookie, Date, Expect, Host, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Origin, Pragma, Range, Referer, User-Agent, X-CSRF-Token, X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Port, X-Requested-With" + }, + { + "name": "set-cookie", + "value": "REDACTED" + }, + { + "name": "Apigw-Requestid", + "value": "afYXhimyoAMEZ1Q=" + } + ], + "content": { + "size": 6298, + "compression": 0, + "mimeType": "application/json; charset=UTF-8", + "text": "{\"data\":[{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/7fe53c51-a564-4a71-b052-2c72643739ef/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/7fe53c51-a564-4a71-b052-2c72643739ef?as=iiif\",\"description\":[\"Description of box : Large cardboard box\"],\"id\":\"7fe53c51-a564-4a71-b052-2c72643739ef\",\"collection\":{\"id\":\"450b857e-2e74-491e-9ef1-2c73e49f0c16\",\"title\":\"George Silas Duntley Photographs\"},\"title\":\"Unidentified boys and men on baseball team\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/b4bc2f92-88e6-4747-b7c6-1139b3e79817/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/b4bc2f92-88e6-4747-b7c6-1139b3e79817?as=iiif\",\"description\":[\"Description of box : Large cardboard box\"],\"id\":\"b4bc2f92-88e6-4747-b7c6-1139b3e79817\",\"collection\":{\"id\":\"450b857e-2e74-491e-9ef1-2c73e49f0c16\",\"title\":\"George Silas Duntley Photographs\"},\"title\":\"Unidentified men on baseball team with Rush on one uniform\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/7dd511b7-2bb0-4a87-8496-05411849f33b/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/7dd511b7-2bb0-4a87-8496-05411849f33b?as=iiif\",\"description\":[\"Description of box : Large cardboard box\"],\"id\":\"7dd511b7-2bb0-4a87-8496-05411849f33b\",\"collection\":{\"id\":\"450b857e-2e74-491e-9ef1-2c73e49f0c16\",\"title\":\"George Silas Duntley Photographs\"},\"title\":\"Unidentified men on baseball team with WINS on one uniform\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/88d7228f-69bf-478d-97d8-bc8365429d94/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/88d7228f-69bf-478d-97d8-bc8365429d94?as=iiif\",\"description\":[\"Description of box : Large cardboard box\"],\"id\":\"88d7228f-69bf-478d-97d8-bc8365429d94\",\"collection\":{\"id\":\"450b857e-2e74-491e-9ef1-2c73e49f0c16\",\"title\":\"George Silas Duntley Photographs\"},\"title\":\"Group of unidentified men and women standing or sitting outside in field\"},{\"thumbnail\":\"https://api.dc.library.northwestern.edu/api/v2/works/d74d8826-8a24-4dd5-9a25-8d9639998287/thumbnail\",\"visibility\":\"Public\",\"iiif_manifest\":\"https://api.dc.library.northwestern.edu/api/v2/works/d74d8826-8a24-4dd5-9a25-8d9639998287?as=iiif\",\"description\":[\"Description of box : Large cardboard box\"],\"id\":\"d74d8826-8a24-4dd5-9a25-8d9639998287\",\"collection\":{\"id\":\"450b857e-2e74-491e-9ef1-2c73e49f0c16\",\"title\":\"George Silas Duntley Photographs\"},\"title\":\"Five unidentified men standing in field\"}],\"pagination\":{\"query_url\":\"https://api.dc.library.northwestern.edu/api/v2/search/works?searchToken=N4IgRg9gJgniBcoDOBLAXgUwQVgDQgEcBXDAJzkRAFsJSMB9AGxQGsGAXACxSQVADMUGRlF7wA2iHYp2jLPigYkAY1IoADtIgA7EPiREwAKwzL2AOkYBDMML0gA5hm11LNu-mU72asEXa0braM9qoYVgGkQXYAuvjMbAjioPQoUAggAGwALDnKAByZVgC0AEwAnBgADMXZVhhgxVbK2MrF%2BRgAjMrlYGBVUPzKpSAAvnHUVgAe9MRkMPTsZFRinVX4VCja9FAQyvT8dAQInRtbi8sHRyejo-j0SBBEpMpYlFvKjESKYpJp9tJZPIpJwiFQwNorCgQp4IIw5GYUDpzP9YfDTFptOZAXJ7D9VBpMfYUCT%2BPQvOjETpiaT6FQrNoUPwlOx7AA3HgoMDQmRwCYYKafb5KJLgCLKTipUT2WycKwc2gyiAzSFUYGQFVg2ykUIRKyMCAOehsOCeJBsukYdhWKB6%2BhEdS2pb0IwQMC8fAYcEYKBQLYOexe2y%2B-106AeEBBn1%2B7RGpZTdhMZwOLj2fhwxSkeiq4HpkRkbNasjE2Ms%2BjqUgQExmEtOJCJpCcDBW%2BxyBzNBZpZzSQTF-AVpRkNkRJHbORsiMVqsY%2Bz1iJED1SZZIegQMkL4FebQ%2BLn%2BQL8Zotzx0CL7w%2Bs-BOFwYcwH14XkDWWNEKxOW-n1t7EfIu9HkD1mA5HLMgkSgd971nQxqwsX8HyWCVGTmcC-y3Hc-EiaJGHoAB3GRJUrXFj3CDDrGCHC8PoAjgSvVxSOEciuEouFgSfBwXzfOisNwxiqM-ZRvyxTiGPw5jZ3YQCGHUEDoEw4SmMI-8oIxWTuJEhT4M4RCSBUijeNhbdfD3KJhzUBl2EXMJT2MqxTO3RcaJvEyUDMxdWPYxybOcuy%2BIE8wnJcsSJOAtQZP87z9CUsw-M8gL8A0rSPNs8yQBiW4NnDRhfhAbDaBYXgJnTUh6VZeAQEUA8iEYB8IE0UcxFAOZyAAZR3WMAAUbKsNUllIeqQHUV83hATpZ3QIbsHZTluWYcSMnUQxmGUMZbiAA&page=1&size=5&visibility=public\",\"current_page\":1,\"limit\":5,\"offset\":0,\"total_hits\":395,\"total_pages\":79,\"format\":\"default\",\"next_url\":\"https://api.dc.library.northwestern.edu/api/v2/search/works?searchToken=N4IgRg9gJgniBcoDOBLAXgUwQVgDQgEcBXDAJzkRAFsJSMB9AGxQGsGAXACxSQVADMUGRlF7wA2iHYp2jLPigYkAY1IoADtIgA7EPiREwAKwzL2AOkYBDMML0gA5hm11LNu-mU72asEXa0braM9qoYVgGkQXYAuvjMbAjioPQoUAggAGwALDnKAByZVgC0AEwAnBgADMXZVhhgxVbK2MrF%2BRgAjMrlYGBVUPzKpSAAvnHUVgAe9MRkMPTsZFRinVX4VCja9FAQyvT8dAQInRtbi8sHRyejo-j0SBBEpMpYlFvKjESKYpJp9tJZPIpJwiFQwNorCgQp4IIw5GYUDpzP9YfDTFptOZAXJ7D9VBpMfYUCT%2BPQvOjETpiaT6FQrNoUPwlOx7AA3HgoMDQmRwCYYKafb5KJLgCLKTipUT2WycKwc2gyiAzSFUYGQFVg2ykUIRKyMCAOehsOCeJBsukYdhWKB6%2BhEdS2pb0IwQMC8fAYcEYKBQLYOexe2y%2B-106AeEBBn1%2B7RGpZTdhMZwOLj2fhwxSkeiq4HpkRkbNasjE2Ms%2BjqUgQExmEtOJCJpCcDBW%2BxyBzNBZpZzSQTF-AVpRkNkRJHbORsiMVqsY%2Bz1iJED1SZZIegQMkL4FebQ%2BLn%2BQL8Zotzx0CL7w%2Bs-BOFwYcwH14XkDWWNEKxOW-n1t7EfIu9HkD1mA5HLMgkSgd971nQxqwsX8HyWCVGTmcC-y3Hc-EiaJGHoAB3GRJUrXFj3CDDrGCHC8PoAjgSvVxSOEciuEouFgSfBwXzfOisNwxiqM-ZRvyxTiGPw5jZ3YQCGHUEDoEw4SmMI-8oIxWTuJEhT4M4RCSBUijeNhbdfD3KJhzUBl2EXMJT2MqxTO3RcaJvEyUDMxdWPYxybOcuy%2BIE8wnJcsSJOAtQZP87z9CUsw-M8gL8A0rSPNs8yQBiW4NnDRhfhAbDaBYXgJnTUh6VZeAQEUA8iEYB8IE0UcxFAOZyAAZR3WMAAUbKsNUllIeqQHUV83hATpZ3QIbsHZTluWYcSMnUQxmGUMZbiAA&page=2&size=5&visibility=public\",\"search_token\":\"N4IgRg9gJgniBcoDOBLAXgUwQVgDQgEcBXDAJzkRAFsJSMB9AGxQGsGAXACxSQVADMUGRlF7wA2iHYp2jLPigYkAY1IoADtIgA7EPiREwAKwzL2AOkYBDMML0gA5hm11LNu-mU72asEXa0braM9qoYVgGkQXYAuvjMbAjioPQoUAggAGwALDnKAByZVgC0AEwAnBgADMXZVhhgxVbK2MrF+RgAjMrlYGBVUPzKpSAAvnHUVgAe9MRkMPTsZFRinVX4VCja9FAQyvT8dAQInRtbi8sHRyejo-j0SBBEpMpYlFvKjESKYpJp9tJZPIpJwiFQwNorCgQp4IIw5GYUDpzP9YfDTFptOZAXJ7D9VBpMfYUCT+PQvOjETpiaT6FQrNoUPwlOx7AA3HgoMDQmRwCYYKafb5KJLgCLKTipUT2WycKwc2gyiAzSFUYGQFVg2ykUIRKyMCAOehsOCeJBsukYdhWKB6+hEdS2pb0IwQMC8fAYcEYKBQLYOexe2y+-106AeEBBn1+7RGpZTdhMZwOLj2fhwxSkeiq4HpkRkbNasjE2Ms+jqUgQExmEtOJCJpCcDBW+xyBzNBZpZzSQTF-AVpRkNkRJHbORsiMVqsY+z1iJED1SZZIegQMkL4FebQ+Ln+QL8Zotzx0CL7w+s-BOFwYcwH14XkDWWNEKxOW-n1t7EfIu9HkD1mA5HLMgkSgd971nQxqwsX8HyWCVGTmcC-y3Hc-EiaJGHoAB3GRJUrXFj3CDDrGCHC8PoAjgSvVxSOEciuEouFgSfBwXzfOisNwxiqM-ZRvyxTiGPw5jZ3YQCGHUEDoEw4SmMI-8oIxWTuJEhT4M4RCSBUijeNhbdfD3KJhzUBl2EXMJT2MqxTO3RcaJvEyUDMxdWPYxybOcuy+IE8wnJcsSJOAtQZP87z9CUsw-M8gL8A0rSPNs8yQBiW4NnDRhfhAbDaBYXgJnTUh6VZeAQEUA8iEYB8IE0UcxFAOZyAAZR3WMAAUbKsNUllIeqQHUV83hATpZ3QIbsHZTluWYcSMnUQxmGUMZbiAA\"},\"info\":{\"name\":\"dc-api\",\"description\":\"NUL Digital Collections API\",\"version\":\"2.9.4\",\"link_expiration\":null}}" + }, + "redirectURL": "", + "headersSize": 1030, + "bodySize": 6298 + }, + "cache": {}, + "timings": { + "connect": -1.0, + "ssl": -1.0, + "send": 0.6833076477050781, + "receive": 0.6620883941650391, + "wait": 1789.5736694335938 + }, + "serverIPAddress": "52.86.120.219" + } + ] + } +} \ No newline at end of file diff --git a/mcp/test/integration.test.ts b/mcp/test/integration.test.ts new file mode 100644 index 00000000..c9837e86 --- /dev/null +++ b/mcp/test/integration.test.ts @@ -0,0 +1,333 @@ +/** + * Integration tests for MCP server tools + * + * These tests use the MCP client with in-memory transport to test the full + * request/response cycle, and use MSW to record/replay HTTP requests to the + * Digital Collections API. + * + * To record new fixtures: + * npm run test:record + * + * To replay from fixtures (default): + * npm test + */ +import { describe, it, expect, beforeEach, afterEach } from "vitest"; + +import { createServer } from "../apps/mcp/server.js"; +import { + createTestContext, + type McpTestContext +} from "./support/mcp-harness.js"; + +const KNOWN_COLLECTION_ID = "18ec4c6b-192a-4ab8-9903-ea0f393c35f7"; +const KNOWN_WORK_ID = "6464c86a-29e0-4aeb-ac5c-8e1c9bb0dfc2"; + +describe("MCP Server Integration Tests", () => { + let context: McpTestContext; + + beforeEach(async () => { + context = await createTestContext(createServer); + }); + + afterEach(async () => { + await context.cleanup(); + }); + + describe("search tool", () => { + it("should search for works with a natural language query", async () => { + const result = await context.client.callTool({ + name: "search", + arguments: { + query: "photographs of Chicago", + max_results: 5, + page: 1, + public_only: true + } + }); + + expect(result.content).toHaveLength(1); + expect(result.content[0].type).toBe("text"); + + const response = JSON.parse((result.content[0] as any).text); + + expect(response).toHaveProperty("data"); + expect(response).toHaveProperty("pagination"); + expect(response).toHaveProperty("aggregations"); + expect(Array.isArray(response.data)).toBe(true); + expect(response.pagination.limit).toBe(5); + expect(response.pagination.current_page).toBe(1); + }); + + it("should search for works with field-based search", async () => { + const result = await context.client.callTool({ + name: "search", + arguments: { + fields: { + work_type: "Image", + subject: "Architecture" + }, + max_results: 10, + page: 1, + public_only: true + } + }); + + expect(result.content).toHaveLength(1); + const response = JSON.parse((result.content[0] as any).text); + + expect(response.data).toBeDefined(); + expect(response.pagination.limit).toBe(10); + }); + + it("should search with combined natural language and field filters", async () => { + const result = await context.client.callTool({ + name: "search", + arguments: { + query: "landscape", + fields: { + work_type: "Image" + }, + max_results: 5, + public_only: true + } + }); + + expect(result.content).toHaveLength(1); + const structuredContent: any = result.structuredContent; + expect(structuredContent.data).toBeDefined(); + expect(Array.isArray(structuredContent.data)).toBe(true); + }); + + it("should perform an empty search to get all works", async () => { + const result = await context.client.callTool({ + name: "search", + arguments: { + max_results: 5, + page: 1, + public_only: true + } + }); + + expect(result.content).toHaveLength(1); + const response = JSON.parse((result.content[0] as any).text); + + expect(response.data).toBeDefined(); + expect(response.pagination.total_hits).toBeGreaterThan(0); + expect(response.aggregations).toBeDefined(); + }); + + it("should include aggregations in search results", async () => { + const result = await context.client.callTool({ + name: "search", + arguments: { + query: "Northwestern", + max_results: 1, + public_only: true + } + }); + + const response = JSON.parse((result.content[0] as any).text); + + expect(response.aggregations).toBeDefined(); + expect(response.aggregations.collection).toBeDefined(); + expect(response.aggregations.work_type).toBeDefined(); + expect(response.aggregations.visibility).toBeDefined(); + expect(Array.isArray(response.aggregations.collection)).toBe(true); + }); + }); + + describe("view-search-results tool", () => { + it("should return a viewer for the results of a search", async () => { + const result = await context.client.callTool({ + name: "view-search-results", + arguments: { + query: "photographs of Chicago", + max_results: 5, + page: 1, + public_only: true + } + }); + + expect(result.content).toHaveLength(1); + expect(result.structuredContent).toHaveProperty("iiifContentUrl"); + const { iiifContentUrl } = result.structuredContent as any; + expect(iiifContentUrl).toContain("searchToken="); + expect(iiifContentUrl).toContain("size=5"); + expect(iiifContentUrl).toContain("page=1"); + expect(iiifContentUrl).toContain("as=iiif"); + }); + }); + + describe("get-work tool", () => { + it("should retrieve a work by ID", async () => { + // Use a known work ID from the Digital Collections + const workId = "6464c86a-29e0-4aeb-ac5c-8e1c9bb0dfc2"; // Replace with actual ID + + const result = await context.client.callTool({ + name: "get-work", + arguments: { + work_id: workId + } + }); + + expect(result.content).toHaveLength(1); + expect(result.content[0].type).toBe("text"); + + const work = JSON.parse((result.content[0] as any).text); + + expect(work).toHaveProperty("id"); + expect(work.id).toBe(workId); + expect(work).toHaveProperty("title"); + expect(work).toHaveProperty("work_type"); + }); + }); + + describe("view-work tool", () => { + it("should return a work viewer by ID", async () => { + const result = await context.client.callTool({ + name: "view-work", + arguments: { + work_id: KNOWN_WORK_ID + } + }); + + expect(result.content).toHaveLength(1); + expect(result.content[0].text).toContain(KNOWN_WORK_ID); + expect(result.structuredContent).toHaveProperty("iiifContentUrl"); + }); + }); + + describe("view-similar-works tool", () => { + it("should return a viewer for the results of a similarity search", async () => { + const result = await context.client.callTool({ + name: "view-similar-works", + arguments: { + work_id: KNOWN_WORK_ID, + max_results: 5, + page: 1, + public_only: true + } + }); + + expect(result.content).toHaveLength(1); + expect(result.structuredContent).toHaveProperty("iiifContentUrl"); + const { iiifContentUrl } = result.structuredContent as any; + expect(iiifContentUrl).toContain("searchToken="); + expect(iiifContentUrl).toContain("size=5"); + expect(iiifContentUrl).toContain("page=1"); + expect(iiifContentUrl).toContain("as=iiif"); + }); + }); + + describe("view-collection tool", () => { + it("should return a collection viewer by ID", async () => { + const result = await context.client.callTool({ + name: "view-collection", + arguments: { + collection_id: KNOWN_COLLECTION_ID + } + }); + + expect(result.content).toHaveLength(1); + expect(result.content[0].text).toContain(KNOWN_COLLECTION_ID); + expect(result.structuredContent).toHaveProperty("iiifContentUrl"); + }); + }); + + describe("list-collections tool", () => { + it("should list collections", async () => { + const result = await context.client.callTool({ + name: "list-collections", + arguments: { + max_results: 10, + page: 1, + public_only: true + } + }); + + expect(result.content).toHaveLength(1); + const response = JSON.parse((result.content[0] as any).text); + + expect(response).toHaveProperty("data"); + expect(response).toHaveProperty("pagination"); + expect(Array.isArray(response.data)).toBe(true); + expect(response.pagination.limit).toBe(10); + }); + }); + + describe("similarity-search tool", () => { + it("should find similar works", async () => { + const workId = "6464c86a-29e0-4aeb-ac5c-8e1c9bb0dfc2"; // Replace with actual ID + + const result = await context.client.callTool({ + name: "similarity-search", + arguments: { + work_id: workId, + max_results: 5, + page: 1, + public_only: true + } + }); + + expect(result.content).toHaveLength(1); + const response = JSON.parse((result.content[0] as any).text); + + expect(response).toHaveProperty("data"); + expect(response).toHaveProperty("pagination"); + expect(Array.isArray(response.data)).toBe(true); + }); + }); + + describe("tool listing", () => { + it("should list all available tools", async () => { + const tools = await context.client.listTools(); + + expect(tools.tools).toBeDefined(); + expect(tools.tools.length).toBeGreaterThan(0); + + const toolNames = tools.tools.map((t) => t.name); + expect(toolNames).toContain("search"); + expect(toolNames).toContain("get-work"); + expect(toolNames).toContain("list-collections"); + expect(toolNames).toContain("similarity-search"); + }); + + it("should include tool descriptions", async () => { + const tools = await context.client.listTools(); + + const searchTool = tools.tools.find((t) => t.name === "search"); + expect(searchTool).toBeDefined(); + expect(searchTool?.description).toBeTruthy(); + expect(searchTool?.inputSchema).toBeDefined(); + }); + }); + + describe("error handling", () => { + it("should handle invalid tool name", async () => { + const result = await context.client.callTool({ + name: "nonexistent-tool", + arguments: {} + }); + expect((result.content as any)[0].text).toBe( + "MCP error -32602: Tool nonexistent-tool not found" + ); + }); + + it("should handle invalid parameters", async () => { + const result = await context.client.callTool({ + name: "search", + arguments: { + max_results: 100, // Exceeds maximum of 20 + page: 1, + public_only: true + } + }); + expect((result.content as any)[0].text).toContain( + "Input validation error: Invalid arguments for tool search" + ); + expect((result.content as any)[0].text).toContain( + "Too big: expected number to be <=20" + ); + }); + }); +}); diff --git a/mcp/test/support/mcp-harness.ts b/mcp/test/support/mcp-harness.ts new file mode 100644 index 00000000..2ff51d59 --- /dev/null +++ b/mcp/test/support/mcp-harness.ts @@ -0,0 +1,44 @@ +/** + * Simpler test setup using openapi-fetch's custom fetch option + */ +import { Client } from "@modelcontextprotocol/sdk/client/index.js"; +import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js"; +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; + +export interface McpTestContext { + client: Client; + server: McpServer; + cleanup: () => Promise; +} + +/** + * Creates a test context with MCP server and client + */ +export async function createTestContext( + createServer: () => McpServer +): Promise { + const server = createServer(); + const [clientTransport, serverTransport] = + InMemoryTransport.createLinkedPair(); + + const client = new Client( + { + name: "test-client", + version: "1.0.0" + }, + { + capabilities: {} + } + ); + + await Promise.all([ + server.connect(serverTransport), + client.connect(clientTransport) + ]); + + const cleanup = async () => { + await Promise.all([client.close(), server.close()]); + }; + + return { client, server, cleanup }; +} diff --git a/mcp/test/support/redact.py b/mcp/test/support/redact.py new file mode 100644 index 00000000..81214b80 --- /dev/null +++ b/mcp/test/support/redact.py @@ -0,0 +1,25 @@ +import json +import re + +REDACT_RESPONSE_HEADERS = {"set-cookie", "x-api-key"} +REDACT_REQUEST_HEADERS = {"authorization", "x-api-key"} +REDACT_REQUEST_BODY = [ + ['"model_id":\\s*".+?"', '"model_id":"************"'], +] +PLACEHOLDER = "REDACTED" + +def response(flow): + for header in REDACT_REQUEST_HEADERS: + if header in flow.request.headers: + flow.request.headers[header] = PLACEHOLDER + + for header in REDACT_RESPONSE_HEADERS: + if header in flow.response.headers: + flow.response.headers[header] = PLACEHOLDER + + content_type = flow.request.headers.get("content-type", "") + if "application/json" in content_type and flow.request.content: + body = flow.request.content.decode("utf-8") + for pattern, replacement in REDACT_REQUEST_BODY: + body = re.sub(pattern, replacement, body) + flow.request.content = body.encode("utf-8") diff --git a/mcp/test/support/setup.ts b/mcp/test/support/setup.ts new file mode 100644 index 00000000..858e771d --- /dev/null +++ b/mcp/test/support/setup.ts @@ -0,0 +1,39 @@ +import { ProxyAgent, setGlobalDispatcher } from "undici"; +import * as fs from "node:fs"; +import * as path from "node:path"; +import { fromTraffic } from "@msw/source/traffic"; +import { setupServer } from "msw/node"; + +if (process.env.MSW_MODE === "record") { + console.log("Recording HTTP interactions to fixtures..."); + + setGlobalDispatcher( + new ProxyAgent({ + uri: "http://localhost:8080", + requestTls: { + ca: fs.readFileSync( + process.env.HOME + "/.mitmproxy/mitmproxy-ca-cert.pem" + ) + }, + proxyTls: { + ca: fs.readFileSync( + process.env.HOME + "/.mitmproxy/mitmproxy-ca-cert.pem" + ) + } + }) + ); +} + +if (process.env.MSW_MODE === "replay") { + process.env.SECRETS_PATH = ""; // Disable AWS Secrets Manager in replay tests + console.log("Replaying HTTP interactions from fixtures..."); + const traffic = JSON.parse( + fs.readFileSync( + path.join(__dirname, "../fixtures/interactions.har"), + "utf-8" + ) + ); + const handlers = [...fromTraffic(traffic)]; + const server = setupServer(...handlers); + server.listen({ onUnhandledRequest: "error" }); +} diff --git a/mcp/test/unit.test.ts b/mcp/test/unit.test.ts new file mode 100644 index 00000000..70b24417 --- /dev/null +++ b/mcp/test/unit.test.ts @@ -0,0 +1,290 @@ +/** + * Unit tests for pure functions and utilities + * + * These tests don't require HTTP mocking or MCP client/server setup. + * They test isolated business logic directly. + */ +import { describe, it, expect, beforeEach, afterEach, vi } from "vitest"; +import { + summarizeResults, + buildIIIFSearchUrl, + handleToolError +} from "../apps/mcp/common/functions.js"; +import { buildQuery } from "../apps/mcp/common/works.js"; +import { isEnum } from "../apps/mcp/common/schemas.js"; +import * as z from "zod/v4"; +import { McpError } from "@modelcontextprotocol/sdk/types"; + +describe("Pure Function Unit Tests", () => { + describe("summarizeResults", () => { + it("should format result summary correctly", () => { + const results = { + pagination: { + total_hits: 42, + total_pages: 5, + current_page: 2, + limit: 10 + }, + info: { + name: "test", + description: "test", + version: "1.0.0" + } + }; + + const summary = summarizeResults(results as any); + + expect(summary).toContain("42 results"); + expect(summary).toContain("5 pages"); + expect(summary).toContain("current page is 2"); + expect(summary).toContain("10 results per page"); + }); + + it("should handle singular result correctly", () => { + const results = { + pagination: { + total_hits: 1, + total_pages: 1, + current_page: 1, + limit: 1 + }, + info: { + name: "test", + description: "test", + version: "1.0.0" + } + }; + + const summary = summarizeResults(results as any); + + expect(summary).toContain("1 result"); + expect(summary).toContain("1 page"); + expect(summary).toContain("1 result per page"); + expect(summary).not.toContain("results"); + expect(summary).not.toContain("pages"); + }); + }); + + describe("buildIIIFSearchUrl", () => { + it("should construct valid IIIF search URL", () => { + const queryObject = { + query: { + match: { + all_text: "test query" + } + }, + size: 10 + }; + + const options = { + page: 1, + size: 10 + }; + + const url = buildIIIFSearchUrl(queryObject, options); + + expect(url).toContain("/search/works"); + expect(url).toContain("searchToken="); + expect(url).toContain("page=1"); + expect(url).toContain("size=10"); + expect(url).toContain("as=iiif"); + }); + + it("should encode search token in URL", () => { + const queryObject = { + query: { + match: { + title: "Chicago" + } + }, + size: 5 + }; + + const url = buildIIIFSearchUrl(queryObject, { page: 2, size: 5 }); + + expect(url).toMatch(/searchToken=[A-Za-z0-9_-]+/); + expect(url).toContain("page=2"); + expect(url).toContain("size=5"); + }); + }); + + describe("buildQuery", () => { + it("should build query for natural language search", () => { + const input = { + query: "photographs of Chicago", + max_results: 10, + page: 2, + public_only: true + }; + + const { query, options } = buildQuery(input); + + expect(query.query).toBeDefined(); + expect(query.query?.neural).toBeDefined(); + expect(query.query?.neural?.embedding?.query_text).toBe( + "photographs of Chicago" + ); + expect(options.size).toBe(10); + expect(options.page).toBe(2); + expect(options.visibility).toStrictEqual("public"); + }); + + it("should build query for field-based search", () => { + const input = { + fields: { + work_type: "Image", + subject: "Architecture" + }, + max_results: 5, + page: 1, + public_only: true + }; + + const { query, options } = buildQuery(input); + + expect(query.query).toBeDefined(); + expect(query.query.bool).toBeDefined(); + expect(query.query.bool.should.length).toBe(2); + }); + + it("should combine natural language and field filters", () => { + const input = { + query: "landscape", + fields: { + work_type: "Image" + }, + max_results: 10, + page: 1, + public_only: true + }; + + const { query } = buildQuery(input); + expect(query.query.hybrid).toBeDefined(); + expect(query.query.hybrid.queries).toBeDefined(); + expect(query.query.hybrid.queries.length).toBe(2); + }); + + it("should apply public_only filter when true", () => { + const input = { + query: "test", + max_results: 10, + page: 1, + public_only: true + }; + + const { options } = buildQuery(input); + expect(options.visibility).toStrictEqual("public"); + }); + + it("should not filter by visibility when public_only is false", () => { + const input = { + query: "test", + max_results: 10, + page: 1, + public_only: false + }; + + const { options } = buildQuery(input); + expect(options.visibility).toBe("institution,public"); + }); + + it("should include aggregations in query", () => { + const input = { + query: "test", + max_results: 10, + page: 1, + public_only: true + }; + + const { query } = buildQuery(input); + + expect(query.aggs).toBeDefined(); + expect(query.aggs.collection).toBeDefined(); + expect(query.aggs.work_type).toBeDefined(); + expect(query.aggs.visibility).toBeDefined(); + }); + + it("should handle empty search (list all)", () => { + const input = { + max_results: 10, + page: 1, + public_only: true + }; + + const { query, options } = buildQuery(input); + + expect(options.size).toBe(10); + }); + }); + + describe("isEnum", () => { + it("should detect enum types", () => { + const enumSchema = z.enum(["a", "b", "c"]); + expect(isEnum(enumSchema)).toBe(true); + }); + + it("should detect optional enum types", () => { + const optionalEnumSchema = z.enum(["a", "b", "c"]).optional(); + expect(isEnum(optionalEnumSchema)).toBe(true); + }); + + it("should return false for non-enum types", () => { + const stringSchema = z.string(); + expect(isEnum(stringSchema)).toBe(false); + }); + + it("should return false for number types", () => { + const numberSchema = z.number(); + expect(isEnum(numberSchema)).toBe(false); + }); + }); + + describe("handleToolError", () => { + beforeEach(() => { + vi.spyOn(console, "error").mockImplementation(() => {}); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + it("should throw McpError with InvalidParams for ZodError", () => { + const schema = z.object({ + name: z.string(), + age: z.number() + }); + expect(() => { + try { + schema.parse({ name: "Alice", age: "not a number" }); + } catch (error) { + handleToolError(error); + } + }).toThrow(McpError); + expect(console.error).toHaveBeenCalledOnce(); + expect(console.error).toHaveBeenCalledWith( + expect.objectContaining({ + message: expect.stringContaining( + "Invalid input: expected number, received string" + ) + }) + ); + }); + + it("should throw McpError with InternalError for generic errors", () => { + expect(() => { + try { + throw new Error("Generic Error"); + } catch (error) { + handleToolError(error); + } + }).toThrow(McpError); + + expect(console.error).toHaveBeenCalledOnce(); + expect(console.error).toHaveBeenCalledWith( + expect.objectContaining({ + message: expect.stringContaining("Generic Error") + }) + ); + }); + }); +}); diff --git a/mcp/vitest.config.ts b/mcp/vitest.config.ts new file mode 100644 index 00000000..37d14492 --- /dev/null +++ b/mcp/vitest.config.ts @@ -0,0 +1,29 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig(() => { + return { + define: { + "process.env": process.env + }, + test: { + globals: true, + environment: "node", + include: ["test/**/*.test.ts"], + exclude: ["**/node_modules/**", "**/dist/**"], + setupFiles: ["./test/support/setup.ts"], + coverage: { + provider: "v8", + reporter: ["text", "json", "html"], + include: ["apps/mcp/**/*.ts"], + exclude: [ + "test/**", + "apps/mcp/**/*.d.ts", + "apps/mcp/handlers/*.ts", + "apps/mcp/vite.config.ts" + ] + }, + // Increase timeout for integration tests that may hit real APIs in record mode + testTimeout: 10000 + } + }; +});