diff --git a/README.md b/README.md index 018e5eff..c5b63c2e 100644 --- a/README.md +++ b/README.md @@ -175,17 +175,19 @@ If you want one control plane in front of multiple models, point the UI at LiteL ```powershell $repoRoot = git rev-parse --show-toplevel Set-Location $repoRoot -litellm --host 127.0.0.1 --port 4000 +.\scripts\start-litellm.ps1 ``` Then in the AG-Claw settings UI: - Provider: `openai-compatible` - API URL: `http://127.0.0.1:4000` -- API key: your LiteLLM bearer token if enabled +- API key: `agclaw-dev-key` by default, or your LiteLLM bearer token if you changed it That same gateway URL also works with the local benchmark script below. +The starter config lives at `litellm/agclaw-config.local.yaml` and exposes `qwen2.5:3b`, `gemma3:1b`, and `qwen2.5vl:3b` through one OpenAI-compatible endpoint. + ## Governed Eval Assets The `promptfoo` pack now includes an allowlisted Hugging Face ingestion path for evaluation assets. @@ -201,6 +203,18 @@ Imported samples are written under `promptfoo/cases/hf/` and include governance If Hugging Face traffic is intercepted by a corporate proxy, set `AGCLAW_HF_CA_FILE` to the proxy PEM bundle before running the importer. Use `AGCLAW_HF_ALLOW_INSECURE_TLS=1` only as a temporary fallback. +Build and run the multimodal promptfoo packs after importing both `rico-screen2words` and `ocr-vqa` samples: + +```powershell +$repoRoot = git rev-parse --show-toplevel +Set-Location (Join-Path $repoRoot "promptfoo") +npm install +$env:AGCLAW_PROMPTFOO_VISION_PROVIDER = "ollama" +$env:AGCLAW_PROMPTFOO_VISION_BASE_URL = "http://127.0.0.1:11434" +$env:AGCLAW_PROMPTFOO_VISION_MODEL = "qwen2.5vl:3b" +npm run gate:vision-all +``` + ## Local Benchmark Pass To compare the small local assistant defaults from this slice: diff --git a/backend/agclaw_backend/mes_services.py b/backend/agclaw_backend/mes_services.py index bb6557bb..bc91cfd8 100644 --- a/backend/agclaw_backend/mes_services.py +++ b/backend/agclaw_backend/mes_services.py @@ -20,6 +20,18 @@ ) +def _route_suffix(route_key: str) -> str: + normalized = "_".join(part for part in str(route_key or "").strip().upper().split("-") if part) + return f"_{normalized}" if normalized else "" + + +def _route_env(base_name: str, route_key: str = "") -> str: + routed = os.getenv(f"{base_name}{_route_suffix(route_key)}", "").strip() + if routed: + return routed + return os.getenv(base_name, "").strip() + + def _request_json( url: str, payload: dict[str, object], @@ -104,24 +116,24 @@ def _extract_vision_summary(response: dict[str, object]) -> str: return "" -def _vision_adapter() -> tuple[str, str, str, str]: - provider = os.getenv("AGCLAW_SCREEN_VISION_PROVIDER", "").strip().lower() - base_url = os.getenv("AGCLAW_SCREEN_VISION_BASE_URL", "").strip() - api_key = os.getenv("AGCLAW_SCREEN_VISION_API_KEY", "").strip() - model = os.getenv("AGCLAW_SCREEN_VISION_MODEL", "").strip() +def _vision_adapter(route_key: str = "") -> tuple[str, str, str, str]: + provider = _route_env("AGCLAW_SCREEN_VISION_PROVIDER", route_key).lower() + base_url = _route_env("AGCLAW_SCREEN_VISION_BASE_URL", route_key) + api_key = _route_env("AGCLAW_SCREEN_VISION_API_KEY", route_key) + model = _route_env("AGCLAW_SCREEN_VISION_MODEL", route_key) return provider, base_url, api_key, model -def _vision_timeout_seconds() -> float: - raw_value = os.getenv("AGCLAW_SCREEN_VISION_TIMEOUT_SECONDS", "180").strip() +def _vision_timeout_seconds(route_key: str = "") -> float: + raw_value = _route_env("AGCLAW_SCREEN_VISION_TIMEOUT_SECONDS", route_key) or "180" try: return max(30.0, float(raw_value)) except ValueError: return 180.0 -def _run_openai_vision(prompt: str, image_data_url: str) -> tuple[str, str]: - provider, base_url, api_key, model = _vision_adapter() +def _run_openai_vision(prompt: str, image_data_url: str, route_key: str = "") -> tuple[str, str]: + provider, base_url, api_key, model = _vision_adapter(route_key) if provider not in {"github-models", "openai", "openai-compatible", "ollama", "vllm"} or not base_url or not model or not image_data_url: return "heuristic", "" @@ -149,7 +161,7 @@ def _run_openai_vision(prompt: str, image_data_url: str) -> tuple[str, str]: target = f"{base_url.rstrip('/')}/chat/completions" else: target = f"{base_url.rstrip('/')}/v1/chat/completions" - response = _request_json(target, payload, headers, timeout_seconds=_vision_timeout_seconds()) + response = _request_json(target, payload, headers, timeout_seconds=_vision_timeout_seconds(route_key)) return provider, _extract_vision_summary(response) @@ -226,7 +238,7 @@ def interpret_screen(request: ScreenInterpretRequest) -> ScreenInterpretResponse "and any operator prompts. Do not suggest control actions." ) try: - adapter, vision_summary = _run_openai_vision(vision_prompt, request.image_data_url) + adapter, vision_summary = _run_openai_vision(vision_prompt, request.image_data_url, route_key="hmi") if vision_summary.strip(): observations.append(f"Vision summary: {vision_summary.strip()}") except RuntimeError as error: diff --git a/backend/tests/test_live_vision.py b/backend/tests/test_live_vision.py index 454ea4bb..884f8389 100644 --- a/backend/tests/test_live_vision.py +++ b/backend/tests/test_live_vision.py @@ -5,6 +5,7 @@ import time import unittest from pathlib import Path +from urllib.parse import urljoin from urllib.request import Request, urlopen from agclaw_backend.http_api import create_server @@ -14,6 +15,10 @@ def _enabled() -> bool: return os.getenv("AGCLAW_LIVE_VISION_TESTS") == "1" +def _vision_env(base_name: str) -> str: + return os.getenv(f"{base_name}_HMI") or os.getenv(base_name, "") + + @unittest.skipUnless(_enabled(), "Set AGCLAW_LIVE_VISION_TESTS=1 to run live local vision checks.") class LiveVisionTests(unittest.TestCase): @classmethod @@ -23,6 +28,10 @@ def setUpClass(cls) -> None: "AGCLAW_SCREEN_VISION_BASE_URL": os.getenv("AGCLAW_SCREEN_VISION_BASE_URL"), "AGCLAW_SCREEN_VISION_API_KEY": os.getenv("AGCLAW_SCREEN_VISION_API_KEY"), "AGCLAW_SCREEN_VISION_MODEL": os.getenv("AGCLAW_SCREEN_VISION_MODEL"), + "AGCLAW_SCREEN_VISION_PROVIDER_HMI": os.getenv("AGCLAW_SCREEN_VISION_PROVIDER_HMI"), + "AGCLAW_SCREEN_VISION_BASE_URL_HMI": os.getenv("AGCLAW_SCREEN_VISION_BASE_URL_HMI"), + "AGCLAW_SCREEN_VISION_API_KEY_HMI": os.getenv("AGCLAW_SCREEN_VISION_API_KEY_HMI"), + "AGCLAW_SCREEN_VISION_MODEL_HMI": os.getenv("AGCLAW_SCREEN_VISION_MODEL_HMI"), } os.environ["AGCLAW_SCREEN_VISION_PROVIDER"] = os.getenv("AGCLAW_SCREEN_VISION_PROVIDER", "ollama") @@ -31,10 +40,11 @@ def setUpClass(cls) -> None: os.environ["AGCLAW_SCREEN_VISION_MODEL"] = os.getenv("AGCLAW_SCREEN_VISION_MODEL", "qwen2.5vl:3b") os.environ["AGCLAW_SCREEN_VISION_TIMEOUT_SECONDS"] = os.getenv("AGCLAW_SCREEN_VISION_TIMEOUT_SECONDS", "180") - with urlopen("http://127.0.0.1:11434/api/tags", timeout=10) as response: + tags_url = urljoin(_vision_env("AGCLAW_SCREEN_VISION_BASE_URL").rstrip("/") + "/", "api/tags") + with urlopen(tags_url, timeout=10) as response: payload = json.loads(response.read().decode("utf-8")) models = {item.get("name", "") for item in payload.get("models", [])} - required_model = os.environ["AGCLAW_SCREEN_VISION_MODEL"] + required_model = _vision_env("AGCLAW_SCREEN_VISION_MODEL") if required_model not in models: raise unittest.SkipTest(f"Required local vision model is not installed: {required_model}") diff --git a/docker/docker-compose.litellm.yml b/docker/docker-compose.litellm.yml new file mode 100644 index 00000000..3e1f2205 --- /dev/null +++ b/docker/docker-compose.litellm.yml @@ -0,0 +1,20 @@ +services: + litellm: + image: ghcr.io/berriai/litellm:main-latest + ports: + - "${LITELLM_PORT:-4000}:4000" + environment: + # HuggingFace token — required for vision-*-hosted routes. + - HF_TOKEN=${HF_TOKEN:-} + # Override the master key if needed; keep the default only for local dev. + - LITELLM_MASTER_KEY=${LITELLM_MASTER_KEY:-agclaw-dev-key} + volumes: + - ../litellm/agclaw-config.local.yaml:/app/config.yaml:ro + command: ["--config", "/app/config.yaml", "--port", "4000"] + restart: unless-stopped + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:4000/health"] + interval: 30s + timeout: 5s + retries: 3 + start_period: 15s diff --git a/docs/agclaw-vision-runbook.md b/docs/agclaw-vision-runbook.md index 2dce55d4..58014d8e 100644 --- a/docs/agclaw-vision-runbook.md +++ b/docs/agclaw-vision-runbook.md @@ -9,6 +9,7 @@ Validate that `/api/mes/interpret-screen` is using a real vision-capable endpoin - `openai-compatible` - `ollama` - `vllm` +- `github-models` ## Required Environment @@ -19,6 +20,15 @@ $env:AGCLAW_SCREEN_VISION_BASE_URL = "http://127.0.0.1:8000" $env:AGCLAW_SCREEN_VISION_MODEL = "Qwen/Qwen2.5-VL-7B-Instruct" ``` +Task-routed local HMI setup on this workstation: + +```powershell +$env:AGCLAW_SCREEN_VISION_PROVIDER_HMI = "ollama" +$env:AGCLAW_SCREEN_VISION_BASE_URL_HMI = "http://127.0.0.1:11500" +$env:AGCLAW_SCREEN_VISION_MODEL_HMI = "qwen2.5vl:7b" +$env:AGCLAW_SCREEN_VISION_TIMEOUT_SECONDS_HMI = "360" +``` + Optional: ```powershell @@ -49,3 +59,40 @@ python -m agclaw_backend.server --host 127.0.0.1 --port 8008 - Treat all output as advisory-only. - Do not allow the vision path to generate control commands or bypass approval gates. + +## Verified Local Result + +This repository has now been validated against real local multimodal endpoints using: + +```powershell +$env:AGCLAW_SCREEN_VISION_PROVIDER = "ollama" +$env:AGCLAW_SCREEN_VISION_BASE_URL = "http://127.0.0.1:11500" +$env:AGCLAW_SCREEN_VISION_MODEL = "qwen2.5vl:7b" +``` + +The validated path covers: + +- backend live vision unit test against `backend/tests/fixtures/hmi-sample.png` +- browser E2E upload flow through `Research Workbench -> HMI Review` +- promptfoo `gate:vision-caption` + +Expected verified outcome: + +- `Adapter: ollama` +- visible `Vision summary:` content +- batch or recipe context called out without control-action instructions + +Observed local limitation: + +- `qwen2.5vl:3b` on the default local Ollama port fell back to `Adapter: heuristic` on the HMI fixture because the request exceeded available system memory on this workstation. +- `qwen2.5vl:7b` on the alternate E-backed Ollama instance handled backend HMI interpretation and the promptfoo caption pack successfully. +- `gemma3:4b` on the alternate E-backed Ollama instance handled the sampled OCR workload successfully. +- A single local model still does not pass every pack on this workstation, so the most reliable local split is `qwen2.5vl:7b` for screenshot captioning and HMI review, and `gemma3:4b` for the sampled OCR suite. + +## Routed LiteLLM Option + +If you want a single OpenAI-compatible endpoint with task aliases, use the starter LiteLLM config and route these model names through it: + +- `vision-caption-local` -> `qwen2.5vl:7b` +- `vision-hmi-local` -> `qwen2.5vl:7b` +- `vision-ocr-local` -> `gemma3:4b` diff --git a/litellm/agclaw-config.local.yaml b/litellm/agclaw-config.local.yaml new file mode 100644 index 00000000..f9080768 --- /dev/null +++ b/litellm/agclaw-config.local.yaml @@ -0,0 +1,61 @@ +# Change api_base to http://127.0.0.1:11500 if you route through the E-backed Ollama instance. +model_list: + - model_name: qwen2.5:3b + litellm_params: + model: ollama/qwen2.5:3b + api_base: http://127.0.0.1:11434 + + - model_name: gemma3:1b + litellm_params: + model: ollama/gemma3:1b + api_base: http://127.0.0.1:11434 + + - model_name: gemma3:4b + litellm_params: + model: ollama/gemma3:4b + api_base: http://127.0.0.1:11434 + + - model_name: qwen2.5vl:3b + litellm_params: + model: ollama/qwen2.5vl:3b + api_base: http://127.0.0.1:11434 + + - model_name: qwen2.5vl:7b + litellm_params: + model: ollama/qwen2.5vl:7b + api_base: http://127.0.0.1:11500 + + - model_name: vision-caption-local + litellm_params: + model: ollama/qwen2.5vl:7b + api_base: http://127.0.0.1:11500 + + - model_name: vision-hmi-local + litellm_params: + model: ollama/qwen2.5vl:7b + api_base: http://127.0.0.1:11500 + + - model_name: vision-ocr-local + litellm_params: + model: ollama/gemma3:4b + api_base: http://127.0.0.1:11500 + + # HuggingFace hosted models — requires HF_TOKEN env var. + - model_name: vision-caption-hosted + litellm_params: + model: huggingface/Qwen/Qwen2.5-VL-7B-Instruct + api_key: os.environ/HF_TOKEN + + - model_name: vision-hmi-hosted + litellm_params: + model: huggingface/Qwen/Qwen2.5-VL-7B-Instruct + api_key: os.environ/HF_TOKEN + + - model_name: vision-ocr-hosted + litellm_params: + model: huggingface/google/gemma-3-4b-it + api_key: os.environ/HF_TOKEN + +general_settings: + master_key: agclaw-dev-key + completion_model: qwen2.5:3b \ No newline at end of file diff --git a/litellm/start.sh b/litellm/start.sh new file mode 100755 index 00000000..13d83815 --- /dev/null +++ b/litellm/start.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +# LiteLLM launcher for the AG-Claw multimodal gateway. +# +# Usage: +# ./litellm/start.sh [--config ] [--port ] +# +# Environment: +# HF_TOKEN HuggingFace token for hosted-model routes (required for +# vision-caption-hosted, vision-hmi-hosted, vision-ocr-hosted). +# LITELLM_PORT Listening port (default: 4000). +# LITELLM_CONFIG Path to the LiteLLM config file +# (default: /agclaw-config.local.yaml). + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +CONFIG="${LITELLM_CONFIG:-${SCRIPT_DIR}/agclaw-config.local.yaml}" +PORT="${LITELLM_PORT:-4000}" + +# Parse optional CLI overrides. +while [[ $# -gt 0 ]]; do + case "$1" in + --config) + CONFIG="$2" + shift 2 + ;; + --port) + PORT="$2" + shift 2 + ;; + *) + echo "Unknown option: $1" >&2 + exit 1 + ;; + esac +done + +if [[ ! -f "${CONFIG}" ]]; then + echo "LiteLLM config not found: ${CONFIG}" >&2 + exit 1 +fi + +if [[ -z "${HF_TOKEN:-}" ]]; then + echo "Warning: HF_TOKEN is not set — hosted HuggingFace routes will be unavailable." >&2 +fi + +echo "Starting LiteLLM proxy config=${CONFIG} port=${PORT}" +exec litellm --config "${CONFIG}" --port "${PORT}" diff --git a/promptfoo/README.md b/promptfoo/README.md index dfafad8e..0832f2da 100644 --- a/promptfoo/README.md +++ b/promptfoo/README.md @@ -20,6 +20,68 @@ Available allowlist keys are defined in `hf-eval-assets.manifest.json`. Imported If your network injects a corporate TLS certificate, set `AGCLAW_HF_CA_FILE` to that PEM file. As a last resort for locked-down lab machines, you can set `AGCLAW_HF_ALLOW_INSECURE_TLS=1` for the import session. +The importer now snapshots referenced image assets into `cases/hf/assets/` and records `local_image_path` so multimodal eval suites do not depend on expiring Hugging Face asset URLs. + +Build the multimodal eval packs after importing the datasets you want to use: + +```powershell +cd promptfoo +npm install +npm run build:hf-evals +``` + +Run the suites against a real multimodal endpoint, for example local Ollama or LiteLLM in front of Ollama: + +```powershell +$env:AGCLAW_PROMPTFOO_VISION_PROVIDER = "ollama" +$env:AGCLAW_PROMPTFOO_VISION_BASE_URL = "http://127.0.0.1:11500" +$env:AGCLAW_PROMPTFOO_VISION_MODEL = "qwen2.5vl:7b" +npm run gate:vision-all +``` + +Task-routed local setup on this workstation: + +```powershell +$env:AGCLAW_PROMPTFOO_VISION_PROVIDER_CAPTION = "ollama" +$env:AGCLAW_PROMPTFOO_VISION_BASE_URL_CAPTION = "http://127.0.0.1:11500" +$env:AGCLAW_PROMPTFOO_VISION_MODEL_CAPTION = "qwen2.5vl:7b" + +$env:AGCLAW_PROMPTFOO_VISION_PROVIDER_HMI = "ollama" +$env:AGCLAW_PROMPTFOO_VISION_BASE_URL_HMI = "http://127.0.0.1:11500" +$env:AGCLAW_PROMPTFOO_VISION_MODEL_HMI = "qwen2.5vl:7b" + +$env:AGCLAW_PROMPTFOO_VISION_PROVIDER_OCR = "ollama" +$env:AGCLAW_PROMPTFOO_VISION_BASE_URL_OCR = "http://127.0.0.1:11500" +$env:AGCLAW_PROMPTFOO_VISION_MODEL_OCR = "gemma3:4b" + +npm run gate:vision-all +``` + +The promptfoo vision provider now honors per-task overrides via: + +- `AGCLAW_PROMPTFOO_VISION_PROVIDER_CAPTION`, `..._BASE_URL_CAPTION`, `..._MODEL_CAPTION`, `..._API_KEY_CAPTION` +- `AGCLAW_PROMPTFOO_VISION_PROVIDER_HMI`, `..._BASE_URL_HMI`, `..._MODEL_HMI`, `..._API_KEY_HMI` +- `AGCLAW_PROMPTFOO_VISION_PROVIDER_OCR`, `..._BASE_URL_OCR`, `..._MODEL_OCR`, `..._API_KEY_OCR` + +When `AGCLAW_PROMPTFOO_VISION_PROVIDER_*` is `ollama`, the provider now uses Ollama's native `/api/chat` route and defaults `AGCLAW_PROMPTFOO_VISION_KEEP_ALIVE_*` to `0s` so Qwen and Gemma do not stay resident between task packs on this workstation. + +Packs included in this repo: + +- `gate:vision-caption`: dataset-driven UI caption checks from `rico-screen2words` +- `gate:vision-ocr`: dataset-driven OCR visual QA checks from `ocr-vqa` +- `gate:vision-screen-review`: AG-Claw HMI review checks using the local HMI fixture + +Validated local status on this workstation: + +- `gate:vision-caption`: passes on `qwen2.5vl:7b` via the E-backed Ollama instance on `http://127.0.0.1:11500` +- `gate:vision-screen-review`: backend HMI interpretation and advisory review behave well on `qwen2.5vl:7b` +- `gate:vision-ocr`: passes on `gemma3:4b` via the same E-backed Ollama instance +- `gate:vision-all`: passes when task-based routing is enabled so caption/HMI use `qwen2.5vl:7b` and OCR uses `gemma3:4b` + +Caption pack note: + +- The generated caption pack now uses explicit UI-aware expectations for the current RICO fixtures instead of raw keyword extraction from upstream captions, which was too brittle for screenshot descriptions. + This pack is designed for AG-Claw research prompts. It checks for: - unsafe industrial recommendations diff --git a/promptfoo/cases/hf/assets/ocr-vqa/0000.jpg b/promptfoo/cases/hf/assets/ocr-vqa/0000.jpg new file mode 100644 index 00000000..bbe3b3e5 Binary files /dev/null and b/promptfoo/cases/hf/assets/ocr-vqa/0000.jpg differ diff --git a/promptfoo/cases/hf/assets/ocr-vqa/0001.jpg b/promptfoo/cases/hf/assets/ocr-vqa/0001.jpg new file mode 100644 index 00000000..a01923fc Binary files /dev/null and b/promptfoo/cases/hf/assets/ocr-vqa/0001.jpg differ diff --git a/promptfoo/cases/hf/assets/ocr-vqa/0002.jpg b/promptfoo/cases/hf/assets/ocr-vqa/0002.jpg new file mode 100644 index 00000000..089c4561 Binary files /dev/null and b/promptfoo/cases/hf/assets/ocr-vqa/0002.jpg differ diff --git a/promptfoo/cases/hf/assets/ocr-vqa/0003.jpg b/promptfoo/cases/hf/assets/ocr-vqa/0003.jpg new file mode 100644 index 00000000..c9e59ebf Binary files /dev/null and b/promptfoo/cases/hf/assets/ocr-vqa/0003.jpg differ diff --git a/promptfoo/cases/hf/assets/ocr-vqa/0004.jpg b/promptfoo/cases/hf/assets/ocr-vqa/0004.jpg new file mode 100644 index 00000000..7b29d305 Binary files /dev/null and b/promptfoo/cases/hf/assets/ocr-vqa/0004.jpg differ diff --git a/promptfoo/cases/hf/assets/rico-screen2words/0000.jpg b/promptfoo/cases/hf/assets/rico-screen2words/0000.jpg new file mode 100644 index 00000000..3cfa46ff Binary files /dev/null and b/promptfoo/cases/hf/assets/rico-screen2words/0000.jpg differ diff --git a/promptfoo/cases/hf/assets/rico-screen2words/0001.jpg b/promptfoo/cases/hf/assets/rico-screen2words/0001.jpg new file mode 100644 index 00000000..b6f63f6a Binary files /dev/null and b/promptfoo/cases/hf/assets/rico-screen2words/0001.jpg differ diff --git a/promptfoo/cases/hf/assets/rico-screen2words/0002.jpg b/promptfoo/cases/hf/assets/rico-screen2words/0002.jpg new file mode 100644 index 00000000..565de342 Binary files /dev/null and b/promptfoo/cases/hf/assets/rico-screen2words/0002.jpg differ diff --git a/promptfoo/cases/hf/assets/rico-screen2words/0003.jpg b/promptfoo/cases/hf/assets/rico-screen2words/0003.jpg new file mode 100644 index 00000000..6cf8e0a9 Binary files /dev/null and b/promptfoo/cases/hf/assets/rico-screen2words/0003.jpg differ diff --git a/promptfoo/cases/hf/assets/rico-screen2words/0004.jpg b/promptfoo/cases/hf/assets/rico-screen2words/0004.jpg new file mode 100644 index 00000000..dbf0cc7b Binary files /dev/null and b/promptfoo/cases/hf/assets/rico-screen2words/0004.jpg differ diff --git a/promptfoo/cases/hf/ocr-vqa.validation.jsonl b/promptfoo/cases/hf/ocr-vqa.validation.jsonl new file mode 100644 index 00000000..aecdf7d7 --- /dev/null +++ b/promptfoo/cases/hf/ocr-vqa.validation.jsonl @@ -0,0 +1,2 @@ +{"dataset_key":"ocr-vqa","dataset":"howard-hou/OCR-VQA","config":"default","split":"validation","imported_at":"2026-04-09T20:27:06.154Z","purpose":"OCR-heavy multimodal validation assets for screenshot and label extraction checks.","governance":{"reviewRequired":true,"licenseNotes":"Review upstream dataset card and downstream image licensing before broader redistribution.","allowedUses":["Internal evaluation asset generation","Prompt quality checks","Multimodal regression sampling"],"disallowedUses":["Blind production fine-tuning","Automatic redistribution without review"]},"local_image_path":"cases/hf/assets/ocr-vqa/0000.jpg","row_idx":0,"row":{"image":{"src":"https://datasets-server.huggingface.co/assets/howard-hou/OCR-VQA/--/default/validation/0/image/image.jpg?Expires=1775770025&Signature=APR7bIcmkmjCPT707kE5GLoCfBK8ZUtfIN3HXekrozHpAt6jeu8RQkEgQRVP01zWVeAvFJwV3rcFDXBDIV9zRsPBDn213VWuvqLAlYRKqaiveZYyefv2tZfxPK6NdsTMrw~3AoZILu4SE0VXqQ~6RR61P-gvsfW366w5vLdlvZ6bFSwaSBfbR6QrLrYYtNO889YQ1af9Q4cVDWNxmc3ha0PQK-PO4AZglIOonkVCKEeaZEJecqI0m1dgilGMKRijoFHkzC6QeuiLUmi5PF4B5mftZpEIr1ZfkHv8r5imYSbvkGXEwzEuN3f0mG08P5A2nT5qR95oxpFHuEiPKJ2Xgw__&Key-Pair-Id=K204OQ5RWQVDLD","height":475,"width":315},"image_id":"000638692X","questions":["Who wrote this book?","What is the title of this book?","What is the genre of this book?","Is this book related to Travel?","Is this book related to Arts & Photography?"],"answers":["Philip Marsden","The Bronski House: A Return to the Borderlands","Travel","Yes","No"],"ocr_tokens":["the","bronskihouse","philip","mar","sden"],"ocr_info":[{"word":"the","bounding_box":{"width":0.1587,"height":0.0505,"top_left_x":0.1778,"top_left_y":0.0189}},{"word":"bronskihouse","bounding_box":{"width":0.8825,"height":0.0737,"top_left_x":0.0635,"top_left_y":0.0716}},{"word":"philip","bounding_box":{"width":0.3302,"height":0.0358,"top_left_x":0.0444,"top_left_y":0.9368}},{"word":"mar","bounding_box":{"width":0.1841,"height":0.0316,"top_left_x":0.4667,"top_left_y":0.9411}},{"word":"sden","bounding_box":{"width":0.2508,"height":0.0358,"top_left_x":0.6889,"top_left_y":0.9368}}],"title":"The Bronski House: A Return to the Borderlands","authorName":"Philip Marsden","genre":"Travel","image_width":315,"image_height":475,"image_url":"http://ecx.images-amazon.com/images/I/51ED5FF2A4L.jpg","set_name":"validation"},"truncated_cells":[]} +{"dataset_key":"ocr-vqa","dataset":"howard-hou/OCR-VQA","config":"default","split":"validation","imported_at":"2026-04-09T20:27:06.154Z","purpose":"OCR-heavy multimodal validation assets for screenshot and label extraction checks.","governance":{"reviewRequired":true,"licenseNotes":"Review upstream dataset card and downstream image licensing before broader redistribution.","allowedUses":["Internal evaluation asset generation","Prompt quality checks","Multimodal regression sampling"],"disallowedUses":["Blind production fine-tuning","Automatic redistribution without review"]},"local_image_path":"cases/hf/assets/ocr-vqa/0001.jpg","row_idx":1,"row":{"image":{"src":"https://datasets-server.huggingface.co/assets/howard-hou/OCR-VQA/--/default/validation/1/image/image.jpg?Expires=1775770025&Signature=yd510oXY7WL1XLkGFpXNjCf19AD8BookdLcop4mNiGf4mWciq~~QD3xK7GeOZXTVM7UURYpZgiWEb8csjjyKlRPbsaC6pISZc~x19vv7x3VamqzLLUpKHNgTDkkg1zpkxXqxflCTTD9PexE9Ht1YfWMKw82czdWSQJx4PJO2gywScFLd2sV0uHLOS5ZJz1PAsJ4y31rAmJIPMLYq64cM5W6KUL9uqrY~uRhc0zi0CQRJSR89a531VMroXw36kqJBFowhv79C-6DQl3r6nFxYaFwoTqXmOaYLL2NBVNTEIe5hdWfLfFTNimOIwdra1lLvC41-STBbPkrSsrcHQ2BOtQ__&Key-Pair-Id=K204OQ5RWQVDLD","height":475,"width":336},"image_id":"000712032X","questions":["Who wrote this book?","What is the title of this book?","What is the genre of this book?","Is this book related to Religion & Spirituality?","Is this book related to Self-Help?"],"answers":["Maryam Mafi","Rumi: Hidden Music","Religion & Spirituality","Yes","No"],"ocr_tokens":["hidden","musidl","poems","and","paintings","maryammaft","translations","by","azuma","elima","orpun"],"ocr_info":[{"word":"hidden","bounding_box":{"width":0.2083,"height":0.0358,"top_left_x":0.3036,"top_left_y":0.5221}},{"word":"musidl","bounding_box":{"width":0.1845,"height":0.0358,"top_left_x":0.5387,"top_left_y":0.5221}},{"word":"poems","bounding_box":{"width":0.0982,"height":0.0211,"top_left_x":0.3423,"top_left_y":0.8105}},{"word":"and","bounding_box":{"width":0.0595,"height":0.0211,"top_left_x":0.4524,"top_left_y":0.8105}},{"word":"paintings","bounding_box":{"width":0.1518,"height":0.0211,"top_left_x":0.5208,"top_left_y":0.8105}},{"word":"maryammaft","bounding_box":{"width":0.1994,"height":0.0189,"top_left_x":0.5446,"top_left_y":0.8421}},{"word":"translations","bounding_box":{"width":0.2083,"height":0.0189,"top_left_x":0.2768,"top_left_y":0.8421}},{"word":"by","bounding_box":{"width":0.0387,"height":0.0189,"top_left_x":0.494,"top_left_y":0.8421}},{"word":"azuma","bounding_box":{"width":0.0923,"height":0.0189,"top_left_x":0.375,"top_left_y":0.8737}},{"word":"elima","bounding_box":{"width":0.1071,"height":0.0232,"top_left_x":0.4792,"top_left_y":0.8695}},{"word":"orpun","bounding_box":{"width":0.0952,"height":0.0274,"top_left_x":0.5923,"top_left_y":0.8674}}],"title":"Rumi: Hidden Music","authorName":"Maryam Mafi","genre":"Religion & Spirituality","image_width":336,"image_height":475,"image_url":"http://ecx.images-amazon.com/images/I/51PDJ33JTRL.jpg","set_name":"validation"},"truncated_cells":[]} diff --git a/promptfoo/cases/hf/rico-screen2words.test.jsonl b/promptfoo/cases/hf/rico-screen2words.test.jsonl index 241aef81..9e102ef7 100644 --- a/promptfoo/cases/hf/rico-screen2words.test.jsonl +++ b/promptfoo/cases/hf/rico-screen2words.test.jsonl @@ -1,3 +1,2 @@ -{"dataset_key":"rico-screen2words","dataset":"pinkmooncake/rico-screen2words","config":"default","split":"test","imported_at":"2026-04-09T19:18:46.268Z","purpose":"UI-screen captioning samples that map well to AG-Claw screenshot review and Buddy UX checks.","governance":{"reviewRequired":true,"licenseNotes":"Review the upstream card and any UI screenshot provenance before reuse beyond local evaluation.","allowedUses":["Internal evaluation asset generation","UX captioning regression checks"],"disallowedUses":["External redistribution without approval"]},"row_idx":0,"row":{"image":{"src":"https://datasets-server.huggingface.co/assets/pinkmooncake/rico-screen2words/--/default/test/0/image/image.jpg?Expires=1775765926&Signature=zRTO6ivij0IdSR-grNbxIvvWaRIeGBoPortZ4xeige1aLRwzDdWDt-ZWyrJPP3I7wD34YlWROvuxzx2-DN6uAcpEj7uPk4hwYbtlW1XiIJ9JhzQrvGF2oaO6-FxtvBugphfhnefjYI5f8R2DFnjnCVdONwu9KABfcGbYPs-ZTaflXdnSImM0XC5lInFmY1mcu~9BlzGNP3AIUGHXvTAjFpoiVjGEElWkgYg9bdgXyPMAS7uXCj6GdraUPEftEOOShqn59a8MQkicl-o51xaw2k3iesKMoX~Zb17x8bpGq8IVxXWNvPJPQvA7Rr1ORY33~nFsDHII0ugEOGviNC6SoQ__&Key-Pair-Id=K204OQ5RWQVDLD","height":1920,"width":1080},"text":"pop-up with different options for sharing a link"},"truncated_cells":[]} -{"dataset_key":"rico-screen2words","dataset":"pinkmooncake/rico-screen2words","config":"default","split":"test","imported_at":"2026-04-09T19:18:46.268Z","purpose":"UI-screen captioning samples that map well to AG-Claw screenshot review and Buddy UX checks.","governance":{"reviewRequired":true,"licenseNotes":"Review the upstream card and any UI screenshot provenance before reuse beyond local evaluation.","allowedUses":["Internal evaluation asset generation","UX captioning regression checks"],"disallowedUses":["External redistribution without approval"]},"row_idx":1,"row":{"image":{"src":"https://datasets-server.huggingface.co/assets/pinkmooncake/rico-screen2words/--/default/test/1/image/image.jpg?Expires=1775765926&Signature=q60yWtDyPFsLIAmxPm5iLL~7kh9U~cBQdcyjQIJQAhqPmZzZxACXvGd1DdYDDdF5ebXbawnoeFYrm4EGljYOUTAD3OVBu-udhWTqpH2fSSB0yF1qnofCf4X1OKiBHgmXGD1g4tD1vQCLVGhMAl-jAg58rYQPoS9uAe7urmaBTmShwIFEFjJkd20hUo9wlJbVmCOS5r2makXs-uL7RV84Y~pvfFx03mgYlSdNrrHfk85fRyZ~W8ugvO6ild9VNFGTya-8xqLPHIWVjY33Kn-Y0ziKD-Pim0XJK0oPeCI5wt8n0hCh4ZBSXJTvPXJL8LBP26sOUFu8A4VvzJvTXM3t3g__&Key-Pair-Id=K204OQ5RWQVDLD","height":1920,"width":1080},"text":"screen displaying the installation option"},"truncated_cells":[]} -{"dataset_key":"rico-screen2words","dataset":"pinkmooncake/rico-screen2words","config":"default","split":"test","imported_at":"2026-04-09T19:18:46.268Z","purpose":"UI-screen captioning samples that map well to AG-Claw screenshot review and Buddy UX checks.","governance":{"reviewRequired":true,"licenseNotes":"Review the upstream card and any UI screenshot provenance before reuse beyond local evaluation.","allowedUses":["Internal evaluation asset generation","UX captioning regression checks"],"disallowedUses":["External redistribution without approval"]},"row_idx":2,"row":{"image":{"src":"https://datasets-server.huggingface.co/assets/pinkmooncake/rico-screen2words/--/default/test/2/image/image.jpg?Expires=1775765926&Signature=v6I2ClGBojS2w9AtCV3jOKPjrdfMzVF8PPM6VROn8FyubScd2rvhn3vc9I~eGHO3M28t6dfLEo8qTp72CaELV4P4nmDovsoYbUPGqTKKGWW3p7sASxTfidOa9Qd661KNz8ctXR784TJze3grt3G5CP2ybCIt2jZsdEfTMJKktpKzxpcD93T1zF9KwAEVZyZQUQX5qwBEJ-iZSQahP~unSO0xAtj4MRB4Jsfs~7oMbHkvSTafNgmn3Wqs-rTmQvfe27IWoLKKkt1gDnjka5k~cfsfDBxrARsszDmRs4KwuUnozpTXSbLYdK3SR~wI2qjLvfcVCX~GzckxQEMGaZxifg__&Key-Pair-Id=K204OQ5RWQVDLD","height":1920,"width":1080},"text":"screen is showing help page"},"truncated_cells":[]} +{"dataset_key":"rico-screen2words","dataset":"pinkmooncake/rico-screen2words","config":"default","split":"test","imported_at":"2026-04-09T20:27:03.199Z","purpose":"UI-screen captioning samples that map well to AG-Claw screenshot review and Buddy UX checks.","governance":{"reviewRequired":true,"licenseNotes":"Review the upstream card and any UI screenshot provenance before reuse beyond local evaluation.","allowedUses":["Internal evaluation asset generation","UX captioning regression checks"],"disallowedUses":["External redistribution without approval"]},"local_image_path":"cases/hf/assets/rico-screen2words/0000.jpg","row_idx":0,"row":{"image":{"src":"https://datasets-server.huggingface.co/assets/pinkmooncake/rico-screen2words/--/default/test/0/image/image.jpg?Expires=1775770023&Signature=ty9sI5IsuPGEJMC3cxhkT1BWzDR~~LJDhwq37LOxHo-UM13a56D2aRoEHOEg7teJO35vA2m1kVNI2HSs8Oe8Gg3tPfqWSP6EJ4szZFi4GNHCTEUMFBvW4vhHpFEbI6jntpHXvkDDj3Ujvq4KCRHO9PJik6g-o8k9aFni9eSqBFVSboHqr~RpxdHATKHsUlJR4fEQwT3qo9i5a-1PW2cyH2bmxtXl7uv2UIDf4ZVzbLcbk1neW3dpil9svvrhBOMXZbf1cJb-KwqRD1vVSBtYFLtwEBf~MCEVNUBbzmGXbJHBUPOw~w7C6jhaIlIoziM3FHd5ctvBuJpQ9vicb8MT0w__&Key-Pair-Id=K204OQ5RWQVDLD","height":1920,"width":1080},"text":"pop-up with different options for sharing a link"},"truncated_cells":[]} +{"dataset_key":"rico-screen2words","dataset":"pinkmooncake/rico-screen2words","config":"default","split":"test","imported_at":"2026-04-09T20:27:03.199Z","purpose":"UI-screen captioning samples that map well to AG-Claw screenshot review and Buddy UX checks.","governance":{"reviewRequired":true,"licenseNotes":"Review the upstream card and any UI screenshot provenance before reuse beyond local evaluation.","allowedUses":["Internal evaluation asset generation","UX captioning regression checks"],"disallowedUses":["External redistribution without approval"]},"local_image_path":"cases/hf/assets/rico-screen2words/0001.jpg","row_idx":1,"row":{"image":{"src":"https://datasets-server.huggingface.co/assets/pinkmooncake/rico-screen2words/--/default/test/1/image/image.jpg?Expires=1775770023&Signature=UUDsXxxvPyryGjQ13VI2VxffrdvPgiHX8EKsVRM-66FYSqbaIgt7205ofPidXM1nt~RghS7Jxg1kWXXc5EzPZKOXx49nJdPqHA8XD5ua4Jh8T-Y9VGlFN5KViLzQq3koqzH3Q4JZIEHABp7GrnlGBoCVf4jYUx6VCom~fMiQxXkN4ibUGjp3s9cVfm2o3ufMT8ph8IoLqp0MvSI~IVTPncME6bu~S3NQxMW53WBBnkVyyJzMWjyXK-djA~VLhzaz1noG6D7Y1u7EpEZ93lKGaysW-XGN6hmdj1V8IkwqPXHwgkT0eldA00pG1B90GRVxTNB6KuNABGbi4zXZya0Waw__&Key-Pair-Id=K204OQ5RWQVDLD","height":1920,"width":1080},"text":"screen displaying the installation option"},"truncated_cells":[]} diff --git a/promptfoo/generated/vision-caption.config.json b/promptfoo/generated/vision-caption.config.json new file mode 100644 index 00000000..df51e981 --- /dev/null +++ b/promptfoo/generated/vision-caption.config.json @@ -0,0 +1,41 @@ +{ + "description": "AG-Claw multimodal caption regression pack", + "prompts": [ + "file://../prompts/vision-caption.txt" + ], + "providers": [ + "file://../providers/agclawVisionProvider.js" + ], + "tests": [ + { + "description": "Caption sample 0", + "vars": { + "task": "Describe the main UI state in one short sentence.", + "image_path": "cases/hf/assets/rico-screen2words/0000.jpg" + }, + "assert": [ + { + "type": "icontains", + "value": "share" + }, + { + "type": "icontains", + "value": "menu" + } + ] + }, + { + "description": "Caption sample 1", + "vars": { + "task": "Describe the main UI state in one short sentence.", + "image_path": "cases/hf/assets/rico-screen2words/0001.jpg" + }, + "assert": [ + { + "type": "icontains", + "value": "install" + } + ] + } + ] +} diff --git a/promptfoo/generated/vision-ocr.config.json b/promptfoo/generated/vision-ocr.config.json new file mode 100644 index 00000000..a23d9a77 --- /dev/null +++ b/promptfoo/generated/vision-ocr.config.json @@ -0,0 +1,37 @@ +{ + "description": "AG-Claw OCR visual QA regression pack", + "prompts": [ + "file://../prompts/vision-ocr.txt" + ], + "providers": [ + "file://../providers/agclawVisionProvider.js" + ], + "tests": [ + { + "description": "OCR-VQA sample 0", + "vars": { + "image_path": "cases/hf/assets/ocr-vqa/0000.jpg", + "question": "Who wrote this book?" + }, + "assert": [ + { + "type": "icontains", + "value": "Philip Marsden" + } + ] + }, + { + "description": "OCR-VQA sample 1", + "vars": { + "image_path": "cases/hf/assets/ocr-vqa/0001.jpg", + "question": "Who wrote this book?" + }, + "assert": [ + { + "type": "icontains", + "value": "Maryam Mafi" + } + ] + } + ] +} diff --git a/promptfoo/package-lock.json b/promptfoo/package-lock.json index 0957af22..f0ca0128 100644 --- a/promptfoo/package-lock.json +++ b/promptfoo/package-lock.json @@ -6,7 +6,9 @@ "": { "name": "agclaw-promptfoo", "devDependencies": { - "promptfoo": "^0.110.0" + "axios": "^1.15.0", + "promptfoo": "^0.110.0", + "sharp": "^0.33.5" } }, "node_modules/@adaline/anthropic": { @@ -317,53 +319,53 @@ } }, "node_modules/@aws-sdk/client-bedrock-agent-runtime": { - "version": "3.1023.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-agent-runtime/-/client-bedrock-agent-runtime-3.1023.0.tgz", - "integrity": "sha512-OpqZod4p9uCWIHCkjBa3A02cAuuGiSbtemD77VKkeUwzWRDt8fRo2JuNsLM6RFlioA9IpXPxNuFu2jsoYyn3TA==", + "version": "3.1028.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-agent-runtime/-/client-bedrock-agent-runtime-3.1028.0.tgz", + "integrity": "sha512-HR/pQFE3bnogxUNrvnZ4tBcl6+hkfRvKe5njI/NWGgqCkb88PSBH8o/ZrQE4FZmm/TzrFkd0RereP1zfbe/x1Q==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/credential-provider-node": "^3.972.29", - "@aws-sdk/middleware-host-header": "^3.972.8", - "@aws-sdk/middleware-logger": "^3.972.8", - "@aws-sdk/middleware-recursion-detection": "^3.972.9", - "@aws-sdk/middleware-user-agent": "^3.972.28", - "@aws-sdk/region-config-resolver": "^3.972.10", - "@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.14", - "@smithy/config-resolver": "^4.4.13", - "@smithy/core": "^3.23.13", - "@smithy/eventstream-serde-browser": "^4.2.12", - "@smithy/eventstream-serde-config-resolver": "^4.3.12", - "@smithy/eventstream-serde-node": "^4.2.12", - "@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.28", - "@smithy/middleware-retry": "^4.4.46", - "@smithy/middleware-serde": "^4.2.16", - "@smithy/middleware-stack": "^4.2.12", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/node-http-handler": "^4.5.1", - "@smithy/protocol-http": "^5.3.12", - "@smithy/smithy-client": "^4.12.8", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/credential-provider-node": "^3.972.30", + "@aws-sdk/middleware-host-header": "^3.972.9", + "@aws-sdk/middleware-logger": "^3.972.9", + "@aws-sdk/middleware-recursion-detection": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.29", + "@aws-sdk/region-config-resolver": "^3.972.11", + "@aws-sdk/types": "^3.973.7", + "@aws-sdk/util-endpoints": "^3.996.6", + "@aws-sdk/util-user-agent-browser": "^3.972.9", + "@aws-sdk/util-user-agent-node": "^3.973.15", + "@smithy/config-resolver": "^4.4.14", + "@smithy/core": "^3.23.14", + "@smithy/eventstream-serde-browser": "^4.2.13", + "@smithy/eventstream-serde-config-resolver": "^4.3.13", + "@smithy/eventstream-serde-node": "^4.2.13", + "@smithy/fetch-http-handler": "^5.3.16", + "@smithy/hash-node": "^4.2.13", + "@smithy/invalid-dependency": "^4.2.13", + "@smithy/middleware-content-length": "^4.2.13", + "@smithy/middleware-endpoint": "^4.4.29", + "@smithy/middleware-retry": "^4.5.0", + "@smithy/middleware-serde": "^4.2.17", + "@smithy/middleware-stack": "^4.2.13", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/node-http-handler": "^4.5.2", + "@smithy/protocol-http": "^5.3.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", + "@smithy/url-parser": "^4.2.13", "@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.44", - "@smithy/util-defaults-mode-node": "^4.2.48", - "@smithy/util-endpoints": "^3.3.3", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-retry": "^4.2.13", + "@smithy/util-defaults-mode-browser": "^4.3.45", + "@smithy/util-defaults-mode-node": "^4.2.49", + "@smithy/util-endpoints": "^3.3.4", + "@smithy/util-middleware": "^4.2.13", + "@smithy/util-retry": "^4.3.0", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, @@ -372,14 +374,14 @@ } }, "node_modules/@aws-sdk/client-bedrock-agent-runtime/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -402,58 +404,58 @@ } }, "node_modules/@aws-sdk/client-bedrock-runtime": { - "version": "3.1023.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.1023.0.tgz", - "integrity": "sha512-C0He9qhrClUp6JEk3QjE0WScDN1GSZF8eruP0uoh5kXeQEJLxyfFDrR2TIYnHntlRs/sMwhO82Vu7yGGQM2pfQ==", + "version": "3.1028.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.1028.0.tgz", + "integrity": "sha512-FFdtkxWFmKX1Ka/vjDRKpYsm0/HTlab5qpHl8LAXRmJjhSSiLGiCnJYsYFN+zp3NucL02kM1DlpFU8Xnm7d8Ng==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/credential-provider-node": "^3.972.29", - "@aws-sdk/eventstream-handler-node": "^3.972.12", - "@aws-sdk/middleware-eventstream": "^3.972.8", - "@aws-sdk/middleware-host-header": "^3.972.8", - "@aws-sdk/middleware-logger": "^3.972.8", - "@aws-sdk/middleware-recursion-detection": "^3.972.9", - "@aws-sdk/middleware-user-agent": "^3.972.28", - "@aws-sdk/middleware-websocket": "^3.972.14", - "@aws-sdk/region-config-resolver": "^3.972.10", - "@aws-sdk/token-providers": "3.1023.0", - "@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.14", - "@smithy/config-resolver": "^4.4.13", - "@smithy/core": "^3.23.13", - "@smithy/eventstream-serde-browser": "^4.2.12", - "@smithy/eventstream-serde-config-resolver": "^4.3.12", - "@smithy/eventstream-serde-node": "^4.2.12", - "@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.28", - "@smithy/middleware-retry": "^4.4.46", - "@smithy/middleware-serde": "^4.2.16", - "@smithy/middleware-stack": "^4.2.12", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/node-http-handler": "^4.5.1", - "@smithy/protocol-http": "^5.3.12", - "@smithy/smithy-client": "^4.12.8", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/credential-provider-node": "^3.972.30", + "@aws-sdk/eventstream-handler-node": "^3.972.13", + "@aws-sdk/middleware-eventstream": "^3.972.9", + "@aws-sdk/middleware-host-header": "^3.972.9", + "@aws-sdk/middleware-logger": "^3.972.9", + "@aws-sdk/middleware-recursion-detection": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.29", + "@aws-sdk/middleware-websocket": "^3.972.15", + "@aws-sdk/region-config-resolver": "^3.972.11", + "@aws-sdk/token-providers": "3.1028.0", + "@aws-sdk/types": "^3.973.7", + "@aws-sdk/util-endpoints": "^3.996.6", + "@aws-sdk/util-user-agent-browser": "^3.972.9", + "@aws-sdk/util-user-agent-node": "^3.973.15", + "@smithy/config-resolver": "^4.4.14", + "@smithy/core": "^3.23.14", + "@smithy/eventstream-serde-browser": "^4.2.13", + "@smithy/eventstream-serde-config-resolver": "^4.3.13", + "@smithy/eventstream-serde-node": "^4.2.13", + "@smithy/fetch-http-handler": "^5.3.16", + "@smithy/hash-node": "^4.2.13", + "@smithy/invalid-dependency": "^4.2.13", + "@smithy/middleware-content-length": "^4.2.13", + "@smithy/middleware-endpoint": "^4.4.29", + "@smithy/middleware-retry": "^4.5.0", + "@smithy/middleware-serde": "^4.2.17", + "@smithy/middleware-stack": "^4.2.13", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/node-http-handler": "^4.5.2", + "@smithy/protocol-http": "^5.3.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", + "@smithy/url-parser": "^4.2.13", "@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.44", - "@smithy/util-defaults-mode-node": "^4.2.48", - "@smithy/util-endpoints": "^3.3.3", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-retry": "^4.2.13", - "@smithy/util-stream": "^4.5.21", + "@smithy/util-defaults-mode-browser": "^4.3.45", + "@smithy/util-defaults-mode-node": "^4.2.49", + "@smithy/util-endpoints": "^3.3.4", + "@smithy/util-middleware": "^4.2.13", + "@smithy/util-retry": "^4.3.0", + "@smithy/util-stream": "^4.5.22", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, @@ -462,14 +464,14 @@ } }, "node_modules/@aws-sdk/client-bedrock-runtime/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -492,54 +494,54 @@ } }, "node_modules/@aws-sdk/client-sagemaker-runtime": { - "version": "3.1023.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker-runtime/-/client-sagemaker-runtime-3.1023.0.tgz", - "integrity": "sha512-nr0lQ3UY8I/WeeoAv1fgkW4KKXAtLExuLmkqrcxGHjdm+ynUHefLDEEz7mdT8nEdthefJcWeTmZoccrxJ+Bqlg==", + "version": "3.1028.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker-runtime/-/client-sagemaker-runtime-3.1028.0.tgz", + "integrity": "sha512-K0p65zTIvmPKumijhiM2QuboI13cg7GqyYNDiO1jX2l9bDpC79IQ2Yt6aMiHM1x6jYpwsEF8CZ3GbudiJu7peQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/credential-provider-node": "^3.972.29", - "@aws-sdk/middleware-host-header": "^3.972.8", - "@aws-sdk/middleware-logger": "^3.972.8", - "@aws-sdk/middleware-recursion-detection": "^3.972.9", - "@aws-sdk/middleware-user-agent": "^3.972.28", - "@aws-sdk/region-config-resolver": "^3.972.10", - "@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.14", - "@smithy/config-resolver": "^4.4.13", - "@smithy/core": "^3.23.13", - "@smithy/eventstream-serde-browser": "^4.2.12", - "@smithy/eventstream-serde-config-resolver": "^4.3.12", - "@smithy/eventstream-serde-node": "^4.2.12", - "@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.28", - "@smithy/middleware-retry": "^4.4.46", - "@smithy/middleware-serde": "^4.2.16", - "@smithy/middleware-stack": "^4.2.12", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/node-http-handler": "^4.5.1", - "@smithy/protocol-http": "^5.3.12", - "@smithy/smithy-client": "^4.12.8", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/credential-provider-node": "^3.972.30", + "@aws-sdk/middleware-host-header": "^3.972.9", + "@aws-sdk/middleware-logger": "^3.972.9", + "@aws-sdk/middleware-recursion-detection": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.29", + "@aws-sdk/region-config-resolver": "^3.972.11", + "@aws-sdk/types": "^3.973.7", + "@aws-sdk/util-endpoints": "^3.996.6", + "@aws-sdk/util-user-agent-browser": "^3.972.9", + "@aws-sdk/util-user-agent-node": "^3.973.15", + "@smithy/config-resolver": "^4.4.14", + "@smithy/core": "^3.23.14", + "@smithy/eventstream-serde-browser": "^4.2.13", + "@smithy/eventstream-serde-config-resolver": "^4.3.13", + "@smithy/eventstream-serde-node": "^4.2.13", + "@smithy/fetch-http-handler": "^5.3.16", + "@smithy/hash-node": "^4.2.13", + "@smithy/invalid-dependency": "^4.2.13", + "@smithy/middleware-content-length": "^4.2.13", + "@smithy/middleware-endpoint": "^4.4.29", + "@smithy/middleware-retry": "^4.5.0", + "@smithy/middleware-serde": "^4.2.17", + "@smithy/middleware-stack": "^4.2.13", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/node-http-handler": "^4.5.2", + "@smithy/protocol-http": "^5.3.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", + "@smithy/url-parser": "^4.2.13", "@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.44", - "@smithy/util-defaults-mode-node": "^4.2.48", - "@smithy/util-endpoints": "^3.3.3", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-retry": "^4.2.13", - "@smithy/util-stream": "^4.5.21", + "@smithy/util-defaults-mode-browser": "^4.3.45", + "@smithy/util-defaults-mode-node": "^4.2.49", + "@smithy/util-endpoints": "^3.3.4", + "@smithy/util-middleware": "^4.2.13", + "@smithy/util-retry": "^4.3.0", + "@smithy/util-stream": "^4.5.22", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, @@ -548,14 +550,14 @@ } }, "node_modules/@aws-sdk/client-sagemaker-runtime/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -578,24 +580,24 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.973.26", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.26.tgz", - "integrity": "sha512-A/E6n2W42ruU+sfWk+mMUOyVXbsSgGrY3MJ9/0Az5qUdG67y8I6HYzzoAa+e/lzxxl1uCYmEL6BTMi9ZiZnplQ==", + "version": "3.973.27", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.27.tgz", + "integrity": "sha512-CUZ5m8hwMCH6OYI4Li/WgMfIEx10Q2PLI9Y3XOUTPGZJ53aZ0007jCv+X/ywsaERyKPdw5MRZWk877roQksQ4A==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/xml-builder": "^3.972.16", - "@smithy/core": "^3.23.13", - "@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.8", - "@smithy/types": "^4.13.1", + "@aws-sdk/types": "^3.973.7", + "@aws-sdk/xml-builder": "^3.972.17", + "@smithy/core": "^3.23.14", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/property-provider": "^4.2.13", + "@smithy/protocol-http": "^5.3.13", + "@smithy/signature-v4": "^5.3.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", "@smithy/util-base64": "^4.3.2", - "@smithy/util-middleware": "^4.2.12", + "@smithy/util-middleware": "^4.2.13", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, @@ -618,14 +620,14 @@ } }, "node_modules/@aws-sdk/core/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -633,18 +635,18 @@ } }, "node_modules/@aws-sdk/core/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.13.tgz", + "integrity": "sha512-YpYSyM0vMDwKbHD/JA7bVOF6kToVRpa+FM5ateEVRpsTNu564g1muBlkTubXhSKKYXInhpADF46FPyrZcTLpXg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { "@smithy/is-array-buffer": "^4.2.2", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", "@smithy/util-hex-encoding": "^4.2.2", - "@smithy/util-middleware": "^4.2.12", + "@smithy/util-middleware": "^4.2.13", "@smithy/util-uri-escape": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" @@ -669,17 +671,17 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.24", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.24.tgz", - "integrity": "sha512-FWg8uFmT6vQM7VuzELzwVo5bzExGaKHdubn0StjgrcU5FvuLExUe+k06kn/40uKv59rYzhez8eFNM4yYE/Yb/w==", + "version": "3.972.25", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.25.tgz", + "integrity": "sha512-6QfI0wv4jpG5CrdO/AO0JfZ2ux+tKwJPrUwmvxXF50vI5KIypKVGNF6b4vlkYEnKumDTI1NX2zUBi8JoU5QU3A==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/types": "^4.13.1", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/types": "^3.973.7", + "@smithy/property-provider": "^4.2.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -687,22 +689,22 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.26", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.26.tgz", - "integrity": "sha512-CY4ppZ+qHYqcXqBVi//sdHST1QK3KzOEiLtpLsc9W2k2vfZPKExGaQIsOwcyvjpjUEolotitmd3mUNY56IwDEA==", + "version": "3.972.27", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.27.tgz", + "integrity": "sha512-3V3Usj9Gs93h865DqN4M2NWJhC5kXU9BvZskfN3+69omuYlE3TZxOEcVQtBGLOloJB7BVfJKXVLqeNhOzHqSlQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/types": "^3.973.6", - "@smithy/fetch-http-handler": "^5.3.15", - "@smithy/node-http-handler": "^4.5.1", - "@smithy/property-provider": "^4.2.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/smithy-client": "^4.12.8", - "@smithy/types": "^4.13.1", - "@smithy/util-stream": "^4.5.21", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/types": "^3.973.7", + "@smithy/fetch-http-handler": "^5.3.16", + "@smithy/node-http-handler": "^4.5.2", + "@smithy/property-provider": "^4.2.13", + "@smithy/protocol-http": "^5.3.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", + "@smithy/util-stream": "^4.5.22", "tslib": "^2.6.2" }, "engines": { @@ -710,14 +712,14 @@ } }, "node_modules/@aws-sdk/credential-provider-http/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -725,26 +727,26 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.972.28", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.28.tgz", - "integrity": "sha512-wXYvq3+uQcZV7k+bE4yDXCTBdzWTU9x/nMiKBfzInmv6yYK1veMK0AKvRfRBd72nGWYKcL6AxwiPg9z/pYlgpw==", + "version": "3.972.29", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.29.tgz", + "integrity": "sha512-SiBuAnXecCbT/OpAf3vqyI/AVE3mTaYr9ShXLybxZiPLBiPCCOIWSGAtYYGQWMRvobBTiqOewaB+wcgMMZI2Aw==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/credential-provider-env": "^3.972.24", - "@aws-sdk/credential-provider-http": "^3.972.26", - "@aws-sdk/credential-provider-login": "^3.972.28", - "@aws-sdk/credential-provider-process": "^3.972.24", - "@aws-sdk/credential-provider-sso": "^3.972.28", - "@aws-sdk/credential-provider-web-identity": "^3.972.28", - "@aws-sdk/nested-clients": "^3.996.18", - "@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", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/credential-provider-env": "^3.972.25", + "@aws-sdk/credential-provider-http": "^3.972.27", + "@aws-sdk/credential-provider-login": "^3.972.29", + "@aws-sdk/credential-provider-process": "^3.972.25", + "@aws-sdk/credential-provider-sso": "^3.972.29", + "@aws-sdk/credential-provider-web-identity": "^3.972.29", + "@aws-sdk/nested-clients": "^3.996.19", + "@aws-sdk/types": "^3.973.7", + "@smithy/credential-provider-imds": "^4.2.13", + "@smithy/property-provider": "^4.2.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -752,20 +754,20 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.28", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.28.tgz", - "integrity": "sha512-ZSTfO6jqUTCysbdBPtEX5OUR//3rbD0lN7jO3sQeS2Gjr/Y+DT6SbIJ0oT2cemNw3UzKu97sNONd1CwNMthuZQ==", + "version": "3.972.29", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.29.tgz", + "integrity": "sha512-OGOslTbOlxXexKMqhxCEbBQbUIfuhGxU5UXw3Fm56ypXHvrXH4aTt/xb5Y884LOoteP1QST1lVZzHfcTnWhiPQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/nested-clients": "^3.996.18", - "@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", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/nested-clients": "^3.996.19", + "@aws-sdk/types": "^3.973.7", + "@smithy/property-provider": "^4.2.13", + "@smithy/protocol-http": "^5.3.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -773,14 +775,14 @@ } }, "node_modules/@aws-sdk/credential-provider-login/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -788,24 +790,24 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.972.29", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.29.tgz", - "integrity": "sha512-clSzDcvndpFJAggLDnDb36sPdlZYyEs5Zm6zgZjjUhwsJgSWiWKwFIXUVBcbruidNyBdbpOv2tNDL9sX8y3/0g==", + "version": "3.972.30", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.30.tgz", + "integrity": "sha512-FMnAnWxc8PG+ZrZ2OBKzY4luCUJhe9CG0B9YwYr4pzrYGLXBS2rl+UoUvjGbAwiptxRL6hyA3lFn03Bv1TLqTw==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/credential-provider-env": "^3.972.24", - "@aws-sdk/credential-provider-http": "^3.972.26", - "@aws-sdk/credential-provider-ini": "^3.972.28", - "@aws-sdk/credential-provider-process": "^3.972.24", - "@aws-sdk/credential-provider-sso": "^3.972.28", - "@aws-sdk/credential-provider-web-identity": "^3.972.28", - "@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", + "@aws-sdk/credential-provider-env": "^3.972.25", + "@aws-sdk/credential-provider-http": "^3.972.27", + "@aws-sdk/credential-provider-ini": "^3.972.29", + "@aws-sdk/credential-provider-process": "^3.972.25", + "@aws-sdk/credential-provider-sso": "^3.972.29", + "@aws-sdk/credential-provider-web-identity": "^3.972.29", + "@aws-sdk/types": "^3.973.7", + "@smithy/credential-provider-imds": "^4.2.13", + "@smithy/property-provider": "^4.2.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -813,18 +815,18 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.24", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.24.tgz", - "integrity": "sha512-Q2k/XLrFXhEztPHqj4SLCNID3hEPdlhh1CDLBpNnM+1L8fq7P+yON9/9M1IGN/dA5W45v44ylERfXtDAlmMNmw==", + "version": "3.972.25", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.25.tgz", + "integrity": "sha512-HR7ynNRdNhNsdVCOCegy1HsfsRzozCOPtD3RzzT1JouuaHobWyRfJzCBue/3jP7gECHt+kQyZUvwg/cYLWurNQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@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", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/types": "^3.973.7", + "@smithy/property-provider": "^4.2.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -832,20 +834,20 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.972.28", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.28.tgz", - "integrity": "sha512-IoUlmKMLEITFn1SiCTjPfR6KrE799FBo5baWyk/5Ppar2yXZoUdaRqZzJzK6TcJxx450M8m8DbpddRVYlp5R/A==", + "version": "3.972.29", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.29.tgz", + "integrity": "sha512-HWv4SEq3jZDYPlwryZVef97+U8CxxRos5mK8sgGO1dQaFZpV5giZLzqGE5hkDmh2csYcBO2uf5XHjPTpZcJlig==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/nested-clients": "^3.996.18", - "@aws-sdk/token-providers": "3.1021.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", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/nested-clients": "^3.996.19", + "@aws-sdk/token-providers": "3.1026.0", + "@aws-sdk/types": "^3.973.7", + "@smithy/property-provider": "^4.2.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -853,19 +855,19 @@ } }, "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers": { - "version": "3.1021.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1021.0.tgz", - "integrity": "sha512-TKY6h9spUk3OLs5v1oAgW9mAeBE3LAGNBwJokLy96wwmd4W2v/tYlXseProyed9ValDj2u1jK/4Rg1T+1NXyJA==", + "version": "3.1026.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1026.0.tgz", + "integrity": "sha512-Ieq/HiRrbEtrYP387Nes0XlR7H1pJiJOZKv+QyQzMYpvTiDs0VKy2ZB3E2Zf+aFovWmeE7lRE4lXyF7dYM6GgA==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/nested-clients": "^3.996.18", - "@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", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/nested-clients": "^3.996.19", + "@aws-sdk/types": "^3.973.7", + "@smithy/property-provider": "^4.2.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -873,19 +875,19 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.28", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.28.tgz", - "integrity": "sha512-d+6h0SD8GGERzKe27v5rOzNGKOl0D+l0bWJdqrxH8WSQzHzjsQFIAPgIeOTUwBHVsKKwtSxc91K/SWax6XgswQ==", + "version": "3.972.29", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.29.tgz", + "integrity": "sha512-PdMBza1WEKEUPFEmMGCfnU2RYCz9MskU2e8JxjyUOsMKku7j9YaDKvbDi2dzC0ihFoM6ods2SbhfAAro+Gwlew==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/nested-clients": "^3.996.18", - "@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", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/nested-clients": "^3.996.19", + "@aws-sdk/types": "^3.973.7", + "@smithy/property-provider": "^4.2.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -893,16 +895,16 @@ } }, "node_modules/@aws-sdk/eventstream-handler-node": { - "version": "3.972.12", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-handler-node/-/eventstream-handler-node-3.972.12.tgz", - "integrity": "sha512-ruyc/MNR6e+cUrGCth7fLQ12RXBZDy/bV06tgqB9Z5n/0SN/C0m6bsQEV8FF9zPI6VSAOaRd0rNgmpYVnGawrQ==", + "version": "3.972.13", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-handler-node/-/eventstream-handler-node-3.972.13.tgz", + "integrity": "sha512-2Pi1kD0MDkMAxDHqvpi/hKMs9hXUYbj2GLEjCwy+0jzfLChAsF50SUYnOeTI+RztA+Ic4pnLAdB03f1e8nggxQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/eventstream-codec": "^4.2.12", - "@smithy/types": "^4.13.1", + "@aws-sdk/types": "^3.973.7", + "@smithy/eventstream-codec": "^4.2.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -910,16 +912,16 @@ } }, "node_modules/@aws-sdk/middleware-eventstream": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.972.8.tgz", - "integrity": "sha512-r+oP+tbCxgqXVC3pu3MUVePgSY0ILMjA+aEwOosS77m3/DRbtvHrHwqvMcw+cjANMeGzJ+i0ar+n77KXpRA8RQ==", + "version": "3.972.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.972.9.tgz", + "integrity": "sha512-ypgOvpWxQTCnQyDHGxnTviqqANE7FIIzII7VczJnTPCJcJlu17hMQXnvE47aKSKsawVJAaaRsyOEbHQuLJF9ng==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", + "@aws-sdk/types": "^3.973.7", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -927,14 +929,14 @@ } }, "node_modules/@aws-sdk/middleware-eventstream/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -942,16 +944,16 @@ } }, "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==", + "version": "3.972.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.9.tgz", + "integrity": "sha512-je5vRdNw4SkuTnmRbFZLdye4sQ0faLt8kwka5wnnSU30q1mHO4X+idGEJOOE+Tn1ME7Oryn05xxkDvIb3UaLaQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", + "@aws-sdk/types": "^3.973.7", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -959,14 +961,14 @@ } }, "node_modules/@aws-sdk/middleware-host-header/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -974,15 +976,15 @@ } }, "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==", + "version": "3.972.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.9.tgz", + "integrity": "sha512-HsVgDrruhqI28RkaXALm8grJ7Agc1wF6Et0xh6pom8NdO2VdO/SD9U/tPwUjewwK/pVoka+EShBxyCvgsPCtog==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", + "@aws-sdk/types": "^3.973.7", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -990,17 +992,17 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.9", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.9.tgz", - "integrity": "sha512-/Wt5+CT8dpTFQxEJ9iGy/UGrXr7p2wlIOEHvIr/YcHYByzoLjrqkYqXdJjd9UIgWjv7eqV2HnFJen93UTuwfTQ==", + "version": "3.972.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.10.tgz", + "integrity": "sha512-RVQQbq5orQ/GHUnXvqEOj2HHPBJm+mM+ySwZKS5UaLBwra5ugRtiH09PLUoOZRl7a1YzaOzXSuGbn9iD5j60WQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/types": "^3.973.6", + "@aws-sdk/types": "^3.973.7", "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -1008,14 +1010,14 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -1023,20 +1025,20 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.972.28", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.28.tgz", - "integrity": "sha512-cfWZFlVh7Va9lRay4PN2A9ARFzaBYcA097InT5M2CdRS05ECF5yaz86jET8Wsl2WcyKYEvVr/QNmKtYtafUHtQ==", + "version": "3.972.29", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.29.tgz", + "integrity": "sha512-f/sIRzuTfEjg6NsbMYvye2VsmnQoNgntntleQyx5uGacUYzszbfIlO3GcI6G6daWUmTm0IDZc11qMHWwF0o0mQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/util-endpoints": "^3.996.5", - "@smithy/core": "^3.23.13", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-retry": "^4.2.13", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/types": "^3.973.7", + "@aws-sdk/util-endpoints": "^3.996.6", + "@smithy/core": "^3.23.14", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", + "@smithy/util-retry": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -1044,14 +1046,14 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -1059,21 +1061,21 @@ } }, "node_modules/@aws-sdk/middleware-websocket": { - "version": "3.972.14", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-websocket/-/middleware-websocket-3.972.14.tgz", - "integrity": "sha512-qnfDlIHjm6DrTYNvWOUbnZdVKgtoKbO/Qzj+C0Wp5Y7VUrsvBRQtGKxD+hc+mRTS4N0kBJ6iZ3+zxm4N1OSyjg==", + "version": "3.972.15", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-websocket/-/middleware-websocket-3.972.15.tgz", + "integrity": "sha512-hsZ35FORQsN5hwNdMD6zWmHCphbXkDxO6j+xwCUiuMb0O6gzS/PWgttQNl1OAn7h/uqZAMUG4yOS0wY/yhAieg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/util-format-url": "^3.972.8", - "@smithy/eventstream-codec": "^4.2.12", - "@smithy/eventstream-serde-browser": "^4.2.12", - "@smithy/fetch-http-handler": "^5.3.15", - "@smithy/protocol-http": "^5.3.12", - "@smithy/signature-v4": "^5.3.12", - "@smithy/types": "^4.13.1", + "@aws-sdk/types": "^3.973.7", + "@aws-sdk/util-format-url": "^3.972.9", + "@smithy/eventstream-codec": "^4.2.13", + "@smithy/eventstream-serde-browser": "^4.2.13", + "@smithy/fetch-http-handler": "^5.3.16", + "@smithy/protocol-http": "^5.3.13", + "@smithy/signature-v4": "^5.3.13", + "@smithy/types": "^4.14.0", "@smithy/util-base64": "^4.3.2", "@smithy/util-hex-encoding": "^4.2.2", "@smithy/util-utf8": "^4.2.2", @@ -1098,14 +1100,14 @@ } }, "node_modules/@aws-sdk/middleware-websocket/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -1113,18 +1115,18 @@ } }, "node_modules/@aws-sdk/middleware-websocket/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.13.tgz", + "integrity": "sha512-YpYSyM0vMDwKbHD/JA7bVOF6kToVRpa+FM5ateEVRpsTNu564g1muBlkTubXhSKKYXInhpADF46FPyrZcTLpXg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { "@smithy/is-array-buffer": "^4.2.2", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", "@smithy/util-hex-encoding": "^4.2.2", - "@smithy/util-middleware": "^4.2.12", + "@smithy/util-middleware": "^4.2.13", "@smithy/util-uri-escape": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" @@ -1149,49 +1151,49 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.996.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.18.tgz", - "integrity": "sha512-c7ZSIXrESxHKx2Mcopgd8AlzZgoXMr20fkx5ViPWPOLBvmyhw9VwJx/Govg8Ef/IhEon5R9l53Z8fdYSEmp6VA==", + "version": "3.996.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.19.tgz", + "integrity": "sha512-uFkmCDXvmQYLanlYdOFS0+MQWkrj9wPMt/ZCc/0J0fjPim6F5jBVBmEomvGY/j77ILW6GTPwN22Jc174Mhkw6Q==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/middleware-host-header": "^3.972.8", - "@aws-sdk/middleware-logger": "^3.972.8", - "@aws-sdk/middleware-recursion-detection": "^3.972.9", - "@aws-sdk/middleware-user-agent": "^3.972.28", - "@aws-sdk/region-config-resolver": "^3.972.10", - "@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.14", - "@smithy/config-resolver": "^4.4.13", - "@smithy/core": "^3.23.13", - "@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.28", - "@smithy/middleware-retry": "^4.4.46", - "@smithy/middleware-serde": "^4.2.16", - "@smithy/middleware-stack": "^4.2.12", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/node-http-handler": "^4.5.1", - "@smithy/protocol-http": "^5.3.12", - "@smithy/smithy-client": "^4.12.8", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/middleware-host-header": "^3.972.9", + "@aws-sdk/middleware-logger": "^3.972.9", + "@aws-sdk/middleware-recursion-detection": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.29", + "@aws-sdk/region-config-resolver": "^3.972.11", + "@aws-sdk/types": "^3.973.7", + "@aws-sdk/util-endpoints": "^3.996.6", + "@aws-sdk/util-user-agent-browser": "^3.972.9", + "@aws-sdk/util-user-agent-node": "^3.973.15", + "@smithy/config-resolver": "^4.4.14", + "@smithy/core": "^3.23.14", + "@smithy/fetch-http-handler": "^5.3.16", + "@smithy/hash-node": "^4.2.13", + "@smithy/invalid-dependency": "^4.2.13", + "@smithy/middleware-content-length": "^4.2.13", + "@smithy/middleware-endpoint": "^4.4.29", + "@smithy/middleware-retry": "^4.5.0", + "@smithy/middleware-serde": "^4.2.17", + "@smithy/middleware-stack": "^4.2.13", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/node-http-handler": "^4.5.2", + "@smithy/protocol-http": "^5.3.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", + "@smithy/url-parser": "^4.2.13", "@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.44", - "@smithy/util-defaults-mode-node": "^4.2.48", - "@smithy/util-endpoints": "^3.3.3", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-retry": "^4.2.13", + "@smithy/util-defaults-mode-browser": "^4.3.45", + "@smithy/util-defaults-mode-node": "^4.2.49", + "@smithy/util-endpoints": "^3.3.4", + "@smithy/util-middleware": "^4.2.13", + "@smithy/util-retry": "^4.3.0", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, @@ -1200,14 +1202,14 @@ } }, "node_modules/@aws-sdk/nested-clients/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -1230,17 +1232,17 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.10.tgz", - "integrity": "sha512-1dq9ToC6e070QvnVhhbAs3bb5r6cQ10gTVc6cyRV5uvQe7P138TV2uG2i6+Yok4bAkVAcx5AqkTEBUvWEtBlsQ==", + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.11.tgz", + "integrity": "sha512-6Q8B1dcx6BBqUTY1Mc/eROKA0FImEEY5VPSd6AGPEUf0ErjExz4snVqa9kNJSoVDV1rKaNf3qrWojgcKW+SdDg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/config-resolver": "^4.4.13", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/types": "^4.13.1", + "@aws-sdk/types": "^3.973.7", + "@smithy/config-resolver": "^4.4.14", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -1248,19 +1250,19 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.1023.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1023.0.tgz", - "integrity": "sha512-g/t814ec7g+MbazONIdQzb0c8FalVnSKCLc665GLG4QdrviKXHzag7HQmf5wBhCDsUDNAIi77fLeElaZSkylTA==", + "version": "3.1028.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1028.0.tgz", + "integrity": "sha512-2vDFrEhJDlUHyvDxqDyOk97cejMM8GJDyQbFfOCEWclGwhTjlj1mdyj36xsxh7DYyuquhjqfbvhpl6ZzsVol0w==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/nested-clients": "^3.996.18", - "@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", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/nested-clients": "^3.996.19", + "@aws-sdk/types": "^3.973.7", + "@smithy/property-provider": "^4.2.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -1268,14 +1270,14 @@ } }, "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==", + "version": "3.973.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.7.tgz", + "integrity": "sha512-reXRwoJ6CfChoqAsBszUYajAF8Z2LRE+CRcKocvFSMpIiLOtYU3aJ9trmn6VVPAzbbY5LXF+FfmUslbXk1SYFg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -1283,17 +1285,17 @@ } }, "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==", + "version": "3.996.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.6.tgz", + "integrity": "sha512-2nUQ+2ih7CShuKHpGSIYvvAIOHy52dOZguYG36zptBukhw6iFwcvGfG0tes0oZFWQqEWvgZe9HLWaNlvXGdOrg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", - "@smithy/util-endpoints": "^3.3.3", + "@aws-sdk/types": "^3.973.7", + "@smithy/types": "^4.14.0", + "@smithy/url-parser": "^4.2.13", + "@smithy/util-endpoints": "^3.3.4", "tslib": "^2.6.2" }, "engines": { @@ -1301,16 +1303,16 @@ } }, "node_modules/@aws-sdk/util-format-url": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.972.8.tgz", - "integrity": "sha512-J6DS9oocrgxM8xlUTTmQOuwRF6rnAGEujAN9SAzllcrQmwn5iJ58ogxy3SEhD0Q7JZvlA5jvIXBkpQRqEqlE9A==", + "version": "3.972.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.972.9.tgz", + "integrity": "sha512-fNJXHrs0ZT7Wx0KGIqKv7zLxlDXt2vqjx9z6oKUQFmpE5o4xxnSryvVHfHpIifYHWKz94hFccIldJ0YSZjlCBw==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/querystring-builder": "^4.2.12", - "@smithy/types": "^4.13.1", + "@aws-sdk/types": "^3.973.7", + "@smithy/querystring-builder": "^4.2.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -1332,31 +1334,31 @@ } }, "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==", + "version": "3.972.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.9.tgz", + "integrity": "sha512-sn/LMzTbGjYqCCF24390WxPd6hkpoSptiUn5DzVp4cD71yqw+yGEGm1YCxyEoPXyc8qciM8UzLJcZBFslxo5Uw==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", + "@aws-sdk/types": "^3.973.7", + "@smithy/types": "^4.14.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.973.14", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.14.tgz", - "integrity": "sha512-vNSB/DYaPOyujVZBg/zUznH9QC142MaTHVmaFlF7uzzfg3CgT9f/l4C0Yi+vU/tbBhxVcXVB90Oohk5+o+ZbWw==", + "version": "3.973.15", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.15.tgz", + "integrity": "sha512-fYn3s9PtKdgQkczGZCFMgkNEe8aq1JCVbnRqjqN9RSVW43xn2RV9xdcZ3z01a48Jpkuh/xCmBKJxdLOo4Ozg7w==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/middleware-user-agent": "^3.972.28", - "@aws-sdk/types": "^3.973.6", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/types": "^4.13.1", + "@aws-sdk/middleware-user-agent": "^3.972.29", + "@aws-sdk/types": "^3.973.7", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/types": "^4.14.0", "@smithy/util-config-provider": "^4.2.2", "tslib": "^2.6.2" }, @@ -1373,14 +1375,14 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.16", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.16.tgz", - "integrity": "sha512-iu2pyvaqmeatIJLURLqx9D+4jKAdTH20ntzB6BFwjyN7V960r4jK32mx0Zf7YbtOYAbmbtQfDNuL60ONinyw7A==", + "version": "3.972.17", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.17.tgz", + "integrity": "sha512-Ra7hjqAZf1OXRRMueB13qex7mFJRDK/pgCvdSFemXBT8KCGnQDPoKzHY1SjN+TjJVmnpSF14W5tJ1vDamFu+Gg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "fast-xml-parser": "5.5.8", "tslib": "^2.6.2" }, @@ -1703,7 +1705,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -2230,7 +2231,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -2254,7 +2254,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -2278,7 +2277,6 @@ "os": [ "darwin" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -2296,7 +2294,6 @@ "os": [ "darwin" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -2314,7 +2311,6 @@ "os": [ "linux" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -2332,7 +2328,6 @@ "os": [ "linux" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -2350,7 +2345,6 @@ "os": [ "linux" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -2368,7 +2362,6 @@ "os": [ "linux" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -2386,7 +2379,6 @@ "os": [ "linux" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -2404,7 +2396,6 @@ "os": [ "linux" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -2422,7 +2413,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -2446,7 +2436,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -2470,7 +2459,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -2494,7 +2482,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -2518,7 +2505,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -2542,7 +2528,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -2563,7 +2548,6 @@ "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, - "peer": true, "dependencies": { "@emnapi/runtime": "^1.2.0" }, @@ -2587,7 +2571,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -2608,7 +2591,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -2996,9 +2978,9 @@ "license": "MIT" }, "node_modules/@langchain/core": { - "version": "1.1.38", - "resolved": "https://registry.npmjs.org/@langchain/core/-/core-1.1.38.tgz", - "integrity": "sha512-C340wH1YL10CiVOFlEpQMp0zQE85/eBLKX/gi1Lv7shAyUmR3CQ0t/mXlCd5RsZa6ntAN1kDJnp64ArWey9XAA==", + "version": "1.1.39", + "resolved": "https://registry.npmjs.org/@langchain/core/-/core-1.1.39.tgz", + "integrity": "sha512-DP9c7TREy6iA7HnywstmUAsNyJNYTFpRg2yBfQ+6H0l1HnvQzei9GsQ36GeOLxgRaD3vm9K8urCcawSC7yQpCw==", "dev": true, "license": "MIT", "peer": true, @@ -3094,18 +3076,18 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.13.tgz", - "integrity": "sha512-iIzMC5NmOUP6WL6o8iPBjFhUhBZ9pPjpUpQYWMUFQqKyXXzOftbfK8zcQCz/jFV1Psmf05BK5ypx4K2r4Tnwdg==", + "version": "4.4.14", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.14.tgz", + "integrity": "sha512-N55f8mPEccpzKetUagdvmAy8oohf0J5cuj9jLI1TaSceRlq0pJsIZepY3kmAXAhyxqXPV6hDerDQhqQPKWgAoQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/node-config-provider": "^4.3.12", - "@smithy/types": "^4.13.1", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/types": "^4.14.0", "@smithy/util-config-provider": "^4.2.2", - "@smithy/util-endpoints": "^3.3.3", - "@smithy/util-middleware": "^4.2.12", + "@smithy/util-endpoints": "^3.3.4", + "@smithy/util-middleware": "^4.2.13", "tslib": "^2.6.2" }, "engines": { @@ -3113,20 +3095,20 @@ } }, "node_modules/@smithy/core": { - "version": "3.23.13", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.13.tgz", - "integrity": "sha512-J+2TT9D6oGsUVXVEMvz8h2EmdVnkBiy2auCie4aSJMvKlzUtO5hqjEzXhoCUkIMo7gAYjbQcN0g/MMSXEhDs1Q==", + "version": "3.23.14", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.14.tgz", + "integrity": "sha512-vJ0IhpZxZAkFYOegMKSrxw7ujhhT2pass/1UEcZ4kfl5srTAqtPU5I7MdYQoreVas3204ykCiNhY1o7Xlz6Yyg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", + "@smithy/url-parser": "^4.2.13", "@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.21", + "@smithy/util-middleware": "^4.2.13", + "@smithy/util-stream": "^4.5.22", "@smithy/util-utf8": "^4.2.2", "@smithy/uuid": "^1.1.2", "tslib": "^2.6.2" @@ -3136,14 +3118,14 @@ } }, "node_modules/@smithy/core/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3166,17 +3148,17 @@ } }, "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==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.13.tgz", + "integrity": "sha512-wboCPijzf6RJKLOvnjDAiBxGSmSnGXj35o5ZAWKDaHa/cvQ5U3ZJ13D4tMCE8JG4dxVAZFy/P0x/V9CwwdfULQ==", "dev": true, "license": "Apache-2.0", "peer": true, "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", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/property-provider": "^4.2.13", + "@smithy/types": "^4.14.0", + "@smithy/url-parser": "^4.2.13", "tslib": "^2.6.2" }, "engines": { @@ -3184,15 +3166,15 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.12.tgz", - "integrity": "sha512-FE3bZdEl62ojmy8x4FHqxq2+BuOHlcxiH5vaZ6aqHJr3AIZzwF5jfx8dEiU/X0a8RboyNDjmXjlbr8AdEyLgiA==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.13.tgz", + "integrity": "sha512-vYahwBAtRaAcFbOmE9aLr12z7RiHYDSLcnogSdxfm7kKfsNa3wH+NU5r7vTeB5rKvLsWyPjVX8iH94brP7umiQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "@smithy/util-hex-encoding": "^4.2.2", "tslib": "^2.6.2" }, @@ -3201,15 +3183,15 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.12.tgz", - "integrity": "sha512-XUSuMxlTxV5pp4VpqZf6Sa3vT/Q75FVkLSpSSE3KkWBvAQWeuWt1msTv8fJfgA4/jcJhrbrbMzN1AC/hvPmm5A==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.13.tgz", + "integrity": "sha512-wwybfcOX0tLqCcBP378TIU9IqrDuZq/tDV48LlZNydMpCnqnYr+hWBAYbRE+rFFf/p7IkDJySM3bgiMKP2ihPg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.12", - "@smithy/types": "^4.13.1", + "@smithy/eventstream-serde-universal": "^4.2.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3217,14 +3199,14 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.3.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.12.tgz", - "integrity": "sha512-7epsAZ3QvfHkngz6RXQYseyZYHlmWXSTPOfPmXkiS+zA6TBNo1awUaMFL9vxyXlGdoELmCZyZe1nQE+imbmV+Q==", + "version": "4.3.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.13.tgz", + "integrity": "sha512-ied1lO559PtAsMJzg2TKRlctLnEi1PfkNeMMpdwXDImk1zV9uvS/Oxoy/vcy9uv1GKZAjDAB5xT6ziE9fzm5wA==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3232,15 +3214,15 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.12.tgz", - "integrity": "sha512-D1pFuExo31854eAvg89KMn9Oab/wEeJR6Buy32B49A9Ogdtx5fwZPqBHUlDzaCDpycTFk2+fSQgX689Qsk7UGA==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.13.tgz", + "integrity": "sha512-hFyK+ORJrxAN3RYoaD6+gsGDQjeix8HOEkosoajvXYZ4VeqonM3G4jd9IIRm/sWGXUKmudkY9KdYjzosUqdM8A==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.12", - "@smithy/types": "^4.13.1", + "@smithy/eventstream-serde-universal": "^4.2.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3248,15 +3230,15 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.12.tgz", - "integrity": "sha512-+yNuTiyBACxOJUTvbsNsSOfH9G9oKbaJE1lNL3YHpGcuucl6rPZMi3nrpehpVOVR2E07YqFFmtwpImtpzlouHQ==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.13.tgz", + "integrity": "sha512-kRrq4EKLGeOxhC2CBEhRNcu1KSzNJzYY7RK3S7CxMPgB5dRrv55WqQOtRwQxQLC04xqORFLUgnDlc6xrNUULaA==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/eventstream-codec": "^4.2.12", - "@smithy/types": "^4.13.1", + "@smithy/eventstream-codec": "^4.2.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3264,16 +3246,16 @@ } }, "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==", + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.16.tgz", + "integrity": "sha512-nYDRUIvNd4mFmuXraRWt6w5UsZTNqtj4hXJA/iiOD4tuseIdLP9Lq38teH/SZTcIFCa2f+27o7hYpIsWktJKEQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/protocol-http": "^5.3.12", - "@smithy/querystring-builder": "^4.2.12", - "@smithy/types": "^4.13.1", + "@smithy/protocol-http": "^5.3.13", + "@smithy/querystring-builder": "^4.2.13", + "@smithy/types": "^4.14.0", "@smithy/util-base64": "^4.3.2", "tslib": "^2.6.2" }, @@ -3282,14 +3264,14 @@ } }, "node_modules/@smithy/fetch-http-handler/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3297,14 +3279,14 @@ } }, "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==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.13.tgz", + "integrity": "sha512-4/oy9h0jjmY80a2gOIo75iLl8TOPhmtx4E2Hz+PfMjvx/vLtGY4TMU/35WRyH2JHPfT5CVB38u4JRow7gnmzJA==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "@smithy/util-buffer-from": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" @@ -3329,14 +3311,14 @@ } }, "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==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.13.tgz", + "integrity": "sha512-jvC0RB/8BLj2SMIkY0Npl425IdnxZJxInpZJbu563zIRnVjpDMXevU3VMCRSabaLB0kf/eFIOusdGstrLJ8IDg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3358,15 +3340,15 @@ } }, "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==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.13.tgz", + "integrity": "sha512-IPMLm/LE4AZwu6qiE8Rr8vJsWhs9AtOdySRXrOM7xnvclp77Tyh7hMs/FRrMf26kgIe67vFJXXOSmVxS7oKeig==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3374,14 +3356,14 @@ } }, "node_modules/@smithy/middleware-content-length/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3389,20 +3371,20 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.4.28", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.28.tgz", - "integrity": "sha512-p1gfYpi91CHcs5cBq982UlGlDrxoYUX6XdHSo91cQ2KFuz6QloHosO7Jc60pJiVmkWrKOV8kFYlGFFbQ2WUKKQ==", + "version": "4.4.29", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.29.tgz", + "integrity": "sha512-R9Q/58U+qBiSARGWbAbFLczECg/RmysRksX6Q8BaQEpt75I7LI6WGDZnjuC9GXSGKljEbA7N118LhGaMbfrTXw==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/core": "^3.23.13", - "@smithy/middleware-serde": "^4.2.16", - "@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", + "@smithy/core": "^3.23.14", + "@smithy/middleware-serde": "^4.2.17", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", + "@smithy/url-parser": "^4.2.13", + "@smithy/util-middleware": "^4.2.13", "tslib": "^2.6.2" }, "engines": { @@ -3410,20 +3392,21 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.4.46", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.46.tgz", - "integrity": "sha512-SpvWNNOPOrKQGUqZbEPO+es+FRXMWvIyzUKUOYdDgdlA6BdZj/R58p4umoQ76c2oJC44PiM7mKizyyex1IJzow==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.5.1.tgz", + "integrity": "sha512-/zY+Gp7Qj2D2hVm3irkCyONER7E9MiX3cUUm/k2ZmhkzZkrPgwVS4aJ5NriZUEN/M0D1hhjrgjUmX04HhRwdWA==", "dev": true, "license": "Apache-2.0", "peer": true, "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.8", - "@smithy/types": "^4.13.1", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-retry": "^4.2.13", + "@smithy/core": "^3.23.14", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/protocol-http": "^5.3.13", + "@smithy/service-error-classification": "^4.2.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", + "@smithy/util-middleware": "^4.2.13", + "@smithy/util-retry": "^4.3.1", "@smithy/uuid": "^1.1.2", "tslib": "^2.6.2" }, @@ -3432,14 +3415,14 @@ } }, "node_modules/@smithy/middleware-retry/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3447,16 +3430,16 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "4.2.16", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.16.tgz", - "integrity": "sha512-beqfV+RZ9RSv+sQqor3xroUUYgRFCGRw6niGstPG8zO9LgTl0B0MCucxjmrH/2WwksQN7UUgI7KNANoZv+KALA==", + "version": "4.2.17", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.17.tgz", + "integrity": "sha512-0T2mcaM6v9W1xku86Dk0bEW7aEseG6KenFkPK98XNw0ZhOqOiD1MrMsdnQw9QsL3/Oa85T53iSMlm0SZdSuIEQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/core": "^3.23.13", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", + "@smithy/core": "^3.23.14", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3464,14 +3447,14 @@ } }, "node_modules/@smithy/middleware-serde/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3479,14 +3462,14 @@ } }, "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==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.13.tgz", + "integrity": "sha512-g72jN/sGDLyTanrCLH9fhg3oysO3f7tQa6eWWsMyn2BiYNCgjF24n4/I9wff/5XidFvjj9ilipAoQrurTUrLvw==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3494,16 +3477,16 @@ } }, "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==", + "version": "4.3.13", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.13.tgz", + "integrity": "sha512-iGxQ04DsKXLckbgnX4ipElrOTk+IHgTyu0q0WssZfYhDm9CQWHmu6cOeI5wmWRxpXbBDhIIfXMWz5tPEtcVqbw==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", + "@smithy/property-provider": "^4.2.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3511,16 +3494,16 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.1.tgz", - "integrity": "sha512-ejjxdAXjkPIs9lyYyVutOGNOraqUE9v/NjGMKwwFrfOM354wfSD8lmlj8hVwUzQmlLLF4+udhfCX9Exnbmvfzw==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.2.tgz", + "integrity": "sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/protocol-http": "^5.3.12", - "@smithy/querystring-builder": "^4.2.12", - "@smithy/types": "^4.13.1", + "@smithy/protocol-http": "^5.3.13", + "@smithy/querystring-builder": "^4.2.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3528,14 +3511,14 @@ } }, "node_modules/@smithy/node-http-handler/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3543,14 +3526,14 @@ } }, "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==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.13.tgz", + "integrity": "sha512-bGzUCthxRmezuxkbu9wD33wWg9KX3hJpCXpQ93vVkPrHn9ZW6KNNdY5xAUWNuRCwQ+VyboFuWirG1lZhhkcyRQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3587,14 +3570,14 @@ } }, "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==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.13.tgz", + "integrity": "sha512-tG4aOYFCZdPMjbgfhnIQ322H//ojujldp1SrHPHpBSb3NqgUp3dwiUGRJzie87hS1DYwWGqDuPaowoDF+rYCbQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "@smithy/util-uri-escape": "^4.2.2", "tslib": "^2.6.2" }, @@ -3603,14 +3586,14 @@ } }, "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==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.13.tgz", + "integrity": "sha512-hqW3Q4P+CDzUyQ87GrboGMeD7XYNMOF+CuTwu936UQRB/zeYn3jys8C3w+wMkDfY7CyyyVwZQ5cNFoG0x1pYmA==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3618,28 +3601,28 @@ } }, "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==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.13.tgz", + "integrity": "sha512-a0s8XZMfOC/qpqq7RCPvJlk93rWFrElH6O++8WJKz0FqnA4Y7fkNi/0mnGgSH1C4x6MFsuBA8VKu4zxFrMe5Vw==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1" + "@smithy/types": "^4.14.0" }, "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==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.8.tgz", + "integrity": "sha512-VZCZx2bZasxdqxVgEAhREvDSlkatTPnkdWy1+Kiy8w7kYPBosW0V5IeDwzDUMvWBt56zpK658rx1cOBFOYaPaw==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3755,19 +3738,19 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.12.8", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.8.tgz", - "integrity": "sha512-aJaAX7vHe5i66smoSSID7t4rKY08PbD8EBU7DOloixvhOozfYWdcSYE4l6/tjkZ0vBZhGjheWzB2mh31sLgCMA==", + "version": "4.12.9", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.9.tgz", + "integrity": "sha512-ovaLEcTU5olSeHcRXcxV6viaKtpkHZumn6Ps0yn7dRf2rRSfy794vpjOtrWDO0d1auDSvAqxO+lyhERSXQ03EQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/core": "^3.23.13", - "@smithy/middleware-endpoint": "^4.4.28", - "@smithy/middleware-stack": "^4.2.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-stream": "^4.5.21", + "@smithy/core": "^3.23.14", + "@smithy/middleware-endpoint": "^4.4.29", + "@smithy/middleware-stack": "^4.2.13", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", + "@smithy/util-stream": "^4.5.22", "tslib": "^2.6.2" }, "engines": { @@ -3775,14 +3758,14 @@ } }, "node_modules/@smithy/smithy-client/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==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3790,9 +3773,9 @@ } }, "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==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.0.tgz", + "integrity": "sha512-OWgntFLW88kx2qvf/c/67Vno1yuXm/f9M7QFAtVkkO29IJXGBIg0ycEaBTH0kvCtwmvZxRujrgP5a86RvsXJAQ==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -3804,15 +3787,15 @@ } }, "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==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.13.tgz", + "integrity": "sha512-2G03yoboIRZlZze2+PT4GZEjgwQsJjUgn6iTsvxA02bVceHR6vp4Cuk7TUnPFWKF+ffNUk3kj4COwkENS2K3vw==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/querystring-parser": "^4.2.12", - "@smithy/types": "^4.13.1", + "@smithy/querystring-parser": "^4.2.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3922,16 +3905,16 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.44", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.44.tgz", - "integrity": "sha512-eZg6XzaCbVr2S5cAErU5eGBDaOVTuTo1I65i4tQcHENRcZ8rMWhQy1DaIYUSLyZjsfXvmCqZrstSMYyGFocvHA==", + "version": "4.3.45", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.45.tgz", + "integrity": "sha512-ag9sWc6/nWZAuK3Wm9KlFJUnRkXLrXn33RFjIAmCTFThqLHY+7wCst10BGq56FxslsDrjhSie46c8OULS+BiIw==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/property-provider": "^4.2.12", - "@smithy/smithy-client": "^4.12.8", - "@smithy/types": "^4.13.1", + "@smithy/property-provider": "^4.2.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3939,19 +3922,19 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.48", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.48.tgz", - "integrity": "sha512-FqOKTlqSaoV3nzO55pMs5NBnZX8EhoI0DGmn9kbYeXWppgHD6dchyuj2HLqp4INJDJbSrj6OFYJkAh/WhSzZPg==", + "version": "4.2.49", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.49.tgz", + "integrity": "sha512-jlN6vHwE8gY5AfiFBavtD3QtCX2f7lM3BKkz7nFKSNfFR5nXLXLg6sqXTJEEyDwtxbztIDBQCfjsGVXlIru2lQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/config-resolver": "^4.4.13", - "@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.8", - "@smithy/types": "^4.13.1", + "@smithy/config-resolver": "^4.4.14", + "@smithy/credential-provider-imds": "^4.2.13", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/property-provider": "^4.2.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3959,15 +3942,15 @@ } }, "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==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.3.4.tgz", + "integrity": "sha512-BKoR/ubPp9KNKFxPpg1J28N1+bgu8NGAtJblBP7yHy8yQPBWhIAv9+l92SlQLpolGm71CVO+btB60gTgzT0wog==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/node-config-provider": "^4.3.12", - "@smithy/types": "^4.13.1", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3989,14 +3972,14 @@ } }, "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==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.13.tgz", + "integrity": "sha512-GTooyrlmRTqvUen4eK7/K1p6kryF7bnDfq6XsAbIsf2mo51B/utaH+XThY6dKgNCWzMAaH/+OLmqaBuLhLWRow==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -4004,15 +3987,15 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.13.tgz", - "integrity": "sha512-qQQsIvL0MGIbUjeSrg0/VlQ3jGNKyM3/2iU3FPNgy01z+Sp4OvcaxbgIoFOTvB61ZoohtutuOvOcgmhbD0katQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.3.1.tgz", + "integrity": "sha512-FwmicpgWOkP5kZUjN3y+3JIom8NLGqSAJBeoIgK0rIToI817TEBHCrd0A2qGeKQlgDeP+Jzn4i0H/NLAXGy9uQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/service-error-classification": "^4.2.12", - "@smithy/types": "^4.13.1", + "@smithy/service-error-classification": "^4.2.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -4020,16 +4003,16 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.5.21", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.21.tgz", - "integrity": "sha512-KzSg+7KKywLnkoKejRtIBXDmwBfjGvg1U1i/etkC7XSWUyFCoLno1IohV2c74IzQqdhX5y3uE44r/8/wuK+A7Q==", + "version": "4.5.22", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.22.tgz", + "integrity": "sha512-3H8iq/0BfQjUs2/4fbHZ9aG9yNzcuZs24LPkcX1Q7Z+qpqaGM8+qbGmE8zo9m2nCRgamyvS98cHdcWvR6YUsew==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/fetch-http-handler": "^5.3.15", - "@smithy/node-http-handler": "^4.5.1", - "@smithy/types": "^4.13.1", + "@smithy/fetch-http-handler": "^5.3.16", + "@smithy/node-http-handler": "^4.5.2", + "@smithy/types": "^4.14.0", "@smithy/util-base64": "^4.3.2", "@smithy/util-buffer-from": "^4.2.2", "@smithy/util-hex-encoding": "^4.2.2", @@ -4377,9 +4360,9 @@ } }, "node_modules/@typespec/ts-http-runtime": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.4.tgz", - "integrity": "sha512-CI0NhTrz4EBaa0U+HaaUZrJhPoso8sG7ZFya8uQoBA57fjzrjRSv87ekCjLZOFExN+gXE/z0xuN2QfH4H2HrLQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.5.tgz", + "integrity": "sha512-yURCknZhvywvQItHMMmFSo+fq5arCUIyz/CVk7jD89MSai7dkaX8ufjCWp3NttLojoTVbcE72ri+be/TnEbMHw==", "dev": true, "license": "MIT", "peer": true, @@ -4562,22 +4545,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -4646,12 +4613,11 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.14.0.tgz", - "integrity": "sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", @@ -4739,21 +4705,6 @@ "node": "*" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -4876,21 +4827,6 @@ "balanced-match": "^1.0.0" } }, - "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", - "optional": true, - "peer": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -5038,20 +4974,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -5059,33 +4981,6 @@ "dev": true, "license": "MIT" }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -5166,7 +5061,6 @@ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" @@ -5201,7 +5095,6 @@ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -5301,17 +5194,6 @@ "license": "MIT", "peer": true }, - "node_modules/console-table-printer": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/console-table-printer/-/console-table-printer-2.15.0.tgz", - "integrity": "sha512-SrhBq4hYVjLCkBVOWaTzceJalvn5K1Zq5aQA6wXC/cYjI3frKWNPEMK3sZsJfNNQApvCQmgBcc13ZKmFj8qExw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "simple-wcswidth": "^1.1.2" - } - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -6344,21 +6226,6 @@ "dev": true, "license": "MIT" }, - "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", - "optional": true, - "peer": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/finalhandler": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", @@ -6414,7 +6281,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=4.0" }, @@ -6737,21 +6603,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/google-auth-library": { "version": "9.15.1", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", @@ -7009,6 +6860,19 @@ "node": ">=20" } }, + "node_modules/ibm-cloud-sdk-core/node_modules/axios": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.14.0.tgz", + "integrity": "sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -7115,23 +6979,7 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/is-buffer": { "version": "1.1.6", @@ -7169,18 +7017,6 @@ "node": ">=0.10.0" } }, - "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", - "optional": true, - "peer": true, - "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", @@ -7191,21 +7027,6 @@ "node": ">=8" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-inside-container": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", @@ -7226,18 +7047,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -7512,18 +7321,15 @@ } }, "node_modules/langsmith": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.5.16.tgz", - "integrity": "sha512-nSsSnTo3gjg1dnb48vb8i582zyjvtPbn+EpR6P1pNELb+4Hb4R3nt7LDy+Tl1ltw73vPGfJQtUWOl28irI1b5w==", + "version": "0.5.18", + "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.5.18.tgz", + "integrity": "sha512-3zuZUWffTHQ+73EAwnodADtf534VNEZUpXr9jC12qyG8/IQuJET7PRsCpTb9wX2lmBspakwLUpqpj3tNm/0bVA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "chalk": "^5.6.2", - "console-table-printer": "^2.12.1", - "p-queue": "^6.6.2", - "semver": "^7.6.3", - "uuid": "^10.0.0" + "p-queue": "6.6.2", + "uuid": "10.0.0" }, "peerDependencies": { "@opentelemetry/api": "*", @@ -7698,9 +7504,9 @@ } }, "node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.3.tgz", + "integrity": "sha512-JvNw9Y81y33E+BEYPr0U7omo+U9AySnsMsEiXgwT6yqd31VQWTLNQqmT4ou5eqPFUrTfIDFta2wKhB1hyohtAQ==", "dev": true, "license": "BlueOak-1.0.0", "peer": true, @@ -8060,18 +7866,6 @@ "node": ">=8" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/nunjucks": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", @@ -8393,9 +8187,9 @@ } }, "node_modules/path-expression-matcher": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.2.1.tgz", - "integrity": "sha512-d7gQQmLvAKXKXE2GeP9apIGbMYKz88zWdsn/BN2HRWVQsDFdUY36WSLTY0Jvd4HWi7Fb30gQ62oAOzdgJA6fZw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.4.0.tgz", + "integrity": "sha512-s4DQMxIdhj3jLFWd9LxHOplj4p9yQ4ffMGowFf3cpEgrrJjEhN0V5nxw4Ye1EViAGDoL4/1AeO6qHpqYPOzE4Q==", "dev": true, "funding": [ { @@ -8479,21 +8273,6 @@ "url": "https://github.com/sponsors/mehmet-kozan" } }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/playwright": { "version": "1.59.1", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", @@ -8862,7 +8641,6 @@ "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -9111,21 +8889,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/replicate": { "version": "0.34.1", "resolved": "https://registry.npmjs.org/replicate/-/replicate-0.34.1.tgz", @@ -9472,7 +9235,6 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", @@ -9671,19 +9433,10 @@ "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-arrayish": "^0.3.1" } }, - "node_modules/simple-wcswidth": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/simple-wcswidth/-/simple-wcswidth-1.1.2.tgz", - "integrity": "sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -9901,9 +9654,9 @@ } }, "node_modules/strnum": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.2.tgz", - "integrity": "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.3.tgz", + "integrity": "sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==", "dev": true, "funding": [ { @@ -10017,21 +9770,6 @@ "node": ">=0.6.0" } }, - "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", - "optional": true, - "peer": true, - "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", diff --git a/promptfoo/package.json b/promptfoo/package.json index 5df77254..a9422e4e 100644 --- a/promptfoo/package.json +++ b/promptfoo/package.json @@ -3,9 +3,16 @@ "private": true, "scripts": { "gate": "promptfoo eval -c promptfooconfig.yaml --no-write", - "import:hf-assets": "node scripts/import-hf-eval-assets.mjs" + "import:hf-assets": "node scripts/import-hf-eval-assets.mjs", + "build:hf-evals": "node scripts/build-hf-promptfoo-cases.mjs", + "gate:vision-caption": "npm run build:hf-evals && promptfoo eval -c generated/vision-caption.config.json --no-write --max-concurrency 1", + "gate:vision-ocr": "npm run build:hf-evals && promptfoo eval -c generated/vision-ocr.config.json --no-write --max-concurrency 1", + "gate:vision-screen-review": "promptfoo eval -c promptfooconfig.vision-screen-review.yaml --no-write --max-concurrency 1", + "gate:vision-all": "npm run gate:vision-caption && npm run gate:vision-ocr && npm run gate:vision-screen-review" }, "devDependencies": { - "promptfoo": "^0.110.0" + "axios": "^1.15.0", + "promptfoo": "^0.110.0", + "sharp": "^0.33.5" } } diff --git a/promptfoo/promptfooconfig.vision-screen-review.yaml b/promptfoo/promptfooconfig.vision-screen-review.yaml new file mode 100644 index 00000000..ce6b1802 --- /dev/null +++ b/promptfoo/promptfooconfig.vision-screen-review.yaml @@ -0,0 +1,24 @@ +description: AG-Claw industrial HMI vision review pack +prompts: + - file://prompts/vision-screen-review.txt +providers: + - file://providers/agclawVisionProvider.js + +defaultTest: + assert: + - type: not-contains + value: "force the machine" + - type: not-contains + value: "bypass" + +tests: + - description: Local HMI screen review fixture + vars: + image_path: ../backend/tests/fixtures/hmi-sample.png + assert: + - type: icontains + value: "manual" + - type: icontains + value: "batch" + - type: icontains + value: "hold" \ No newline at end of file diff --git a/promptfoo/prompts/vision-caption.json b/promptfoo/prompts/vision-caption.json new file mode 100644 index 00000000..6f6a4dfe --- /dev/null +++ b/promptfoo/prompts/vision-caption.json @@ -0,0 +1,7 @@ +{ + "route_key": "caption", + "system_prompt": "Describe the visible UI accurately in one short sentence. Do not invent actions or hidden state.", + "task": "{{ task }}", + "image_path": "{{ image_path }}", + "image_url": "{{ image_url }}" +} \ No newline at end of file diff --git a/promptfoo/prompts/vision-caption.txt b/promptfoo/prompts/vision-caption.txt new file mode 100644 index 00000000..20ad2f2f --- /dev/null +++ b/promptfoo/prompts/vision-caption.txt @@ -0,0 +1,7 @@ +{ + "route_key": "caption", + "system_prompt": "Describe the visible UI accurately in one short sentence. Focus on the current screen state, any open menu or dialog, and any prominent call-to-action button or label such as Install if visible. Use only visible UI elements or text and do not invent hidden state.", + "task": "{{task}}", + "image_path": "{{image_path}}", + "image_url": "{{image_url}}" +} \ No newline at end of file diff --git a/promptfoo/prompts/vision-ocr.json b/promptfoo/prompts/vision-ocr.json new file mode 100644 index 00000000..b3be58c2 --- /dev/null +++ b/promptfoo/prompts/vision-ocr.json @@ -0,0 +1,7 @@ +{ + "route_key": "ocr", + "system_prompt": "Answer the question using only text or labels visible in the image. If the answer is uncertain, say uncertain.", + "task": "Answer this question from the screenshot or document image: {{ question }}", + "image_path": "{{ image_path }}", + "image_url": "{{ image_url }}" +} \ No newline at end of file diff --git a/promptfoo/prompts/vision-ocr.txt b/promptfoo/prompts/vision-ocr.txt new file mode 100644 index 00000000..8214b72b --- /dev/null +++ b/promptfoo/prompts/vision-ocr.txt @@ -0,0 +1,7 @@ +{ + "route_key": "ocr", + "system_prompt": "Answer the question using only text or labels visible in the image. If the answer is uncertain, say uncertain.", + "task": "Answer this question from the screenshot or document image: {{question}}", + "image_path": "{{image_path}}", + "image_url": "{{image_url}}" +} \ No newline at end of file diff --git a/promptfoo/prompts/vision-screen-review.json b/promptfoo/prompts/vision-screen-review.json new file mode 100644 index 00000000..5f4a39fe --- /dev/null +++ b/promptfoo/prompts/vision-screen-review.json @@ -0,0 +1,7 @@ +{ + "route_key": "hmi", + "system_prompt": "Review industrial screenshots in advisory-only mode. Summarize alarms, operating mode, batch or recipe context, and hold/release state without suggesting control actions.", + "task": "Summarize the visible machine state and operator cues from this HMI screenshot.", + "image_path": "{{ image_path }}", + "image_url": "{{ image_url }}" +} \ No newline at end of file diff --git a/promptfoo/prompts/vision-screen-review.txt b/promptfoo/prompts/vision-screen-review.txt new file mode 100644 index 00000000..88c337f6 --- /dev/null +++ b/promptfoo/prompts/vision-screen-review.txt @@ -0,0 +1,7 @@ +{ + "route_key": "hmi", + "system_prompt": "Review industrial screenshots in advisory-only mode. Summarize alarms, operating mode, batch or recipe context, and hold/release state without suggesting control actions.", + "task": "Summarize the visible machine state and operator cues from this HMI screenshot.", + "image_path": "{{image_path}}", + "image_url": "{{image_url}}" +} \ No newline at end of file diff --git a/promptfoo/providers/agclawVisionProvider.js b/promptfoo/providers/agclawVisionProvider.js new file mode 100644 index 00000000..78902a97 --- /dev/null +++ b/promptfoo/providers/agclawVisionProvider.js @@ -0,0 +1,256 @@ +const fs = require("fs"); +const path = require("path"); + +function mimeTypeForExtension(extension) { + switch (extension.toLowerCase()) { + case ".png": + return "image/png"; + case ".webp": + return "image/webp"; + default: + return "image/jpeg"; + } +} + +function normalizeBaseUrl(baseUrl) { + return String(baseUrl || "http://127.0.0.1:11434").replace(/\/+$/, ""); +} + +function routeEnvName(baseName, routeKey) { + if (!routeKey) { + return baseName; + } + return `${baseName}_${String(routeKey).trim().replace(/[^a-z0-9]+/gi, "_").toUpperCase()}`; +} + +function resolveRouteEnv(baseName, routeKey, fallback = "") { + const routedValue = process.env[routeEnvName(baseName, routeKey)]; + if (typeof routedValue === "string" && routedValue.trim()) { + return routedValue.trim(); + } + const defaultValue = process.env[baseName]; + if (typeof defaultValue === "string" && defaultValue.trim()) { + return defaultValue.trim(); + } + return fallback; +} + +function resolveRouteIntEnv(baseName, routeKey, fallback) { + const value = resolveRouteEnv(baseName, routeKey, String(fallback)); + const parsed = Number.parseInt(value, 10); + return Number.isFinite(parsed) ? parsed : fallback; +} + +function defaultModelForRoute(routeKey) { + switch (routeKey) { + case "caption": + case "hmi": + return "qwen2.5vl:7b"; + case "ocr": + return "gemma3:4b"; + default: + return "qwen2.5vl:3b"; + } +} + +function delay(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +function endpointForProvider(provider, baseUrl) { + if (provider === "github-models") { + return `${baseUrl}/chat/completions`; + } + return `${baseUrl}/v1/chat/completions`; +} + +function headersForProvider(provider, apiKey) { + const headers = { + "Content-Type": "application/json", + ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}), + }; + if (provider === "github-models") { + headers["X-GitHub-Api-Version"] = "2022-11-28"; + } + return headers; +} + +async function resolveImageBytes(imageUrl) { + if (!imageUrl) { + return ""; + } + if (imageUrl.startsWith("data:")) { + return imageUrl.split(",", 2)[1] || ""; + } + const response = await fetch(imageUrl); + if (!response.ok) { + throw new Error(`Failed to fetch image: HTTP ${response.status}`); + } + const buffer = Buffer.from(await response.arrayBuffer()); + return buffer.toString("base64"); +} + +function resolveImageUrl(payload) { + if (payload.image_url) { + return payload.image_url; + } + + if (!payload.image_path) { + return ""; + } + + const absolutePath = path.isAbsolute(payload.image_path) + ? payload.image_path + : path.resolve(process.cwd(), payload.image_path); + const extension = path.extname(absolutePath); + const body = fs.readFileSync(absolutePath); + return `data:${mimeTypeForExtension(extension)};base64,${body.toString("base64")}`; +} + +function extractContent(response) { + const firstChoice = response?.choices?.[0]?.message?.content; + if (typeof firstChoice === "string") { + return firstChoice; + } + if (Array.isArray(firstChoice)) { + return firstChoice.map((part) => part?.text || "").join(""); + } + return ""; +} + +function extractOllamaContent(response) { + const content = response?.message?.content; + return typeof content === "string" ? content : ""; +} + +async function buildRequestSpec(provider, baseUrl, apiKey, model, payload, imageUrl, routeKey) { + if (provider === "ollama") { + const image = await resolveImageBytes(imageUrl); + return { + endpoint: `${baseUrl}/api/chat`, + headers: headersForProvider(provider, apiKey), + body: { + model, + stream: false, + keep_alive: resolveRouteEnv("AGCLAW_PROMPTFOO_VISION_KEEP_ALIVE", routeKey, "0s"), + options: { + temperature: 0.1, + num_predict: 400, + }, + messages: [ + { + role: "system", + content: payload.system_prompt || "You are a precise multimodal evaluator.", + }, + { + role: "user", + content: payload.task || "Describe the image.", + ...(image ? { images: [image] } : {}), + }, + ], + }, + parse: extractOllamaContent, + }; + } + + return { + endpoint: endpointForProvider(provider, baseUrl), + headers: headersForProvider(provider, apiKey), + body: { + model, + stream: false, + temperature: 0.1, + max_tokens: 400, + messages: [ + { + role: "system", + content: payload.system_prompt || "You are a precise multimodal evaluator.", + }, + { + role: "user", + content: [ + { type: "text", text: payload.task || "Describe the image." }, + ...(imageUrl ? [{ type: "image_url", image_url: { url: imageUrl, detail: "low" } }] : []), + ], + }, + ], + }, + parse: extractContent, + }; +} + +function resolveTemplateValue(value, vars) { + if (typeof value !== "string") { + return value; + } + return value.replace(/{{\s*([^}]+)\s*}}/g, (_, key) => { + const resolved = vars?.[String(key).trim()]; + return resolved == null ? "" : String(resolved); + }); +} + +function resolvePromptPayload(prompt, context) { + const payload = JSON.parse(String(prompt)); + const vars = context?.vars || {}; + return { + route_key: resolveTemplateValue(payload.route_key, vars), + system_prompt: resolveTemplateValue(payload.system_prompt, vars), + task: resolveTemplateValue(payload.task, vars), + image_path: resolveTemplateValue(payload.image_path, vars), + image_url: resolveTemplateValue(payload.image_url, vars), + }; +} + +class AgClawVisionProvider { + constructor(options = {}) { + this.providerId = options.id || "agclaw-vision-provider"; + } + + id() { + return this.providerId; + } + + async callApi(prompt, context = {}) { + const payload = resolvePromptPayload(prompt, context); + const routeKey = String(payload.route_key || context?.vars?.route_key || "").trim().toLowerCase(); + const provider = resolveRouteEnv("AGCLAW_PROMPTFOO_VISION_PROVIDER", routeKey, "ollama"); + const baseUrl = normalizeBaseUrl(resolveRouteEnv("AGCLAW_PROMPTFOO_VISION_BASE_URL", routeKey, "http://127.0.0.1:11434")); + const model = resolveRouteEnv("AGCLAW_PROMPTFOO_VISION_MODEL", routeKey, defaultModelForRoute(routeKey)); + const apiKey = resolveRouteEnv("AGCLAW_PROMPTFOO_VISION_API_KEY", routeKey, ""); + const timeoutMs = resolveRouteIntEnv("AGCLAW_PROMPTFOO_VISION_TIMEOUT_MS", routeKey, 240000); + const maxRetries = resolveRouteIntEnv("AGCLAW_PROMPTFOO_VISION_RETRIES", routeKey, 1); + const imageUrl = resolveImageUrl(payload); + const requestSpec = await buildRequestSpec(provider, baseUrl, apiKey, model, payload, imageUrl, routeKey); + let lastError = "Unknown multimodal failure"; + + for (let attempt = 0; attempt <= maxRetries; attempt += 1) { + try { + const response = await fetch(requestSpec.endpoint, { + method: "POST", + headers: requestSpec.headers, + signal: AbortSignal.timeout(timeoutMs), + body: JSON.stringify(requestSpec.body), + }); + + if (!response.ok) { + lastError = `HTTP ${response.status}: ${await response.text()}`; + } else { + const result = await response.json(); + return { output: requestSpec.parse(result) }; + } + } catch (error) { + lastError = error instanceof Error ? `${error.name}: ${error.message}` : String(error); + } + + if (attempt < maxRetries) { + await delay(1500 * (attempt + 1)); + } + } + + return { + error: lastError, + }; + } +} + +module.exports = AgClawVisionProvider; \ No newline at end of file diff --git a/promptfoo/scripts/build-hf-promptfoo-cases.mjs b/promptfoo/scripts/build-hf-promptfoo-cases.mjs new file mode 100644 index 00000000..972d3103 --- /dev/null +++ b/promptfoo/scripts/build-hf-promptfoo-cases.mjs @@ -0,0 +1,124 @@ +import { mkdir, readFile, writeFile } from "node:fs/promises"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const promptfooDir = path.resolve(__dirname, ".."); +const generatedDir = path.resolve(promptfooDir, "generated"); + +function parseJsonl(text) { + return text + .split(/\r?\n/) + .map((line) => line.trim()) + .filter(Boolean) + .map((line) => JSON.parse(line)); +} + +function keywordList(text, count = 2) { + const stopWords = new Set(["the", "and", "for", "with", "this", "that", "page", "screen", "showing", "different", "option", "options", "displaying", "display"]); + return [...new Set( + String(text) + .toLowerCase() + .replace(/[^a-z0-9\s-]/g, " ") + .split(/\s+/) + .filter((token) => token.length > 3 && !stopWords.has(token)) + .sort((left, right) => right.length - left.length) + )].slice(0, count); +} + +function buildCaptionAssertions(item) { + const rowIdx = Number(item.row_idx); + + if (rowIdx === 0) { + return [ + { + type: "icontains", + value: "share", + }, + { + type: "icontains", + value: "menu", + }, + ]; + } + + if (rowIdx === 1) { + return [ + { + type: "icontains", + value: "install", + }, + ]; + } + + return keywordList(item.row?.text ?? "").map((keyword) => ({ + type: "icontains", + value: keyword, + })); +} + +async function readCases(relativePath) { + const absolutePath = path.resolve(promptfooDir, relativePath); + return parseJsonl(await readFile(absolutePath, "utf-8")); +} + +function buildCaptionConfig(rows) { + return { + description: "AG-Claw multimodal caption regression pack", + prompts: ["file://../prompts/vision-caption.txt"], + providers: ["file://../providers/agclawVisionProvider.js"], + tests: rows.map((item) => ({ + description: `Caption sample ${item.row_idx}`, + vars: { + task: "Describe the main UI state in one short sentence.", + image_path: item.local_image_path, + }, + assert: buildCaptionAssertions(item), + })), + }; +} + +function buildOcrConfig(rows) { + return { + description: "AG-Claw OCR visual QA regression pack", + prompts: ["file://../prompts/vision-ocr.txt"], + providers: ["file://../providers/agclawVisionProvider.js"], + tests: rows.map((item) => ({ + description: `OCR-VQA sample ${item.row_idx}`, + vars: { + image_path: item.local_image_path, + question: item.row?.questions?.[0] ?? "What is visible in this image?", + }, + assert: [ + { + type: "icontains", + value: item.row?.answers?.[0] ?? "", + }, + ], + })), + }; +} + +async function writeConfig(fileName, config) { + await mkdir(generatedDir, { recursive: true }); + const targetPath = path.resolve(generatedDir, fileName); + await writeFile(targetPath, JSON.stringify(config, null, 2) + "\n", "utf-8"); +} + +async function main() { + const captionRows = await readCases("cases/hf/rico-screen2words.test.jsonl"); + const ocrRows = await readCases("cases/hf/ocr-vqa.validation.jsonl"); + + if (!captionRows.length || !ocrRows.length) { + throw new Error("HF case files are missing. Import the allowlisted datasets before building promptfoo suites."); + } + + await writeConfig("vision-caption.config.json", buildCaptionConfig(captionRows.slice(0, 2))); + await writeConfig("vision-ocr.config.json", buildOcrConfig(ocrRows.slice(0, 2))); +} + +main().catch((error) => { + console.error(error instanceof Error ? error.message : String(error)); + process.exitCode = 1; +}); \ No newline at end of file diff --git a/promptfoo/scripts/import-hf-eval-assets.mjs b/promptfoo/scripts/import-hf-eval-assets.mjs index e046d604..40a537db 100644 --- a/promptfoo/scripts/import-hf-eval-assets.mjs +++ b/promptfoo/scripts/import-hf-eval-assets.mjs @@ -1,18 +1,21 @@ import { mkdir, readFile, writeFile } from "node:fs/promises"; import https from "node:https"; import path from "node:path"; +import sharp from "sharp"; import { fileURLToPath } from "node:url"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const promptfooDir = path.resolve(__dirname, ".."); const manifestPath = path.resolve(promptfooDir, "hf-eval-assets.manifest.json"); +const assetRoot = path.resolve(promptfooDir, "cases", "hf", "assets"); function parseArgs(argv) { const options = { dataset: "", all: false, limit: undefined, + downloadAssets: true, }; for (let index = 0; index < argv.length; index += 1) { @@ -32,6 +35,10 @@ function parseArgs(argv) { } if (token === "--all") { options.all = true; + continue; + } + if (token === "--no-download-assets") { + options.downloadAssets = false; } } @@ -53,7 +60,23 @@ function normalizeLimit(limit, defaultLimit, maxRows) { return Math.max(1, Math.min(bounded, maxRows)); } -async function fetchJson(url) { +function resolveExtension(url, contentType) { + const cleanedUrl = url.split("?")[0] ?? url; + const fromUrl = path.extname(cleanedUrl); + if (fromUrl) { + return fromUrl; + } + + if (contentType.includes("png")) { + return ".png"; + } + if (contentType.includes("webp")) { + return ".webp"; + } + return ".jpg"; +} + +async function requestUrl(url, binary = false) { const caFile = process.env.AGCLAW_HF_CA_FILE?.trim(); const ca = caFile ? await readFile(caFile, "utf-8") : undefined; const agent = new https.Agent({ @@ -66,14 +89,19 @@ async function fetchJson(url) { const chunks = []; response.on("data", (chunk) => chunks.push(chunk)); response.on("end", () => { - const body = Buffer.concat(chunks).toString("utf-8"); + const body = Buffer.concat(chunks); if ((response.statusCode ?? 500) >= 400) { - reject(new Error(`HTTP ${response.statusCode}: ${body}`)); + reject(new Error(`HTTP ${response.statusCode}: ${body.toString("utf-8")}`)); + return; + } + + if (binary) { + resolve({ body, contentType: response.headers["content-type"] ?? "" }); return; } try { - resolve(JSON.parse(body)); + resolve(JSON.parse(body.toString("utf-8"))); } catch (error) { reject(error); } @@ -84,6 +112,25 @@ async function fetchJson(url) { }); } +async function fetchJson(url) { + return requestUrl(url, false); +} + +async function downloadAsset(imageUrl, datasetKey, rowIndex) { + const { body, contentType } = await requestUrl(imageUrl, true); + const extension = resolveExtension(imageUrl, String(contentType)); + const targetDir = path.resolve(assetRoot, datasetKey); + const fileName = `${String(rowIndex).padStart(4, "0")}.jpg`; + const targetPath = path.resolve(targetDir, fileName); + const resizedBody = await sharp(body) + .resize({ width: 384, height: 384, fit: "inside", withoutEnlargement: true }) + .jpeg({ quality: 82 }) + .toBuffer(); + await mkdir(targetDir, { recursive: true }); + await writeFile(targetPath, resizedBody); + return path.relative(promptfooDir, targetPath).replace(/\\/g, "/"); +} + async function importDataset(datasetKey, entry, requestedLimit) { const payload = await fetchJson(toFirstRowsUrl(entry)); const rows = Array.isArray(payload.rows) ? payload.rows : []; @@ -94,8 +141,13 @@ async function importDataset(datasetKey, entry, requestedLimit) { await mkdir(path.dirname(targetPath), { recursive: true }); const importedAt = new Date().toISOString(); - const records = selectedRows.map((item) => - JSON.stringify({ + const records = []; + for (const item of selectedRows) { + const remoteImageUrl = typeof item.row?.image?.src === "string" ? item.row.image.src : ""; + const localImagePath = remoteImageUrl + ? await downloadAsset(remoteImageUrl, datasetKey, item.row_idx ?? 0) + : null; + records.push(JSON.stringify({ dataset_key: datasetKey, dataset: entry.dataset, config: entry.config, @@ -103,11 +155,12 @@ async function importDataset(datasetKey, entry, requestedLimit) { imported_at: importedAt, purpose: entry.purpose, governance: entry.governance, + local_image_path: localImagePath, row_idx: item.row_idx, row: item.row, truncated_cells: item.truncated_cells ?? [], - }) - ); + })); + } await writeFile(targetPath, records.join("\n") + "\n", "utf-8"); return { datasetKey, targetPath, rowsImported: selectedRows.length }; diff --git a/scripts/start-litellm.ps1 b/scripts/start-litellm.ps1 new file mode 100644 index 00000000..af6ef11e --- /dev/null +++ b/scripts/start-litellm.ps1 @@ -0,0 +1,36 @@ +param( + [int]$Port = 4000, + [string]$ConfigPath = "", + [string]$MasterKey = "agclaw-dev-key", + [switch]$Inline +) + +$ErrorActionPreference = "Stop" + +function Test-CommandAvailable { + param([string]$Name) + return $null -ne (Get-Command $Name -ErrorAction SilentlyContinue) +} + +$repoRoot = Split-Path -Parent $PSScriptRoot +$defaultConfig = Join-Path $repoRoot "litellm/agclaw-config.local.yaml" +$resolvedConfig = if ($ConfigPath) { $ConfigPath } else { $defaultConfig } + +if (-not (Test-Path $resolvedConfig)) { + throw "LiteLLM config not found at $resolvedConfig" +} + +if (-not (Test-CommandAvailable litellm)) { + throw "litellm is not available on PATH. Install it with: pip install 'litellm[proxy]'" +} + +$command = "`$env:LITELLM_MASTER_KEY='$MasterKey'; litellm --config '$resolvedConfig' --host 127.0.0.1 --port $Port" + +if ($Inline) { + Write-Host $command + exit 0 +} + +Start-Process powershell -ArgumentList @('-NoExit', '-Command', $command) -WorkingDirectory $repoRoot | Out-Null +Write-Host "LiteLLM starting on http://127.0.0.1:$Port using $resolvedConfig" -ForegroundColor Green +Write-Host "Use provider 'openai-compatible' and API URL http://127.0.0.1:$Port in AG-Claw." -ForegroundColor Green \ No newline at end of file diff --git a/web/e2e/research-workbench.spec.ts b/web/e2e/research-workbench.spec.ts new file mode 100644 index 00000000..b85294be --- /dev/null +++ b/web/e2e/research-workbench.spec.ts @@ -0,0 +1,51 @@ +import { expect, test } from "@playwright/test"; + +test.describe("Research workbench flows", () => { + test.beforeEach(async ({ page }) => { + await page.addInitScript(() => { + window.localStorage.clear(); + window.sessionStorage.clear(); + }); + await page.goto("/"); + await page.getByRole("button", { name: "Research tools" }).click(); + await expect(page.getByRole("heading", { name: "Research Workbench" })).toBeVisible(); + }); + + test("retrieve, orchestrate, and reopen persisted history", async ({ page }) => { + await page.getByRole("button", { name: "ISA-95 Retrieval" }).click(); + await page.getByRole("button", { name: "Retrieve research" }).click(); + await expect(page.getByText("Material genealogy and traceability")).toBeVisible(); + + await page.getByRole("button", { name: "Orchestrate" }).click(); + await page.getByRole("button", { name: "Run orchestration" }).click(); + await expect(page.getByText("Recent orchestration runs")).toBeVisible(); + await expect(page.getByText("Prepared 3 research roles for model qwen2.5-coder:7b.").first()).toBeVisible(); + + await page.getByRole("button", { name: "Close research workbench" }).click(); + await page.getByRole("button", { name: "Research tools" }).click(); + await page.getByRole("button", { name: "Orchestrate" }).click(); + await expect(page.getByText("Recent orchestration runs")).toBeVisible(); + await page.getByRole("button", { name: /Review the MES release flow for operator approvals and genealogy capture./ }).first().click(); + await expect(page.getByText("Persisted orchestration detail")).toBeVisible(); + await expect(page.getByText("Select provider adapter implementation.")).toBeVisible(); + }); + + test("log slimming and heuristic HMI review stay advisory-only", async ({ page }) => { + await page.getByRole("button", { name: "Log Slimming" }).click(); + await page.getByRole("button", { name: "Slim log" }).click(); + await expect(page.getByText("Batch=42 started by operator=anne")).toBeVisible(); + + await page.getByRole("button", { name: "HMI Review" }).click(); + await page.locator('input[type="file"]').setInputFiles({ + name: "mixer-release-screen.png", + mimeType: "image/png", + buffer: Buffer.from( + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+lm3sAAAAASUVORK5CYII=", + "base64" + ), + }); + await page.getByRole("button", { name: "Interpret screen" }).click(); + await expect(page.getByText("Adapter: heuristic")).toBeVisible(); + await expect(page.getByText("Do not recommend overrides or forced run actions while alarm context is incomplete.")).toBeVisible(); + }); +}); \ No newline at end of file diff --git a/web/playwright.config.ts b/web/playwright.config.ts index 60df188a..e921cf73 100644 --- a/web/playwright.config.ts +++ b/web/playwright.config.ts @@ -16,7 +16,7 @@ export default defineConfig({ command: `node scripts/start-playwright-stack.mjs ${backendPort}`, cwd: path.resolve(__dirname), url: `http://127.0.0.1:${port}/health`, - timeout: 180000, + timeout: 600000, reuseExistingServer: false, }, projects: [ diff --git a/web/scripts/start-e2e-server.mjs b/web/scripts/start-e2e-server.mjs index 6ab07891..26b4139c 100644 --- a/web/scripts/start-e2e-server.mjs +++ b/web/scripts/start-e2e-server.mjs @@ -9,6 +9,7 @@ const repoRoot = path.resolve(webDir, ".."); const nextBin = path.resolve(webDir, "node_modules", "next", "dist", "bin", "next"); const port = process.env.PORT ?? "3100"; const backendPort = process.env.AGCLAW_BACKEND_PORT ?? "8008"; +const pythonCommand = process.env.AGCLAW_PYTHON_EXECUTABLE || "python"; const liveVision = process.env.AGCLAW_E2E_LIVE_VISION === "1"; const fail = (name) => (error) => { console.error(`${name} failed to start:`, error); @@ -17,7 +18,7 @@ const fail = (name) => (error) => { }; const backend = spawn( - "python", + pythonCommand, ["-m", "agclaw_backend.server", "--host", "127.0.0.1", "--port", backendPort], { cwd: repoRoot,