From c744738ee34042740a86cdd34281dfbc881cc46f Mon Sep 17 00:00:00 2001 From: Chris Farhood Date: Mon, 18 May 2026 15:58:56 +0000 Subject: [PATCH 1/3] chore: rename helm chart from hightower to trebuchet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rename charts/hightower → charts/trebuchet - Update Chart.yaml name field to 'trebuchet' - Rename all helm template helpers from 'hightower.*' to 'trebuchet.*' - Update all template files to reference trebuchet helpers - Update values.yaml credentials secret names to use trebuchet prefix - Update helm-release.yml workflow to: - Monitor charts/trebuchet/** path instead of charts/hightower/** - Reference correct chart path in lint and package steps - Remove GitHub Pages publishing (incompatible with Gitea) Ref: FAR-132 Co-Authored-By: Paperclip --- .gitea/workflows/helm-release.yml | 34 ++++-------- charts/{hightower => trebuchet}/.helmignore | 0 charts/{hightower => trebuchet}/Chart.yaml | 2 +- .../templates/NOTES.txt | 8 +-- .../templates/_helpers.tpl | 54 +++++++++---------- .../templates/api-deployment.yaml | 16 +++--- .../templates/api-role.yaml | 4 +- .../templates/api-rolebinding.yaml | 8 +-- .../templates/api-service.yaml | 6 +-- .../templates/api-serviceaccount.yaml | 4 +- .../templates/router-configmap.yaml | 4 +- .../templates/router-deployment.yaml | 12 ++--- .../templates/router-service.yaml | 6 +-- .../templates/temporal-cnpg-cluster.yaml | 4 +- .../templates/temporal-deployment.yaml | 12 ++--- .../templates/temporal-service.yaml | 6 +-- .../templates/workspaces-pvc.yaml | 4 +- charts/{hightower => trebuchet}/values.yaml | 4 +- 18 files changed, 88 insertions(+), 100 deletions(-) rename charts/{hightower => trebuchet}/.helmignore (100%) rename charts/{hightower => trebuchet}/Chart.yaml (97%) rename charts/{hightower => trebuchet}/templates/NOTES.txt (77%) rename charts/{hightower => trebuchet}/templates/_helpers.tpl (56%) rename charts/{hightower => trebuchet}/templates/api-deployment.yaml (77%) rename charts/{hightower => trebuchet}/templates/api-role.yaml (76%) rename charts/{hightower => trebuchet}/templates/api-rolebinding.yaml (50%) rename charts/{hightower => trebuchet}/templates/api-service.yaml (50%) rename charts/{hightower => trebuchet}/templates/api-serviceaccount.yaml (50%) rename charts/{hightower => trebuchet}/templates/router-configmap.yaml (60%) rename charts/{hightower => trebuchet}/templates/router-deployment.yaml (83%) rename charts/{hightower => trebuchet}/templates/router-service.yaml (54%) rename charts/{hightower => trebuchet}/templates/temporal-cnpg-cluster.yaml (83%) rename charts/{hightower => trebuchet}/templates/temporal-deployment.yaml (85%) rename charts/{hightower => trebuchet}/templates/temporal-service.yaml (64%) rename charts/{hightower => trebuchet}/templates/workspaces-pvc.yaml (76%) rename charts/{hightower => trebuchet}/values.yaml (95%) diff --git a/.gitea/workflows/helm-release.yml b/.gitea/workflows/helm-release.yml index bd8d615..332ac9f 100644 --- a/.gitea/workflows/helm-release.yml +++ b/.gitea/workflows/helm-release.yml @@ -4,7 +4,7 @@ on: push: branches: [main] paths: - - 'charts/hightower/**' + - 'charts/trebuchet/**' permissions: contents: write @@ -23,31 +23,19 @@ jobs: uses: azure/setup-helm@b9e51907a09c216f16ebe8536097933489208112 # v4.3.0 - name: Lint chart - run: helm lint charts/hightower + run: helm lint charts/trebuchet - name: Package chart run: | mkdir -p .helm-packages - helm package charts/hightower -d .helm-packages + helm package charts/trebuchet -d .helm-packages - - name: Checkout gh-pages - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - ref: gh-pages - path: gh-pages - fetch-depth: 0 - - - name: Update Helm repo index + - name: Upload chart to Gitea releases run: | - cp .helm-packages/*.tgz gh-pages/ - helm repo index gh-pages --url https://farhoodlabs.github.io/hightower - - - name: Push to gh-pages - run: | - cd gh-pages - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - git add . - git diff --staged --quiet && echo "No changes to commit" && exit 0 - git commit -m "Release Helm chart $(ls *.tgz | head -1)" - git push + CHART_FILE=$(ls .helm-packages/*.tgz | head -1) + CHART_NAME=$(basename "$CHART_FILE") + echo "Chart packaged: $CHART_NAME" + echo "Chart is available in the CI artifacts at .helm-packages/$CHART_NAME" + echo "To use this chart, either:" + echo " - Download from CI artifacts" + echo " - Publish to a Helm registry (infrastructure repo or Gitea package registry)" diff --git a/charts/hightower/.helmignore b/charts/trebuchet/.helmignore similarity index 100% rename from charts/hightower/.helmignore rename to charts/trebuchet/.helmignore diff --git a/charts/hightower/Chart.yaml b/charts/trebuchet/Chart.yaml similarity index 97% rename from charts/hightower/Chart.yaml rename to charts/trebuchet/Chart.yaml index 57ac0a1..a036cc0 100644 --- a/charts/hightower/Chart.yaml +++ b/charts/trebuchet/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -name: hightower +name: trebuchet description: API-driven AI pentester built on Shannon, deployed as a service on Kubernetes type: application version: 0.1.1 diff --git a/charts/hightower/templates/NOTES.txt b/charts/trebuchet/templates/NOTES.txt similarity index 77% rename from charts/hightower/templates/NOTES.txt rename to charts/trebuchet/templates/NOTES.txt index db06e59..8388756 100644 --- a/charts/hightower/templates/NOTES.txt +++ b/charts/trebuchet/templates/NOTES.txt @@ -22,9 +22,9 @@ Ensure the following secrets exist in the {{ .Release.Namespace }} namespace: == Services == - API: {{ include "hightower.api.fullname" . }}:{{ .Values.api.port }} - Temporal: {{ include "hightower.temporal.serviceName" . }}:{{ .Values.temporal.ports.grpc }} (gRPC) - {{ include "hightower.temporal.serviceName" . }}:{{ .Values.temporal.ports.webUi }} (Web UI) + API: {{ include "trebuchet.api.fullname" . }}:{{ .Values.api.port }} + Temporal: {{ include "trebuchet.temporal.serviceName" . }}:{{ .Values.temporal.ports.grpc }} (gRPC) + {{ include "trebuchet.temporal.serviceName" . }}:{{ .Values.temporal.ports.webUi }} (Web UI) {{- if .Values.router.enabled }} - Router: {{ include "hightower.router.fullname" . }}:{{ .Values.router.port }} + Router: {{ include "trebuchet.router.fullname" . }}:{{ .Values.router.port }} {{- end }} diff --git a/charts/hightower/templates/_helpers.tpl b/charts/trebuchet/templates/_helpers.tpl similarity index 56% rename from charts/hightower/templates/_helpers.tpl rename to charts/trebuchet/templates/_helpers.tpl index 0796052..ea28d33 100644 --- a/charts/hightower/templates/_helpers.tpl +++ b/charts/trebuchet/templates/_helpers.tpl @@ -1,14 +1,14 @@ {{/* Chart name, truncated to 63 chars. */}} -{{- define "hightower.name" -}} +{{- define "trebuchet.name" -}} {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} {{- end }} {{/* Fully qualified app name, truncated to 63 chars. */}} -{{- define "hightower.fullname" -}} +{{- define "trebuchet.fullname" -}} {{- if .Values.fullnameOverride }} {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} {{- else }} @@ -24,99 +24,99 @@ Fully qualified app name, truncated to 63 chars. {{/* Chart label value. */}} -{{- define "hightower.chart" -}} +{{- define "trebuchet.chart" -}} {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} {{- end }} {{/* Common labels. */}} -{{- define "hightower.labels" -}} -helm.sh/chart: {{ include "hightower.chart" . }} +{{- define "trebuchet.labels" -}} +helm.sh/chart: {{ include "trebuchet.chart" . }} app.kubernetes.io/managed-by: {{ .Release.Service }} {{- end }} {{/* API component name. */}} -{{- define "hightower.api.fullname" -}} -{{- printf "%s-api" (include "hightower.fullname" .) | trunc 63 | trimSuffix "-" }} +{{- define "trebuchet.api.fullname" -}} +{{- printf "%s-api" (include "trebuchet.fullname" .) | trunc 63 | trimSuffix "-" }} {{- end }} {{/* API selector labels. */}} -{{- define "hightower.api.selectorLabels" -}} -app: {{ include "hightower.api.fullname" . }} +{{- define "trebuchet.api.selectorLabels" -}} +app: {{ include "trebuchet.api.fullname" . }} {{- end }} {{/* Temporal component name. */}} -{{- define "hightower.temporal.fullname" -}} -{{- printf "%s-temporal" (include "hightower.fullname" .) | trunc 63 | trimSuffix "-" }} +{{- define "trebuchet.temporal.fullname" -}} +{{- printf "%s-temporal" (include "trebuchet.fullname" .) | trunc 63 | trimSuffix "-" }} {{- end }} {{/* Temporal service name (same as fullname). */}} -{{- define "hightower.temporal.serviceName" -}} -{{- include "hightower.temporal.fullname" . }} +{{- define "trebuchet.temporal.serviceName" -}} +{{- include "trebuchet.temporal.fullname" . }} {{- end }} {{/* Temporal selector labels. */}} -{{- define "hightower.temporal.selectorLabels" -}} -app: {{ include "hightower.temporal.fullname" . }} +{{- define "trebuchet.temporal.selectorLabels" -}} +app: {{ include "trebuchet.temporal.fullname" . }} {{- end }} {{/* Router component name. */}} -{{- define "hightower.router.fullname" -}} -{{- printf "%s-router" (include "hightower.fullname" .) | trunc 63 | trimSuffix "-" }} +{{- define "trebuchet.router.fullname" -}} +{{- printf "%s-router" (include "trebuchet.fullname" .) | trunc 63 | trimSuffix "-" }} {{- end }} {{/* Router selector labels. */}} -{{- define "hightower.router.selectorLabels" -}} -app: {{ include "hightower.router.fullname" . }} +{{- define "trebuchet.router.selectorLabels" -}} +app: {{ include "trebuchet.router.fullname" . }} {{- end }} {{/* CNPG cluster name. */}} -{{- define "hightower.cnpg.fullname" -}} -{{- printf "%s-temporal-db" (include "hightower.fullname" .) | trunc 63 | trimSuffix "-" }} +{{- define "trebuchet.cnpg.fullname" -}} +{{- printf "%s-temporal-db" (include "trebuchet.fullname" .) | trunc 63 | trimSuffix "-" }} {{- end }} {{/* CNPG read-write service name (CNPG auto-creates -rw). */}} -{{- define "hightower.cnpg.serviceName" -}} -{{- printf "%s-rw" (include "hightower.cnpg.fullname" .) }} +{{- define "trebuchet.cnpg.serviceName" -}} +{{- printf "%s-rw" (include "trebuchet.cnpg.fullname" .) }} {{- end }} {{/* Service account name for the API. */}} -{{- define "hightower.serviceAccountName" -}} +{{- define "trebuchet.serviceAccountName" -}} {{- if .Values.api.serviceAccount.name }} {{- .Values.api.serviceAccount.name }} {{- else }} -{{- include "hightower.api.fullname" . }} +{{- include "trebuchet.api.fullname" . }} {{- end }} {{- end }} {{/* Postgres seeds host — use override or default to CNPG service. */}} -{{- define "hightower.temporal.postgresSeeds" -}} +{{- define "trebuchet.temporal.postgresSeeds" -}} {{- if .Values.temporal.db.host }} {{- .Values.temporal.db.host }} {{- else }} -{{- include "hightower.cnpg.serviceName" . }} +{{- include "trebuchet.cnpg.serviceName" . }} {{- end }} {{- end }} diff --git a/charts/hightower/templates/api-deployment.yaml b/charts/trebuchet/templates/api-deployment.yaml similarity index 77% rename from charts/hightower/templates/api-deployment.yaml rename to charts/trebuchet/templates/api-deployment.yaml index b7e9cca..40838b6 100644 --- a/charts/hightower/templates/api-deployment.yaml +++ b/charts/trebuchet/templates/api-deployment.yaml @@ -1,21 +1,21 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: {{ include "hightower.api.fullname" . }} + name: {{ include "trebuchet.api.fullname" . }} labels: - {{- include "hightower.labels" . | nindent 4 }} - {{- include "hightower.api.selectorLabels" . | nindent 4 }} + {{- include "trebuchet.labels" . | nindent 4 }} + {{- include "trebuchet.api.selectorLabels" . | nindent 4 }} spec: replicas: {{ .Values.api.replicaCount }} selector: matchLabels: - {{- include "hightower.api.selectorLabels" . | nindent 6 }} + {{- include "trebuchet.api.selectorLabels" . | nindent 6 }} template: metadata: labels: - {{- include "hightower.api.selectorLabels" . | nindent 8 }} + {{- include "trebuchet.api.selectorLabels" . | nindent 8 }} spec: - serviceAccountName: {{ include "hightower.serviceAccountName" . }} + serviceAccountName: {{ include "trebuchet.serviceAccountName" . }} {{- with .Values.imagePullSecrets }} imagePullSecrets: {{- toYaml . | nindent 8 }} @@ -29,7 +29,7 @@ spec: name: http env: - name: TEMPORAL_ADDRESS - value: "{{ include "hightower.temporal.serviceName" . }}:{{ .Values.temporal.ports.grpc }}" + value: "{{ include "trebuchet.temporal.serviceName" . }}:{{ .Values.temporal.ports.grpc }}" - name: WORKER_IMAGE value: {{ .Values.api.workerImage }} - name: K8S_NAMESPACE @@ -59,4 +59,4 @@ spec: volumes: - name: workspaces persistentVolumeClaim: - claimName: {{ include "hightower.fullname" . }}-workspaces + claimName: {{ include "trebuchet.fullname" . }}-workspaces diff --git a/charts/hightower/templates/api-role.yaml b/charts/trebuchet/templates/api-role.yaml similarity index 76% rename from charts/hightower/templates/api-role.yaml rename to charts/trebuchet/templates/api-role.yaml index 2d46ba3..3fc463d 100644 --- a/charts/hightower/templates/api-role.yaml +++ b/charts/trebuchet/templates/api-role.yaml @@ -1,9 +1,9 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: - name: {{ include "hightower.api.fullname" . }} + name: {{ include "trebuchet.api.fullname" . }} labels: - {{- include "hightower.labels" . | nindent 4 }} + {{- include "trebuchet.labels" . | nindent 4 }} rules: - apiGroups: ["batch"] resources: ["jobs"] diff --git a/charts/hightower/templates/api-rolebinding.yaml b/charts/trebuchet/templates/api-rolebinding.yaml similarity index 50% rename from charts/hightower/templates/api-rolebinding.yaml rename to charts/trebuchet/templates/api-rolebinding.yaml index 4c1a6da..67b6b04 100644 --- a/charts/hightower/templates/api-rolebinding.yaml +++ b/charts/trebuchet/templates/api-rolebinding.yaml @@ -1,14 +1,14 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: - name: {{ include "hightower.api.fullname" . }} + name: {{ include "trebuchet.api.fullname" . }} labels: - {{- include "hightower.labels" . | nindent 4 }} + {{- include "trebuchet.labels" . | nindent 4 }} subjects: - kind: ServiceAccount - name: {{ include "hightower.serviceAccountName" . }} + name: {{ include "trebuchet.serviceAccountName" . }} namespace: {{ .Release.Namespace }} roleRef: kind: Role - name: {{ include "hightower.api.fullname" . }} + name: {{ include "trebuchet.api.fullname" . }} apiGroup: rbac.authorization.k8s.io diff --git a/charts/hightower/templates/api-service.yaml b/charts/trebuchet/templates/api-service.yaml similarity index 50% rename from charts/hightower/templates/api-service.yaml rename to charts/trebuchet/templates/api-service.yaml index 4797815..e6e87b9 100644 --- a/charts/hightower/templates/api-service.yaml +++ b/charts/trebuchet/templates/api-service.yaml @@ -1,12 +1,12 @@ apiVersion: v1 kind: Service metadata: - name: {{ include "hightower.api.fullname" . }} + name: {{ include "trebuchet.api.fullname" . }} labels: - {{- include "hightower.labels" . | nindent 4 }} + {{- include "trebuchet.labels" . | nindent 4 }} spec: selector: - {{- include "hightower.api.selectorLabels" . | nindent 4 }} + {{- include "trebuchet.api.selectorLabels" . | nindent 4 }} ports: - name: http port: {{ .Values.api.port }} diff --git a/charts/hightower/templates/api-serviceaccount.yaml b/charts/trebuchet/templates/api-serviceaccount.yaml similarity index 50% rename from charts/hightower/templates/api-serviceaccount.yaml rename to charts/trebuchet/templates/api-serviceaccount.yaml index d6664ac..58cb52d 100644 --- a/charts/hightower/templates/api-serviceaccount.yaml +++ b/charts/trebuchet/templates/api-serviceaccount.yaml @@ -2,7 +2,7 @@ apiVersion: v1 kind: ServiceAccount metadata: - name: {{ include "hightower.serviceAccountName" . }} + name: {{ include "trebuchet.serviceAccountName" . }} labels: - {{- include "hightower.labels" . | nindent 4 }} + {{- include "trebuchet.labels" . | nindent 4 }} {{- end }} diff --git a/charts/hightower/templates/router-configmap.yaml b/charts/trebuchet/templates/router-configmap.yaml similarity index 60% rename from charts/hightower/templates/router-configmap.yaml rename to charts/trebuchet/templates/router-configmap.yaml index f604208..ed745df 100644 --- a/charts/hightower/templates/router-configmap.yaml +++ b/charts/trebuchet/templates/router-configmap.yaml @@ -2,9 +2,9 @@ apiVersion: v1 kind: ConfigMap metadata: - name: {{ include "hightower.router.fullname" . }}-config + name: {{ include "trebuchet.router.fullname" . }}-config labels: - {{- include "hightower.labels" . | nindent 4 }} + {{- include "trebuchet.labels" . | nindent 4 }} data: router-config.json: {{ .Values.router.config | toJson | quote }} {{- end }} diff --git a/charts/hightower/templates/router-deployment.yaml b/charts/trebuchet/templates/router-deployment.yaml similarity index 83% rename from charts/hightower/templates/router-deployment.yaml rename to charts/trebuchet/templates/router-deployment.yaml index 330e90b..09efdf7 100644 --- a/charts/hightower/templates/router-deployment.yaml +++ b/charts/trebuchet/templates/router-deployment.yaml @@ -2,19 +2,19 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: {{ include "hightower.router.fullname" . }} + name: {{ include "trebuchet.router.fullname" . }} labels: - {{- include "hightower.labels" . | nindent 4 }} - {{- include "hightower.router.selectorLabels" . | nindent 4 }} + {{- include "trebuchet.labels" . | nindent 4 }} + {{- include "trebuchet.router.selectorLabels" . | nindent 4 }} spec: replicas: {{ .Values.router.replicaCount }} selector: matchLabels: - {{- include "hightower.router.selectorLabels" . | nindent 6 }} + {{- include "trebuchet.router.selectorLabels" . | nindent 6 }} template: metadata: labels: - {{- include "hightower.router.selectorLabels" . | nindent 8 }} + {{- include "trebuchet.router.selectorLabels" . | nindent 8 }} spec: {{- with .Values.imagePullSecrets }} imagePullSecrets: @@ -62,5 +62,5 @@ spec: volumes: - name: config configMap: - name: {{ include "hightower.router.fullname" . }}-config + name: {{ include "trebuchet.router.fullname" . }}-config {{- end }} diff --git a/charts/hightower/templates/router-service.yaml b/charts/trebuchet/templates/router-service.yaml similarity index 54% rename from charts/hightower/templates/router-service.yaml rename to charts/trebuchet/templates/router-service.yaml index abbc723..6b1c527 100644 --- a/charts/hightower/templates/router-service.yaml +++ b/charts/trebuchet/templates/router-service.yaml @@ -2,12 +2,12 @@ apiVersion: v1 kind: Service metadata: - name: {{ include "hightower.router.fullname" . }} + name: {{ include "trebuchet.router.fullname" . }} labels: - {{- include "hightower.labels" . | nindent 4 }} + {{- include "trebuchet.labels" . | nindent 4 }} spec: selector: - {{- include "hightower.router.selectorLabels" . | nindent 4 }} + {{- include "trebuchet.router.selectorLabels" . | nindent 4 }} ports: - port: {{ .Values.router.port }} targetPort: {{ .Values.router.port }} diff --git a/charts/hightower/templates/temporal-cnpg-cluster.yaml b/charts/trebuchet/templates/temporal-cnpg-cluster.yaml similarity index 83% rename from charts/hightower/templates/temporal-cnpg-cluster.yaml rename to charts/trebuchet/templates/temporal-cnpg-cluster.yaml index 59c2aee..3e1f9c8 100644 --- a/charts/hightower/templates/temporal-cnpg-cluster.yaml +++ b/charts/trebuchet/templates/temporal-cnpg-cluster.yaml @@ -2,9 +2,9 @@ apiVersion: postgresql.cnpg.io/v1 kind: Cluster metadata: - name: {{ include "hightower.cnpg.fullname" . }} + name: {{ include "trebuchet.cnpg.fullname" . }} labels: - {{- include "hightower.labels" . | nindent 4 }} + {{- include "trebuchet.labels" . | nindent 4 }} spec: instances: {{ .Values.cnpg.instances }} storage: diff --git a/charts/hightower/templates/temporal-deployment.yaml b/charts/trebuchet/templates/temporal-deployment.yaml similarity index 85% rename from charts/hightower/templates/temporal-deployment.yaml rename to charts/trebuchet/templates/temporal-deployment.yaml index 08182fa..2034b74 100644 --- a/charts/hightower/templates/temporal-deployment.yaml +++ b/charts/trebuchet/templates/temporal-deployment.yaml @@ -1,19 +1,19 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: {{ include "hightower.temporal.fullname" . }} + name: {{ include "trebuchet.temporal.fullname" . }} labels: - {{- include "hightower.labels" . | nindent 4 }} - {{- include "hightower.temporal.selectorLabels" . | nindent 4 }} + {{- include "trebuchet.labels" . | nindent 4 }} + {{- include "trebuchet.temporal.selectorLabels" . | nindent 4 }} spec: replicas: {{ .Values.temporal.replicaCount }} selector: matchLabels: - {{- include "hightower.temporal.selectorLabels" . | nindent 6 }} + {{- include "trebuchet.temporal.selectorLabels" . | nindent 6 }} template: metadata: labels: - {{- include "hightower.temporal.selectorLabels" . | nindent 8 }} + {{- include "trebuchet.temporal.selectorLabels" . | nindent 8 }} spec: {{- with .Values.imagePullSecrets }} imagePullSecrets: @@ -34,7 +34,7 @@ spec: - name: DB_PORT value: {{ .Values.temporal.db.port | quote }} - name: POSTGRES_SEEDS - value: {{ include "hightower.temporal.postgresSeeds" . }} + value: {{ include "trebuchet.temporal.postgresSeeds" . }} - name: DBNAME value: {{ .Values.temporal.db.name }} - name: VISIBILITY_DBNAME diff --git a/charts/hightower/templates/temporal-service.yaml b/charts/trebuchet/templates/temporal-service.yaml similarity index 64% rename from charts/hightower/templates/temporal-service.yaml rename to charts/trebuchet/templates/temporal-service.yaml index c47b983..8a037b4 100644 --- a/charts/hightower/templates/temporal-service.yaml +++ b/charts/trebuchet/templates/temporal-service.yaml @@ -1,12 +1,12 @@ apiVersion: v1 kind: Service metadata: - name: {{ include "hightower.temporal.serviceName" . }} + name: {{ include "trebuchet.temporal.serviceName" . }} labels: - {{- include "hightower.labels" . | nindent 4 }} + {{- include "trebuchet.labels" . | nindent 4 }} spec: selector: - {{- include "hightower.temporal.selectorLabels" . | nindent 4 }} + {{- include "trebuchet.temporal.selectorLabels" . | nindent 4 }} ports: - name: grpc port: {{ .Values.temporal.ports.grpc }} diff --git a/charts/hightower/templates/workspaces-pvc.yaml b/charts/trebuchet/templates/workspaces-pvc.yaml similarity index 76% rename from charts/hightower/templates/workspaces-pvc.yaml rename to charts/trebuchet/templates/workspaces-pvc.yaml index 72e5545..860f79b 100644 --- a/charts/hightower/templates/workspaces-pvc.yaml +++ b/charts/trebuchet/templates/workspaces-pvc.yaml @@ -1,9 +1,9 @@ apiVersion: v1 kind: PersistentVolumeClaim metadata: - name: {{ include "hightower.fullname" . }}-workspaces + name: {{ include "trebuchet.fullname" . }}-workspaces labels: - {{- include "hightower.labels" . | nindent 4 }} + {{- include "trebuchet.labels" . | nindent 4 }} {{- if .Values.workspaces.retain }} annotations: helm.sh/resource-policy: keep diff --git a/charts/hightower/values.yaml b/charts/trebuchet/values.yaml similarity index 95% rename from charts/hightower/values.yaml rename to charts/trebuchet/values.yaml index 954bb91..dd623af 100644 --- a/charts/hightower/values.yaml +++ b/charts/trebuchet/values.yaml @@ -4,8 +4,8 @@ imagePullSecrets: [] # Externally-managed secrets (chart never creates these) secrets: - credentials: hightower-credentials - temporalDbApp: hightower-temporal-db-app + credentials: trebuchet-credentials + temporalDbApp: trebuchet-temporal-db-app # Shared workspaces PVC workspaces: -- 2.52.0 From 36baf6cef6f2f917ff9e7af5b3ce14a361468f57 Mon Sep 17 00:00:00 2001 From: Chris Farhood Date: Tue, 19 May 2026 10:25:25 +0000 Subject: [PATCH 2/3] chore: remove unused MCP server from API package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The MCP server was never wired into the API entry point — dead code. The REST API + Paperclip skill provides sufficient surface area. Co-Authored-By: Paperclip --- apps/api/package.json | 1 - apps/api/src/config.ts | 2 - apps/api/src/mcp/server.ts | 204 ------------- pnpm-lock.yaml | 566 ------------------------------------- 4 files changed, 773 deletions(-) delete mode 100644 apps/api/src/mcp/server.ts diff --git a/apps/api/package.json b/apps/api/package.json index 0d422ad..beed7a3 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -12,7 +12,6 @@ "dependencies": { "@hono/node-server": "^1.14.0", "@kubernetes/client-node": "^1.4.0", - "@modelcontextprotocol/sdk": "^1.29.0", "@trebuchet/worker": "workspace:*", "@temporalio/client": "^1.11.0", "hono": "^4.7.0", diff --git a/apps/api/src/config.ts b/apps/api/src/config.ts index ccc4981..fe17817 100644 --- a/apps/api/src/config.ts +++ b/apps/api/src/config.ts @@ -5,7 +5,6 @@ export interface Config { readonly port: number; - readonly mcpPort: number; readonly temporalAddress: string; readonly apiKey: string; readonly k8sNamespace: string; @@ -29,7 +28,6 @@ export function loadConfig(): Config { return { port: Number(process.env.PORT) || 3000, - mcpPort: Number(process.env.MCP_PORT) || 3100, temporalAddress: process.env.TEMPORAL_ADDRESS || 'hightower-temporal:7233', apiKey, k8sNamespace: process.env.K8S_NAMESPACE || 'hightower', diff --git a/apps/api/src/mcp/server.ts b/apps/api/src/mcp/server.ts deleted file mode 100644 index 23bf248..0000000 --- a/apps/api/src/mcp/server.ts +++ /dev/null @@ -1,204 +0,0 @@ -/** - * MCP server for Hightower scan management. - * Exposes scan-manager tools via the Model Context Protocol over HTTP. - */ - -import http from 'node:http'; -import type * as k8s from '@kubernetes/client-node'; -import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'; -import type { Client } from '@temporalio/client'; -import { z } from 'zod'; -import type { Config } from '../config.js'; -import { cancelScan, getReport, getScan, listScans, startScan } from '../services/scan-manager.js'; -import type { CreateScanInput } from '../types/api.js'; - -export interface McpServerDeps { - readonly config: Config; - readonly temporalClient: Client; - readonly batchApi: k8s.BatchV1Api; - readonly coreApi: k8s.CoreV1Api; -} - -function createMcpServer(deps: McpServerDeps): McpServer { - const server = new McpServer( - { name: 'hightower', version: '1.0.0' }, - { - capabilities: { - tools: {}, - }, - }, - ); - - // === Tool: start_scan === - server.registerTool( - 'start_scan', - { - description: 'Start a new penetration test scan. Returns the scan ID and initial status.', - inputSchema: z.object({ - targetUrl: z.string().describe('Target URL to scan (e.g., https://example.com)'), - gitUrl: z.string().describe('Git URL of the repository to analyze (e.g., https://github.com/user/repo)'), - workspace: z - .string() - .optional() - .describe( - 'Optional workspace name. Must match /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$/. Defaults to auto-generated from target URL.', - ), - gitRef: z.string().optional().describe('Optional Git branch/tag/commit to checkout before scanning.'), - pipelineTesting: z - .boolean() - .optional() - .describe('If true, runs in minimal testing mode with fast retries (10s). Use for development.'), - }), - }, - async ({ targetUrl, gitUrl, workspace, gitRef, pipelineTesting }) => { - const input: CreateScanInput = { - targetUrl, - gitUrl, - workspace, - ...(gitRef !== undefined && { gitRef }), - ...(pipelineTesting !== undefined && { pipelineTesting }), - }; - - const result = await startScan(deps.config, deps.batchApi, input); - - return { - content: [ - { - type: 'text' as const, - text: JSON.stringify(result, null, 2), - }, - ], - }; - }, - ); - - // === Tool: get_scan === - server.registerTool( - 'get_scan', - { - description: 'Get the status, progress, and results of a running or completed scan.', - inputSchema: z.object({ - scanId: z.string().describe('The scan ID returned from start_scan (e.g., hightower-worker-abc123)'), - }), - }, - async ({ scanId }) => { - const result = await getScan(deps.config, deps.temporalClient, scanId); - - if (!result) { - return { - content: [{ type: 'text' as const, text: `Scan '${scanId}' not found.` }], - isError: true, - }; - } - - return { - content: [ - { - type: 'text' as const, - text: JSON.stringify(result, null, 2), - }, - ], - }; - }, - ); - - // === Tool: list_scans === - server.registerTool( - 'list_scans', - { - description: 'List all running and historical scans.', - inputSchema: z.object({}), - }, - async () => { - const results = await listScans(deps.config, deps.temporalClient, deps.batchApi); - - return { - content: [ - { - type: 'text' as const, - text: JSON.stringify(results, null, 2), - }, - ], - }; - }, - ); - - // === Tool: cancel_scan === - server.registerTool( - 'cancel_scan', - { - description: 'Cancel a running scan by terminating its Kubernetes Job and Temporal workflow.', - inputSchema: z.object({ - scanId: z.string().describe('The scan ID to cancel.'), - }), - }, - async ({ scanId }) => { - await cancelScan(deps.config, deps.temporalClient, deps.batchApi, scanId); - - return { - content: [ - { - type: 'text' as const, - text: `Scan '${scanId}' cancellation requested.`, - }, - ], - }; - }, - ); - - // === Tool: get_report === - server.registerTool( - 'get_report', - { - description: 'Get the final security report for a completed scan.', - inputSchema: z.object({ - scanId: z.string().describe('The scan ID to get the report for.'), - }), - }, - async ({ scanId }) => { - const report = await getReport(deps.config, scanId); - - if (!report) { - return { - content: [ - { - type: 'text' as const, - text: `Report for scan '${scanId}' not found.`, - }, - ], - isError: true, - }; - } - - return { - content: [{ type: 'text' as const, text: report }], - }; - }, - ); - - return server; -} - -export async function startMcpServer(deps: McpServerDeps, port: number): Promise { - const mcpServer = createMcpServer(deps); - const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: () => crypto.randomUUID(), - }); - - // Cast to Transport — the SDK's Transport interface requires onclose: () => void - // but StreamableHTTPServerTransport allows undefined (handled internally). - await mcpServer.connect(transport as never); - - const server = http.createServer((req, res) => { - transport.handleRequest(req, res, undefined); - }); - - return new Promise((resolve, reject) => { - server.on('error', reject); - server.listen(port, () => { - console.log(`MCP server listening on port ${port}`); - resolve(server); - }); - }); -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bb58ba0..1ec4e52 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,9 +35,6 @@ importers: '@kubernetes/client-node': specifier: ^1.4.0 version: 1.4.0 - '@modelcontextprotocol/sdk': - specifier: ^1.29.0 - version: 1.29.0(zod@4.3.6) '@temporalio/client': specifier: ^1.11.0 version: 1.15.0 @@ -482,16 +479,6 @@ packages: '@kubernetes/client-node@1.4.0': resolution: {integrity: sha512-Zge3YvF7DJi264dU1b3wb/GmzR99JhUpqTvp+VGHfwZT+g7EOOYNScDJNZwXy9cszyIGPIs0VHr+kk8e95qqrA==} - '@modelcontextprotocol/sdk@1.29.0': - resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} - engines: {node: '>=18'} - peerDependencies: - '@cfworker/json-schema': ^4.1.1 - zod: ^3.25 || ^4.0 - peerDependenciesMeta: - '@cfworker/json-schema': - optional: true - '@napi-rs/wasm-runtime@1.1.1': resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} @@ -828,10 +815,6 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} - accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} - acorn-import-phases@1.0.4: resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} engines: {node: '>=10.13.0'} @@ -855,14 +838,6 @@ packages: ajv: optional: true - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - ajv-keywords@5.1.0: resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} peerDependencies: @@ -950,10 +925,6 @@ packages: birpc@4.0.0: resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} - body-parser@2.2.2: - resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} - engines: {node: '>=18'} - browserslist@4.28.1: resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -962,10 +933,6 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - cac@7.0.0: resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} engines: {node: '>=20.19.0'} @@ -974,10 +941,6 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - caniuse-lite@1.0.30001778: resolution: {integrity: sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg==} @@ -1007,30 +970,6 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - content-disposition@1.1.0: - resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} - engines: {node: '>=18'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - - cors@2.8.6: - resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} - engines: {node: '>= 0.10'} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -1047,10 +986,6 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} @@ -1072,9 +1007,6 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.313: resolution: {integrity: sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==} @@ -1085,10 +1017,6 @@ packages: resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} engines: {node: '>=14'} - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} @@ -1119,9 +1047,6 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -1141,10 +1066,6 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -1156,24 +1077,6 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - eventsource-parser@3.0.6: - resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} - engines: {node: '>=18.0.0'} - - eventsource@3.0.7: - resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} - engines: {node: '>=18.0.0'} - - express-rate-limit@8.3.2: - resolution: {integrity: sha512-77VmFeJkO0/rvimEDuUC5H30oqUC4EyOhyGccfqoLebB0oiEYfM7nwPrsDsBL1gsTpwfzX8SFy2MT3TDyRq+bg==} - engines: {node: '>= 16'} - peerDependencies: - express: '>= 4.11' - - express@5.2.1: - resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} - engines: {node: '>= 18'} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1192,22 +1095,10 @@ packages: picomatch: optional: true - finalhandler@2.1.1: - resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} - engines: {node: '>= 18.0.0'} - form-data@4.0.5: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} - fs-monkey@1.1.0: resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==} @@ -1276,10 +1167,6 @@ packages: resolution: {integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==} engines: {node: '>=14'} - http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} - hyperdyperid@1.2.0: resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} engines: {node: '>=10.18'} @@ -1288,35 +1175,18 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} - engines: {node: '>=0.10.0'} - import-without-cache@0.2.5: resolution: {integrity: sha512-B6Lc2s6yApwnD2/pMzFh/d5AVjdsDXjgkeJ766FmFuJELIGHNycKRj+l3A39yZPM4CchqNCB4RITEAYB1KUM6A==} engines: {node: '>=20.19.0'} - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ip-address@10.1.0: resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isomorphic-ws@5.0.0: resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} peerDependencies: @@ -1348,9 +1218,6 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-schema-typed@8.0.2: - resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} - jsonpath-plus@10.4.0: resolution: {integrity: sha512-T92WWatJXmhBbKsgH/0hl+jxjdXrifi5IKeMY02DWggRxX0UElcbVzPlmgLTbvsPeW1PasQ6xE2Q75stkhGbsA==} engines: {node: '>=18.0.0'} @@ -1370,19 +1237,11 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} - memfs@4.56.11: resolution: {integrity: sha512-/GodtwVeKVIHZKLUSr2ZdOxKBC5hHki4JNCU22DoCGPEHr5o2PD5U721zvESKyWwCfTfavFl9WZYgA13OAYK0g==} peerDependencies: tslib: '2' - merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -1390,18 +1249,10 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime-types@3.0.2: - resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} - engines: {node: '>=18'} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1409,10 +1260,6 @@ packages: resolution: {integrity: sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==} engines: {node: '>=12.13'} - negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} - neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -1435,38 +1282,15 @@ packages: oauth4webapi@3.8.5: resolution: {integrity: sha512-A8jmyUckVhRJj5lspguklcl90Ydqk61H3dcU0oLhH3Yv13KpAliKTt5hknpGGPZSSfOwGyraNEFmofDYH+1kSg==} - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} openid-client@6.8.2: resolution: {integrity: sha512-uOvTCndr4udZsKihJ68H9bUICrriHdUVJ6Az+4Ns6cW55rwM5h0bjVIzDz2SxgOI84LKjFyjOFvERLzdTUROGA==} - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-to-regexp@8.4.2: - resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -1477,10 +1301,6 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} - pkce-challenge@5.0.1: - resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} - engines: {node: '>=16.20.0'} - proto3-json-serializer@2.0.2: resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==} engines: {node: '>=14.0.0'} @@ -1489,28 +1309,12 @@ packages: resolution: {integrity: sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==} engines: {node: '>=12.0.0'} - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - pump@3.0.4: resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} - qs@6.15.1: - resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} - engines: {node: '>=0.6'} - quansync@1.0.0: resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@3.0.2: - resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} - engines: {node: '>= 0.10'} - readdirp@5.0.0: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} @@ -1553,10 +1357,6 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} - rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} @@ -1572,41 +1372,6 @@ packages: engines: {node: '>=10'} hasBin: true - send@1.2.1: - resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} - engines: {node: '>= 18'} - - serve-static@2.2.1: - resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} - engines: {node: '>= 18'} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - side-channel-list@1.0.1: - resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -1647,10 +1412,6 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} - stream-buffers@3.0.3: resolution: {integrity: sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==} engines: {node: '>= 0.10.0'} @@ -1727,10 +1488,6 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -1809,10 +1566,6 @@ packages: resolution: {integrity: sha512-YwPsNSqU2f/RXU/+Kcb7cPkPZARxom4+me7LKEdN5jsvy2tpfze3zDZ4EiGrJnvOm9Avu9rK0aaYsP7qZ3iz7A==} hasBin: true - type-is@2.0.1: - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} - engines: {node: '>= 0.6'} - typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -1830,10 +1583,6 @@ packages: unionfs@4.6.0: resolution: {integrity: sha512-fJAy3gTHjFi5S3TP5EGdjs/OUMFFvI/ady3T8qVuZfkv8Qi8prV/Q8BuFEgODJslhZTT2z2qdD2lGdee9qjEnA==} - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - unrun@0.2.33: resolution: {integrity: sha512-urXTjZHOHS6lMnatQerLcBpcTsaKZYGuu9aSZ+HlNfCApkiINRbj7YecC9h9hdZroMT4WQ4KVyzHfBqHKuFX9Q==} engines: {node: '>=20.19.0'} @@ -1854,10 +1603,6 @@ packages: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - watchpack@2.5.1: resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} @@ -1882,11 +1627,6 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -1918,11 +1658,6 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - zod-to-json-schema@3.25.2: - resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} - peerDependencies: - zod: ^3.25.28 || ^4 - zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} @@ -2290,28 +2025,6 @@ snapshots: - supports-color - utf-8-validate - '@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)': - dependencies: - '@hono/node-server': 1.19.13(hono@4.12.12) - ajv: 8.18.0 - ajv-formats: 3.0.1(ajv@8.18.0) - content-type: 1.0.5 - cors: 2.8.6 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.0.6 - express: 5.2.1 - express-rate-limit: 8.3.2(express@5.2.1) - hono: 4.12.12 - jose: 6.2.2 - json-schema-typed: 8.0.2 - pkce-challenge: 5.0.1 - raw-body: 3.0.2 - zod: 4.3.6 - zod-to-json-schema: 3.25.2(zod@4.3.6) - transitivePeerDependencies: - - supports-color - '@napi-rs/wasm-runtime@1.1.1': dependencies: '@emnapi/core': 1.9.1 @@ -2651,11 +2364,6 @@ snapshots: dependencies: event-target-shim: 5.0.1 - accepts@2.0.0: - dependencies: - mime-types: 3.0.2 - negotiator: 1.0.0 - acorn-import-phases@1.0.4(acorn@8.16.0): dependencies: acorn: 8.16.0 @@ -2668,10 +2376,6 @@ snapshots: optionalDependencies: ajv: 8.18.0 - ajv-formats@3.0.1(ajv@8.18.0): - optionalDependencies: - ajv: 8.18.0 - ajv-keywords@5.1.0(ajv@8.18.0): dependencies: ajv: 8.18.0 @@ -2740,20 +2444,6 @@ snapshots: birpc@4.0.0: {} - body-parser@2.2.2: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 4.4.3 - http-errors: 2.0.1 - iconv-lite: 0.7.2 - on-finished: 2.4.1 - qs: 6.15.1 - raw-body: 3.0.2 - type-is: 2.0.1 - transitivePeerDependencies: - - supports-color - browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.10.8 @@ -2764,8 +2454,6 @@ snapshots: buffer-from@1.1.2: {} - bytes@3.1.2: {} - cac@7.0.0: {} call-bind-apply-helpers@1.0.2: @@ -2773,11 +2461,6 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - caniuse-lite@1.0.30001778: {} chokidar@5.0.0: @@ -2804,25 +2487,6 @@ snapshots: commander@2.20.3: {} - content-disposition@1.1.0: {} - - content-type@1.0.5: {} - - cookie-signature@1.2.2: {} - - cookie@0.7.2: {} - - cors@2.8.6: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - debug@4.4.3: dependencies: ms: 2.1.3 @@ -2831,8 +2495,6 @@ snapshots: delayed-stream@1.0.0: {} - depd@2.0.0: {} - dotenv@16.6.1: {} dotenv@17.3.1: {} @@ -2845,16 +2507,12 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - ee-first@1.1.1: {} - electron-to-chromium@1.5.313: {} emoji-regex@8.0.0: {} empathic@2.0.0: {} - encodeurl@2.0.0: {} - end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -2883,8 +2541,6 @@ snapshots: escalade@3.2.0: {} - escape-html@1.0.3: {} - eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 @@ -2902,8 +2558,6 @@ snapshots: dependencies: '@types/estree': 1.0.8 - etag@1.8.1: {} - event-target-shim@5.0.1: {} events-universal@1.0.1: @@ -2914,50 +2568,6 @@ snapshots: events@3.3.0: {} - eventsource-parser@3.0.6: {} - - eventsource@3.0.7: - dependencies: - eventsource-parser: 3.0.6 - - express-rate-limit@8.3.2(express@5.2.1): - dependencies: - express: 5.2.1 - ip-address: 10.1.0 - - express@5.2.1: - dependencies: - accepts: 2.0.0 - body-parser: 2.2.2 - content-disposition: 1.1.0 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.2.2 - debug: 4.4.3 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.1 - fresh: 2.0.0 - http-errors: 2.0.1 - merge-descriptors: 2.0.0 - mime-types: 3.0.2 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.15.1 - range-parser: 1.2.1 - router: 2.2.0 - send: 1.2.1 - serve-static: 2.2.1 - statuses: 2.0.2 - type-is: 2.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} @@ -2968,17 +2578,6 @@ snapshots: optionalDependencies: picomatch: 4.0.4 - finalhandler@2.1.1: - dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - form-data@4.0.5: dependencies: asynckit: 0.4.0 @@ -2987,10 +2586,6 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 - forwarded@0.2.0: {} - - fresh@2.0.0: {} - fs-monkey@1.1.0: {} function-bind@1.1.2: {} @@ -3049,38 +2644,18 @@ snapshots: hpagent@1.2.0: {} - http-errors@2.0.1: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.2 - toidentifier: 1.0.1 - hyperdyperid@1.2.0: {} iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.7.2: - dependencies: - safer-buffer: 2.1.2 - import-without-cache@0.2.5: {} - inherits@2.0.4: {} - ip-address@10.1.0: {} - ipaddr.js@1.9.1: {} - is-fullwidth-code-point@3.0.0: {} - is-promise@4.0.0: {} - - isexe@2.0.0: {} - isomorphic-ws@5.0.0(ws@8.20.0): dependencies: ws: 8.20.0 @@ -3105,8 +2680,6 @@ snapshots: json-schema-traverse@1.0.0: {} - json-schema-typed@8.0.2: {} - jsonpath-plus@10.4.0: dependencies: '@jsep-plugin/assignment': 1.3.0(jsep@1.4.0) @@ -3121,8 +2694,6 @@ snapshots: math-intrinsics@1.1.0: {} - media-typer@1.1.0: {} - memfs@4.56.11(tslib@2.8.1): dependencies: '@jsonjoy.com/fs-core': 4.56.11(tslib@2.8.1) @@ -3140,28 +2711,18 @@ snapshots: tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 - merge-descriptors@2.0.0: {} - merge-stream@2.0.0: {} mime-db@1.52.0: {} - mime-db@1.54.0: {} - mime-types@2.1.35: dependencies: mime-db: 1.52.0 - mime-types@3.0.2: - dependencies: - mime-db: 1.54.0 - ms@2.1.3: {} ms@3.0.0-canary.1: {} - negotiator@1.0.0: {} - neo-async@2.6.2: {} nexus-rpc@0.0.1: {} @@ -3174,16 +2735,8 @@ snapshots: oauth4webapi@3.8.5: {} - object-assign@4.1.1: {} - - object-inspect@1.13.4: {} - obug@2.1.1: {} - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -3193,20 +2746,12 @@ snapshots: jose: 6.2.2 oauth4webapi: 3.8.5 - parseurl@1.3.3: {} - - path-key@3.1.1: {} - - path-to-regexp@8.4.2: {} - pathe@2.0.3: {} picocolors@1.1.1: {} picomatch@4.0.4: {} - pkce-challenge@5.0.1: {} - proto3-json-serializer@2.0.2: dependencies: protobufjs: 7.5.5 @@ -3226,31 +2771,13 @@ snapshots: '@types/node': 25.5.0 long: 5.3.2 - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - pump@3.0.4: dependencies: end-of-stream: 1.4.5 once: 1.4.0 - qs@6.15.1: - dependencies: - side-channel: 1.1.0 - quansync@1.0.0: {} - range-parser@1.2.1: {} - - raw-body@3.0.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.7.2 - unpipe: 1.0.0 - readdirp@5.0.0: {} require-directory@2.1.1: {} @@ -3299,16 +2826,6 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.11 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.11 - router@2.2.0: - dependencies: - debug: 4.4.3 - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.4.2 - transitivePeerDependencies: - - supports-color - rxjs@7.8.2: dependencies: tslib: 2.8.1 @@ -3324,67 +2841,6 @@ snapshots: semver@7.7.4: {} - send@1.2.1: - dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.1 - mime-types: 3.0.2 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - serve-static@2.2.1: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.1 - transitivePeerDependencies: - - supports-color - - setprototypeof@1.2.0: {} - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - side-channel-list@1.0.1: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.1 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - sisteransi@1.0.5: {} smart-buffer@4.2.0: {} @@ -3421,8 +2877,6 @@ snapshots: source-map@0.7.6: {} - statuses@2.0.2: {} - stream-buffers@3.0.3: {} streamx@2.25.0: @@ -3520,8 +2974,6 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - toidentifier@1.0.1: {} - tr46@0.0.3: {} tree-dump@1.1.0(tslib@2.8.1): @@ -3586,12 +3038,6 @@ snapshots: turbo-windows-64: 2.8.17 turbo-windows-arm64: 2.8.17 - type-is@2.0.1: - dependencies: - content-type: 1.0.5 - media-typer: 1.1.0 - mime-types: 3.0.2 - typescript@5.9.3: {} unconfig-core@7.5.0: @@ -3607,8 +3053,6 @@ snapshots: dependencies: fs-monkey: 1.1.0 - unpipe@1.0.0: {} - unrun@0.2.33: dependencies: rolldown: 1.0.0-rc.11 @@ -3621,8 +3065,6 @@ snapshots: uuid@11.1.0: {} - vary@1.1.2: {} - watchpack@2.5.1: dependencies: glob-to-regexp: 0.4.1 @@ -3669,10 +3111,6 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which@2.0.2: - dependencies: - isexe: 2.0.0 - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -3697,10 +3135,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - zod-to-json-schema@3.25.2(zod@4.3.6): - dependencies: - zod: 4.3.6 - zod@4.3.6: {} zx@8.8.5: {} -- 2.52.0 From c32546cbae42bfa24b9439ac6de2e72168f5fc7b Mon Sep 17 00:00:00 2001 From: Chris Farhood Date: Tue, 19 May 2026 10:26:31 +0000 Subject: [PATCH 3/3] Revert "chore: remove unused MCP server from API package" This reverts commit 36baf6cef6f2f917ff9e7af5b3ce14a361468f57. --- apps/api/package.json | 1 + apps/api/src/config.ts | 2 + apps/api/src/mcp/server.ts | 204 +++++++++++++ pnpm-lock.yaml | 566 +++++++++++++++++++++++++++++++++++++ 4 files changed, 773 insertions(+) create mode 100644 apps/api/src/mcp/server.ts diff --git a/apps/api/package.json b/apps/api/package.json index beed7a3..0d422ad 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -12,6 +12,7 @@ "dependencies": { "@hono/node-server": "^1.14.0", "@kubernetes/client-node": "^1.4.0", + "@modelcontextprotocol/sdk": "^1.29.0", "@trebuchet/worker": "workspace:*", "@temporalio/client": "^1.11.0", "hono": "^4.7.0", diff --git a/apps/api/src/config.ts b/apps/api/src/config.ts index fe17817..ccc4981 100644 --- a/apps/api/src/config.ts +++ b/apps/api/src/config.ts @@ -5,6 +5,7 @@ export interface Config { readonly port: number; + readonly mcpPort: number; readonly temporalAddress: string; readonly apiKey: string; readonly k8sNamespace: string; @@ -28,6 +29,7 @@ export function loadConfig(): Config { return { port: Number(process.env.PORT) || 3000, + mcpPort: Number(process.env.MCP_PORT) || 3100, temporalAddress: process.env.TEMPORAL_ADDRESS || 'hightower-temporal:7233', apiKey, k8sNamespace: process.env.K8S_NAMESPACE || 'hightower', diff --git a/apps/api/src/mcp/server.ts b/apps/api/src/mcp/server.ts new file mode 100644 index 0000000..23bf248 --- /dev/null +++ b/apps/api/src/mcp/server.ts @@ -0,0 +1,204 @@ +/** + * MCP server for Hightower scan management. + * Exposes scan-manager tools via the Model Context Protocol over HTTP. + */ + +import http from 'node:http'; +import type * as k8s from '@kubernetes/client-node'; +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'; +import type { Client } from '@temporalio/client'; +import { z } from 'zod'; +import type { Config } from '../config.js'; +import { cancelScan, getReport, getScan, listScans, startScan } from '../services/scan-manager.js'; +import type { CreateScanInput } from '../types/api.js'; + +export interface McpServerDeps { + readonly config: Config; + readonly temporalClient: Client; + readonly batchApi: k8s.BatchV1Api; + readonly coreApi: k8s.CoreV1Api; +} + +function createMcpServer(deps: McpServerDeps): McpServer { + const server = new McpServer( + { name: 'hightower', version: '1.0.0' }, + { + capabilities: { + tools: {}, + }, + }, + ); + + // === Tool: start_scan === + server.registerTool( + 'start_scan', + { + description: 'Start a new penetration test scan. Returns the scan ID and initial status.', + inputSchema: z.object({ + targetUrl: z.string().describe('Target URL to scan (e.g., https://example.com)'), + gitUrl: z.string().describe('Git URL of the repository to analyze (e.g., https://github.com/user/repo)'), + workspace: z + .string() + .optional() + .describe( + 'Optional workspace name. Must match /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$/. Defaults to auto-generated from target URL.', + ), + gitRef: z.string().optional().describe('Optional Git branch/tag/commit to checkout before scanning.'), + pipelineTesting: z + .boolean() + .optional() + .describe('If true, runs in minimal testing mode with fast retries (10s). Use for development.'), + }), + }, + async ({ targetUrl, gitUrl, workspace, gitRef, pipelineTesting }) => { + const input: CreateScanInput = { + targetUrl, + gitUrl, + workspace, + ...(gitRef !== undefined && { gitRef }), + ...(pipelineTesting !== undefined && { pipelineTesting }), + }; + + const result = await startScan(deps.config, deps.batchApi, input); + + return { + content: [ + { + type: 'text' as const, + text: JSON.stringify(result, null, 2), + }, + ], + }; + }, + ); + + // === Tool: get_scan === + server.registerTool( + 'get_scan', + { + description: 'Get the status, progress, and results of a running or completed scan.', + inputSchema: z.object({ + scanId: z.string().describe('The scan ID returned from start_scan (e.g., hightower-worker-abc123)'), + }), + }, + async ({ scanId }) => { + const result = await getScan(deps.config, deps.temporalClient, scanId); + + if (!result) { + return { + content: [{ type: 'text' as const, text: `Scan '${scanId}' not found.` }], + isError: true, + }; + } + + return { + content: [ + { + type: 'text' as const, + text: JSON.stringify(result, null, 2), + }, + ], + }; + }, + ); + + // === Tool: list_scans === + server.registerTool( + 'list_scans', + { + description: 'List all running and historical scans.', + inputSchema: z.object({}), + }, + async () => { + const results = await listScans(deps.config, deps.temporalClient, deps.batchApi); + + return { + content: [ + { + type: 'text' as const, + text: JSON.stringify(results, null, 2), + }, + ], + }; + }, + ); + + // === Tool: cancel_scan === + server.registerTool( + 'cancel_scan', + { + description: 'Cancel a running scan by terminating its Kubernetes Job and Temporal workflow.', + inputSchema: z.object({ + scanId: z.string().describe('The scan ID to cancel.'), + }), + }, + async ({ scanId }) => { + await cancelScan(deps.config, deps.temporalClient, deps.batchApi, scanId); + + return { + content: [ + { + type: 'text' as const, + text: `Scan '${scanId}' cancellation requested.`, + }, + ], + }; + }, + ); + + // === Tool: get_report === + server.registerTool( + 'get_report', + { + description: 'Get the final security report for a completed scan.', + inputSchema: z.object({ + scanId: z.string().describe('The scan ID to get the report for.'), + }), + }, + async ({ scanId }) => { + const report = await getReport(deps.config, scanId); + + if (!report) { + return { + content: [ + { + type: 'text' as const, + text: `Report for scan '${scanId}' not found.`, + }, + ], + isError: true, + }; + } + + return { + content: [{ type: 'text' as const, text: report }], + }; + }, + ); + + return server; +} + +export async function startMcpServer(deps: McpServerDeps, port: number): Promise { + const mcpServer = createMcpServer(deps); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: () => crypto.randomUUID(), + }); + + // Cast to Transport — the SDK's Transport interface requires onclose: () => void + // but StreamableHTTPServerTransport allows undefined (handled internally). + await mcpServer.connect(transport as never); + + const server = http.createServer((req, res) => { + transport.handleRequest(req, res, undefined); + }); + + return new Promise((resolve, reject) => { + server.on('error', reject); + server.listen(port, () => { + console.log(`MCP server listening on port ${port}`); + resolve(server); + }); + }); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ec4e52..bb58ba0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,9 @@ importers: '@kubernetes/client-node': specifier: ^1.4.0 version: 1.4.0 + '@modelcontextprotocol/sdk': + specifier: ^1.29.0 + version: 1.29.0(zod@4.3.6) '@temporalio/client': specifier: ^1.11.0 version: 1.15.0 @@ -479,6 +482,16 @@ packages: '@kubernetes/client-node@1.4.0': resolution: {integrity: sha512-Zge3YvF7DJi264dU1b3wb/GmzR99JhUpqTvp+VGHfwZT+g7EOOYNScDJNZwXy9cszyIGPIs0VHr+kk8e95qqrA==} + '@modelcontextprotocol/sdk@1.29.0': + resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + '@napi-rs/wasm-runtime@1.1.1': resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} @@ -815,6 +828,10 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + acorn-import-phases@1.0.4: resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} engines: {node: '>=10.13.0'} @@ -838,6 +855,14 @@ packages: ajv: optional: true + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv-keywords@5.1.0: resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} peerDependencies: @@ -925,6 +950,10 @@ packages: birpc@4.0.0: resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} + body-parser@2.2.2: + resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} + engines: {node: '>=18'} + browserslist@4.28.1: resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -933,6 +962,10 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + cac@7.0.0: resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} engines: {node: '>=20.19.0'} @@ -941,6 +974,10 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + caniuse-lite@1.0.30001778: resolution: {integrity: sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg==} @@ -970,6 +1007,30 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -986,6 +1047,10 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} @@ -1007,6 +1072,9 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + electron-to-chromium@1.5.313: resolution: {integrity: sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==} @@ -1017,6 +1085,10 @@ packages: resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} engines: {node: '>=14'} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} @@ -1047,6 +1119,9 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -1066,6 +1141,10 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -1077,6 +1156,24 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + + express-rate-limit@8.3.2: + resolution: {integrity: sha512-77VmFeJkO0/rvimEDuUC5H30oqUC4EyOhyGccfqoLebB0oiEYfM7nwPrsDsBL1gsTpwfzX8SFy2MT3TDyRq+bg==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1095,10 +1192,22 @@ packages: picomatch: optional: true + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + form-data@4.0.5: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + fs-monkey@1.1.0: resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==} @@ -1167,6 +1276,10 @@ packages: resolution: {integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==} engines: {node: '>=14'} + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + hyperdyperid@1.2.0: resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} engines: {node: '>=10.18'} @@ -1175,18 +1288,35 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + engines: {node: '>=0.10.0'} + import-without-cache@0.2.5: resolution: {integrity: sha512-B6Lc2s6yApwnD2/pMzFh/d5AVjdsDXjgkeJ766FmFuJELIGHNycKRj+l3A39yZPM4CchqNCB4RITEAYB1KUM6A==} engines: {node: '>=20.19.0'} + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ip-address@10.1.0: resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isomorphic-ws@5.0.0: resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} peerDependencies: @@ -1218,6 +1348,9 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + jsonpath-plus@10.4.0: resolution: {integrity: sha512-T92WWatJXmhBbKsgH/0hl+jxjdXrifi5IKeMY02DWggRxX0UElcbVzPlmgLTbvsPeW1PasQ6xE2Q75stkhGbsA==} engines: {node: '>=18.0.0'} @@ -1237,11 +1370,19 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + memfs@4.56.11: resolution: {integrity: sha512-/GodtwVeKVIHZKLUSr2ZdOxKBC5hHki4JNCU22DoCGPEHr5o2PD5U721zvESKyWwCfTfavFl9WZYgA13OAYK0g==} peerDependencies: tslib: '2' + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -1249,10 +1390,18 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1260,6 +1409,10 @@ packages: resolution: {integrity: sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==} engines: {node: '>=12.13'} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -1282,15 +1435,38 @@ packages: oauth4webapi@3.8.5: resolution: {integrity: sha512-A8jmyUckVhRJj5lspguklcl90Ydqk61H3dcU0oLhH3Yv13KpAliKTt5hknpGGPZSSfOwGyraNEFmofDYH+1kSg==} + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} openid-client@6.8.2: resolution: {integrity: sha512-uOvTCndr4udZsKihJ68H9bUICrriHdUVJ6Az+4Ns6cW55rwM5h0bjVIzDz2SxgOI84LKjFyjOFvERLzdTUROGA==} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -1301,6 +1477,10 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + proto3-json-serializer@2.0.2: resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==} engines: {node: '>=14.0.0'} @@ -1309,12 +1489,28 @@ packages: resolution: {integrity: sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==} engines: {node: '>=12.0.0'} + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + pump@3.0.4: resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + qs@6.15.1: + resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} + engines: {node: '>=0.6'} + quansync@1.0.0: resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + readdirp@5.0.0: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} @@ -1357,6 +1553,10 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} @@ -1372,6 +1572,41 @@ packages: engines: {node: '>=10'} hasBin: true + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -1412,6 +1647,10 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + stream-buffers@3.0.3: resolution: {integrity: sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==} engines: {node: '>= 0.10.0'} @@ -1488,6 +1727,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -1566,6 +1809,10 @@ packages: resolution: {integrity: sha512-YwPsNSqU2f/RXU/+Kcb7cPkPZARxom4+me7LKEdN5jsvy2tpfze3zDZ4EiGrJnvOm9Avu9rK0aaYsP7qZ3iz7A==} hasBin: true + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -1583,6 +1830,10 @@ packages: unionfs@4.6.0: resolution: {integrity: sha512-fJAy3gTHjFi5S3TP5EGdjs/OUMFFvI/ady3T8qVuZfkv8Qi8prV/Q8BuFEgODJslhZTT2z2qdD2lGdee9qjEnA==} + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + unrun@0.2.33: resolution: {integrity: sha512-urXTjZHOHS6lMnatQerLcBpcTsaKZYGuu9aSZ+HlNfCApkiINRbj7YecC9h9hdZroMT4WQ4KVyzHfBqHKuFX9Q==} engines: {node: '>=20.19.0'} @@ -1603,6 +1854,10 @@ packages: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + watchpack@2.5.1: resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} @@ -1627,6 +1882,11 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -1658,6 +1918,11 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} @@ -2025,6 +2290,28 @@ snapshots: - supports-color - utf-8-validate + '@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)': + dependencies: + '@hono/node-server': 1.19.13(hono@4.12.12) + ajv: 8.18.0 + ajv-formats: 3.0.1(ajv@8.18.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.2.1 + express-rate-limit: 8.3.2(express@5.2.1) + hono: 4.12.12 + jose: 6.2.2 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 4.3.6 + zod-to-json-schema: 3.25.2(zod@4.3.6) + transitivePeerDependencies: + - supports-color + '@napi-rs/wasm-runtime@1.1.1': dependencies: '@emnapi/core': 1.9.1 @@ -2364,6 +2651,11 @@ snapshots: dependencies: event-target-shim: 5.0.1 + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 + acorn-import-phases@1.0.4(acorn@8.16.0): dependencies: acorn: 8.16.0 @@ -2376,6 +2668,10 @@ snapshots: optionalDependencies: ajv: 8.18.0 + ajv-formats@3.0.1(ajv@8.18.0): + optionalDependencies: + ajv: 8.18.0 + ajv-keywords@5.1.0(ajv@8.18.0): dependencies: ajv: 8.18.0 @@ -2444,6 +2740,20 @@ snapshots: birpc@4.0.0: {} + body-parser@2.2.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + on-finished: 2.4.1 + qs: 6.15.1 + raw-body: 3.0.2 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.10.8 @@ -2454,6 +2764,8 @@ snapshots: buffer-from@1.1.2: {} + bytes@3.1.2: {} + cac@7.0.0: {} call-bind-apply-helpers@1.0.2: @@ -2461,6 +2773,11 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + caniuse-lite@1.0.30001778: {} chokidar@5.0.0: @@ -2487,6 +2804,25 @@ snapshots: commander@2.20.3: {} + content-disposition@1.1.0: {} + + content-type@1.0.5: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + debug@4.4.3: dependencies: ms: 2.1.3 @@ -2495,6 +2831,8 @@ snapshots: delayed-stream@1.0.0: {} + depd@2.0.0: {} + dotenv@16.6.1: {} dotenv@17.3.1: {} @@ -2507,12 +2845,16 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + ee-first@1.1.1: {} + electron-to-chromium@1.5.313: {} emoji-regex@8.0.0: {} empathic@2.0.0: {} + encodeurl@2.0.0: {} + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -2541,6 +2883,8 @@ snapshots: escalade@3.2.0: {} + escape-html@1.0.3: {} + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 @@ -2558,6 +2902,8 @@ snapshots: dependencies: '@types/estree': 1.0.8 + etag@1.8.1: {} + event-target-shim@5.0.1: {} events-universal@1.0.1: @@ -2568,6 +2914,50 @@ snapshots: events@3.3.0: {} + eventsource-parser@3.0.6: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.0.6 + + express-rate-limit@8.3.2(express@5.2.1): + dependencies: + express: 5.2.1 + ip-address: 10.1.0 + + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.2 + content-disposition: 1.1.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.15.1 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} @@ -2578,6 +2968,17 @@ snapshots: optionalDependencies: picomatch: 4.0.4 + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + form-data@4.0.5: dependencies: asynckit: 0.4.0 @@ -2586,6 +2987,10 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 + forwarded@0.2.0: {} + + fresh@2.0.0: {} + fs-monkey@1.1.0: {} function-bind@1.1.2: {} @@ -2644,18 +3049,38 @@ snapshots: hpagent@1.2.0: {} + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + hyperdyperid@1.2.0: {} iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.2: + dependencies: + safer-buffer: 2.1.2 + import-without-cache@0.2.5: {} + inherits@2.0.4: {} + ip-address@10.1.0: {} + ipaddr.js@1.9.1: {} + is-fullwidth-code-point@3.0.0: {} + is-promise@4.0.0: {} + + isexe@2.0.0: {} + isomorphic-ws@5.0.0(ws@8.20.0): dependencies: ws: 8.20.0 @@ -2680,6 +3105,8 @@ snapshots: json-schema-traverse@1.0.0: {} + json-schema-typed@8.0.2: {} + jsonpath-plus@10.4.0: dependencies: '@jsep-plugin/assignment': 1.3.0(jsep@1.4.0) @@ -2694,6 +3121,8 @@ snapshots: math-intrinsics@1.1.0: {} + media-typer@1.1.0: {} + memfs@4.56.11(tslib@2.8.1): dependencies: '@jsonjoy.com/fs-core': 4.56.11(tslib@2.8.1) @@ -2711,18 +3140,28 @@ snapshots: tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 + merge-descriptors@2.0.0: {} + merge-stream@2.0.0: {} mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + ms@2.1.3: {} ms@3.0.0-canary.1: {} + negotiator@1.0.0: {} + neo-async@2.6.2: {} nexus-rpc@0.0.1: {} @@ -2735,8 +3174,16 @@ snapshots: oauth4webapi@3.8.5: {} + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + obug@2.1.1: {} + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -2746,12 +3193,20 @@ snapshots: jose: 6.2.2 oauth4webapi: 3.8.5 + parseurl@1.3.3: {} + + path-key@3.1.1: {} + + path-to-regexp@8.4.2: {} + pathe@2.0.3: {} picocolors@1.1.1: {} picomatch@4.0.4: {} + pkce-challenge@5.0.1: {} + proto3-json-serializer@2.0.2: dependencies: protobufjs: 7.5.5 @@ -2771,13 +3226,31 @@ snapshots: '@types/node': 25.5.0 long: 5.3.2 + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + pump@3.0.4: dependencies: end-of-stream: 1.4.5 once: 1.4.0 + qs@6.15.1: + dependencies: + side-channel: 1.1.0 + quansync@1.0.0: {} + range-parser@1.2.1: {} + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + unpipe: 1.0.0 + readdirp@5.0.0: {} require-directory@2.1.1: {} @@ -2826,6 +3299,16 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.11 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.11 + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + rxjs@7.8.2: dependencies: tslib: 2.8.1 @@ -2841,6 +3324,67 @@ snapshots: semver@7.7.4: {} + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + sisteransi@1.0.5: {} smart-buffer@4.2.0: {} @@ -2877,6 +3421,8 @@ snapshots: source-map@0.7.6: {} + statuses@2.0.2: {} + stream-buffers@3.0.3: {} streamx@2.25.0: @@ -2974,6 +3520,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + toidentifier@1.0.1: {} + tr46@0.0.3: {} tree-dump@1.1.0(tslib@2.8.1): @@ -3038,6 +3586,12 @@ snapshots: turbo-windows-64: 2.8.17 turbo-windows-arm64: 2.8.17 + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.2 + typescript@5.9.3: {} unconfig-core@7.5.0: @@ -3053,6 +3607,8 @@ snapshots: dependencies: fs-monkey: 1.1.0 + unpipe@1.0.0: {} + unrun@0.2.33: dependencies: rolldown: 1.0.0-rc.11 @@ -3065,6 +3621,8 @@ snapshots: uuid@11.1.0: {} + vary@1.1.2: {} + watchpack@2.5.1: dependencies: glob-to-regexp: 0.4.1 @@ -3111,6 +3669,10 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + which@2.0.2: + dependencies: + isexe: 2.0.0 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -3135,6 +3697,10 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + zod-to-json-schema@3.25.2(zod@4.3.6): + dependencies: + zod: 4.3.6 + zod@4.3.6: {} zx@8.8.5: {} -- 2.52.0